Agent-camel框架学习记录(4)
原作者链接🔗:https://fmhw1n4zpn.feishu.cn/docx/AF4XdOZpIo6TOaxzDK8cxInNnCe
检索增强生成 (RAG) 简介及关键组件
RAG 概述
检索增强生成(RAG)是一种增强生成式AI模型(特别是LLM)准确性和可靠性的技术。它通过从外部知识源中检索相关事实信息,并将这些信息提供给LLM,从而使模型能够生成更权威、有出处且减少“幻觉”的答案。
RAG 的核心优势
提供可信来源:为AI模型的输出提供“脚注”,用户可以查证,增强信任。
减少“幻觉”:弥补LLM在特定或最新信息方面的不足,降低模型“编造”答案的可能性。
实现简单高效:相对于重新训练模型,RAG实现成本更低、速度更快,且支持信息源的即时更新。
广泛应用性:可与各种数据存储库结合,应用于医疗、金融、客户服务、员工培训等几乎所有行业。
CAMEL 框架中的 RAG 组件
在 CAMEL 框架中,RAG 的实现主要依赖于数据加载和数据嵌入这两个核心环节,以构建智能问答系统和对话Agent等应用。
1 | 1. Loaders (数据加载器) |
使用示例:
1 | # 设置示例脏文本 |
目前支持的清理操作:
1 | - replace_unicode_quotes: 将Unicode引号替换为标准引号 |
1 | 2. Embeddings (嵌入) |
通过结合 Loaders 进行高效的数据准备和 Embeddings 进行语义理解,CAMEL 框架为构建强大且可靠的 RAG 系统提供了坚实的基础。
存储 (Storages) 与 检索 (Retrievers)组件
1. Storages (数据存储)
概念:CAMEL 框架中的 Storage 模块是一个统一的数据存储与管理层,提供标准接口处理多种数据类型,为 RAG 应用奠定基础。
- 键值存储 (Key-Value Storage)
BaseKeyValueStorage:抽象基类,用于标准化键值数据的保存、加载和清除操作,通常通过Python字典接口交互。InMemoryKeyValueStorage:具体实现,数据存储在内存中,适用于开发、测试和临时存储(数据易失)。
- 向量存储 (Vector Store)
- 目的:存储高维度向量数据(如嵌入表示),支持高效相似度计算和最近邻搜索,是 RAG 中检索相关信息的核心。
- 特点:高性能、可扩展、灵活(支持多种相似度度量,如点积、余弦、欧氏距离)。
BaseVectorStorage:抽象基类,定义了添加、删除、查询向量和管理数据库状态等操作。MilvusStorage:与云原生向量搜索引擎 Milvus 集成,优化大规模向量检索。QdrantStorage:与 Qdrant 向量搜索引擎集成,提供高效的向量存储、管理和 ANN 搜索,适用于推荐系统、NLP嵌入查询等。
- 图存储 (Graph Storage)
- 目的:存储和管理图数据(节点、边),支持复杂的图查询和分析。
BaseGraphStorage:抽象基类,定义了获取客户端、模式管理、添加/删除三元组和执行图查询等操作。NebulaGraph:与分布式图数据库 NebulaGraph 集成,适用于知识图谱、社交网络分析等大规模图数据场景。Neo4jGraph:与行业领先的图数据库 Neo4j 集成,利用其关系建模和高效查询能力,适用于知识图谱、诈骗检测等。
2. Retrievers (信息检索器)
概念:Retrievers 模块充当“搜索引擎”,负责在海量数据中高效查找特定信息,支持向量检索和关键词检索。
向量检索器 (Vector Retriever)
- 原理:将数据(文本、图像)通过嵌入模型转化为高维向量,存储在向量存储中。查询时,将查询转换为向量,并在向量存储中寻找语义上最接近的匹配。
- 优势:擅长语义搜索,理解自然语言的模糊关系,适用于推荐系统、语义查询和跨模态搜索。
VectorRetriever:- 初始化:可选择传入嵌入模型(如
SentenceTransformerEncoder),否则默认使用OpenAIEmbedding。 process():处理内容(文件/URL),分块,并将嵌入存储到指定的向量存储(如QdrantStorage)中。query():根据查询字符串从存储中检索最匹配的信息。
- 初始化:可选择传入嵌入模型(如
关键词检索器 (Keyword Retriever)
- 原理:对文档进行预处理(如分词、建立索引),直接解析用户查询的关键词并匹配相应文档内容。
- 优势:依赖关键词精确匹配,适合快速查找特定术语或短语。
- 特点:
更细粒度的控制:你需要手动导入并初始化 QdrantStorage,明确指定 vector_dim、collection_name 和 path。
分步操作:process() 方法用于内容的嵌入和存储,query() 方法用于查询。这两个步骤是分开的。
适用场景:当你需要对向量存储的配置(如集合名称、存储路径)有更精确的控制,或者需要分步执行数据的处理和查询时,这种方式更合适。例如,你可能想先处理大量数据并存储,然后再在不同的时间点执行查询。
自动化检索 (AutoRetriever)
功能:简化检索流程,自动处理嵌入、数据存储和查询。
run_vector_retriever():接受多个内容输入路径和查询字符串,自动执行向量检索过程,并可返回详细元数据。适用于批量内容处理和查询。特点:
更高的抽象级别:AutoRetriever 封装了 VectorRetriever 和底层存储(如 QdrantStorage)的创建和配置细节。你只需指定 vector_storage_local_path 和 storage_type。一步到位:run_vector_retriever() 方法将内容的嵌入、存储和查询整合到一个函数调用中。这大大简化了代码。
便捷性:更适合快速原型开发、演示或当你不需要对底层存储有过多自定义控制时。它提供了开箱即用的体验。
简化的配置:不需要手动计算 vector_dim,AutoRetriever 会自动处理。它还会为你生成默认的集合名称。
两种检索方式的区别与优劣
- 如果你追求快速实现和代码简洁,
AutoRetriever是更好的选择。如果你需要对向量存储的底层配置和操作流程有更多控制,那么使用VectorRetriever结合手动配置会更合适。
- 如果你追求快速实现和代码简洁,
Storages 模块提供了 RAG 所需的底层数据基础设施,而 Retrievers 模块则在此基础上实现了高效的信息查找能力,两者协同工作,使得 RAG 能够精准地从外部知识中获取相关上下文,并将其反馈给LLM进行增强生成。
向量数据库及其在知识库搭建中的应用
1. 向量数据库 (Vector Database) 介绍
概念:向量数据库是一种专门用于存储、管理和检索高维向量数据的数据库系统。它在现代AI和机器学习应用中至关重要,因为文本、图像、音频等数据常被转换为高维向量(即嵌入),以捕捉其语义或特征。
主要功能:
- 向量存储:高效存储大规模高维向量数据,通常还可关联元数据(描述性信息)。
- 相似度搜索:核心功能,通过高效的近似最近邻(ANN)搜索算法,快速找到与查询向量语义最相似的向量集合。
- 扩展性:支持水平扩展,以应对不断增长的数据存储和计算需求。
常见应用:
- 推荐系统:根据用户行为或偏好,检索并推荐相似的产品或内容。
- 图像和视频搜索:通过内容(而非关键词)检索相似的图像或视频。
- 自然语言处理(NLP):在嵌入空间中查找语义相似的文本或词语,支持语义搜索、问答系统等。
实现技术:
向量数据库通常采用以下算法和数据结构来实现高效的相似度搜索:
- HNSW (Hierarchical Navigable Small World) 图:一种基于图的ANN搜索算法,以其高查询效率和准确性而闻名。
- 局部敏感哈希 (LSH):通过哈希函数将相似向量映射到相同“桶”中,实现快速检索。
- 产品量化 (PQ):通过将向量分解并量化来减少存储和计算成本。
常见向量数据库系统:
- Milvus:开源向量数据库,支持亿级向量的高效存储和检索。
- Pinecone:提供向量数据库即服务 (DBaaS),简化管理和查询。
- Weaviate:开源向量搜索引擎,支持多种数据模式和扩展。
CAMEL 框架中的向量数据库集成:
CAMEL 框架通过 camel.storages.vectordb_storages 包提供了与多种向量数据库的交互能力:
base模块:定义了向量存储的基础类和接口(如BaseVectorStorage、VectorDBQuery、VectorDBQueryResult)。milvus模块:实现与 Milvus 数据库的交互(MilvusStorage)。qdrant模块:实现与 Qdrant 数据库的交互(QdrantStorage)。weaviate 模块:实现与 Weaviate 数据库的交互(WeaviateStorage)。
这种模块化设计使得 CAMEL 能够灵活适应不同的应用需求和向量数据库选择。
2. 知识库搭建流程中的数据处理
搭建高效的知识库是 RAG 应用成功的关键,其中数据预处理和嵌入模型选择至关重要。
Embedding 模型选择:
选择合适的嵌入模型是构建知识库的第一步。
- Embedding API 服务 (e.g., OpenAI, Cohere, Mistral):
- 优点:方便易用,无需本地部署和管理模型。
- 适用场景:项目或工程中对数据隐私要求不高,且预算充足的情况。
- 开源 Embedding 模型 (Open Embedding Model):
- 优点:数据隐私性好,可本地部署,提供更多自定义和微调空间。
- 适用场景:对数据隐私有严格要求,或需要针对特定任务优化模型性能的情况。
- 选择标准:没有绝对的“最好”,只有“最适合”。建议构建应用场景专有评测集,通过量化评估来选择最适合自身数据的模型。
数据预处理:
数据预处理是保证 RAG 系统高质量输出的关键步骤,遵循“Garbage in, Garbage out”原则。
- 目的:将原始、多样化的数据转化为LLM和嵌入模型能够高效处理的统一格式,并去除噪声。
- 常用手段:
- 数据读取:从各种来源(文件、数据库、API)获取原始数据。
- 数据格式转换:将不同格式(如PDF、TXT、DOC、PPT)的数据统一转换为便于模型处理的格式,Markdown 格式是常用的选择。
- 数据清洗:
- 去除噪声:移除不相关或干扰信息。
- 纠正错误:修正拼写、语法错误等。
- 信息筛选:提取核心信息,过滤冗余内容。
构建RAG应用:从基础到优化
RAG(Retrieval Augmented Generation,检索增强生成)是一种结合检索和生成的技术路线,旨在增强大型语言模型(LLM)的能力,解决其在时效性和幻觉方面的问题。
1. Basic RAG
1.1 RAG 的核心思想
当LLM处理大量文本(例如数千篇文档、上亿个token)时,直接将所有文本作为上下文输入给LLM会迅速超出其上下文长度限制。RAG的核心思想是:
- 检索(Retrieval):从海量文本数据中智能地检索与用户查询最相关的少量信息片段。
- 增强生成(Augmented Generation):将检索到的相关信息作为上下文合并到用户Prompt中,然后交付给LLM进行回复生成。
1.2 CAMEL 框架中的检索器
CAMEL 框架通过 camel.retrievers 模块实现了检索功能,主要分为两大类:
VectorRetriever(向量检索器):- 工作流:
- 分块:将大型文档分解为较小的文本块。
- 嵌入:使用嵌入模型(如
SentenceTransformerEncoder)将每个文本块转换为高维向量。 - 存储:将这些向量存储在向量数据库(如
QdrantStorage)中。 - 检索:当用户查询时,将查询转换为向量,在向量数据库中搜索相似度高(通常使用余弦相似度)的匹配向量,并返回最相关的信息片段。
process()函数:CAMEL 封装了文件读取、切块、嵌入和存储的整个流程,简化了RAG应用的搭建。
- 工作流:
BM25Retriever(关键词检索器):- 工作原理:从稀疏的关键词维度进行文本召回,通过关键词匹配算法筛选出最相关的文本片段。
1.3 Basic RAG 实践步骤
- 读取示例数据:下载并准备作为知识库的原始文档(例如PDF文件)。
- 实例化嵌入模型:选择并加载合适的嵌入模型(例如本地的
SentenceTransformerEncoder)。 - 向量嵌入和存储数据:
- 创建并初始化向量数据库实例(如
QdrantStorage)。 - 实例化
VectorRetriever,并将其与嵌入模型和向量存储关联。 - 调用
vr.process(content=...)方法,将文档读取、分块、嵌入并存储到向量数据库中。
- 创建并初始化向量数据库实例(如
- 执行检索:
- 使用
vr.query(query=..., top_k=..., similarity_threshold=...)方法,根据用户查询从向量数据库中检索最相关的信息片段。 top_k:指定返回最相关片段的数量。similarity_threshold:设置相似度阈值,确保检索内容的相关性。- 对于不相关查询,检索器在达到相似度阈值时会返回“No suitable information retrieved”等提示。
- 使用
- 结合LLM生成回复:
- 实例化一个LLM模型或Agent(例如 CAMEL 中的
ChatAgent)。 - 将检索到的信息片段(通常是
results[0]["text"])作为上下文传递给Agent。 - 通过 Agent 的
step()方法,LLM结合检索到的上下文生成最终回复。 - 可以将整个过程封装成一个函数,实现自动检索和生成。
- 实例化一个LLM模型或Agent(例如 CAMEL 中的
1 | import os |
2. Rewriting (查询改写/澄清)
在实际应用中,用户查询可能存在错别字、语义模糊或表达不准确等问题,这会严重影响RAG系统的检索和生成质量。Rewriting 模块旨在优化和提高原始查询的质量。
2.1 优化策略
- 错字校正:修正用户输入中的拼写错误。
- 句式调整:重构查询,使其表达更通顺严谨。
- LLM 自我调整:利用LLM(通过提示词工程)对原始查询进行优化和重写。
1 | """ |
2.2 其他高级 Rewriting 技巧
- 子问题策略(Sub-Query):将主问题分解为更具体的子问题,帮助系统深入理解并提高检索准确性。
- HyDE (Hypothetical Document Embeddings) 查询转换:
- 利用LLM为用户查询生成假设性文档(可能包含错误但与原始查询相关)。
- 通过这些假设文档的嵌入向量,在RAG知识库中检索具有相似向量的真实文档,从而提高检索精度。
以下代码是基于RAGBasic上构建的HyDE模块:
1 | """ |
3. Rerank (重排)
Rerank 模块用于对初步检索结果进行重新排序,以提高检索精确性和相关性,尤其在多路召回(结合向量相似度、关键词匹配、规则匹配等多种检索方式)场景中尤为重要。多路召回可能导致召回片段数量多且相关度参差不齐。
3.1 重排步骤
- 初步检索:获取多路召回的初始文档片段。
- 特征计算:评估每个文档片段与查询的相关性得分。
- 重新排序:根据特征得分对文档片段进行排序。
- 选择最佳结果:从重排后的结果中选取前
TOP-K个作为最终最相关的片段,传递给LLM进行生成。
3.2 评估指标
- 命中率 (Hit Rate):在前
k个检索文档中找到正确答案的查询比例,衡量系统在几次尝试中找到正确答案的频率。 - 平均倒数排名 (MRR - Mean Reciprocal Rank):评估系统准确性,根据排名最高的相关文档的倒数排名计算平均值(第一个相关文档排名为1,倒数排名为1;第二个为1/2,以此类推)。MRR和Hit Rate越高,表示Rerank效果越好。
3.3 RRF (Reciprocal Rank Fusion) 算法实践
- 原理:一种融合多个不同相关性指标结果集的方法,仅依赖排名计算,不要求相关性分数相互关联。
- 实现:通过遍历来自不同检索器(例如
VectorRetriever和BM25Retriever)的结果,计算每个文档的融合分数,然后按分数降序排序并返回前k个结果。
实现RRF算法的系统:
1 | """ |
通过结合 Basic RAG,以及Rewriting和Rerank等优化模块,我们可以构建出更强大、更准确的RAG应用,从而显著提升LLM在特定知识领域的表现。
以下是对你提供的内容的系统性中文整理总结,涵盖了向量检索模块的评估与优化流程,包括 TF-IDF 与嵌入模型对比、评估指标定义、检索流程实现、优化方向等内容,适合撰写文档或教学材料使用。
向量检索模块评估与优化
一、背景说明
在构建基于向量检索(Vector Retrieval, VR)的智能问答系统时,评估检索质量成为关键一步。本实践以 CAMEL AI 框架为基础,通过标准问题及预期答案的方式,对检索器返回结果进行自动化评估,并尝试不同方法进行优化。
二、测试样例定义
我们通过一组测试查询(test_queries)及预期标准答案(expected_answers)来建立基本评估集:
1 | test_queries = [ |
三、评估指标设计
系统定义了以下核心评估指标:
| 指标名 | 含义 |
|---|---|
| Precision(精确率) | 正确返回结果 / 实际返回结果 |
| Recall(召回率) | 正确返回结果 / 所有应返回的正确结果 |
| F1 分数 | 精确率和召回率的调和平均 |
| 平均相似度 | 所有预期-实际配对之间的相似度均值 |
其中,相似度计算方法有两种实现方式:
四、相似度计算方法
方法1:TF-IDF + 余弦相似度(初始方法)
1 | def compute_similarity(expected, retrieved): |
方法2:Embedding + 余弦相似度(改进方案)
1 | def compute_similarity(expected, retrieved): |
优点:Embedding 模型具备更强的语义理解能力,能处理“车辆≈汽车”这类同义关系。
五、整体评估流程
1 | def evaluate_retrieval(query, expected_answers, threshold=0.5, top_k=1): |
六、优化路径探索
1. 使用 Embedding 替代 TF-IDF
- 提升语义对齐效果
- 平均相似度显著提高(如从
0.36提升至0.91)
2. 调整文档切片粒度(chunking)
1 | vr.process( |
- 优化检索粒度,避免一次性返回长段内容
- 实现更加针对性的文本匹配与评分
3. 模型与参数优化方向
- 嵌入模型:尝试不同的 encoder(如 BGE、MiniLM)
- 相似度度量:替换余弦相似度为欧几里得/点积等
- 检索策略:TF-IDF + Embedding 混合策略
七、生成模块评估建议(BLEU / ROUGE)
1 | from rouge_score import rouge_scorer |
输出示例:
1 | ROUGE-1: 0.86 |
八、结论
本评估流程展示了向量检索系统从初步搭建 → 精度评估 → 嵌入优化 → 文档切片的迭代式优化路径,并为后续生成式问答系统提供了评估参考。
后续可探索方向包括:
- 检索器多阶段混合策略(关键词初筛 + 嵌入复检)
- 基于用户反馈的自动优化(在线学习)
- 微调专用 Embedding 模型以适配垂类语义
当然可以!下面是针对你这个 Graph RAG 实战项目的详细任务分解(spec → task → controller)设计,适用于你当前使用的 CAMEL 框架 + Qwen2.5 模型 + Firecrawl 网页抓取 + Neo4j 图数据库 + 混合 RAG 推理的场景:
Graph RAG 实战系统任务分解
Spec(规范说明)
构建一个以知识图谱驱动的 Graph RAG 系统,实现从网页抓取 → 实体关系抽取 → 知识图谱构建 → 混合检索 → 回答生成的闭环流程,核心目标为提升复杂问题回答的准确性与可解释性。
- 用户输入自然语言问题
- 系统自动进行相关网页抓取与处理
- 抽取结构化实体关系,写入 Neo4j 图谱
- 使用图谱结构 + 向量语义检索综合选取回答依据
- 调用 Qwen2.5 模型生成最终响应
Task(模块拆解)
- 网页抓取模块(web_crawler)
- 使用 Firecrawl API 抓取用户问题相关的网页
- 输出结构化网页内容(标题、正文、链接等)
- 信息抽取模块(entity_relation_extractor)
- 对抓取的网页内容进行实体识别与关系抽取(NER + RE)
- 输出三元组(subject, relation, object)
- 图谱构建模块(graph_builder)
- 将三元组写入 Neo4j 数据库(防止重复写入)
- 实现节点合并、关系合并策略
- 混合检索模块(hybrid_retriever)
- 图谱检索:基于 Cypher 查询获取相关实体路径
- 向量检索:基于 CAMEL 的向量模块进行语义召回
- 融合策略:Rank/Fuse/Rerank 等融合两类召回
- 问答生成模块(graph_rag_qa)
- 将图谱结果 + 文档结果合并后作为上下文
- 使用 Qwen2.5 模型生成回答
- 支持来源追踪(source attribution)
- LLM Agent 调度模块(camel_controller)
- 封装整个流程为 CAMEL Agent 的工具调用链
- 根据用户输入智能调度抓取 → 构图 → QA 全链路
Controller(模块控制逻辑)
1 | # controller.py 示例(简化伪码) |
其它
- 引入 RAG-Fusion 或 ColBERT-RAG 提高融合性能
- 使用 LangGraph/Flowise 等构建 DAG 状态机调度
- 多跳推理能力强化:通过图谱路径进行 reasoning chain 构建
- 可视化图谱展示:Neo4j Bloom / D3.js 前端图谱可视化