核心模块(Modules)
模型 I/O(ModelIO)
输出解析器(OutputParsers)
类型(Types)
OpenAI工具(OpenaiTools)

OpenAI 工具(Tools)

这些输出解析器从 OpenAI 的函数调用 API 响应中提取工具调用。这意味着它们只能用于支持函数调用的模型,并且特指最新的 tools 和 tool_choice 参数。在阅读本指南之前,我们建议你先熟悉 函数调用。

有几种不同的输出解析器变体:

from langchain_core.prompts import ChatPromptTemplate
from langchain_core.pydantic_v1 import BaseModel, Field, validator
from langchain_openai import ChatOpenAI
class 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 JsonOutputToolsParser
parser = JsonOutputToolsParser()
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,我们可以指定 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 JsonOutputKeyToolsParser
parser = JsonOutputKeyToolsParser(key_name="Joke")
chain = prompt | model | parser
chain.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 PydanticToolsParser
class 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 | parser
chain.invoke({"input": "tell me a joke"})
[Joke(setup="Why don't scientists trust atoms?", punchline='Because they make up everything!')]