Capítulo 1: Transformación de Consultas
¿Por qué transformar las consultas?
Las consultas de los usuarios suelen ser:
- Ambiguas o incompletas
- Usar un vocabulario diferente al de los documentos
- Demasiado cortas para un buen embedding
Reescritura de consultas
from langchain.chat_models import ChatOpenAI
from langchain.prompts import PromptTemplate
rewrite_prompt = PromptTemplate.from_template("""
Rewrite the following query to be more specific and searchable.
Original: {query}
Rewritten:""")
llm = ChatOpenAI(model="gpt-4")
chain = rewrite_prompt | llm
# "how does it work?" → "How does retrieval augmented generation work?"
rewritten = chain.invoke({"query": "how does it work?"})
Expansión de consultas
Agregue términos relacionados:
expansion_prompt = PromptTemplate.from_template("""
Expand this query with related terms and synonyms:
Query: {query}
Expanded query with alternatives:""")
# "ML" → "machine learning ML deep learning artificial intelligence AI"
HyDE (Hypothetical Document Embeddings)
Genere una respuesta hipotética, obtenga su embedding y búsquela con eso:
def hyde_retrieval(query, llm, retriever):
# Step 1: Generate hypothetical document
hyde_prompt = f"""Write a short paragraph that would
answer this question: {query}"""
hypothetical_doc = llm.invoke(hyde_prompt)
# Step 2: Embed the hypothetical document
# (embeddings will be closer to real documents)
# Step 3: Retrieve using hypothetical embedding
results = retriever.get_relevant_documents(
hypothetical_doc.content
)
return results
Por qué funciona HyDE:
- La respuesta hipotética utiliza el vocabulario de los documentos
- Mejor alineación del embedding con el corpus
- Especialmente útil para consultas complejas
Resumen
| Técnica | Cuándo usar | Mejora |
|---|---|---|
| Reescritura | Consultas vagas | Claridad |
| Expansión | Sinónimos ausentes | Recall |
| HyDE | Preguntas complejas | Precisión |