Skip to content

6.4 控制输出

很多时候"模型答得不错,但格式不对、太啰嗦、或瞎编"。这一节讲怎么精确控制输出的格式、长度、语气、依据、以及该不该答

控格式:从"说清楚"到"锁死"

由弱到强三档(详见 1.4):

① 在 Prompt 里说清楚 + 给范例(Few-shot)   —— 通用,所有模型都行
② response_format: json_object             —— 强制合法 JSON
③ json_schema + strict                     —— 连字段结构都锁死(部分模型支持)

最常用、最稳的组合是 ①给一个范例 + ②json_object

javascript
messages: [{ role: "user", content:
  `提取人名和年龄,按这个格式输出 JSON:{"name":"张三","age":28}\n\n文本:${text}` }],
response_format: { type: "json_object" }

⚠️ 不管哪档,拿到结果都要 try-catch 解析;被 max_tokens 截断时仍可能拿到半截。


控长度

模型对"字数"其实不敏感,但你可以引导:

✅ 有效的长度控制:
- "用不超过 3 句话回答"
- "只输出代码,不要任何解释"
- "先给一句话结论,再展开 3 点"

💡 给结构比给字数更管用。"一句话结论 + 3 个要点"比"控制在 200 字"更能让它收住。真要硬限制,再配合 max_tokens(但注意别把它截断在半句话)。


控语气 / 风格

语气也靠"设定情境 + 给范例"(6.1):

❌ 抽象形容:语气专业一点、友好一点
✅ 设定身份 + 范例:
你是一位耐心的客服。参考这种语气回复:
"您好~这个问题我帮您看一下哈,请稍等一下下 😊"

风格类需求,一个范例胜过五个形容词。要严格统一风格,考虑 微调


控依据:让它"言之有据"而非编造

要它基于给定资料回答(RAG 场景尤其重要,5.3):

只根据下面的资料回答,并在每个结论后用 [编号] 标注来源。
资料里没有的,直接说"资料中未提及",不要用你自己的知识补充。

资料:
[1] 退款需在购买后 7 天内提交。
[2] 退款 3-5 个工作日到账。

问题:退款怎么操作?

强制引用逼它"句句有出处",是防幻觉性价比最高的一招。


控"该不该答":让模型学会说"不知道"

模型默认倾向"硬答"(这是幻觉根源,0.2)。要它在没把握时老实承认

如果信息不足以回答,或你不确定,请直接说"我无法确定",并说明还需要什么信息。
不要猜测,不要编造看起来合理的答案。
对超出范围的问题(如与本产品无关),礼貌拒绝并引导回正题,不要展开回答。

💡 "允许它说不知道"不是让它偷懒,而是把"硬编"这条最危险的路堵上——尤其在客服、医疗、法律等场景。


一个组合示例(多种控制叠加)

你是客服助手。只根据【资料】回答用户问题。

要求:
- 先给一句话结论,再列具体步骤(控结构)
- 每条结论标注来源编号(控依据)
- 资料中没有的,回答"这个我需要帮您转人工",不要编(控拒答)
- 语气参考:"您好~这就为您查询哈"(控语气)

【资料】
"""
{检索到的资料}
"""

用户问题:{question}

🛠️ 实战练习:给同一个回答做四种控制

挑一个你常问的问题,逐步加控制,每加一项跑一次看变化:

  1. 基线:直接问
  2. 加格式:要求"一句话结论 + 要点列表"
  3. 加依据:给一段资料,要求"只据此回答 + 标来源 + 没有就说没有"
  4. 加拒答:故意问资料里没有的,验证它是老实说"没有"还是开始编

期望结果:你能清楚看到每种控制各自解决什么问题,并学会按需叠加。


📌 关键结论

  1. 控格式三档:说清楚+范例 → json_object → json_schema;拿到都要 try-catch
  2. 控长度给"结构"比给"字数"管用(一句话结论+N点)
  3. 控语气靠设定身份+范例,一个范例胜过一堆形容词
  4. 控依据:强制引用、"资料没有就说没有",是防幻觉性价比最高的招
  5. 主动允许模型说"我不确定/转人工",堵死"硬编"这条最危险的路

下一节:6.5 让提示词稳定可靠

写给自己的 AI 学习地图