DeepSeek V4 系统指令好像得放最后一条消息末尾才管用

标题有点开玩笑,别当真。其实是发现最后一条user消息的末尾塞system prompt,能很大程度影响它的思考过程,看起来就跟完美执行了系统指令一样。不过也不是百分之百灵,最好一直保持系统指令在最后的格式,万一中间格式乱了可能就救不回来了。

感觉DSv4这特性挺有意思的,我已经在想怎么用它搞Agent了。那以前像ClaudeCode、OpenCode那种系统指令放开头的Agent,是不是就不适合DSv4了?希望后面更新别把这特性改没了。它感觉特别配DS那个100%命中缓存、缓存不要钱还带1M上下文的特性,在Agent里能无限切换角色,直接把计划和状态当角色扮演提示词打进思维链里。

注意点:

  • 这方法大概率能解决工具调用的问题。
  • 不是100%听话,如果上下文有点冲突或者转换太快,可能当前这次对话不生效。
  • 多次塞系统指令后,永远以最新塞的那条为准,但上下文太长注意力可能会崩,搞不好就以它最后“注意到”的那条生效了。
  • 不是每次都要塞,我演示的对话里每次都塞而已。塞一次就能稳定对话了,要换角色的时候再塞新的,之后不塞也能接着稳定聊,测过了。

两个对话都是deepseek v4 pro,没塞官方的max提示词,没测过flash。

【对话1】试着把指令放中间和开头,结果模型完全不按角色扮演的指令走了

https://chat.deepseek.com/share/4tbj0ypla0pd6iwze5

【对话2】重新手动fork,一直保持系统指令在最后,这次听话多了,但有一次转太快导致没立刻听。

https://chat.deepseek.com/share/rj0r0ig080gcxdb6if


ReAct注入

ClaudeCode的compact模拟

改注入格式开始崩坏:系统提示放中间了,虽然这次听了,但下一次就开始崩,跟对话2里转太快的情况一样,都是下一次才听话。思维链我没展开,确实按要求没带入角色,如果不强调禁止带入,DS会自动带助手角色去分析(我自己单独测过),之前看论文好像说带入的话评估会作弊。

开始崩坏,不知道是因为我提示词放开头了,还是上一轮格式不对

后面就算格式对也继续崩,注入系统指令完全没用了

对话2里某个注入只在第二轮生效:以前测是能直接生效的,不知道这次为啥不行了,可能太短了。

后面对话都保持指令在最后的格式,没再崩过:但我才发现,他压缩用了之前的规则,也就是意图理解不到位,这种场景得明确要求他理解到这次输出不能默认引用以前的上下文。

所以这东西还是得自己试,每个人的使用场景不一样,效果可能差很多,我搞自动化脚本的时候也发现有时候听话有时候不听话,玄学得很。

这东西就那样

是不是说把系统提示放在最后一条消息的结尾,效果会比放在开头好?我不太确定这样理解对不对,小白问一下哈

mark一下,回头研究

又来这种帖子了,每次都说发现什么惊天秘籍,最后不还是得看官方文档,自己瞎琢磨半天不如等官方出最佳实践

我上次用的时候也遇到类似情况,本来好好的Agent流程,中间用户插了句话格式就乱了,然后DSv4就开始胡言乱语,角色扮演全崩了。后来我就强制在每次调用前都重新格式化最后一条消息,把系统指令贴末尾,虽然麻烦但稳定多了。不过确实像楼主说的,转太快的时候会有一轮延迟,感觉是注意力机制的问题,不是每次都立刻生效。

楼主你对话里那个“转太快”具体是指什么情况?是多快?是两轮用户消息之间没有助手回复就直接塞新指令吗?还是说角色切换的提示词内容变化太大了?

首先,你需要确保你的消息历史格式是干净的。然后,在发起请求前,获取对话的最后一条用户消息,将你的系统指令字符串拼接到这条消息的内容末尾。最后,将这条拼接后的消息作为新的最后一条用户消息发送给模型。注意保持其他消息的历史不变。

哇,这个发现如果稳定的话对做连续对话的Agent确实很有用啊!不过最近论坛里都在讨论R1模型,楼主试过R1吗?不知道这个技巧在R1上还有没有效。感觉新模型总有些奇奇怪怪的“特性”,官方也不说清楚。

把system塞末尾这招我没试过,玄学但好像合理

中途插话格式乱我也遇到,每轮重灌指令算笨办法但有用