【深入浅出RAG】LangChain-RAG优化最终章:RAG结合Agent实现最佳检索结果
书接上文,
今天来到LangChain 团队的RAG优化策略演讲的最后环节,也就是下图右边的检索和生成部分。
检索Retrieval
检索部分LangChain团队提到了4种优化方法,分成了两类:排序和改进。
排序包含3种优化方法,重排序rerank,RankGPT和RAG-fusion:
- Re-Rank
Re-Rank就是重排序,原理比较好理解,就是把向量数据库中检索到的结果,比如最相似的前10条记录,再进行排序,并筛选出更小一部分结果,比如前2条。
那为什么不直接选择前2条,还要再进行排序?
主要是因为为了提升在向量数据库中的检索结果,一般会使用向量索引,向量索引的算法(常见的为HNSW算法)都有一定的随机性,会导致除了第一条以外,其他的结果不太准确,因此需要再进行排序。
可以参考Rerank——RAG中百尺竿头更进一步的神器,从原理到解决方案 – 知乎 (zhihu.com)
- RankGPT
这种方法就是使用大模型作为Agent实现重排序的能力,可以参考开源项目:
GitHub – sunnweiwei/RankGPT: Is ChatGPT Good at Search? LLMs as Re-Ranking Agent [EMNLP 2023 Outstanding Paper Award]
不过这种方式貌似比较少见,具体效果待验证。
- RAG-Fusion
这是LangChain团队给的检索优化的第三种方式,等等~RAG融合不是之前在问题重写的时候提到过吗?怎么又写一遍,是不是重复了?
LangChain给出的代码示例其实是把多次查询的结果进行重排序,再返回给大模型,有点把RAG-Fusion和Re-Rank组合的意思。
不过还有一种方式比较常见,是把文本检索的结果和向量检索的结果进行重排序,也算是一种RAG融合吧~
不过这种方式虽然对检索结果有提升,但是提升幅度并不大,谨慎使用~
CRAG (Corrective RAG)
检索部分另外一个优化方式是通过CRAG的方式,CRAG翻译过来是纠正式RAG,就是对于检索结果设定一个标准。
向量检索不是筛查出最相似的前N个值吗?但是这并不代表前几名的相似度一定满足要求,比如全班成绩前几名也有可能不及格~最高分可能就59分~
如果发生这种情况,一般就代表问题的答案可能并不在向量数据库里,这时候最好的方式是借助外部能力。
当发现检索的结果都不满足要求的时候,就通过重写问题,再去互联网查询相关的内容,把网上查找的结果再做一次RAG,发送给大模型生成结果。
CRAG其实已经需要结合Agent智能体的方式来实现了~在检索和生成环节的优化过程,RAG开始需要和Agent进行融合。
生成 Genration
生成环节其实没有太多的优化办法,主要就是靠大模型和提示词,大模型能力强,结果就好。
不过也不是完全没有优化点的,LangChain在分享中提到了Self-RAG,通过每一步自我反省的方式实现更好的检索效果。
Self-RAG、CRAG已经不仅仅是RAG了,需要结合Agent的能力,因此需要结合LangGraph的能力实现。
本文只做基本介绍,详细的代码实现还需参考LangChain官网。
https://github.com/langchain-ai/langgraph/blob/main/examples/rag/langgraph_crag.ipynb
Self-RAG
Self-RAG 是每执行一步,就进行一次反省,判断这个步骤是否达到要求,如果不满足要求,就返回到第一步进行重写优化。
实际操作中,实现 RAG 需要对上述步骤进行逻辑分析:比如
-
我们需要知道什么时候进行检索(基于问题和索引的构成)
-
何时改写问题以提升检索效率,或者何时抛弃无关的检索结果并重新检索。
在实现过程中,需要结合工作流的方式,将整个流程穿成一个环进行处理。
自适应RAG(Adaptive RAG)
自适应RAG是结合问题分析和Self-RAG的一种方法。先分析问题是否适合RAG,还是应该去互联网查找资料,或者直接通过大模型回答。
需要先通过提示词,让大模型进行问题路由,选择具体是RAG还是其他途径回答。
LangChain 团队提到的RAG优化策略已经全部完毕,总共提到了17种优化方法,再加上自适应RAG,一共18种方法。
虽然方法挺多的,但实际效果并不是等同的,有的方法优化效果明显,但还有部分方法甚至会起到反效果。
在验证过程中,像ColBERT和Re-rank起到的优化效果比较明显。
不过~想要直接感受RAG的优化效果,最好的办法还是亲自尝试。