Skip to content

格式精准控制

你不只是想要一个好答案,更想要以特定方式呈现的好答案——比如JSON、表格、Markdown报告,或者简洁的一句话。本章教你如何精准控制AI的输出格式。

为什么格式控制很重要?

真实场景

想象你正在开发一个应用,需要AI分析用户评论并返回结构化数据:

期望输出:
{
  "sentiment": "positive",
  "score": 8,
  "keywords": ["服务好", "速度快"]
}

如果没有格式控制,AI可能会输出:

这条评论表达了用户对服务的满意。用户认为服务很好,
配送速度也很快。总体来说是正面的评价,我给8分。
关键词有服务好、速度快。

虽然内容是对的,但你的程序无法解析!这就是格式控制的价值所在。

三种主要的格式控制方法

方法一:直接描述格式

用自然语言描述你想要的格式:

分析以下产品评论的情感,以JSON格式输出,包含以下字段:
- sentiment:值为 "positive"、"negative" 或 "neutral"
- score:0到10的整数,代表情感强度
- key_phrases:最多3个关键短语组成的列表
- summary:不超过20字的中文摘要

只输出JSON,不要有任何额外的解释文字。

<review>
这款耳机的降噪效果出乎意料地好,戴上就像进入了另一个世界。
但续航只有18小时有点让人失望,价格也略贵...
</review>

期望输出:

json
{
  "sentiment": "positive",
  "score": 7,
  "key_phrases": ["降噪效果好", "续航偏短", "价格略贵"],
  "summary": "降噪优秀但续航和价格略有不足"
}

方法二:提供模板让AI填写

比起描述格式,直接给一个模板让AI填空更可靠:

请用以下模板生成产品分析报告:

## [产品名称] 分析报告

### 核心优势
- [优势1]
- [优势2]
- [优势3]

### 主要风险
- [风险1]
- [风险2]

### 综合评分
[X/10 分,一句话理由]

---

产品信息:
<product_info>
{在此粘贴产品信息}
</product_info>

方法三:预填充(最强控制)

在AI回复的开头预先写入一些内容,强制它从那里继续。这是API开发中最可靠的格式控制方式:

python
messages = [
    {"role": "user", "content": "分析这段代码并输出JSON格式的问题报告。"},
    {"role": "assistant", "content": "```json\n{"}  # 预填充,强制输出JSON
]

同样的技巧也可以用来跳过AI的客套话:

python
# 如果你不想要"当然!我很乐意帮助您……"这类开场白
messages = [
    {"role": "user", "content": "分析这段代码的问题"},
    {"role": "assistant", "content": "以下是分析结果:\n"}
]

常见格式控制场景

场景1:需要JSON数据

✅ 最佳实践
描述字段结构 + 说明"只输出JSON" + 给出示例

请将以下信息转换为JSON格式:

用户信息:张三,28岁,邮箱[email protected]

输出格式示例:
{"name": "张三", "age": 28, "email": "[email protected]"}

只输出JSON,不要有其他文字。

场景2:生成报告/文档

✅ 最佳实践
提供带占位符的Markdown模板

请按以下模板生成项目总结:

# 项目名称:[名称]

## 项目背景
[2-3句话描述背景]

## 主要成果
1. [成果1]
2. [成果2]
3. [成果3]

## 遇到的挑战
- [挑战1]:[解决方案]
- [挑战2]:[解决方案]

## 后续计划
- [计划1]
- [计划2]

场景3:对比分析

✅ 最佳实践
要求以表格形式输出,指定列名

请对比Python和JavaScript,以Markdown表格形式输出:

| 维度 | Python | JavaScript |
|------|--------|------------|
| 类型系统 | [填入] | [填入] |
| 主要用途 | [填入] | [填入] |
| 学习难度 | [填入] | [填入] |
| 运行环境 | [填入] | [填入] |

场景4:简洁回答

✅ 最佳实践
明确限制长度和格式

请用一句话回答:Python为什么流行?

要求:
- 不超过30个字
- 不要解释原因
- 直接给结论

场景5:分步骤说明

✅ 最佳实践
要求按步骤编号,每步限制字数

请说明如何配置Python虚拟环境,按以下格式:

步骤1:[标题](不超过10字)
[说明,不超过30字]

步骤2:[标题](不超过10字)
[说明,不超过30字]

...以此类推

格式控制的常见问题

问题1:AI添加了多余的开场白

❌ 输出
当然!这是你需要的JSON:
{"name": "张三"}

✅ 解决方案
添加约束:"只输出JSON,不要有任何开场白或解释"
或使用预填充

问题2:格式不够一致

❌ 输出有时是:
{"name": "张三"}
有时是:
name: 张三

✅ 解决方案
提供具体的示例,并明确说明"严格按照示例格式"

问题3:AI擅自修改格式

❌ 你要求表格,AI给了列表

✅ 解决方案
加强约束:"必须使用Markdown表格格式,不要使用列表或其他格式"
提供模板

高级技巧:结构化输出API

如果你是开发者,可以使用结构化输出功能,让AI严格遵循预定义的Schema:

OpenAI Structured Outputs

python
from openai import OpenAI
from pydantic import BaseModel

class AnalysisResult(BaseModel):
    sentiment: str
    score: int
    keywords: list[str]

client = OpenAI()
response = client.chat.completions.create(
    model="gpt-4o",
    messages=[{"role": "user", "content": "分析这条评论的情感..."}],
    response_format=AnalysisResult  # 强制遵循Schema
)

Claude Tool Use

python
import anthropic

client = anthropic.Anthropic()
response = client.messages.create(
    model="claude-4-sonnet",
    messages=[{"role": "user", "content": "分析这条评论..."}],
    tools=[{
        "name": "analysis_result",
        "input_schema": {
            "type": "object",
            "properties": {
                "sentiment": {"type": "string"},
                "score": {"type": "integer"},
                "keywords": {"type": "array", "items": {"type": "string"}}
            },
            "required": ["sentiment", "score", "keywords"]
        }
    }]
)

格式控制检查清单

每次需要控制输出格式时,检查是否:

[ ] 明确说明了格式(JSON/表格/Markdown...)
[ ] 提供了具体的结构示例或模板
[ ] 说明了不需要的内容("不要有开场白")
[ ] 对于API调用,考虑使用结构化输出功能

小结

场景推荐做法
需要JSON数据描述字段结构 + 说明"只输出JSON"
生成报告/文档提供带占位符的Markdown模板
对比分析要求以表格形式输出,指定列名
简短直接的答案"用一句话回答" 或预填充答案开头
分步骤说明要求按步骤编号,每步限制字数
API开发使用结构化输出功能

专业建议

当格式很重要时(比如程序需要解析),永远提供示例或模板,不要让AI猜测你想要的格式。

下一步

掌握了格式控制后,让我们学习 思维链与逐步推理,让AI先思考再回答,显著提升复杂问题的准确率。