什么是结构化输出?让 AI 按字段交卷,少交一篇顺口的废话

让 AI 比较方案,它常交回一篇很顺的短文,月费和限制条件却找不着。这篇讲清结构化输出是什么,怎样规定字段让缺失变成空格,以及格式正确为什么仍不等于内容为真。

什么是结构化输出?让 AI 按字段交卷,少交一篇顺口的废话

你让 AI 比较两家服务,它回了一篇很顺的短文:功能全面、价格合理、适合大多数人。你真正想找的三样东西——月费、能不能按月取消、有没有写明数据保留多久——在文章里都没出现,或者被揉进一句“总体来说很灵活”。字是够了,表是空的。

结构化输出要解决的就是这个。你先规定交卷的格子,它只能往格子里填。填不出的格子保持空白,不能用一段好听的话把空白糊上。

一段话为什么总像已经答完

普通聊天时,模型在续写一段通顺的文字。通顺本身就会制造“答完了”的感觉:句子有开头、有转折、有收束,读者的注意力被语气带走。缺的事实只要不单独占一格,就很容易混进“一般来说”。

这也是幻觉特别会藏的地方。编一个数字放进流畅的句子里,比留下一个空单元格更不像出错。你要的不是更会写的模型,而是一个不愿意用句子填洞的格式。

散文奖励完整。表格惩罚空白。把任务换成表格,空着就会显眼。

结构化输出就是先画好格子

结构化输出的意思是:回答必须符合你事先定好的形状。形状可以是一张表的列名,也可以是一组字段,比如“名称、金额、日期、来源原句、不确定的地方”。程序或你自己都能检查:该有的列在不在,不该猜的地方是不是写成了“未知”。

开发者用的产品里,这常被叫作 JSON 模式或按结构输出。模型被要求交回一份机器能读的数据,缺字段会被判不合格,而不是被当成一篇还行的文章。你不是开发者也可以用同一思想:在对话里把列名写死,并规定空值怎么写。

它和工具调用相邻,但不是同一件事。工具调用是模型举手,让旁边的程序去搜索或计算,再把结果拿回来。结构化输出是模型交卷时必须按格子填。一次回答可以两件事都发生:先调用计算器,再把得数填进“金额”那一列。只规定格式,不会让它真的去算。数字仍然要核对。

一段话按字段交卷
缺信息时容易写成“通常可以”“比较灵活”该格写“材料未写明”
你怎么检查通读,靠感觉找漏洞按列看,空格和原句对得上吗
适合什么还没想清问题、需要来回讨论要比较、要摘录、要交给下一步使用
仍然会错的地方语气很确定地编格式全对,格子里仍是编的

不用写程序,也能把格子定死

你可以直接这样说:

请把下面的材料整理成表格,列只能是:项目、材料中的原句、我该做的下一步、不确定之处。每一行必须有原句。材料没写的,填“未写明”,不要用常识补。不要在表格外面再写一段总结。

最后一句很要紧。模型喜欢在表格后面再补一段“综合来看”,把你刚禁掉的猜测又写回来。只要格子,就明确说不要表格外的散文。

列不要贪多。四列能用,就不要八列。列越多,它越会为了填满而编。一个好格子只问你下一步真的会用到的东西:谁、多少钱、哪一天、依据是哪一句、哪里还不知道。

结构化输出要求缺失信息写成未知而不是补成完整句子
空着的格子是结果的一部分。把它填成“看起来合理”,格子就失效了。

三种常见任务,格子可以怎么画

  • 比较:方案、月费、能否取消、数据保留、材料原句。没有原句的单元格写“未写明”;
  • 摘录:日期、金额、责任人、条件、原句。条件包括“仅当、除外、截至”;
  • 行动:下一步、谁来做、何时之前、做完交什么。缺时间就空着,不要写成“尽快”。

比较时最容易被“总体更合适”带跑。你可以把结论列改成“在哪一个字段上不同”,禁止它写“推荐你选哪一个”。选择是你的事。它的事是把差异放进能对账的格子。

材料很长时,还要记得中段更容易被漏。结构化输出不会自动读匀长文。格子规定的是交卷形状,不是阅读质量。长材料先切片,每次只让它填这一节的表,再把几张表合起来。一次把三十页塞进去要一张总表,中段的例外仍可能整行消失。

一张表怎么从“像答案”变成能核对

假设材料只有三句:甲方案月费 30 元,按月扣;乙方案写了“年付更划算”,没写月费;两边都没写数据保留多久。你要的表不该长成一篇推荐。

项目材料原句下一步不确定
甲的月费月费 30 元,按月扣核对这句是否仍在最新报价单未写明能否中途取消
乙的月费未写明向对方要月费,而不是年付口号未写明
数据保留未写明先不要填任何天数材料未写

坏表长这样:乙的月费被写成“大约 25 元”,数据保留被写成“通常 30 天”,下面再加一句“综合建议选乙”。这三个数和这句建议都不是材料里的。格子的用处,就是让你能一眼删掉它们。

你还可以规定允许填写的词。比如“下一步”只准用:核对原句、向对方提问、先不做。模型一旦写出第四种,比如“建议购买”,你就知道它越过了格子。允许的词越少,它越难用一个新句子把决定偷偷做完。

格式全对,内容仍可能是编的

这是结构化输出最容易给人的错觉:既然是表格、既然字段都在,它就比一段话更真。不是。模型可以按你的列名,把编出来的月费、日期和“原句”填得整整齐齐。原句那一列如果在原文里搜不到,这一行就作废,不管其他列写得多像。

所以检查顺序是固定的:

  1. 该有的列在不在,有没有表格外面的散文;
  2. “未写明”是不是被改成了具体数字或日期;
  3. 原句能不能在材料里找到,旁边的限制词还在不在;
  4. 金额和日期再对一次原文,不靠它的转述。

四步里任何一步失败,就不要把这张表交到下一步。下一步包括发给同事、填进自己的预算、拿去和对方确认。表是草稿的形状,不是已经核对过的事实。

结构化输出格式正确后仍需核对每个字段的原文
列名齐了,只说明形状对了。每一格仍要能回到原句。

什么时候先别用格子

问题还没想清时,硬要表格会把探索变成填空。你还不知道该比较哪几项,就让它先列出“要做这个决定,缺哪些信息”,不要立刻生成一张假完整的对比表。讨论阶段用短句子来回问;要交给别人或交给自己执行时,再收成格子。

另外,不要为了填表把不该贴的东西贴进去:别人的身份证件、未公开的报价、完整病历。格子越清楚,这些内容越容易被原样留在对话里。能改写成就事的字段,就不要贴原件。

字段名称也要写成你真的会核对的话。“优势”“体验”“风险等级”这种列,模型最容易填形容词。改成“月费数字”“取消方式的原句”“材料没写的项目”。列名里如果已经包含判断,它就会交判断;列名里只有事实,它才比较容易把判断留空。同一张表里不要混进“推荐”列。推荐列几乎总会被填上,而且填的人不是你。你若需要自己的选择,把选择写在表外,并写明它依据的是哪一行。表内只留能核对的格子。核对不了的列,宁可不设。设了就会被填满,填满之后你还要花时间把它们删掉。不如一开始就不要那一列。少一列,就少一次被编造填满的机会。

小结

  • 结构化输出是先规定字段,让缺失变成看得见的空格,而不是一段顺口的总结;
  • 它和工具调用不同:一个管交卷形状,一个管有没有去外部查或算;
  • 普通人用固定列名即可,并写明没依据就填“未写明”,不要表格外的散文;
  • 格式正确不等于内容为真,原句搜不到的那一行就作废;
  • 长材料先切片再填表。问题还没想清时,先别逼它交一张完整的表。

你要的经常不是一篇更像答案的文章,而是一张不敢把空白填满的表。空白留在那里,你才知道下一步该去问谁,而不是跟着一段流畅的话往下走。若一张表你无法在两分钟内指出哪一格是空的、哪一格有原句,这张表对你就还太长。删列,直到你能逐格核对为止。


本文为「读懂 AI」原创,说明结构化输出的用法和边界。不同产品对 JSON、表格和字段校验的支持不同。涉及金额、日期、合同和隐私时,请回到原始材料核对,不要把填好的表当成已经审过的事实。