LangChain 输出解析

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 中的一种输出解析器,它的作用可以概括为:将语言模型输出的文本结果解析为布尔值(TrueFalse)。

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,它会:

  1. 检测格式错误
  2. 调用语言模型重新修正格式
  3. 再交给原始解析器解析

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()
未经允许不得转载:一亩三分地 » LangChain 输出解析
评论 (0)

2 + 3 =