OpenAI 工具(Tools)
这些输出解析器从 OpenAI 的函数调用 API 响应中提取工具调用。这意味着它们只能用于支持函数调用的模型,并且特指最新的 tools 和 tool_choice 参数。在阅读本指南之前,我们建议你先熟悉 函数调用。
有几种不同的输出解析器变体:
- JsonOutputToolsParser (opens in a new tab):以 JSON 形式返回函数调用的参数
- JsonOutputKeyToolsParser (opens in a new tab):以 JSON 形式返回函数调用中特定键的值
- PydanticToolsParser (opens in a new tab):以 Pydantic 模型形式返回函数调用的参数
from langchain_core.prompts import ChatPromptTemplate
from langchain_core.pydantic_v1 import BaseModel, Field, validator
from langchain_openai import ChatOpenAIclass Joke(BaseModel):
"""Joke to tell user."""
setup: str = Field(description="question to set up a joke")
punchline: str = Field(description="answer to resolve the joke")model = ChatOpenAI(model="gpt-3.5-turbo", temperature=0).bind_tools([Joke])model.kwargs["tools"][{'type': 'function',
'function': {'name': 'Joke',
'description': 'Joke to tell user.',
'parameters': {'type': 'object',
'properties': {'setup': {'description': 'question to set up a joke',
'type': 'string'},
'punchline': {'description': 'answer to resolve the joke',
'type': 'string'}},
'required': ['setup', 'punchline']}}}]prompt = ChatPromptTemplate.from_messages(
[("system", "You are helpful assistant"), ("user", "{input}")]
)JsonOutputToolsParser
from langchain.output_parsers.openai_tools import JsonOutputToolsParserparser = JsonOutputToolsParser()chain = prompt | model | parserchain.invoke({"input": "tell me a joke"})[{'type': 'Joke',
'args': {'setup': "Why don't scientists trust atoms?",
'punchline': 'Because they make up everything!'}}]要包含工具调用 id,我们可以指定 return_id=True:
parser = JsonOutputToolsParser(return_id=True)
chain = prompt | model | parser
chain.invoke({"input": "tell me a joke"})[{'type': 'Joke',
'args': {'setup': "Why don't scientists trust atoms?",
'punchline': 'Because they make up everything!'},
'id': 'call_Isuoh0RTeQzzOKGg5QlQ7UqI'}]JsonOutputKeyToolsParser
它只从返回的响应中提取单个键。当你传入单个工具并且只想要它的参数时,这很有用。
from typing import List
from langchain.output_parsers.openai_tools import JsonOutputKeyToolsParserparser = JsonOutputKeyToolsParser(key_name="Joke")chain = prompt | model | parserchain.invoke({"input": "tell me a joke"})[{'setup': "Why don't scientists trust atoms?",
'punchline': 'Because they make up everything!'}]某些模型每次调用可以返回多个工具调用,因此默认情况下输出是一个列表。如果我们只想返回第一个工具调用,可以指定 first_tool_only=True:
parser = JsonOutputKeyToolsParser(key_name="Joke", first_tool_only=True)
chain = prompt | model | parser
chain.invoke({"input": "tell me a joke"}){'setup': "Why don't scientists trust atoms?",
'punchline': 'Because they make up everything!'}PydanticToolsParser
它构建在 JsonOutputToolsParser 之上,但会把结果传给一个 Pydantic 模型。这允许你在需要时做进一步的校验。
from langchain.output_parsers.openai_tools import PydanticToolsParserclass Joke(BaseModel):
"""Joke to tell user."""
setup: str = Field(description="question to set up a joke")
punchline: str = Field(description="answer to resolve the joke")
# 你可以用 Pydantic 轻松添加自定义校验逻辑。
@validator("setup")
def question_ends_with_question_mark(cls, field):
if field[-1] != "?":
raise ValueError("Badly formed question!")
return field
parser = PydanticToolsParser(tools=[Joke])model = ChatOpenAI(model="gpt-3.5-turbo", temperature=0).bind_tools([Joke])
chain = prompt | model | parserchain.invoke({"input": "tell me a joke"})[Joke(setup="Why don't scientists trust atoms?", punchline='Because they make up everything!')]