RAG增强Agent实践:检索增强生成让智能体更懂你的业务
大模型的知识来源于训练数据,存在两个固有局限:知识截止日期(不知道最新信息)和领域深度不足(对企业的内部数据一无所知)。 RAG(Retrieval-Augmented Generation,检索增强生成)通过在生成回答前检索外部知识库,让Agent突破这些局限,获得实时、专业、可控的知识能力。
一、 RAG的核心原理
1.1 什么是RAG
RAG的工作原理可以用一个简单类比理解:
大模型像一个知识渊博但记忆有限的专家。当你问一个专业问题时,他可能:
• 凭记忆回答(可能过时或不准确)
• 说 "我不确定"
RAG的做法是:在专家回答之前,先去图书馆找到相关资料递给他,让他参考这些资料再回答。这样既利用了专家的理解和表达能力,又保证了信息的准确性和时效性。
1.2 RAG的工作流程
完整的 RAG流程包含四个阶段:
阶段一:知识入库( Indexing)
1. 收集文档( PDF、Word、HTML、数据库等)
2. 文档分块(将长文档切分为语义完整的段落)
3. 向量化(用 Embedding模型将文本块转为语义向量)
4. 存储(将向量存入向量数据库)
阶段二:查询检索( Retrieval)
1. 用户提问向量化
2. 在向量数据库中检索语义最相似的文本块
3. 返回 Top-K(通常3-5个)相关文本块
阶段三:上下文增强( Augmentation)
1. 将检索到的文本块与用户问题组合
2. 构建增强提示词: "基于以下信息回答用户问题:[检索内容] 用户问题:[问题]"
阶段四:生成回答( Generation)
1. 大模型基于增强提示词生成回答
2. 标注信息来源
3. 返回给用户
1.3 RAG vs 微调
| 对比维度 | RAG | 微调( Fine-tuning) |
|---|---|---|
| 知识更新 | 实时更新,只需更新知识库 | 需要重新训练 |
| 计算成本 | 推理时检索,成本较低 | 训练成本高 |
| 可解释性 | 可追溯信息来源 | 黑盒,难以追溯 |
| 准确性 | 依赖检索质量,可能召回不准 | 模型内化知识,稳定但可能过时 |
| 适用场景 | 频繁变化的业务知识 | 稳定的领域知识 /风格学习 |
| 数据安全 | 知识库可权限控制 | 知识融入模型权重,难以删除 |
实践建议: RAG和微调不是非此即彼,可以组合使用——微调让模型理解领域语言风格,RAG提供最新业务知识。
二、 Agent中的RAG集成
2.1 将RAG作为Agent工具
最直接的集成方式是将 RAG检索作为一个工具供Agent调用:
# RAG工具定义 def search_knowledge_base(query: str, top_k: int = 5) -> str: """ 搜索企业知识库,获取与查询最相关的信息。 当需要查询企业内部文档、产品手册、 FAQ、历史案例时使用此工具。 参数: - query: 搜索关键词或问题 - top_k: 返回结果数量,默认5条 """ # 向量化查询 query_embedding = embedding_model.encode(query) # 向量检索 results = vector_db.search( query_embedding, top_k=top_k, filter={"department": "medical"} # 可选的元数据过滤 ) # 格式化结果 formatted = [] for i, result in enumerate(results): formatted.append( f"[来源{i+1}] {result.metadata['source']}\n" f"内容:{result.content}\n" f"相关度:{result.score:.2f}\n" ) return "\n".join(formatted) # 注册为Agent工具 tools = [ Tool( name="知识库搜索", func=search_knowledge_base, description="搜索企业内部知识库,获取产品文档、操作手册、历史案例等信息" ) ]
Agent在需要业务知识时主动调用此工具,而非依赖模型自身的训练知识。
2.2 RAG增强的Agent工作流
集成 RAG后,Agent的典型工作流:
用户:医院随访系统中,糖尿病患者的高血糖预警阈值是多少? Agent思考:这是企业知识库中的配置信息,需要调用知识库搜索 Agent行动:search_knowledge_base("糖尿病 高血糖 预警阈值") Agent观察: [来源1] 系统配置手册v2.3 内容:空腹血糖 >7.0mmol/L或餐后2小时血糖>11.1mmol/L时触发高血糖预警 Agent回答:根据系统配置手册v2.3,糖尿病患者的空腹血糖>7.0mmol/L或餐后2小时血糖>11.1mmol/L时,系统会触发高血糖预警。
2.3 多知识库RAG
企业可能有多个独立知识库, Agent需要根据问题类型选择检索哪个:
knowledge_bases = { "产品文档": product_doc_db, "客户案例": case_study_db, "技术规范": tech_spec_db, "FAQ": faq_db } def smart_search(query: str) -> str: """智能选择知识库并检索""" # 用分类模型判断问题类型 category = classifier.predict(query) # 在对应知识库中检索 db = knowledge_bases[category] results = db.search(embedding_model.encode(query), top_k=5) return format_results(results)
三、 RAG系统的关键优化
3.1 文档分块策略
分块质量直接影响检索效果,是 RAG系统最关键的优化点。
固定长度分块
按固定字数(如 500字)切分,实现简单但可能截断语义。
语义分块
按段落、标题、句子边界切分,保持语义完整:
# 基于标题的分块 def chunk_by_heading(document): chunks = [] current_heading = "" current_content = "" for line in document.split("\n"): if line.startswith("#"): if current_content: chunks.append({ "heading": current_heading, "content": current_content }) current_heading = line current_content = "" else: current_content += line + "\n" if current_content: chunks.append({ "heading": current_heading, "content": current_content }) return chunks
递归分块
先按大结构(章节)分,再按小结构(段落)分,兼顾上下文和精度。
推荐配置:
• 块大小: 300-800字(中文),512-1024 tokens(英文)
• 重叠:块之间保留 50-100字重叠,避免边界信息丢失
• 元数据:每个块标注来源文档、页码、章节标题
3.2 检索质量优化
混合检索
结合向量检索和关键词检索:
def hybrid_search(query, top_k=5): # 向量检索(语义匹配) vector_results = vector_db.search( embedding_model.encode(query), top_k=top_k * 2 ) # 关键词检索(精确匹配) keyword_results = keyword_db.search(query, top_k=top_k * 2) # 融合排序 merged = reciprocal_rank_fusion(vector_results, keyword_results) return merged[:top_k]
重排序( Reranking)
初检后用更精确的模型重排序:
def search_with_rerank(query, top_k=5): # 初检:快速召回top-20 candidates = vector_db.search( embedding_model.encode(query), top_k=20 ) # 重排:用cross-encoder精排 reranked = reranker.rank(query, candidates) return reranked[:top_k]
查询改写
将用户原始查询改写为更适合检索的形式:
• 扩展缩写和同义词
• 将口语化表达转为专业术语
• 将复合问题拆分为多个子查询
3.3 上下文窗口管理
当检索结果过多时,需要智能管理上下文:
• 按相关度排序,优先放入高相关度内容
• 对长文本块进行摘要后再放入
• 动态调整放入数量,确保不超过模型上下文限制
四、 RAG Agent的评估
4.1 评估指标
| 指标 | 说明 | 理想值 |
|---|---|---|
| 检索准确率 | 检索结果中相关内容的比例 | >80% |
| 检索召回率 | 相关内容被检索到的比例 | >90% |
| 回答准确率 | 回答内容的正确性 | >85% |
| 引用准确率 | 引用的来源与回答对应性 | >90% |
| 拒答率 | 应能回答但拒答的比例 | <10% |
| 幻觉率 | 回答中编造信息的比例 | <5% |
4.2 评估方法
人工评估
构建测试问题集,人工评估每个回答的准确性和完整性。适合小规模验证。
自动化评估
用 LLM作为评估器,自动评分回答质量:
def evaluate_answer(question, answer, reference): eval_prompt = f""" 问题: {question} 回答: {answer} 参考答案: {reference} 请从以下维度评分( 1-5分): 1. 准确性:回答是否与参考答案一致 2. 完整性:回答是否覆盖了所有关键信息 3. 引用准确性:引用的来源是否正确 """ return llm.evaluate(eval_prompt)
RAG是让Agent真正理解企业业务的关键技术。没有RAG的Agent只能依赖通用知识,难以在专业场景中提供准确回答。通过精心的分块策略、检索优化和上下文管理,RAG增强的Agent可以达到甚至超过人类专家的回答质量。随着向量检索技术的不断进步,RAG系统的效果将持续提升,成为企业AI应用的标配能力。
