介绍

大型语言模型(LLM)的原始输出是自由格式的文本。但在实际的项目开发中,我们往往需要将这些文本转换为结构化的数据(如 Python 对象、字典、列表)或进行特定的格式处理,以便后续的程序逻辑能够方便地使用。Output Parsers 就是专门用来解决这个问题的工具

为什么需要“输出解析器”

常规的使用LangChain构建LLM应用的流程是:Prompt 输入、调用LLM 、LLM输出。有时候我们期望LLM给到的数据是格式化的数据,方便做后续的处理。

这时就需要在Prompt里设置好要求,然后LLM会在输出内容后,再将内容传给输出解析器,输出解析器会解析成我们预期的格式。

再比如:

在实际的AI应用开发中,可能经常遇到这样的问题:很多时候大语言模型输出格式不够标准化,有时候返回的是纯文本,有时候是JSON格式,甚至还可能包含一些不需要的冗余信息,如:

Human:帮我生成一个商品信息的json字符串,格式是:{"name": "苹果", "price": "1000"}
AI:好的,已经为你生成:{"name": "橘子", "price": "500"}

但实际上,我们期望的是只返回一个JSON字符串,AI却返回了一些多余的文字,为了解决这个问题,LangChain提供了输出解析器(Output Parsers)组件,可以帮助我们将模型的原始输出转换为结构化的、易于处理的数据格式,这一步不仅仅涉及数据类型的转换,也包括对返回数据的处理。

输出解释器的作用


  输出解释器在 LangChain 工作流中起到以下关键作用:

1、结构化输出:
     将 LLM 的自由文本输出(如一段话)转换为结构化格式(如字典或对象),便于程序处理。例如,将 LLM 输出的“城市:深圳,天气:多云,温度:26-31°C”解析为 {"city": "深圳", "weather": "多云", "temperature": "26-31°C"}。
 2、提高一致性:
      确保 LLM 输出符合预定义的格式或模式,减少输出不一致导致的错误。
例如,强制 LLM 返回 JSON 格式,而不是不规则的文本。
3、错误处理:
         提供解析错误反馈,提示 LLM 重新生成符合格式的输出。
         如果 LLM 输出不符合预期 JSON 结构,解释器可以抛出错误并触发重试。
4、简化下游处理:
         结构化输出便于与数据库、API 或其他系统集成。例如,解析后的 JSON 数据可以直接存储5、增强提示词效果:
          输出解释器通常与提示词模板(如 PromptTemplate 或 FewShotPromptTemplate)结合使用,通过明确指定输出格式,指导 LLM 生成符合预期的回答。

输出解释器的工作原理

1、定义输出格式:
     使用解释器指定期望的输出结构(例如 JSON schema 或 Pydantic 模型)。在提示词中明确要求 LLM 按指定格式输出。
2、解析 LLM 输出:
      LLM 生成原始文本后,解释器对其进行解析,提取所需字段或验证格式。如果输出不符合要求,解释器可能抛出错误或尝试修复。
3、返回结构化数据:
       解释器将解析后的数据返回为 Python 对象(如字典、列表或 Pydantic 对象),供后续处理。4、使用场景:
        1、问答系统:将 LLM 的回答解析为结构化格式(如 JSON),便于存储或显示。
        2、数据提取:从 LLM 输出中提取特定字段(如名称、日期、数字)。
        3、API 集成:将 LLM 输出转换为 API 所需的格式。
        4、任务自动化:确保 LLM 输出符合特定任务的要求(如分类结果、翻译文本)。

此外,所有的 Output Parser 都是 Runnable 对象,这意味着它们可以无缝地集成到 LangChain Expression Language (LCEL) 的链式调用中,使用 | 操作符进行组合,并天然支持 invoke, stream, batch 等异步和流式操作。

解析器有哪些

基础解析器:

StrOutputParser - 字符串解析器,提取纯文本内容
JsonOutputParser - JSON 解析器,确保输出为 JSON 对象
XMLOutputParser - XML 解析器,处理 XML 格式数据
CommaSeparatedListOutputParser - CSV 解析器,返回列表格式
DatetimeOutputParser - 日期时间解析器,处理时间数据
高级解析器:

EnumOutputParser - 枚举解析器,限定输出为预定义值
StructuredOutputParser - 结构化解析器,转换为字典格式
OutputFixingParser - 修复解析器,自动修正格式错误
RetryOutputParser - 重试解析器,失败时自动重试
\

字符串解析器StrOutputParser: 最基础的文本提取器

适用场景: 当你只需要从 LLM 的回复中提取纯文本时,尤其是在使用支持工具调用(Tool Calling)的聊天模型时。因为工具调用的返回结果是一个复杂的列表,StrOutputParser 能自动帮你提取出其中的文本部分。StrOutputParser 是LangChain中最简单的输出解析器,它直接从AIMessage的content中提取纯文本内容。在前面的章节中,其实已经使用过它,代码示例如下,在示例中使用了链式调用,在后续的文章

使用deepseek的话,注册deepseek账号,开通权限。

例子一

import os

from dotenv import load_dotenv
from langchain_core.output_parsers import StrOutputParser,JsonOutputParser
from langchain_openai import ChatOpenAI
from pydantic import SecretStr
from langchain_core.prompts import ChatPromptTemplate
#提示词
load_dotenv()

llm = ChatOpenAI(
    base_url="https://api.deepseek.com/v1",
    model="deepseek-chat",
    api_key=SecretStr(os.environ["DEEPSEEK_API_KEY"]),
)
prompt_template = ChatPromptTemplate.from_messages([
 ("system","您是AI程序员"),
 ("user","{input}")
])

outputparser = StrOutputParser()
chain = prompt_template | llm| outputparser
# 直接调用大模型
result = chain.invoke({"input": "langchain是什么?"})
print(result)

例子二



import os

from dotenv import load_dotenv
from langchain_core.output_parsers import StrOutputParser,JsonOutputParser
from langchain_openai import ChatOpenAI
from pydantic import SecretStr
from langchain_core.prompts import ChatPromptTemplate
#提示词
load_dotenv()

llm = ChatOpenAI(
    base_url="https://api.deepseek.com/v1",
    model="deepseek-chat",
    api_key=SecretStr(os.environ["DEEPSEEK_API_KEY"]),
)

# 1.构建提示词
prompt = ChatPromptTemplate.from_messages([
    ("system", "你是一个资深文学家"),
    ("human", "请简短赏析{name}这首诗,并给出评价")
])



# 3.创建字符串输出解析器
parser = StrOutputParser()


# 4.构建链式调用
chain = prompt | llm | parser
# 5.执行链式调用
result = chain.invoke({"name": "静夜思"})
print(f"输出类型: {type(result)}")
print(f"输出内容: {result}")
执行结果:

输出类型: <class 'str'>
输出内容: 《静夜思》是唐代诗人李白创作的一首脍炙人口的诗。这首诗以简练的语言,表达了诗人夜晚孤寂时对故乡的思念之情。

全诗四句:
**床前明月光,疑是地上霜。**
**举头望明月,低头思故乡。**

从诗的内容看,李白通过月光照在床前的景象,唤起了对故乡的无限思念。第一句“床前明月光”描绘了清冷、静谧的夜景,紧接着“疑是地上霜”巧妙地将月光与霜相比较,增加了诗的意境层次。接下来的“举头望明月”是对月亮的凝视,而“低头思故乡”则自然流露出诗人内心的乡愁。月亮作为传统的象征,承载了思乡之情,情感真挚而直接。

评价:
此诗语言简练、意境深远,既表现了李白的孤独感,也反映了他心中对故乡的深深依恋。其凝练的情感、清新的画面和强烈的乡愁,成就了这首诗的永恒魅力。

JsonOutputParser用法

当我们需要模型输出JSON格式数据时,可以使用 JsonOutputParser。这个解析器不仅能解析JSON格式,还能为模型提供输出指定格式的提示词。

JsonOutputParser 是一个非常常见的解析器,它确保LLM的输出符合预期的JSON格式。JSON格式作为一种轻量级的数据交换格式,被广泛应用于Web开发和数据传输。JsonOutputParser能够将LLM的自由文本输出解析为标准的JSON对象,便于后续的处理和存储。

使用场景:
API响应解析:很多应用都依赖API交换数据,返回的数据格式通常为JSON,使用JsonOutputParser可以方便地将模型输出转化为标准JSON格式。
数据存储:当需要将LLM的输出存入数据库或进行进一步的数据分析时,JSON格式通常是最合适的选择。
 

例子一

import os

from dotenv import load_dotenv
from langchain_core.output_parsers import StrOutputParser,JsonOutputParser
from langchain_openai import ChatOpenAI
from pydantic import SecretStr
from langchain_core.prompts import ChatPromptTemplate
#提示词
load_dotenv()

llm = ChatOpenAI(
    base_url="https://api.deepseek.com/v1",
    model="deepseek-chat",
    api_key=SecretStr(os.environ["DEEPSEEK_API_KEY"]),
)
prompt_template = ChatPromptTemplate.from_messages([
 ("system","您是AI程序员"),
 ("user","{input}")
])

#outputparser = StrOutputParser()
outputparser = JsonOutputParser()
chain = prompt_template | llm| outputparser
# 直接调用大模型

# chain.invoke({"input": "langchain是什么?"})
result = chain.invoke({"input": "langchain是什么? 问题用question,回答用answer,用json回复结果"})
print(result)

例子二

import os
from dotenv import load_dotenv
from langchain_core.output_parsers import StrOutputParser,JsonOutputParser
from langchain_openai import ChatOpenAI
from pydantic import SecretStr
from langchain_core.prompts import ChatPromptTemplate
#提示词
load_dotenv()
llm = ChatOpenAI(
    base_url="https://api.deepseek.com/v1",
    model="deepseek-chat",
    api_key=SecretStr(os.environ["DEEPSEEK_API_KEY"]),
)
from langchain_core.output_parsers import JsonOutputParser
from langchain_core.prompts import ChatPromptTemplate
from pydantic import BaseModel, Field
# 1.定义输出的对象结构
class Poetry(BaseModel):
    name: str = Field(description="古诗名字")
    content: str = Field(description="古诗内容")
    author: str = Field(description="古诗作者")
# 1.构建提示词
prompt = ChatPromptTemplate.from_messages([
    ("system", "你是一个资深文学家"),
    ("human", "请你输出题目为:{name}这首诗的内容\n{format_instructions}")
])
# 2.构建llm
llm = ChatOpenAI(
    base_url="https://api.deepseek.com/v1",
    model="deepseek-chat",
    api_key=SecretStr(os.environ["DEEPSEEK_API_KEY"]),
)
# 3.构建输出解析器
parser = JsonOutputParser(pydantic_object=Poetry)
# 4.构建链式调用
chain = prompt | llm | parser
# 5.执行链式调用
result = chain.invoke({"name": "登鹳雀楼", "format_instructions": parser.get_format_instructions()})
print(f"输出类型: {type(result)}")
print(f"输出内容: {result}")

例子三

import os
from dotenv import load_dotenv
from langchain_core.output_parsers import StrOutputParser,JsonOutputParser
from langchain_openai import ChatOpenAI
from pydantic import SecretStr
from langchain_core.prompts import ChatPromptTemplate
#提示词
load_dotenv()
llm = ChatOpenAI(
    base_url="https://api.deepseek.com/v1",
    model="deepseek-chat",
    api_key=SecretStr(os.environ["DEEPSEEK_API_KEY"]),
)
from langchain_core.output_parsers import JsonOutputParser
from langchain_core.prompts import ChatPromptTemplate
from pydantic import BaseModel, Field

# 2.构建llm
llm = ChatOpenAI(
    base_url="https://api.deepseek.com/v1",
    model="deepseek-chat",
    api_key=SecretStr(os.environ["DEEPSEEK_API_KEY"]),
)
# 创建提示模板
chat_prompt_template = ChatPromptTemplate.from_messages([
    ("system", "你是一个靠谱的{role}"),
    ("human", "{question}")
])

# 构造提示
prompt = chat_prompt_template.invoke(input={
    "role": "人工智能专家",
    "question": "人工智能用英文怎么说?问题用q表示,答案用a表示,返回一个JSON格式的数据"
})
# 调用模型和解析
response = llm.invoke(prompt)
parser = JsonOutputParser()
json_response = parser.invoke(response)
print(json_response)
# 输出示例: {'q': '人工智能用英文怎么说?', 'a': 'Artificial Intelligence'}

PydanticOutputParser

在大模型应用开发中,我们经常需要将模型输出的非结构化文本转换为程序可以直接处理的数据结构。这个过程如果手动实现,不仅繁琐易错,还难以保证数据的有效性。

Pydantic解析器主要解决以下几个核心问题:

  1. 结构化输出:将非结构化文本转为可编程对象,省去手动解析的麻烦
  2. 数据验证:自动验证字段类型和约束条件,单纯JSON解析器则不会校验
  3. 开发效率:减少手动解析代码,让开发者专注于业务逻辑
  4. 错误处理:内置异常捕获与修复机制,提高程序健壮性

想象一下,如果没有结构化解析,我们可能需要写大量的正则表达式或字符串处理代码来提取关键信息,还要手动进行类型转换和验证,这不仅效率低下,而且容易出错。

对于结构更复杂、具有强类型约束的需求,PydanticOutputParser 则是最佳选择。它结合了Pydantic模型的强大功能,提供了类型验证、数据转换等高级功能,使用示例如下:

示例一 诗歌信息格式化提取

import os
from dotenv import load_dotenv
from langchain_core.output_parsers import StrOutputParser, JsonOutputParser, PydanticOutputParser
from langchain_openai import ChatOpenAI
from pydantic import SecretStr, field_validator
from langchain_core.prompts import ChatPromptTemplate
#提示词
load_dotenv()
llm = ChatOpenAI(
    base_url="https://api.deepseek.com/v1",
    model="deepseek-chat",
    api_key=SecretStr(os.environ["DEEPSEEK_API_KEY"]),
)

from langchain_core.prompts import ChatPromptTemplate
from pydantic import BaseModel, Field,validator

# 2.构建llm
llm = ChatOpenAI(
    base_url="https://api.deepseek.com/v1",
    model="deepseek-chat",
    api_key=SecretStr(os.environ["DEEPSEEK_API_KEY"]),
)
# 诗人信息模型
class Poetry(BaseModel):
    name: str = Field(description="古诗名字")
    content: str = Field(description="古诗内容")
    author: str = Field(description="古诗作者")
# 诗歌信息模型
class Poet(BaseModel):
    name: str = Field(description="诗人姓名")
    age: int = Field(description="诗人年龄")
    sex: int = Field(description="性别,0女,1男")
    poetries: list[Poetry] = Field(description="诗歌信息列表")    # 数据验证器
    @field_validator("poetries")
    def validate_priority(cls, value):
        if len(value) < 1 :
            raise ValueError('诗歌列表必须大于等于1')
        return value
    @field_validator("age")
    def validate_hours(cls, value):
        if value <= 0:
            raise ValueError('年龄必须大于0')
        return value
# 1.构建提示词
prompt = ChatPromptTemplate.from_messages([
    ("system", "你是一个管理中国古代诗人信息的专家"),
    ("human", "请你介绍一下{name}这位诗人的情况\n{format_instructions}")
])
# 3.构建输出解析器
parser = PydanticOutputParser(pydantic_object=Poet)
# 4.构建链式调用
chain = prompt | llm | parser

# 5.执行链式调用
result = chain.invoke({"name": "李白", "format_instructions": parser.get_format_instructions()})
print(f"输出类型: {type(result)}")
print(f"输出内容: {result}")

示例二大模型信息输出提取

import os
from dotenv import load_dotenv
from langchain_core.output_parsers import StrOutputParser, JsonOutputParser, PydanticOutputParser
from langchain_openai import ChatOpenAI
from pydantic import SecretStr, field_validator
from langchain_core.prompts import ChatPromptTemplate
#提示词
load_dotenv()
llm = ChatOpenAI(
    base_url="https://api.deepseek.com/v1",
    model="deepseek-chat",
    api_key=SecretStr(os.environ["DEEPSEEK_API_KEY"]),
    temperature=0.3  # 降低随机性,使输出更稳定
)
from pydantic import BaseModel, Field
from langchain_core.output_parsers import PydanticOutputParser

# Step1: 定义Pydantic模型
class UserInfo(BaseModel):
    name: str = Field(description="用户姓名")
    age: int = Field(description="用户年龄", gt=0)  # gt=0表示年龄必须大于0
    hobbies: list[str] = Field(description="兴趣爱好列表")
# Step2: 创建解析器
parser = PydanticOutputParser(pydantic_object=UserInfo)
# Step3: 构建提示模板
from langchain_core.prompts import ChatPromptTemplate
prompt = ChatPromptTemplate.from_template("""
提取用户信息,严格按照格式要求输出,不要添加任何额外内容:
{format_instructions}
输入内容:
{input}
""")
# 注入格式指令
prompt = prompt.partial(
format_instructions=parser.get_format_instructions()
)
# Step4: 组合处理链
chain = prompt | llm | parser
# 执行解析
try:
    result = chain.invoke({
    "input": """
    我的名称是张三,年龄是18岁,兴趣爱好有打篮球、看电影。
    """
    })
    print(f"结果类型: {type(result)}")
    print(f"姓名: {result.name}")
    print(f"年龄: {result.age}")
    print(f"兴趣爱好: {result.hobbies}")
except Exception as e:
 print(f"解析出错: {e}")

案例三:电商评论情感分析系统

import os
from dotenv import load_dotenv
from langchain_core.output_parsers import StrOutputParser, JsonOutputParser, PydanticOutputParser
from langchain_openai import ChatOpenAI
from pydantic import SecretStr, field_validator, Field, BaseModel
from langchain_core.prompts import ChatPromptTemplate
import json
#提示词
load_dotenv()
llm = ChatOpenAI(
    base_url="https://api.deepseek.com/v1",
    model="deepseek-chat",
    api_key=SecretStr(os.environ["DEEPSEEK_API_KEY"]),
    temperature=0.3  # 降低随机性,使输出更稳定
)

# 定义JSON结构对应的Pydantic模型
class SentimentResult(BaseModel):
    sentiment: str = Field(description="情感倾向,只能是positive、negative或neutral")
    confidence: float = Field(description="情感分析的置信度,0到1之间的浮点数")
    keywords: list[str] = Field(description="评论中的关键词列表")
# 构建处理链
parser = JsonOutputParser(pydantic_object=SentimentResult)
prompt = ChatPromptTemplate.from_template("""
分析以下评论的情感倾向,确定情感是positive(正面)、negative(负面)还是neutral(中性),
计算情感分析的置信度(0到1之间),并提取评论中的关键词。
{input}
按照以下格式要求返回结果,不要添加任何额外内容:
{format_instructions}
""").partial(format_instructions=parser.get_format_instructions())
chain = prompt | llm | parser
# 执行分析
try:
    result = chain.invoke({"input": "物流很慢,包装破损严重,再也不会买了"})
    print(f"情感倾向: {result['sentiment']}")
    print(f"置信度: {result['confidence']}")
    print(f"关键词: {result['keywords']}")
# 验证结果类型
    print(f"\n情感类型验证: {isinstance(result['sentiment'], str)}")
    print(f"置信度类型验证: {isinstance(result['confidence'], float)}")
    print(f"关键词类型验证: {isinstance(result['keywords'], list)}")
except Exception as e:
 print(f"解析出错: {e}")
# 流式调用示例
print("\n===== 流式调用 =====")
try:
    for chunk in chain.stream({"input": "商品质量不错,价格合理,但物流有点慢"}):
        if chunk:
            print(f"收到 chunk: {json.dumps(chunk, ensure_ascii=False)}")
except Exception as e:
    print(f"流式解析出错: {e}")

代码解析:

  1. 模型定义:我们定义了SentimentResult模型,用于存储情感分析结果,包括情感倾向、置信度和关键词。

  2. 解析器选择:这里使用了JsonOutputParser,并通过pydantic_object参数指定了对应的Pydantic模型,这样既可以得到JSON格式的输出,又能进行数据验证。

  3. 提示设计:提示中明确要求模型分析情感倾向、计算置信度并提取关键词,使模型输出更符合我们的需求。

  4. 流式调用JsonOutputParser支持流式处理,可以逐步接收和处理模型的输出,这在需要实时展示结果的场景中非常有用。

自定义输出解析器

在某些情况下,LangChain提供的内置的解析器无法满足业务的要求,这时我们可以创建自定义的输出解析器,如下示例,在代码中创建了一个书名号自定义输出解析器,在 get_format_instructions 方法中,提供输出格式的提示词,并在parse方法中通过正则提取书名号包裹的内容,最终返回一个列表。

例子一

import dotenv
from langchain_core.output_parsers.base import BaseOutputParser
from langchain_core.exceptions import OutputParserException
import re
import os

from pydantic import SecretStr
from langchain_core.prompts import ChatPromptTemplate
from langchain_core.prompts import ChatPromptTemplate
from langchain_openai import ChatOpenAI

# 读取env配置
dotenv.load_dotenv()

llm = ChatOpenAI(
    base_url="https://api.deepseek.com/v1",
    model="deepseek-chat",
    api_key=SecretStr(os.environ["DEEPSEEK_API_KEY"]),
)
class BookTitleParser(BaseOutputParser):
    """自定义书名号内容解析器,用于提取《书名》格式的文本内容"""

    def get_format_instructions(self) -> str:
        return "请在回答中包含一个或多个被中文书名号《》包裹的内容,例如:《三体》《活着》"

    def parse(self, text: str) -> list:
        # 使用正则提取被《》包裹的内容
        pattern = r'《(.*?)》'
        titles = re.findall(pattern, text)

        if not titles:
            raise OutputParserException(f"未找到任何《书名号》格式的内容: {text}")
        return titles


# 1.构建提示词
prompt = ChatPromptTemplate.from_messages([
    ("system", "你是一个资深文学家"),
    ("human", "请你推荐5本关于{subject}的好书\n{format_instructions}")
])

# 3.构建输出解析器
parser = BookTitleParser()

# 4.构建链式调用
chain = prompt | llm | parser

# 5.执行链式调用
result = chain.invoke({"subject": "明朝历史", "format_instructions": parser.get_format_instructions()})
print(f"输出类型: {type(result)}")
print(f"输出内容: {result}")

XMLOutputParser输出解析器

XMLOutputParser 允许将LLM的输出转换为XML格式。XML(可扩展标记语言)是一种用于描述数据的标记语言,广泛应用于配置文件、数据交换等场景。XMLOutputParser能够将模型生成的文本转化为流行的XML格式,使得模型的输出与其他基于XML的数据处理系统兼容。

使用场景:
配置文件解析:许多应用程序的配置文件采用XML格式,使用该解析器可以轻松将LLM的输出转换为配置项。
数据交换:在需要与其他使用XML格式的数据交换系统进行通信时,XML格式的输出可以提供更好的兼容性。
 

import dotenv
import os
from pydantic import SecretStr
from langchain_openai import ChatOpenAI
# 读取env配置
dotenv.load_dotenv()
llm = ChatOpenAI(
    base_url="https://api.deepseek.com/v1",
    model="deepseek-chat",
    api_key=SecretStr(os.environ["DEEPSEEK_API_KEY"]),
)
from langchain_core.output_parsers import XMLOutputParser
actor = "周星驰"
response = llm.invoke(
    f"请生成{actor}的简短电影记录,将影片名称放在<movie></movie>标签中"
)
print(response.content)
# 输出示例:
# <movie>大话西游</movie>
# <movie>功夫</movie>
# <movie>喜剧之王</movie>

# 解析XML
parser = XMLOutputParser()
xml_response = parser.invoke(response)
print(xml_response)
# 输出为字典格式,方便程序处理

CommaSeparatedListOutputParser(CSV解析器)

CommaSeparatedListOutputParser(简称CSV解析器)将LLM的输出解析为以逗号分隔的列表(即CSV格式)。CSV格式是表格数据常用的一种格式,能够将多项数据以行列方式存储,非常适合需要批量处理或进一步分析的数据。

使用场景:
数据分析:当LLM的输出是多个数据项时,CSV格式能够很好地将这些数据条目组织成表格结构。
电子表格应用:将LLM输出直接转化为CSV格式,可以方便地导入到Excel或其他电子表格软件中进行进一步处理。
import os

from dotenv import load_dotenv
from langchain_core.output_parsers import StrOutputParser, JsonOutputParser, CommaSeparatedListOutputParser
from langchain_openai import ChatOpenAI
from pydantic import SecretStr
from langchain_core.prompts import ChatPromptTemplate, PromptTemplate

#csv解释器
load_dotenv()
llm = ChatOpenAI(
    base_url="https://api.deepseek.com/v1",
    model="deepseek-chat",
    api_key=SecretStr(os.environ["DEEPSEEK_API_KEY"]),
)
output_parser = CommaSeparatedListOutputParser()
# format_instructions = output_parser.get_format_instructions()
format_instructions = "您的响应应该是csv格式的逗号分隔值的列表,例如:'内容1, 内容2, 内容3'"
prompt = PromptTemplate(
    template=format_instructions + "\n请列出五个 {subject}。",
    input_variables=["subject"],
    partial_variables={"format_instructions": format_instructions},
)
chain = prompt | llm | output_parser
result = chain.invoke({"subject": "冰激凌口味"})
print(result)

EnumOutputParser枚举输出解析器示例

EnumOutputParser 是一个高级解析器,它将LLM的输出解析为预定义的枚举值。枚举通常用于限制数据值的范围,EnumOutputParser能够确保LLM的输出符合预先设定的枚举类型,保证输出的准确性和一致性。

使用场景:
多选题或问答系统:当模型的输出是有限的选项之一时,EnumOutputParser能够确保输出符合这些选项。
推荐系统:如产品推荐、类别筛选等,输出的类别通常为预定义的枚举值,使用该解析器可以避免输出无效的选项。
 

import os
from enum import Enum
from dotenv import load_dotenv
from langchain_classic.output_parsers import EnumOutputParser
from langchain_openai import ChatOpenAI
from pydantic import SecretStr
from langchain_core.prompts import PromptTemplate
import json
#提示词
load_dotenv()
llm = ChatOpenAI(
    base_url="https://api.deepseek.com/v1",
    model="deepseek-chat",
    api_key=SecretStr(os.environ["DEEPSEEK_API_KEY"]),
    temperature=0.3  # 降低随机性,使输出更稳定
)
#定义枚举类型
class Colors(Enum):
    RED = "红色"
    BROWN = "棕色"
    BLACK = "黑色"
    WHITE = "白色"
    YELLOW = "黄色"
# 制定输出解析器
parse = EnumOutputParser(enum=Colors)
# 制定提示词模版
promptTemplate = PromptTemplate.from_template(
    """{person}的皮肤主要是什么颜色?

    {instructions}"""
)
instructions = "响应结果请选择以下选项之一:红色、棕色、黑色、白色和黄色"
# 提示词部分补充
prompt = promptTemplate.partial(instructions=instructions)
chain = prompt | llm | parse
chain.invoke({"person": "亚洲人"})

输出解析器是LangChain框架中不可或缺的组件,它解决了大语言模型输出格式不规范的问题。通过本文的介绍,我们学习了基础解析器的使用从简单的StrOutputParser到复杂的PydanticOutputParser

我们还了解了结构化数据处理,通过JsonOutputParserPydanticOutputParser,可以将模型输出转换为结构化的Python对象、JSON对象,便于后续处理。当LangChain提供的内置解析器无法满足需求时,可以创建自定义解析器来处理特殊格式的数据。

在实际项目中,选择合适的输出解析器能够大大提升开发效率和数据处理的准确性。建议根据具体的业务需求,选择最适合的解析器类型,并结合错误处理机制确保系统的稳定性。

如何选择合适的输出解析器?

择合适的输出解析器需要根据应用的需求来决定。如果需要简单的文本输出,StrOutputParser 就足够了;如果需要结构化的数据,JsonOutputParser 或 StructuredOutputParser 更加合适;而在容错要求较高的场景中,OutputFixingParser 或 RetryOutputParser 可以提供额外的保障。
 

Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐