从零构建AI Agent:基于LangChain的智能体开发实战指南
最近在尝试将大模型应用到实际业务中时,发现一个普遍痛点:模型本身能力很强,但让它稳定、可靠、自主地完成一个多步骤的复杂任务,却总是困难重重。要么是上下文管理混乱,要么是工具调用失败,要么是逻辑流中断。这正是 AI Agent(智能体) 技术要解决的核心问题。它不再是简单的“一问一答”,而是让大模型具备了规划、记忆、使用工具和持续执行的能力。
本文将从零开始,系统性地拆解 AI Agent 的开发全流程。无论你是刚接触大模型的开发者,还是希望将现有模型能力工程化的工程师,都能通过本文掌握从核心概念、主流框架选型、环境搭建、到亲手构建一个可运行 Agent 的完整路径。我们会聚焦于最实用、最易上手的方案,避开华而不实的理论,直接交付可复现的代码和配置。
1. AI Agent 核心概念:为什么它是大模型应用的未来
在深入代码之前,我们必须先厘清概念。很多人把调用一次大模型 API 就当作 Agent,这是一个常见的误解。
1.1 Agent 是什么?与普通大模型调用的区别
简单来说,一个 AI Agent 是一个能够感知环境、进行决策并执行行动以实现目标的智能系统。在大模型语境下,它通常由一个大语言模型(LLM)作为“大脑”,辅以任务规划、工具调用、记忆管理等模块构成。
与普通调用的核心区别:
- 普通调用 :用户输入一个问题,模型返回一个答案。交互是单次、静态的。
- Agent :用户输入一个 目标 (如“帮我分析一下上个月的销售数据并写一份报告”),Agent 会自主拆解任务(获取数据、分析趋势、生成文本),在过程中可能需要多次调用不同工具(数据库查询、计算、文件写入),并管理整个对话历史(记忆),最终达成目标。交互是多次、动态、有状态的。
1.2 Agent 的核心组成模块
一个典型的 Agent 系统包含以下几个关键部分,理解它们对后续开发至关重要:
-
规划(Planning)
- 子目标分解 :将复杂任务拆解为一系列可操作的子任务。例如,任务“订机票酒店规划旅行”可分解为:查询目的地天气、查找航班、对比酒店价格、预订。
- 反思与细化 :Agent 可以对自身计划或已完成动作的结果进行批判性审视,从而调整后续计划。比如工具调用失败后,尝试另一种方法。
-
记忆(Memory)
- 短期记忆 :通常指对话的上下文窗口,即本次交互的历史信息。
- 长期记忆 :能够持久化存储和检索关键信息的能力,例如通过向量数据库存储过往的重要对话、知识或执行结果,供未来任务参考。
-
工具使用(Tool Use)
- Agent 的核心能力之一。LLM 本身无法直接操作世界,它需要通过预定义的工具(如 API、函数、命令行)来获取信息或执行动作。
- 常见的工具包括:网络搜索、数据库查询、代码执行、文件读写、调用其他软件服务等。
-
行动(Action)
- 根据规划和工具调用的结果,实际执行步骤,并将执行结果返回给“大脑”(LLM)进行下一轮决策。
1.3 主流 Agent 框架简介
目前社区涌现了许多优秀的 Agent 框架,它们封装了上述核心模块,让开发者能更专注于业务逻辑。以下是几个主流选择:
- LangChain / LangGraph :目前生态最丰富、社区最活跃的框架之一。
LangChain提供了构建链(Chain)的基础组件,而LangGraph是其上用于构建有状态、多参与者(Agent)应用的新库,特别适合复杂工作流。 - LlamaIndex :最初专注于数据索引与检索,现已强大到成为构建基于私有数据的 RAG 和 Agent 应用的首选框架之一。它在数据连接、检索方面有天然优势。
- AutoGen :由微软推出,支持定义多个可对话的 Agent,并通过聊天来完成复杂任务,擅长多智能体协作场景。
- Semantic Kernel :微软推出的另一个框架,强调与现有代码的“插件”式集成,方便将传统软件能力暴露给 LLM。
- Dify / Flowise :更偏向低代码/可视化编排的 AI 应用开发平台,可以通过界面拖拽构建 Agent 工作流,降低开发门槛。
对于初学者和大多数应用场景, 从 LangChain(LangGraph)或 LlamaIndex 入手是稳妥的选择 。它们文档齐全,示例丰富,本文后续实战也将基于 LangChain 展开。
2. 环境准备:搭建你的第一个 Agent 开发环境
工欲善其事,必先利其器。我们将创建一个干净、可复现的 Python 开发环境。
2.1 基础环境要求
- 操作系统 :Windows 10/11, macOS, 或 Linux (Ubuntu 20.04+ 推荐)。本文命令以 Linux/macOS 为例,Windows 用户可在 PowerShell 或 WSL 中操作。
- Python 版本 : Python 3.10 或 3.11 。这是大多数 AI 库兼容性最好的版本。避免使用 Python 3.12 等过新版本,可能遇到依赖冲突。
- 包管理工具 :
pip(建议版本 >= 21.0)。推荐使用venv或conda创建虚拟环境。
2.2 创建虚拟环境并安装核心依赖
首先,我们创建一个独立的项目目录和虚拟环境。
# 1. 创建项目目录并进入
mkdir ai-agent-tutorial && cd ai-agent-tutorial
# 2. 创建 Python 虚拟环境 (命名为 `venv`)
python3.10 -m venv venv
# 3. 激活虚拟环境
# Linux/macOS:
source venv/bin/activate
# Windows:
# venv\Scripts\activate
# 激活后,命令行提示符前应显示 `(venv)`
接下来,安装最核心的库: langchain 和 openai 。我们将使用 OpenAI 的 GPT 模型作为 Agent 的“大脑”。你需要准备一个有效的 OpenAI API Key 。
# 升级 pip 确保安装顺利
pip install --upgrade pip
# 安装 LangChain 和 OpenAI 官方库
pip install langchain langchain-openai
# 可选但推荐:安装 langchain-community,它包含许多社区维护的工具和集成
pip install langchain-community
2.3 配置 API 密钥
为了安全地管理 API 密钥,我们使用环境变量。 切勿将密钥硬编码在代码中!
# Linux/macOS: 将你的真实密钥替换 `your-openai-api-key-here`
export OPENAI_API_KEY="your-openai-api-key-here"
# Windows (PowerShell):
# $env:OPENAI_API_KEY="your-openai-api-key-here"
为了验证环境是否配置成功,可以创建一个简单的测试脚本 test_env.py :
# test_env.py
import os
from langchain_openai import ChatOpenAI
# 检查环境变量
api_key = os.getenv("OPENAI_API_KEY")
if not api_key:
print("错误:未找到 OPENAI_API_KEY 环境变量!")
else:
print("API Key 配置成功(部分显示):", api_key[:10] + "...")
# 初始化一个简单的聊天模型
try:
llm = ChatOpenAI(model="gpt-3.5-turbo", temperature=0)
response = llm.invoke("你好,请用一句话介绍你自己。")
print("\n模型响应测试成功:")
print(response.content)
except Exception as e:
print(f"\n模型调用失败,错误信息:{e}")
运行它:
python test_env.py
如果看到模型返回了一句自我介绍,恭喜你,基础环境搭建成功!
3. 核心组件拆解:亲手打造 Agent 的“骨骼”与“肌肉”
现在,我们开始用 LangChain 一步步构建 Agent 的核心部件。
3.1 大脑:LLM 的初始化与配置
LLM 是 Agent 的决策核心。LangChain 提供了统一的接口。
# llm_demo.py
from langchain_openai import ChatOpenAI
from langchain.schema import HumanMessage, SystemMessage
# 初始化 ChatOpenAI 模型
# model: 指定模型,如 gpt-3.5-turbo, gpt-4, gpt-4-turbo
# temperature: 控制随机性 (0.0 ~ 2.0),值越低输出越确定,越高越有创造性。Agent 通常设为较低值(如0.1)以保证稳定性。
# api_key: 如果不通过环境变量设置,可以在这里传入(不推荐)
llm = ChatOpenAI(model="gpt-3.5-turbo", temperature=0.1)
# 简单调用
single_response = llm.invoke("中国的首都是哪里?")
print("单轮对话:", single_response.content)
# 多轮对话(维护消息历史)
messages = [
SystemMessage(content="你是一个乐于助人的助手。"),
HumanMessage(content="我叫小明。"),
HumanMessage(content="我刚刚告诉了你我的名字,请问我叫什么?")
]
chat_response = llm.invoke(messages)
print("\n多轮对话:", chat_response.content)
3.2 工具:赋予 Agent“手脚”
没有工具的 Agent 是“纸上谈兵”。我们来定义两个简单的工具:一个计算器和一个获取当前时间的工具。
# tools_demo.py
from langchain.tools import tool
from datetime import datetime
import math
# 使用 @tool 装饰器快速定义工具
@tool
def calculate(expression: str) -> str:
"""计算一个数学表达式的值。支持 +, -, *, /, **, sqrt 等。
例如:`calculate(\"3 + 5 * 2\")`"""
# 警告:使用 eval 有安全风险,此处仅用于演示。生产环境应使用更安全的解析库(如 ast.literal_eval)或自定义解析器。
try:
# 为表达式添加常用的数学函数
result = eval(expression, {"__builtins__": None}, {"sqrt": math.sqrt, "sin": math.sin, "cos": math.cos, "pi": math.pi})
return f"计算结果:{result}"
except Exception as e:
return f"计算错误:{e}"
@tool
def get_current_time(timezone: str = "Asia/Shanghai") -> str:
"""获取指定时区的当前时间。参数 timezone 默认为 'Asia/Shanghai'。"""
try:
from zoneinfo import ZoneInfo
tz = ZoneInfo(timezone)
current_time = datetime.now(tz).strftime("%Y-%m-%d %H:%M:%S %Z")
return f"{timezone} 的当前时间是:{current_time}"
except Exception as e:
return f"获取时间失败,时区可能无效:{e}"
# 将工具放入列表,供 Agent 使用
tools = [calculate, get_current_time]
# 测试工具
if __name__ == "__main__":
print("测试计算工具:", calculate.invoke("3 + 5 * 2"))
print("\n测试时间工具:", get_current_time.invoke({}))
print("\n测试带参数的时间工具:", get_current_time.invoke({"timezone": "America/New_York"}))
3.3 记忆:让 Agent 拥有“过去”
LangChain 提供了多种记忆后端。最简单的是 ConversationBufferMemory ,它会在内存中保存完整的对话历史。
# memory_demo.py
from langchain.memory import ConversationBufferMemory
from langchain_openai import ChatOpenAI
from langchain.chains import ConversationChain
# 初始化记忆和模型
memory = ConversationBufferMemory()
llm = ChatOpenAI(model="gpt-3.5-turbo", temperature=0.7)
# 创建对话链
conversation = ConversationChain(llm=llm, memory=memory, verbose=True)
print("=== 第一轮对话 ===")
response1 = conversation.predict(input="你好,我的名字是李雷。")
print("AI:", response1)
print("\n=== 第二轮对话 ===")
# 注意这里没有再次提及名字,但 AI 应该记得
response2 = conversation.predict(input="你还记得我叫什么吗?")
print("AI:", response2)
print("\n=== 查看记忆缓冲区 ===")
print(memory.buffer)
运行此脚本,你会看到在第二轮对话中,AI 能够正确回忆起“李雷”这个名字,因为记忆模块保存了之前的对话上下文。
3.4 智能体(Agent)的组装:ReAct 模式
ReAct (Reason + Act) 是 Agent 经典的推理模式。LangChain 内置了 create_react_agent 函数来简化构建。下面我们将大脑(LLM)、工具和记忆组装成一个真正的 Agent。
# agent_react_demo.py
from langchain import hub
from langchain.agents import create_react_agent, AgentExecutor
from langchain_openai import ChatOpenAI
from langchain.memory import ConversationBufferMemory
from tools_demo import calculate, get_current_time # 导入之前定义的工具
# 1. 初始化组件
llm = ChatOpenAI(model="gpt-3.5-turbo", temperature=0)
tools = [calculate, get_current_time]
memory = ConversationBufferMemory(memory_key="chat_history", return_messages=True)
# 2. 从 LangChain Hub 拉取一个适合 ReAct 的提示词模板
# 这是一个预定义的、指导 Agent 如何思考(Reason)和行动(Act)的模板
prompt = hub.pull("hwchase17/react-chat")
# 3. 创建 ReAct Agent
agent = create_react_agent(llm, tools, prompt)
# 4. 创建 Agent 执行器,它负责运行 Agent 的循环:思考 -> 选择工具 -> 执行 -> 观察 -> 再思考...
agent_executor = AgentExecutor(
agent=agent,
tools=tools,
memory=memory,
verbose=True, # 开启详细日志,可以看到 Agent 的思考过程
handle_parsing_errors=True, # 优雅处理解析错误
max_iterations=5, # 限制最大迭代次数,防止死循环
early_stopping_method="generate" # 当 Agent 认为任务完成时,提前停止
)
# 5. 运行 Agent!
print("=== 启动 Agent,尝试解决复杂问题 ===")
try:
# 这是一个需要多步推理和工具调用的任务
result = agent_executor.invoke({
"input": "请先计算一下 (15 的平方根) 加上 (10除以2) 等于多少?然后告诉我现在纽约的时间。"
})
print("\n最终输出:", result["output"])
except Exception as e:
print(f"执行过程中出现错误:{e}")
运行这段代码,你会看到控制台输出详细的 verbose 日志。Agent 会先“思考”如何拆解问题,然后调用 calculate 工具计算 sqrt(15) + 10/2 ,得到结果后,再“思考”下一步,调用 get_current_time 工具获取纽约时间,最后将两个结果整合成一段话回复给你。这就是一个自主工作的 AI Agent!
4. 完整实战案例:构建一个“数据分析与报告生成”Agent
让我们综合运用所学,构建一个更贴近实际业务的 Agent。这个 Agent 的目标是:用户给定一个股票代码(如 AAPL ),Agent 能自动获取其近期股价数据,进行简单分析(如计算涨跌幅),并生成一段简短的分析报告。
4.1 项目结构与新工具定义
首先,创建项目文件结构:
ai-agent-project/
├── tools/
│ ├── __init__.py
│ └── stock_tools.py # 定义股票数据获取工具
├── agents/
│ ├── __init__.py
│ └── stock_agent.py # 定义 Stock Agent
├── config.py # 配置文件(如API Key管理)
├── requirements.txt # 项目依赖
└── main.py # 主程序入口
1. 安装额外依赖 我们需要 yfinance 库来获取股票数据。
pip install yfinance pandas
2. 定义股票数据工具 ( tools/stock_tools.py )
# tools/stock_tools.py
from langchain.tools import tool
import yfinance as yf
import pandas as pd
from datetime import datetime, timedelta
@tool
def get_stock_price(symbol: str) -> str:
"""获取指定股票代码的最新股价。
参数 symbol: 股票代码,例如 'AAPL' 代表苹果公司,'00700.HK' 代表腾讯港股。"""
try:
stock = yf.Ticker(symbol)
# 获取最近一天的行情
hist = stock.history(period="1d")
if hist.empty:
return f"未能获取到股票 {symbol} 的数据,请检查代码是否正确。"
latest_price = hist['Close'].iloc[-1]
return f"股票 {symbol} 的最新收盘价是 ${latest_price:.2f} USD。"
except Exception as e:
return f"获取股价时出错:{e}"
@tool
def get_stock_history(symbol: str, days: int = 30) -> str:
"""获取指定股票过去一段时间的价格历史。
参数:
symbol: 股票代码。
days: 回溯天数,默认30天。"""
try:
end_date = datetime.now()
start_date = end_date - timedelta(days=days)
stock = yf.Ticker(symbol)
# 获取历史数据
hist = stock.history(start=start_date, end=end_date)
if hist.empty:
return f"未能获取到股票 {symbol} 的历史数据。"
# 计算一些基本统计信息
price_start = hist['Close'].iloc[0]
price_end = hist['Close'].iloc[-1]
change = price_end - price_start
change_pct = (change / price_start) * 100
# 返回格式化摘要
return (f"股票 {symbol} 在过去 {days} 天的表现:\n"
f"- 期初价格: ${price_start:.2f}\n"
f"- 期末价格: ${price_end:.2f}\n"
f"- 价格变化: ${change:.2f} ({change_pct:+.2f}%)\n"
f"- 数据点数: {len(hist)}")
except Exception as e:
return f"获取历史数据时出错:{e}"
@tool
def calculate_performance(symbol: str) -> str:
"""对指定股票进行简单的绩效计算(基于最近30天数据)。
参数 symbol: 股票代码。"""
try:
# 复用历史工具获取数据摘要
history_summary = get_stock_history.invoke({"symbol": symbol, "days": 30})
# 这里可以添加更复杂的计算逻辑,例如波动率、与大盘对比等
# 为简化,我们直接返回历史摘要并附加一句分析
analysis = "\n【初步分析】此数据展示了该股票近期的价格变动情况。正百分比表示上涨,负百分比表示下跌。请注意,这只是历史数据,不构成投资建议。"
return history_summary + analysis
except Exception as e:
return f"计算绩效时出错:{e}"
# 导出工具列表
stock_tools = [get_stock_price, get_stock_history, calculate_performance]
4.2 构建专属 Stock Agent ( agents/stock_agent.py )
# agents/stock_agent.py
from langchain.agents import create_react_agent, AgentExecutor
from langchain_openai import ChatOpenAI
from langchain.memory import ConversationBufferMemory
from langchain import hub
from tools.stock_tools import stock_tools # 导入自定义工具
def create_stock_agent(openai_api_key: str, model: str = "gpt-3.5-turbo"):
"""创建并返回一个配置好的股票分析 Agent 执行器。"""
# 1. 初始化 LLM
llm = ChatOpenAI(
model=model,
temperature=0.1, # 低随机性,保证分析稳定性
openai_api_key=openai_api_key,
)
# 2. 准备工具和记忆
tools = stock_tools
memory = ConversationBufferMemory(memory_key="chat_history", return_messages=True)
# 3. 使用一个更适合分析任务的提示词模板
# 你可以从 hub 拉取,也可以自定义。这里我们使用一个通用的 ReAct 模板。
prompt = hub.pull("hwchase17/react")
# 4. 创建 Agent 和执行器
agent = create_react_agent(llm, tools, prompt)
agent_executor = AgentExecutor(
agent=agent,
tools=tools,
memory=memory,
verbose=True, # 生产环境可设为 False
handle_parsing_errors=True,
max_iterations=7,
early_stopping_method="generate"
)
return agent_executor
if __name__ == "__main__":
# 本地测试
import os
api_key = os.getenv("OPENAI_API_KEY")
if not api_key:
print("请设置 OPENAI_API_KEY 环境变量")
exit(1)
agent = create_stock_agent(api_key)
print("Stock Agent 初始化成功!输入 'quit' 退出。")
while True:
user_input = input("\n您的问题:")
if user_input.lower() == 'quit':
break
try:
result = agent.invoke({"input": user_input})
print("\nAgent:", result["output"])
except Exception as e:
print(f"执行出错:{e}")
4.3 主程序与运行 ( main.py )
# main.py
import os
from agents.stock_agent import create_stock_agent
def main():
# 从环境变量获取 API Key
openai_api_key = os.getenv("OPENAI_API_KEY")
if not openai_api_key:
print("错误:未设置 OPENAI_API_KEY 环境变量。")
print("请执行:export OPENAI_API_KEY='your-key-here' (Linux/macOS)")
print("或:set OPENAI_API_KEY=your-key-here (Windows)")
return
print("=" * 50)
print("欢迎使用股票分析 AI Agent")
print("我可以帮你查询股价、查看历史表现并进行简单分析。")
print("例如,你可以问我:")
print(" - 'AAPL 现在的股价是多少?'")
print(" - '看看 TSLA 过去一周的表现'")
print(" - '分析一下 00700.HK 最近一个月的走势'")
print("输入 'quit' 或 'exit' 退出程序。")
print("=" * 50)
# 创建 Agent
agent_executor = create_stock_agent(openai_api_key)
while True:
try:
user_input = input("\n>>> 请输入您的问题: ").strip()
if user_input.lower() in ['quit', 'exit', 'q']:
print("再见!")
break
if not user_input:
continue
# 调用 Agent
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}")
if __name__ == "__main__":
main()
4.4 运行与验证
- 确保在项目根目录下,并且虚拟环境已激活。
- 确保
OPENAI_API_KEY环境变量已设置。 - 运行主程序:
python main.py - 在交互界面中,尝试输入:
AAPL 现在的股价是多少?看看 TSLA 过去 10 天的历史数据请分析一下微软(MSFT)的近期表现
观察控制台输出的 verbose 日志,你会清晰地看到 Agent 的思考链(Chain of Thought):它如何理解你的问题、选择哪个工具、工具返回什么结果、以及如何组织最终答案。
5. 常见问题与排查思路 (FAQ)
在开发和使用 Agent 过程中,你一定会遇到各种问题。下面是一些典型问题及解决方法。
| 问题现象 | 可能原因 | 排查步骤与解决方案 |
|---|---|---|
ModuleNotFoundError: No module named 'langchain' |
1. 虚拟环境未激活。 2. 依赖未正确安装。 |
1. 确认命令行前有 (venv) 提示。 2. 在项目根目录执行 pip install -r requirements.txt 或重新安装 pip install langchain langchain-openai 。 |
openai.AuthenticationError: Incorrect API key provided |
1. API Key 未设置或错误。 2. 环境变量名不正确。 |
1. 检查 OPENAI_API_KEY 环境变量: echo $OPENAI_API_KEY 。 2. 在代码中临时打印 os.getenv('OPENAI_API_KEY') 的前几位确认。 3. 确保 Key 有余额且未过期。 |
Agent 陷入死循环或达到 max_iterations |
1. 任务过于复杂或模糊。 2. 工具描述不清,导致 LLM 无法正确选择。 3. 工具执行结果格式混乱,LLM 无法理解。 |
1. 检查 verbose 日志,看 Agent 在哪一步卡住。 2. 优化工具描述 :确保 @tool 装饰器下的文档字符串清晰、精确地描述了工具的功能和参数。 3. 优化工具输出 :工具返回的字符串应简洁、结构化,便于 LLM 解析。 4. 适当增加 max_iterations ,或提供更明确的用户指令。 |
ValueError: Could not parse LLM output: ... |
LLM 返回的内容不符合 Agent 执行器预期的格式(如 JSON 解析失败)。 | 1. 设置 handle_parsing_errors=True 来捕获并尝试修复。 2. 使用 verbose=True 查看原始输出,检查是否是提示词(Prompt)问题。 3. 尝试更换更强大的模型(如从 gpt-3.5-turbo 切换到 gpt-4 )。 |
| 工具调用失败(如网络超时、数据缺失) | 1. 工具依赖的第三方 API 不可用。 2. 输入参数无效。 |
1. 在工具函数内部做好 异常捕获 ,并返回清晰的错误信息,而不是抛出异常。这能让 Agent 知道工具调用失败,并尝试其他方案。 2. 为工具添加参数验证逻辑。 |
| 记忆(Memory)不工作,Agent 忘记上下文 | 1. 记忆对象未正确传递给 Agent 执行器。 2. 使用的 Chain 或 Agent 类型不支持记忆。 |
1. 确认创建 AgentExecutor 时传入了 memory 参数。 2. 确认 memory_key 与提示词模板中期望的键名一致。 3. 对于复杂场景,考虑使用 ConversationSummaryMemory 或结合向量数据库的长期记忆。 |
| 国产大模型(如通义千问、文心一言)如何接入? | LangChain 不直接支持某些国产模型。 | 1. 查看 LangChain 的 langchain-community 集成库,可能已有对应封装。 2. 如果模型提供 OpenAI 兼容的 API 端点,可以使用 ChatOpenAI 类,通过 base_url 和 api_key 参数配置。 3. 自定义 LLM 封装类,继承 langchain.llms.base.BaseLLM 。 |
6. 最佳实践与进阶工程建议
当你掌握了基础构建方法后,以下实践能帮助你打造更健壮、可维护的 Agent 应用。
6.1 提示词工程:引导 Agent 更可靠地工作
Agent 的表现极大程度依赖于提示词(Prompt)。不要满足于默认模板。
- 明确角色和规则 :在 System Message 中清晰定义 Agent 的角色、能力和限制。
from langchain.prompts import ChatPromptTemplate, SystemMessagePromptTemplate, HumanMessagePromptTemplate system_template = """你是一个专业的股票分析助手。你的核心能力是使用工具获取金融数据并进行分析。 你必须遵守以下规则: 1. 只回答与股票、金融相关的问题。对于其他问题,礼貌地拒绝。 2. 在给出任何分析或结论时,必须声明“此分析基于历史数据,不构成投资建议”。 3. 如果用户的问题需要工具,你必须按步骤调用工具,并解释工具返回的结果。 """ system_prompt = SystemMessagePromptTemplate.from_template(system_template) human_prompt = HumanMessagePromptTemplate.from_template("{input}") chat_prompt = ChatPromptTemplate.from_messages([system_prompt, human_prompt]) # 然后将 chat_prompt 用于你的 LLM 或 Agent - Few-Shot 示例 :在提示词中提供几个输入输出的例子,能显著提升 Agent 在复杂任务上的表现。
- 输出格式约束 :要求 LLM 以特定格式(如 JSON、Markdown)输出,便于后续程序化处理。
6.2 工具设计的黄金法则
- 单一职责 :一个工具只做一件事,并且做好。避免创建“万能”工具。
- 描述清晰 :工具的文档字符串是给 LLM 看的“说明书”,必须准确描述功能、输入参数和输出格式。
- 健壮性 :工具内部必须进行充分的错误处理和输入验证,返回对 LLM 友好的错误信息,而不是抛出未处理的异常。
- 无状态性 :工具函数本身尽量保持无状态,状态由记忆或外部存储管理。
6.3 生产环境部署考量
- 异步化 :LangChain 支持异步调用(
ainvoke,astream),在 Web 服务中能大幅提高并发性能。 - 流式输出 :对于生成时间较长的响应,使用
stream模式逐步返回结果,提升用户体验。 - 切换记忆后端 :
ConversationBufferMemory仅适用于内存。生产环境需要将会话状态存储到数据库(如 Redis、PostgreSQL)中。LangChain 提供了RedisChatMessageHistory等集成。 - 监控与日志 :记录详细的运行日志,包括每次的输入、输出、工具调用记录、Token 消耗和耗时,便于问题排查和成本分析。
- 限流与降级 :对 LLM API 调用进行限流,并设计降级策略(如缓存常见回答、使用备用模型)。
6.4 进阶方向:从单智能体到智能体协作
当单个 Agent 无法处理复杂任务时,可以考虑多智能体(Multi-Agent)系统。
- 角色分工 :创建具有不同专长的 Agent(如“数据分析师”、“报告撰写员”、“校对员”)。
- 编排方式 :使用
LangGraph来显式地定义多个 Agent 之间的工作流和状态转移,这是构建复杂、稳定 Agent 系统的强大工具。 - 管理者-工作者模式 :一个“管理者”Agent 负责接收用户请求并拆解任务,将子任务分发给不同的“工作者”Agent 执行,最后汇总结果。
从理解 Agent 的核心概念,到搭建开发环境,再到亲手构建一个具备规划、工具使用和记忆能力的股票分析 Agent,我们完成了一次完整的 Agent 开发实战。关键在于理解其“感知-决策-行动”的循环本质,并熟练运用 LangChain 这类框架将各个模块(LLM、工具、记忆)高效组装。
下一步,你可以尝试:
- 集成更多工具 :将内部 API、数据库、文件系统等接入你的 Agent。
- 探索不同框架 :用 LlamaIndex 构建一个基于私有知识库的问答 Agent,或用 AutoGen 搭建一个多智能体辩论系统。
- 优化提示词 :这是提升 Agent 性能性价比最高的方式,深入研究 Few-Shot、Chain-of-Thought 等技巧。
- 部署上线 :使用 FastAPI 将你的 Agent 封装成 HTTP 服务,并添加认证、限流等生产级功能。
AI Agent 的开发是一场关于“如何让大模型可靠工作”的工程实践。它没有银弹,需要你在具体场景中不断迭代工具、优化提示、设计流程。希望本文提供的代码和思路,能成为你探索 Agent 世界的坚实起点。
更多推荐

所有评论(0)