趋近智
尽管基础代理通常依赖解析大型语言模型(LLM)的文本输出来决定下一步动作及其参数,但这种方法容易出错且可能出现不一致。LLM每次响应的格式可能略有不同,或者解析逻辑可能无法正确提取复杂参数。对于要求较高可靠性的生产系统,许多现代LLM提供了一种更直接的机制:结构化工具调用,OpenAI等一些提供商常称之为函数调用。
模型支持结构化工具调用时,不会生成描述调用工具的自由形式文本(例如,“我应该使用搜索工具,查询为‘LangChain内存’”),而是能输出一条特定指令,通常以JSON格式呈现,明确指示要调用哪个工具以及传递哪些参数。LLM经过专门训练,能够识别用户请求何时需要调用可用工具之一,并根据预设架构生成参数。
这比文本解析有很大的改进,原因如下:
LangChain 提供了抽象层,用于处理跨不同LLM提供商(如OpenAI、Google Gemini、Anthropic Claude等)的结构化工具调用功能,让您可以定义一次工具并在兼容模型和代理中使用它们。
主要组件包括:
bind_tools等方法将您可用工具的架构附带到LLM或聊天模型实例。这会告知模型在推理时可用的能力。create_tool_calling_agent 等构造器,这些构造器专门设计用于使用这些模型功能。在现代生产架构中,它们通常通过 LangGraph 进行编排,LangGraph 处理状态和通信循环,将工具架构传递给LLM并解释结构化的工具调用响应。您的工具定义的清晰度和准确性是影响LLM有效使用它们的关键因素。
使用函数和装饰器:
一种常见方法是定义一个标准Python函数,并使用LangChain的@tool装饰器(或StructuredTool.from_function)。
from langchain_core.tools import tool
from pydantic import BaseModel, Field # 可选,用于复杂参数
@tool
def get_stock_price(symbol: str) -> float:
"""
获取给定股票代码的当前股价。
用于获取最新的金融市场数据。
"""
# 替换为实际的API调用逻辑
print(f"正在获取 {symbol} 的价格...")
if symbol.upper() == "LC":
return 125.50
elif symbol.upper() == "AI":
return 300.10
else:
return 404.0 # 表示未找到
# 代理现在将能够访问此工具
# LangChain 会根据函数签名和文档字符串自动生成架构。
类型提示 symbol: str 告知LLM symbol 参数应为字符串。文档字符串非常重要;它作为提供给LLM的描述,指导LLM决定何时使用该工具。
使用Pydantic处理复杂参数: 对于具有多个参数或复杂输入结构的工具,为参数定义Pydantic模型可以提供更好的结构和验证。
from langchain_core.tools import tool
from pydantic import BaseModel, Field
import datetime
class WeatherRequestArgs(BaseModel):
location: str = Field(..., description="城市和州,例如:旧金山,加利福尼亚")
date: datetime.date = Field(..., description="天气预报的具体日期")
@tool(args_schema=WeatherRequestArgs)
def get_weather_forecast(location: str, date: datetime.date) -> str:
"""提供特定地点和日期的天气预报。"""
# 实际实现会调用天气API
print(f"正在获取 {date} {location} 的天气...")
return f" {date} {location} 的预报:晴,25\u00b0C"
# LangChain 使用 WeatherRequestArgs 为 LLM 生成详细的 JSON 架构。
在这种情况下,args_schema 参数将Pydantic模型与工具明确关联,确保LLM接收到预期输入结构的清晰定义,包括每个字段的描述。
当使用配置为结构化工具调用的代理时,典型的执行循环如下所示:
代理使用结构化工具调用时的执行流程。LLM直接输出一个结构化请求,代理解析该请求并使用它来调用正确的工具实现。
{ "tool": "get_stock_price", "tool_input": {"symbol": "LC"} })。如果不需要工具,它会生成一个最终文本响应。get_stock_price)并提取参数({"symbol": "LC"})。然后它调用相应的Python函数(get_stock_price(symbol="LC"))。125.50)。处理工具错误和代理恢复)中所述。通过使用结构化工具调用,您将摆脱脆弱的文本解析,转向LLM推理能力与应用程序自定义功能之间更可靠、可预测的交互。这是构建生产就绪代理的一大步,这些代理能够有效且一致地执行涉及外部交互的复杂任务。
简洁的语法。内置调试功能。从第一天起就可投入生产。
为 ApX 背后的 AI 系统而构建
这部分内容有帮助吗?
© 2026 ApX Machine Learning用心打造