¿Qué aportan las plantillas dinámicas en la creación de prompts?
Emplear plantillas dinámicas transforma el proceso de interacción con sistemas automatizados en algo más flexible y personalizado. Utilizando estructuras como Chat Prompt Template, System Message Prompt Template y Human Message Prompt Template de la librería de prompts de Langstead, estos elementos permiten integrar variables en las instrucciones dadas al sistema. Esto asegura que los mensajes se adapten a varios contextos al poder insertar información específica de manera dinámica. Así, el uso de estas plantillas agiliza y enriquece la personalización de la comunicación con modelos de inteligencia artificial.
¿Cómo se crea un prompt de sistema con plantillas?
Crear un prompt de sistema implica varios pasos precisos, comenzando con una plantilla básica que considera las variables necesarias. A continuación, te mostramos cómo se logra esto utilizando el método fromTemplates:
# Utilizando SystemMessagePromptTemplateprompt_sistema = SystemMessagePromptTemplate.fromTemplates("Eres un experto en productos que debe proporcionar información detallada sobre productos de la marca {marca}.")
En este ejemplo, {marca} es una variable que debe especificarse al ejecutar el mensaje. Esto permite que el sistema pueda ofrecer información concreta centrada en una marca elegida por el usuario, destacando la flexibilidad en la creación de prompts con capacidades adaptativas.
¿Cómo hacer un prompt humano?
El objetivo de un prompt humano es capturar e interpretar la consulta planteada por el usuario. La estructura básica utiliza una variable definida que simboliza la pregunta del usuario de la siguiente manera:
# Creando un prompt humanoprompt_humano = HumanMessagePromptTemplate.fromTemplates("{consulta_usuario}")
Aquí, consulta_usuario es la variable que almacena la pregunta del usuario. Este setup permite a los modelos entender e integrar fácilmente lo que se le pregunta en cualquier contexto.
¿Cuál es el flujo para integrar las plantillas en un chat?
Integrar las plantillas en un chat implica unir las diferentes piezas —prompt_sistema y prompt_humano— en una sola secuencia de mensajes:
# Ejemplo de integración en un chatprompt_chat = ChatPromptTemplate.fromMessages([prompt_sistema, prompt_humano])
La secuencia establecida da estructura a la interacción, permitiendo que el sistema maneje tanto la información del productor como la consulta del usuario. Esto prepara a la aplicación para ser utilizada en entornos conversacionales realistas y dinámicos.
¿Cómo crear un ejemplo concreto e integrado en un modelo de chat?
Una vez desarrolladas las plantillas de sistema y humano, se puede proceder a formar un mensaje completo que el modelo de chat entienda. Para ello, se utilizan las variables de entrada requeridas:
# Instancia formateada para el modelo de chatformato_chat = prompt_chat.formatPrompt( consulta_usuario="¿Qué características tiene el teléfono más nuevo?", marca="Apple")
Este ejemplo sustituye las variables {marca} y {consulta_usuario} con valores específicos, listando los mensajes consolidados que el modelo de chat espera recibir y procesar. Esta estructura garantiza que el AI responda de manera coherente y con contexto adecuado.
Te invito a explorar más allá y crear tu propio chatbot que responda preguntas sobre especificaciones técnicas de productos como celulares o electrodomésticos. La ejecución es simple si sigues el proceso mostrado, prueba e innova en distintos mercados y adaptando el idioma según la audiencia objetivo. ¡La creatividad es el único límite!
Creación de Plantillas Dinámicas para Prompts de Chat en Langstead
los message template van relacionados a su tipo de mensaje:
SystemMessage: SystemMessagePromptTemplate
HumanMessage: HumanMessagePromptTemplate
AIMessage: ChatPromptTemplate
📝 Chats con Plantillas Dinámicas
.
ℹ️ Summary
Esta guía proporciona un caso de uso sobre "Chat Dynamic Prompts", donde partiendo de un prompt dinámico, proveer la información necesaria para dar un contexto a un chat.
.
🗂️ Background
Muchas veces las cadenas toman o devuelven múltiples claves de entrada/salida. En estos casos, ¿cómo podemos saber qué claves queremos guardar en el historial de mensajes de chat? En general, esto se puede controlar mediante los parámetros input_key y output_key de los tipos de memoria. Estos por defecto son undefined.
.
Al operar con un formato entre entrada/salida en los contextos de un prompt, se requiere especificar el nombre del que se va a utilizar como input o entrada del prompt como identificador de la memorización.
.
Enlaces auxiliares:
Prompts
Using Buffer Memory with Chat Models
What keys are saved to memory
.
🎯 Problem
Implementar un "Chat Dynamic Prompts" utilizando TypeScript para generar un chat con un contexto dinámico a partir de una entrada de la cadena conversacional.
.
🚧 Solution
LanChain provee de ChatPromptTemplate para poder darle formato a partir de una plantilla. Una vez establecida las plantillas según el origen (user, AI, etc.), se genera un contexto para que el chat.
import {
SystemMessagePromptTemplate,
HumanMessagePromptTemplate,
ChatPromptTemplate,
} from 'langchain/prompts'
const prompt = ChatPromptTemplate.fromMessages([
SystemMessagePromptTemplate.fromTemplate(
'You are a product expert who must provide detailed information about products from the brand {brand}.',
),
HumanMessagePromptTemplate.fromTemplate('{input}'),
])
En el prompt dinámico, generamos las variables de las cuales se embeberán en la creación del contexto.
.
Debido a que se proveerá de una memorización para proveer del contexto a partir del prompt, BufferMemory requiere que se le indique el inputKey para encadenar el contexto.
const memory = new BufferMemory({ inputKey: 'input' })
Finalmente, generamos una cadena conversacional e ingresamos las variables de entrada y dinámicas.
const chain = new ConversationChain({
llm,
memory,
prompt,
})
const response = await chain.call({
input: 'What features does the newest phone have?',
brand: 'Apple',
})
🍻 Discussion
Un sistema de memoria necesita soportar dos acciones básicas: lectura y escritura. Recordemos que cada cadena define un núcleo lógico de ejecución que espera ciertas entradas. Algunas de estas entradas vienen directamente del usuario, pero otras pueden venir de la memoria. Una cadena interactuará con su sistema de memoria dos veces en una ejecución dada.
.
DESPUÉS de recibir las entradas iniciales del usuario pero ANTES de ejecutar la lógica del núcleo, una cadena LEERÁ de su sistema de memoria y aumentará las entradas del usuario.
DESPUÉS de ejecutar la lógica central pero ANTES de devolver la respuesta, una cadena ESCRIBIRÁ las entradas y salidas de la ejecución actual en la memoria, para que puedan ser consultadas en futuras ejecuciones.
.
!Image
import { ConversationChain } from 'langchain/chains'
import { ChatOpenAI } from 'langchain/chat_models/openai'
import { BufferMemory } from 'langchain/memory'
import {
SystemMessagePromptTemplate,
HumanMessagePromptTemplate,
ChatPromptTemplate,
} from 'langchain/prompts'
const API_TOKEN = // 👈 Enter the API Token from OpenAI
const llm = new ChatOpenAI({
maxTokens: -1,
modelName: 'gpt-4',
temperature: 0,
openAIApiKey: API_TOKEN,
})
const prompt = ChatPromptTemplate.fromMessages([
SystemMessagePromptTemplate.fromTemplate(
'You are a product expert who must provide detailed information about products from the brand {brand}.',
),
HumanMessagePromptTemplate.fromTemplate('{input}'),
])
const memory = new BufferMemory({ inputKey: 'input' })
const chain = new ConversationChain({
llm,
memory,
prompt,
})
const response = await chain.call({
input: 'What features does the newest phone have?',
brand: 'Apple',
})
console.log(response)
¿Es posible crear una plantilla para que el chat responda de cierto modo?
Usando ChatPromptTemplate.from_template o algo parecido.
Por ejemplo, en un formato que se requiera entregar la especificación técnica de cierto producto.
Que responda rellenando las variables con lo solicitado, pensando en que siempre entregue la respuesta del mismo modo y con el mismo formato.
Algo así:
Si se lo inyectas en forma de SystemMessage lo entenderá como instrucción y te lo formateará automáticamente. Solo basta con poner en el inicio de la plantilla esa directriz y te generará los outputs como quieras.