AI Agent实战指南:2.5小时掌握LLM智能体规划、工具调用与记忆管理

AI Agent实战指南:2.5小时掌握LLM智能体规划、工具调用与记忆管理

最近在尝试将大语言模型(LLM)应用到实际业务中时,发现一个普遍现象:模型本身回答问题的能力很强,但一旦涉及到需要多步骤推理、调用外部工具或处理复杂任务时,就显得力不从心。这背后缺失的关键能力,就是Agent(智能体)。无论是想实现一个能自动分析数据并生成报告的助手,还是一个能根据用户需求自主规划并执行代码任务的编程伙伴,Agent 都是绕不开的核心技术。

本文旨在为你提供一份高强度的、聚焦实战的 Agent 能力训练指南。我们不空谈概念,而是通过一系列精心设计的练习,让你在约2.5小时内,系统性地掌握构建一个“聪明”Agent所需的核心技能。从最基础的思维链提示,到复杂的工具调用与记忆管理,每个环节都配有可运行的代码示例和清晰的解释。无论你是想入门 AI Agent 开发,还是希望提升现有模型的“执行力”,这篇文章都能为你提供一条清晰的路径。

1. 理解 Agent:从“聊天机器人”到“智能执行者”

在深入练习之前,我们必须先厘清 Agent 究竟是什么。简单来说,Agent 是一个能够感知环境、进行决策并执行行动以实现目标的系统。在 LLM 的语境下,Agent 通常指一个以大语言模型为“大脑”,具备规划、工具使用和记忆等能力的程序。

核心区别

  • 传统聊天机器人/LLM:你问,它答。一次交互,一个回复。它不知道之前说过什么(除非提供上下文),也不会主动去做事。
  • AI Agent:你给一个目标(如“帮我分析上个月的销售数据并总结趋势”),它会自己拆解任务(规划),决定需要调用哪些工具(如查询数据库、调用Python绘图),执行这些动作,并根据结果调整策略,最终给你一个完整的结果。它是一个有状态的、主动的、可执行的智能体。

一个典型的 Agent 系统包含以下几个核心组件,这也是我们后续练习的路线图:

  1. 规划(Planning):将复杂目标分解为可执行的子任务序列。
  2. 工具使用(Tool Use):调用外部函数、API或代码来获取信息或改变环境。
  3. 记忆(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-community
  • langchain: 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(model="gpt-3.5-turbo", temperature=0) # temperature 控制创造性,0表示更确定性的输出,适合任务执行。 print("LLM 初始化成功!") # 可以简单测试一下 response = llm.invoke("你好,请用一句话介绍你自己。") print(response.content)

运行这个脚本,如果看到模型回复,说明环境配置成功。至此,我们的“大脑”就准备好了。

3. 核心能力一:思维链与规划(Planning)

Agent 的“聪明”首先体现在其规划能力上。我们通过提示工程(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(model="gpt-3.5-turbo", temperature=0) # 零样本提示:直接给任务 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(model="gpt-3.5-turbo", temperature=0) 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(model="gpt-3.5-turbo", temperature=0) # 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(agent=agent, tools=tools, verbose=True, handle_parsing_errors=True) # 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 运行的核心引擎。verbose=True会打印出详细的思考过程,这是学习 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_results=2, doc_content_chars_max=500) wiki_tool = WikipediaQueryRun(api_wrapper=wiki_wrapper) search_wrapper = DuckDuckGoSearchAPIWrapper() search_tool = DuckDuckGoSearchRun(api_wrapper=search_wrapper) # 2. 组合工具 tools = [wiki_tool, search_tool] llm = ChatOpenAI(model="gpt-3.5-turbo", temperature=0) prompt = ChatPromptTemplate.from_messages([ ("system", "你是一个研究助手。优先使用维基百科工具获取权威信息,如果找不到或信息不足,再使用网络搜索。"), ("human", "{input}"), ("placeholder", "{agent_scratchpad}"), ]) agent = create_openai_tools_agent(llm, tools, prompt) executor = AgentExecutor(agent=agent, tools=tools, verbose=True, handle_parsing_errors=True) # 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(model="gpt-3.5-turbo", temperature=0) # 关键:在提示中预留记忆变量的位置,并在创建memory时指定key prompt = ChatPromptTemplate.from_messages([ ("system", "你是一个友好的助手,会记住对话中提到的所有事情。"), MessagesPlaceholder(variable_name="chat_history"), # 历史对话将放在这里 ("human", "{input}"), MessagesPlaceholder(variable_name="agent_scratchpad"), ]) memory = ConversationBufferMemory(memory_key="chat_history", return_messages=True) agent = create_openai_tools_agent(llm, tools, prompt) executor = AgentExecutor(agent=agent, tools=tools, memory=memory, verbose=True) # 进行多轮对话 conversation = [ "你好,我的名字是张三。", "我的名字长度是多少?", # 它应该记得“张三” "我妹妹叫李小花,她也想知道她名字的长度。", "那么我的名字长度和我妹妹的名字长度,哪个更长?" # 它应该记得两个人名并比较 ] for i, msg in enumerate(conversation): print(f"\n[用户第{i+1}轮]: {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(model="gpt-3.5-turbo", temperature=0) # 使用 ConversationSummaryMemory memory = ConversationSummaryMemory(llm=llm, memory_key="chat_history", return_messages=True) conversation = ConversationChain(llm=llm, memory=memory, verbose=False) # 模拟一段较长的、话题相关的对话 long_chat = [ "我喜欢编程,尤其是Python和JavaScript。", "Python 我用来做数据分析和后端开发。", "JavaScript 我主要用React框架来做前端。", "对了,我还用Python的FastAPI框架写过几个微服务项目。", "你觉得对于初学者,是先学Python好还是先学JavaScript好?" ] print("进行一段长对话...") for msg in long_chat: print(f"\n用户: {msg}") response = conversation.predict(input=msg) 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(model="gpt-3.5-turbo", temperature=0) tools = [search_web, calculate_bmi, get_current_time] # 使用窗口记忆,只保留最近3轮对话,避免上下文过长 memory = ConversationBufferWindowMemory( memory_key="chat_history", k=3, return_messages=True ) # 构建一个功能更强大的系统提示,引导Agent进行规划 prompt = ChatPromptTemplate.from_messages([ ("system", """你是一个高级任务执行助手。你的工作流程如下: 1. **理解与分析**:仔细分析用户的请求,判断其复杂程度。 2. **规划**:如果请求是复杂的或多步骤的,先在脑中(或通过思考步骤)规划一个清晰的执行方案。 3. **工具选择**:根据规划,决定是否需要使用工具,以及使用哪个工具。工具描述如下: - search_web: 当你需要获取最新的、非常识性的信息时使用。 - calculate_bmi: 当用户提供体重和身高,需要计算BMI时使用。 - get_current_time: 当用户询问当前时间时使用。 4. **执行与整合**:按规划执行,整合工具返回的结果,给出最终、完整的答复。 请保持对话的连贯性,记住之前提到的关键信息。 """), MessagesPlaceholder(variable_name="chat_history"), ("human", "{input}"), MessagesPlaceholder(variable_name="agent_scratchpad"), ]) # ---------- 3. 创建并运行Agent ---------- agent = create_openai_tools_agent(llm, tools, prompt) executor = AgentExecutor( agent=agent, tools=tools, memory=memory, verbose=True, # 设为True以观察思考过程 handle_parsing_errors=True, max_iterations=5 # 防止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 演示了以下能力

  1. 多步骤规划:对于“查AI会议然后看时间”这类请求,它会先规划(搜索),再执行(获取时间)。
  2. 上下文感知:得益于ConversationBufferWindowMemory,它能记住前几轮对话(如你的名字)。
  3. 工具路由:能根据问题准确选择search_webcalculate_bmiget_current_time
  4. 防呆设计max_iterations参数防止 Agent 在无法解决问题时无限循环。

运行这个脚本,通过verbose=True观察它的完整思考链,你会对 Agent 的运作机制有更深刻的理解。

7. 常见问题与调试技巧

在开发 Agent 过程中,你一定会遇到各种问题。以下是一些高频问题及其解决思路。

问题现象可能原因排查与解决思路
Agent 不调用工具,直接回答1. 工具描述不清晰。
2. 系统提示词未强调使用工具。
3. 问题太简单,模型认为无需工具。
1. 检查工具函数的文档字符串,确保清晰描述了功能和参数。
2. 强化系统提示,如“你必须使用可用工具来回答问题”。
3. 在AgentExecutor中设置handle_parsing_errors=True并观察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_errors=True,让 Executor 尝试从错误中恢复。
2. 查看verbose日志,看 LLM 到底输出了什么。
3. 考虑使用更强大的模型(如 gpt-4)或优化提示词。
上下文长度超限1. 记忆内容(chat_history)或工具返回结果太长。
2. 对话轮次太多。
1. 使用ConversationSummaryMemoryConversationBufferWindowMemory来限制历史长度。
2. 清理记忆:memory.clear()
3. 对工具返回的长文本进行摘要或截断。
工具执行出错(非LLM错误)1. 工具函数内部代码有 Bug。
2. Agent 传递了错误类型的参数。
1. 单独测试你的工具函数,确保其健壮性。
2. 在工具函数内部做好参数校验和异常捕获,返回友好的错误信息给 Agent。

调试金句永远开启verbose=True。这是理解 Agent “内心戏”的最重要窗口。通过观察ThoughtActionObservation的流转,你能精准定位问题发生在规划、工具选择还是执行阶段。

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-4gpt-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 为生产环境做好准备

  1. 错误处理与降级:Agent 执行链的每一步都可能出错。做好异常捕获,并提供友好的降级回答(如“服务暂时不可用,您可以尝试...”)。
  2. 日志与监控:记录完整的 Agent 执行轨迹(Thought, Action, Observation),便于问题回溯和性能分析。
  3. 成本控制:监控 Token 使用量,设置预算和速率限制。对于内部工具,可以考虑使用本地小模型(通过 Ollama、LM Studio)来处理简单任务。
  4. 安全与审核:对用户输入和工具输出进行内容安全过滤。特别是当工具能执行代码或访问数据库时,权限控制至关重要。

通过以上2.5小时的高强度练习,你已经从零开始,系统地实践了构建一个实用 AI Agent 的核心流程:从激发模型的规划能力,到定义和调用工具,再到管理对话记忆,最后整合成一个能处理多步骤任务的智能体。记住,Agent 开发是一个迭代过程,核心在于清晰的定义(工具、提示)和细致的观察(verbose日志)。接下来,尝试为你自己的业务场景设计工具和提示词,打造专属的智能助手吧。