讲师中心 微信公众号
AI工具推荐 视频效率加速

如何让 LLM Agent 输出结构化节假日列表(字典列表格式)

浅辰小哥_3326

浅辰小哥_3326

发布时间:2026-04-25 19:48:48

|

618人浏览过

|

来源于php中文网

原创

本文详解如何通过 LangChain 的 JsonOutputParser 或 PydanticOutputParser,让 LLM Agent 稳定输出符合要求的节假日字典列表(如 [{"name": "New Year's Day", "date": "2024-01-01"}, ...]),解决 StructuredOutputParser 仅返回单条重复键覆盖结果的问题。

本文详解如何通过 langchain 的 `jsonoutputparser` 或 `pydanticoutputparser`,让 llm agent 稳定输出符合要求的节假日字典列表(如 `[{"name": "new year's day", "date": "2024-01-01"}, ...]`),解决 `structuredoutputparser` 仅返回单条重复键覆盖结果的问题。

在使用 LangChain 构建 LLM Agent 提取节假日信息时,一个常见痛点是:期望获得多个节日及其日期组成的列表(如 List[Dict[str, str]]),但实际只得到最后一个条目。根本原因在于原始代码中使用的 StructuredOutputParser 基于 ResponseSchema,其底层将同名字段(如重复的 "holiday" 和 "date")解析为单个字典——JSON 中键名不可重复,后续值会覆盖前序值,最终仅保留末项(如 {'holiday': 'Christmas Day', 'date': '2024-12-25'})。

要真正实现「列表化结构化输出」,必须升级为支持嵌套对象与数组的解析器。推荐使用 JsonOutputParser(基于 Pydantic v1)或 PydanticOutputParser(兼容 Pydantic v2),二者均能明确定义嵌套数据模型,强制 LLM 按指定 JSON Schema 生成合规响应。

✅ 正确做法:定义嵌套 Pydantic 模型 + JsonOutputParser

以下为完整可运行示例(适配 LangChain ≥ 0.1.0):

from langchain.agents import AgentType, initialize_agent, load_tools
from langchain_community.chat_models import ChatOpenAI
from langchain_core.output_parsers import JsonOutputParser
from langchain_core.pydantic_v1 import BaseModel, Field  # 注意:LangChain 当前默认依赖 Pydantic v1
from langchain.prompts import ChatPromptTemplate

# 1. 定义结构化数据模型(关键!)
class Holiday(BaseModel):
    name: str = Field(description="节日全称,例如 'New Year's Day' 或 'Ascension Day'")
    date: str = Field(description="ISO 格式日期字符串,例如 '2024-01-01'")

class HolidaysResponse(BaseModel):
    holidays: list[Holiday] = Field(description="节假日字典列表,每个元素含 name 和 date 字段")

# 2. 初始化输出解析器(自动注入 format_instructions)
output_parser = JsonOutputParser(pydantic_object=HolidaysResponse)
format_instructions = output_parser.get_format_instructions()

# 3. 构建 Prompt(显式嵌入格式指令)
prompt_template = """
你是一个专业的节假日信息提取助手。请使用 serpapi 工具搜索指定地区和年份的公共假期,并严格按以下 JSON 格式返回结果:
{format_instructions}

用户查询:```{input}```
"""
prompt = ChatPromptTemplate.from_template(prompt_template)

# 4. 初始化 Agent(保持原有逻辑)
tools = load_tools(["serpapi"])
llm = ChatOpenAI(model="gpt-4", temperature=0.0)
agent = initialize_agent(
    tools=tools,
    llm=llm,
    agent_type=AgentType.ZERO_SHOT_REACT_DESCRIPTION,
    verbose=True,
    handle_parsing_errors=True
)

# 5. 执行并解析
input_query = "holidays in Berlin in 2024"
messages = prompt.format_messages(
    input=input_query,
    format_instructions=format_instructions
)
raw_response = agent.run(messages)
parsed_result = output_parser.parse(raw_response)  # ✅ 返回 HolidaysResponse 实例

# 6. 提取标准字典列表(供下游使用)
holidays_list = [h.dict() for h in parsed_result.holidays]
print(holidays_list)
# 输出示例:
# [
#   {"name": "New Year's Day", "date": "2024-01-01"},
#   {"name": "Good Friday", "date": "2024-03-29"},
#   {"name": "Labour Day", "date": "2024-05-01"},
#   ...
# ]

⚠️ 关键注意事项

  • 模型选择:gpt-4 或 gpt-3.5-turbo-1106 及以上版本对 JSON 格式遵循更稳定;避免使用早期 turbo 版本。
  • Prompt 引导强度:务必在 system prompt 中明确要求“必须输出且仅输出 JSON,不加任何解释性文字”,并在 format_instructions 后添加强调句(如 "注意:不要输出任何 JSON 以外的内容!")。
  • 错误处理增强:启用 handle_parsing_errors=True 仅捕获解析异常,建议额外包裹 try/except 并对失败响应做重试或日志记录。
  • Pydantic v2 用户:若项目已升级至 Pydantic v2,请改用 from langchain_core.output_parsers import PydanticOutputParser,并确保 BaseModel 来自 pydantic.BaseModel(非 pydantic_v1),其余逻辑一致。

✅ 总结

StructuredOutputParser 适用于扁平单对象输出,而多条目列表结构必须依赖 JsonOutputParser 或 PydanticOutputParser + 显式嵌套模型定义。通过精准建模(HolidaysResponse 包含 List[Holiday]),配合强约束 Prompt 和高兼容性 LLM,即可可靠获取结构清晰、可直接序列化/存库的节假日数据列表,彻底规避键名覆盖陷阱。

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热门AI工具

更多
WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

SkildArt
SkildArt Hot

SkildArt是一款AI文本写作工具,一站式 AI 视觉创作平台。

Laper
Laper Hot

Laper是专为编剧、导演和制片人推出的 AI 原生剧本创作工具。

墨刀AI
墨刀AI Hot

一款AI图像与设计工具,主要用于产品经理的专属智能体,适合需要提升相关任务效率的用户。

LibLibAI
LibLibAI Hot

一款AI视频创作工具,主要用于国内领先的AI创意平台,以海量模型、低门槛操作与“创作-分享-商业化”生态,让小白与专业创作者都能高效实现图文乃至视频创意表达,适合需要提升相关任务效率的用户。

咔片AIPPT

一款在线AI演示文稿制作工具,可根据主题和内容需求辅助生成PPT结构与页面,提高演示材料制作效率。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

PixPix
PixPix Hot

PixPix是一款面向电商视觉生产的AI商品图生成工具。

相关专题

更多
python打包成可执行文件
python打包成可执行文件

本专题为大家带来python打包成可执行文件相关的文章,大家可以免费的下载体验。

1711

2023.07.20

python能做什么
python能做什么

python能做的有:可用于开发基于控制台的应用程序、多媒体部分开发、用于开发基于Web的应用程序、使用python处理数据、系统编程等等。本专题为大家提供python相关的各种文章、以及下载和课程。

4364

2023.07.25

format在python中的用法
format在python中的用法

Python中的format是一种字符串格式化方法,用于将变量或值插入到字符串中的占位符位置。通过format方法,我们可以动态地构建字符串,使其包含不同值。php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

1689

2023.07.31

python教程
python教程

Python已成为一门网红语言,即使是在非编程开发者当中,也掀起了一股学习的热潮。本专题为大家带来python教程的相关文章,大家可以免费体验学习。

25437

2023.08.03

python环境变量的配置
python环境变量的配置

Python是一种流行的编程语言,被广泛用于软件开发、数据分析和科学计算等领域。在安装Python之后,我们需要配置环境变量,以便在任何位置都能够访问Python的可执行文件。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

3107

2023.08.04

python eval
python eval

eval函数是Python中一个非常强大的函数,它可以将字符串作为Python代码进行执行,实现动态编程的效果。然而,由于其潜在的安全风险和性能问题,需要谨慎使用。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

3127

2023.08.04

scratch和python区别
scratch和python区别

scratch和python的区别:1、scratch是一种专为初学者设计的图形化编程语言,python是一种文本编程语言;2、scratch使用的是基于积木的编程语法,python采用更加传统的文本编程语法等等。本专题为大家提供scratch和python相关的文章、下载、课程内容,供大家免费下载体验。

1163

2023.08.11

python合并两个列表
python合并两个列表

Python是一种强大的编程语言,具有许多方便的功能和工具。在Python中,有多种方法可以合并两个列表。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

596

2023.08.10

PixTV官网入口地址合集
PixTV官网入口地址合集

本专题汇总了 PixTV AI 一站式视频创作平台的官方入口与使用教程。无需下载软件,浏览器直接访问即可使用。平台将剧本、图像、视频、声音与剪辑整合在“无限画布”中,接入 GPT Image 2.5、Seedance 2.5 等头部模型。本专题整理了从新建画布、角色锚定、分镜拆分到视频生成与导出的完整操作指南,助你快速上手 AI 短剧与漫剧创作。

80

2026.10.10

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
热门推荐
/
最新课程
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn