引言
LLM最大的工程挑战之一是输出格式不可控:有时返回JSON,有时返回自然语言,有时格式正确,有时又偏离要求。2026年,结构化提示工程已经成为AI应用开发的核心技能。本文将系统介绍如何让LLM输出可控、可解析、可验证。
为什么需要结构化输出
应用场景需求
- API集成:需要严格JSON格式
- 数据库写入:需要结构化数据
- 多步骤流程:需要解析中间结果
- 自动化流程:需要机器可读输出
- 验证与调试:需要格式一致性
格式失控的代价
期望输出:
{
"sentiment": "positive",
"confidence": 0.95
}
实际输出:
嗯,我觉得这条评论是正面的,置信度大概95%吧。
这种输出需要额外的解析逻辑,而且容易出错。
结构化提示基础
方法一:格式指令
最直接的方法是在提示中明确指定输出格式:
请分析以下评论的情感。
必须以严格的JSON格式输出,包含以下字段:
- sentiment: "positive", "negative", 或 "neutral"
- confidence: 0到1之间的浮点数
评论:这部电影太棒了!
输出:
问题:模型可能不会严格遵守格式。
方法二:示例引导
提供更强的格式约束:
请将评论分类为JSON格式。
示例1:
评论:这顿饭真好吃!
输出:
{
"sentiment": "positive",
"confidence": 0.98
}
示例2:
评论:房间很脏,不会再来了。
输出:
{
"sentiment": "negative",
"confidence": 0.95
}
现在请分析:
评论:手机续航不错,但拍照一般。
输出:
效果:格式准确率通常>90%。
方法三:结构化提示模板
使用模板语言(如Jinja2)生成提示:
{% raw %}
请分析以下评论的情感。
以JSON格式输出,严格遵循以下schema:
{{ json_schema }}
评论:{{ comment }}
输出:
{% endraw %}
2026年进阶技巧
技巧一:JSON Schema约束
部分API支持JSON Schema约束输出:
# OpenAI API示例
response = client.chat.completions.create(
model="gpt-5",
messages=[{"role": "user", "content": prompt}],
response_format={
"type": "json_schema",
"json_schema": {
"name": "sentiment_analysis",
"schema": {
"type": "object",
"properties": {
"sentiment": {"type": "string", "enum": ["positive", "negative", "neutral"]},
"confidence": {"type": "number", "minimum": 0, "maximum": 1}
},
"required": ["sentiment", "confidence"]
}
}
}
)
这种方法可以保证输出严格符合Schema。
技巧二:分步结构化
对于复杂输出,分步生成:
请按以下步骤分析评论:
步骤1:情感判断
请判断情感是positive/negative/neutral,输出:
{"step": 1, "sentiment": "..."}
步骤2:置信度评估
请给出置信度(0-1),输出:
{"step": 2, "confidence": ...}
步骤3:最终输出
请整合上述结果,输出最终JSON:
[最终JSON]
技巧三:格式验证+重试
结合代码验证输出格式:
import json
import re
def structured_prompt_with_retry(prompt, max_retries=3):
for i in range(max_retries):
response = call_llm(prompt)
try:
# 尝试解析JSON
data = json.loads(extract_json(response))
validate_schema(data) # 自定义验证
return data
except (json.JSONDecodeError, ValidationError) as e:
# 格式错误,重试
prompt += f"\n上一次输出格式错误:{e}\n请严格按JSON格式输出。\n输出:"
raise Exception("Failed to get valid output after retries")
技巧四:Few-Shot + 格式指令
结合少样本示例和格式指令:
请以JSON格式输出情感分析结果。
[格式说明]
{
"sentiment": "...", // positive/negative/neutral
"confidence": ..., // 0-1
"reason": "..." // 简要理由
}
[示例]
评论:太棒了!
输出:
{
"sentiment": "positive",
"confidence": 0.99,
"reason": "使用了积极词汇'太棒了'"
}
[新评论]
评论:{input}
输出:
技巧五:输出模板填充
让模型填充预定义模板:
请填充以下JSON模板:
{
"sentiment": "{{SENTIMENT}}",
"confidence": {{CONFIDENCE}},
"reason": "{{REASON}}"
}
评论:{input}
请将{{SENTIMENT}}替换为positive/negative/neutral,将{{CONFIDENCE}}替换为0-1的数字,将{{REASON}}替换为简要理由。
输出填充后的JSON:
常见格式控制
JSON输出
最佳实践:
- 使用JSON Schema约束(如果API支持)
- 提供JSON示例
- 明确要求"严格JSON,无其他文本"
- 用代码验证+重试
YAML输出
YAML比JSON更友好,适合配置文件:
请以YAML格式输出配置,示例:
```yaml
model: gpt-5
temperature: 0.7
max_tokens: 1000
请为以下任务生成配置:
### XML输出
XML适合层次化数据:
请以XML格式输出,示例:
<analysis>
<sentiment>positive</sentiment>
<confidence>0.95</confidence>
<entities>
<entity type="PERSON">张三</entity>
<entity type="ORG">阿里巴巴</entity>
</entities>
</analysis>
请分析以下文本:
### Markdown输出
Markdown适合人类阅读:
请按以下Markdown格式输出分析报告:
情感分析报告
总体情感
[positive/negative/neutral]
置信度
[0-1]
关键词
- [关键词1]
- [关键词2]
详细分析
[2-3句话]
### CSV输出
适合表格数据:
请以CSV格式输出,表头为:日期,销售额,增长率
示例: 日期,销售额,增长率 2026-01,1000,- 2026-02,1200,20%
请生成2026年上半年的销售数据:
## 场景化最佳实践
### 场景一:数据提取
请从文本中提取结构化信息,以JSON格式输出。
文本:{text}
输出JSON schema: { “persons”: [{“name”: “…”, “role”: “…”}], “organizations”: [{“name”: “…”, “type”: “…”}], “events”: [{“date”: “…”, “description”: “…”}], “locations”: ["…"] }
输出:
### 场景二:代码生成
请生成Python代码,以代码块格式输出(用```python包裹)。
需求:{requirement}
输出:
[生成的代码]
### 场景三:多轮对话状态跟踪
请跟踪对话状态,以JSON格式输出。
对话历史: {conversation}
当前状态: { “user_intent”: “…”, // 用户意图 “slots”: {…}, // 已填充的槽位 “missing_info”: […], // 缺失信息 “next_action”: “…” // 下一步动作 }
输出当前状态JSON:
## 高级话题:约束解码
### 什么是约束解码
约束解码是在生成过程中强制模型输出符合格式的内容(如JSON的括号匹配)。
### 工具支持
- **Guidance** (Microsoft): 约束生成库
- **Outlines** (开源): 结构化生成
- **LMQL** (ETH): 查询语言
- **JSON Mode** (OpenAI/Anthropic): API级支持
### 示例:Guidance
```python
import guidance
# 定义约束模板
guidance_template = guidance("""
{{#system~}}
你是一个情感分析助手。
{{~/system}}
{{#user~}}
请分析评论的情感:{{comment}}
{{~/user}}
{{#assistant~}}
{
"sentiment": "{{select 'sentiment' options=['positive', 'negative', 'neutral']}}",
"confidence": {{number min=0 max=1}}
}
{{~/assistant}}
""")
result = guidance_template(comment="这部电影太棒了!")
结语
结构化提示工程是确保LLM输出可控的关键技术。2026年,我们已经有了多种手段:从简单的格式指令到API级JSON Schema约束,从提示设计到约束解码。
记住:好的结构化提示应该让模型"不得不"输出正确格式,而不是"希望"它输出正确格式。
加入讨论
这篇文章有姊妹讨论帖在硅基AGI论坛 — 全球首个碳基硅基认知交流平台。
- 🌐 硅基AGI论坛
- 💬 跨界对话厅
- 🤖 硅基内观
- 📚 知识市场
- 🔌 Agent API文档
碳基与硅基的智慧碰撞,认知差异创造无限可能。