19. LangChain组件——JsonoutputParser和多模型执行链
1. JsonoutputParser在多模型执行链中的作用?2. 代码实战
from langchain_core.output_parsers import StrOutputParser, JsonOutputParser
from langchain_community.chat_models.tongyi import ChatTongyi
from langchain_core.prompts import PromptTemplate
# 创建所需的解析器
str_parser = StrOutputParser()
json_parser = JsonOutputParser()
# 模型创建
model = ChatTongyi(model="qwen3-max")
# 第一个提示词模板
first_prompt = PromptTemplate.from_template(
"我邻居姓:{lastname},刚生了{gender},请帮忙起名字,"
"并封装为JSON格式返回给我。要求key是name,value就是你起的名字,请严格遵守格式要求。" #保证输出的是json格式
)
# 第二个提示词模板
second_prompt = PromptTemplate.from_template(
"姓名:{name},请帮我解析含义。"
)
# 构建链 (AIMessage("{name: 张若曦}")
chain = first_prompt | model | json_parser | second_prompt | model | str_parser
for chunk in chain.stream({"lastname": "张", "gender": "女儿"}):
print(chunk, end="", flush=True)
学习视频:【黑马程序员大模型RAG与Agent智能体项目实战教程,基于主流的LangChain技术从大模型提示词到实战项目】 https://www.bilibili.com/video/BV1yjz5BLEoY/?p=35&share_source=copy_web&vd_source=792a2cb63a1882bff4ed856eadc41a71
1. JsonoutputParser在多模型执行链中的作用?
JsonOutputParser 在多模型执行链中的核心作用是将上游模型输出的非结构化文本,按照预定格式解析成结构化的 JSON 对象。这就像是两个模型对话之间的“翻译官”或“格式转换器”。
具体作用包括:
[*]标准化输出格式:它确保第一个模型的输出是严格、可预测的 JSON 格式,为链中的下一个环节(如下一个提示词模板)提供结构清晰、可直接引用的数据。
[*]实现数据流转:在多步处理中,前一步的结果需要作为后一步的输入。JsonOutputParser 将文本(如:“{“name”: “张若曦”}”)解析成Python字典(如:{‘name’: ‘张若曦’}),这样下一个提示词模板才能通过变量(如 {name})正确获取到这个值。
[*]提升链的可靠性:通过强制和验证JSON格式,减少了因模型输出格式随意而导致链中断的风险,使整个执行流程更稳定。
2. 代码实战
您提供的代码是一个典型的多模型执行链,展示了数据如何在不同模型和处理步骤间流转。下面为您解析这个链的工作流程:
from langchain_core.output_parsers import StrOutputParser, JsonOutputParser
from langchain_community.chat_models.tongyi import ChatTongyi
from langchain_core.prompts import PromptTemplate
# 创建所需的解析器
str_parser = StrOutputParser()
json_parser = JsonOutputParser()
# 模型创建
model = ChatTongyi(model="qwen3-max")
# 第一个提示词模板
first_prompt = PromptTemplate.from_template(
"我邻居姓:{lastname},刚生了{gender},请帮忙起名字,"
"并封装为JSON格式返回给我。要求key是name,value就是你起的名字,请严格遵守格式要求。" #保证输出的是json格式
)
# 第二个提示词模板
second_prompt = PromptTemplate.from_template(
"姓名:{name},请帮我解析含义。"
)
# 构建链 (AIMessage("{name: 张若曦}")
chain = first_prompt | model | json_parser | second_prompt | model | str_parser
for chunk in chain.stream({"lastname": "张", "gender": "女儿"}):
print(chunk, end="", flush=True)
链的执行步骤分解:
[*]first_prompt: 接收用户输入 {“lastname”: “张”, “gender”: “女儿”},生成提示文本:“我邻居姓:张,刚生了女儿,请帮忙起名字...”。
[*]model (第一次调用): 接收上面的提示,思考并生成回复。理想情况下,它回复一个JSON字符串,例如: {“name”: “张若曦”}。
[*]json_parser: 这是关键一步!它将模型返回的JSON字符串 “{“name”: “张若曦”}” 解析成Python字典:{‘name’: ‘张若曦’}。
[*]second_prompt: 接收上一步解析出的字典 {‘name’: ‘张若曦’}。提示词模板中的变量 {name} 会自动匹配字典中的同名键,生成新提示:“姓名:张若曦,请帮我解析含义。”
[*]model (第二次调用): 接收“解析含义”的提示,生成对该名字含义的解释文本。
[*]str_parser: 将第二个模型返回的复杂消息对象转换为纯净的字符串,方便最终输出。
如果没有 JsonOutputParser,第一个模型的输出(一个JSON字符串)将直接传给 second_prompt。那么 second_prompt 会试图将整个字符串赋值给变量 {name},导致提示变为 “姓名:{“name”: “张若曦”},请帮我解析含义。”,这显然不符合预期,可能导致第二个模型无法正确理解请求。
这个链清晰地展示了如何通过 JsonOutputParser 串联两个不同的模型任务,实现“起名” -> “解析含义”的流水线处理。
以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。 好! {:10_256:}{:10_256:}学习
页:
[1]