示例中使用的公共代码:
from langchain_deepseek import ChatDeepSeek
chat = ChatDeepSeek(
model="deepseek-chat",
temperature=0,
api_key=API_KEY,
)
使用方法:
- 引入解析器
- 实例化解析器
- 调用解析器的
get_format_instructions()
获得提示词,将提示词加入到请求的信息中 - 将实例化的解析器加入到链中
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