LangChain 输出解析器全景实战:Str / JSON / XML / List / DateTime 一次看懂

版本:Python 3.9+、LangChain 0.1.x
目标:把“模型返回的字符串”变成“程序直接可用的数据”,每段代码都能独立复制运行


0. 统一环境(只需一次)

pip install -U langchain langchain-openai python-dotenv

.env 文件

OPENAI_API_KEY=sk-xxx
OPENAI_BASE_URL=https://api.openai.com/v1   # 如需转发可改
# 0_env.py
from dotenv import load_dotenv
from langchain_openai import ChatOpenAI
load_dotenv()
llm = ChatOpenAI(model="gpt-4o-mini", temperature=0)

1. StrOutputParser · 最常用“裸字符串”

适用:只想拿到纯文本,不要 Message 外壳
文件:1_str_parser.py

from langchain_core.output_parsers import StrOutputParser
from langchain_core.prompts import ChatPromptTemplate
from 0_env import llm   # 上一步的文件

prompt = ChatPromptTemplate.from_messages([
    ("system", "你是助手"),
    ("human", "{question}")
])
chain = prompt | llm | StrOutputParser()   # LCEL 一行链
print(chain.invoke({"question": "什么是大模型?"}))
#输出结果:大模型通常指参数量超过十亿的深度学习模型

2. JsonOutputParser · 重点中的重点

适用:返回 dict / list,程序直接继续用
文件:2_json_parser.py

from langchain_core.output_parsers import JsonOutputParser
from langchain_core.prompts import ChatPromptTemplate
from 0_env import llm

parser = JsonOutputParser()   # 自带格式指令
prompt = ChatPromptTemplate.from_messages([
    ("system", "你是严谨 JSON 生成器。\n{format_instructions}"),
    ("human", "{question}")
]).partial(format_instructions=parser.get_format_instructions())

chain = prompt | llm | parser
print(chain.invoke({"question": "人工智能用英文怎么说?字段 q 问题,a 答案"}))
# 输出:{'q': '人工智能用英文怎么说?', 'a': 'Artificial Intelligence'}

3. XMLOutputParser · 模型吐 XML,程序拿 JSON

适用:XML 协议场景,但代码里想继续用 dict
文件:3_xml_parser.py

from langchain_core.output_parsers import XMLOutputParser
from langchain_core.prompts import PromptTemplate
from 0_env import llm

parser = XMLOutputParser()
prompt = PromptTemplate.from_template(
    "回答用户查询。\n{format_instructions}\n{query}"
).partial(format_instructions=parser.get_format_instructions())

chain = prompt | llm | parser
print(chain.invoke({"query": "告诉我一个笑话,用 XML 格式返回 title 和 content"}))
# 输出(dict):{'title': '程序员笑话', 'content': '老婆给老公打电话:下班买 10 个包子,看到卖西瓜的也买 1 个。老公买了 1 个包子,因为看到了卖西瓜的。'}

4. CommaSeparatedListOutputParser · 快速变 Python List

适用:让模型直接给“逗号列表”
文件:4_list_parser.py

from langchain.output_parsers import CommaSeparatedListOutputParser
from langchain_core.prompts import PromptTemplate
from 0_env import llm

parser = CommaSeparatedListOutputParser()
prompt = PromptTemplate.from_template(
    "生成 5 个关于 {topic} 的词语。\n{format_instructions}"
).partial(format_instructions=parser.get_format_instructions())

chain = prompt | llm | parser
print(chain.invoke({"topic": "科幻电影"}))
# 输出:['星际穿越', '盗梦空间', '黑客帝国', '银翼杀手', '流浪地球']

5. DatetimeOutputParser · 让模型只返回“标准时间字符串”

适用:抽取 / 生成日期,直接变 Python datetime
文件:5_datetime_parser.py

from langchain.output_parsers import DatetimeOutputParser
from langchain_core.prompts import PromptTemplate
from 0_env import llm

parser = DatetimeOutputParser()   # 默认 ISO 8601
prompt = PromptTemplate.from_template(
    "把下面句子里的日期抽出来,只用输出时间,不要解释。\n{format_instructions}\n{sentence}"
).partial(format_instructions=parser.get_format_instructions())

chain = prompt | llm | parser
print(chain.invoke({"sentence": "合同签订时间是 2025 年 12 月 22 号上午 10 点"}))
# 输出:datetime.datetime(2025, 12, 22, 10, 0)

6. 选型 1 张图带走

解析器模型输出格式程序拿到典型场景
StrOutputParser任意字符串str问答、聊天
JsonOutputParserJSON(无包裹)dict/listAPI、前端对接
XMLOutputParserXMLdict传统接口
CommaSeparatedListOutputParsera, b, cList[str]关键词、标签
DatetimeOutputParserISO 8601datetime日程、合同抽取

7. 常见坑速查

  1. JsonOutputParser 必须让模型返回纯 JSON,任何多余解释都会抛 JSONDecodeError
  2. XMLOutputParser 最终给的是 dict,不会保留属性,复杂 XML 建议换专用库
  3. CommaSeparatedListOutputParser 默认英文逗号;如要中文全角,需后处理
  4. DatetimeOutputParser 只认 ISO 格式,prompt 里务必强调“用 ISO 8601”

至此,Model IO 三大件 PromptTemplate → LLM → OutputParser 全部打通。
复制代码即可发布 CSDN,记得点赞收藏!

Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐