|
|
1. JsonoutputParser在多模型执行链中的作用?
JsonOutputParser 在多模型执行链中的核心作用是将上游模型输出的非结构化文本,按照预定格式解析成结构化的 JSON 对象。这就像是两个模型对话之间的“翻译官”或“格式转换器”。
具体作用包括:
- 标准化输出格式:它确保第一个模型的输出是严格、可预测的 JSON 格式,为链中的下一个环节(如下一个提示词模板)提供结构清晰、可直接引用的数据。
- 实现数据流转:在多步处理中,前一步的结果需要作为后一步的输入。JsonOutputParser 将文本(如:“{“name”: “张若曦”}”)解析成Python字典(如:{‘name’: ‘张若曦’}),这样下一个提示词模板才能通过变量(如 {name})正确获取到这个值。
- 提升链的可靠性:通过强制和验证JSON格式,减少了因模型输出格式随意而导致链中断的风险,使整个执行流程更稳定。
您提供的代码是一个典型的多模型执行链,展示了数据如何在不同模型和处理步骤间流转。下面为您解析这个链的工作流程:
- 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 小助理,如未能正确解答您的问题,请继续追问。 |
|