基于博文 Advanced RAG Techniques: an Illustrated Overview 的学习和练习的记录。
中文内容可以查看博主@宝玉的译文 高级 RAG 技术:图解概览 [译]
系列笔记:
RAG 学习笔记(一)
RAG 学习笔记(二)
RAG 学习笔记(三)
RAG 学习笔记(四)
重排序与过滤
在获取检索结果后,可以根据通过过滤、重新排序或者其他的转换方法来进行检索结果的优化。
这是将检索结果提供给 LLM 的最后一步。
LlamaIndex 有多种后处理器(Postprocessor)可以进行过滤和重排序:
- 可以根据相似度得分,关键词,元数据进行过滤
- 可以使用其他的LLM,sentence-transformer cross-encoder,Cohere 重排序方法,或者根据最近日期进行重排序
动手练习:Rerank LangChain 实现: Cohere Rerank 和 Cross-encoder Rerank
下面的内容是更为复杂的 RAG 技术,涉及 Agent 相关知识,包括 LLM 推理的一些复杂逻辑。
查询转换
查询转换通过使用LLM作为推理引擎对用户输入进行修改,从而提高检索质量。
方法一:查询拆分
- 如果查询语句复杂,可以使用 LLM 分解为多个子查询
- 将多个子查询并行执行,将检索到的结果合并,提供给 LLM
比如:
- 原始查询语句:What framework has more stars on Github, Langchain or LlamaIndex?
- 分解后的子查询:
- How many stars does Langchain have on Github?
- How many stars does Llamaindex have on Github?
实例
- LangChain 实现:Multi Query Retriever
- LlamaIndex 实现:Sub Question Query Engine
方法二:回退(step-back)法
- 将原始查询语句通过 LLM 生成更加通用的查询,以供检索出更通用或更高级别的上下文
- 使用原始查询进行检索
- 将两个查询的检索结果合并,提供给 LLM
比如:
- 原始查询:Could the members of The Police perform lawful arrests?
- 更加通用的查询:What can the members of The Police do?
实例
LangChain 实现:LangChain cookbook: Step-Back Prompting
方法三:查询重写
使用 LLM 将原始查询重新表述(reformulate)
实例
- LangChain 实现:LangChain Cookbook: Rewrite-Retrieve-Read
- LlamaIndex 实现:Query Rewriting Retriever Pack
理解回退(step-back)法和查询重写法,请看:Query rewrite 和 Step-back Prompting 对比学习