最近在尝试将大语言模型LLM应用到实际业务中时发现一个普遍现象模型本身回答问题的能力很强但一旦涉及到需要多步骤推理、调用外部工具或处理复杂任务时就显得力不从心。这背后缺失的关键能力就是Agent智能体。无论是想实现一个能自动分析数据并生成报告的助手还是一个能根据用户需求自主规划并执行代码任务的编程伙伴Agent 都是绕不开的核心技术。本文旨在为你提供一份高强度的、聚焦实战的 Agent 能力训练指南。我们不空谈概念而是通过一系列精心设计的练习让你在约2.5小时内系统性地掌握构建一个“聪明”Agent所需的核心技能。从最基础的思维链提示到复杂的工具调用与记忆管理每个环节都配有可运行的代码示例和清晰的解释。无论你是想入门 AI Agent 开发还是希望提升现有模型的“执行力”这篇文章都能为你提供一条清晰的路径。1. 理解 Agent从“聊天机器人”到“智能执行者”在深入练习之前我们必须先厘清 Agent 究竟是什么。简单来说Agent 是一个能够感知环境、进行决策并执行行动以实现目标的系统。在 LLM 的语境下Agent 通常指一个以大语言模型为“大脑”具备规划、工具使用和记忆等能力的程序。核心区别传统聊天机器人/LLM你问它答。一次交互一个回复。它不知道之前说过什么除非提供上下文也不会主动去做事。AI Agent你给一个目标如“帮我分析上个月的销售数据并总结趋势”它会自己拆解任务规划决定需要调用哪些工具如查询数据库、调用Python绘图执行这些动作并根据结果调整策略最终给你一个完整的结果。它是一个有状态的、主动的、可执行的智能体。一个典型的 Agent 系统包含以下几个核心组件这也是我们后续练习的路线图规划Planning将复杂目标分解为可执行的子任务序列。工具使用Tool Use调用外部函数、API或代码来获取信息或改变环境。记忆Memory存储和检索过往的交互、工具执行结果和知识以保持对话连贯性和学习能力。接下来我们将使用LangChain这个流行的 Agent 开发框架以及 OpenAI 的模型也可用其他兼容API的模型替代来展开我们的练习。请确保你已准备好 Python 环境。2. 环境准备与基础设置工欲善其事必先利其器。首先我们需要搭建一个基础的开发环境。2.1 安装必要库打开你的终端或命令行创建一个新的虚拟环境推荐然后安装以下核心库# 创建并激活虚拟环境 (可选) python -m venv agent_env source agent_env/bin/activate # Linux/Mac # agent_env\Scripts\activate # Windows # 安装核心库 pip install langchain langchain-openai langchain-communitylangchain: Agent 开发的核心框架。langchain-openai: 官方维护的 OpenAI 集成。langchain-community: 包含大量第三方工具和组件。2.2 设置 API 密钥为了调用 OpenAI 的模型你需要一个 API Key。请妥善保管你的密钥不要直接硬编码在代码中。通常通过环境变量来管理# 在终端中设置环境变量 (临时) export OPENAI_API_KEY你的-api-key-here # Linux/Mac # set OPENAI_API_KEY你的-api-key-here # Windows在 Python 代码中我们可以这样初始化一个基础的 LLM# 文件base_setup.py import os from langchain_openai import ChatOpenAI # 从环境变量读取API Key如果没有设置则会报错 llm ChatOpenAI(modelgpt-3.5-turbo, temperature0) # temperature 控制创造性0表示更确定性的输出适合任务执行。 print(LLM 初始化成功) # 可以简单测试一下 response llm.invoke(你好请用一句话介绍你自己。) print(response.content)运行这个脚本如果看到模型回复说明环境配置成功。至此我们的“大脑”就准备好了。3. 核心能力一思维链与规划PlanningAgent 的“聪明”首先体现在其规划能力上。我们通过提示工程Prompt Engineering来激发模型的这种能力。3.1 零样本Zero-Shot与思维链Chain-of-Thought最基本的规划是让模型直接根据指令做出反应。# 文件planning_basic.py from langchain_core.prompts import ChatPromptTemplate from langchain_openai import ChatOpenAI llm ChatOpenAI(modelgpt-3.5-turbo, temperature0) # 零样本提示直接给任务 zero_shot_prompt ChatPromptTemplate.from_messages([ (system, 你是一个有帮助的助手。), (human, 用户的目标是{goal}。请直接给出实现这个目标需要的关键步骤。) ]) goal 组织一次成功的线上技术分享会 chain_zero zero_shot_prompt | llm result_zero chain_zero.invoke({goal: goal}) print(【零样本提示结果】) print(result_zero.content) print(- * 50) # 思维链提示要求模型展示推理过程 cot_prompt ChatPromptTemplate.from_messages([ (system, 你是一个善于分析和规划的助手。请逐步思考。), (human, 用户的目标是{goal}。 请按以下格式回答 思考过程首先我需要理解这个目标涉及哪些方面。然后我会拆解出主要的阶段。最后列出每个阶段的具体任务。 规划步骤 1. ... 2. ... ... ) ]) chain_cot cot_prompt | llm result_cot chain_cot.invoke({goal: goal}) print(【思维链提示结果】) print(result_cot.content)练习要点对比两种提示的结果。思维链提示通常会产生更结构化、更深思熟虑的步骤因为它模拟了人类的推理过程。这是构建 Agent 规划能力的基础。3.2 使用 LangChain 的 Expression Language 构建规划链我们可以将规划过程封装成一个可复用的“链”Chain。# 文件planning_chain.py from langchain_core.prompts import ChatPromptTemplate from langchain_openai import ChatOpenAI from langchain_core.output_parsers import StrOutputParser llm ChatOpenAI(modelgpt-3.5-turbo, temperature0) output_parser StrOutputParser() # 定义规划链 planning_prompt ChatPromptTemplate.from_template( 你是一个项目规划专家。请将以下目标分解为一个有序的任务列表。 每个任务应该是一个清晰、可执行的行动语句。 目标{goal} 请以数字列表的形式输出任务 ) planning_chain planning_prompt | llm | output_parser # 测试不同的目标 goals [ 写一篇关于Python异步编程的博客, 为我的个人网站添加一个黑暗模式切换功能, 分析过去一周的服务器日志找出错误率最高的API端点 ] for g in goals: print(f\n目标{g}) print(分解任务) plan planning_chain.invoke({goal: g}) print(plan) print(- * 40)这个planning_chain现在就是一个可重用的规划模块。在完整的 Agent 中这个模块的输出任务列表将成为后续工具调用的输入。4. 核心能力二工具使用Tool Use规划好了步骤下一步就是执行。Agent 通过“工具”来与外部世界交互。工具本质上是一个函数Agent 可以决定在何时、以何种参数调用它。4.1 创建你的第一个工具让我们创建一个简单的工具例如一个计算器和一个查询天气的模拟工具。# 文件tool_basic.py from langchain.tools import tool from langchain.agents import AgentExecutor, create_openai_tools_agent from langchain_openai import ChatOpenAI from langchain_core.prompts import ChatPromptTemplate import math # 1. 使用 tool 装饰器定义工具 tool def calculate(expression: str) - str: 计算一个数学表达式的值。支持 , -, *, /, **, sqrt() 等。 # 注意直接使用 eval 有安全风险此处仅用于演示。生产环境应使用安全评估库如 ast.literal_eval 或自定义解析器。 try: # 为安全起见我们限制可用的函数和变量 allowed_names {sqrt: math.sqrt, pi: math.pi, e: math.e} result eval(expression, {__builtins__: None}, allowed_names) return f计算结果{expression} {result} except Exception as e: return f计算错误{e} tool def get_weather(city: str) - str: 获取指定城市的当前天气模拟。 # 这里模拟一个API调用 weather_data { 北京: 晴15°C微风, 上海: 多云18°C东南风2级, 深圳: 阵雨22°C南风3级, 纽约: 阴10°C北风4级 } forecast weather_data.get(city, 抱歉未找到该城市的天气信息。) return f{city}的天气{forecast} # 2. 准备工具列表和LLM tools [calculate, get_weather] llm ChatOpenAI(modelgpt-3.5-turbo, temperature0) # 3. 创建Agent提示模板 prompt ChatPromptTemplate.from_messages([ (system, 你是一个拥有工具使用能力的助手。请根据用户问题决定是否需要使用工具以及使用哪个工具。严格遵循工具的参数格式。), (human, {input}), (placeholder, {agent_scratchpad}), # 这是关键用于记录Agent的思考过程 ]) # 4. 创建Agent和Executor agent create_openai_tools_agent(llm, tools, prompt) agent_executor AgentExecutor(agentagent, toolstools, verboseTrue, handle_parsing_errorsTrue) # 5. 运行测试 print( 测试1数学计算 ) result1 agent_executor.invoke({input: 请计算 3 的平方加上 4 的平方再开根号是多少}) print(f最终答案{result1[output]}\n) print( 测试2天气查询 ) result2 agent_executor.invoke({input: 今天北京和上海的天气怎么样}) print(f最终答案{result2[output]}\n) print( 测试3混合任务 ) result3 agent_executor.invoke({input: 如果北京温度是15度上海是18度两地的平均温度是多少先查天气再计算。}) print(f最终答案{result3[output]})关键点解析tool装饰器将普通 Python 函数转换为 LangChain 能识别的工具。文档字符串内的描述至关重要Agent 靠它来理解工具的功能。AgentExecutor驱动 Agent 运行的核心引擎。verboseTrue会打印出详细的思考过程这是学习 Agent 如何决策的绝佳方式。agent_scratchpad这是一个占位符用于在对话中自动插入 Agent 之前的工具调用和观察结果形成连贯的“记忆”。运行上述代码你会看到 Agent 的完整思考链路Thought思考是否需要工具-Action选择工具并传入参数-Observation工具返回结果-Final Answer整合结果并回复。4.2 使用预构建和自定义工具LangChain 社区提供了海量的预构建工具从搜索引擎、维基百科到数据库、代码执行器。# 文件tool_advanced.py from langchain_community.tools import WikipediaQueryRun, DuckDuckGoSearchRun from langchain_community.utilities import WikipediaAPIWrapper, DuckDuckGoSearchAPIWrapper from langchain.agents import AgentExecutor, create_openai_tools_agent from langchain_openai import ChatOpenAI from langchain_core.prompts import ChatPromptTemplate # 1. 使用社区工具 wiki_wrapper WikipediaAPIWrapper(top_k_results2, doc_content_chars_max500) wiki_tool WikipediaQueryRun(api_wrapperwiki_wrapper) search_wrapper DuckDuckGoSearchAPIWrapper() search_tool DuckDuckGoSearchRun(api_wrappersearch_wrapper) # 2. 组合工具 tools [wiki_tool, search_tool] llm ChatOpenAI(modelgpt-3.5-turbo, temperature0) prompt ChatPromptTemplate.from_messages([ (system, 你是一个研究助手。优先使用维基百科工具获取权威信息如果找不到或信息不足再使用网络搜索。), (human, {input}), (placeholder, {agent_scratchpad}), ]) agent create_openai_tools_agent(llm, tools, prompt) executor AgentExecutor(agentagent, toolstools, verboseTrue, handle_parsing_errorsTrue) # 3. 测试信息检索能力 questions [ LangChain 框架的主要作者是谁, 2023年诺贝尔物理学奖的相关新闻, ] for q in questions: print(f\n问题{q}) result executor.invoke({input: q}) print(f答案{result[output][:300]}...) # 截断部分输出这个 Agent 已经具备了初步的研究能力它知道根据问题类型选择不同的工具并按照优先级维基百科优先执行。5. 核心能力三记忆Memory一个没有记忆的 Agent每次对话都是全新的开始。记忆让 Agent 能进行连贯的多轮对话记住用户偏好和历史上下文。5.1 对话缓冲区记忆ConversationBufferMemory这是最简单直接的记忆方式保存所有历史对话。# 文件memory_buffer.py from langchain.memory import ConversationBufferMemory from langchain.agents import AgentExecutor, create_openai_tools_agent from langchain_openai import ChatOpenAI from langchain_core.prompts import ChatPromptTemplate, MessagesPlaceholder from langchain.tools import tool tool def get_name_length(name: str) - str: 计算一个名字的字符长度。 return f名字 {name} 的长度是 {len(name)} 个字符。 tools [get_name_length] llm ChatOpenAI(modelgpt-3.5-turbo, temperature0) # 关键在提示中预留记忆变量的位置并在创建memory时指定key prompt ChatPromptTemplate.from_messages([ (system, 你是一个友好的助手会记住对话中提到的所有事情。), MessagesPlaceholder(variable_namechat_history), # 历史对话将放在这里 (human, {input}), MessagesPlaceholder(variable_nameagent_scratchpad), ]) memory ConversationBufferMemory(memory_keychat_history, return_messagesTrue) agent create_openai_tools_agent(llm, tools, prompt) executor AgentExecutor(agentagent, toolstools, memorymemory, verboseTrue) # 进行多轮对话 conversation [ 你好我的名字是张三。, 我的名字长度是多少, # 它应该记得“张三” 我妹妹叫李小花她也想知道她名字的长度。, 那么我的名字长度和我妹妹的名字长度哪个更长 # 它应该记得两个人名并比较 ] for i, msg in enumerate(conversation): print(f\n[用户第{i1}轮]: {msg}) result executor.invoke({input: msg}) print(f[助手]: {result[output]}) # 查看当前记忆内容 print(\n 当前对话记忆 ) print(memory.buffer)5.2 对话摘要记忆ConversationSummaryMemory当对话很长时缓冲区记忆会消耗大量 Token。摘要记忆则定期将长对话总结成一段精炼的文字节省上下文空间。# 文件memory_summary.py from langchain.memory import ConversationSummaryMemory from langchain_openai import ChatOpenAI from langchain.chains import ConversationChain llm ChatOpenAI(modelgpt-3.5-turbo, temperature0) # 使用 ConversationSummaryMemory memory ConversationSummaryMemory(llmllm, memory_keychat_history, return_messagesTrue) conversation ConversationChain(llmllm, memorymemory, verboseFalse) # 模拟一段较长的、话题相关的对话 long_chat [ 我喜欢编程尤其是Python和JavaScript。, Python 我用来做数据分析和后端开发。, JavaScript 我主要用React框架来做前端。, 对了我还用Python的FastAPI框架写过几个微服务项目。, 你觉得对于初学者是先学Python好还是先学JavaScript好 ] print(进行一段长对话...) for msg in long_chat: print(f\n用户: {msg}) response conversation.predict(inputmsg) print(f助手: {response}) # 查看记忆摘要而不是完整历史 print(\n 记忆摘要 ) print(memory.buffer)你会看到memory.buffer中存储的是一段总结性文字如“用户谈论了他的编程喜好主要使用Python和JavaScript...”而不是每一句原话。这大大提升了长对话的可行性。6. 综合实战构建一个任务规划与执行 Agent现在让我们把规划、工具、记忆三者结合起来构建一个完整的 Agent。这个 Agent 将能够接受一个复杂目标自动规划步骤调用工具执行并在过程中记住关键信息。# 文件full_agent_demo.py from langchain.agents import AgentExecutor, create_openai_tools_agent from langchain_openai import ChatOpenAI from langchain_core.prompts import ChatPromptTemplate, MessagesPlaceholder from langchain.memory import ConversationBufferWindowMemory # 使用窗口记忆只保留最近N轮 from langchain.tools import tool from datetime import datetime import random # ---------- 1. 定义工具 ---------- tool def search_web(query: str) - str: 使用网络搜索获取最新信息。这是一个模拟函数。 # 模拟搜索结果 results { 最新的AI会议: NeurIPS 2024将于12月举行投稿截止日期为5月。, Python 3.12 新特性: Python 3.12 改进了错误信息并引入了新的类型语法。, 今天的头条新闻: 科技板块某公司发布新一代AI芯片。 } for key, value in results.items(): if key in query or query in key: return f搜索 {query} 的结果{value} return f未找到关于 {query} 的明确信息。 tool def calculate_bmi(weight_kg: float, height_m: float) - str: 计算身体质量指数 (BMI)。公式体重(kg) / 身高(m)^2 bmi weight_kg / (height_m ** 2) category 偏瘦 if bmi 18.5 else 正常 if bmi 25 else 偏胖 if bmi 30 else 肥胖 return f您的BMI是 {bmi:.1f}属于{category}范围。 tool def get_current_time() - str: 获取当前日期和时间。 now datetime.now() return f当前时间是{now.strftime(%Y-%m-%d %H:%M:%S)} # ---------- 2. 设置LLM、记忆和提示 ---------- llm ChatOpenAI(modelgpt-3.5-turbo, temperature0) tools [search_web, calculate_bmi, get_current_time] # 使用窗口记忆只保留最近3轮对话避免上下文过长 memory ConversationBufferWindowMemory( memory_keychat_history, k3, return_messagesTrue ) # 构建一个功能更强大的系统提示引导Agent进行规划 prompt ChatPromptTemplate.from_messages([ (system, 你是一个高级任务执行助手。你的工作流程如下 1. **理解与分析**仔细分析用户的请求判断其复杂程度。 2. **规划**如果请求是复杂的或多步骤的先在脑中或通过思考步骤规划一个清晰的执行方案。 3. **工具选择**根据规划决定是否需要使用工具以及使用哪个工具。工具描述如下 - search_web: 当你需要获取最新的、非常识性的信息时使用。 - calculate_bmi: 当用户提供体重和身高需要计算BMI时使用。 - get_current_time: 当用户询问当前时间时使用。 4. **执行与整合**按规划执行整合工具返回的结果给出最终、完整的答复。 请保持对话的连贯性记住之前提到的关键信息。 ), MessagesPlaceholder(variable_namechat_history), (human, {input}), MessagesPlaceholder(variable_nameagent_scratchpad), ]) # ---------- 3. 创建并运行Agent ---------- agent create_openai_tools_agent(llm, tools, prompt) executor AgentExecutor( agentagent, toolstools, memorymemory, verboseTrue, # 设为True以观察思考过程 handle_parsing_errorsTrue, max_iterations5 # 防止Agent陷入死循环 ) print( 综合Agent演示开始 ) print(你可以尝试输入复杂任务例如) print( - 我想了解最新的AI会议然后告诉我现在几点。) print( - 我体重70公斤身高1.75米我的BMI是多少顺便查一下Python有什么新特性。) print( - 记住我的名字叫小明。我刚刚问过时间了吗) print(输入 退出 或 quit 结束对话。\n) while True: user_input input(\n你的问题: ) if user_input.lower() in [退出, quit, exit]: print(对话结束。) break try: result executor.invoke({input: user_input}) print(f\n助手: {result[output]}) except Exception as e: print(f执行出错: {e})这个综合 Agent 演示了以下能力多步骤规划对于“查AI会议然后看时间”这类请求它会先规划搜索再执行获取时间。上下文感知得益于ConversationBufferWindowMemory它能记住前几轮对话如你的名字。工具路由能根据问题准确选择search_web、calculate_bmi或get_current_time。防呆设计max_iterations参数防止 Agent 在无法解决问题时无限循环。运行这个脚本通过verboseTrue观察它的完整思考链你会对 Agent 的运作机制有更深刻的理解。7. 常见问题与调试技巧在开发 Agent 过程中你一定会遇到各种问题。以下是一些高频问题及其解决思路。问题现象可能原因排查与解决思路Agent 不调用工具直接回答1. 工具描述不清晰。2. 系统提示词未强调使用工具。3. 问题太简单模型认为无需工具。1. 检查工具函数的文档字符串确保清晰描述了功能和参数。2. 强化系统提示如“你必须使用可用工具来回答问题”。3. 在AgentExecutor中设置handle_parsing_errorsTrue并观察verbose日志。Agent 陷入循环反复调用同一工具1. 工具返回的结果无法满足 Agent 的“目标”。2. 最大迭代次数 (max_iterations) 设置过高或未设置。1. 检查工具返回的格式和内容是否明确。确保结果能推动任务前进。2.务必设置max_iterations通常5-10次这是安全护栏。解析错误如“Could not parse LLM output”1. LLM 的输出不符合 Agent 预期的格式如 JSON。2. 工具调用参数格式错误。1. 设置handle_parsing_errorsTrue让 Executor 尝试从错误中恢复。2. 查看verbose日志看 LLM 到底输出了什么。3. 考虑使用更强大的模型如 gpt-4或优化提示词。上下文长度超限1. 记忆内容chat_history或工具返回结果太长。2. 对话轮次太多。1. 使用ConversationSummaryMemory或ConversationBufferWindowMemory来限制历史长度。2. 清理记忆memory.clear()。3. 对工具返回的长文本进行摘要或截断。工具执行出错非LLM错误1. 工具函数内部代码有 Bug。2. Agent 传递了错误类型的参数。1. 单独测试你的工具函数确保其健壮性。2. 在工具函数内部做好参数校验和异常捕获返回友好的错误信息给 Agent。调试金句永远开启verboseTrue。这是理解 Agent “内心戏”的最重要窗口。通过观察Thought、Action、Observation的流转你能精准定位问题发生在规划、工具选择还是执行阶段。8. 进阶优化与工程实践当你掌握了基础 Agent 构建后以下实践能让你的 Agent 更可靠、更强大。8.1 提示词工程优化系统的提示词是 Agent 的“宪法”。好的提示词应角色明确清晰定义 Agent 的职责和边界。流程指示明确给出思考、规划、执行的步骤框架。格式要求要求输出结构化内容如 JSON、列表便于后续解析。安全与边界规定什么能做什么不能做。# 一个更优化的系统提示示例 advanced_system_prompt 你是一个专业的数据分析助手。你的核心职责是帮助用户通过计算和搜索获取信息。 **工作流程** 1. **理解需求**确认用户的具体问题。 2. **判断工具**分析是否需要计算或搜索。 - 涉及数学公式、单位换算、数据计算使用 calculate 工具。 - 涉及事实、新闻、最新信息使用 search_web 工具。 3. **执行与验证**调用工具后检查结果是否合理。如果结果不理想思考是否需要换一种方式或工具。 4. **清晰回复**将工具结果整合成用户易懂的答案并注明信息来源如“根据计算...”或“根据网络搜索...”。 **重要规则** - 如果用户请求涉及危险、违法或伦理问题直接拒绝并说明原因。 - 对于不确定的信息务必声明“这可能不准确”或“根据搜索结果显示”。 - 保持友好和专业。 8.2 使用更强大的模型与智能体框架升级模型对于复杂任务gpt-3.5-turbo可能力不从心gpt-4或gpt-4-turbo在规划、推理和工具调用准确性上通常有显著提升。探索其他框架LangChain 是优秀的起点但生产环境可以考虑AutoGen(微软)专注于多智能体协作适合构建由多个专家 Agent 组成的团队。CrewAI受 Crew团队概念启发擅长角色扮演和任务分工管理多 Agent 工作流非常直观。Semantic Kernel(微软)深度集成 .NET 生态提供强大的规划器和插件技能管理。8.3 构建可复用的工具库将工具模块化方便在不同 Agent 间复用。# 文件my_toolkit.py from langchain.tools import tool import requests import json class CalculatorTools: tool def calculate_area(radius: float) - str: 计算圆的面积。参数半径 (float)。 area 3.14159 * radius * radius return f半径为 {radius} 的圆面积是 {area:.2f} tool def convert_currency(amount: float, from_curr: str, to_curr: str) - str: 货币转换模拟。参数金额, 原货币代码, 目标货币代码。 rates {USD: 1.0, CNY: 7.2, EUR: 0.92, GBP: 0.79} # 模拟转换 if from_curr in rates and to_curr in rates: converted amount * rates[to_curr] / rates[from_curr] return f{amount} {from_curr} 约等于 {converted:.2f} {to_curr} return 不支持的货币代码。 # 使用时 from my_toolkit import CalculatorTools tools [CalculatorTools.calculate_area, CalculatorTools.convert_currency]8.4 为生产环境做好准备错误处理与降级Agent 执行链的每一步都可能出错。做好异常捕获并提供友好的降级回答如“服务暂时不可用您可以尝试...”。日志与监控记录完整的 Agent 执行轨迹Thought, Action, Observation便于问题回溯和性能分析。成本控制监控 Token 使用量设置预算和速率限制。对于内部工具可以考虑使用本地小模型通过 Ollama、LM Studio来处理简单任务。安全与审核对用户输入和工具输出进行内容安全过滤。特别是当工具能执行代码或访问数据库时权限控制至关重要。通过以上2.5小时的高强度练习你已经从零开始系统地实践了构建一个实用 AI Agent 的核心流程从激发模型的规划能力到定义和调用工具再到管理对话记忆最后整合成一个能处理多步骤任务的智能体。记住Agent 开发是一个迭代过程核心在于清晰的定义工具、提示和细致的观察verbose日志。接下来尝试为你自己的业务场景设计工具和提示词打造专属的智能助手吧。