LangChain-5.输出解析
5.LangChaiin输出解析
在LangChain的广阔天地中,数据解析不仅是一种技术,更是一门艺术。本章将通过一系列示例,深入了解CSV、日期时间、枚举以及XML格式解析器的奥秘,以及如何自定义解析器以满足特定的需求。
本章将从CommaSparatedListOutputParser开始,学习如何将逗号分隔的字符串转换为Python列表,简化数据处理流程。随后,将探索DatetimeOutputParser,掌握如何将文本输出转换为Python的datetime对象,为时间序列分析和时间管理提供强有力的支持。
接着介绍EnumOutputParser,它能确保聊天机器人的输出严格符合预定义的枚举类型,为需要严格选项控制的场景提供解决方案。XMLOutputParser的介绍将展示如何将文本输出转换为结构化的XML格式,为数据的进一步处理和系统集成铺平道路。
最后,本章将介绍如何掌握自定义解析器。通过实现RunnableLambda或RunnableGenerator,可以自由定制模型输出地处理逻辑,无论是带下写翻转还是将关键词替换,LangChain都能助你一臂之力。
5.1 CSV格式解析器
本节将探讨如何在LangChain框架下使用CommaSparatedListOutputParser处理和解析以逗号分隔的列表(CSV)格式数据。通过一个具体的应用示例–列出冰淇淋口味,详细说明如何创建和使用这种类型的解析器。
5.1.1 理解CommaSparatedListOutputParser
CommaSparatedListOutputParser是LangChain提供的一种输出解析器,专门应用解析模型输出,将字符串格式的输出转为Python列表。该解析器非常适合处理需要以列表形式提取多个项目的场景。
解析器的基本工作原理氛围输入和输出两个部分。
- 输入是一个表示项列表的字符串,项之间由逗号分隔。
- 输出是一个Python列表,其中包含所有解析出的项。
5.1.2 配置输出解析器
在使用CommaSparatedListOutputParser前,需进行一些基本配置。以下是配置步骤。
(1)实例化解析器
创建CommaSparatedListOutputParser实例,该实例将用于后续的解析操作。
from langchain.output_parsers import CommaSeparatedListOutputParser
output_parser = CommaSeparatedListOutputParser()
(2)获取格式指导
为了向用户清晰地说明期望的输入格式,可以使用解析器的get_format_instructions方法获取格式指导信息,LangChain默认的格式指导信息都是英文的。所以如果需要再中文场景中使用,应尽量转为中文的格式指导信息,操作代码如下。
format_instructions = output_parser.get_format_instructions()
print(format_instructions)
输出如下。
Your response should be a list of comma separated values, eg: `foo, bar, baz` or `foo,bar,baz`
5.1.3 创建Prompt模板
接下来,定义一个PromptTemplate。这个模板将指导模板如何提问,以活得符合CSV格式的输出。
custom_format_instructions = "您的响应应该是csv格式的逗号分隔值的列表,列如:`内容1,内容2,内容3`"
prompt = PromptTemplate(
template="""
回答用户的问题:
请列出五个{subject}
{format_instructions}""",
input_variables=["subject"],
partial_variables={"format_instructions": custom_format_instructions}
)
5.1.4 应用解析器
通过链接PromptTemplate、模型调用,以及CommaSeparatedListOutputParser,可以构建一个处理链,从用户请求中生成并解析模型的输出。
llm = ChatOpenAI(
temperature=0.3,
model="deepseek-chat",
openai_api_key="",
openai_api_base="https://api.deepseek.com"
)
result = prompt | llm | output_parser
5.1.5示例应用:列出冰淇淋口味
现在使用哦古剑的处理链处理具体的请求–列出冰淇淋口味,示例代码如下。
list = result.invoke({"subject": "冰淇淋口味"})
print(list)
print(type(list))
print(list[0])
运行结果如下:
['香草', '巧克力', '草莓', '抹茶', '薄荷巧克力']
<class 'list'>
香草
这个结果展示了从输入到模型处理再到解析输出的完整流程,用户得到了一个清晰、格式化的列表,可用于进一步的应用,如数据分析、用户界面展示等。
通过本节的讲解,可以理解和实现一个基于LangChain的CSV格式解析器。CommaSeparatedListOutputParser不仅提高了数据处理的效率,也优化了数据的呈现方式,是的从模型输出到用户实际可用的数据转换变得简单快捷。
5.2 日期时间格式解析器
在处理语言模型的输出时,将信息转换成结构化数据是一项常见且重要的任务。特别实在需要从模型的文本输出中提取日期和时间信息时,这种转换显得尤为关键。本节将探讨如何使用DatetimeOutputParser实现这一点,这是一种专为LLM输出解析为日期时间格式而设计的解析器。
DatetimeOutputParser是一个强大的工具,它能够将LLM的文本输出转换为Python的datetime.datetime对象。这使得处理和分析日期时间数据变得更加直观和方便。该解析器的设计目标是识别和解析符合特定模式的日期时间字符串。
要有效使用DatetimeOutputParser,首先需要明确输出的格式化要求。这些要求指导LLM以一种特定的方式格式化其输出,确保可以被DatetimeOutputParser正确解析。
在LangChain框架中,DatetimeOutputParser可以与其他组件一起链式调用,以实现从问题到解析日期时间的端到端流程,示例代码如下。
from langchain.output_parsers import DatetimeOutputParser
from langchain.prompts import PromptTemplate
from langchain_openai import ChatOpenAI
if __name__ == '__main__':
output_parser = DatetimeOutputParser()
print(output_parser.get_format_instructions())
prompt = PromptTemplate(
template="""回答用户的问题:
{subject}
{format_instructions}""",
input_variables=["subject"],
partial_variables={"format_instructions": output_parser.get_format_instructions()}
)
print(prompt.format(subject="比特币是什么时候创立的"))
llm = ChatOpenAI(
temperature=0.3,
model="deepseek-chat",
openai_api_key="",
openai_api_base="https://api.deepseek.com"
)
result = prompt | llm | output_parser
list = result.invoke({"subject": "比特币是什么时候创立的"})
print(list)
print(type(list))
# print(list[0])
输入结果如下。
2009-01-03 18:15:05
<class 'datetime.datetime'>
这段代码首先配置了一个提问模板,其中包括了额用户的问题和格式化志林个。然后,通过prompt、LLM和output_parser组件构建了一个处理链。当调用这个链时,它首先生成符合指令的问题,然后使用LLM回答问题,最后通过DatetimeOuputParser解析LLM的输出。
DatetimeOutputParser为处理和转换日期时间信息提供了一种高效且准确的方法。通过将其与LangChain的其他组件相结合,可以轻松底子有个事的文本输出中提取结构化的日期时间数据。这在许多应用场景中都是极其有用的,例如在自动化时间日程管理、时间序列分析或任何需要精确时间信息的领域。
5.4 枚举解析器
本节将深入探讨如何使用LangChain的EnumOutputParser处理和解析生成的响应,确保乡音谷歌和预定义的枚举类型。这种方式特别适应哟需要将聊天机器人的输出限定在特定选项内的场景。
5.3.1 引入枚举类型
首先需要定义一个枚举类型,这在Python中通常通过enum模块实现。枚举类型提供了一个语义确且受限的数据类型,非常适合用来表示一组固定的选项。在本例中,定义了一个名为Colors的枚举类,用于表示不同的颜色选项。
from enum import Enum
class Colors(Enum):
RED = "红色"
GREEN = "绿色"
BLUE = "蓝色"
WHITE = "白色"
BLACK = "黑色"
YELLOW = "黄色"
BROWN = "棕色"
5.3.2 枚举解析器的配置与使用
在定义了枚举类后,需要使用EnumOutputParser解析聊天机器人的输出,以确保输出匹配枚举中定义的值。解析器的主要功能是从模型的文本响应中提取与枚举相匹配的部分。
from langchain.output_parsers import EnumOutputParser
output_parser = EnumOutputParser(enum=Colors)
上述代码创建了一个EnumOutputParser实例,将之前定义的Colors枚举类传递给他。这样,解析器就知道需要从模型的响应中寻找这些特定的颜色名称。
5.3.3 构建LangChain调用链
有了枚举解析器后,可以构建一个处理链。这个处理链从简单的提示开始,经过模型生成响应,最后通过枚举解析器处理输出。
from langchain_openai import ChatOpenAI
from enum import Enum
from langchain.output_parsers import EnumOutputParser
from langchain.prompts import PromptTemplate
class Colors(Enum):
RED = "红色"
GREEN = "绿色"
BLUE = "蓝色"
WHITE = "白色"
BLACK = "黑色"
YELLOW = "黄色"
BROWN = "棕色"
if __name__ == '__main__':
output_parser = EnumOutputParser(enum=Colors)
prompt = PromptTemplate(
template="""
回答用户的问题:
{subject}的皮肤主要是什么颜色?
{format_instructions}""",
input_variables=["subject"],
partial_variables={"format_instructions": "响应的结果请选择一下选项之一:红色、黄色、绿色、黑色、白色、棕色"}
)
print(output_parser.get_format_instructions())
llm = ChatOpenAI(
temperature=0.3,
model="deepseek-chat",
openai_api_key="",
openai_api_base="https://api.deepseek.com"
)
result = prompt | llm | output_parser
在上述代码段中,定义了一个提示模板,它询问一个人的皮肤颜色,并提取了一组制定的颜色选项作为想响应指南。
5.3.4 执行和输出
最后,执行处理链并打印结果。
list = result.invoke({"subject": "亚洲人"})
print(list)
print(type(list))
运行结果如下。
Colors.YELLOW
<enum 'Colors'>
tongguo shiyong ENumOutputParser,能够有效地控制聊天机器人的输出,使其严格符合预设的枚举类型。这里需要确保输出准确性和一致性的应用场景中非常有用,列如在用户界面选择或者填充表单。此外,使用枚举解析器也有助于简化后续的逻辑处理,因为输出已经预定在了明确的、预定义的选项范围内。
5.4 XML格式解析器
本节将深入探讨如何使用XMLOutputParser,一体个高效的XML格式解析器,处理和转换有大型语言模型生成的数据。此解析器是LangChain库的一部分,旨在为开发者提供一个简单的接口,用于将LLM的文本输出转换为结构化的XMl格式.
XMLOutpoutParser是一个专为将文本输出转换为XML格式而设计的解析器。它利用LangChain的功能,通过定义明确的格式指令,自动将模型的文本输出转换为结构化的XMl文档。这对于需要将LLM输出用于进一步处理或继承到其他系统中的应用场景尤其有用。
以下是使用XMLOutputParser将模型输出转换为XML格式的详细步骤。
(1)定义查询和格式zhiding.dingyi查询内容和所需的XML结构格式。在示例中,格式指令名切了电泳列表应该如何被格式化为XML元素,示例代码如下。
from langchain.output_parsers import XMLOutputParser
from langchain.prompts import PromptTemplate
if __name__ == '__main__':
output_parser = XMLOutputParser()
prompt = PromptTemplate(
template="""
回答用户的问题:
{subject}的电影列表
{format_instructions}""",
input_variables=["subject"],
partial_variables={"format_instructions": output_parser.get_format_instructions()}
)
(2)生成和解析输出。模型接收到完整指令后,将文本输出,其中包含了按照制定的XMl格式排列的。随后,XMLOutputParser将这些文本输出,并将其转换为结构化的XML数据,是咧代码如下。
llm = ChatOpenAI(
temperature=0.3,
model="deepseek-chat",
openai_api_key="",
openai_api_base="https://api.deepseek.com"
)
result = prompt | llm | output_parser
list = result.invoke({"subject": "周杰伦"})
print(list)
print(type(list))
(3)结果处理。最终活得一个结构化的XMl文档,其中包含了周杰伦的电影目录。这个XML文档可以进一步用于各种应用,如数据分析、网站展示或作为其他系统的输入数据,打印结果如下。
{'response': [{'artist': '周杰伦'}, {'category': '电影列表'}, {'movies': [{'movie': [{'title': '头文字D'}, {'year': '2005'}, {'role': '藤原拓海'}]}, {'movie': [{'title': '满城尽带黄金甲'}, {'year': '2006'}, {'role': '杰王子'}]}, {'movie': [{'title': '不能说的秘密'}, {'year': '2007'}, {'role': '叶湘伦'}, {'note': '自导自演'}]}, {'movie': [{'title': '大灌篮'}, {'year': '2008'}, {'role': '方世杰'}]}, {'movie': [{'title': '刺陵'}, {'year': '2009'}, {'role': '乔飞'}]}, {'movie': [{'title': '青蜂侠'}, {'year': '2011'}, {'role': '加藤'}]}, {'movie': [{'title': '逆战'}, {'year': '2012'}, {'role': '万飞'}]}, {'movie': [{'title': '天台爱情'}, {'year': '2013'}, {'role': '浪子膏'}, {'note': '自导自演'}]}, {'movie': [{'title': '惊天魔盗团2'}, {'year': '2016'}, {'role': '小李'}]}, {'movie': [{'title': '叱咤风云'}, {'year': '2021'}, {'role': '杰秀人'}, {'note': '监制及特别出演'}]}]}]}
<class 'dict'>
5.5 自定义大模型输出解析器
在LangChain中,开发者可以通过自定义解析器将大模型的输出狗仔为需要的格式。这个过程可以帮助你根据特定需求对模型输出进行定制化处理,例如反转大小写等。下面将介绍如何使用LangChain实现自定义解析器。
5.5.1 使用Runnablelambda或RunnableGenerator
LangChain推荐的方法时使用可运行的Lambda和Generator实现自定义解析器。这种方法简单高效,适用于多数用例。可在解析器中定义处理逻辑,并将其应用于模型输出。
下面是一个简单示例,演示如何将模型输出的大小写进行反转。
from langchain_core.messages import AIMessage
def parse(ai_message: AIMessage) -> str:
return ai_message.content.swapcase()
例如,使用链调用大模型,示例代码如下。
from langchain_core.messages import AIMessage
from langchain.prompts import PromptTemplate
from langchain_openai import ChatOpenAI
def parse(ai_message: AIMessage) -> str:
return ai_message.content.swapcase()
if __name__ == '__main__':
prompt = PromptTemplate(
template="""
回答用户的问题:
{subject}
""",
input_variables=["subject"]
)
#output_parse = StrOutputParser()
llm = ChatOpenAI(
temperature=0.3,
model="deepseek-chat",
openai_api_key="",
openai_api_base="https://api.deepseek.com"
)
result = prompt | llm | parse
list = result.invoke({"subject": "hello"})
print(list)
打印结果如下。
hELLO! hOW CAN i HELP YOU TODAY?
自定义解析器可以根据需要对大模型的输出进行灵活地处理,以满足定制化需求。在LangChain中,使用RunnableLambda或RunnableGenerator是实现这一目标的简便而有效的方法。
AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。
更多推荐



所有评论(0)