掘金 人工智能 07月23日 11:06
RAG优化: Pre Retrieval — HyDE
index_new5.html
../../../zaker_core/zaker_tpl_static/wap/tpl_guoji1.html

 

HyDE(Hypothetical Document Embeddings)是一种创新的信息检索技术,它改变了传统“问题-答案”的匹配模式。HyDE的核心思想是,不直接根据用户的问题去检索,而是先生成一个假设性的、理想的答案(一个虚构文档),然后基于这个“假想答案”的向量表示去匹配和检索最相关的真实文档。这种“答案到答案”的匹配方式,由于答案内容本身比问题表述更稳定,因此能显著提高检索的精准度,尤其是在用户问题表达方式多变的情况下,能更有效地找到用户真正需要的信息。

💡 HyDE的核心在于“假设性文档嵌入”,它是一种预检索(Pre-Retrieval)技术,旨在提升信息检索的准确性。传统的检索方法直接使用用户问题进行匹配,而HyDE则先根据用户问题生成一个理想化的、内容详实的“假设性文档”。

🎯 这种方法的优势在于“答案到答案”的匹配。相比于直接匹配问题,通过一个精心构思的假设性答案来检索,能够更好地捕捉信息的语义核心。因为同一个问题可能有多种提问方式,但其背后指向的答案内容通常是高度一致的,从而提高了检索的鲁棒性。

📚 以图书馆管理员为例,当用户询问“关于罗马帝国衰亡原因的书在哪?”时,HyDE会先构思一个详细的答案,比如“罗马帝国衰亡原因复杂,涉及政治腐败、内战、过度扩张、蛮族入侵以及经济问题等”,然后去寻找与这个“假想答案”内容最匹配的书籍,例如《罗马帝国衰亡史》,而非仅仅寻找包含“衰亡”和“原因”的词汇。

💻 在实际应用中,这一过程可以通过大型语言模型(LLM)实现。首先,利用LLM根据用户问题生成假设性文档;随后,将此假设性文档进行向量化处理,并以此作为查询向量,在文档库中进行相似度检索,最终得到最相关的真实文档,并可能结合这些检索到的文档来生成最终回答。

Pre-Retrieval指的是把用户问题传入检索模块之前,对查询进行预处理的过程(下图红框的位置)

今天我们要讲的是HyDE(Hypothetical Document Embeddings) - 假设性文档嵌入

1. 概念

我们之前的RAG思路,都是通过问题去检索答案,但是对于用户来说,问题的表述方式有可能千奇百怪。所以我们可以换个思路,不直接找“问题”的近义词,而是先想象一下“答案”可能长什么样,然后去找跟这个“假想答案”相似的真实答案。这种“答案到答案”的匹配,比“问题到答案”的匹配通常更精准。因为一个问题的表述方式可能不同,但正确的答案内容上总是相似的。

2. 通俗理解

比如你是一个图书馆管理员,有一个读者问:“关于罗马帝国衰亡的原因的书在哪?” 与其去思考“衰亡”、“原因”这些词的同义词,你不如在脑子里快速构思一个假设性的答案(一个虚构的文档):

“罗马帝国的衰亡是一个复杂的过程,主要原因包括内部的政治腐败连年的内战过度扩张导致的边防压力,以及蛮族的入侵。经济上,过度的税收奴隶制的崩溃也起到了关键作用…”

你很可能会找到爱德华·吉本的《罗马帝国衰亡史》,因为它的内容和你虚构的答案高度匹配。

3. 代码示例

# 指令:生成用于 HyDE 检索的假设性文档## 背景我正在实施一个基于 HyDE (Hypothetical Document Embeddings) 的信息检索流程。你的任务是根据用户问题,生成一个内容详尽、信息准确的假设性回答。这个回答将直接用于向量嵌入,以检索最相关的真实文档。## 任务针对以下“用户问题”,请生成一篇理想的、内容丰富的回答。## 要求- **直接输出:** 你的回答本身就是那篇假设性文档,请勿包含任何开场白、结尾或解释性文字 (例如,不要说“这是一个假设性的回答…”或“希望这能帮到你。”)。- **内容详实:** 回答应力求全面、准确,仿佛它就是一篇针对该问题的最佳参考资料。- **格式中立:** 使用简洁的段落格式,专注于陈述事实和信息。## 用户问题{query}
from openai import OpenAIimport osimport dotenvdotenv.load_dotenv()def query_llm(prompt):    client = OpenAI(api_key=os.getenv("OPENAI_API_KEY"), base_url=os.getenv("OPENAI_BASE_URL"))    completion = client.chat.completions.create(        model="gpt-4o-mini",        stream=False,        temperature=0,        messages=[            {"role": "system", "content": "You are a helpful assistant."},            {"role": "user", "content": prompt}        ]    )    return completion.choices[0].message.contentdef hyde(query):    prompt = f"""# 指令:生成用于 HyDE 检索的假设性文档## 背景我正在实施一个基于 HyDE (Hypothetical Document Embeddings) 的信息检索流程。你的任务是根据用户问题,生成一个内容详尽、信息准确的假设性回答。这个回答将直接用于向量嵌入,以检索最相关的真实文档。## 任务针对以下“用户问题”,请生成一篇理想的、内容丰富的回答。## 要求- **直接输出:** 你的回答本身就是那篇假设性文档,请勿包含任何开场白、结尾或解释性文字 (例如,不要说“这是一个假设性的回答…”或“希望这能帮到你。”)。- **内容详实:** 回答应力求全面、准确,仿佛它就是一篇针对该问题的最佳参考资料。- **格式中立:** 使用简洁的段落格式,专注于陈述事实和信息。## 用户问题{query}    """    return query_llm(prompt)if __name__ == "__main__":    query = "特斯拉在中国市场的挑战是什么?"    res = hyde(query)    print(res)

Fish AI Reader

Fish AI Reader

AI辅助创作,多种专业模板,深度分析,高质量内容生成。从观点提取到深度思考,FishAI为您提供全方位的创作支持。新版本引入自定义参数,让您的创作更加个性化和精准。

FishAI

FishAI

鱼阅,AI 时代的下一个智能信息助手,助你摆脱信息焦虑

联系邮箱 441953276@qq.com

相关标签

HyDE 信息检索 RAG 假设性文档 预检索
相关文章