1. 为什么我们需要输出解析器?
在真实业务场景中,大语言模型(LLM)的原生文本输出就像是一块未经雕琢的璞玉——虽然蕴含价值,但无法直接投入使用。想象一下这些典型场景:
-
前端渲染:你的美食APP需要展示菜谱,但LLM返回的是"首先把鸡蛋打散...最后撒上葱花"这样的纯文本,而前端需要的是结构化的JSON数据,包含食材列表、烹饪步骤、难度等级等字段。
-
数据存储:当LLM生成用户反馈分析时,返回的是"用户对物流速度不满意,但喜欢产品包装",而数据库需要的是{"物流评分":2, "包装评分":4}这样的结构化记录。
-
流程控制:在客服机器人场景中,LLM可能返回"建议转人工服务",但程序需要的是{"action":"transfer","department":"billing"}这样的机器可读指令。
我曾在一个电商分析项目中,花费整整两天时间用正则表达式处理LLM生成的商品评论摘要。直到发现LangChain的输出解析器,处理时间缩短到5分钟——这就是为什么我们需要专门研究这个看似简单的组件。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. LangChain内置解析器深度解析
2.1 StrOutputParser:基础但不可忽视
这是最简单的解析器,但新手常犯两个错误:
python复制from langchain_core.output_parsers import StrOutputParser
# 正确用法(新版LCEL风格)
chain = prompt | model | StrOutputParser()
# 常见错误1:忘记添加到处理链中
result = model.invoke(prompt) # 直接得到Raw Model输出
# 常见错误2:错误处理异常
try:
result = chain.invoke(input)
except Exception as e: # 太宽泛的异常捕获
print("出错了!")
实战技巧:
- 即使只需要文本,也建议始终使用StrOutputParser,它会对模型输出进行标准化处理
- 配合LCEL(LangChain Expression Language)的
|操作符,代码更简洁 - 处理异常时,建议捕获
OutputParserException特定异常
2.2 CommaSeparatedListOutputParser:智能列表解析
这个解析器的强大之处在于它能处理各种变体:
python复制from langchain.output_parsers import CommaSeparatedListOutputParser
parser = CommaSeparatedListOutputParser()
result1 = parser.parse("apple, banana, orange") # 标准情况
result2 = parser.parse("apple and banana and orange") # 处理连接词
result3 = parser.parse("1. apple\n2. banana\n3. ora
