引言
在现代人工智能的开发中,工具调用(或称为函数调用)正在改变我们与AI模型交互的方式。通过定义一个工具调用模式,我们可以使模型输出与用户定义的结构相匹配,从而更加高效地处理复杂的任务。在本文中,我们将探讨工具调用的机制、其实现方式,并提供实用的代码示例。
主要内容
什么是工具调用?
工具调用让模型能够响应给定的提示,生成符合用户自定义模式的输出。尽管工具调用名字暗示模型执行某个动作,但实际上,模型只是生成工具参数,而实际运行工具的责任在用户手中。例如,你可以给模型一个“提取”工具来从非结构化文本中提取输出。
工具调用的结构
一个工具调用包括以下元素:
- name:工具的名称。
- arguments dict:参数名和参数值的字典。
- optional identifier:可选的标识符。
支持工具调用的供应商
多家供应商如Anthropic、Cohere、Google、Mistral和OpenAI都支持工具调用功能。不同供应商对工具模式和工具调用的格式有不同的约定。
使用LangChain定义工具
LangChain提供了一套标准的接口供定义工具、传递给LLM,并表示工具调用。
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代理服务提高访问稳定性
llm_with_tools = llm.bind_tools(tools)
代码示例
以下是使用工具调用的完整代码示例:
# 使用API代理服务提高访问稳定性
from langchain_core.messages import HumanMessage, ToolMessage
query = "What is 3 * 12? Also, what is 11 + 49?"
messages = [HumanMessage(query)]
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"]))
print(messages)
常见问题和解决方案
挑战1:模型输出格式不规范
一些情况下,模型可能会输出格式不正确的工具调用。例如,参数值不是有效的JSON。可以使用InvalidToolCall
和output parsers
进一步处理输出。
挑战2:流式处理中的工具调用
在流式处理上下文中,工具调用可能会跨多个消息块传递。使用tool_call_chunks
可以有效地拼接这些块。
总结和进一步学习资源
工具调用为AI模型提供了一种更加灵活和有效的交互方式。我们可以通过学习OpenAI Tools output parsers以及如何构建呼叫工具的链和代理,进一步提升自己的技能。
参考资料
如果这篇文章对你有帮助,欢迎点赞并关注我的博客。您的支持是我持续创作的动力!
—END—