微信扫码
添加专属顾问
今天是2024年5月19日,星期日,北京,天气晴。
昨天,我们讲了知识图谱增强RAG问答时候可以做的几个阶段性注入的方案。
今天,我们系统性的看看RAG在真实langchain中实践的一些策略,推荐大家看看。
关于RAG,可以看看langchain出品的RAG系列,地址在:https://github.com/langchain-ai/rag-from-scratch系列,其做了很细致的拆分和讲解,并且有对应的代码,如下概览:
大体可以切分成如下部分:
一个是索引Indexing部分:
另一个是生成Generation部分:
Query Transformations查询转换侧重于重写和/或修改问题以便检索,整体流程如下:
其中重要的流程如下:
1、Multi Query多查询策略
该方法从多个角度重写用户问题,为每个重写的问题检索文档,返回所有查询的唯一文档。在实现上,将一个查询变成多个查询:https://python.langchain.com/docs/modules/data_connection/retrievers/MultiQueryRetriever
对应的代码具象化如下:
2、RAG-Fusion多查询结果融合策略
从多个角度重写用户问题,检索每个重写问题的文档,并组合多个搜索结果列表的排名,以使用倒数排名融合(RRF)生成单一、统一的排名。其思想在于:将多个召回查询的结果进行合并:https://github.com/langchain-ai/langchain/blob/master/cookbook/rag_fusion.ipynb?ref=blog.langchain.dev,https://towardsdatascience.com/forget-rag-the-future-is-rag-fusion-1147298d8ad1
对应代码实现:
3、Decomposition问题分解策略
Decomposition问题分解将一个复杂问题分解成多个子问题,将问题分解为一组子问题/问题,可以按顺序解决(使用第一个问题的答案+检索来回答第二个问题),也可以并行解决(将每个答案合并为最终答案),这个是向下分解,与Multi Query是不同的方案,
1)Answer recursively迭代式回答:在问题分解的基础上,逐步迭代出答案,将上一步问题的答案,与下一步骤的答案进行拼接,送入大模型进行问答:https://arxiv.org/pdf/2205.10625.pdf,https://arxiv.org/abs/2212.10509.pdf
对应prompt形式化如下:
2)Answer individually,当然,也可以让每个subquery分别进行处理,然后得到答案,然后再拼接成一个QA pairspprompt最终形成答案。
如具体实现如下:
4、Step Back问答回退策略
Step Back问答回退,首先提示LLM提出一个关于高级概念或原则的通用后退问题,并检索有关它们的相关事实,使用此基础来帮助回答用户问题。构成上包括抽象abstracton和推理reasoning两个步骤,来源于工作https://arxiv.org/pdf/2310.06117.pdf,比如给定一个问题,需要提示大模型,找到回答该问题的一个前置问题。
得到前置问题及其答案后,再将其整体与当前问题进行合并,最后送入大模型进行问答,得到最终答案:
对应的prompt如下:
5、HyDE混合策略
该策略思想为:LLM将问题转换为回答问题的假设文档。使用嵌入的假设文档检索真实文档,前提是doc-doc相似性搜索可以产生更多相关匹配。由于query与doc之间是不对称检索,因此这个时候,可以先根据query生成一个doc,然后根据doc生成对应的embedding,再跟原先documents进行检索:
例如下图中的query,每个有对应的instruction,通过chatgpt生成generated doument,然后以此进行召回,最后生成real document;
具体对应的具象化实现可以看看:
对应的文档和论文可以查看:https://github.com/langchain-ai/langchain/blob/master/cookbook/hypothetical_document_embeddings.ipynb,https://arxiv.org/abs/2212.10496
RAG Routing路由,主要解决的是从获取query之后,所需要执行的问题意图分类的问题,处理的是问题域选择问题:
可用的方案包括,Logical and Semantic routing,基于逻辑规则和语义的路由分发:https://python.langchain.com/docs/use_cases/query_analysis/techniques/routing#routing-to-multiple-indexes
对应的具象化实现如下:
可以通过function call来实现:
也可以基于语义来实现分发Semantic routing,https://python.langchain.com/docs/expression_language/cookbook/embedding_router
在实现上,可以为每个意图都设定一个prompt,然后进行判定,一个具象化的实现如下:
Query Construction,主要解决的问题是不同检索知识库,如mysql数据库、图数据库GraphDB、向量化数据库vectorDB的查询转换。使用LLM将自然语言转换为其中DSL是一种与给定数据库(SQL、Cypher等)交互所需的领域特定语言:https://blog.langchain.dev/query-construction/,https://blog.langchain.dev/enhancing-rag-based-applications-accuracy-by-constructing-and-leveraging-knowledge-graphs/
正在具体实现上,可以查看的方案,可以如下:
Query structuring for metadata filters,基于元数据过滤器的问题构建,例如,许多向量化存储都包含元数据字段,例如:
这样就可以根据元数据过滤特定的数据chunk:https://python.langchain.com/docs/use_cases/query_analysis/techniques/structuring
关于文档chunk切分这个事情,索引的组织其实也是一个很有趣的话题,这块在切分上可以做优化,也可以做多种表达方式的索引multi-representation indexing、特定化的embedding或者层级性的索引:
例如Multi-representation Indexing,使用LLM生成针对检索进行优化的文档摘要(“命题”)。嵌入这些摘要以进行相似性搜索,但将完整文档返回给LLM进行生成:https://blog.langchain.dev/semi-structured-multi-modal-rag/,https://python.langchain.com/docs/modules/data_connection/retrievers/multi_vector,https://arxiv.org/abs/2312.06648
例如,可以针对一个text,切分形成多个检索单位retrieval units,包括:passages、sentences,propositions
可以通过小的chunk,来实现对父级documents的索引,查看:https://python.langchain.com/v0.1/docs/modules/data_connection/retrievers/parent_document_retriever/
此外,也可以进一步来看看关于层级性索引的方案:RAPTOR,https://arxiv.org/pdf/2401.18059.pdf,对应的代码放在:https://github.com/langchain-ai/langchain/blob/master/cookbook/RAPTOR.ipynb,其思想在于对文档进行生成聚类摘要,然后将设计成层级性。具体实现上,将语料库中的文档聚类,并递归地总结相似的文档。将它们全部编入索引,生成较低级别的文档和摘要,可以检索这些文档和摘要来回答从详细到更高级别的问题。
但以上还是停留在文本层级,也可以做token到text级,这里可以使用ColBERT,为段落中的每个token生成一个受上下文影响的向量,ColBERT同样为查询中的每个token生成向量,然后,每个文档的得分就是每个查询嵌入与任意文档嵌入的最大相似度之和,这块可以看:https://hackernoon.com/how-colbert-helps-developers-overcome-the-limits-of-rag
在完成对问题的改写、不同知识库查询的构建以及意图分发、查询对象索引的构建之后,我们可以进一步优化Retrieval检索,包括ranking、refinement增强以及自适应检索adaptive retrival。
具体采用的方案可以如下:
Re-ranking,这个可以作为rag fusion的替换方案,当做一个过滤筛子进行排序,示意图如下:
在具体实现上,可以使用Cohere Re-Rank方案,https://python.langchain.com/v0.1/docs/integrations/retrievers/cohere-reranker/#doing-reranking-with-coherererank, https://cohere.com/blog/rerank
具象化的例子如下:
一个对比的效果如下:
此外,也可以使用CRAG(Corrective-RAG,CRAG),地址:https://github.com/langchain-ai/langgraph/blob/main/examples/rag/langgraph_crag.ipynb,https://github.com/langchain-ai/langgraph/blob/main/examples/rag/langgraph_crag_mistral.ipynb,https://github.com/langchain-ai/langgraph/blob/main/examples/rag/langgraph_crag_local.ipynb,其本质上是一种adaptive-RAG策略,实现方式为在循环单元测试中自我纠正检索错误,以确定文档相关性并返回到网络搜索,即纠对检索文档的自我反思/自我评分,主要采用如下步骤:
如果至少有一个文档超过了相关性阈值,则进入生成阶段,在生成之前,进行知识细化 将文档划分为知识条带(knowledge strip) , 对每个知识条进行分级,过滤不相关的知识条,如果所有文档都低于相关性阈值,或者分级者不确定,那么框架就会寻找额外的数据源,并使用网络搜索来补充检索。
关于生成阶段,大家最常见的,就是Self-RAG(https://arxiv.org/pdf/2310.11511),对应地址可以参考:https://github.com/langchain-ai/langgraph/tree/main/examples/rag,https://github.com/langchain-ai/langgraph/blob/main/examples/rag/langgraph_self_rag_mistral_nomic.ipynb,其基本思想在于:使用循环单元测试自行纠正RAG错误,以检查文档相关性、答案幻觉和答案质量。
其实现流程如下:
其思想在于,对检索到的文件和世代进行自我反思/自我评分。
整个过程可以进一步形式化如下:
本文主要围绕langchain这个RAG实现项目中所提到的一些优化策略,这些方案做了阶段性的划分,也有对应的实践代码,可以进一步提升大家的认知,感兴趣的可以多看看。
1、https://github.com/langchain-ai/rag-from-scratch
53AI,企业落地大模型首选服务商
产品:场景落地咨询+大模型应用平台+行业解决方案
承诺:免费POC验证,效果达标后再合作。零风险落地应用大模型,已交付160+中大型企业
2026-07-01
AI可观测性:Prompt、Tool Call、Trace、Token全链路追踪
2026-07-01
AI Infra 全景图:Agent Framework、调度、编排、沙箱、记忆管理、Tracing 分层拆解
2026-07-01
Claude Science发布:60+科学数据库一个对话搞定
2026-07-01
AI 的向量空间里藏着心理学,这是一场嵌入模型的情绪对决
2026-07-01
Claude Sonnet 5 来了:Opus 级智能,Sonnet 级价格
2026-07-01
Anthropic在Claude Code植入间谍检测你是否来自中国
2026-06-30
Context 即 Agent:下一场 AI 产品战争,是上下文之争
2026-06-30
解析Agent Loop(智能体循环)的三层分级体系
2026-04-15
2026-04-07
2026-04-07
2026-04-24
2026-04-17
2026-04-05
2026-04-02
2026-04-05
2026-04-14
2026-04-24
欢迎您使用【53AI 官方网站】(以下简称“本网站”或“我们”)。本《会员服务协议》(以下简称“本协议”)是您(以下简称“会员”或“用户”)与【深圳市博思协创网络科技有限公司】之间关于注册、登录及使用本网站会员服务所订立的法律协议。
在您注册或登录前,请务必审慎阅读、充分理解各条款内容,特别是免除或限制责任的条款、知识产权条款、争议解决条款等。此类条款将以加粗形式提示您注意。 当您通过微信公众号授权、手机验证码验证或其他方式成功登录本网站时,即视为您已完全理解并同意接受本协议的全部内容。
一、 定义
本网站:指由【深圳市博思协创网络科技有限公司】运营的,域名为【53ai.com】的网站及相关移动端页面。
会员服务:指本网站向注册会员提供的知识库文章查阅、内容检索及其他相关增值服务。
知识库内容:指本网站发布的包括但不限于文字、图表、数据、研究报告、行业分析等数字化内容资源。
二、 账号注册与登录
登录方式:本网站支持以下登录方式,您可根据实际情况选择:
微信公众号授权登录:您同意将您的微信OpenID信息授权给本网站,用于创建或关联会员账号。
手机验证码登录:您需提供真实有效的手机号码,并通过短信验证码完成身份验证与登录/注册。
账号安全:您的账号仅限您本人使用,禁止赠与、借用、租用、转让或售卖。因您保管不善导致的账号被盗、密码泄露等损失,由您自行承担。
实名认证:根据相关法律法规要求,我们可能要求您在特定功能下完成实名认证。如您拒绝提供,可能无法使用部分或全部服务。
未成年人保护:若您未满18周岁,请在法定监护人的陪同下阅读本协议,并在征得监护人同意后使用本服务。
三、 服务内容与规范
知识库查阅权限:会员登录后,有权按照其会员等级对应的权限范围,在线浏览、检索本网站知识库中的相关文章及内容。
服务变更:我们有权根据业务发展需要,调整、变更或终止部分服务内容,并将以网站公告、公众号消息等方式提前通知。
禁止行为:您在使用服务时不得实施以下行为:
利用技术手段批量爬取、下载、转存知识库内容;
将知识库内容用于商业目的或未经授权地向第三方传播;
干扰本网站正常运行或侵犯其他用户合法权益;
发布违法违规信息或从事违反公序良俗的活动。
四、 知识产权声明
权利归属:本网站知识库中的排版设计、软件代码等内容的知识产权均归【公司全称】或原权利人所有,受《中华人民共和国著作权法》等法律保护。
有限许可:本网站授予会员一项非独占、不可转让、不可转授权的普通许可,仅限于个人学习、研究之目的在线查阅知识库内容。
侵权追责:未经书面许可,任何单位或个人不得以任何形式复制、转载、摘编、镜像、汇编或以其他方式使用上述内容。一经发现,我们保留追究其法律责任的权利。
五、 个人信息保护
我们重视对您个人信息的保护。关于我们如何收集、使用、存储和保护您的个人信息,请单独阅读 《隐私政策》。
您通过微信公众号授权或手机号验证所提供的信息,我们将严格按照《个人信息保护法》的规定处理,仅用于身份识别、服务提供及安全验证等必要用途。
您可以随时通过网站设置或联系客服行使查阅、更正、删除个人信息及撤回授权同意的权利。
六、 免责声明
内容准确性:知识库内容仅供参考,不构成专业建议。我们不对其完整性、准确性、时效性作任何明示或暗示的保证,您应自行判断并承担使用风险。
不可抗力:因自然灾害、政策法规变化、网络故障、第三方平台接口异常(如微信接口维护、运营商短信通道故障)等不可抗力导致的服务中断或延迟,我们不承担违约责任。
第三方链接:本网站可能包含指向第三方网站的链接,该等网站的内容和服务不受我们控制,请您自行甄别风险。
七、 违约责任
如您违反本协议约定,我们有权视情节采取警告、限制功能、暂停服务、注销账号等措施,并保留要求赔偿损失的权利。
如因您的违约行为导致我们遭受行政处罚、第三方索赔或商誉损失,您应承担全部赔偿责任(包括但不限于罚款、赔偿金、律师费、公证费等)。
八、 法律适用与争议解决
本协议的订立、执行和解释均适用中华人民共和国大陆地区法律。
因本协议产生的或与本协议有关的任何争议,双方应友好协商解决;协商不成的,任何一方均可向【公司所在地】有管辖权的人民法院提起诉讼。
九、 其他
本协议构成双方就本服务达成的完整协议,取代此前任何口头或书面约定。
本协议任一条款被认定为无效或不可执行的,不影响其他条款的效力。
我们对本协议享有最终解释权,并在法律允许的范围内保留随时修改的权利。修改后的协议一经公布即生效,继续使用服务即视为同意修订内容。