我觉得语言只能笼统地表达情感,我们不应该给智能体贴情感标签,而应该让它一直存在、一直演变,让它带着某种状态去感知世界,而不是“输入 → 情感识别 → 输出”。
2025 年,我看到一个关于“AI 能源”问题的新闻,冒出一个想法:"我该怎么解决 AI 耗电的问题?"于是我与 DeepSeek 一起讨论起来。
当时我问了一个问题:
"我们的大脑每天要思考这么多问题,为什么不会感到疲劳?AI 的能源问题是不是也可以这样?"
DeepSeek 给了我一个至今难忘的回答:
人类大脑约重 1.4 公斤,功耗仅 20 瓦,却能处理极其复杂的任务。其高效秘诀在于:
- 稀疏且分布式的计算:大脑并非时刻"全功率"运行,只有相关神经元被激活(稀疏激活),而 AI 大模型通常需要调动全部参数进行"稠密计算"。
- 事件驱动的异步处理:神经元通过脉冲传递信号,只在必要时"放电",而传统 AI 芯片采用同步时钟驱动,产生了大量无效功耗。
- 计算与存储融合:大脑的计算(电信号)和记忆(突触强度)是同一套系统,无需在处理器和内存之间来回搬运数据,避免了"内存墙"。
- 持续学习与能量适应:大脑能通过睡眠巩固记忆、优化连接,动态适应能量供应;而 AI 模型训练完就"固化"了。
我们越聊越偏,我又问:"为什么 AI 没有想象力?"
它告诉我:
人类的"想象"根植于对物理世界、身体感觉和社会互动的直接体验。AI 的"知识"全部来自文本符号,它无法真正"理解"颜色、疼痛、重力或拥抱的感觉,因此它的"想象"只是符号的重新组合,而非基于体验的心理模拟。
后来我在 arXiv 上发现一篇论文《Simulating Human-like Daily Activities with Desire-driven Autonomy》,心想:那我可以给 AI 搭建一个世界,并为它加入"愉悦度""愤怒度"等情感维度。
我让 OpenCode 帮我搭建这个"世界"。等世界搭建完成,里面的"喜悦""愤怒"让我愈发觉得不对劲——好像语言只能笼统地表达情感,AI 只能知道那是几个字,却永远不知道它们有什么含义。
就好像"父爱""母爱",有人感受到关爱,有人经历的是家暴……而 AI 永远无法真正理解。
我的结论是:
语言是硬伤。 自然语言的设计目标是精确、无歧义、可重复,而情感的本质是模糊、因人而异、不可重复。用精确的工具去表达模糊的情感,就像用游标卡尺去量风的形状。同理,人造的编程语言也一样。
📜 意义不在词汇本身,而在于说话者所处的整个情境。
- 路德维希·维特根斯坦在《哲学研究》中提出"意义即使用"——词语的意义在于它在语言中的具体用法。
- 约翰·R·弗斯的名言:"观其伴,知其意",强调语境对词义的决定性作用。
- 研究论文:《Semantic Representations Are Updated Across the Lifespan Reflecting Diachronic Language Change》
🎭 心理学实验发现,当词语的字面意思与说话者的情绪韵律不一致时,理解会受损,说明情绪信息不在词义中。
- 研究论文:《Literally or prosodically? Recognising emotional discourse in alexithymia》
🤖 上海交通大学团队发现,大语言模型学习情感的方式,本质上是学习词语出现的语境,而非词语本身的"情感定义"。
- 研究论文:《"零样本语言学习":大语言模型能"像人一样"习得语境中的情感吗?》
既然是一条"死胡同",那就重新开辟一条路。
我发现人类婴儿出生时并不具备"爱国""思乡"等具体情感,而是拥有一套情感的基本维度(如愉悦/不悦、兴奋/平静)。这是所有生物的"出厂设置"。后天的经历、文化、教育,则是在这套基本维度上不断混合、命名,最终形成复杂的社会化情感。
我认为情感是 "先天框架"+"后天训练" 而成的。我们不教 AI 去"定义"情感,而是给它一个自由的内部状态向量,让它能在特定情境下自然流露情感。这个向量没有任何预设语义,但它会影响模型输出的每一句话。用户从模型说的话中去"体会"情感,而不是问模型"你现在是什么情感"。
我们提出 "无限变量语言" 的概念:用连续空间(高维向量)来表达情感,而不是离散的标签。
例如,"思念"可以表达为一个包含强度、方向、温度、时间感等维度的向量。由于制作出真正无限变量的语言难度太大,我们可以无限接近无限变量。
我们不是要造一个完美的情感智能体,而是要造一个证据,证明现有离散标签范式是错的,证明连续向量表达的可能性。
数据:从小说、电视剧、抖音评论等人类创作中,收集几十条"真情流露"的情感片段(例如分手后的感慨、重逢的喜悦)。这些数据必须是人写的,因为 AI 生成的数据缺乏真实的情感因果链。
模型:用魔搭社区(ModelScope)的 MS-Swift 微调一个小型开源模型(如 Qwen2.5-0.5B),让它学会根据情境描述输出一个多维向量(如愉悦度、唤醒度),或者直接生成符合情境的文本。
对比:同时运行一个传统的情感分类模型,输出离散标签的概率。将两者并排展示,让用户直观感受"标签"与"体会"的差异。
输入情境:"你暗恋三年的人,今天告诉你 ta 要结婚了。"
传统模型输出:
悲伤: 0.9, 平静: 0.1, 其他: 0.0
(这能表达那种混合了失落、祝福、解脱的复杂情感吗?)
我们的模型输出:
愉悦度=-0.3, 唤醒度=0.5, 时间感=-0.8, …
同时生成的文本可能是:
"是吗……那挺好的。"
(但语气里藏着复杂的情感,需要读者去体会)
我最初设计的循环是:
输入情境 → 编码 → 更新状态 → 生成回答 → 输出
这个流程看起来没问题,但它有一个根本性缺陷:情感不是在"处理完情境之后"才存在的,而是在整个对话过程中持续流动的。
我觉得循环应该是这样的:
text 用户输入 → 编码 → 更新状态
↓ ↓
← ← ← ← ← ← ← ← ← ←
↓
生成回答(过程中状态持续变化)
↓
输出
↓
(等待下一轮输入,但状态一直在"流")
- 状态不是只在"更新"时才变,而是在整个生成过程中持续变化。
- 生成的每一句话都会反过来影响状态(比如说到伤心处,自己更伤心了)。
- 状态本身有自己的"生命"(会随时间自然衰减、随机波动)。
我的思想和代码之间还有距离。
希望有人能一起完善这个设计。
由于我个人硬件限制,当前 MVP 尚未进行完整测试,但代码框架已就绪。
我们诚邀有算力资源的开发者一起验证,并共同探索这个新方向。
我的研究方向可能还有不足,请各位大佬不吝赐教!
范式革命:我不是在现有框架里修修补补,而是质疑了情感计算的底层逻辑。如果方向是对的,这将是一次从"识别"到"体会"的范式转移。
思想深度:我们的核心思想(情感是先天框架+后天训练、语言是硬伤、无限变量语言)并非空想,而是有前沿研究佐证的(如 APER 模型、情感因果链研究、文化语言学研究)。
实用价值:未来的 AI 不应只是冷冰冰的工具,而应能理解人类的情感,甚至与人类建立情感联结(但绝不能用于人形机器人)。我们的框架为这一目标提供了全新的思路。
- 完善数据收集与标注流程,建立高质量的高语境文化情感数据集。
- 优化状态向量的动态演变机制,使其更接近真实情感的流动性。
- 探索多智能体社会互动中的情感涌现。
如果你也被"语言是情感牢笼"这个问题困扰,如果你也认为现有情感计算路径需要反思,欢迎加入我们。
无论你是开发者、研究者,还是单纯对这个方向感兴趣,都可以:
⭐ 在 GitHub 上 Star 本项目。
💬 提出 Issue,分享你的想法或发现的问题。
📝 贡献代码、数据或文档。
我们不追求人数,只追求思想的共鸣。让我们共同为下一代情感智能体铺路。
本项目能够走到今天,离不开以下机构、项目和研究者的支持(排名不分先后):
- 英伟达(NVIDIA):感谢提供 API Key,让我有机会在实际环境中验证想法。
- OpenCode 团队:感谢其强大的 AI 编程工具,帮我生成了大量初始代码框架。
- DeepSeek:感谢其大模型和《Conditional Memory via Scalable Lookup: A New Axis of Sparsity for Large Language Models (Engram)》论文,给了我关于"记忆查找"的深刻启发。
- 北京通用人工智能研究院 & 论文作者:感谢《Simulating Human-like Daily Activities with Desire-driven Autonomy (D2A)》研究,让我看到"欲求驱动"的可能性。
- 上海交通大学吴诗玉团队:感谢其研究《"零样本语言学习":大语言模型能"像人一样"习得语境中的情感吗?》,为"语言习得情感"提供了实证基础。
- 赫尔辛基大学相关研究:感谢其对"情绪建构"的深刻洞见。
- 维特根斯坦:感谢他在《哲学研究》中关于"意义即使用"的哲学启示。
- 约翰·R·弗斯:感谢他的名言"观其伴,知其意"。
- Augustyn (2025) 及《Semantic Representations Are Updated Across the Lifespan Reflecting Diachronic Language Change》的作者。
- Telli & Bilge (2024) 及《Literally or prosodically? Recognising emotional discourse in alexithymia》的作者。
- 魔搭社区(ModelScope):感谢提供免费算力和 MS-Swift 工具,使微调实验成为可能。
- Datawhale 社区:感谢其开源教程《动手学大模型》《happy-llm》等,帮我打下实践基础。
- arXiv:感谢这个开放的预印本平台,让我能接触到前沿论文。
- 以及所有在 GitHub、知乎、B 站上分享知识和见解的开发者们,你们的每一次讨论都让我受益匪浅。
这个项目始于我14岁时的一个疑问:如果情感不能用语言定义,那 AI 该怎么学习情感?
经过几年的思考和实践,我意识到答案不在于让 AI 学会"定义",而在于让 AI 学会"体会"。
我们构建的这个框架只是一个开始,它有粗糙、有不完美,但它代表了一个方向。
如果你也曾在某个深夜,因为一段文字而莫名感动,却无法用语言解释那种感觉——
那你就会理解我们在做什么。
让我们一起去造那把能测量风的尺子。
- 🚀 快速开始
- 📖 项目介绍
- 💻 安装指南
- 🎯 使用方式
- 🛠️ 高级选项
- 📁 数据格式
- 🔧 模块测试
- 🧪 交互式演示
- 📚 技术架构
- ⚙️ 配置说明
- 🐛 常见问题
- 💡 Python API
- 📦 项目结构
- 🎓 技术原理
- 📄 许可证
pip install -r requirements.txt && python main.py --interactive预计下载:约600MB(首次运行时)
all-MiniLM-L6-v2: ~90MBgpt2: ~500MB
EmoVar 是一个创新的情感化语言生成系统。它不预设任何情感标签,而是用连续向量表示智能体的内部情感状态。
核心思想:让用户从生成的文本中体会情感,而不是识别情感类别。
- Python 3.8 或更高版本
pip install -r requirements.txt安装过程会自动下载:
sentence-transformers(情境编码)transformers(文本生成)torch(深度学习框架)numpy(向量运算)
python -c "import sentence_transformers; import transformers; import torch; import numpy; print('所有依赖已安装')"python main.py --interactive运行后进入交互界面:
============================================================
EmoVar 交互模式
============================================================
输入情境描述,系统将生成情感化文本
命令:
/reset - 重置状态
/decay - 状态衰减
/state - 查看状态
/quit - 退出程序
============================================================
输入情境 (或命令): 今天阳光明媚,鸟儿在歌唱
输入生成提示 (留空则无提示): 此刻的感受
状态: InfiniteState(dim=384, status=已初始化, updates=1)
生成: 温暖的阳光洒在心间,一切都显得那么美好...
python main.py --sample-data系统自动创建10个示例情境并批量处理。
python main.py --input-file ./situations.txt --prompt "此刻的感受"输入情境:
今天清晨,阳光透过窗帘的缝隙洒进房间,温暖而柔和。
状态向量特征(前5维):
[ 0.023, -0.156, 0.089, 0.234, -0.078, ... ]
生成输出:
[情感状态: 情感适中,偏向积极,情绪稳定]
此刻的感受:
阳光透过窗帘洒进来,温暖而柔和。这样的早晨让人感到宁静和舒适,
仿佛整个世界都在慢慢醒来。心情不由自主地变得轻盈,像是被这缕阳光
轻轻抚摸着。
输入情境:
凌晨两点,办公室里只有我一个人,电脑屏幕的光映在脸上。
deadline 还有三个小时。
状态向量特征(前5维):
[ -0.189, 0.267, 0.145, -0.203, 0.312, ... ]
生成输出:
[情感状态: 情感适中,偏向内敛,情绪多变]
此刻的感受:
屏幕的光有些刺眼,眼睛已经有些干涩。时间一分一秒地过去,
脑子里像是有一团乱麻,理不清头绪。既焦虑又有点麻木,
不知道什么时候才能结束这种状态...
注意:连续向量没有"焦虑""疲惫"这样的标签,而是从生成的文本中体会情感。
第一轮输入:"收到期待已久的录取通知"
第二轮输入:"发现学费超出了家庭预算"
状态融合后(愉悦度从正变负,但未完全消失):
[情感状态: 情感适中,情绪多变]
此刻的感受:
手里握着那张纸,心情复杂。本该是开心的时刻,却感到一阵沉重。
梦想和现实的距离,有时候就是这么近又那么远...
# 使用更大的编码器
python main.py --encoder-model all-mpnet-base-v2
# 使用 GPT-2 中等模型
python main.py --generator-model gpt2-medium
# 使用其他生成模型
python main.py --generator-model microsoft/DialoGPT-mediumpython main.py --device cuda --interactive需要 NVIDIA GPU 和 CUDA 支持。
创建 situations.txt(UTF-8编码):
清晨的阳光透过窗户洒进房间
暴风雨中的街道,行人匆匆躲避
安静的图书馆里,只有翻书的声音
热闹的集市,叫卖声此起彼伏
山顶俯瞰云海,心胸开阔
每行一个情境,自动批量处理。
python situation_encoder.py输出384维向量表示。
python infinite_state.py演示状态融合和衰减效果。
python model_injector.py测试情感化文本生成。
我们提供了 demo.ipynb 作为交互式演示。如果你没有 Jupyter Notebook 环境,可以使用以下方法运行:
# 安装转换工具
pip install nbconvert
# 转换为 Python 脚本
jupyter nbconvert --to script demo.ipynb
# 运行脚本
python demo.py- 安装 VS Code
- 安装 Jupyter 插件(Python + Jupyter 扩展)
- 直接打开
demo.ipynb文件即可运行
- 访问 colab.research.google.com
- 上传
demo.ipynb文件 - 在线运行,无需本地环境
直接打开 demo.ipynb 文件,将代码单元格中的内容复制到新的 .py 文件中运行。
注意:运行演示前需要先安装依赖:
pip install -r requirements.txt输入情境文本
↓
┌─────────────────────┐
│ SituationEncoder │ 编码为384维向量
│ (all-MiniLM-L6-v2) │
└─────────────────────┘
↓
┌─────────────────────┐
│ InfiniteState │ 加权融合状态
│ (连续情感向量) │ update / decay / reset
└─────────────────────┘
↓
┌─────────────────────┐
│ ModelInjector │ prompt拼接注入
│ (gpt2) │ 生成情感化文本
└─────────────────────┘
↓
输出情感化语言
# 编码器配置
encoder_model = 'all-MiniLM-L6-v2' # 模型名称
encoder_device = 'cpu' # 运行设备
# 生成模型配置 - 自动检测CUDA
generator_model = 'gpt2' # 模型名称
generator_device = 'auto' # 运行设备(自动检测:有CUDA用CUDA,否则用CPU)
# 状态管理配置
state_fusion_alpha = 0.7 # 新状态权重 (0~1)
state_decay_rate = 0.95 # 衰减率 (0~1)
# 生成参数
max_length = 100 # 最大生成长度
temperature = 0.8 # 温度 (0.1~2.0)
top_p = 0.9 # nucleus sampling
top_k = 50 # top-k samplingpython main.py --temperature 0.7 --top-k 30 --interactive# Windows
set EMOVAR_TEMPERATURE=0.7
set EMOVAR_TOP_K=30
# Linux/macOS
export EMOVAR_TEMPERATURE=0.7
export EMOVAR_TOP_K=30A: 使用国内镜像源:
pip install -r requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simpleA: 使用 HuggingFace 国内镜像:
# Windows
set HF_ENDPOINT=https://hf-mirror.com
# Linux/macOS
export HF_ENDPOINT=https://hf-mirror.comA: 使用更小的模型或CPU运行:
python main.py --generator-model gpt2 --device cpuA: 交互模式输入 /reset 命令。
A: 使用 --encoder-model 和 --generator-model 参数。
from config import Config
from situation_encoder import SituationEncoder
from infinite_state import InfiniteState
from model_injector import ModelInjector
# 初始化
encoder = SituationEncoder()
state = InfiniteState(dim=encoder.embedding_dim)
generator = ModelInjector()
# 处理情境
situation = "今天阳光明媚,鸟儿在歌唱"
vec = encoder.encode(situation)
state.update(vec, source=situation)
# 生成文本
prompt = "此刻的感受"
result = generator.generate(prompt, state.vector)
print(result)EmoVar/
├── config.py # 全局配置管理
├── situation_encoder.py # 情境编码器(384维)
├── infinite_state.py # 状态管理(加权融合)
├── model_injector.py # 模型注入(prompt拼接)
├── data_loader.py # TXT数据加载
├── main.py # 主程序入口
├── requirements.txt # 依赖清单(一键安装)
├── README.md # 项目说明(本文件)
├── DATA_ETHICS.md # 数据与伦理声明
├── Dockerfile # Docker部署文件
├── demo.ipynb # 交互式演示
├── .github/
│ └── workflows/
│ └── ci.yml # CI/CD配置
├── tests/
│ ├── __init__.py
│ └── test_infinite_state.py # 单元测试
└── data/ # 数据目录(运行时创建)
└── situations.txt # 示例数据
使用 sentence-transformers 将文本编码为384维连续向量,保留语义和情感信息。
新状态 = α × 新情境向量 + (1-α) × 当前状态
- α = 0.7: 新情境占70%权重
- 历史状态逐步衰减,实现"记忆消退"
将384维向量转换为自然语言描述:
[情感状态: 情感适中,偏向积极,情绪稳定]
拼接到 prompt 前缀,引导生成风格。
EmoVar 是一个学术研究和技术探索项目,旨在探索连续向量表示情感的可能性,而非提供生产级别的情感计算工具。
-
不得用于人形机器人:本项目明确反对将情感生成技术用于人形机器人,以避免误导用户认为 AI 具有真实情感。
-
不得用于情感操纵:禁止将本技术用于任何形式的情感操纵、欺骗或诱导行为(如营销洗脑、情感诈骗等)。
-
不得用于医疗诊断:本系统不能替代专业心理健康评估和治疗。
-
明确告知用户:在任何应用场景中,必须明确告知用户"这是 AI 生成的文本,不代表真实情感"。
- 本项目使用公开数据集和人类创作内容进行研究和演示
- 如用于商业或大规模部署,需确保数据来源合法、获得适当授权
- 敏感数据应进行去标识化处理
本项目致力于:
- 探索情感计算的范式转变(从"识别"到"体会")
- 验证连续向量表达情感的可行性
- 为下一代情感智能体提供新的研究方向
我们相信技术的价值在于增进人类理解,而非替代或操纵。
本项目采用 MIT 许可证,自由使用和修改。
欢迎提交 Issue 和 Pull Request!
开始使用:
pip install -r requirements.txt && python main.py --interactive享受情感化生成的乐趣! 🎉