30款热门AI模型一站整合DeepSeek/GLM/Qwen 随心用限时 5 折。 点击领海量免费额度大家好我是专注于AI应用落地的技术博主。在探索如何将大语言模型LLM真正融入生产系统的过程中我们常常会遇到一个核心矛盾模型的知识是静态的而世界是动态的。传统的RAG检索增强生成系统虽然能接入外部知识库但其“检索-生成”的流程相对固定面对复杂、多步骤的查询时往往力不从心。今天我们就来深入探讨如何构建一个工程化、具备Agent智能体能力的RAG系统让它不仅能查询本地文档还能像人类一样思考、规划、调用工具如Google搜索并最终交付一个可信、可观测、可维护的生产级AI应用。本文将从零开始手把手带你搭建一个Agentic RAG系统。我们将覆盖从核心概念、架构设计、代码实现到生产环境部署的全流程。无论你是想了解Agentic RAG前沿动态的开发者还是正面临如何将AI原型转化为稳定服务的工程师这篇文章都将提供一套完整的闭环解决方案。1. 背景与核心概念从RAG到Agentic RAG在深入代码之前我们必须厘清几个关键概念理解为什么需要Agentic RAG。1.1 传统RAG的局限性传统RAG的工作流程可以简化为用户提问 - 将问题向量化 - 从向量数据库中检索最相关的N个文档片段 - 将问题和片段一起交给LLM生成答案。这个流程存在几个明显短板被动检索它只能从预设的、静态的知识库中寻找答案。如果知识库中没有相关信息系统就会“胡说八道”或表示不知道无法主动去外部寻找。缺乏规划对于需要多步推理或分解的复杂问题例如“对比一下LangChain和LlamaIndex的最新版本特性并给出项目选型建议”简单的检索-生成模式难以胜任。上下文僵化检索到的片段直接拼接到提示词中如果片段过多或无关信息干扰会严重影响生成质量。1.2 什么是AI AgentAI Agent智能体是一个能够感知环境、进行决策并执行行动以实现目标的系统。在LLM语境下一个Agent通常由以下几部分组成规划Planning将复杂目标分解为可执行的子任务序列。记忆Memory存储过去的交互、工具调用结果和知识用于后续决策。工具使用Tool Use调用外部API、函数或服务来获取信息或执行操作如计算、搜索、写数据库。行动Action执行规划好的步骤。1.3 Agentic RAG两者的融合Agentic RAG就是将Agent的规划、决策和工具调用能力赋予RAG系统。它不再是被动地检索固定知识库而是像一个“研究助理”理解意图分析用户问题的深层需求。制定计划决定是否需要搜索外部信息、查询内部知识库、进行多轮对话或计算。执行工具按计划调用相应的工具如Google搜索API、内部数据库查询、代码执行器。合成与验证将多个工具返回的结果进行综合、去重、验证最终生成一个准确、全面、可追溯的答案。1.4 为什么强调“工程化”与“可信”构建一个在实验室能跑的Agent原型不难但要将其部署到生产环境面临诸多挑战可靠性工具调用可能失败网络可能超时LLM可能生成错误格式。可观测性我们需要清晰地知道Agent在每一步做了什么决策、调用了什么工具、得到了什么结果以便调试和审计。成本控制每一次工具调用和LLM调用都可能产生费用需要优化流程避免不必要的调用。安全性限制Agent可调用的工具范围防止其执行危险操作或访问敏感数据。接下来我们将围绕这些挑战构建一个生产导向的Agentic RAG系统。2. 环境准备与版本说明我们将使用Python作为开发语言并依托于几个成熟的框架来加速开发。请注意AI领域迭代迅速以下版本是一个稳定的组合你可以根据实际情况调整。操作系统: Ubuntu 20.04/macOS Monterey/Windows 10 (WSL2推荐)Python: 3.10 或 3.11 (强烈推荐兼容性最佳)核心框架与库:langchain0.1.0 用于构建Agent和链的核心框架。注意LangChain版本更新频繁API变化较大本文基于相对稳定的0.1.x版本。langchain-community0.0.10 包含社区维护的各种工具和集成。langchain-openai0.0.5 OpenAI模型的LangChain集成。openai1.6.1 OpenAI官方SDK。chromadb0.4.22 轻量级向量数据库用于存储和检索本地知识。tiktoken0.5.2 用于计算Token管理成本。python-dotenv1.0.0 管理环境变量。httpx0.25.2 用于异步HTTP请求某些工具需要。外部服务API Key:OpenAI API Key: 用于调用GPT-4或GPT-3.5-Turbo作为Agent的“大脑”。Google Custom Search JSON API Key Search Engine ID: 用于实现Google搜索工具。你需要在Google Cloud Console创建项目并启用Custom Search API来获取。项目结构预览:agentic_rag_project/ ├── .env # 存储API密钥等敏感信息 ├── requirements.txt # 项目依赖 ├── app.py # 主应用入口 ├── core/ # 核心模块 │ ├── __init__.py │ ├── agent_builder.py # Agent构建逻辑 │ ├── tools.py # 自定义工具定义 │ └── memory.py # 记忆管理 ├── knowledge_base/ # 本地知识库管理 │ ├── __init__.py │ ├── loader.py # 文档加载 │ ├── splitter.py # 文本分割 │ └── vector_store.py # 向量库初始化与检索 └── utils/ # 工具函数 ├── __init__.py ├── callback.py # 回调函数用于日志和观测 └── safety.py # 安全校验首先创建虚拟环境并安装依赖# 创建并激活虚拟环境 python -m venv venv source venv/bin/activate # Linux/macOS # venv\Scripts\activate # Windows # 安装依赖 pip install langchain0.1.0 langchain-community0.0.10 langchain-openai0.0.5 openai1.6.1 pip install chromadb0.4.22 tiktoken0.5.2 python-dotenv1.0.0 httpx0.25.2创建.env文件填入你的密钥# .env OPENAI_API_KEYsk-your-openai-key-here GOOGLE_API_KEYyour-google-custom-search-api-key GOOGLE_CSE_IDyour-search-engine-id3. 核心组件拆解工具、记忆与规划Agentic RAG系统的核心是让LLM学会使用工具。我们首先来定义几个关键工具。3.1 构建工具Tools工具是Agent与外界交互的接口。每个工具都是一个函数具有清晰的描述供LLM理解其用途。# core/tools.py import os from typing import Type, Optional from datetime import datetime from langchain.tools import BaseTool, Tool from langchain_community.utilities import GoogleSearchAPIWrapper from pydantic import BaseModel, Field import httpx class GoogleSearchInput(BaseModel): Google搜索工具的输入模型。 query: str Field(description用于搜索的查询字符串) class GoogleSearchTool(BaseTool): name: str google_search description: str ( 一个用于搜索互联网最新信息的工具。 当问题涉及实时事件、新闻、最新技术动态或不在本地知识库中的公开信息时使用此工具。 输入应为明确的搜索查询词。 ) args_schema: Type[BaseModel] GoogleSearchInput search_wrapper: GoogleSearchAPIWrapper None def __init__(self): super().__init__() # 初始化Google搜索包装器 self.search_wrapper GoogleSearchAPIWrapper( google_api_keyos.getenv(GOOGLE_API_KEY), google_cse_idos.getenv(GOOGLE_CSE_ID), k5 # 返回5条结果 ) def _run(self, query: str) - str: 执行同步搜索。 try: results self.search_wrapper.run(query) # 对结果进行精简和格式化 return f【Google搜索】关于 {query} 的结果\n{results[:1500]} # 限制长度 except Exception as e: return f搜索执行失败{str(e)} async def _arun(self, query: str) - str: 异步搜索可选。 return self._run(query) class KnowledgeBaseSearchInput(BaseModel): 知识库检索工具的输入模型。 question: str Field(description需要从内部知识库中查找答案的问题) def get_knowledge_base_tool(vector_store): 创建知识库检索工具。 from langchain.chains import RetrievalQA from langchain_openai import ChatOpenAI llm ChatOpenAI(modelgpt-3.5-turbo, temperature0) qa_chain RetrievalQA.from_chain_type( llmllm, chain_typestuff, retrievervector_store.as_retriever(search_kwargs{k: 3}), return_source_documentsTrue ) def search_knowledge_base(question: str) - str: 查询内部知识库。适用于公司文档、产品手册、历史对话等内部信息。 result qa_chain.invoke({query: question}) answer result.get(result, 未找到答案。) sources result.get(source_documents, []) source_info \n.join([f- {doc.metadata.get(source, 未知)} for doc in sources[:2]]) return f【内部知识库】答案{answer}\n来源{source_info} return Tool( nameknowledge_base_search, funcsearch_knowledge_base, description用于查询内部私有知识库的工具。当你需要获取公司内部文档、产品规格、流程指南等非公开信息时使用此工具。 ) class CalculatorInput(BaseModel): 计算器工具的输入模型。 expression: str Field(description一个有效的数学表达式例如 3 5 * 2) class CalculatorTool(BaseTool): name: str calculator description: str 用于计算数学表达式。仅支持基本算术 - * / **和括号。 args_schema: Type[BaseModel] CalculatorInput def _run(self, expression: str) - str: 计算表达式。警告使用eval有安全风险生产环境需替换为安全库如ast.literal_eval或自定义解析器。 try: # 生产环境切勿直接使用eval此处仅为演示 # 应使用安全计算库如 numexpr 或严格限制的解析器 allowed_chars set(0123456789-*/.() ) if not all(c in allowed_chars for c in expression): return 错误表达式包含非法字符。 result eval(expression) return f计算结果{expression} {result} except Exception as e: return f计算失败{str(e)}关键点解析输入模式args_schema使用Pydantic模型定义工具输入这能帮助LLM更准确地生成调用参数。描述description必须清晰、具体。LLM根据描述决定是否以及如何使用该工具。好的描述应包含使用场景和输入格式。错误处理工具内部必须包含try-except返回友好的错误信息避免整个Agent因单个工具失败而崩溃。安全警告CalculatorTool中的eval是极不安全的仅用于演示。真实生产环境必须使用安全的数学表达式解析库如numexpr、ast.literal_eval配合严格检查。3.2 设计记忆Memory记忆让Agent拥有上下文感知能力。我们使用ConversationBufferWindowMemory来保存最近几轮对话。# core/memory.py from langchain.memory import ConversationBufferWindowMemory from langchain.schema import BaseMessage from typing import List class ManagedMemory: def __init__(self, k5): 初始化记忆管理器。 Args: k: 保留最近k轮对话。 self.memory ConversationBufferWindowMemory( memory_keychat_history, return_messagesTrue, kk ) # 可扩展在此添加长期记忆如向量存储的接口 def save_context(self, user_input: str, agent_output: str): 保存一轮对话的上下文。 self.memory.save_context({input: user_input}, {output: agent_output}) def load_memory_variables(self, inputs: dict) - dict: 加载记忆变量通常用于构建提示词。 return self.memory.load_memory_variables(inputs) def clear(self): 清空记忆。 self.memory.clear()3.3 规划与执行构建Agent ExecutorLangChain提供了多种Agent类型。我们选择OPENAI_FUNCTIONSAgent因为它与OpenAI的Function Calling特性结合紧密能可靠地解析工具调用。# core/agent_builder.py import os from langchain.agents import AgentExecutor, create_openai_functions_agent from langchain_openai import ChatOpenAI from langchain.prompts import ChatPromptTemplate, MessagesPlaceholder from core.tools import GoogleSearchTool, get_knowledge_base_tool, CalculatorTool from core.memory import ManagedMemory def build_agent_executor(vector_storeNone): 构建并返回一个配置好的Agent执行器。 Args: vector_store: 初始化好的向量数据库检索器用于知识库工具。 Returns: AgentExecutor实例。 # 1. 初始化LLM llm ChatOpenAI( modelgpt-4-1106-preview, # 或使用 gpt-3.5-turbo-1106GPT-4规划能力更强 temperature0, # 降低随机性使工具调用更稳定 streamingFalse, # 如需流式输出可设为True并配置回调 api_keyos.getenv(OPENAI_API_KEY) ) # 2. 准备工具列表 tools [] # 添加Google搜索工具 tools.append(GoogleSearchTool()) # 添加计算器工具 tools.append(CalculatorTool()) # 如果提供了向量库添加知识库检索工具 if vector_store: tools.append(get_knowledge_base_tool(vector_store)) # 3. 构建提示词模板 # 系统消息定义了Agent的角色和行为准则 system_message 你是一个专业、可靠且高效的AI助手。你的核心能力是使用工具来获取信息并解决问题。 请遵循以下准则 1. **充分规划**在回答前先思考用户问题的本质判断是否需要以及需要哪些工具。 2. **按需调用**优先使用内部知识库如果可用回答内部问题。对于实时、公开或未知信息使用Google搜索。 3. **精确简洁**工具调用时查询词应具体、明确。整合多个工具的结果时需注明来源。 4. **诚实可信**如果工具无法提供答案或信息矛盾如实告知用户不要捏造信息。 5. **安全边界**你只能使用上述提供的工具不能执行任何未授权的操作。 prompt ChatPromptTemplate.from_messages([ (system, system_message), MessagesPlaceholder(variable_namechat_history), # 注入对话历史 (human, {input}), # 用户当前输入 MessagesPlaceholder(variable_nameagent_scratchpad), # Agent思考过程 ]) # 4. 创建Agent agent create_openai_functions_agent(llmllm, toolstools, promptprompt) # 5. 初始化记忆 memory ManagedMemory(k5) # 6. 创建执行器 # verboseTrue 会在控制台输出详细的推理步骤生产环境应设为False # handle_parsing_errorsTrue 能优雅处理LLM输出格式错误 executor AgentExecutor( agentagent, toolstools, memorymemory.memory, # 将LangChain memory对象传入 verboseTrue, handle_parsing_errorsTrue, max_iterations5, # 限制最大迭代次数防止死循环 early_stopping_methodgenerate # 当Agent认为已完成时停止 ) return executor, memory代码解释create_openai_functions_agent: 这是构建Agent的核心函数它创建了一个懂得根据提示词和工具描述来规划并调用OpenAI格式函数的Agent。AgentExecutor: 这是驱动Agent运行的实际引擎。它负责管理Agent的思考循环调用LLM - 解析输出 - 执行工具 - 将结果返回给LLM - 继续直到LLM返回最终答案或达到max_iterations。max_iterations:至关重要的生产环境参数。必须设置上限防止Agent陷入无限循环或因复杂问题消耗过多资源。4. 完整实战案例构建并运行一个多功能Agent现在我们将所有组件串联起来创建一个具备Google搜索、内部知识库查询和计算能力的Agent。4.1 初始化本地知识库首先我们准备一些本地文档例如公司产品手册的TXT文件将其存入向量数据库。# knowledge_base/vector_store.py from langchain_community.document_loaders import TextLoader, DirectoryLoader from langchain.text_splitter import RecursiveCharacterTextSplitter from langchain_openai import OpenAIEmbeddings from langchain_community.vectorstores import Chroma import os def init_vector_store(knowledge_dir: str, persist_directory: str ./chroma_db): 初始化或加载向量数据库。 Args: knowledge_dir: 存放知识文档的目录。 persist_directory: 向量数据库持久化路径。 Returns: Chroma向量存储对象。 embeddings OpenAIEmbeddings(modeltext-embedding-3-small) if os.path.exists(persist_directory) and os.listdir(persist_directory): # 如果已存在持久化数据则直接加载 print(f从 {persist_directory} 加载已有向量库...) vector_store Chroma( persist_directorypersist_directory, embedding_functionembeddings ) else: # 否则从文档创建 print(f从 {knowledge_dir} 创建新的向量库...) # 加载文档 loader DirectoryLoader(knowledge_dir, glob**/*.txt, loader_clsTextLoader) documents loader.load() if not documents: print(警告未加载到任何文档。知识库工具将不可用。) return None # 分割文本 text_splitter RecursiveCharacterTextSplitter( chunk_size500, chunk_overlap50, separators[\n\n, \n, 。, , , ] ) splits text_splitter.split_documents(documents) print(f共加载 {len(documents)} 个文档分割为 {len(splits)} 个片段。) # 创建向量存储并持久化 vector_store Chroma.from_documents( documentssplits, embeddingembeddings, persist_directorypersist_directory ) vector_store.persist() print(f向量库已创建并保存至 {persist_directory}) return vector_store4.2 主应用入口创建一个简单的交互式命令行应用来测试我们的Agent。# app.py import os from dotenv import load_dotenv from core.agent_builder import build_agent_executor from knowledge_base.vector_store import init_vector_store # 加载环境变量 load_dotenv() def main(): print(正在初始化Agentic RAG系统...) # 1. 初始化知识库可选 vector_store None knowledge_dir ./knowledge_docs # 你的文档目录 if os.path.exists(knowledge_dir): vector_store init_vector_store(knowledge_dir) else: print(f知识库目录 {knowledge_dir} 不存在将仅使用搜索和计算工具。) # 2. 构建Agent执行器 agent_executor, memory_manager build_agent_executor(vector_store) print(\n *50) print(Agent已就绪。输入您的问题输入 quit 或 exit 退出) print(*50) # 3. 交互循环 while True: try: user_input input(\n 您: ).strip() if user_input.lower() in [quit, exit, q]: print(再见) break if not user_input: continue # 调用Agent response agent_executor.invoke({input: user_input}) answer response.get(output, 抱歉我没有得到有效回复。) # 保存本轮对话到记忆 memory_manager.save_context(user_input, answer) # 打印最终答案 print(f\n AI: {answer}) except KeyboardInterrupt: print(\n\n程序被中断。) break except Exception as e: print(f\n 系统错误: {str(e)}) # 可以选择记录日志 if __name__ __main__: main()4.3 运行与验证在项目根目录创建knowledge_docs文件夹并放入一些.txt格式的文档例如product_manual.txt。确保.env文件已正确配置。运行程序python app.py测试用例 您: 今天北京的天气怎么样预期行为Agent应识别这是一个实时信息问题调用google_search工具搜索“北京 今天 天气”并返回摘要。 您: 我们公司产品的退货政策是什么预期行为如果product_manual.txt中包含了退货政策Agent应优先调用knowledge_base_search工具从本地知识库中寻找答案。 您: 请计算 (15 7) * 3 / 2 的值然后搜索一下LangChain最新版本的主要更新。预期行为Agent应规划两个子任务。首先调用calculator工具计算表达式然后调用google_search工具搜索“LangChain latest version updates”。最后将两个结果整合成一个连贯的回答。通过观察控制台verboseTrue的输出你可以清晰地看到Agent的思考链Reasoning Chain Entering new AgentExecutor chain... 思考用户问了两个问题一个计算一个搜索。我需要按顺序使用计算器和搜索工具。 行动调用计算器工具。 行动输入{expression: (15 7) * 3 / 2} 观察计算结果(15 7) * 3 / 2 33.0 思考计算完成。现在需要搜索LangChain更新。 行动调用google_search工具。 行动输入{query: LangChain latest version updates 2024} 观察【Google搜索】关于 LangChain latest version updates 2024 的结果... 思考我已获得计算结果和搜索信息可以合成最终答案。 最终答案计算结果为33。关于LangChain最新版本... Finished chain.5. 生产级考量可观测性、安全与成本控制一个原型能跑起来只是第一步。要将其投入生产必须解决可靠性、可观测性和成本问题。5.1 实现可观测性Observability我们需要记录Agent的每一步决策和工具调用结果用于监控、调试和审计。# utils/callback.py from langchain.callbacks.base import BaseCallbackHandler from typing import Any, Dict, List import json import logging from datetime import datetime class AgentMonitorCallback(BaseCallbackHandler): 自定义回调处理器用于记录Agent执行详情。 def __init__(self): self.logger logging.getLogger(agent_monitor) handler logging.FileHandler(agent_execution.log, encodingutf-8) formatter logging.Formatter(%(asctime)s - %(levelname)s - %(message)s) handler.setFormatter(formatter) self.logger.addHandler(handler) self.logger.setLevel(logging.INFO) def on_agent_action(self, action, **kwargs): 当Agent决定调用一个工具时触发。 tool_name action.tool tool_input json.dumps(action.tool_input, ensure_asciiFalse) log_msg fAGENT_ACTION - 调用工具: {tool_name}, 输入: {tool_input} self.logger.info(log_msg) print(f[监控] {log_msg}) # 也可输出到控制台 def on_tool_end(self, output: str, **kwargs): 当工具执行结束时触发。 # 注意输出可能很长生产环境可能需要截断或采样 output_preview (output[:200] ...) if len(output) 200 else output log_msg fTOOL_END - 工具输出预览: {output_preview} self.logger.info(log_msg) def on_agent_finish(self, finish, **kwargs): 当Agent完成一轮推理时触发。 final_output finish.return_values.get(output, ) log_msg fAGENT_FINISH - 最终输出长度: {len(final_output)} 字符 self.logger.info(log_msg) # 可以记录更详细的结果到结构化存储如数据库 # 在构建执行器时注入回调 def build_agent_executor(vector_storeNone): # ... 前面的代码 ... callbacks [AgentMonitorCallback()] # 可以添加多个回调 executor AgentExecutor( agentagent, toolstools, memorymemory.memory, verboseFalse, # 生产环境关闭verbose用自定义回调记录 callbackscallbacks, # 注入回调 handle_parsing_errorsTrue, max_iterations5, ) return executor, memory5.2 增强安全性工具权限控制为不同用户或场景的Agent配置不同的工具集。例如客服Agent可能不需要计算器。输入输出过滤对用户输入和工具输出进行内容安全过滤防止注入攻击或不当内容。沙箱环境对于执行代码或访问敏感系统的工具必须在严格的沙箱环境中运行。替换不安全的eval如前所述使用numexpr等安全库。# utils/safety.py import re def sanitize_input(user_input: str) - tuple[bool, str]: 简单的输入清洗与安全检查。 Returns: (是否安全, 清洗后的输入或错误信息) # 1. 长度限制 if len(user_input) 2000: return False, 输入过长请精简您的问题。 # 2. 简单关键词过滤示例 dangerous_patterns [rsudo, rrm -rf, rdrop database, rscript] # 根据需求扩展 for pattern in dangerous_patterns: if re.search(pattern, user_input, re.IGNORECASE): return False, 输入包含潜在危险指令。 # 3. 去除首尾空白 sanitized user_input.strip() if not sanitized: return False, 输入不能为空。 return True, sanitized5.3 成本控制与优化设置预算与熔断为API调用设置月度或单次会话预算超出后自动降级或拒绝服务。缓存策略对频繁查询的、结果不变的工具调用如某些知识库查询、特定计算进行缓存。优化提示词精简系统提示词和上下文减少不必要的Token消耗。选择合适模型对于简单工具调用使用gpt-3.5-turbo对于复杂规划使用gpt-4。可以通过一个路由逻辑动态选择。限制迭代次数max_iterations是控制单次调用成本的最有效手段。6. 常见问题与排查思路在开发和部署Agentic RAG系统时你可能会遇到以下典型问题问题现象可能原因排查步骤与解决方案Agent陷入循环不断调用同一个工具1. 工具返回的结果无法满足Agent的停止条件。2. 提示词中未明确停止指令。3. LLM对任务理解有误。1. 检查工具输出格式是否清晰。可让工具在无法找到答案时明确返回“未找到相关信息”。2. 在系统提示词中强调“当你认为已获得足够信息回答用户问题时请直接给出最终答案”。3. 降低temperature或设置更小的max_iterations如3。工具调用参数格式错误1. 工具的描述(description)或args_schema不够清晰。2. LLM版本不支持或Function Calling不稳定。1. 精炼工具描述明确输入格式和示例。使用Pydantic模型严格定义输入字段。2. 确保使用最新的OpenAI模型如gpt-4-turbo-preview它们具有更好的函数调用能力。3. 启用handle_parsing_errorsTrue让执行器能尝试修复错误。Google搜索返回“搜索执行失败”1. API密钥或搜索引擎ID错误/失效。2. 配额用尽。3. 网络问题。1. 检查.env文件中的GOOGLE_API_KEY和GOOGLE_CSE_ID是否正确。2. 登录Google Cloud Console检查Custom Search API是否启用以及配额使用情况。3. 添加更详细的错误日志捕获具体异常信息。知识库检索结果不相关1. 文本分割策略不合理块太大或太小。2. 嵌入模型不匹配或效果不佳。3. 检索的top_k值不合适。1. 调整RecursiveCharacterTextSplitter的chunk_size和chunk_overlap参数尝试不同的分割符。2. 考虑使用更先进的嵌入模型如OpenAI的text-embedding-3-large或开源模型需本地部署。3. 调整检索器的search_kwargs{k: n}尝试不同的n值。可以引入重排序Re-ranking技术提升精度。响应速度慢1. 工具调用尤其是网络搜索耗时。2. LLM生成速度慢。3. 上下文过长。1. 为网络工具设置超时如timeout10.0。2. 考虑使用更快的LLM如gpt-3.5-turbo-instruct或对响应速度要求不高的任务进行异步处理。3. 优化记忆管理只保留最近的关键对话或使用摘要式记忆。Agent拒绝使用工具直接回答问题1. 系统提示词未强调工具使用的重要性。2. 问题过于简单LLM认为自身知识足以回答。3. 工具描述不够有吸引力。1. 在系统提示词中明确指令例如“**你必须优先考虑使用提供的工具来获取准确信息。**仅在工具无法提供信息时才基于你的内部知识回答并需说明这一点。”2. 这是预期行为之一。对于简单事实问题Agent直接回答效率更高。7. 最佳实践与工程建议提示词工程是核心Agent的表现极大程度上依赖于系统提示词。迭代优化你的提示词使其清晰、具体并包含角色定义、行为约束和输出格式要求。可以将提示词模板化便于A/B测试和管理。工具设计原则单一职责每个工具只做一件事并做好。健壮性工具必须包含全面的错误处理返回结构化的结果成功/失败数据/错误信息。可观测性为工具调用添加唯一的请求ID便于全链路追踪。实施分层记忆系统短期记忆ConversationBufferWindowMemory用于维持对话流畅性。长期记忆将重要的用户信息、对话摘要或事实存入向量数据库供未来检索。外部记忆与用户数据库、CRM等系统连接实现个性化服务。建立评估体系定义一组测试用例单元测试和集成测试定期运行以评估Agent的准确性、可靠性和成本。监控关键指标平均响应时间、工具调用成功率、LLM Token消耗、用户满意度。渐进式部署先从封闭领域、低风险的场景开始如内部知识问答。引入人工审核环节对Agent的决策进行复核。逐步开放更复杂的工具和场景并密切监控。版本化与回滚对Agent的配置提示词、工具列表、模型版本、参数进行版本控制。当新版本出现问题时能快速回滚到稳定版本。构建工程化的Agentic RAG系统是一个持续迭代的过程。从简单的工具调用开始逐步引入更复杂的规划逻辑如ReAct模式、子Agent协作、以及从失败中学习的机制。 30款热门AI模型一站整合DeepSeek/GLM/Qwen 随心用限时 5 折。 点击领海量免费额度