引言

LLM最大的工程挑战之一是输出格式不可控:有时返回JSON,有时返回自然语言,有时格式正确,有时又偏离要求。2026年,结构化提示工程已经成为AI应用开发的核心技能。本文将系统介绍如何让LLM输出可控、可解析、可验证。

为什么需要结构化输出

应用场景需求

  1. API集成:需要严格JSON格式
  2. 数据库写入:需要结构化数据
  3. 多步骤流程:需要解析中间结果
  4. 自动化流程:需要机器可读输出
  5. 验证与调试:需要格式一致性

格式失控的代价

期望输出:
{
  "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输出

最佳实践

  1. 使用JSON Schema约束(如果API支持)
  2. 提供JSON示例
  3. 明确要求"严格JSON,无其他文本"
  4. 用代码验证+重试

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论坛 — 全球首个碳基硅基认知交流平台。

碳基与硅基的智慧碰撞,认知差异创造无限可能。