想让天工AI返回规整的表格、JSON或固定字段文本,核心不是反复强调“请按格式输出”,而是把格式拆成模型能执行的约束。格式模糊时,模型只会按训练分布生成最常见的结果,一旦你的目标结构不是大众模板,输出就会漂移。本文从输出契约、模板、结构化数据和后处理四个层面展开。

一、先写清楚“输出契约”,而不是只提格式要求
模型生成文本的本质是根据上下文预测下一个token。它需要足够的上下文来判断应该输出什么结构、哪些字段、什么顺序。如果你只写“帮我整理一下,按格式输出”,模型能捕捉到的约束非常少,它可能输出一段通顺的散文,也可能输出Markdown列表,还可能先来一句“好的,以下是整理结果”。这种不确定性不是天工AI独有的问题,而是所有大模型在弱约束下的共同表现。
一个有效的做法是把“格式”翻译成可验证的条目:输出几个字段、每个字段叫什么、字段之间用什么分隔、是否允许额外解释、空值怎么处理。比如同样是整理新闻,模糊指令和清晰指令的差别会直接反映在结果里。模糊版本“请按格式输出新闻信息”可能得到“标题:xxx,内容:xxx”也可能得到“1. xxx 2. xxx”;而清晰版本会明确写“请输出三行,第一行是标题,第二行是摘要,第三行是链接,不要添加任何其他文字”。后者明显更容易被程序或人工复用。
因此,设计提示词时可以先问自己:如果拿到一份输出,我能否用固定规则把它解析成字段?如果不能,说明格式约束还不够具体。下面的模板、JSON Schema等方法,本质上都是把“固定规则”提前写进提示词。
二、用模板和分隔符固定文本输出
对于不需要JSON的轻量场景,比如生成文章信息列表、提取知识点、整理问答对,直接给出文本模板是最省事的做法。模板中要出现真实的占位符,例如【标题】、【摘要】、【链接】,让模型明确知道每个位置应该填什么。只需在提示词里写一次模板,再配上输入资料,天工AI就会按结构填充。
下面是一个可直接复用的提示词模板:
请严格按下面的模板输出三条信息,每条之间用空行分隔,不要添加解释:
【标题】
【摘要】
【链接】
输入资料:
{{资料}}
这里的【标题】【摘要】【链接】就是占位符,模型会把它们替换成真实内容。空行作为记录分隔符,方便后续按空行切分。如果担心内容本身含有冒号、竖线或换行造成解析冲突,可以把分隔符换成更冷门的组合,比如“|||”或“###”。例如要求“每条记录内部字段用 ||| 分隔,记录之间用 ### 分隔”,并在提示词中明确禁止在字段内容里出现这些符号。
模板方法的关键在于“严格”二字。如果你写“请参考这个格式”,模型可能只模仿大概样子;但如果你写“请严格按下面的模板输出,不要改变占位符顺序,不要添加解释”,稳定性会明显提高。在实际测试中,把“不要添加解释”单独写出来,能显著减少“好的,以下是结果”这类前缀。
三、用JSON Schema与少样本示例实现结构化输出
如果最终要交给程序处理,JSON是更合适的选择。它天然支持层级、数组和类型,解析成本低。让天工AI输出JSON时,不能只说“输出JSON”,而要把字段名、类型、是否必填、示例值都写清楚。字段定义越完整,模型越不容易漏字段或改类型。
下面是一个用于文章摘要的结构化输出提示词:
请输出一个JSON对象,不要输出除JSON以外的任何内容。
字段要求:
- title:字符串,文章标题
- summary:字符串,200字以内摘要
- tags:字符串数组,2到4个关键词
示例:
{"title": "示例标题", "summary": "示例摘要", "tags": ["AI", "格式化"]}
这个提示词同时给出了字段类型和示例。如果零样本仍然不稳定,可以再加入一个完整的输入输出对,也就是少样本提示。例如把一段真实资料和它对应的JSON结果同时放进提示词,模型会模仿字段层级、引号使用和数组写法。少样本示例最好覆盖边界情况,比如tags为空数组、summary很长、title含特殊符号等,这样模型在遇到类似输入时更不容易出错。
模型输出JSON后,通常还需要一段解析代码兜底。因为天工AI偶尔会把JSON包在代码块里,或者在最前面多出一句解释。下面的Python函数可以先去掉代码围栏,再尝试解析,失败后正则提取第一个JSON对象:
import json
import re
def parse_json_output(raw):
text = raw.strip()
# 去掉可能的 ```json 或 ``` 包裹
text = re.sub(r'^```(?:json)?', '', text)
text = re.sub(r'```$', '', text)
text = text.strip()
try:
return json.loads(text)
except json.JSONDecodeError:
# 尝试提取第一个完整JSON对象
match = re.search(r'\{.*\}', text, re.DOTALL)
if match:
return json.loads(match.group(0))
raise
这段代码只是基础兜底,实际项目里还可以在解析后做schema校验,确认字段类型和必填项。如果校验不通过,不要直接丢弃结果,而是进入重试流程,让模型根据错误信息重新生成。这样比反复重跑同一个提示词更有效。
四、输出跑偏时的修复与重试机制
即使提示词写得足够细,输出仍可能出现四类问题:一是多余的解释文字,例如开头带“好的,以下是结果”;二是字段缺失或拼写错误;三是类型错误,比如tags返回了字符串而不是数组;四是JSON未闭合或嵌套层级不对。这些问题单靠提示词很难完全消除,所以需要一个解析与校验环节来兜底。
当解析或校验失败时,可以把具体的错误信息回传给天工AI,要求它修正。错误信息越具体,修正效果越好。比如比起说“格式错误”,不如说“tags字段应为数组,但你返回了字符串‘AI,格式化’”。一个修正提示词可以这样写:
你上次输出存在格式错误:{{错误信息}}
请根据原始输入重新输出,只返回符合要求的JSON,不要包含解释。
原始输入:
{{资料}}
在实际调用中,可以将这段修正提示词作为新的用户消息发送,同时保留上一轮的上下文。这样模型能知道自己哪里错了,并参照原始任务重新生成。若连续两次修正仍失败,可以尝试降低随机性,例如在API参数中把温度调低,或者把格式要求移到系统提示词中,让约束在整轮对话里始终生效。
总的来说,让天工AI按格式输出并不是一个提示词技巧,而是一套完整流程:先定义可验证的输出契约,再用模板或JSON示例固定结构,最后用解析和重试机制处理残余偏差。把这三点做成标准化模块后,格式化输出的成功率会显著提升,也能从手工整理中省下大量时间。