从RAG到智能体:构建工程化Agentic RAG系统的核心架构与实践
30款热门AI模型一站整合DeepSeek/GLM/Qwen 随心用限时 5 折。 点击领海量免费额度大家好我是专注于AI应用开发与工程化落地的技术博主。在探索如何将大语言模型LLM深度融入实际业务时我们常常面临一个核心矛盾模型的知识是静态的而世界是动态的。传统的RAG检索增强生成虽然能接入外部知识但其“检索-生成”的单向流程在面对复杂、多步、需要推理和验证的任务时往往显得力不从心。你是否也遇到过这样的困境想让AI帮你分析最新的行业报告、对比多个产品的实时价格或者根据一系列用户反馈制定一个完整的优化方案却发现简单的RAG系统要么检索不准要么生成的内容缺乏深度和可信度这正是Agentic RAG要解决的问题。它不仅仅是RAG的升级版更是一种思维范式的转变——将AI从一个被动的“知识库生成器”转变为一个主动的、具备规划和执行能力的“智能体Agent”。本文将围绕“工程化 Agentic RAG 系统”这一主题从核心概念辨析开始逐步拆解如何构建一个融合Google Search等实时工具、并最终能部署为生产级可信 AI Agent的完整系统。无论你是希望将现有RAG项目升级为更智能的Agent还是从零开始构建一个能处理复杂任务的AI应用本文提供的架构设计、代码示例和工程化实践都将为你提供清晰的路径。1. 背景与核心概念从RAG到Agentic RAG在深入工程实践之前我们必须厘清几个关键概念理解Agentic RAG为何是下一代AI应用的关键。1.1 传统RAG的局限与Agent的兴起传统RAG检索增强生成的工作流程可以概括为“检索 - 拼接 - 生成”。用户提问后系统从向量数据库中检索出最相关的文档片段将其作为上下文与问题一起交给LLM由LLM生成最终答案。这个模式解决了LLM的“幻觉”和知识陈旧问题在问答、知识库查询等场景效果显著。然而其局限性也很明显被动响应只能针对单次查询做出一次性响应缺乏对复杂、多步骤任务的规划能力。静态知识依赖预先构建的向量库无法获取查询时刻的最新信息如股价、新闻。缺乏验证与迭代生成答案后流程即结束没有对答案质量进行校验或根据反馈重新调整的机制。工具使用单一通常只使用向量检索这一种工具。AI Agent智能体则引入了不同的范式。一个典型的Agent具备以下核心组件规划Planning将复杂目标分解为可执行的子任务序列。工具使用Tool Use可以调用外部工具如搜索引擎、计算器、API、数据库来获取信息或执行操作。记忆Memory保存对话历史、工具执行结果和自身推理过程用于后续决策。行动Action与观察Observation根据规划调用工具行动并处理工具返回的结果观察形成一个循环。1.2 Agentic RAG当RAG遇见AgentAgentic RAG不是取代RAG而是将RAG深度集成到Agent的框架中使其成为Agent工具箱里一个强大且核心的工具。同时Agent的规划、迭代和工具协调能力反过来极大地增强了RAG系统的能力。它与普通RAG的核心区别在于特性普通RAGAgentic RAG工作流线性Query - Retrieve - Generate循环Plan - Retrieve (Tool Use) - Reflect - Act - ...核心能力检索与生成规划、工具调用检索是其一、反思、迭代知识源静态向量数据库静态向量库 动态工具如搜索引擎、API任务复杂度适合明确、单一的问答适合开放、多步骤、需推理的复杂任务输出一次性答案可能是答案、报告、总结、甚至是执行了一系列操作后的状态更新举个例子普通RAG任务“我们公司的产品手册里关于‘数据备份’的功能是怎么描述的”Agentic RAG任务“请调研一下当前市面上主流的三种云数据库服务如Aurora, Cloud SQL, Cosmos DB在‘自动备份’和‘跨区域复制’方面的最新功能、定价以及用户评价并为我们即将上线的产品写一份竞争力分析摘要。”对于后者Agent需要1规划调研步骤2使用搜索引擎工具获取最新产品信息和评测3可能访问官方定价页面4使用RAG工具从内部知识库检索自家产品的功能描述5综合所有信息进行对比分析并生成报告。这个过程涉及多轮工具调用、信息整合和逻辑推理。2. 环境准备与核心组件选型构建一个生产级的Agentic RAG系统技术选型至关重要。我们需要一个稳定的Agent框架、高效的RAG引擎以及可靠的工具集成方案。2.1 基础环境与框架选择操作系统推荐 Linux (Ubuntu 20.04) 或 macOSWindows可通过WSL2进行开发。编程语言Python 3.9 是当前AI生态的主流选择。关键框架/库Agent框架LangChain或LlamaIndex。两者都提供了强大的Agent抽象、工具定义和链式调用能力。LangChain生态更庞大LlamaIndex在RAG领域更专注。本文示例将主要使用LangChain因其在Agent和工具集成方面更为成熟。LLMOpenAI GPT-4/3.5-Turbo、Anthropic Claude或开源模型如Qwen2.5、Llama 3。生产环境需考虑API成本、延迟和自托管能力。向量数据库Chroma(轻量开发友好)、Qdrant(高性能云原生)、Weaviate(功能丰富) 或PGVector(基于PostgreSQL易于集成)。选择取决于规模、性能需求和运维复杂度。工具执行需要能调用外部API如Google Search API通过SerpAPI或Google Custom Search JSON API、计算器、代码执行器等。2.2 项目初始化与依赖安装创建一个新的项目目录并初始化虚拟环境mkdir agentic-rag-system cd agentic-rag-system python -m venv venv source venv/bin/activate # Windows: venv\Scripts\activate安装核心依赖。这里我们选择LangChain作为主要框架并使用OpenAI的LLM和Chroma向量数据库作为示例。pip install langchain langchain-openai langchain-community langchain-chroma pip install pydantic-settings # 用于管理配置 pip install beautifulsoup4 requests # 用于网页抓取工具示例 pip install python-dotenv # 用于加载环境变量创建项目基础结构agentic-rag-system/ ├── .env # 环境变量API Keys ├── config/ │ └── settings.py # 应用配置 ├── core/ │ ├── agents/ # Agent定义 │ ├── tools/ # 自定义工具 │ ├── memory/ # 记忆管理 │ └── rag/ # RAG核心模块 ├── data/ # 知识库文档 ├── scripts/ # 数据预处理等脚本 └── main.py # 应用入口2.3 配置管理在.env文件中安全地存储你的密钥# .env OPENAI_API_KEYsk-your-openai-key-here GOOGLE_API_KEYyour-google-custom-search-api-key GOOGLE_CSE_IDyour-google-custom-search-engine-id # 如果使用SerpAPI SERPAPI_API_KEYyour-serpapi-key-here在config/settings.py中加载配置# config/settings.py from pydantic_settings import BaseSettings from pydantic import Field class Settings(BaseSettings): openai_api_key: str Field(..., envOPENAI_API_KEY) google_api_key: str Field(, envGOOGLE_API_KEY) google_cse_id: str Field(, envGOOGLE_CSE_ID) serpapi_api_key: str Field(, envSERPAPI_API_KEY) # 向量数据库路径 chroma_persist_directory: str ./chroma_db # 嵌入模型 embedding_model: str text-embedding-3-small class Config: env_file .env settings Settings()3. 核心模块拆解构建Agentic RAG的基石一个工程化的系统需要清晰的模块划分。我们来逐一构建核心组件。3.1 RAG模块不只是向量检索RAG模块负责从静态知识库中获取信息。在Agentic系统中它被封装成一个可供Agent调用的“工具”。首先实现文档加载、切分和向量化# core/rag/vector_store.py import os from langchain_chroma import Chroma from langchain_openai import OpenAIEmbeddings from langchain_community.document_loaders import DirectoryLoader, TextLoader from langchain_text_splitters import RecursiveCharacterTextSplitter from config.settings import settings class KnowledgeVectorStore: def __init__(self): self.embeddings OpenAIEmbeddings( modelsettings.embedding_model, api_keysettings.openai_api_key ) self.persist_directory settings.chroma_persist_directory self.vector_store None def init_vector_store(self, data_path: str ./data): 初始化或加载向量数据库 if os.path.exists(self.persist_directory): print(加载已有的向量数据库...) self.vector_store Chroma( persist_directoryself.persist_directory, embedding_functionself.embeddings ) else: print(创建新的向量数据库...) # 1. 加载文档 loader DirectoryLoader( data_path, glob**/*.txt, loader_clsTextLoader, loader_kwargs{autodetect_encoding: True} ) documents loader.load() # 2. 分割文档 text_splitter RecursiveCharacterTextSplitter( chunk_size1000, chunk_overlap200, length_functionlen, separators[\n\n, \n, 。, , , , , , ] ) splits text_splitter.split_documents(documents) print(f文档分割为 {len(splits)} 个片段。) # 3. 创建向量存储 self.vector_store Chroma.from_documents( documentssplits, embeddingself.embeddings, persist_directoryself.persist_directory ) return self.vector_store def as_retriever(self, k: int 4): 将向量库转换为检索器供Agent工具调用 if not self.vector_store: self.init_vector_store() return self.vector_store.as_retriever(search_kwargs{k: k}) # 单例模式全局使用一个向量库实例 knowledge_base KnowledgeVectorStore()3.2 工具模块扩展Agent的能力边界工具是Agent与外界交互的桥梁。除了RAG检索工具我们还需要能获取实时信息的工具。1. RAG检索工具# core/tools/rag_tool.py from langchain.tools import Tool from core.rag.vector_store import knowledge_base def rag_retrieval(query: str) - str: 从内部知识库中检索与问题相关的信息。 Args: query: 用户的查询问题。 Returns: 检索到的相关文本片段拼接成字符串。 retriever knowledge_base.as_retriever(k4) docs retriever.invoke(query) context \n\n---\n\n.join([doc.page_content for doc in docs]) return f从知识库中检索到以下相关信息\n\n{context} rag_tool Tool( nameInternal_Knowledge_Search, funcrag_retrieval, description当用户的问题涉及公司内部知识、产品文档、历史记录或静态政策时使用此工具。 输入应为清晰的自然语言问题。 )2. 谷歌搜索工具使用SerpAPI为了获取实时信息我们集成搜索引擎。这里以SerpAPI为例你也可以使用Google Custom Search JSON API。# core/tools/web_search_tool.py import os from langchain_community.tools import Tool from langchain_community.utilities import SerpAPIWrapper from config.settings import settings # 方法一使用LangChain内置的SerpAPIWrapper简单 if settings.serpapi_api_key: search SerpAPIWrapper(serpapi_api_keysettings.serpapi_api_key) web_search_tool Tool( nameWeb_Search, funcsearch.run, description当需要获取最新的新闻、市场价格、实时数据、公开的产品信息、技术文档或任何内部知识库中没有的信息时使用此工具。 输入应为明确的关键词或搜索查询语句。 ) else: # 方法二自定义一个简单的搜索工具示例需安装requests import requests def simple_web_search(query: str) - str: # 警告这是一个极简示例实际生产环境应使用官方API并处理错误、分页等。 print(f[模拟搜索] 查询: {query}) # 此处应替换为真实的Google Search API调用 # 例如使用 requests 调用 SerpAPI 或 Google Custom Search JSON API return f关于 {query} 的模拟搜索结果\n- 最新信息点 A...\n- 最新信息点 B... web_search_tool Tool( nameWeb_Search, funcsimple_web_search, description用于获取最新网络信息的工具。输入搜索词。 )3. 计算器工具# core/tools/calculator_tool.py from langchain.tools import Tool import math import re def calculator(expression: str) - str: 执行数学计算。支持基本算术和常用数学函数。 注意使用eval存在安全风险生产环境应使用更安全的表达式解析库如asteval。 此处为演示进行了极简的输入过滤。 # 极简的安全过滤仅允许数字、基本运算符、空格和部分数学函数/常量 safe_pattern r^[\d\s\\-\*\/\(\)\.\,\s]*$ if not re.match(safe_pattern, expression): return 错误输入包含不安全字符。仅支持基本算术运算。 # 替换常见的数学函数和常量非常基础的示例 # 生产环境务必使用安全的评估器 try: # 这是一个高度简化的示例切勿直接在生产环境使用eval # 考虑使用 numexpr 或 asteval 库 result eval(expression, {__builtins__: {}}, {math: math}) return f计算结果: {result} except Exception as e: return f计算错误: {e} calculator_tool Tool( nameCalculator, funccalculator, description用于执行数学计算。输入一个数学表达式例如 12 * (3 4) / 2。 注意目前仅支持基本算术运算。 )3.3 Agent构建大脑与决策中枢我们将使用LangChain的ReAct框架来构建一个能使用上述工具的Agent。ReActReasoning Acting框架让Agent能够进行链式思考并决定下一步行动。# core/agents/rag_agent.py from langchain.agents import AgentExecutor, create_react_agent from langchain_openai import ChatOpenAI from langchain.prompts import PromptTemplate from config.settings import settings # 导入我们定义的工具 from core.tools.rag_tool import rag_tool from core.tools.web_search_tool import web_search_tool from core.tools.calculator_tool import calculator_tool class AgenticRAGAgent: def __init__(self): # 1. 初始化大语言模型 self.llm ChatOpenAI( modelgpt-4o-mini, # 可根据需要切换为 gpt-4-turbo 等 temperature0, # 降低随机性使输出更稳定 api_keysettings.openai_api_key ) # 2. 定义工具集 self.tools [rag_tool, web_search_tool, calculator_tool] # 3. 构建ReAct风格的提示词模板 # 这是LangChain的默认ReAct模板清晰定义了Agent的思考格式 self.prompt PromptTemplate.from_template( 你是一个强大的AI助手可以访问多种工具来帮助用户解决问题。你的核心能力包括 1. 从内部知识库Internal_Knowledge_Search中检索静态、权威的公司或领域知识。 2. 使用网络搜索Web_Search获取最新的、实时的公开信息。 3. 使用计算器Calculator进行精确的数学运算。 请严格遵循以下格式进行思考 问题用户提出的原始问题 思考你需要分析问题判断是否需要使用工具以及使用哪个工具。一次只使用一个工具。 行动将要执行的动作必须是以下工具名之一{tool_names} 行动输入执行该动作所需的输入 观察工具返回的结果 ...这个“思考/行动/行动输入/观察”的循环可以重复多次 思考我现在有足够的信息来给出最终答案了吗 最终答案用清晰、有条理的方式给出最终答案并注明信息来源例如“根据内部知识库...”或“根据网络搜索...”。 开始 问题{input} {agent_scratchpad} ) # 4. 创建Agent self.agent create_react_agent( llmself.llm, toolsself.tools, promptself.prompt ) # 5. 创建Agent执行器控制循环和错误处理 self.agent_executor AgentExecutor( agentself.agent, toolsself.tools, verboseTrue, # 设置为True可以看到Agent的思考过程生产环境可设为False handle_parsing_errorsTrue, # 处理解析错误 max_iterations10, # 防止无限循环 early_stopping_methodgenerate # 达到最大迭代次数时让LLM生成一个答案 ) def run(self, query: str) - str: 执行Agent处理用户查询 try: result self.agent_executor.invoke({input: query}) return result[output] except Exception as e: return fAgent执行过程中出现错误: {e}。请检查工具配置或查询格式。4. 完整实战案例构建一个市场调研Agent现在让我们将上述模块组合起来构建一个能处理复杂查询的完整系统。我们的目标是创建一个“市场调研助手”它能结合内部产品知识RAG和外部实时信息Web Search回答复杂的竞争分析问题。4.1 准备知识库数据在data/目录下放入公司的产品文档。例如data/our_product.txt我们的产品“DataShield Pro”是一款企业级数据安全解决方案。 核心功能包括 - 实时数据备份支持每15分钟增量备份RPO恢复点目标可达15分钟。 - 跨区域复制数据可自动复制到全球3个不同区域确保业务连续性。 - 加密标准采用AES-256加密算法同时支持客户自带密钥BYOK。 - 定价模型基础版每月$500起企业版根据数据量定制报价。 最新版本v3.2于2024年10月发布增加了AI驱动的异常访问检测功能。4.2 初始化系统并运行Agent创建一个主程序入口main.py# main.py import sys from core.rag.vector_store import knowledge_base from core.agents.rag_agent import AgenticRAGAgent def main(): # 1. 初始化知识库向量存储首次运行会创建索引 print(初始化知识库...) knowledge_base.init_vector_store() print(知识库就绪。) # 2. 创建Agent print(启动Agentic RAG Agent...) agent AgenticRAGAgent() # 3. 交互式循环或处理单个查询 if len(sys.argv) 1: # 命令行参数输入 query .join(sys.argv[1:]) print(f\n用户查询: {query}) answer agent.run(query) print(f\n Agent 回答 \n{answer}\n) else: # 交互模式 print(\nAgentic RAG 系统已启动。输入您的问题输入 quit 或 exit 退出:) while True: try: user_input input(\n ) if user_input.lower() in [quit, exit, q]: print(再见) break if not user_input.strip(): continue answer agent.run(user_input) print(f\n{answer}) except KeyboardInterrupt: print(\n\n程序被中断。) break except Exception as e: print(f\n系统错误: {e}) if __name__ __main__: main()4.3 运行与验证首先确保你的.env文件已正确配置API密钥。然后在终端运行python main.py系统会先初始化向量数据库如果首次运行然后启动Agent。让我们测试几个复杂查询。测试1结合内部知识和简单计算的查询 DataShield Pro企业版如果数据量是50TB根据定价模型每月大概需要多少钱请先检索内部知识再进行估算。预期Agent行为思考问题涉及内部产品定价需要使用Internal_Knowledge_Search工具。行动调用RAG工具输入“DataShield Pro 定价模型”。观察工具返回知识库中关于定价的描述“企业版根据数据量定制报价”。思考信息不够具体需要估算。可能需要计算但计算器需要具体公式。知识库没有公式。可能需要网络搜索或基于常识估算。由于问题要求先检索内部知识且内部知识已获取Agent可能会决定直接基于“定制报价”这一信息进行推理并说明需要联系销售获取精确报价。最终答案“根据内部知识库DataShield Pro企业版的定价是根据数据量定制的因此没有公开的每TB单价。对于50TB的数据量您需要联系我们的销售团队获取具体报价。基础版起价为每月$500。”测试2复杂的市场调研任务核心场景 请调研一下当前市面上与我们“DataShield Pro”形成竞争的主要云备份服务例如AWS Backup, Azure Backup在“跨区域复制”和“加密”方面的最新功能并简要对比。预期Agent行为多轮工具调用思考这是一个复杂的调研任务需要外部最新信息。首先使用Web_Search。行动调用Web_Search工具输入“AWS Backup 跨区域复制 加密 最新功能 2024”。观察获取到关于AWS Backup的CRR跨区域复制功能、支持的加密类型KMS等信息。思考还需要Azure的信息。再次使用Web_Search。行动调用Web_Search工具输入“Azure Backup 跨区域复制 GRS 加密 最新”。观察获取到Azure Backup的GRS异地冗余存储、加密等信息。思考还需要检索我们自家产品的详细信息以进行对比。使用Internal_Knowledge_Search。行动调用RAG工具输入“DataShield Pro 跨区域复制 加密”。观察获取到自家产品的功能描述。思考信息已收集齐全可以生成对比摘要。最终答案生成一个结构化的对比表格或列表包含三款产品在“跨区域复制”和“加密”方面的关键特性并注明信息来源如“根据网络搜索AWS Backup...”“根据内部知识库DataShield Pro...”。通过verboseTrue你可以在终端看到Agent完整的“思考-行动-观察”链这对于调试和理解Agent的决策过程至关重要。5. 工程化进阶打造生产级可信AI Agent一个能在生产环境可靠运行的Agentic RAG系统远不止上述基础功能。它需要具备可观测性、稳定性、安全性和可维护性。5.1 记忆Memory与多轮对话当前的Agent是“无状态”的每次对话都是独立的。生产环境需要记忆来支持连贯的多轮对话。# core/memory/conversation_buffer.py from langchain.memory import ConversationBufferMemory from langchain.schema import BaseMessage, HumanMessage, AIMessage from typing import List, Dict, Any class EnhancedConversationMemory: def __init__(self): # 使用LangChain的BufferMemory存储对话历史 self.memory ConversationBufferMemory( memory_keychat_history, return_messagesTrue, output_keyoutput ) # 可额外存储工具调用历史 self.tool_history [] def save_context(self, input_str: str, output_str: str): 保存一轮对话的上下文 self.memory.save_context({input: input_str}, {output: output_str}) def add_tool_call(self, tool_name: str, tool_input: str, tool_output: str): 记录工具调用历史用于审计和调试 self.tool_history.append({ tool: tool_name, input: tool_input, output: tool_output[:500] # 截断长输出 }) def load_memory_variables(self) - Dict[str, Any]: 加载记忆变量供Agent提示词使用 return self.memory.load_memory_variables({}) def get_tool_history(self, last_n: int 5): 获取最近N次工具调用历史 return self.tool_history[-last_n:] # 在Agent构建中集成记忆 # 修改 core/agents/rag_agent.py 中的 __init__ 部分 # 1. 初始化记忆 self.memory EnhancedConversationMemory() # 2. 修改提示词模板加入 {chat_history} 占位符 # 3. 在创建AgentExecutor时传入memory参数 self.agent_executor AgentExecutor( agentself.agent, toolsself.tools, verboseTrue, memoryself.memory.memory, # 传入LangChain memory对象 max_iterations10, handle_parsing_errorsTrue )5.2 工具调用验证与安全边界工具调用是主要的风险点。必须对输入输出进行验证和过滤。输入验证在工具函数内部对传入的参数进行严格的类型、格式和内容检查。例如搜索工具应过滤掉明显的恶意或无关参数。输出过滤对工具返回的结果进行清洗移除HTML标签、恶意脚本、过长的内容等。权限控制为不同工具设置权限等级。例如计算器工具对所有用户开放而“发送邮件”或“数据库写入”工具可能需要额外的用户身份验证和授权检查。速率限制对调用外部API的工具如Web Search实施速率限制防止滥用和产生过高费用。# core/tools/safe_web_search.py (示例增强) import re from langchain.tools import Tool from some_secure_search_client import SecureSearchClient # 假设的安全客户端 def safe_web_search(query: str, user_id: str default) - str: 安全的网络搜索工具。 # 1. 输入清洗 query_cleaned re.sub(r[\\], , query.strip())[:200] # 移除危险字符限制长度 # 2. 权限检查示例 allowed_domains [techcrunch.com, docs.aws.amazon.com] # 可以在这里添加逻辑根据user_id判断是否允许搜索或只能搜索特定域名 # 3. 调用安全的搜索客户端实现速率限制、错误重试 client SecureSearchClient(api_keysettings.search_api_key, rate_limit10) # 每分钟10次 try: results client.search(query_cleaned, max_results5, allowed_domainsallowed_domains) except RateLimitError: return 错误搜索速率超限请稍后再试。 # 4. 输出过滤和格式化 safe_results [] for r in results: # 过滤掉可疑内容 if not contains_malicious_content(r.snippet): safe_results.append(f- {r.title}: {r.snippet[:150]}... ({r.url})) return 搜索到以下信息\n \n.join(safe_results) if safe_results else 未找到相关安全结果。5.3 可观测性与日志记录生产系统必须记录详细的日志包括用户查询、Agent思考过程、工具调用详情、LLM请求/响应、最终输出以及系统错误。# core/logging/agent_logger.py import json import logging from datetime import datetime from typing import Dict, Any class AgentLogger: def __init__(self, log_fileagent_operations.log): logging.basicConfig( levellogging.INFO, format%(asctime)s - %(name)s - %(levelname)s - %(message)s, handlers[ logging.FileHandler(log_file), logging.StreamHandler() ] ) self.logger logging.getLogger(AgenticRAG) def log_interaction(self, session_id: str, query: str, agent_thoughts: list, final_answer: str, tools_used: list): 记录一次完整的交互 log_entry { timestamp: datetime.utcnow().isoformat(), session_id: session_id, user_query: query, agent_reasoning: agent_thoughts, # 记录思考链 tools_invoked: tools_used, final_response: final_answer, response_length: len(final_answer) } self.logger.info(json.dumps(log_entry, ensure_asciiFalse)) def log_tool_call(self, tool_name: str, input: str, output: str, duration: float): 记录单次工具调用 self.logger.debug(fTool Call - {tool_name}: Input{input[:100]}..., Duration{duration:.2f}s) def log_error(self, error_msg: str, context: Dict[str, Any]): 记录错误 self.logger.error(fError: {error_msg}. Context: {context}) # 在Agent执行器中集成日志 # 在调用工具前后、生成最终答案后调用对应的日志方法。5.4 性能优化与缓存向量检索缓存对频繁查询的相似问题进行向量相似度结果的缓存避免重复计算。LLM响应缓存对于相同或高度相似的输入可以缓存LLM的响应显著降低成本和延迟。可以使用langchain.cache配合SQLiteCache或RedisCache。异步调用如果工具之间没有强依赖可以考虑使用异步IO来并行执行减少总体响应时间。# 示例使用LangChain的SQLite缓存 from langchain.globals import set_llm_cache from langchain.cache import SQLiteCache set_llm_cache(SQLiteCache(database_path.langchain.db))5.5 评估与持续改进建立评估体系至关重要。人工评估定期对Agent的输出进行人工评分相关性、准确性、有用性。自动化评估设计一套测试用例QA对定期运行监控准确率等指标的变化。A/B测试对比不同提示词、不同工具组合或不同LLM模型的效果。反馈循环提供用户反馈机制如“有帮助/无帮助”按钮将反馈数据用于微调RAG检索策略或Agent提示词。6. 常见问题与排查思路在开发和部署Agentic RAG系统时你会遇到一些典型问题。问题现象常见原因解决思路Agent陷入循环不断调用同一个工具1. 工具返回的信息无法满足Agent的“思考”。2. 提示词中未明确停止条件。3. LLM对任务理解有偏差。1. 检查工具返回的内容是否清晰、相关。2. 在提示词中强化“当你认为信息足够时请给出最终答案”。3. 设置max_iterations最大迭代次数。4. 在AgentExecutor中启用early_stopping_methodgenerate。工具调用失败或超时1. 外部API不可用或密钥错误。2. 网络问题。3. 工具函数内部异常。1. 检查API密钥和配额。2. 在工具函数中添加完善的错误处理try-except和重试机制。3. 设置合理的超时时间。4. 记录详细的错误日志。RAG检索结果不相关1. 文档切分不合理chunk size/overlap。2. 嵌入模型不适合领域。3. 查询表述不清晰。1. 调整文本分割器的参数chunk_size,chunk_overlap,separators。2. 尝试不同的嵌入模型如text-embedding-3-large。3. 实现“查询重写”或“查询扩展”让Agent先优化问题再检索。LLM生成的内容不符合格式要求1. 提示词指令不够清晰。2. LLM的temperature参数过高。1. 在提示词中使用更明确的指令和格式示例Few-shot。2. 将temperature调低如设为0。3. 使用LangChain的OutputParser来强制解析特定格式。系统响应速度慢1. LLM API调用延迟高。2. 向量检索未优化。3. 串行执行多个耗时工具。1. 考虑使用更快的LLM或模型版本如gpt-4o-mini比gpt-4快。2. 对向量数据库建立索引或使用更快的向量库如Qdrant。3. 评估是否可将部分工具调用改为异步。安全风险Agent执行了危险操作1. 工具权限控制缺失。2. 用户输入未经过滤直接传递给工具或LLM。1. 为每个工具实现基于用户/角色的权限检查。2. 对所有用户输入进行严格的清洗和验证。3. 在Agent层面设置“工具允许列表”限制Agent只能使用安全的工具。7. 最佳实践与工程建议提示词工程是核心Agent的“思考”质量极大程度上取决于提示词。持续迭代你的提示词使其指令更清晰格式更明确并包含好的示例Few-shot。将提示词模板化、版本化便于管理和A/B测试。工具设计要“小而专”每个工具应只做一件事并做好。工具的描述description要极其准确这是LLM选择工具的主要依据。避免设计功能模糊的“万能”工具。实施严格的输入/输出I/O验证这是生产级系统的生命线。对所有流入流出系统的数据用户输入、工具参数、工具结果、LLM输出进行验证、清洗和标准化。建立全面的监控告警监控关键指标API调用次数与成本、工具调用成功率与延迟、Agent循环次数、用户反馈评分。设置告警阈值如错误率5%平均响应时间10秒。设计优雅的降级策略当某个工具如搜索引擎失效时系统应能降级例如仅使用RAG知识库回答并告知用户信息可能不是最新的而不是完全崩溃。版本化与回滚对Agent的配置提示词、工具集、LLM模型版本进行版本控制。当新版本上线导致效果下降时能快速回滚到稳定版本。从简单开始逐步复杂化不要一开始就构建一个拥有20个工具的超级Agent。从一个明确的用户场景和2-3个核心工具如RAG Search开始验证流程跑通再逐步增加工具和复杂度。构建工程化的Agentic RAG系统是一个迭代过程它融合了软件工程、机器学习和大语言模型应用的最佳实践。从明确场景定义、构建可靠的工具、设计清晰的Agent逻辑到最终部署可观测、可维护的生产系统每一步都需要严谨的思考和设计。希望本文提供的架构和代码示例能为你搭建自己的智能体系统提供一个坚实的起点。记住最强的Agent不是拥有最多工具的Agent而是在特定领域内能稳定、可靠、安全地使用有限工具解决实际问题的Agent。 30款热门AI模型一站整合DeepSeek/GLM/Qwen 随心用限时 5 折。 点击领海量免费额度