1. 当你用到返回格式需要是json_object时
planner = llm.with_structured_output(Sections)
只要你开了response_format: json_object你的对话消息里 必须出现 "json" 这个单词(大小写都行)不然直接报错 400!
你现在的 System Prompt 是:
ini
SystemMessage(content="Generate a plan for the report.")
里面完全没有 json → 所以报错!
怎么修?
只需要在你的 SystemMessage 里加一个 json 单词就行!
修复后代码(只改一行)
less
report_sections = planner.invoke(
[
# 👇 就加个 "JSON" 在里面,立刻不报错
SystemMessage(content="Generate a plan for the report in valid JSON."),
HumanMessage(content=f"Here is the report topic: {state['topic']}"),
]
)
或者中文版本:
ini
SystemMessage(content="生成报告计划,**必须输出 JSON 格式**。")
只要出现 json/JSON 这个词,错误立刻消失!
为什么 LangGraph 官方示例不报错?
因为官方用的是 OpenAI ,没有这个奇葩限制!
Qwen / 阿里通义 自己加的规则:
- 开
json_object→ 必须提示词里带 json - 不然直接拦死
你现在完整正确、不会报错的代码
python
def orchestrator(state: State):
"""Orchestrator that generates a plan for the report"""
report_sections = planner.invoke(
[
# ✅ 修复:加了 JSON 单词
SystemMessage(content="Generate a plan for the report. Output response in JSON format."),
HumanMessage(content=f"Here is the report topic: {state['topic']}"),
]
)
return {"sections": report_sections.sections}
2.pydantic 字段类型校验未通过
发生异常: ValidationError 7 validation errors for Sections sections.0.name Field required type=missing, input_value={'section_number': 1, 'ti...ectives of the Report'}, input_type=dict] For further information visit errors.pydantic.dev/2.13/v/miss... sections.1.name Field required type=missing, input_value={'section_number': 2, 'ti...al Training Paradigms'}, input_type=dict] For further information visit errors.pydantic.dev/2.13/v/miss... sections.2.name Field required type=missing, input_value={'section_number': 3, 'ti...wer-Law Relationships'}, input_type=dict] For further information visit errors.pydantic.dev/2.13/v/miss... sections.3.name Field required type=missing, input_value={'section_number': 4, 'ti...e Resource Allocation'}, input_type=dict] For further information visit errors.pydantic.dev/2.13/v/miss...
swift
sections.0.name Field required
意思是:你的 Sections 模型要求每个章节必须有 name 字段,但 Qwen 输出的是 title /section_number,没有 name!
1. 先看你现在的 Schema(错误根源)
python
class Section(BaseModel):
name: str # 👈 你要求必须有 name
section_number: int
class Sections(BaseModel):
sections: list[Section]
但 Qwen 输出的是:
bash
{
"section_number": 1,
"title": "Introduction" # 👈 它输出 title,不是 name!
}
→ 字段对不上 → ValidationError
2. 一秒修复(二选一,都能立刻好)
方案 A:把 Schema 改成 title(推荐,最稳)
python
class Section(BaseModel):
title: str # 👈 改成 title
section_number: int
class Sections(BaseModel):
sections: list[Section]
方案 B:让模型输出 name(改 Prompt)
ini
SystemMessage(content="""
Generate a plan for the report. Output response in JSON format.
Each section MUST have a field called "name", not "title"!
""")