Appearance
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}🛠️ 实战练习:给同一个回答做四种控制
挑一个你常问的问题,逐步加控制,每加一项跑一次看变化:
- 基线:直接问
- 加格式:要求"一句话结论 + 要点列表"
- 加依据:给一段资料,要求"只据此回答 + 标来源 + 没有就说没有"
- 加拒答:故意问资料里没有的,验证它是老实说"没有"还是开始编
期望结果:你能清楚看到每种控制各自解决什么问题,并学会按需叠加。
📌 关键结论
- 控格式三档:说清楚+范例 → json_object → json_schema;拿到都要 try-catch
- 控长度给"结构"比给"字数"管用(一句话结论+N点)
- 控语气靠设定身份+范例,一个范例胜过一堆形容词
- 控依据:强制引用、"资料没有就说没有",是防幻觉性价比最高的招
- 主动允许模型说"我不确定/转人工",堵死"硬编"这条最危险的路
下一节:6.5 让提示词稳定可靠