格式精准控制
你不只是想要一个好答案,更想要以特定方式呈现的好答案——比如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先思考再回答,显著提升复杂问题的准确率。