背景
RAG流程很多细节优化点,助力AIGC。
内容
LangChain在RAG功能上的一些能力
多路向量检索
多向量检索器的核心想法是将我们想要用于答案合成的文档与我们想要用于检索的参考文献分开。这允许系统为搜索优化文档的版本(例如,摘要)而不失去答案合成时的上下文。
考虑一个冗长的文档。我们可以为该文档创建一个摘要,该摘要经过优化以进行基于向量的相似性搜索。但当需要生成答案时,我们仍然可以将完整的文档传递给LLM,确保在答案合成过程中不会丢失任何上下文。
查询转换
查询转换的核心思想是,用户的原始查询可能不总是最适合检索的,所以我们需要某种方式来改进或扩展它。利用LLM的能力优化和改进用户问题,从而提高检索的效果和满足用户的需求。
https://www.datalearner.com/blog/1051698375259477
如文档块可能包含与检索无关的内容,用户问题可能表述不佳,或可能需要从用户问题中生成结构化查询。
具体来说包括:
- 内容的不相关性:传统的检索方法可能会返回含有与问题不相关的内容的文档块。这可能会降低检索的质量,因为返回的内容可能不完全符合用户的期望。
- 用户问题的表述问题:用户提出的问题可能表述不清或用词不准确,这可能导致检索系统无法准确地理解其意图并返回相关的答案。
- 复杂的查询需求:有时,用户的问题可能需要转换为更复杂的结构化查询,例如用于带有元数据过滤的向量存储或SQL数据库的查询。
为了解决上述问题,查询转换(Query Transformations)的方案利用了大型语言模型(LLM)的强大能力,通过某种提示或方法将原始的用户问题转换或重写为更合适的、能够更准确地返回所需结果的查询。LLM的能力确保了转换后的查询更有可能从文档或数据中获取相关和准确的答案。
重写-检索-阅读
提供一个更好的搜索查询,以便网络搜索引擎回答给定的问题,并以“**”结束查询。
问题 {x}
答案:
demo
// TODO
退后提示
目的:生成一个“退后”的问题,在使用检索时,将同时使用“退后”问题和原始问题进行检索,然后使用这两个结果来支持语言模型的响应。后退问题是从原始问题派生出来的、抽象层次更高的问题。
例如,原始问题是“Estella Leopold在特定时期去了哪所学校”,这个可能很难回答。但如果不是直接询问”Estella Leopold在特定时期去了哪所学校”,我们文一个后退问题会询问她的”教育历史”。这个更高层次的问题涵盖了原始问题的所有信息。很容易得到答案。
You are an expert of world knowledge. I am going to ask you a question. Your response should be comprehensive and not contradicted with the following context if they are relevant. Otherwise, ignore them if they are not relevant.
{normal_context}
{step_back_context}
Original Question: {question}
Answer:
您是世界知识的专家。我要问你一个问题。如果相关的话,您的回答应该是全面的,并且不与以下上下文相矛盾。否则,如果它们不相关,请忽略它们。
{正常上下文检索内容}
{会退问题上下文检索内容}
原始问题:{问题}
回答:
demo
// TODO
高级RAG
优化点
- Query理解(Query NLU):使用LLM作为基础引擎来重写用户Query以提高检索质量,涉及Query意图识别、消歧、分解、抽象等
- Query路由(Query Routing):查询路由是LLM支持的决策步骤,根据给定的用户查询下一步该做什么
- 索引(Indexing):是当前RAG中比较核心的模块,包括文档解析(5种工具)、文档切块(5类)、嵌入模型(6类)、索引类型(3类)等内容
- Query检索(Query Retrieval):重点关注除典型RAG的向量检索之外的图谱与关系数据库检索(NL2SQL)
- 重排(Rerank):来自不同检索策略的结果往往需要重排对齐,包括重排器类型(5种),自训练领域重排器等
- 生成(Generation):实际企业落地会遇到生成重复、幻觉、通顺、美化、溯源等问题,涉及到RLHF、偏好打分器、溯源SFT、Self-RAG等等
- 评估与框架:RAG需要有全链路的评价体系,作为RAG企业上线与迭代的依据
Agentic RAG
最终,大模型RAG问答终章是Agentic RAG!
向Lv2-智能体提出一个问题。
while (Lv2-智能体无法根据其记忆回答问题) {
Lv2-智能体提出一个新的子问题待解答。
Lv2-智能体向Lv1-RAG提问这个子问题。
将Lv1-RAG的回应添加到Lv2-智能体的记忆中。
}
Lv2-智能体提供原始问题的最终答案。
如下面
// TODO