LangChain最详细教程之Model I/O(三)Output Parsers
本文是LangChain框架的详细教程系列,重点讲解Model I/O模块中的输出解析器功能。文章系统介绍了6种常用输出解析器的使用场景和实现方法:1) StrOutputParser字符串解析器;2) JsonOutputParser JSON解析器;3) XMLOutputParser XML解析器;4) CommaSeparatedListOutputParser列表解析器;5) Datet
·
目录
五、列表解析器 CommaSeparatedListOutputParser
简介
本系列教程将以「系统梳理 + 实战落地」为核心,从基础到进阶全面拆解 LangChain—— 这个目前最流行的大语言模型(LLM)应用开发框架。之前对langchain进行了系统的概述,现在我们就来详细看看每一个板块。
LangChain最详细教程之Model I/O(一)调用模型
LangChain最详细教程之Model I/O(二)Prompt Template
一、 介绍与分类
语言模型返回的内容通常都是字符串的格式(文本格式),但在实际AI应用开发过程中,往往希望model可以返回更直观、更格式化的内容 ,以确保应用能够顺利进行后续的逻辑处理。此时,LangChain提供的 输出解析器 就派上用场了。
输出解析器(Output Parser)负责获取 LLM 的输出并将其转换为更合适的格式。这在应用开发中及其 重要 。
输出解析器的分类
LangChain有许多不同类型的输出解析器
- StrOutputParser :字符串解析器
- JsonOutputParser :JSON解析器,确保输出符合特定JSON对象格式
- XMLOutputParser :XML解析器,允许以流行的XML格式从LLM获取结果
- CommaSeparatedListOutputParser :CSV解析器,模型的输出以逗号分隔,以列表形式返回输出
- DatetimeOutputParser :日期时间解析器,可用于将 LLM 输出解析为日期时间格式 除了上述常用的输出解析器之外,还有:
- EnumOutputParser :枚举解析器,将LLM的输出,解析为预定义的枚举值
- StructuredOutputParser :将非结构化文本转换为预定义格式的结构化数据(如字典)
- OutputFixingParser :输出修复解析器,用于自动修复格式错误的解析器,比如将返回的不符合预期格式的输出,尝试修正为正确的结构化数据(如 JSON)
- RetryOutputParser :重试解析器,当主解析器(如 JSONOutputParser)因格式错误无法解析
LLM 的输出时,通过调用另一个 LLM 自动修正错误,并重新尝试解析。我将讲述前五个比较常用的,其他的知道有这个东西就行。
二、字符串解析器 StrOutputParser
StrOutputParser 简单地将 任何输入 转换为 字符串 。它是一个简单的解析器,从结果中提取
content字段
# 1、获取大模型
from langchain_core.messages import HumanMessage, SystemMessage
from langchain_core.output_parsers import StrOutputParser, XMLOutputParser
import os
import dotenv
from langchain_core.utils import pre_init
from langchain_openai import ChatOpenAI
dotenv.load_dotenv()
os.environ['OPENAI_API_KEY'] = os.getenv("OPENAI_API_KEY1")
os.environ['OPENAI_BASE_URL'] = os.getenv("OPENAI_BASE_URL")
chat_model = ChatOpenAI(model="gpt-4o-mini")
# 2、调用大模型
response = chat_model.invoke("什么是大语言模型?")
# print(type(response)) #AIMessage
#3、如何获取一个字符串的输出结果呢?
# 方式1:自己调用输出结果的content
# print(response.content)
# 方式2:使用StrOutputParser
parser = StrOutputParser()
str_response = parser.invoke(response)
print(type(str_response)) #<class 'str'>
print(str_response)
三、JSON解析器 JsonOutputParser
JsonOutputParser,即JSON输出解析器,是一种用于将大模型的 自由文本输出 转换为 结构化JSON数据 的工具。
适合场景:特别适用于需要严格结构化输出的场景,比如 API 调用、数据存储或下游任务处理。
实现方式
- 方式1:用户自己通过提示词指明返回Json格式
- 方式2:借助JsonOutputParser的 get_format_instructions() ,生成格式说明,指导模型输出JSON 结构
from langchain_core.output_parsers import JsonOutputParser
from langchain_core.prompts import ChatPromptTemplate
chat_model = ChatOpenAI(model="gpt-4o-mini")
chat_prompt_template = ChatPromptTemplate.from_messages([
("system", "你是一个靠谱的{role}"),
("human", "{question}")
])
# 正确的:
prompt = chat_prompt_template.invoke(
input={"role": "人工智能专家", "question": "人工智能用英文怎么说?问题用q表示,答案用a表示,返回一个JSON格式的数据"})
# 错误的:
# prompt = chat_prompt_template.invoke(input={"role":"人工智能专家","question":"人工智能用英文怎么说?"})
response = chat_model.invoke(prompt)
# print(response.content)
# 获取一个JsonOutputParser的实例
parser = JsonOutputParser()
json_result = parser.invoke(response)
print(json_result)
# 引入依赖包
from langchain_core.output_parsers import JsonOutputParser
from langchain_core.prompts import PromptTemplate
# 初始化语言模型
chat_model = ChatOpenAI(model="gpt-4o-mini")
joke_query = "告诉我一个笑话。"
# 定义Json解析器
parser = JsonOutputParser()
#以PromptTemplate为例
prompt_template = PromptTemplate.from_template(
template="回答用户的查询\n 满足的格式为{format_instructions}\n 问题为{question}\n",
partial_variables={"format_instructions": parser.get_format_instructions()},
)
prompt = prompt_template.invoke(input={"question": joke_query})
response = chat_model.invoke(prompt)
print(response)
json_result = parser.invoke(response)
print(json_result)
四、XML解析器 XMLOutputParser
XMLOutputParser,将模型的自由文本输出转换为可编程处理的 XML 数据。
如何实现:在 PromptTemplate 中指定 XML 格式要求,让模型返回 <tag>content</tag> 形式的数据。
注意:XMLOutputParser 不会直接将模型的输出保持为原始XML字符串,而是会解析XML并转换成 Python字典 (或类似结构化的数据)。目的是为了方便程序后续处理数据,而不是单纯保留XML格式。
chat_model = ChatOpenAI(model="gpt-4o-mini")
actor_query = "周星驰的简短电影记录"
response = chat_model.invoke(f"请生成{actor_query},将影片附在<movie></movie>标签中")
print(type(response))
print(response.content)
# 1.导入相关包
from langchain_core.output_parsers import XMLOutputParser
from langchain_core.prompts import PromptTemplate
from langchain_openai import ChatOpenAI
# 2. 初始化语言模型
chat_model = ChatOpenAI(model="gpt-4o-mini")
# 3.测试模型的xml解析效果
actor_query = "生成汤姆·汉克斯的简短电影记录,使用中文回复"
# 4.定义XMLOutputParser对象
parser = XMLOutputParser()
# 5. 生成提示词模板
prompt_template1 = PromptTemplate.from_template(
template="用户的问题:{query}\n使用的格式:{format_instructions}"
)
prompt_template2 = prompt_template1.partial(format_instructions=parser.get_format_instructions())
response = chat_model.invoke(prompt_template2.invoke(input={"query": actor_query}))
print(response.content)
from langchain_core.prompts import PromptTemplate
from langchain_openai import ChatOpenAI
from langchain.output_parsers import CommaSeparatedListOutputParser
# 初始化语言模型
chat_model = ChatOpenAI(model="gpt-4o-mini")
# 创建解析器
output_parser = CommaSeparatedListOutputParser()
# 创建LangChain提示模板
chat_prompt = PromptTemplate.from_template(
"生成5个关于{text}的列表.\n\n{format_instructions}",
partial_variables={
"format_instructions": output_parser.get_format_instructions()
})
# 提示模板与输出解析器传递输出
# chat_prompt = chat_prompt.partial(format_instructions=output_parser.get_format_instructions())
# 将提示和模型合并以进行调用
chain = chat_prompt | chat_model | output_parser
res = chain.invoke({"text": "电影"})
print(res)
print(type(res))
五、列表解析器 CommaSeparatedListOutputParser
列表解析器:利用此解析器可以将模型的文本响应转换为一个用 逗号分隔的列表(List[str]) 。
from langchain_core.output_parsers import CommaSeparatedListOutputParser
output_parser = CommaSeparatedListOutputParser()
# 返回一些指令或模板,这些指令告诉系统如何解析或格式化输出数据
format_instructions = output_parser.get_format_instructions()
print(format_instructions)
messages = "大象,猩猩,狮子"
result = output_parser.parse(messages)
print(result)
print(type(result))
六、日期解析器 DatetimeOutputParser
利用此解析器可以直接将LLM输出解析为日期时间格式。
- get_format_instructions(): 获取日期解析的格式化指令,指令为:"Write a datetime string that matches the following pattern: '%Y-%m-%dT%H:%M:%S.%fZ'。
from langchain.output_parsers import DatetimeOutputParser
output_parser = DatetimeOutputParser()
format_instructions = output_parser.get_format_instructions()
print(format_instructions)
from langchain_openai import ChatOpenAI
from langchain.prompts.chat import HumanMessagePromptTemplate
from langchain_core.prompts import ChatPromptTemplate
from langchain.output_parsers import DatetimeOutputParser
chat_model = ChatOpenAI(model="gpt-4o-mini")
chat_prompt = ChatPromptTemplate.from_messages([
("system","{format_instructions}"),
("human", "{request}")
])
output_parser = DatetimeOutputParser()
# 方式1:
# model_request = chat_prompt.format_messages(
# request="中华人民共和国是什么时候成立的",
# format_instructions=output_parser.get_format_instructions()
# )
# response = chat_model.invoke(model_request)
# result = output_parser.invoke(response)
# print(result)
# print(type(result))
# 方式2:
chain = chat_prompt | chat_model | output_parser
resp = chain.invoke({"request":"中华人民共和国是什么时候成立的",
"format_instructions":output_parser.get_format_instructions()})
print(resp)
print(type(resp))
七、LangChain调用本地大模型
第1步:下载并安装Ollama
第2步:在Ollama下部署大模型:deepseek-r1:7b
第3步:在LangChain中调用Ollama下的大模型
下载ollama与下载大模型可以看下面这个博客
from langchain_core.messages import HumanMessage
from langchain_ollama import ChatOllama
# ChatOpenAI()
#此时调用的是本地的大模型。省略base_url、api-key
llm = ChatOllama(
model = "deepseek-r1:7b"
)
# llm.invoke("你好,请介绍一下你自己!")
messages = [
HumanMessage(content="你好,请介绍一下你自己!")
]
response = llm.invoke(messages)
print(response.content)
更多推荐
所有评论(0)