Skip to main content

Pydantic(JSON)解析器

此输出解析器允许用户指定任意的JSON模式并查询符合该模式的JSON输出。

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

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

from langchain.prompts import (
PromptTemplate,
ChatPromptTemplate,
HumanMessagePromptTemplate,
)
from langchain.llms import OpenAI
from langchain.chat_models import ChatOpenAI

API参考:

from langchain.output_parsers import PydanticOutputParser
from pydantic import BaseModel, Field, validator
from typing import List

API参考:

model_name = "text-davinci-003"
temperature = 0.0
model = OpenAI(model_name=model_name, temperature=temperature)
# 定义您所需的数据结构。
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()},
)

_input = prompt.format_prompt(query=joke_query)

output = model(_input.to_string())

parser.parse(output)
Joke(setup='为什么小鸡要过马路?', punchline='为了到达另一边!')
# 这是另一个示例,但带有复合类型的字段。
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()},
)

_input = prompt.format_prompt(query=actor_query)

output = model(_input.to_string())

parser.parse(output)
Actor(name='汤姆·汉克斯', film_names=['阿甘正传', '拯救大兵瑞恩', '绿里奇迹', '荒岛余生', '玩具总动员'])