Vấn Đề: User Queries Thường Ngắn và Mơ Hồ
User hỏi: "RAG có vấn đề gì?" - Query này quá vague để retrieval tốt.
Challenges:
- Vocabulary mismatch giữa query và documents
- Implicit context không được express
- Typos và viết tắt
Query Transformation Techniques
1. Query Rewriting
Dùng LLM để rewrite query thành dạng tốt hơn cho retrieval:
rewrite_prompt = """
Given the user query, rewrite it to be more specific and detailed for searching a technical knowledge base.
Query: {query}
Rewritten query:
"""
2. HyDE (Hypothetical Document Embeddings)
Generate hypothetical answer, rồi embed answer đó để search:
hyde_prompt = """
Write a detailed paragraph that would answer this question:
{query}
"""
hypothetical_doc = llm.invoke(hyde_prompt)
query_vector = embed(hypothetical_doc) # Search với vector này
3. Query Decomposition
Chia complex query thành sub-queries:
"So sánh RAG và fine-tuning" →
- "RAG là gì và ưu điểm?"
- "Fine-tuning là gì và ưu điểm?"
- "Khi nào dùng RAG vs fine-tuning?"
4. Step-back Prompting
Hỏi câu hỏi higher-level trước:
Query: "Tại sao HNSW index chậm khi rebuild?" Step-back: "HNSW indexing algorithm hoạt động thế nào?"
Implementation
class QueryTransformer:
def __init__(self, llm):
self.llm = llm
def hyde(self, query: str) -> str:
prompt = f"Write a paragraph answering: {query}"
return self.llm.invoke(prompt)
def decompose(self, query: str) -> list[str]:
prompt = f"Break this into 3 sub-questions: {query}"
response = self.llm.invoke(prompt)
return self.parse_questions(response)
def expand(self, query: str) -> str:
prompt = f"Add relevant keywords and synonyms: {query}"
return self.llm.invoke(prompt)
Pro Tips
- Cache transformations: Same query = same transformation
- Combine techniques: HyDE + decomposition often works better
- Evaluate: Measure retrieval recall before/after transformation
🔥 HyDE đặc biệt hiệu quả khi documents dùng technical jargon mà user không biết.
