LangChain 中的 输出解析器(Output Parser) 主要作用是:将大语言模型生成的原始文本转换为结构化的数据格式,方便后续程序处理。比如,你让模型输出一个 JSON、一个列表或某种特定格式的内容,输出解析器就负责把这些“文本结果”解析成对应的数据结构(如 Python 对象),以便你能在代码中继续使用这些结果。
1. StrOutputParser
from langchain_core.output_parsers import StrOutputParser
from langchain.schema import AIMessage
def demo():
parser = StrOutputParser()
# 大语言模型返回 AIMessage 类型的结果
# StrOutputParser 将 AIMessage 转换为 Str 类型
response = AIMessage(content='结果')
print(parser.invoke(response))
if __name__ == '__main__':
demo()
2. JsonOutputParser
from dotenv import load_dotenv
load_dotenv('llm.env')
from langchain_deepseek import ChatDeepSeek
from langchain_core.output_parsers import JsonOutputParser
def demo():
parser = JsonOutputParser()
# 1. 引导模型按照该格式输出
output_format = parser.get_format_instructions()
print(output_format)
prompt = f'分别输出中国、美国、日本的首都、建国时间、国土面积。按照下面格式输入:\n{output_format}'
response = ChatDeepSeek(model='deepseek-chat').invoke(prompt)
print(response.content)
# 2. 将模型输出结果解析为 Json 对象
try:
print(parser.invoke(response))
except Exception as e:
print('解析失败:', e)
if __name__ == '__main__':
demo()
3. XMLOutputParser
from dotenv import load_dotenv
load_dotenv('llm.env')
from langchain_deepseek import ChatDeepSeek
from langchain_core.output_parsers import XMLOutputParser
def demo():
parser = XMLOutputParser()
# pip install defusedxml
output_format = parser.get_format_instructions()
print(output_format)
model = ChatDeepSeek(model='deepseek-chat', temperature=0)
prompt = f'分别输出中国、美国、日本的首都、建国时间、国土面积。按照下面格式输入:\n{output_format}'
response = model.invoke(prompt)
print(parser.invoke(response))
if __name__ == '__main__':
demo()
4. BooleanOutputParser
BooleanOutputParser 是 LangChain 中的一种输出解析器,它的作用可以概括为:将语言模型输出的文本结果解析为布尔值(True 或 False)。
from langchain.output_parsers import BooleanOutputParser
def demo():
# 将大语言模型输出的文本转换为 bool 类型 Python 对象
parser = BooleanOutputParser(true_val='好评', false_val='差评')
print(parser.invoke('好评'))
print(parser.invoke('差评'))
# 注意:该输出解析器要求大模型输出的文本中包含好评、或者差评
print(parser.invoke('模型输出结果:好评'))
try:
# 如果不包含指定的 true_val 或者 false_val 文本,则解析失败
print(parser.invoke('模型输出结果:中性'))
# 如果同时包含 true_val 或者 false_val 文本,则解析失败
print(parser.invoke('用户输入的文本情感倾向为差评,也有可能是好评'))
except Exception as e:
print('解析失败:', e)
if __name__ == '__main__':
demo()
5. EnumOutputParser
EnumOutputParser 是 LangChain 中的一个输出解析器,其作用可以概括为:将语言模型的输出解析为预定义的枚举值(Enum 类型)。
from langchain.output_parsers import EnumOutputParser
from enum import Enum
class Sentiment(str, Enum):
POSITIVE = '好评'
NEGATIVE = '差评'
NEUTRAL = '中评'
def demo():
# 将大语言模型输出的文本转换为 enum 枚举类型的 Python 对象
parser = EnumOutputParser(enum=Sentiment)
print('引导模型按照格式输出的指令:\n', parser.get_format_instructions())
# 大模型的输出必须是 ['好评', '差评', '中评'] 三个枚举值其中一个,返回枚举对象 Sentiment.POSITIVE
print(parser.invoke('好评'))
print(parser.invoke('差评\n'))
print(parser.invoke('\n中评 \t'))
# 注意:必须是枚举值中的任意一个,下面的例子解析失败
try:
print(parser.invoke('预测结果:中评'))
except Exception as e:
print('解析失败:', e)
if __name__ == '__main__':
demo()
6. PydanticOutputParser
PydanticOutputParser 是 LangChain 中的输出解析器之一,其作用可以概括为:将语言模型的输出解析为符合 Pydantic 模型的数据结构(即结构化对象)。
from pydantic import BaseModel, Field
from langchain.output_parsers import PydanticOutputParser
class Person(BaseModel):
position : str = Field(description='水浒传人物的职务')
nickname : str = Field(description='水浒传人物的诨号')
def demo01():
parser = PydanticOutputParser(pydantic_object=Person)
# 获得格式指令
print('引导模型按照格式输出的指令:\n', parser.get_format_instructions())
print(format)
print('-' * 100)
# 需要引导大语言模型输出以下 json 格式数据,否则会出现解析错误
response = '{"position": "大将军", "nickname": "花和尚"}'
print(parser.invoke(response))
try:
response = '{"position1": "大将军", "nickname": "花和尚"}'
response = '"position": "大将军", "nickname": "花和尚"'
print(parser.invoke(response))
except Exception as e:
print('解析失败:', e)
from typing import List
class PeopleList(BaseModel):
people: List[Person]
def demo02():
parser = PydanticOutputParser(pydantic_object=PeopleList)
# 获得格式指令
print('引导模型按照格式输出的指令:\n', parser.get_format_instructions())
print(format)
print('-' * 100)
# 需要引导大语言模型输出以下 json 格式数据,否则会出现解析错误
response = '''
{
"people": [
{
"position": "大将军",
"nickname": "花和尚"
},
{
"position": "左将军",
"nickname": "豹子头"
}
]
}
'''
print(parser.invoke(response))
if __name__ == '__main__':
demo01()
demo02()
7. OutputFixingParser
OutputFixingParser 是 LangChain 中的一个特殊输出解析器,它的作用可以概括为:在模型输出格式不正确时,自动尝试修复并重新解析为正确格式。它的工作原理是:
当你使用像 PydanticOutputParser 解析模型输出时,如果模型输出的 JSON 少了一个字段、用了错误的引号、字段名拼错了等,就会解析失败。这时候用上 OutputFixingParser,它会:
- 检测格式错误
- 调用语言模型重新修正格式
- 再交给原始解析器解析
from pydantic import BaseModel, Field
from langchain_deepseek import ChatDeepSeek
from langchain.output_parsers import PydanticOutputParser
from langchain.output_parsers import OutputFixingParser
from dotenv import load_dotenv
load_dotenv('llm.env')
class Person(BaseModel):
sex: str = Field(description='这是人的性别')
age: int = Field(description='这是人的年龄')
def demo():
llm = ChatDeepSeek(model='deepseek-chat')
base_parser = PydanticOutputParser(pydantic_object=Person)
# 使用 OutputFixingParser 包装 base_parser,增加自动修正能力
parser = OutputFixingParser.from_llm(parser=base_parser, llm=llm)
# 模拟一个 LLM 输出,但字段名称写错了
response = '{"gender": "哈哈", "age": 89}'
# 解析失败后,OutputFixingParser 会调用 LLM 尝试修正格式错误
print(parser.invoke(response))
if __name__ == '__main__':
demo()

冀公网安备13050302001966号