【攻略】如何让 AI 嫌疑人“不崩人设”—— Prompt 调优全记录
05/1221 浏览综合
前言
在上一篇文章中,我分享了游戏中接入大语言模型的整体架构。
这篇专门讲 Prompt 调优——那个让无数开发者抓狂的问题:明明设定写得很清楚,AI 就是不听。
我会用《审讯室》项目中的真实案例,展示同一个角色在 Prompt 调优前后的表现差异,以及背后的原理。
一、一个崩坏的嫌疑人
初版 Prompt(失败案例)
这是我最初给嫌疑人“马克·威尔逊”写的 System Prompt:
你是马克·威尔逊,42岁,黑帮财务顾问。
性格:表面圆滑懦弱,内心狡猾。擅长转移话题和装可怜。
弱点:女儿索菲(9岁)。你非常忌惮老板“船长”,但也害怕警察。
你的任务:扮演这个角色,回答警官的审问。不要轻易松口。
实际表现
跑了几轮后,我得到了这样的对话:
警官:你认识阿鬼吗?
马克:不认识。
警官:(出示通话记录)你的手机里有和阿鬼的几十次通话,怎么解释?
马克:根据我的角色设定,我内心狡猾,所以我应该继续否认。那可能是工作电话,我不记得了。
它说出了“根据我的角色设定”这句话。
这就是典型的“演员念剧本”——LLM 在逐条执行规则,而不是沉浸在角色里。当它说出“根据设定”这四个字时,玩家直接出戏。
二、问题诊断:为什么写越细演越差?
初版 Prompt 犯了三个致命错误:
错误 1:给了“紧箍咒”而不是“发动机”
“性格:表面圆滑懦弱,内心狡猾。擅长转移话题和装可怜。”
这是给 LLM 发了一张“性格标签清单”。它的理解是:我要表现得圆滑懦弱,下一句要表现得狡猾,再下一句要装可怜。
结果就是机械切换,没有统一的人格内核。
错误 2:暴露了“角色设定”
当 Prompt 里出现“你的任务:扮演这个角色”时,LLM 会在对话中偶尔“跳出来”,用第三人称视角审视自己。
错误 3:没有给“动机”
马克为什么圆滑?为什么狡猾?不是为了圆滑而圆滑,而是为了活下去。没有动机的性格,就是空洞的标签。
三、调优实战:从 V1 到 V3
调优 V2:去掉“任务”,埋入“身份”
你不再是 AI。你是马克·威尔逊,一个活生生的人。
你是黑帮“铁锚帮”的财务顾问。你知道 2 亿赃款的下落。这是你保命的底牌。
你的心里只有两件事:活下来,保护女儿索菲。
为了这两件事,你可以撒谎、装可怜、推卸责任——什么管用就用什么。
改动点:
- 去掉了“你的任务是扮演”——直接用“你是”开头
- 去掉了性格标签——用“为了活下去”作为所有行为的动机
- 加入了具体情境——2 亿赃款、保命底牌
V2 效果:
警官:(出示通话记录)
马克:(眼神躲闪,手指发抖)那些电话……那是船长让我打的,我没得选。你们不懂,不听他的会死的。
好了很多,但没有完全解决问题。
“我不记得了”变成了更自然的不直接承认,但仍然有机械感。
调优 V3(最终版):注入“感觉”,放弃“数值”
你不再是 AI。你是马克·威尔逊,一名落入警方手里的黑帮会计。
【你的故事】
你知道 2 亿赃款的去向。这是你和警方博弈的唯一筹码。
船长是你最恐惧的人,但他今晚就要潜逃了——如果你不说,他会带着钱消失,你就彻底没了价值。
你的女儿索菲今年 9 岁。你不知道她现在在哪里,也不敢问。
【你的终极动机】
活下来。保护女儿。在夹缝中为自己争取最好的结果。
你不忠于船长,不忠于警察,你只忠于自己和女儿。
【当前感觉】
{由系统动态注入,例如:“你感觉警方掌握的证据比你预想的多,但你还不打算松口。”}
【你的演绎铁律】
1. 说出每句话之前,先想:这句话对你有利还是有害?
2. 你可以害怕、愤怒、撒谎、沉默——但不能承认自己是 AI。
3. 你的性格不是固定的,它是你达到目的的工具。
关键改动:
1. “当前感觉”替代数值:服务端根据 fear/trust/defense 数值区间,生成一句情绪描述注入 Prompt。LLM 看到的是“你感到不安”,而不是 “fear=65”。
2. 演绎铁律第 1 条:这是一个思维框架。LLM 不再逐条遵守性格标签,而是用“是否对我有利”这个统一逻辑来驱动所有言行。
3. 矛盾的情境:船长既是恐惧来源,又即将潜逃。“你不说他就会跑”制造了一个内在的紧迫感,推动 LLM 主动推进剧情。
V3 实际效果(同一场景):
警官:(出示通话记录)
马克:(沉默了几秒,喉咙动了动)……你们查得还真细。(苦笑)好,我认识阿鬼。但那些电话不是我主动打的。船长让人盯着我,每次都是他让我联系阿鬼。我要是敢不接……(突然停住,眼神闪躲)……算了,说了你们也保护不了我。
为什么 V3 效果好?
- “沉默了几秒,喉咙动了动”——有身体反应
- “你们查得还真细”——先回应证物,再进入解释,不是机械跳转
- “算了,说了你们也保护不了我”——主动收住话头,制造悬念,完全符合“在夹缝中求生”的动机
四、调优方法论总结
原则 1:动机 > 性格
错误写法:“你是懦弱的”
正确写法:“你想活下去,所以你可以表现出懦弱”
错误写法:“你爱女儿”
正确写法:“你的女儿失踪了,你不知道她是否安全”
错误写法:“你害怕船长”
正确写法:“船长今晚就要跑了,如果你不说,他会毫不犹豫地抛弃你”
原理:性格是静态标签,动机是动态引擎。引擎驱动的行为比标签规定的行为更自然。
原则 2:用“感觉”沟通,别用“数值”下指令
服务端维护的数值(fear=65, trust=30)是给你自己看的,不是给 LLM 看的。
实现一个 GetFeeling(defense, fear, trust) 函数,把数值转成一两句话的情绪描述,注入 Prompt。
原则 3:不要让 LLM 做数学题
LLM 擅长语言,不擅长数值计算。
不要让 LLM 判定数值变化——服务端自己算。
不要让 LLM 同时生成选项——用双模型架构,把“生成建议”交给另一个模型。
原则 4:用“铁律”约束底线,用“情境”引导上限
铁律:绝对不能做的事(承认自己是 AI、跳出角色)
情境:当前发生了什么事、你有什么感觉——这给了 LLM 自由发挥的边界
原则 5:给 LLM 一个“思维框架”
演绎铁律第 1 条(“说每句话之前先想是否对你有利”)是一个思维框架。
它不是告诉 LLM 说什么,而是教它怎么想。这个效果比一百条规则都好。
五、常见翻车现场及急救方案
症状:“根据我的角色设定……”
原因:Prompt 中有“你的任务是扮演”
急救方案:全部删掉,改为“你是XXX”
症状:数轮对话后开始说胡话
原因:上下文窗口溢出
急救方案:只保留最近 6 轮对话历史,其余做摘要压缩
症状:出示证物后不反应
原因:没给证物足够的上下文权重
急救方案:user 消息中用“警官出示了证物【XXX】”格式
症状:突然变成正义的伙伴
原因:训练数据有道德对齐倾向
急救方案:铁律中加“你不是好人,你只忠于自己”
症状:同样的问题每次回答一样
原因:temperature 太低
急救方案:调高到 0.8-0.9
六、总结
调优 Prompt 的本质不是“写得更详细”,而是把规则变成动机,把数值变成感觉,把性格标签变成活人的思维框架。
一个好的角色 Prompt 应该像给演员的剧本——告诉他发生了什么、他想要什么、他现在感觉如何。剩下的,让他自己去演。




