【笔记】Handy Multi-Agent Tutorial 第四章 CAMEL框架下的RAG应用(实践)
正文详见:Handy Multi-Agent Tutorial - 飞书云文档https://fmhw1n4zpn.feishu.cn/docx/AF4XdOZpIo6TOaxzDK8cxInNnCe
4.3 搭建知识库
4.3.2 Embedding模型选择
-
Embedding API:如OpenAI,Cohere,Mistral等的API服务,适用于项目或工程中需要方便直接的使用嵌入且不介意数据隐私的情况
-
Open Embedding Model:适用于对数据隐私有要求或需要自定义模型本地部署的情况
前者相当于大模型API,后者相当于本地LLM。
4.3.2 数据预处理
数据读取 → 数据格式转换 → 数据清洗
-
数据读取:从文件、数据库或API获取原始数据
-
数据格式转换:将多样的数据统一转换成方便模型处理的格式(常用的为Markdown format)
-
数据清洗:去除噪声、纠正错误、信息筛选等
4.4 构建RAG应用
4.1.1 Basic RAG
RAG,全称为 Retrieval Argumented Generation,检索增强生成。
CAMEL中对于Retrieval这一过程的功能实现在 camel.retrievers
中,常用的retriever大致可以分成两类,基于向量的稠密检索和基于关键词的稀疏检索,分别对应 VectorRetriever
和 BM25Retriever。
VectorRetriever
,向量检索器利用数据的向量表示,将数据(如文本、图像或其他形式的信息)转换为高维空间中的数值向量。
以下是向量检索的工作流描述:
-
分块:对于大型文档或其他形式的数据信息而言,需要按一定的划分规则将其分解为较小的块
-
嵌入:对于每一个分块,使用嵌入模型将文本转换为高维的向量形式。
-
存储:这些得到的向量会被存储在数据库中。
-
检索:当提出问题或进行查询时,嵌入模型会将问题转换为向量,然后在此向量数据库中搜索相似度高的匹配向量(这里一般会用余弦相似度来计算两个向量之间的距离),从而返回最相关的信息片段。
BM25Retriever
,关键词检索器从结果而言是一样的,只不过是从更加稀疏的关键词的维度来对文本进行召回。通过关键词匹配的算法获取相似度高的文本片段,尽可能筛选出最相关的信息片段。
4.4.2 Rewriting
用户的Query的质量可能会极大程度地影响整个RAG系统的表现和性能。
因此加入一个对于初始Query的改写或者澄清模块,又称为 Rewriting
,来尽可能提高Query的质量或增强之后RAG环节的质量。
-
错字校正:修正用户输入中可能存在的错别字的情况
-
句式调整:重构Query来使得句子表达更加通顺严谨
对于这两个常规问题,我们可以使用LLM自我调整,通过提示词工程的方式令其自我优化提示词。
original_query = "我盖如何解决CAMEL中文档冲服的问题问题呢,几个版本的文档可能存在代码结构的冲突"
sys_msg = '你是RAG模块中的Rewriting助手,目的是理解用户的提问,并且重新组织和优化用户的提问表达,修正用户输入中可能存在的错别字的情况并重构提问来使得句子表达更加通顺严谨'
from camel.models import ModelFactory
from camel.types import ModelPlatformType, ModelType
from camel.configs import ChatGPTConfig
from camel.agents import ChatAgentfrom dotenv import load_dotenv
import osload_dotenv()
api_key = os.getenv('MODELSCOPE_SDK_TOKEN')# 定义模型
model = ModelFactory.create(model_platform=ModelPlatformType.OPENAI_COMPATIBLE_MODEL,model_type="Qwen/Qwen2.5-72B-Instruct",url='https://api-inference.modelscope.cn/v1/',api_key=api_key)
agent = ChatAgent(system_message=sys_msg, model=model)
# 定义Rewriting任务
usr_msg = f'用户的原始提问如下:{original_query},请优化重写并直接输出新的Query。新的Query: '
response = agent.step(usr_msg)
print(response.msgs[0].content)
其他优化技巧:
-
子问题策略
在问答过程中生成并提出与主问题相关的子问题,以便更好地理解和回答主问题。这些子问题通常更具体,可以帮助系统更深入地理解主问题,从而提高检索准确性和提供正确的答案。
-
HyDE 查询转换
使用 LLM 为用户查询生成假设文档。这些文档是根据 LLM 本身的知识生成的,可能包含错误或不准确之处。但是,它们与 RAG 知识库中的文档相关联。然后,通过使用这些假设文档来检索具有相似向量的真实文档,从而提高检索的准确性。
4.4.3 Rerank
Rerank模块对初步检索结果重新排序可以简单概括为以下几步:
-
初步检索:获取(多路召回)初始文档片段
-
特征计算:评估每个文档的相关性
-
重新排序:根据特征得分排序
-
选择最佳结果:根据重排结果倒序排列,取前TOP-K个作为最终的最相关结果交给LLM生成回复