构建能够推理、规划并使用工具解决复杂问题的智能 AI 智能体。学习如何将大语言模型(LLM)与外部能力结合,打造具备自主决策能力的系统。
🎯学习目标
- 理解 LangChain 智能体的核心概念与架构
- 集成内置工具(如计算器、网络搜索)
- 为特定业务需求创建自定义工具
- 构建具备多工具调用能力与自主决策能力的 AI 助手
📋前置条件:你准备好进阶 LangChain 了吗?
本教程面向中级用户,假设你已掌握以下内容:
- 完成第 5--8 课(LangChain 基础、链、记忆机制)
- 具备扎实的 Python 编程能力
- 理解 LangChain 的提示词(Prompts)与链(Chains)
- 熟悉异步编程概念(加分项,非必需)
🤖理解 AI 智能体:核心概念与架构
智能体是一种能够对问题进行推理、规划行动并调用工具以达成目标的 AI 系统。与按照预设步骤执行的简单链不同,智能体能动态决定下一步该做什么。
❌ 传统链(Chains)的特点:
→ 固定执行顺序
→ 无决策能力
→ 无法调用外部工具
→ 解决问题能力有限
✅ 智能体(Agents)的优势:
→ 动态规划
→ 工具选择
→ 外部 API 集成
→ 多步推理
🧠 智能体的推理流程示例:
Thought(思考):"我需要获取当前天气信息"
Action(行动):调用天气 API 工具
Observation(观察):收到天气数据
Final Answer(最终回答):向用户返回格式化结果
🛠️手把手教程:构建你的第一个 LangChain 智能体
使用计算器的 Zero-Shot 智能体
我们从一个能执行计算和推理的简单智能体开始。
🔍 组件解析:
- 智能体类型:ZERO_SHOT_REACT_DESCRIPTION 使用"推理 + 行动"(ReAct)模式
- 工具:计算器工具,用于数学运算
- Verbose 模式:显示智能体的推理过程
- 最大迭代次数:防止智能体陷入无限循环
python
from langchain.agents import create_agent
from langchain.tools import tool
from langchain_core.prompts import PromptTemplate
from langchain_google_genai import ChatGoogleGenerativeAI
import math
from dotenv import load_dotenv
# 加载环境变量
load_dotenv()
# 初始化 LLM
llm = ChatGoogleGenerativeAI(
model="gemini-2.5-flash",
temperature=0 # 较低温度可提高工具调用的一致性
)
# 创建安全的计算器函数
@tool
def calculate(expression: str) -> str:
"""安全地计算数学表达式"""
try:
# 仅允许 math 模块中的安全函数
allowed_names = {
k: v for k, v in math.__dict__.items() if not k.startswith("__")
}
allowed_names['__builtins__'] = {'pow': pow}
# 安全检查:禁止危险关键词
if any(word in expression for word in ['import', 'exec', 'eval', 'open', 'file']):
return "无效表达式:包含受限关键词"
result = eval(expression, {"__builtins__": {}}, allowed_names)
return str(result)
except Exception as e:
return f"计算出错:{str(e)}"
# 构建 ReAct 提示模板
react_prompt = PromptTemplate.from_template("""尽你所能回答以下问题。你可以使用以下工具:
{tools}
请严格使用以下格式:
Question: 你需要回答的问题
Thought: 你应始终思考下一步该做什么
Action: 要执行的操作,必须是 [{tool_names}] 之一
Action Input: 操作的输入内容
Observation: 操作返回的结果
...(Thought/Action/Action Input/Observation 可重复 N 次)
Thought: 我现在知道最终答案了
Final Answer: 对原始问题的最终回答
开始!
Question: {input}
Thought: {agent_scratchpad}""")
# 创建智能体
agent = create_agent(model=llm, tools=[calculate])
# 测试用例
test_queries = [
"2847 的 15% 是多少?",
"如果我投资 10,000 美元,年利率 7%,5 年后复利本息合计是多少?",
"一个披萨有 8 片。如果有 3 个人每人吃了 2.5 片,还剩多少片?"
]
for query in test_queries:
print(f"\n{'=' * 50}")
print(f"问题:{query}")
print(f"{'=' * 50}")
try:
result = agent.invoke({"messages": [{"role": "user", "content": query}]})
print(f"\n最终答案:{result['messages'][-1].content}")
except Exception as e:
print(f"错误:{e}")
# 示例输出(verbose 模式下):
print(f"\n{'=' * 50}")
print("你在 verbose 模式下会看到类似如下输出:")
print(f"{'=' * 50}")
print("""
> Entering new AgentExecutor chain...
我需要计算 2847 的 15%。
Action: Calculator
Action Input: 2847 * 0.15
Observation: 427.05
Thought: 我现在知道最终答案了。
Final Answer: 2847 的 15% 是 427.05
""")
🔧构建多工具智能体:融合多种能力
同时支持网络搜索与计算的智能体
现在我们构建一个既能搜索信息又能执行计算的智能体。
🔍 可用工具:
- InfoSearch:模拟网络/Wiki 搜索(演示用)
- Calculator:数学计算
- 自动工具选择:智能体根据任务自动选用工具
- 无需 API 密钥:便于本地学习
python
from langchain.agents import create_agent
from langchain.tools import tool
from langchain_core.prompts import PromptTemplate
from langchain_google_genai import ChatGoogleGenerativeAI
import math
from dotenv import load_dotenv
load_dotenv()
llm = ChatGoogleGenerativeAI(model="gemini-2.5-flash", temperature=0)
# 计算器(同上)
@tool
def calculate(expression: str) -> str:
"""计算器"""
try:
allowed_names = {k: v for k, v in math.__dict__.items() if not k.startswith("__")}
allowed_names['__builtins__'] = {'pow': pow}
if any(word in expression for word in ['import', 'exec', 'eval', 'open', 'file']):
return "无效表达式"
result = eval(expression, {"__builtins__": {}}, allowed_names)
return str(result)
except Exception as e:
return f"计算出错:{str(e)}"
# 信息搜索工具
@tool
def search_info(query: str) -> str:
"""信息搜索"""
mock_data = {
"tokyo population": "东京都市圈人口约 3740 万(2024 年)",
"japan population": "日本总人口约 1.248 亿(2024 年)",
}
query_lower = query.lower()
for key, value in mock_data.items():
key_words = key.split()
if all(word in query_lower for word in key_words):
return value
return f"未找到关于 '{query}' 的具体信息。请尝试换种说法。"
# 多工具 ReAct 提示模板(强调格式规范)
react_prompt = """尽你所能回答以下问题。你可以使用以下工具:
{tools}
请严格使用以下格式:
Question: 你需要回答的问题
Thought: 你应始终思考下一步该做什么
Action: 要执行的操作,必须是 [{tool_names}] 之一
Action Input: 操作的输入内容
Observation: 操作返回的结果
...(可重复多次)
Thought: 我现在知道最终答案了
Final Answer: 对原始问题的最终回答
重要:必须使用以下确切格式:
Action: 工具名称
Action Input: 你的输入
禁止写成 Action: 工具名称(输入) 或其他形式。
示例:
Question: 2 + 2 等于多少?
Thought: 我需要计算 2 + 2
Action: Calculator
Action Input: 2 + 2
Observation: 4
Thought: 我现在知道最终答案了
Final Answer: 2 + 2 等于 4
开始!
Question: {input}
Thought: {agent_scratchpad}"""
# 创建智能体
agent = create_agent(
model=llm,
tools=[search_info, calculate],
system_prompt=react_prompt
)
# 测试需多工具协作的问题
test_query = "东京的人口是多少?占日本总人口的百分比是多少?"
print(f"\n{'=' * 60}")
print(f"问题:{test_query}")
print(f"{'=' * 60}")
try:
result = agent.invoke({"messages": [{"role": "user", "content": test_query}]})
print(f"\n最终答案:{result['messages'][-1].content}")
except Exception as e:
print(f"错误:{e}")
# verbose=True 会显示类似以下推理过程:
"""
> Entering new AgentExecutor chain...
我需要先查东京人口,再查日本总人口,最后计算百分比。
Action: InfoSearch
Action Input: Tokyo population
Observation: 东京都市圈人口约 3740 万(2024 年)
...
"""
💡 工具选择逻辑:
智能体根据任务智能选择工具:
- 需要信息 → 调用 InfoSearch
- 需要计算 → 调用 Calculator
- 多步骤问题 → 自动组合多个工具
- 出错时 → 尝试不同策略重试
🎯 预期结果:
智能体将完成完整多工具流程:
- InfoSearch:查东京人口 → 3740 万
- InfoSearch:查日本总人口 → 1.248 亿
- Calculator:计算百分比 → 3740 / 12480 × 100 ≈ 30%
- Final Answer:东京人口约 3740 万,约占日本总人口的 30%
📖 代码说明: - Mock InfoSearch:无需真实 API,适合教学
- 智能匹配:基于关键词匹配,支持多种问法
- 多工具协同:智能体自动调度工具顺序
- 生产就绪:只需替换 mock 数据为真实 API 即可上线
⚠️ 故障排查:
若搜索失败,可能原因:
- 查询措辞不匹配 mock 数据
- 超过最大迭代次数(max_iterations=5)
解决方案:扩充 mock_data 或接入真实搜索 API。
如何在 Python 中为 LangChain 智能体创建自定义工具
构建领域专用工具
为你的业务场景量身定制工具。
🔍 自定义工具要素:
- @tool 装饰器:将函数标记为智能体工具
- 类型注解:帮助智能体理解输入/输出类型
- 文档字符串(Docstring):描述工具用途与使用方式
- 错误处理:优雅降级
代码直接参考上面的示例
LangChain 智能体类型:为你的场景选择合适的智能体
不同智能体类型针对不同应用场景进行了优化:
| 智能体类型 | 适用场景 | 推理风格 | 性能特点 | 工具支持 |
|---|---|---|---|---|
ZERO_SHOT_REACT_DESCRIPTION |
通用任务 | 显式推理步骤 | 平衡性好 | 支持任意工具 |
CONVERSATIONAL_REACT_DESCRIPTION |
聊天应用 | 更自然对话 | 适合多轮对话 | 内置对话历史 |
STRUCTURED_CHAT_ZERO_SHOT_REACT_DESCRIPTION |
复杂工具输入 | 结构化格式 | 适合多参数工具 | 支持复杂工具 |
SELF_ASK_WITH_SEARCH |
研究/问答 | 问题分解 | 擅长复杂查询 | 需搭配搜索工具 |
💡 选择建议:
- 初学者:首选 ZERO_SHOT_REACT_DESCRIPTION
- 聊天机器人:用 CONVERSATIONAL_REACT_DESCRIPTION
- 复杂工具(如多参数 API):选 STRUCTURED_CHAT 变体
- 深度研究任务:用 SELF_ASK_WITH_SEARCH
智能体开发最佳实践
工具设计
- 编写清晰、详细的工具 docstring
- 使用明确的参数名和类型注解
- 优雅处理错误,返回友好提示
- 遵循单一职责原则(一个工具只做一件事)
智能体配置
- 设置合理的 max_iterations 防止死循环
- 使用较低 temperature 提高工具调用稳定性
- 开发阶段启用 verbose=True 便于调试
- 实现完善的错误处理与日志记录
常见智能体模式
- 研究智能体:网络搜索 + 计算器 + 摘要生成 → 综合研究
- 商务助理:数据库查询 + 邮件通知 + 日历集成 + 报表生成
- DevOps 智能体:服务器监控 + 部署工具 + 日志分析 + 告警管理
下一步
你已掌握智能体与工具集成!接下来,你将学习 文档处理与文本切分 ------ 这是构建强大 RAG(检索增强生成)应用的基础,让你的 AI 能够理解和利用文档与知识库。