Cuando un modelo de lenguaje no entiende exactamente lo que necesitas, la mejor estrategia es mostrarle ejemplos concretos dentro del mismo prompt. Esa es la esencia del few-shot prompting, una técnica que mejora la precisión y relevancia de las respuestas al guiar al modelo con pares de entrada y salida previamente definidos.
¿Qué es el few-shot prompting y por qué funciona?
El few-shot prompting es una técnica donde incluyes ejemplos de comportamiento esperado directamente en el prompt [0:01]. En lugar de depender de instrucciones abstractas, le proporcionas al modelo casos reales que ilustran el patrón que deseas. Esto permite que el modelo "aprenda" en contexto sin necesidad de un entrenamiento adicional.
Existen dos formas principales de implementarlo [0:18]:
- Ejemplos fijos: un conjunto estático de ejemplos que se usan en todas las consultas.
- Ejemplos dinámicos: se seleccionan automáticamente según la similitud semántica entre la entrada del usuario y los ejemplos almacenados.
¿Por qué el modelo falla sin ejemplos?
Un caso ilustrativo aparece cuando se le pregunta al modelo "¿cuánto es 2 🦜 9?" sin contexto previo [0:42]. El modelo responde con una explicación extensa, pregunta por el significado del emoji y sugiere que podría ser una suma, pero no da una respuesta directa. Lo que realmente queremos es que interprete el emoji como un signo de suma y responda simplemente "11".
Esa ambigüedad se resuelve proporcionando ejemplos claros que le enseñen la convención.
¿Cómo implementar few-shot prompting en LangChain?
Para construir un few-shot prompt se utilizan módulos específicos de LangChain Core [1:34]:
ChatPromptTemplate: define la estructura de cada ejemplo individual.
FewShotChatMessagePromptTemplate: agrupa los ejemplos y los integra al prompt final.
¿Cómo se estructuran los ejemplos?
Los ejemplos se pasan como una lista de diccionarios, cada uno con las llaves input y output [1:55]:
python
ejemplos = [
{"input": "2 🦜 2", "output": "4"},
{"input": "2 🦜 3", "output": "5"},
]
Cada diccionario representa un par de entrenamiento. El modelo observa que el emoji equivale a una suma y generaliza ese patrón para nuevas consultas.
Después se define el template de cada ejemplo usando ChatPromptTemplate con los roles de human y AI [2:52]:
python
example_prompt = ChatPromptTemplate.from_messages([
("human", "{input}"),
("ai", "{output}"),
])
Finalmente, se construye el FewShotChatMessagePromptTemplate pasándole el template y los ejemplos [3:30]:
python
few_shot_prompt = FewShotChatMessagePromptTemplate(
example_prompt=example_prompt,
examples=ejemplos,
)
¿Cómo integrar el prompt principal con el modelo?
El few-shot prompt se incorpora dentro de un prompt principal (main prompt) donde también se establece el rol del sistema [4:28]. Esto combina la instrucción de contexto con los ejemplos de entrenamiento:
python
main_prompt = ChatPromptTemplate.from_messages([
("system", "Eres un mago de las matemáticas"),
few_shot_prompt,
("human", "{input}"),
])
Aquí se aplica el concepto de cadenas o chains [5:15], que permite encadenar componentes con el operador |:
python
chain = main_prompt | modelo
respuesta = chain.invoke({"input": "2 🦜 9"}).content
¿Qué resultado se obtiene?
Al ejecutar la cadena, el modelo ahora responde directamente: 2 🦜 9 = 11 [6:05]. Ya no genera explicaciones innecesarias ni pide contexto adicional. Los ejemplos previos le enseñaron exactamente cómo interpretar el emoji.
Este flujo demuestra cómo la combinación de un rol claro en el system message, los ejemplos fijos del few-shot prompting y la integración mediante cadenas produce respuestas precisas y predecibles. El modelo de lenguaje utilizado fue GPT-4o, aunque la misma técnica funciona con otros modelos como los de Hugging Face o Gemini [0:32].
¿Qué otros escenarios se te ocurren donde el few-shot prompting pueda guiar al modelo de forma efectiva? Comparte tus ejemplos en los comentarios.