小杰-大模型(three)——RAG与Agent设计——Langchain-OutputParser输出解析器
1. Langchain-OutputParser输出解析器
1.1 OutputParser输出解析器是什么?
Langchain中的OutputParser是用于解析LLM(大语言模型)返回的文本结果的组件。
因为大模型通常会返回非结构化的自然语言,而在实际应用中,我们需要从这些文本中提取出特定的信息并进行后续处理。
“非结构化的自然语言”指的是由人以自由形式编写的文字,这些文字没有遵循任何特定的数据格式或规则。这种类型的文本信息包含了人类日常交流中使用的所有复杂性和变化性,包括但不限于语法、语义、上下文含义等。由于缺乏预定义的格式,这类文本对于计算机处理来说往往比较困难。
因此,OutputParser的作用就是将模型的输出解析成可编程的结构化数据,如列表、字典或特定的Python对象。
假设有一个大语言模型被用来回答用户的问题:“北京的天气怎么样?” 模型可能返回以下的回答:
- “北京今天天气晴朗,气温适中,建议外出活动。”
- “目前北京的天气非常好,阳光明媚,温度大约在20度左右。”
这两个回答虽然提供了相似的信息,但是表达方式不同,而且没有遵循固定的格式。如果应用程序需要从中提取具体的天气数据(比如温度、天气状况),就需要一个OutputParser来解析这段文本,并将其转换为结构化的格式,例如JSON对象:
{"city": "北京","weather": "晴朗","temperature": "20度","suggestion": "建议外出活动"
}
通过OutputParser,开发者可以方便地将LLM生成的内容转换为更适合编程的形式,使得与大模型的交互更加高效且可靠。
1.2 Langchain使用OutputParser
1.2.1 列表解析器
列表解析器用于将LLM输出的文本解析为Python列表格式。
比如,当LLM返回一个包含项目的自然语言段落时,我们可以通过列表解析器将其转换为Python的list类型,以便于后续处理。
列表解析器代码
partial_variables 是一个字典,其中键是模板中变量的名称,值是这些变量的固定值。这些变量在模板渲染时会被自动替换,而不需要在每次调用 format 方法时传递它们。
formatted_prompt发现,其实是修改了prompt给到大模型,让大模型能够理解prompt并输出。
跳转到 CommaSeparatedListOutputParser 下的 parse() 发现就是将用逗号输出的结果使用split解析成列表。
#列表解析器
from langchain_openai import ChatOpenAI
#导入列表解析器
from langchain.output_parsers import CommaSeparatedListOutputParser
##导入模板
from langchain_core.prompts import PromptTemplate
#构建聊天模型openai形式
chat_model=ChatOpenAI(openai_api_key="sk-bhpqpryfyiszcqwugbmjgvvccultcovcgbfbvauxnbbfkcdo", # 替换为你的实际API密钥base_url="https://api.siliconflow.cn/v1",model="Qwen/Qwen2.5-7B-Instruct"
)
#实例化 逗号分隔的列表解析器
parser=CommaSeparatedListOutputParser()
# 1.step 构建模板
prompt=PromptTemplate(template="回答用户问题。\n{format_instructions}\n{query}\n",input_variables=["query"],#获取解析器提示词partial_variables={"format_instructions":parser.get_format_instructions()}
)
#输入内容进行替换里面的变量
formatted_prompt=prompt.format(query="列出5种水果")
#使用模型生成响应
response=chat_model.invoke(formatted_prompt).content
#对结果进行解析
output=parser.parse(response)
# 打印输出结果
print(output)
1.2.2 datetime解析器
datetime解析器用于解析包含日期和时间的LLM输出。它可以将LLM返回的时间字符串转化为Python的datetime对象,从而便于进一步的时间计算和操作。
datetime解析器代码
#列表解析器
from langchain_openai import ChatOpenAI
#导入列表解析器
from langchain.output_parsers import DatetimeOutputParser
##导入模板
from langchain_core.prompts import PromptTemplate
#构建聊天模型openai形式
chat_model=ChatOpenAI(openai_api_key="sk-bhpqpryfyiszcqwugbmjgvvccultcovcgbfbvauxnbbfkcdo", # 替换为你的实际API密钥base_url="https://api.siliconflow.cn/v1",model="Qwen/Qwen2.5-7B-Instruct"
)
#实例化 逗号分隔的列表解析器
parser=DatetimeOutputParser()
# 1.step 构建模板
prompt=PromptTemplate(template="回答用户问题。\n{format_instructions}\n{query}\n",input_variables=["query"],#获取解析器提示词partial_variables={"format_instructions":parser.get_format_instructions()}
)
#输入内容进行替换里面的变量
formatted_prompt=prompt.format(query="香港回归时间")#提问query需要输入和时间相关的内容
#使用模型生成响应
response=chat_model.invoke(formatted_prompt).content
#对结果进行解析
output=parser.parse(response)
# 打印输出结果
print(output)
1.2.3 枚举解析器
枚举解析器用于将LLM的输出解析为预定义的枚举值。它通常用于限定LLM输出的范围,并确保返回的结果符合特定的枚举选项。
枚举解析代码
from langchain_openai import ChatOpenAI
#导入枚举解析器
from langchain.output_parsers import EnumOutputParser
#导入模板
from langchain_core.prompts import PromptTemplate
from enum import Enum #导入枚举
#构建聊天模型openai形式
chat_model=ChatOpenAI(
openai_api_key="sk-guhfryjjlfzlgpvmgzhqmpscibbfnsppglgpstvjpfnklbge", # 替换为你的实际API密钥
base_url="https://api.siliconflow.cn/v1",
model="Qwen/Qwen2.5-7B-Instruct"
)
#定义枚举
class Color(Enum):RED = "red"BLUE = "blue"YELLOW = "yellow"PURPLE = "purple"BLACK= "black"# 解析大模型的输出为枚举解析器
#实例化:枚举解析器
parser=EnumOutputParser(enum=Color)
# 1.step 构建模板
prompt=PromptTemplate(template="回答用户问题。请直接输出颜色的名称,如‘red’,‘blue’或yellow\n{format_instructions}\n{query}\n",input_variables=["query"],#获取解析器提示词partial_variables={"format_instructions":parser.get_format_instructions()}, # 获取解析器提示词
)
print(f"parser.get_format_instructions(): {parser.get_format_instructions()}")
formatted_prompt=prompt.format(query="黑色的头发是什么颜色?")#提问query需要输入和时间相关的内容
#生成响应
response=chat_model.invoke(formatted_prompt).content
#解析响应
output=parser.parse(response)
# 打印输出结果
print(output)
1.2.4 结构化输出解析器
结构化输出解析器用于解析具有特定结构的LLM输出,如JSON、CSV等。它可以预定义输出的结构,并确保LLM的输出能够符合该结构化格式。
结构化解析代码
from langchain_openai import ChatOpenAI
#导入枚举解析器
from langchain.output_parsers import StructuredOutputParser,ResponseSchema
#导入模板
from langchain_core.prompts import PromptTemplate
#构建聊天模型openai形式
chat_model=ChatOpenAI(
openai_api_key="sk-bhpqpryfyiszcqwugbmjgvvccultcovcgbfbvauxnbbfkcdo", # 替换为你的实际API密钥
base_url="https://api.siliconflow.cn/v1",
model="Qwen/Qwen2.5-7B-Instruct"
)#定义响应模式
response_schemas=[
ResponseSchema(name="weather",description="天气"),
ResponseSchema(name="event_name",description="事件名称"),
ResponseSchema(name="date",description="日期,格式为YYYY-MM-DD"),
ResponseSchema(name="city",description="南京")]#创建结构解析器
parser=StructuredOutputParser(response_schemas=response_schemas)
# 1.step 构建模板
prompt=PromptTemplate(template="回答用户问题。\n{format_instructions}\n{query}\n",input_variables=["query"],#获取解析器提示partial_variables={"format_instructions":parser.get_format_instructions()}, # 获取解析器提示词
)
# print(f"parser.get_format_instructions(): {parser.get_format_instructions()}")
formatted_prompt=prompt.format(query="北京奥运会是什么时候开幕的且当天的天气情况,在那个城市举办的?")#提问query需要输入和时间相关的内容
#生成响应
response=chat_model.invoke(formatted_prompt).content
#解析响应
output=parser.parse(response)
# 打印输出结果
print(output)
1.2.5 Pydantic(JSON)解析器
Pydantic解析器基于Pydantic库,用于将LLM的输出解析为JSON格式并转换为Pydantic模型。这种解析器特别适合需要将输出转化为特定的Python数据模型的场景,如处理API响应、数据库记录等。
假设有一个语言模型,该模型生成的输出是一个 JSON 字符串,表示用户的个人信息。使用 PydanticOutputParser 来解析这个 JSON 字符串并验证其格式。
当模型输出为:'{"id": 1, "name": "Alice", "email": "alice@example.com"}'时,被解析后:id=1 name='Alice' email='alice@example.com' is_active=True。
注意:Pydantic解析可能会出错解析器
代码解析器
from langchain_openai import ChatOpenAI
#导入枚举解析器
from langchain.output_parsers import PydanticOutputParser
#导入模板
from langchain_core.prompts import PromptTemplate
from pydantic import BaseModel,Field
#定义模型的输出
class EventDetails(BaseModel):#id: int = Field(..., gt=0) ... 该符号表明这个字段是必需的,用户在实例化模型时必须为其提供值,否则会触发验证错误event_name:str=Field(description="事件名称")#Field主要作用描述或者校验功能或者初始化初始值date:str=Field(description="日期")city:str = Field(description="城市")#构建聊天模型openai形式
chat_model=ChatOpenAI(
openai_api_key="sk-bhpqpryfyiszcqwugbmjgvvccultcovcgbfbvauxnbbfkcdo", # 替换为你的实际API密钥
base_url="https://api.siliconflow.cn/v1",
model="Qwen/Qwen2.5-7B-Instruct"
)# 创建Pydantic输出解析器
parser=PydanticOutputParser(pydantic_object=EventDetails)
# 1.step 构建模板
prompt=PromptTemplate(template="回答用户问题。\n{format_instructions}\n{query}\n",input_variables=["query"],#获取解析器提示词partial_variables={"format_instructions":parser.get_format_instructions()}, # 获取解析器提示词
)
# print(f"parser.get_format_instructions(): {parser.get_format_instructions()}")
formatted_prompt=prompt.format(query="北京奥运会是什么时候开幕?,那个城市")#提问query需要输入和时间相关的内容
#生成响应
response=chat_model.invoke(formatted_prompt).content
#解析响应
output=parser.parse(response)
# 打印输出结果
print(output)