1. 工具使用(Tool Use)的核心价值与实现原理
在构建智能体系统时,我们经常会遇到一个关键瓶颈:语言模型虽然能生成流畅的文本,但无法直接访问实时数据或执行精确计算。这就好比一个知识渊博的顾问被关在隔音室里——他知道很多,但无法获取最新信息,也无法帮你实际操作任何事情。
工具使用(Tool Use)模式通过Function Calling机制解决了这个问题。它的核心思想是让语言模型具备"思考-决策-执行"的能力闭环:
- 思考阶段:模型分析用户请求,判断是否需要调用外部工具
- 决策阶段:选择最合适的工具并提取调用参数
- 执行阶段:由系统实际运行工具代码
- 反馈阶段:将执行结果返回给模型进行下一步处理
这种模式最典型的应用场景包括:
- 实时数据查询(股票价格、天气信息)
- 精确数学计算
- 数据库/API操作
- 代码执行与验证
关键设计原则:模型只负责"决策"(是否调用、调用哪个、传什么参数),不参与实际执行。这种职责分离既保证了安全性,又充分发挥了模型的理解能力。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. LangGraph中的工具调用实现架构
LangGraph采用状态机模型来管理工具调用的完整生命周期。其架构包含以下几个关键组件:
2.1 状态定义与消息传递
python复制class ToolUseState(TypedDict):
messages: Annotated[list[BaseMessage], add_messages]
状态的核心是消息列表,采用追加式更新(add_messages)。这种设计支持多轮对话和工具调用,完整保留交互历史。消息类型包括:
- HumanMessage:用户输入
- AIMessage:模型响应(可能包含tool_calls)
- ToolMessage:工具执行结果
2.2 工具定义规范
使用@tool装饰器定义工具时,需要特别注意三个要素:
- 清晰的docstring:说明工具用途和适用场景
- 明确的参数类型:帮助模型正确提取参数
- 安全的返回值:确保结果可被模型理解
python复制@tool
def get_stock_price(ticker: str) -> float:
"""查询指定股票代码的最新(模拟)价格。
参数:
ticker: 股票代码,如AAPL、GOOGL
返回:
当前股价(浮点数)
示例:
get_stock_price("AAPL") → 178.15
"""
# 实现逻辑...
2.3 核心工作流程
-
初始化阶段:
- 构建工具列表
- 准备系统提示词
- 创建状态图(StateGraph)
-
执行阶段:
mermaid复制graph TD A[START] --> B[Agent节点] B --> C{有tool_calls?} C -->|是| D[ToolNode] C -->|否| E[END] D --> B -
终止条件:
当模型生成的AIMessage不再包含tool_calls时,流程结束。
3. 实战:构建研究助理智能体
3.1 环境准备与工具实现
首先安装必要依赖:
bash复制pip install langgraph langchain-core
然后实现三类核心工具:
信息检索工具:
python复制@tool
def search_information(query: str) -> str:
"""事实信息检索工具"""
knowledge_base = {
"法国首都": "巴黎",
"伦敦天气": "多云,15°C",
# 其他知识条目...
}
return knowledge_base.get(query, "未找到相关信息")
股票查询工具:
python复制stock_data = {
"AAPL": 178.15,
"GOOGL": 142.32,
# 其他股票数据...
}
@tool
def get_stock_price(ticker: str) -> float:
"""股票价格查询工具"""
if ticker not in stock_data:
raise ValueError(f"未知股票代码: {ticker}")
return stock_data[ticker]
数学计算工具:
python复制import re
from math import *
@tool
def calculate_expressio
