本文译自Self-Reflective RAG with LangGraph一文,讲解了自省式RAG的根底原理以及依据LangGraph的实践演示
重要链接
- 关于 Self-RAG 和 CRAG 的教程手册
- 演示视频
- 本文为一个系列,之前内容没有看过的小伙伴能够点击链接查看:LangChain课程合集
研究布景
因为大多数大型言语模型(LLMs)一般只针对大量公共数据进行周期性练习,它们往往缺少最新信息或不能接触到无法用于练习的私有数据。检索增强生成(RAG)形式恰好处理了这个问题,它经过将大型言语模型衔接到外部数据源上(咱们有相关的视频系列以及[博客文章](blog.langchain.dev/deconstruct…
自省式 RAG
实践操作中,完成 RAG 需求对上述过程进行逻辑剖析:比方,咱们需求知道什么时候进行检索(依据问题和索引的构成)、何时改写问题以提高检索效率,或许何时抛弃无关的检索成果并从头检索。因而提出了自省式 RAG(详见论文)这一概念,自省式 RAG 使用大型言语模型自我校对检索质量不佳或生成内容不行优质的问题。
如上所展现的根底 RAG 流程,实质上是一种链式过程:大型言语模型依据检索到的文档来决议生成的内容。有些 RAG 运作形式采用的是路由机制,大型言语模型会依据提出的问题选择不同的检索器。但是自省式 RAG 一般需求某种反应机制,比方从头生成问题或从头检索文档。这时候,状况机制作为第三种认知架构(详见认知架构博客),因其能够支撑循环操作而非常适用:状况机可定义一系列过程(例如检索、评价文档、改写问题)并设置它们的转换逻辑;比方,假如咱们检索到的文档无关,咱们能够从头改写问题再进行检索。
使用 LangGraph 完成自省式 RAG
咱们最近发布了 LangGraph,这是一个简单的大型言语模型状况机完成东西。这为设计各种不同的RAG 流程供给了极大的灵活性,并支撑在 RAG 中进行所谓“流程工程”,即在具体的决议计划点(如:评价文档)和循环(比方:从头检索)中进行特定操作。
为了展现 LangGraph 的灵活性,咱们使用它来完成了两篇引人入胜、前沿的自省式 RAG 论文,CRAG 和 Self-RAG 中提出的思维。
纠正式 RAG (CRAG)
纠正式 RAG(CRAG)在其论文中提出了以下明显的理念:
- 引进一种轻量级检索评价东西,用以对查询回来的文档进行整体质量评价,并为每项文档打分。
- 当检索的成果不明确或与用户的查询不行相关时,启用依据网络的文档检索来弥补上下文。
- 履行常识细化:把检索的文档分成“常识条”,对每条进行评分,过滤出无关的内容。
在描述流程时,咱们对一些过程进行了简化和调整,便利了解(实践使用时能够进行相应的定制和扩展):
- 咱们省掉了常识细化这一环节,尽管它代表了一个颇具价值的数据后处理办法,但在本文的流程示例中并不是必要的。
- 假如发现任意一个检索的文档不相关,咱们将经过网络查找来弥补检索内容。在这儿咱们使用 Tavily Search API来进行网络查找,这既快速又便利。
- 咱们还将改写查询语句,以便于网络查找能供给更优的成果。
- 关于二选一的决议计划节点,咱们用 Pydantic 来确认输出模型,并作为每一次履行大型言语模型的调用过程中运行的 OpenAI 东西函数。这让咱们能够依据二选一逻辑确认何种逻辑途径。
咱们在教程笔记本中设计了这个方案,并建立了三篇博客文章的索引。在这儿,您能够看到当引用其间一篇博客文章中的信息时,CRAG 是怎么作业的:咱们的逻辑流清晰可见。
相比之下,当咱们提出不在博客文章讨论范围内的问题时,流程便会有所不同。在这儿您能够看到,系统从网络查找中检索了弥补的文档,用以生成最终的答复。
自 RAG
自 RAG 是一个与之相望的处理方案,论文中提出了许多独特的 RAG 理念。结构中练习大型言语模型生成自我反思的提示符号,用以控制 RAG 流程的各个阶段。下面是提示符号的一览:
-
Retrieve
符号决议是否需求依据x(问题)
或x(问题)
、y(答复)
检索D
数据块。或许的输出成果有yes, no, continue
。 -
ISREL
符号针对x
问题,判断数据块D
是否相关。输入为 (x(问题)
,d(数据块)
)。成果为relevant(相关), irrelevant(不相关)
。
-
ISSUP
符号判断 D 中每个数据块生成的答复是否与之相关。输入包含x
,d
,y
。这个标记也是验证d
是否支撑y(生成)
中的一切需求证实的陈述。可输出fully supported(彻底支撑), partially supported(部分支撑), no support(不支撑)
。 -
ISUSE
符号评价 D 中每个数据块生成的答复是否对x
有用。输入x
,y
关于d
在D
里。输出是{5, 4, 3, 2, 1}
。
论文中的下表为上述信息供给了进一步细节:
以下简图帮助咱们了解信息流的运转机制:
咱们能够在 LangGraph 中对其进行完成,为了阐明需求进行了一些简化和调整(在实践需求中能够进行相应的定制和扩展):
- 如上文所述,咱们对每个检索到的文档进行评分。假如发现任何文档相关,咱们就进行下一步的生成作业。假如全部文档都不相关,那咱们就会改写查询来提出一个愈加准确的问题,然后从头进行检索。这一环节能够很容易地结合上述 CRAG 所述的网络查找弥补节点。
- 论文中会针对每一个数据块进行生成,并进行双重评价。但在咱们的完成中,只从一切相关文档生成一次内容。然后,咱们依据文档查看这次生成的内容(例如,以维护免受过错形象的影响)并依据答案进行评价。这减少了调用大型言语模型的次数,提高了响应速度,并答应在生成答案时归纳更多的上下文信息。
这儿展现的示例轨道强调了主动 RAG 的自我纠正能力。查询的问题是 解释不同类型署理回想是怎么作业的?
。在此示例中,一切四个文档都被以为相关,对照文档查看生成答案的环节顺利经过,但生成的答案未被认定彻底有用。
之后,如这儿所示,循环从头开始,问题稍微改写为:不同类型署理回想的运作方式怎么?
。此时,四份文档中有一份因为无关而被挑选出去。之后的生成答案成功经过了一切查看:
不同类型的署理回想包含感官回想、短期回想和长时间回想。感官回想能够保留短暂的感觉信息。短期回想则被用于实时学习和构建提示。而长时间回想则让署理人能够在很长的时间里保存和回想信息,并常常依靠外部的向量存储来完成。
整体流程轨道清晰可见,能够容易地进行审核:
结语
自省机制能够明显提高 RAG 的功用,答应改正检索和生成过程中的质量问题。几篇最新的 RAG 论文都着重讨论了这一主题,但要将这些理念实践使用起来有着不小的难度。本文展现了怎么使用 LangGraph 进行“流程工程化”地施行自反式 RAG。咱们还供给了施行两篇有目共睹的论文 —— Self-RAG 和 CRAG 中的理念的详细辅导。