Skip to content

自定义工具 (Tools)

虽然 LangChain 社区提供了大量现成的工具(如 Google Search, Wikipedia, Calculator),但在实际业务中,你几乎总是需要自定义工具来连接你的内部 API 或数据库。

使用 @tool 装饰器 (推荐)

这是定义工具最简单的方法。LangChain 会自动解析函数的名称、参数类型和文档字符串(Docstring)来生成工具的描述,这对于 LLM 正确使用工具至关重要。

基础示例

python
from langchain_core.tools import tool

@tool
def get_weather(city: str) -> str:
    """查询指定城市的天气情况。"""
    # 这里可以是真实的 API 调用
    return f"{city} 的天气是晴天,25摄氏度。"

# 查看生成的工具模式 (JSON Schema)
print(get_weather.args)
# 输出: {'city': {'title': 'City', 'type': 'string'}}

多参数示例

python
@tool
def calculate_loan(amount: float, rate: float, years: int) -> float:
    """
    计算贷款的月供。
    
    Args:
        amount: 贷款总额
        rate: 年利率 (例如 0.05)
        years: 贷款年限
    """
    # 简化的计算逻辑
    return amount * (1 + rate) / (years * 12)

手动绑定工具 (Binding Tools)

在不使用 Agent 的情况下,你也可以直接让 Chat Model 拥有调用工具的能力。这被称为 "Tool Calling" 或 "Function Calling"。

python
from langchain_openai import ChatOpenAI

tools = [get_weather]
llm = ChatOpenAI(model="gpt-3.5-turbo")

# 将工具绑定到模型
llm_with_tools = llm.bind_tools(tools)

# 调用模型
response = llm_with_tools.invoke("北京天气怎么样?")

# 模型不会直接返回文本,而是返回一个 tool_calls 对象
print(response.tool_calls)
# 输出: [{'name': 'get_weather', 'args': {'city': '北京'}, 'id': '...'}]

拿到 tool_calls 后,你可以手动执行对应的函数,并将结果再次传回给模型(这就构成了 Agent 的基础循环)。


开发完成后,如何监控和调试?最后一章带你了解:回调与追踪 (Callbacks)

LangChain中文文档