langchain 输出解析器 Output Parser

发布于:2025-09-09 ⋅ 阅读:(18) ⋅ 点赞:(0)

示例中使用的公共代码:

from langchain_deepseek import ChatDeepSeek
chat = ChatDeepSeek(
    model="deepseek-chat",
    temperature=0,
    api_key=API_KEY,
)

使用方法:

  1. 引入解析器
  2. 实例化解析器
  3. 调用解析器的get_format_instructions()获得提示词,将提示词加入到请求的信息中
  4. 将实例化的解析器加入到链中

1. 列表

# 1. 引入解析器
from langchain.output_parsers import CommaSeparatedListOutputParser # 列表解析器
from langchain.prompts import PromptTemplate
#构造输入模版
template = "用户发起的提问:{question}{format_instructions}"

# 2. 实例化输出解析器
output_parser = CommaSeparatedListOutputParser()

# 3. 将输出解析器的解析格式作为提示词模版的部分内容
prompt = PromptTemplate.from_template(
    template,
    partial_variables={"format_instructions":output_parser.get_format_instructions()},
)
# 4. 将output_parser加入到链中
chain = prompt | chat | output_parser
chain.invoke({"question": "列出上海的三个景点"})
# 结果:['外滩', '豫园', '上海迪士尼度假区']

2. 枚举

from langchain.output_parsers.enum import EnumOutputParser
from langchain.prompts import PromptTemplate
from enum import Enum

#定义枚举类型
class Colors(Enum):
    RED = "红色"
    BROWN = "棕色"
    BLACK = "黑色"
    WHITE = "白色"
    YELLOW = "黄色"
    
#制定提示词模版
promptTemplate = PromptTemplate.from_template("{person}的皮肤主要是什么颜色? {instructions}")

#制定输出解析器
parse = EnumOutputParser(enum=Colors)
# 解析器的提示词是中英文混合,如果直接使用该提示词则最后返回的结果不是想要的结果
# instructions = parse.get_format_instructions() 
instructions = "响应结果请选择以下选项之一:红色、棕色、黑色、白色、黄色,注意:只返回颜色名称,不添加任何解释或额外内容。"

prompt = promptTemplate.partial(instructions=instructions)
chain = prompt | chat | parse
chain.invoke({"person":"亚洲人"})

# 结果: <Colors.YELLOW: '黄色'>

3. json

from langchain_core.output_parsers import JsonOutputParser
from langchain_core.pydantic_v1 import BaseModel,Field
from langchain.prompts import PromptTemplate
from typing import List

#定义JSON结构
class Book(BaseModel):
    title:str = Field(description="书名")
    author:str = Field(description="作者")
    description:str = Field(description="书的简介")
    beLike:List[str] = Field(description="作者的其他书籍的名称")
    
parser = JsonOutputParser(pydantic_object=Book)

prompt = PromptTemplate(
    template="{format_instructions}",
    input_variables=["query"],
    partial_variables={"format_instructions":parser.get_format_instructions()}
)

chain = prompt | chat | parser
chain.invoke({"query":"请给我介绍中国最有名的科幻小说"})

# 结果:
'''
{'title': '三体',
 'author': '刘慈欣',
 'description': '《三体》是刘慈欣创作的系列长篇科幻小说,讲述了地球人类文明与三体文明的信息交流、生死搏杀及两个文明在宇宙中的兴衰历程。作品以宏大的宇宙观和深刻的哲学思考,探讨了人类与外星文明的接触、科技发展对社会的影响以及宇宙文明的生存法则。',
 'beLike': ['球状闪电', '超新星纪元', '流浪地球', '乡村教师', '中国2185']}
'''

4. xml

使用xml解释器时有个奇怪的问题,如果将解释器的实例加入链中,则返回json格式,如果不加入链中,则返回xml格式

from langchain_core.prompts import PromptTemplate
from langchain_core.output_parsers import XMLOutputParser

parser = XMLOutputParser()
prompt = PromptTemplate(
    template="{query},\n 要求:返回结果必须符合{format_instructions}",
    input_variables=["query"],
    partial_variables={"format_instructions": parser.get_format_instructions()},
)
chain = prompt | chat | parser
response = chain.invoke({"query": "⽣成周星驰1994年的电影作品列表,有电影名称,上映时间,按照时间降序排列"})
print(response)
# 结果:
'''
{'movies': [{'movie': [{'title': '国产凌凌漆'}, {'release_date': '1994-10-13'}]}, {'movie': [{'title': '九品芝麻官'}, {'release_date': '1994-03-31'}]}, {'movie': [{'title': '破坏之王'}, {'release_date': '1994-02-03'}]}, {'movie': [{'title': '大话西游之月光宝盒'}, {'release_date': '1994-01-21'}]}]}
'''
chain1 = prompt | chat
response1 = chain1.invoke({"query": "⽣成周星驰1994年的电影作品列表,有电影名称,上映时间,按照时间降序排列"})
print(response1.content)
# 结果:
'''
<?xml version="1.0" encoding="UTF-8"?>
<movies>
  <movie>
    <title>国产凌凌漆</title>
    <release_date>1994-10-13</release_date>
  </movie>
  <movie>
    <title>九品芝麻官</title>
    <release_date>1994-03-31</release_date>
  </movie>
  <movie>
    <title>破坏之王</title>
    <release_date>1994-02-03</release_date>
  </movie>
  <movie>
    <title>大话西游之月光宝盒</title>
    <release_date>1994-01-21</release_date>
  </movie>
</movies>
'''

5. 布尔

BooleanOutputParser:这个解析器专门用于解析布尔值(即对错、真假)的输出。例如,当模型输出是 True 或 False 时,该解析器可以准确识别和处理。

6. 时间

DatetimeOutputParser:该解析器用于处理日期和时间的输出。它能够将模型生成的日期时间字符串解析为标准的日期时间格式,方便后续处理。

7. 列表对象

ListOutputParser:当输出是一个列表时,无论是什么类型的列表,都可以使用这个解析器进行解析。它能将模型生成的列表字符串转换为实际的列表对象。

8. Pydantic

PydanticOutputParser:如果你的输出需要符合 Pydantic 的要求(Pydantic 是一个用于数据验证和转换的库),那么这个解析器就能派上用场。它可以确保输出数据符合预定义的数据模型和验证规则。

9. StructuredOutputParser

StructuredOutputParser:对于具有特定结构的输出,这个解析器可以大显身手。它能够处理复杂的结构,并将模型生成的结构化数据解析为易于使用的格式。

10. 自定义

from typing import Iterator
from langchain_core.messages import AIMessage,AIMessageChunk

#自定义输出解析器
def parse(ai_message:AIMessage)->str:
    return ai_message.content.swapcase()
# 链式调用chat,返回的结果作为下一个链的参数,也就是ai_message,调用parse方法
chain = chat | parse
response = chain.invoke("用英语回答,你是谁")
response
# 结果: 'i AM dEEPsEEK-v3, AN ai ASSISTANT CREATED BY dEEPsEEK. mY PURPOSE IS TO HELP ANSWER YOUR QUESTIONS, PROVIDE INFORMATION, AND ASSIST WITH VARIOUS TASKS. fEEL FREE TO ASK ME ANYTHING! 😊'

11. 字符串

StrOutputParser


网站公告

今日签到

点亮在社区的每一天
去签到