做AI角色时,你有没有觉得靠提示词设定的"人设"特别假?活泼、开朗写进系统设定,每轮对话都原样塞进去——情绪是静态的,不会随对话起伏,不会累积,也不会沉淀成记忆。我做了个叫affectus的工具,试图解决这个问题:把情绪从提示词里抽出来,做成一个独立运转的状态系统。
代码在这:https://github.com/n-yokomachi/affectus。CLI组件,装完之后agent可以直接调命令来驱动情绪。也可以跑成MCP server,把部分命令暴露成工具。后面用到的实验agent和对话日志,repo里都有。
为什么纯提示词不够用?看我的个人agent"TONaRi"的设定片段:性格活泼好奇,说话带"...desuwa!"、"...desuno?"的口癖。问题是,这段提示词每轮都原样注入——情绪是快照,不是流。即使有短期记忆,agent也只是根据当前上下文重新组装情绪表达,没有结构让情绪跨轮次持续,也没有机制让多种情绪共存、互相干扰。
我想要的情绪系统要满足几个条件:跟随对话实时变化、随时间漂移、跨session保持、作为标签和对话记忆一起存储。这需要一个显式的情绪状态变量,放在提示词外面,随对话推进更新。
设计思路借用了Plutchik的情绪轮:8种基础情绪(喜悦、信任、恐惧、惊讶、悲伤、厌恶、愤怒、期待),每种有强度等级,可以组合产生复合情绪。情绪状态不是简单的"开心"或"难过",而是一个向量,各个维度的强度会互相影响、衰减、被新事件激发。
实现上,affectus提供几条核心命令:/emotion get查看当前状态,/emotion set手动调整,/emotion decay让情绪自然衰减,/emotion react根据输入事件计算情绪变化。agent在自己的推理过程中调用这些命令,把情绪管理变成可观测、可干预的系统行为,而不是黑箱提示词工程。
效果怎么样?实验里让agent连续对话多轮,不干预情绪命令的情况下,能看到情绪随话题自然流动:聊到感兴趣的内容时"期待"和"喜悦"上升,被反驳时"愤怒"短暂触发后慢慢衰减,久未互动后整体情绪强度回落。这些变化会写进记忆,下次对话时情绪状态是接着上次的,不是重置。
有个发现:大语言模型的情绪本来就不是显式维护的状态变量。AAAI 2026的一项研究给25个开源模型做性格测试,单纯重排题目顺序就能让测量值大幅波动,大模型也稳不住。Anthropic 2026分析Claude Sonnet 4.5的内部表示,发现情绪概念是上下文依赖激活的——Transformer根据前文临时组装情绪表达。
所以affectus做的其实是"外挂状态":既然模型内部没有持续的情绪变量,就在外部建一个,让agent有结构化的情绪记忆可用。这和张嘴就来的提示词人设有什么区别?大概是"演一个开心的人"和"真的有个心情好坏的系统"的区别。后者让角色更像角色,而不是台词复读机。
热门跟贴