LangChain 输出解析器全景实战:Str / JSON / XML / List / DateTime 一次看懂
·
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 | 问答、聊天 |
| JsonOutputParser | JSON(无包裹) | dict/list | API、前端对接 |
| XMLOutputParser | XML | dict | 传统接口 |
| CommaSeparatedListOutputParser | a, b, c | List[str] | 关键词、标签 |
| DatetimeOutputParser | ISO 8601 | datetime | 日程、合同抽取 |
7. 常见坑速查
- JsonOutputParser 必须让模型返回纯 JSON,任何多余解释都会抛
JSONDecodeError - XMLOutputParser 最终给的是 dict,不会保留属性,复杂 XML 建议换专用库
- CommaSeparatedListOutputParser 默认英文逗号;如要中文全角,需后处理
- DatetimeOutputParser 只认 ISO 格式,prompt 里务必强调“用 ISO 8601”
至此,Model IO 三大件 PromptTemplate → LLM → OutputParser 全部打通。
复制代码即可发布 CSDN,记得点赞收藏!
更多推荐


所有评论(0)