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()