用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)
本文来自博客园,作者:王竹笙,转载请注明原文链接:https://www.cnblogs.com/edeny/p/18647688