用Output Parsers解析大模型的回答

输出解析器(0utput parsers)负责接收大型语言模型(LLM)的输出,并将其转换为更适合的格式。当你使用LLM生成任何形式的结构化数据时,这一点非常有用。

除了拥有大量不同类型的输出解析器之外,LangChain输出解析器的一个显著优势是许多解析器支持流式处理。

简单来说就是:模型输出------>结构化数据。

如果你正在从事或者你正打算从事大模型应用相关研发,我想你都能明白结构化数据输出的重要性。

 

LangChain 有许多不同类型的输出解析器。这是 LangChain 支持的输出解析器列表。下表包含各种信息:

  • 名称: 输出解析器的名称
  • 支持流式处理: 输出解析器是否支持流式处理。
  • 有格式说明: 输出解析器是否有格式说明。通常在以下情况下可用: (a) 所需的模式未在提示中指定,而是在其他参数中(如 OpenAI 函数调用),或 (b) 当 OutputParser 包装另一个 OutputParser 时。
  • 调用 LLM: 此输出解析器是否自己调用大型语言模型。通常只有那些试图纠正格式错误输出的输出解析器才会这样做。
  • 输入类型: 预期的输入类型。大多数输出解析器适用于字符串和消息,但某些(如 OpenAI 函数)需要带有特定关键字参数的消息。
  • 输出类型: 解析器返回的对象的输出类型。
  • 描述: 我们对这个输出解析器的评论以及何时使用它。
名称 支持流式处理 有格式说明 调用大型语言模型 输入类型 输出类型 描述
JSON   str | 消息 JSON对象 返回指定的JSON对象。您可以指定一个Pydantic模型,它将返回该模型的JSON。可能是获取不使用函数调用的结构化数据的最可靠输出解析器。
XML   str | 消息 dict 返回标签的字典。当需要XML输出时使用。与擅长编写XML的模型(如Anthropic的模型)一起使用。
CSV   str | 消息 List[str] 返回以逗号分隔的值的列表。
OutputFixing     str | 消息   包装另一个输出解析器。如果该输出解析器出错,则会将错误消息和错误输出传递给大型语言模型,并请求其修复输出。
RetryWithError     str | 消息   包装另一个输出解析器。如果该输出解析器出错,则会将原始输入、错误输出和错误消息传递给大型语言模型,并请求其修复。与OutputFixingParser相比,这个还会发送原始说明。
Pydantic     str | 消息 pydantic.BaseModel 接受用户定义的Pydantic模型,并以该格式返回数据。
YAML     str | 消息 pydantic.BaseModel 接受用户定义的Pydantic模型,并以该格式返回数据。使用YAML进行编码。
PandasDataFrame     str | 消息 dict 对于使用pandas DataFrame进行操作非常有用。
枚举     str | 消息 Enum 将响应解析为提供的枚举值之一。
日期时间     str | 消息 datetime.datetime 将响应解析为日期时间字符串。
结构化     str | 消息 Dict[str, str] 一种输出解析器,返回结构化信息。它的功能不如其他输出解析器强大,因为它只允许字段为字符串。当您使用较小的LLM时,这可能会很有用。

 

 

JsonOutputParser

import os
from dotenv import find_dotenv, load_dotenv
from langchain.prompts import PromptTemplate
from langchain_community.llms.tongyi import Tongyi
from langchain_core.output_parsers import JsonOutputParser  # json格式的

# 通义获取api key
load_dotenv(find_dotenv())
DASHSCOPE_API_KEY = os.environ["DASHSCOPE_API_KEY"]

model = Tongyi(
    model_name='qwen-max',
    model_kwargs={'temperature': 0.01},

)

parser = JsonOutputParser()  # 用于解析大模型的输出内容

format_instructions = parser.get_format_instructions()

# 创建一个提示词模版
prompt = PromptTemplate(
    template="Answer the user query.\n{format_instructions}\n{query}\n",
    input_variables=["query"],
    partial_variables={"format_instructions": format_instructions},
)


#  这种方写法, 模板-->model-->json输出
chain = prompt | model | parser

prompt = prompt.format(query="给我讲个武松打猪的故事。")
res = chain.invoke(prompt)

print(res["response"])

输出解析器是帮助将语言模型响应结构化的类。它们必须实现两个主要方法

get_format_instructions

(获取格式指令): 一个返回字符串的方法,该字符串包含如何格式化语言模型输出的指令。 

parser.get_ format instructions()

parse(解析): 一个方法,它接受一个字符串(假定为来自语言模型的响应)并将其解析成某种结构。 

output = model.invoke(prompt.format(query="给我讲个100字的笑话"))
output
parser.parse(output)
type(parser.parse(output))

 

 PydanticOutputParser

import os
from dotenv import find_dotenv, load_dotenv
from langchain.prompts import PromptTemplate
from langchain_community.llms.tongyi import Tongyi
from langchain_core.output_parsers import JsonOutputParser, PydanticOutputParser  # json格式的
from langchain_core.pydantic_v1 import BaseModel,Field, validator


# 通义获取api key
load_dotenv(find_dotenv())
DASHSCOPE_API_KEY = os.environ["DASHSCOPE_API_KEY"]


model = Tongyi(model_name='qwen-max', model_kwargs={'temperature': 0.01})

# 定义期望的数据结构。
class Joke(BaseModel):
    content: str = Field(description="笑话的内容")
    reason: str = Field(description="为什么好笑")


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

format_instructions = parser.get_format_instructions()

prompt = PromptTemplate(
    template="参考下面的格式,回答用户的问题.\n{format_instructions}\n{query}\n",
    input_variables=["query"],
    partial_variables={"format_instructions": format_instructions},
)

prompt = prompt.format(query="给我讲个武松打猪的故事。")
# print(prompt)


# 调用大模型。
res = model.invoke(prompt)


joke_job = parser.parse(res)
print(joke_job)

# 可以根据返回的格式,字符串内容,直接拿到对应的数据。
print(joke_job.content)
print(joke_job.reason)

 

 

posted @ 2025-01-02 14:45  王竹笙  阅读(177)  评论(0)    收藏  举报