当前位置: 首页 > news >正文

[智能体-174]:LangChain 输出格式化 完整方案

核心分为原生解析、输出解析器 (Output Parser)、Prompt 约束、结构化返回四大类,适配不同场景(字符串、JSON、列表、对象、枚举),基于 LangChain 最新版本(0.1+)演示。

一、前置依赖

bash

运行

pip install langchain langchain-openai python-dotenv

二、基础:Prompt指令约束(最简单,无代码解析)

直接在提示词要求固定格式,适合简单场景,纯文本约束,不需要根据大模型的输出自动调用函数。

示例 1:固定文本格式 / 列表

python

运行

from langchain_openai import ChatOpenAI from dotenv import load_dotenv import os load_dotenv() llm = ChatOpenAI(model="gpt-3.5-turbo", temperature=0) prompt = """ 请总结以下内容,严格按照格式输出: 1. 标题:xxx 2. 核心要点: - 要点1 - 要点2 内容:人工智能发展趋势 """ res = llm.invoke(prompt) print(res.content)

示例 2:强制 JSON 格式(纯 Prompt 约束)

python

运行

prompt = """ 提取以下人物信息,**只返回标准JSON**,不要额外解释、不要markdown: 字段:name(姓名), age(年龄), hobby(爱好) 内容:小明,22岁,喜欢编程和阅读 """ res = llm.invoke(prompt) print(res.content)

三、标准 OutputParser 输出解析器(官方推荐)

LangChain 内置多种解析器,自动校验 + 格式化输出,防乱格式、自动报错

1. StrOutputParser 纯字符串(默认)

仅包装原始输出,链式调用常用:

python

运行

from langchain_core.output_parsers import StrOutputParser parser = StrOutputParser() chain = llm | parser res = chain.invoke("介绍Python") print(type(res), res) # 字符串类型

2. JsonOutputParser 解析 JSON(最常用)

自动解析 LLM 输出的 JSON字符串为 Python 字典,自动容错

python

运行

from langchain_core.output_parsers import JsonOutputParser from langchain_core.prompts import ChatPromptTemplate # 1. 定义解析器 parser = JsonOutputParser() # 2. 构造提示词,注入格式要求 prompt = ChatPromptTemplate.from_messages([ ("system", "提取用户信息,输出JSON格式。{format_instructions}"), ("human", "姓名:张三,职业:工程师,城市:上海") ]).partial(format_instructions=parser.get_format_instructions()) # 3. 构建链路 chain = prompt | llm | parser # 4. 调用,直接得到字典 result = chain.invoke({}) print(type(result)) # <class 'dict'> print(result["姓名"], result["职业"])

3. PydanticOutputParser结构化对象(强类型、字段校验)

基于Pydantic定义数据模型,强制字段、类型、规则,适合生产级结构化输出。

步骤 1:定义 Pydantic 模型

python

运行

from pydantic import BaseModel, Field from langchain_core.output_parsers import PydanticOutputParser # 定义数据结构 class UserInfo(BaseModel): name: str = Field(description="用户姓名") age: int = Field(description="用户年龄,数字类型") city: str = Field(description="所在城市") # 初始化解析器 parser = PydanticOutputParser(pydantic_object=UserInfo)
步骤 2:拼接 Prompt + 调用

python

运行

prompt = ChatPromptTemplate.from_messages([ ("system", "解析用户信息,严格按照指定格式输出。{format_instructions}"), ("human", "小李,25岁,定居北京") ]).partial(format_instructions=parser.get_format_instructions()) chain = prompt | llm | parser # 返回 Pydantic 对象,直接点属性取值 user: UserInfo = chain.invoke({}) print(user.name, user.age, user.city) # 转字典 print(user.model_dump())

4. CommaSeparatedListOutputParser 逗号分隔列表

自动把a,b,c格式转为 Python 列表:

python

运行

from langchain_core.output_parsers import CommaSeparatedListOutputParser parser = CommaSeparatedListOutputParser() prompt = ChatPromptTemplate.from_messages([ ("system", "列出3个编程语言,用英文逗号分隔。{format_instructions}"), ("human", "需求:编程语言") ]).partial(format_instructions=parser.get_format_instructions()) chain = prompt | llm | parser res = chain.invoke({}) print(res) # ['Python', 'Java', 'Go']

四、进阶:自定义解析器 + 处理异常

1. 捕获解析失败(LLM 输出不规范兜底)

LLM 偶尔输出多余文本,导致 JSON 解析报错,增加异常捕获:

python

运行

from langchain_core.output_parsers import JsonOutputParser from langchain_core.exceptions import OutputParserException parser = JsonOutputParser() chain = llm | parser try: res = chain.invoke("xxx") except OutputParserException as e: print("解析失败,原始输出:", e.llm_output) # 兜底手动清洗字符串再解析

2. 自定义 OutputParser

继承BaseOutputParser实现个性化逻辑:

python

运行

from langchain_core.output_parsers import BaseOutputParser from typing import Any class CustomParser(BaseOutputParser[str]): def parse(self, text: str) -> str: # 自定义清洗逻辑:去除markdown、空格 return text.replace("```", "").strip() parser = CustomParser() chain = llm | parser res = chain.invoke("用一句话介绍LangChain") print(res)

五、LCEL 链式组合(工程常用写法)

统一格式链路,复用解析逻辑:

python

运行

from langchain_core.prompts import ChatPromptTemplate from langchain_core.output_parsers import JsonOutputParser prompt = ChatPromptTemplate.from_template(""" 分析以下评论情绪,输出JSON: 字段:sentiment(positive/negative/neutral), reason(原因) 评论:{comment} {format_instructions} """) parser = JsonOutputParser() # 完整链路 chain = prompt.partial(format_instructions=parser.get_format_instructions()) | llm | parser # 调用 data = chain.invoke({"comment": "这个工具很好用,效率提升很多"}) print(data)

六、关键技巧 & 避坑

  1. 必加temperature=0,格式化场景建议关闭随机性,llm = ChatOpenAI(temperature=0),大幅降低格式错乱概率。

  2. 禁止多余内容:Prompt 里明确:只输出结果,不要解释、不要markdown、不要多余文字

  3. 嵌套 JSON / 复杂结构:优先用PydanticOutputParser支持嵌套 Model,天然支持复杂对象。

  4. 多轮对话格式化:解析器全局复用,只需要保证每一轮 Prompt 都携带格式指令。

  5. 旧版本 LangChain 兼容老版本:用from langchain.output_parsers import xxx,新版本统一迁移到langchain_core.output_parsers


七、选型速查表

场景推荐解析器
纯文本输出StrOutputParser
字典 / 简单 JSONJsonOutputParser
强类型、字段校验、复杂结构PydanticOutputParser
逗号分隔数组CommaSeparatedListOutputParser
特殊清洗规则自定义 BaseOutputParser
http://www.rkmt.cn/news/1433350.html

相关文章:

  • Rocky Linux 9服务器装好后必做的几件事:从网络配置、SSH远程到基础监控
  • 构建个人知识管理系统:从信息过载到高效知识内化
  • 基座模型实战指南:从类型解析到应用部署的完整路径
  • AI新闻简报制作指南:从信息过载到价值提炼的完整流程
  • 不只是魔法上网:Win11 23H2 Copilot图标消失的深层原因与三种找回姿势
  • 巴音郭楞外贸建站推荐,WaiMaoYa 外贸鸭一次建站投入,长期持续收益,赋能品牌出海 - 外贸独立站运营
  • HsMod深度解析:基于BepInEx的炉石传说功能增强框架实战指南
  • 从零到一:基于eNSP构建企业级网络原型
  • 政府科技实战:AI赋能GovTech的挑战、策略与架构演进
  • STM32G473 IAP实战:用CAN总线给你的设备无线升级固件(附完整工程)
  • Function Calling 的前世今生:为什么我们需要工具生态设计
  • UE5 CesiumForUnreal避坑指南:从加载本地倾斜模型到解决Sequence卡顿的12个实战问题
  • 5分钟彻底解决Windows磁盘爆满:开源清理工具完全指南
  • 用89S52单片机驱动TPμP-40A微型打印机:一个毕业生的硬件调试笔记与避坑指南
  • 保姆级教程:在Ubuntu 22.04上为服务器配置双网卡(内网+外网)并设置静态IP
  • 从编辑器到手机桌面:一次搞懂Unity Android打包的完整工作流与底层逻辑
  • ChatGPT Plus实战:AI如何重塑PPT制作、娱乐与学术研究
  • Windows Cleaner终极指南:5分钟解决C盘爆红,让电脑重获新生!
  • 用IMX6ULL和STM32MP157做个智能氛围灯:从传感器数据采集到TensorFlow Lite模型部署全流程(附源码)
  • 避开这些坑!ArcGIS Pro二次开发AddIn项目图标和菜单不显示的修复指南
  • 如何用3个步骤免费下载网易云音乐无损FLAC歌单
  • Power Automate审批流实战:从SharePoint触发到状态回写,我的踩坑与优化记录
  • 2026年上饶市CPPM报名十大核心问题全流程答疑 - 众智商学院课程中心
  • 从Typora迁移到Obsidian,我踩过的那些坑和高效配置方案(含换行、图床、模板无缝迁移指南)
  • QGIS实战:用Graduated渲染让降雨量数据‘开口说话’(附C++ API完整代码)
  • 从编译失败到成功运行:手把手解决ZLMediaKit交叉编译WebRTC时的三大经典错误
  • 手把手教你为Dell R730服务器安装VMware ESXi 8.0 U2(附Dell OEM版下载与RAID1配置避坑)
  • 2026年商丘市CPPM报名十大核心问题全流程答疑 - 众智商学院课程中心
  • Win11上装Oracle 11g踩坑记:从环境报错到PL/SQL远程连接,保姆级排雷指南
  • 百考通AI期刊智能化赋能学术发表,让优质成果高效落地