智能体与工具集成

构建能够推理、规划并使用工具解决复杂问题的智能 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 能够理解和利用文档与知识库。

相关推荐
JaydenAI4 小时前
[拆解LangChain执行引擎]基于Checkpoint的持久化
ai·langchain·agent·pregel
一切尽在,你来4 小时前
LangGraph 概览
人工智能·python·langchain·ai编程
小灵不想卷18 小时前
LangChain4 初体验
java·langchain·langchain4j
小锋学长生活大爆炸19 小时前
【教程】PicoClaw:在嵌入式设备上部署OpenClaw
docker·github·教程·工具·openclaw·picoclaw
Bill Adams20 小时前
深度解析 WebMCP:让网页成为 AI 智能体的工具库
人工智能·智能体·mcp
AI周红伟1 天前
周红伟:Agent Skills+OpenClaw+RAG+Agent+SeeDance2.0企业智能体智能体应用实战
人工智能·大模型·智能体·seedance
来两个炸鸡腿1 天前
【Datawhale组队学习202602】Hello-Agents task04智能体经典范式构建
人工智能·学习·大模型·智能体
JaydenAI1 天前
[拆解LangChain执行引擎]非常规Pending Write的持久化
python·langchain
AI周红伟1 天前
周红伟:企业大模型微调和部署, DeepSeek-OCR v2技术原理和架构,部署案例实操。RAG+Agent智能体构建
大数据·人工智能·大模型·ocr·智能体·seedance