一架梯子,一头程序猿,仰望星空!
LangChain教程(Python版本) > 内容正文

LangChain 输出解析器


输出解析器

LLM语言模型输出内容是文本格式,但是开发AI应用的时候,我们希望能拿到的是格式化的内容,例如结果转成目标对象,数组等,方便程序处理。这就需要LangChain提供的输出解析器(Output parser)格式化模型返回的内容。

输出解析器作用是用于是格式化语言模型返回的结果。一个输出解析器必须实现两种必要的方法:

  • “get_format_instructions”: 返回一个字符串,其中包含要求语言模型应该返回什么格式内容的提示词。
  • “parse”: 将模型返回的内容,解析为目标格式。

Pydantic 解析器

下面是LangChain封装的核心输出解析器PydanticOutputParser,该解析器是基于python的pydantic库。

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

from langchain.output_parsers import PydanticOutputParser
from pydantic import BaseModel, Field, validator
from typing import List
# 初始化大模型,这里使用openai
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
# 初始化解析器
parser = PydanticOutputParser(pydantic_object=Joke)
# 创建提示词模板,里面包含要求模型返回指定格式的提示词指令,返回格式提示词由parser.get_format_instructions(),解析器提供。
prompt = PromptTemplate(
    template="回答用户查询。\\n{format_instructions}\\n{query}\\n",
    input_variables=["query"],
    partial_variables={"format_instructions": parser.get_format_instructions()}
)
# 提供一个查询参数,渲染提示词模板,获取最终的提示词。
joke_query = "讲个笑话。"
_input = prompt.format_prompt(query=joke_query)
# 调用模型
output = model(_input.to_string())
# 调用解析器解析模型返回结果
parser.parse(output)
# 解析器解析后的结果,已经转换为前面定义的Joke对象
Joke(setup='为什么鸡会穿越马路?', punchline='为了到达对面!')

列表解析器

如果模型返回的数据是逗号分割的列表数据,可以使用此输出解析器。

from langchain.output_parsers import CommaSeparatedListOutputParser
from langchain.prompts import PromptTemplate, ChatPromptTemplate, HumanMessagePromptTemplate
from langchain.llms import OpenAI
from langchain.chat_models import ChatOpenAI
# 定义解析器
output_parser = CommaSeparatedListOutputParser()
# 获取模型输出格式提示词
format_instructions = output_parser.get_format_instructions()
# 定义提示词模板,嵌入格式指令
prompt = PromptTemplate(
    template="列出5个{subject}。\\n{format_instructions}",
    input_variables=["subject"],
    partial_variables={"format_instructions": format_instructions}
)
# 初始化OpenAI模型
model = OpenAI(temperature=0)
# 渲染提示词模板,调用模型
_input = prompt.format(subject="冰淇淋口味")
output = model(_input)
# 调用解析器格式化模型输出
output_parser.parse(output)
# 格式化后的模型输出

['香草',
     '巧克力',
     '草莓',
     '薄荷巧克力脆片',
     '曲奇和奶油']


关联主题