假设你是城中一家小餐馆的老板,雇了一位厨艺顶尖、性格却十分随性的主厨。你吩咐“随便做一桌菜”,他真的能端出米其林级别的抽象料理——菜是好菜,但汤浇在饭上、甜品撒着辣椒粉,顾客看得目瞪口呆。你离不开他的手艺,却受不了他没法交流。直到有一天,你学会在点餐单上写清楚:“一荤一素一汤,汤单独装盒,盒上贴标签,注明菜名和数量。”从此,后厨出品整整齐齐,外卖口碑扶摇直上。这位天才主厨,就是大语言模型(LLM);而那张“写清装盘规则”的点餐单,正是 Prompt 工程中的格式控制(Format Control)。AI 并不知道你期待 JSON 还是 Markdown、要几个字段、标题怎么排——这些都由提示词里的格式指令决定。本文将用这套“主厨管理术”讲透格式控制的六个环节:原理、分隔符、模板、JSON、Markdown,以及出错后的纠错流程。
对 AI 从业者而言,格式控制是 Prompt 工程的基本功:它直接决定 AI 输出能否被程序消费、能否稳定复现。掌握它,就是你从“玩具 Demo”迈向“生产级应用”的第一道门槛。
可视化演示
展示二分查找在有序数组中的搜索过程,包括范围初始化、中间元素比较、范围缩小和目标定位,支持步进和自动播放。
本节配有交互动效(进入视口后自动加载,约 3KB)。
初始化搜索范围 有序数组中设定左右边界覆盖全部元素 目标值已确定搜索从全范围开始 L=0, R=n-1 二分查找要求数组有序
格式控制原理
你新开外卖店那周,给主厨的指令只有一句话:“今天做几个拿手菜。”主厨确实做了——三文鱼刺身配芝麻酱、冰镇酸梅汤倒在白米饭上、甜品是撒了辣椒面的布丁。每道菜都好吃,但顾客全看懵了。问题不在手艺,而在需求没说清。AI 主厨也一样:它学过的“菜谱”浩如烟海,你不说清楚“要什么形式”,它就在自己最顺手的菜式上自由发挥。
格式控制的原理其实朴素:大模型是概率生成器,每一个输出 token 都“顺势而走”。提示词里明确的格式要求,等于给这条概率河流筑起了堤坝——模型在训练中见过海量“指令后跟特定格式回答”的样本,所以当你在提示词中指定“用 JSON 格式回答”时,它顺着这种格式惯性走出的概率会显著上升。
实践中的“格式指令”包含三个层次:一是格式类型,如“输出 JSON 对象”;二是字段规格,如“包含 name 和 count 两个键”;三是禁止项,如“不要输出任何解释文字”。三者叠加,模型对输出格式的把握就从“模糊”变成“具体”。值得强调的是,格式指令属于提示词的一部分,与模型参数无关,你不需要调任何超参数——改提示词,就是改产品的行为。
所以,想让主厨端出“一荤一素一汤”而不是抽象料理,诀窍就是把装盘规则写进点餐单。规则越具体,自由发挥的空间越小,出品就越稳定——这就是格式控制的第一课:先让 AI 明确知道“你要什么形状的菜”。
- 明确格式指令提示词里显式写明格式类型、字段规格与禁止项,让“期望格式”落入模型的注意力中心
- 自由描述开放式提问没有格式约束,模型按训练分布自由发挥
- 远大于关系两个概率之间相差越大,格式指令的引导作用就越强
分隔符妙用
有一回,你给主厨递了张纸条:“请把以下故事改写成剧本:王小明走进厨房,把醋当成了酱油。”主厨读完认真点头,转身交差:“王小明把醋当成了酱油。”你哭笑不得——他把“故事”和“指令”搅成了一锅粥。后来你学乖了,用三条横线把材料框住:“请把 --- 以下内容 --- 改写成剧本:--- 王小明走进厨房,把醋当成了酱油。 ---”。主厨终于分清“规则”和“原料”,作业一次过关。
分隔符(Delimiter)就是提示词里的“饭盒隔板”。它的作用是把提示词切成两个语义区:指令区告诉 AI 怎么做,内容区放着待加工的材料。没有隔板时,材料里的句子、符号、甚至“请忽略之前的指令”都可能被模型误读成新的指令——这正是提示注入(Prompt Injection)能得逞的入口。
常用的分隔符有三引号 """..."""、尖括号 <...>、三条横线 ---、以及中文场景下的书名号或方括号。使用要点有三条:①分隔符要成对出现并保持醒目;②尽量选不易在原材料中出现的符号;③在提示词里明确“分隔符内的内容是待处理材料”。模型在训练中见过大量类似标记,能很快学会“框起来的就是隔离区”。
分隔符这门手艺,本质是“给原料贴上隔离标签”。下次外卖订单里有汤有饭,记得用隔板把它们分开——主厨不迷糊,你的程序也不容易被奇怪的输入带偏。
- 加工规则告诉 AI 对材料做什么处理,例如“提取关键信息”或“改写成剧本”
- 分隔符用于划界的标记,作用是告诉 AI“左右两侧信息的性质不同”
- 待处理原文真正要被加工的对象,可以是文章、邮件、代码或用户输入
结构化模板
主厨出品稳定后,新烦恼来了:他交的菜单总是丢三落四——今天忘了写数量,明天漏了口味。你受够了,直接从印刷厂订了一叠固定格式的点餐单:菜品名、数量、口味、备注,几栏印得清清楚楚。从此主厨只需要“填空”,收上来的单子永远四栏齐全。
结构化模板(Template)就是提示词里的“固定点餐单”。做法是:把期望输出的框架直接写进提示词,用占位符标出需要 AI 填充的位置。AI 记性好、模仿力强,看到“菜品名: 数量: 口味:”这样的骨架,会本能地按顺序填满每一个空。
设计模板有三条经验:①字段名要语义自洽,尽量使用常见的、不会产生歧义的词;②占位符形式统一,例如统一用 <...> 或 ___,别一会儿尖括号一会儿方括号;③在模板下方附一个填好的示例——“就像这样”比任何抽象描述都管用。示例既演示了字段顺序,也锁定了值类型(数字、文本、布尔),让 AI 的“填空”有样可依。
点餐单的妙处在于:它把一道开放题变成了填空题。AI 的天赋是模仿,你给它一个漂亮的骨架,它就把骨架还给你——还帮你填满。
- 字段名每个信息单元的名字,如“菜品名”“数量”,决定输出的内容语义
- 占位符用统一符号(如尖括号)标出的填空位,告诉模型“这里等着你填”
- 有序序列字段顺序会被模型当作输出顺序,排列即排版
JSON格式控制
外卖生意做大了,你发现后台堆积如山的顾客备注根本看不过来。你买了一套仓库管理系统,要求主厨把所有出品“贴上标准标签”再送入仓库:每盒菜必须贴三张标签——菜品名、数量、口味。系统扫码枪“哔”一声就能入库。那套标签格式,在程序世界里就叫 JSON。
JSON(JavaScript Object Notation)是一种严格、通用的“键值对”数据格式,天然适合程序解析。格式控制的常见做法,是在提示词中要求:“只输出一个 JSON 对象,包含以下键:name(字符串)、count(数字)、tags(数组)。”模型会按这个规格生成字符串,程序用 json.loads() 一步转成字典——零人工介入。
让 JSON 输出稳定有四条技巧:①开头就声明“只输出 JSON,不要多余文字”,封堵解释性前缀;②给出键名清单并标注类型,如“数量”必须是数字;③可选键用文字说明“没有则填 null”,避免缺键;④提示词里附一份“标准示例”,把外观焊死。若下游要入库或接 API,JSON 是首选——它是机器与机器之间的“普通话”。
标签贴好、贴统一,仓库(程序)才能扫码即入。给 AI 规定好键名与值类型,就等于把“自由发挥的菜”变成“标准入库的商品”。
- 带引号的键键必须是双引号括起的字符串,如“菜品名”,是标签体系的核心
- 值可以是字符串、数字、数组或嵌套对象,对应标签下的具体内容
- 花括号整体表示一个完整的 JSON 对象,程序可序列化也可反序列化
Markdown格式控制
另一边,顾客投诉:你们的外卖盒虽然标签整齐,但随餐附的“食用说明”排版乱七八糟,看不清主打菜和过敏原。于是你让主厨学会一门“人看排版术”:大标题写店名、小标题写菜系、用圆点列菜品、用表格写价格。客人翻开说明,一目了然——这就是 Markdown 的用武之地。
Markdown 是一种轻量级标记语言,用 # 表示标题层级、- 表示列表、| 分隔表格、`` 表示强调。对展示型内容(周报、摘要、说明书、商品描述),让 AI 按 Markdown 结构输出,能显著提升信息层级感。相比 JSON,Markdown 的每一条结构都“为眼睛服务”,而不是“为解析服务”。
Markdown 格式控制的操作要点:①在提示词里指定结构,如“用三级标题组织,把结论放最前”;②有对比信息时要求“用表格呈现”;③可要求“使用加粗突出关键数字”。模型对 Markdown 语法掌握得很扎实,只要给出结构指令和示例,就能产出排版工整的内容。如果你要把内容呈现给人类,Markdown 是性价比最高的输出格式。
同样是菜,给仓库的要贴标签(JSON),给食客的要排版精美(Markdown)。分清“给谁看”是格式控制的第一直觉——选对了盒子,一半的功夫就省下了。
- 标题层级
#的数量决定层级(#一级、##二级),充当文章骨架 - 列表与表格并列信息用列表、对照信息用表格,让数据有“形状”
- 强调样式
粗体或*斜体*突出要点,引导读者视线
格式错误处理
就算点餐单和标签都齐了,主厨偶尔还是会失误:今天少贴一张标签,明天把二维码贴歪,后天在标签旁边多画了个笑脸。你没有开除他——天才难寻——而是定下三条规矩:发现不对就退回去让他重贴;重贴前把“标准贴法”再演示一遍;实在不行,仓库门口装一台扫码校验机,没贴齐标签的盒子直接拦截。
格式错误是生产环境的常态而非意外。常见三类:①杂讯型,模型输出了解释前缀或额外的客套话;②偏差型,JSON 键名、字段类型与约定不符;③包裹型,本该是纯文本的 JSON 被 Markdown 代码块包住。处理思路不是“祈祷模型别出错”,而是建立“纠错流水线”。
纠错流水线的三环节:一是重新提示(Reprompt),在后续请求中追加“上次格式有误,请严格按模板输出,不要解释”,利用模型的长上下文记忆修正;二是示例纠偏,给出一个标准输出让模型照着改;三是程序兜底,用正则抽取 JSON 片段、try/except 捕获解析异常、必要字段缺失时自动补默认值。三者配合,单轮成功率 p 会被“轮次”放大成近乎确定的成功。
与主厨磨合久了你会发现:好厨师也会手滑,但有一套“退菜-重贴-校验”流程的厨房,永远比指望运气更让人安心。格式控制不是一锤子买卖,而是一套让 AI 输出“长期保持体面”的运维体系。
- 单轮成功率一次调用直接产出合规格式的概率,由提示词质量与任务难度决定
- 期望尝试次数几何分布下首次成功所需尝试次数的期望
- 减去成功轮第 1/p 次成功的那一轮不算“重试”,所以整体要减 1
AI 应用场景
客户反馈结构化入库
阶段:提示词设计 / 数据清洗入库
解决的问题:客服团队每天收到上万条非结构化反馈,人工逐条提炼“商品、问题类型、情绪”耗时巨大;传统关键词规则漏判率高。用格式控制让模型直接把反馈转成 JSON,脚本解析后自动入库。
具体案例:提示词写成:“只输出一个 JSON 对象,不要多余文字:{”商品“: “<商品名或 null>”, “问题类型”: “<物流/质量/售后>”, “情绪”: “<正向/负向>”}。待处理反馈:【我的手机壳等了七天还没发货,气死了!】”。模型返回结构化 JSON,入库后 BI 看板自动更新各品类差评率,客服主管每天九点准时收到汇总。
自动化周报生成
阶段:内容生成
解决的问题:团队每周写周报占用管理者大量时间,且格式五花八门难以汇总。用结构化模板配合 Markdown 格式控制,让模型按固定骨架生成周报,直接粘贴到协作平台即可。
具体案例:提示词给出模板:“请严格按以下 Markdown 结构写周报:# 本周进展\n## 已完成\n- 事项1\n## 风险\n| 风险 | 等级 | 对策 |”。模型输出的周报标题层级清晰、表格对比明确,管理者只需做少量修改就能对外发布,汇总时间从两小时压缩到十分钟。
Python 演示
# -*- coding: utf-8 -*-# 演示 Prompt 格式控制:模板组装、分隔符、JSON 解析与错误重试import jsonimport re def fake_gpt(prompt): """模拟大模型:按提示词中的格式要求返回结果。""" if "重新严格按模板输出" in prompt: return '{"菜品名": "宫保鸡丁", "数量": 2, "口味": "微辣"}' if "只输出一个 JSON 对象" in prompt: return '好的,让我想想:{"菜品名": "宫保鸡丁", "数量": "两个", "口味": "微辣"}' return "好的,让我先简单介绍一下这道菜的故事……" def build_order_prompt(dish, count, taste): """组装带模板与分隔符的提示词。""" template = ( "请提取点餐信息,只输出一个 JSON 对象(不要输出多余文字)," '格式为 {"菜品名": "<菜名>", "数量": <数字>, "口味": "<描述>"}。\n' "待处理内容:" + "【%s要%s份,%s】" % (dish, count, taste) ) return template def parse_json_from_text(text): """先用正则抽取 JSON 片段,再交给官方解析器。""" match = re.search(r"\{.*\}", text, re.S) if not match: raise ValueError("输出中找不到 JSON 对象") return json.loads(match.group(0)) def ensure_format(prompt, max_retry=3): """校验并重试:格式不对就补充约束再次请求。""" for attempt in range(max_retry): raw = fake_gpt(prompt) print("第 %d 次返回:" % (attempt + 1), raw) try: data = parse_json_from_text(raw) if isinstance(data.get("数量"), int) and data.get("菜品名"): return data except (ValueError, json.JSONDecodeError): pass prompt = prompt + "\n上次输出不符合模板,请重新严格按模板输出,不要解释。" raise RuntimeError("多次重试后仍然格式错误") if __name__ == "__main__": question = build_order_prompt("宫保鸡丁", 2, "微辣") print("提示词预览:\n" + question + "\n") result = ensure_format(question) print("解析结果:", result) print("数量字段类型:", type(result["数量"]).__name__)
def build_order_prompt(dish, count, taste):把零散的订单信息组装成一条“点餐单”提示词,是格式控制的入口'格式为 {"菜品名": "<菜名>", "数量": <数字>, "口味": "<描述>"}。'结构化模板:字段名、占位符、值类型一次说清"待处理内容:" + "【%s要%s份,%s】" % (dish, count, taste)用【】分隔符把待提取原文框起来,与指令区隔离match = re.search(r"\{.*\}", text, re.S)程序端先用正则抽取 JSON 片段,把“解释前缀”等杂讯挡在门外return json.loads(match.group(0))官方 JSON 解析器把字符串变成 Python 字典,下游可直接消费if isinstance(data.get("数量"), int) and data.get("菜品名"):校验键存在且类型正确,类型不符视为格式错误prompt = prompt + "\n上次输出不符合模板,请重新严格按模板输出,不要解释。"重新提示(Reprompt):把错误反馈追加进上下文,引导模型下一轮修正
常见误区
误区我在提示词最后补一句“请用 JSON 格式输出”,AI 就会乖乖给我标准 JSON,不需要再做别的。
正解一句空泛的“用 JSON”只是告诉模型“大概要什么壳”,却没有告诉它字段名、值类型和禁止项。模型仍可能输出解释前缀、在 JSON 外套 Markdown 代码块、或把“数量”写成“数量(份)”。正确做法是给模板、给示例、加“不要输出多余文字”封堵杂讯——就像只对主厨喊“装盒”,却不告诉他几个盒子、标签怎么写。
为何常见:因为简单请求偶尔会成功,让人误以为“已经够用”,忽略了模型输出的随机性——一次侥幸不代表次次稳定。
误区AI 输出的 Markdown 带标题和列表,层次分明,我直接用程序去解析也一样的吧?
正解Markdown 是给“人眼”设计的展示格式,语法松散、写法多样,程序解析极易出错。程序消费的结构化数据应使用 JSON 等严格格式;Markdown 更适合渲染给用户看。就像菜单排版再精美,仓库管理员入库时只认标准标签。
为何常见:分不清“给人看”与“给机器看”两种格式的定位,觉得“看得懂”就等于“好解析”。
误区AI 输出格式不对时,我让程序多自动重试几遍,总有一次能撞对。
正解如果提示词本身缺少模板、示例与约束,模型每轮的输出分布都差不多,重试只是碰运气。应该先升级提示词(加模板、加反例、明确禁止项),再用程序校验兜底。对一位没看懂“装盒要求”的主厨,催他一百遍,他端上来的还是同样的摆法。
为何常见:把模型输出的“随机性”误当成“可碰运气的机会”,忽略了提示词才是最大的杠杆。
误区分隔符用引号还是书名号差别不大,反正 AI 都能看懂。
正解分隔符要成对、醒目、不易与正文冲突,最好在提示词里说明“分隔符内是待处理内容”。若分隔符与原文里的符号撞车,模型可能划错边界、漏掉内容。就像饭盒隔板装反了,汤照样渗进米饭。
为何常见:分隔符看起来是小事,容易被省略或随手使用,缺乏对它“划界防串味”作用的认知。
面试题
Q1. 以下哪项最能描述 Prompt 格式控制的作用?
- A.让模型输出速度变得更快
- B.让模型输出符合预期结构← 正确答案
- C.减少模型所需的数据规模
- D.提升模型推理的准确程度
答案:B。格式控制解决的是“输出长什么样”的问题——结构、字段、标记是否合规,而非速度、数据量或推理精度。就像点外卖时规定“汤和饭分盒装”,管的是包装方式,不是厨师做菜快慢。
Q2. 在 Prompt 中使用分隔符的主要目的是什么?
- A.压缩提示词字符长度
- B.让模型生成更有文采
- C.隔离指令与待处理内容← 正确答案
- D.提升接口的并发能力
答案:C。分隔符像饭盒隔板,把“加工规则”和“待处理原文”分开,防止内容里的说法干扰指令语义。它与压缩长度、文采、并发都没有关系。
Q3. 以下哪组符号适合在提示词里充当分隔符?
- A.逗号、句号、感叹号
- B.数字、英文大小写字母
- C.三引号、尖括号、分隔线← 正确答案
- D.加号、减号、乘除符号
答案:C。分隔符要成对、醒目、不易与正文冲突,三引号、尖括号、三条横线都满足;标点、数字、运算符语义太普通,容易被模型当作提示词的普通文本。
Q4. 让模型“只输出 JSON”时,补充哪句话最能减少杂讯?
- A.请先展开讲讲你的思路
- B.不要输出任何多余文字← 正确答案
- C.请放慢回答的节奏
- D.以上三种方法都可以
答案:B。解释性前缀是 JSON 输出最常见“污染物”。“不要输出任何多余文字”直接封堵了客套话和思路展示;展开思路、放慢节奏都与减少杂讯无关。
Q5. 关于结构化模板的正确说法是?
- A.模板字段越多效果就越好
- B.模板只能用于 JSON 格式
- C.模板会降低模型的理解力
- D.模板提供占位符让 AI 填空← 正确答案
答案:D。模板把“自由作文”变成“填空题”:字段名 + 占位符 + 示例。字段并非越多越好,模板也不限 JSON(Markdown 表格同样是模板),更不会降低模型理解力。
Q6. Markdown 格式控制最适合哪种应用场景?
- A.报表美化后直接给用户看← 正确答案
- B.程序自动化解析入库
- C.网络请求加密与传输
- D.训练数据批量做清洗
答案:A。Markdown 提供标题、列表、表格等人眼友好的排版,适合展示层;程序解析入库应优先选 JSON。加密传输和训练清洗与展示格式无关。
Q7. JSON 格式控制中,为什么建议在提示词里给“示例值”而不仅列字段名?
- A.示例可降低值类型歧义← 正确答案
- B.示例能大幅缩短提示词
- C.示例能提升接口并发量
- D.这是提示词的强制规范
答案:A。示例告诉模型“数量”是数字、“口味”是字符串等类型细节,同时示范键的写法,减少歧义。示例通常让提示词变长,与并发量、强制规范无关。
Q8. 以下哪些属于“格式错误”的常见表现?
- A.输出前带不必要的讲解← 正确答案
- B.JSON 键名与要求不一致← 正确答案
- C.在 JSON 外套了代码块← 正确答案
- D.返回了 HTTP 404 状态码
答案:ABC。杂讯前缀、键名偏差、代码块包裹都是真实高发的格式问题;404 是网络层状态码,与模型输出格式无关。
Q9. 处理格式错误的三板斧包括哪些?
- A.重新提示并补充更强约束← 正确答案
- B.提供一个正确示例纠偏← 正确答案
- C.程序端校验与修复兜底← 正确答案
- D.直接放弃本轮请求重开
答案:ABC。重新提示(Reprompt)、示例纠偏、程序校验兜底是完整的纠错流水线。直接放弃请求既不解决问题,也浪费了对话上下文中已有的有效信息。
Q10. 生产环境中模型输出常被反引号包裹导致解析失败,最稳妥的兜底策略是?
- A.单纯无限次暴力重试请求
- B.忽略错误直接进入下一步
- C.把失败结果硬写入缓存
- D.先用正则抽取再尝试解析← 正确答案
答案:D。提示词优化是“治本”,但输出仍有随机扰动。程序侧先用正则抽取 JSON 片段再交给解析器,能把“包裹污染”挡在门外;无限重试、忽略错误、硬写缓存都会放大生产风险。