探索工具调用和函数调用:提升你的AI模型功能

198 阅读3分钟

探索工具调用和函数调用:提升你的AI模型功能

工具调用(Tool Calling),有时也称为函数调用(Function Calling),是现代大型语言模型(LLM)中的一种强大特性。它允许模型通过生成与用户定义模式匹配的输出来响应给定的提示。虽然名为工具调用,但实际上模型只是在生成工具的参数,是否执行工具由用户决定。在本文中,我将带你深入理解工具调用的原理和实现,并通过代码示例演示如何在实际应用中使用工具调用。

主要内容

1. 工具调用的基本概念

工具调用允许大型语言模型在响应用户请求时生成与特定工具模式匹配的输出。每个工具调用由一个名称、参数字典和一个可选的标识符组成。多个LLM提供商,如OpenAI、Google、Anthropic等,都支持工具调用特性,并且实现方式各不相同。

2. LangChain中的工具调用

LangChain是一个支持定义自定义工具并将其绑定到LLM的框架。工具调用的实现方式通常包括使用装饰器和Pydantic来定义工具的模式。以下代码展示了如何使用LangChain定义和绑定工具:

from langchain_core.tools import tool

@tool
def add(a: int, b: int) -> int:
    """Adds two numbers."""
    return a + b

@tool
def multiply(a: int, b: int) -> int:
    """Multiplies two numbers."""
    return a * b

tools = [add, multiply]

3. 将工具绑定到LLM

工具可以通过bind_tools方法绑定到支持工具调用的LLM模型上。

from langchain_openai import ChatOpenAI
import os

os.environ["OPENAI_API_KEY"] = "your_openai_key"

llm = ChatOpenAI(model="gpt-4o") # 使用API代理服务提高访问稳定性
llm_with_tools = llm.bind_tools(tools)

4. 工具调用的流处理

流处理允许模型在生成结果的同时调用工具。工具调用的结果可以被解析成原始的Pydantic类。

from langchain_core.output_parsers.openai_tools import PydanticToolsParser

query = "What is 3 * 12? Also, what is 11 + 49?"
chain = llm_with_tools | PydanticToolsParser(tools=[multiply, add])
result = chain.invoke(query)

代码示例

以下示例展示了如何在Model生成的工具调用中实际调用工具,并将工具结果返回给Model:

from langchain_core.messages import HumanMessage, ToolMessage

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"]))
messages

常见问题和解决方案

  1. 模型输出的工具调用有时可能格式不正确:在这种情况下,使用InvalidToolCall来检查问题,并在需要时使用输出解析器进行额外处理。

  2. 工具调用的流处理:并不是所有提供商目前都支持流处理。因此在设计时需要验证支持情况。

总结和进一步学习资源

工具调用在构建复杂的模型功能时提供了极大的灵活性和可扩展性。通过使用LangChain和其他框架,你可以有效地利用工具调用特性来增强模型的功能。以下是一些推荐的学习资源:

参考资料

  1. LangChain GitHub Repository
  2. OpenAI API Documentation

如果这篇文章对你有帮助,欢迎点赞并关注我的博客。您的支持是我持续创作的动力!

---END---