从零构建AI Agent:基于LangChain与本地大模型的自主任务执行实战

发布时间:2026/7/25 23:59:25
从零构建AI Agent:基于LangChain与本地大模型的自主任务执行实战 大家好我是专注于AI应用开发的技术博主。在探索大语言模型LLM应用的过程中你是否遇到过这样的困境模型虽然能生成流畅的文本但无法真正“做事”比如你无法让它帮你查询实时天气、分析股票数据或者自动整理一份项目报告。这正是传统生成式AI的局限——它擅长“说”但不擅长“做”。而Agentic AI和AI Agent的出现正是为了解决“让AI自主行动”这一核心问题。本文将带你从零开始彻底理解Agentic AI的核心概念并通过一个完整的实战案例手把手教你构建一个能调用外部工具、自主完成任务的AI Agent。无论你是想入门AI应用开发还是希望将现有系统智能化升级这篇文章都将为你提供清晰的路径和可运行的代码。1. Agentic AI 与 AI Agent 核心概念解析在深入代码之前我们必须先厘清几个关键概念这是理解后续所有内容的基础。1.1 什么是 Agentic AIAgentic AI指的是一种能够在有限监督下自主完成特定目标的人工智能系统。它的核心是自主性和目标驱动。你可以把它想象成一个拥有“代理权”的智能体它不仅能理解你的意图还能主动规划、决策并执行一系列动作来达成目标。与传统的、被动的AI模型如一个简单的文本分类器或图像生成器不同Agentic AI系统具备以下特征自主行动无需人类对每一步进行干预能够独立完成任务。目标导向围绕一个明确的最终目标Goal展开工作而非仅仅响应单次请求。环境交互能够感知环境通过API、数据库、传感器等并根据感知结果采取行动调用工具、修改状态。持续学习与适应能从执行结果中获取反馈优化未来的决策和行动策略。简单来说生成式AI如ChatGPT告诉你“怎么做”而Agentic AI 则能帮你“动手做”。例如前者可以生成一份旅行计划后者则能根据这份计划自动查询机票、预订酒店、并将日程同步到你的日历。1.2 什么是 AI AgentAI Agent是构成 Agentic AI 系统的基本单元。一个AI Agent是一个软件实体它通过感知环境、进行推理、制定计划、做出决策并执行动作来追求一个或多个目标。我们可以用一个经典的智能体模型来理解其核心组件这个模型通常包括感知PerceptionAgent从环境中获取信息。这可以是通过用户输入、API返回的数据、数据库查询结果或传感器信号。推理与规划Reasoning PlanningAgent处理感知到的信息理解当前状态并规划出一系列能达到目标的动作序列。决策Decision-Making在多个可能的动作中选择最优的一个。执行Execution调用工具Tools或输出内容对环境产生影响。工具可以是搜索引擎、代码执行器、API客户端等。记忆Memory存储之前的交互历史、知识或状态为未来的决策提供上下文。1.3 Agentic AI 与 生成式AI 的区别这是最容易混淆的一点。我们可以通过一个表格来清晰对比特性生成式AI (如 ChatGPT, Midjourney)Agentic AI / AI Agent核心能力生成内容文本、代码、图像。执行任务达成目标。工作模式单次请求-响应被动式。多步骤、主动式、循环迭代。与环境交互通常不具备直接交互能力输出仅限于生成的内容。核心能力可以调用工具、查询数据、操作系统。输出形式一段文本、一张图片等。动作及其结果如“已调用天气API当前北京气温25度”“已创建文件report.md”。示例问“写一首关于春天的诗。” 答生成一首诗。问“帮我分析上个月的销售数据并总结成一份报告。” 答Agent自动查询数据库、分析数据、调用文本生成模型、最后将报告保存为文件。关键联系当今绝大多数实用的AI Agent都以大语言模型LLM作为其“大脑”或“推理引擎”。LLM提供了强大的语言理解、逻辑推理和规划能力而Agent框架则为其赋予了“手”和“脚”工具调用能力以及“记忆”。1.4 为什么需要学习 Agent 开发对于开发者而言掌握Agent开发意味着能够构建真正的智能应用超越聊天机器人创建能自动化复杂工作流的智能助手。极大提升效率将重复、多步骤的数字化任务交给Agent处理。解锁LLM的全部潜力让LLM从“顾问”升级为“执行者”。紧跟技术趋势Agentic AI是当前AI应用层最活跃和最有前景的方向之一。接下来我们将进入实战环节从环境搭建开始一步步构建你的第一个AI Agent。2. 环境准备与核心工具链为了快速上手并聚焦于Agent的核心逻辑我们将使用目前最流行、生态最丰富的Python Agent框架之一——LangChain和LangGraph。同时为了低成本运行我们将使用本地部署的Ollama来运行开源大模型。2.1 环境与版本说明操作系统Windows 10/11, macOS, 或 Linux (本文示例在 macOS/Linux 环境下演示Windows 用户建议使用 WSL2)。Python版本 3.10。这是许多AI库的硬性要求。包管理工具pip或conda。核心框架langchain-core: LangChain核心库。langchain-community: 社区工具和集成。langgraph: 用于构建有状态、多步骤的Agent工作流。本地大模型服务ollama用于在本地运行开源LLM如llama3.2、qwen2.5等。代码编辑器VS Code, PyCharm 等任选。请注意AI领域迭代极快库版本经常更新。以下命令安装的是写作时的最新稳定版本如果遇到兼容性问题请查阅官方文档。2.2 一步步搭建环境第一步创建并激活Python虚拟环境强烈建议使用虚拟环境来管理依赖避免包冲突。# 创建名为 ai-agent-env 的虚拟环境 python -m venv ai-agent-env # 激活虚拟环境 # 在 macOS/Linux 上 source ai-agent-env/bin/activate # 在 Windows 上 # ai-agent-env\Scripts\activate激活后你的命令行提示符前应该会出现(ai-agent-env)字样。第二步安装 Python 依赖包在激活的虚拟环境中运行以下命令pip install langchain-core langchain-community langgraph # 安装requests用于后续的工具调用示例 pip install requests第三步安装并启动 OllamaOllama 允许你在本地轻松运行各种开源大模型。访问 Ollama 官网根据你的操作系统下载并安装。安装完成后打开终端拉取一个模型。我们选择较小的llama3.2作为示例它对硬件要求较低。ollama pull llama3.2启动Ollama服务通常安装后会自动运行。你可以通过以下命令检查ollama list如果看到llama3.2在列表中说明模型已就绪。至此我们的基础开发环境就准备好了。接下来我们将深入Agent的核心构成部分。3. AI Agent 的核心组件与原理拆解在开始编码前理解LangChain中Agent的抽象模型至关重要。一个典型的Agent由以下几个关键部分构成3.1 大脑LLM大语言模型LLM是Agent的“推理引擎”。它负责理解用户输入、分析当前状态、决定下一步该做什么是直接回答还是调用某个工具。在LangChain中我们通过ChatModel来封装对LLM的调用。# 示例连接本地Ollama服务的LLM from langchain_community.llms import Ollama # 创建一个连接到本地Ollama的LLM实例指定使用 llama3.2 模型 llm Ollama(modelllama3.2) # 测试一下 response llm.invoke(你好请简单介绍一下你自己。) print(response)3.2 手脚Tools工具Tools是Agent与外部世界交互的接口。一个Tool本质上是一个函数它有一个清晰的名称、描述和参数。LLM根据描述来决定是否以及如何调用它。如何定义一个ToolLangChain提供了tool装饰器让定义工具变得非常简单。from langchain_core.tools import tool import requests import json tool def get_weather(city: str) - str: 根据城市名称获取该城市的当前天气信息。 # 注意这里使用了一个模拟的天气API实际使用时需要替换为真实的API如和风天气、OpenWeatherMap # 真实API通常需要注册并获取API Key。 api_url fhttps://wttr.in/{city}?formatj1 try: response requests.get(api_url) data response.json() # 简化处理提取部分信息 current_condition data[current_condition][0] weather_desc current_condition[weatherDesc][0][value] temp_c current_condition[temp_C] humidity current_condition[humidity] return f{city}的天气{weather_desc}温度 {temp_c}°C湿度 {humidity}%。 except Exception as e: return f获取{city}天气失败{str(e)} tool def calculator(expression: str) - str: 计算一个数学表达式的值。支持加减乘除和括号。 # 警告直接使用eval有安全风险仅用于演示。生产环境应使用安全计算库如ast.literal_eval或numexpr。 try: # 极其简化的安全过滤切勿用于生产 if any(keyword in expression for keyword in [import, os, sys, exec, eval]): return 表达式包含不安全字符。 result eval(expression) return f{expression} {result} except Exception as e: return f计算表达式 {expression} 时出错{str(e)}关键点tool装饰器会自动将函数转换为LangChain可识别的Tool对象。函数文档字符串docstring至关重要LLM完全依赖这个描述来理解工具的功能和何时使用它。描述应清晰、准确。工具函数的参数应有类型注解这有助于框架进行验证。3.3 记忆MemoryAgent需要有记忆才能进行连贯的多轮对话或执行多步骤任务。记忆可以分为短期记忆/对话记忆存储当前会话的历史消息。长期记忆存储跨会话的、结构化的知识通常通过向量数据库实现。在简单的单次任务Agent中我们可以先使用ConversationBufferMemory。from langchain.memory import ConversationBufferMemory memory ConversationBufferMemory(memory_keychat_history, return_messagesTrue) # 这个memory对象可以存储和读取对话历史3.4 思维过程ReAct 框架这是让Agent“思考”的关键。ReActReason Act是一个经典的Agent推理框架。其核心思想是让Agent以“思考 - 行动 - 观察”的循环来工作。思考ThoughtLLM分析当前情况决定下一步该做什么。行动Action根据思考选择一个工具并传入参数。观察Observation执行工具得到结果。重复1-3步直到LLM认为可以给出最终答案Final Answer。LangChain 和 LangGraph 内置了对ReAct模式的支持我们无需手动实现这个循环逻辑。理解了这些核心组件后我们就可以开始组装我们的第一个Agent了。4. 实战构建你的第一个AI Agent我们将构建一个具备天气查询和计算器功能的智能助手Agent。它会根据你的问题自动判断是否需要调用工具。4.1 项目结构创建一个新的项目目录例如my_first_agent并在其中创建以下文件my_first_agent/ ├── simple_agent.py # 主程序文件 └── requirements.txt # 依赖列表requirements.txt内容langchain-core langchain-community langgraph requests4.2 编写核心Agent代码打开simple_agent.py开始编写代码。第一步导入依赖并定义工具# simple_agent.py from langchain_community.llms import Ollama from langchain.agents import AgentExecutor, create_react_agent from langchain_core.tools import tool from langchain_core.prompts import PromptTemplate import requests # 1. 定义工具 (与3.2节相同) tool def get_weather(city: str) - str: 根据城市名称获取该城市的当前天气信息。 api_url fhttps://wttr.in/{city}?formatj1 try: response requests.get(api_url, timeout10) data response.json() current_condition data[current_condition][0] weather_desc current_condition[weatherDesc][0][value] temp_c current_condition[temp_C] humidity current_condition[humidity] return f{city}的天气{weather_desc}温度 {temp_c}°C湿度 {humidity}%。 except requests.exceptions.RequestException as e: return f网络请求失败无法获取{city}天气{str(e)} except (KeyError, IndexError, json.JSONDecodeError) as e: return f解析天气数据失败{str(e)} tool def calculator(expression: str) - str: 计算一个数学表达式的值。支持加减乘除(, -, *, /)和括号。例如(3 5) * 2。 # 安全警告此处的eval仅用于演示。生产环境务必替换 allowed_chars set(0123456789-*/(). ) if not all(c in allowed_chars for c in expression): return 表达式包含非法字符仅支持数字、加减乘除和括号。 try: result eval(expression) return f{expression} {result} except ZeroDivisionError: return 错误除数不能为零。 except Exception as e: return f计算失败{str(e)} # 将工具放入列表 tools [get_weather, calculator]第二步初始化LLM并创建Agent# 2. 初始化LLM使用本地Ollama # 确保你的Ollama服务正在运行并且已拉取llama3.2模型 llm Ollama(modelllama3.2, temperature0.1) # temperature控制创造性对于工具调用任务设置较低的值如0.1使输出更确定。 # 3. 创建ReAct Agent # 首先我们需要一个提示词模板来指导Agent的行为。 # LangChain的 create_react_agent 函数需要一个特定的提示词。 # 我们可以使用内置的模板也可以自定义。 from langchain import hub # 从LangChain Hub拉取一个标准的ReAct提示词模板 # 这是一个在线仓库存放了许多有用的提示词。如果网络问题可以手动定义模板。 prompt hub.pull(hwchase17/react) # 如果你无法访问Hub可以使用以下本地模板 prompt_template \\\Answer the following questions as best you can. You have access to the following tools: {tools} Use the following format: Question: the input question you must answer Thought: you should always think about what to do Action: the action to take, should be one of [{tool_names}] Action Input: the input to the action Observation: the result of the action ... (this Thought/Action/Action Input/Observation can repeat N times) Thought: I now know the final answer Final Answer: the final answer to the original input question Begin! Question: {input} Thought:{agent_scratchpad}\\\ prompt PromptTemplate.from_template(prompt_template) # 使用 create_react_agent 函数创建Agent agent create_react_agent(llm, tools, prompt)第三步创建Agent执行器并运行# 4. 创建Agent执行器AgentExecutor # AgentExecutor负责管理Agent的运行循环调用LLM解析输出执行工具将结果返回给LLM直到得到最终答案。 agent_executor AgentExecutor(agentagent, toolstools, verboseTrue, handle_parsing_errorsTrue) # verboseTrue 会打印出详细的思考过程非常适合调试和学习。 # handle_parsing_errorsTrue 让执行器在LLM输出格式错误时尝试修复而不是直接崩溃。 # 5. 运行Agent进行测试 if __name__ __main__: print( 你的第一个AI Agent已启动 ) print(你可以问我天气或数学计算问题。输入 quit 或 exit 退出。) print(- * 40) while True: try: user_input input(\n你的问题: ).strip() if user_input.lower() in [quit, exit, q]: print(再见) break if not user_input: continue print(\n[Agent 正在思考...]) # 调用执行器 result agent_executor.invoke({input: user_input}) print(f\n[最终答案]: {result[output]}) except KeyboardInterrupt: print(\n\n程序被中断。) break except Exception as e: print(f\n程序运行出错: {e})4.3 运行与验证确保Ollama服务在后台运行ollama serve或已作为服务启动。在项目目录下运行你的Agent程序python simple_agent.py尝试提出一些问题观察Agent的思考过程“北京现在的天气怎么样”“计算一下 (15 27) * 3 等于多少”“先告诉我上海天气再计算 100 除以 25。”预期输出示例你的问题: 北京现在的天气怎么样 [Agent 正在思考...] Entering new AgentExecutor chain... Thought: 用户想知道北京的当前天气。我有一个工具可以获取天气信息。 Action: get_weather Action Input: {city: 北京} Observation: 北京的天气Partly cloudy温度 22°C湿度 65%。 Thought: 我已经通过工具获取了北京的天气信息现在可以给出最终答案。 Final Answer: 北京的天气为局部多云气温22摄氏度湿度65%。 Finished chain. [最终答案]: 北京的天气为局部多云气温22摄氏度湿度65%。恭喜你已经成功创建了一个具备基础工具调用能力的AI Agent。verboseTrue输出的Thought/Action/Observation链清晰地展示了ReAct框架的工作过程。5. 进阶使用 LangGraph 构建有状态的智能体上面的AgentExecutor已经很强大了但对于更复杂、需要自定义工作流或状态管理的场景LangGraph是更强大和灵活的选择。它允许你将Agent定义为一张“图”Graph其中节点代表步骤如调用LLM、执行工具边代表步骤之间的流转条件。5.1 为什么需要 LangGraph复杂控制流轻松实现循环、条件分支、并行执行等。显式状态管理所有步骤共享一个状态字典数据流转清晰。更好的可观测性每个节点的输入输出明确便于调试和监控。支持多Agent协作可以构建多个Agent协同工作的系统。5.2 使用 LangGraph 重构天气计算Agent让我们用 LangGraph 重新实现一个功能相同的Agent以理解其核心概念。创建一个新文件graph_agent.py。# graph_agent.py from typing import TypedDict, Annotated, List import operator from langgraph.graph import StateGraph, END from langchain_community.llms import Ollama from langchain_core.messages import HumanMessage, AIMessage, ToolMessage from langchain_core.tools import tool import requests import json # --- 1. 定义状态结构 --- # 使用TypedDict明确状态中包含哪些字段 class AgentState(TypedDict): messages: Annotated[List, operator.add] # 消息列表是累积的 # 可以添加其他状态如 intermediate_steps # --- 2. 定义工具 (复用之前的工具但稍作修改以适配LangGraph) --- tool def get_weather_for_graph(city: str) - str: 根据城市名称获取该城市的当前天气信息。 api_url fhttps://wttr.in/{city}?formatj1 try: response requests.get(api_url, timeout10) data response.json() current_condition data[current_condition][0] weather_desc current_condition[weatherDesc][0][value] temp_c current_condition[temp_C] humidity current_condition[humidity] return f{city}的天气{weather_desc}温度 {temp_c}°C湿度 {humidity}%。 except Exception as e: return f获取{city}天气失败{str(e)} tool def calculator_for_graph(expression: str) - str: 计算一个数学表达式的值。支持加减乘除(, -, *, /)和括号。 allowed_chars set(0123456789-*/(). ) if not all(c in allowed_chars for c in expression): return 表达式包含非法字符。 try: result eval(expression) return f{expression} {result} except Exception as e: return f计算失败{str(e)} tools [get_weather_for_graph, calculator_for_graph] # 将工具列表转换为LangChain可用的格式 from langchain.tools.render import render_text_description tools_str render_text_description(tools) tool_map {tool.name: tool for tool in tools} # --- 3. 初始化LLM并绑定工具 --- llm Ollama(modelllama3.2, temperature0.1) # 为了让LLM知道它可以调用哪些工具我们需要将工具“绑定”到LLM上。 # 这通常通过将工具描述格式化为消息的一部分来实现。 llm_with_tools llm.bind_tools(tools) # --- 4. 定义图中的节点函数 --- def call_model(state: AgentState): 节点调用LLM。 messages state[messages] # 调用绑定了工具的LLM response llm_with_tools.invoke(messages) # 将AI的响应添加到消息历史中 return {messages: [response]} def call_tool(state: AgentState): 节点执行工具调用。 messages state[messages] last_message messages[-1] # 检查最后一条消息是否是包含工具调用的AIMessage if not hasattr(last_message, tool_calls) or not last_message.tool_calls: # 如果没有工具调用直接返回当前状态 return {messages: []} tool_messages [] for tool_call in last_message.tool_calls: tool_name tool_call[name] tool_args tool_call[args] if tool_name in tool_map: # 执行工具 tool_result tool_map[tool_name].invoke(tool_args) # 创建ToolMessage作为工具执行结果 tool_message ToolMessage( contentstr(tool_result), tool_call_idtool_call[id], nametool_name ) tool_messages.append(tool_message) else: # 工具不存在 error_message ToolMessage( contentf错误工具 {tool_name} 未找到。, tool_call_idtool_call[id], nametool_name ) tool_messages.append(error_message) # 将工具执行结果返回添加到状态中 return {messages: tool_messages} # --- 5. 定义路由逻辑边 --- def should_continue(state: AgentState) - str: 根据最后一条消息决定下一步是调用工具还是结束。 messages state[messages] last_message messages[-1] # 如果最后一条消息是AIMessage且包含工具调用则去执行工具 if hasattr(last_message, tool_calls) and last_message.tool_calls: return call_tool # 否则任务完成结束流程 return END # --- 6. 构建图 --- workflow StateGraph(AgentState) # 添加节点 workflow.add_node(agent, call_model) # “agent”节点调用LLM workflow.add_node(action, call_tool) # “action”节点执行工具 # 设置入口点 workflow.set_entry_point(agent) # 添加边路由 workflow.add_conditional_edges( agent, should_continue, # 条件判断函数 { call_tool: action, # 如果should_continue返回call_tool则前往action节点 END: END # 如果返回END则直接结束 } ) # 从“action”节点执行完工具后总是回到“agent”节点进行下一轮思考 workflow.add_edge(action, agent) # 编译图生成可执行对象 app workflow.compile() # --- 7. 运行Graph Agent --- if __name__ __main__: print( LangGraph AI Agent 已启动 ) print(输入 quit 退出。) print(- * 40) while True: try: user_input input(\n你的问题: ).strip() if user_input.lower() in [quit, exit, q]: print(再见) break if not user_input: continue # 初始化状态包含用户消息 initial_state: AgentState { messages: [HumanMessage(contentuser_input)] } print(\n[Agent 工作流开始...]) final_state None # 我们逐步执行图以便观察过程 for step, output in enumerate(app.stream(initial_state, stream_modevalues)): node_name list(output.keys())[0] messages output[node_name][messages] if messages: last_msg messages[-1] print(f\n--- 步骤 {step1} ({node_name}) ---) if isinstance(last_msg, AIMessage): print(f思考/回复: {last_msg.content}) if hasattr(last_msg, tool_calls) and last_msg.tool_calls: for tc in last_msg.tool_calls: print(f 调用工具: {tc[name]}参数: {tc[args]}) elif isinstance(last_msg, ToolMessage): print(f工具结果: {last_msg.content}) # 获取最终状态中的最后一条消息应该是AIMessage final_messages app.invoke(initial_state)[messages] final_answer None for msg in reversed(final_messages): if isinstance(msg, AIMessage) and msg.content: final_answer msg.content break if final_answer: print(f\n[最终答案]: {final_answer}) else: print(\n[未生成最终答案]) except KeyboardInterrupt: print(\n\n程序被中断。) break except Exception as e: print(f\n程序运行出错: {e})运行python graph_agent.py你会看到类似之前的交互效果但底层是通过定义图节点和边来实现的。这为构建更复杂的多Agent工作流如一个Agent负责研究一个Agent负责写作打下了坚实基础。6. 常见问题与排查思路在开发和使用AI Agent时你可能会遇到以下典型问题问题现象可能原因排查与解决思路Agent不调用工具直接回答1. 工具描述不清晰。2. LLM能力不足或未正确绑定工具。3. 提示词Prompt未明确要求使用工具。1.检查工具描述确保tool下的文档字符串清晰描述了工具的功能和输入参数。2.升级LLM尝试更强大的模型如llama3.2比llama2工具调用能力更强。3.优化提示词在提示词中明确指令如“你必须使用可用工具来回答问题。”4.检查绑定确认llm.bind_tools(tools)调用成功。工具调用参数错误LLM未能正确理解用户意图并提取参数。1.细化工具描述在描述中举例说明输入格式如tool def get_weather(city: str) - str: “””获取天气。参数city: 城市名如‘北京’、‘Shanghai’。“””2.使用更结构化的输出考虑使用支持JSON Schema的LLM调用方式强制输出结构化参数。Ollama连接失败1. Ollama服务未启动。2. 模型未下载。3. 网络或端口问题。1. 终端运行ollama serve确保服务运行。2. 运行ollama list确认模型存在或使用ollama pull model-name拉取。3. 检查代码中Ollama()初始化时base_url是否正确默认是http://localhost:11434。Agent陷入循环LLM在“思考”和“调用工具”之间死循环无法给出最终答案。1.设置最大迭代次数在AgentExecutor中设置max_iterations参数如max_iterations5。2.优化提示词在提示词模板中强调“当你拥有足够信息时请给出最终答案”。3.检查工具输出确保工具返回的结果清晰、完整能让LLM理解并做出决策。LangGraph图编译或运行错误1. 状态State定义错误。2. 节点函数返回值格式不对。3. 边Edges配置错误。1.仔细检查TypedDict确保状态字段名与节点函数中使用的键名完全一致。2.打印调试在节点函数开始和结束处打印state观察数据流。3.参考官方示例LangGraph文档提供了大量示例从简单开始模仿。7. 最佳实践与工程化建议将AI Agent从Demo推向生产环境需要考虑更多工程化因素。7.1 工具设计原则单一职责每个工具应只做一件事并做好。避免创建“万能工具”。描述清晰工具的函数名和文档字符串是LLM理解它的唯一途径。务必用自然语言清晰描述功能、输入参数格式和输出示例。健壮性工具函数内部必须有完善的错误处理try-except返回对LLM友好的错误信息而不是抛出异常导致整个Agent崩溃。安全性绝不信任LLM的输入对传入工具的参数进行严格的验证、清洗和类型转换。沙箱环境对于执行代码、访问文件系统或网络请求的工具考虑在沙箱或受限环境中运行。权限最小化工具只应拥有完成其任务所必需的最低权限。7.2 提示词工程系统提示词System Prompt定义Agent的角色、能力和行为边界。例如“你是一个乐于助人的助手可以查询天气和进行数学计算。你必须使用提供的工具来获取信息不要编造答案。”结构化输出要求LLM以特定格式如JSON、XML或特定的关键词输出这能极大提高工具调用的解析成功率。少样本示例Few-Shot在提示词中提供几个“用户提问 - Agent思考并调用工具 - 返回答案”的完整示例能显著提升Agent的表现。7.3 生产环境考量模型选择与成本云端API vs. 本地模型评估延迟、成本、数据隐私需求。对于简单工具调用小型本地模型可能足够对于复杂推理可能需要GPT-4等大型API。降级策略准备后备模型或简化流程以防主要模型服务不可用。可观测性与日志记录完整的Agent执行轨迹Thought, Action, Observation这是调试和优化最重要的依据。监控工具调用的耗时、成功率和错误率。速率限制与重试对LLM API和工具API的调用实施速率限制和指数退避重试机制。超时控制为Agent的整体运行和每个工具调用设置超时避免长时间挂起。测试为Agent创建全面的测试用例覆盖正常流程、边界情况和错误处理。7.4 扩展方向掌握了基础Agent构建后你可以探索更高级的主题记忆Memory集成为Agent添加对话历史记忆或长期知识库如向量数据库实现上下文感知。多Agent系统使用LangGraph创建多个协同工作的Agent例如一个“研究员”Agent搜索资料一个“写作者”Agent整理报告。Agentic RAG让Agent不仅能调用工具还能从你的私有知识库通过检索增强生成RAG中获取信息来回答问题。规划与子任务分解让Agent能够将复杂目标如“策划一场发布会”自动分解为一系列子任务并执行。构建AI Agent是一个迭代过程。从一个小而专的Agent开始清晰定义它的目标和工具然后逐步扩展其能力和可靠性。