跳至内容

Pydantic 解析器

该解析器允许用户指定任意 Pydantic 模型,并查询与该模型匹配的输出。

请记住,大型语言模型是有泄漏的抽象!您必须使用容量足够的语言模型来生成格式良好的 JSON。在 OpenAI 系列中,DaVinci 可以可靠地实现这一点,但 Curie 的能力已经显著下降。

使用 Pydantic 声明数据模型。Pydantic 的 BaseModel 类似于 Python 中的 dataclass,但具有实际的类型检查和强制转换。

from typing import List

from langchain.output_parsers import PydanticOutputParser
from langchain_core.prompts import PromptTemplate
from langchain_core.pydantic_v1 import BaseModel, Field, validator
from langchain_openai import ChatOpenAI
model = ChatOpenAI(temperature=0)
# 定义您所需的数据结构。
class Joke(BaseModel):
    setup: str = Field(description="用以引出笑话的问题")
    punchline: str = Field(description="解答笑话的答案")

    # 您可以使用 Pydantic 轻松添加自定义验证逻辑。
    @validator("setup")
    def question_ends_with_question_mark(cls, field):
        if field[-1] != "?":
            raise ValueError("问题形式不正确!")
        return field


# 还有一个查询意图,用于提示语言模型填充数据结构。
joke_query = "告诉我一个笑话。"

# 设置解析器并将指令注入到提示模板中。
parser = PydanticOutputParser(pydantic_object=Joke)

prompt = PromptTemplate(
    template="回答用户查询。\n{format_instructions}\n{query}\n",
    input_variables=["query"],
    partial_variables={"format_instructions": parser.get_format_instructions()},
)

chain = prompt | model | parser

chain.invoke({"query": joke_query})
# 这里是另一个示例,但使用复合类型的字段。
class Actor(BaseModel):
    name: str = Field(description="演员姓名")
    film_names: List[str] = Field(description="他们主演的电影名称列表")


actor_query = "生成随机演员的电影作品列表。"

parser = PydanticOutputParser(pydantic_object=Actor)

prompt = PromptTemplate(
    template="回答用户查询。\n{format_instructions}\n{query}\n",
    input_variables=["query"],
    partial_variables={"format_instructions": parser.get_format_instructions()},
)

chain = prompt | model | parser

chain.invoke({"query": actor_query})

查看 PydanticOutputParser 的 API 文档。