langchain 输出解析器 Output Parser

示例中使用的公共代码:

python 复制代码
from langchain_deepseek import ChatDeepSeek
chat = ChatDeepSeek(
    model="deepseek-chat",
    temperature=0,
    api_key=API_KEY,
)

使用方法:

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

1. 列表

python 复制代码
# 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. 枚举

python 复制代码
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

python 复制代码
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格式

python 复制代码
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()},
)
python 复制代码
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'}]}]}
'''
python 复制代码
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. 自定义

python 复制代码
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

相关推荐
动能小子ohhh32 分钟前
Langchain从零开始到应用落地案例[AI智能助手]【3】---使用Paddle-OCR识别优化可识别图片进行解析回答
人工智能·python·pycharm·langchain·ocr·paddle·1024程序员节
L_cl5 小时前
【大模型应用开发 6.LangChain多任务应用开发】
langchain
weixin_438077491 天前
langchain_neo4j 以及 neo4j (windows-community) 的学习使用
windows·langchain·neo4j
Miku163 天前
从0到1,构建你的专属AI知识库:My-Chat-LangChain项目深度解析
人工智能·langchain
玲小珑3 天前
LangChain.js 完全开发手册(十七)实战综合项目三:个性化学习助手平台
langchain·ai编程
bst@微胖子4 天前
Langchain之Agent代理的使用
langchain
猫头虎4 天前
openAI发布的AI浏览器:什么是Atlas?(含 ChatGPT 浏览功能)macOS 离线下载安装Atlas完整教程
人工智能·macos·chatgpt·langchain·prompt·aigc·agi
工藤学编程4 天前
零基础学AI大模型之LangChain PyPDFLoader实战与PDF图片提取全解析
人工智能·langchain·pdf
Qiuner4 天前
快速入门LangChain4j Ollama本地部署与阿里百炼请求大模型
语言模型·langchain·nlp·llama·ollama
大模型教程5 天前
一套完整的 RAG 脚手架,附完整代码,基于LangChain
程序员·langchain·llm