Skip to content

Repository files navigation

🧠 EmoVar:让情感自己说话

📖 中文版 | English Version

⚠️ 此项目不是又一个情感识别工具。

我觉得语言只能笼统地表达情感,我们不应该给智能体贴情感标签,而应该让它一直存在、一直演变,让它带着某种状态去感知世界,而不是“输入 → 情感识别 → 输出”。


📖 一、问题与回答

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 去"定义"情感,而是给它一个自由的内部状态向量,让它能在特定情境下自然流露情感。这个向量没有任何预设语义,但它会影响模型输出的每一句话。用户从模型说的话中去"体会"情感,而不是问模型"你现在是什么情感"。

我们提出 "无限变量语言" 的概念:用连续空间(高维向量)来表达情感,而不是离散的标签。

例如,"思念"可以表达为一个包含强度、方向、温度、时间感等维度的向量。由于制作出真正无限变量的语言难度太大,我们可以无限接近无限变量。


🧪 四、MVP 展示

我们不是要造一个完美的情感智能体,而是要造一个证据,证明现有离散标签范式是错的,证明连续向量表达的可能性。

实现方式:

数据:从小说、电视剧、抖音评论等人类创作中,收集几十条"真情流露"的情感片段(例如分手后的感慨、重逢的喜悦)。这些数据必须是人写的,因为 AI 生成的数据缺乏真实的情感因果链。

模型:用魔搭社区(ModelScope)的 MS-Swift 微调一个小型开源模型(如 Qwen2.5-0.5B),让它学会根据情境描述输出一个多维向量(如愉悦度、唤醒度),或者直接生成符合情境的文本。

对比:同时运行一个传统的情感分类模型,输出离散标签的概率。将两者并排展示,让用户直观感受"标签"与"体会"的差异。

示例:

输入情境:"你暗恋三年的人,今天告诉你 ta 要结婚了。"

传统模型输出

悲伤: 0.9, 平静: 0.1, 其他: 0.0

(这能表达那种混合了失落、祝福、解脱的复杂情感吗?)

我们的模型输出

愉悦度=-0.3, 唤醒度=0.5, 时间感=-0.8, …

同时生成的文本可能是:

"是吗……那挺好的。"

(但语气里藏着复杂的情感,需要读者去体会)


🔁 五、我对 MVP 的不满

我最初设计的循环是:

输入情境 → 编码 → 更新状态 → 生成回答 → 输出

这个流程看起来没问题,但它有一个根本性缺陷:情感不是在"处理完情境之后"才存在的,而是在整个对话过程中持续流动的。

我觉得循环应该是这样的:

text 用户输入 → 编码 → 更新状态
         ↓       ↓
         ← ← ← ← ← ← ← ← ← ←
                  ↓
            生成回答(过程中状态持续变化)
                  ↓
               输出
                  ↓
    (等待下一轮输入,但状态一直在"流")

关键区别:

  1. 状态不是只在"更新"时才变,而是在整个生成过程中持续变化。
  2. 生成的每一句话都会反过来影响状态(比如说到伤心处,自己更伤心了)。
  3. 状态本身有自己的"生命"(会随时间自然衰减、随机波动)。

我的思想和代码之间还有距离。

希望有人能一起完善这个设计。


⚠️ 六、目前状态

由于我个人硬件限制,当前 MVP 尚未进行完整测试,但代码框架已就绪。

我们诚邀有算力资源的开发者一起验证,并共同探索这个新方向。

我的研究方向可能还有不足,请各位大佬不吝赐教!


🌟 七、为什么值得关注

范式革命:我不是在现有框架里修修补补,而是质疑了情感计算的底层逻辑。如果方向是对的,这将是一次从"识别"到"体会"的范式转移。

思想深度:我们的核心思想(情感是先天框架+后天训练、语言是硬伤、无限变量语言)并非空想,而是有前沿研究佐证的(如 APER 模型、情感因果链研究、文化语言学研究)。

实用价值:未来的 AI 不应只是冷冰冰的工具,而应能理解人类的情感,甚至与人类建立情感联结(但绝不能用于人形机器人)。我们的框架为这一目标提供了全新的思路。


🚀 八、下一步计划

  1. 完善数据收集与标注流程,建立高质量的高语境文化情感数据集。
  2. 优化状态向量的动态演变机制,使其更接近真实情感的流动性。
  3. 探索多智能体社会互动中的情感涌现。

🤝 九、我需要你们

如果你也被"语言是情感牢笼"这个问题困扰,如果你也认为现有情感计算路径需要反思,欢迎加入我们。

无论你是开发者、研究者,还是单纯对这个方向感兴趣,都可以:

在 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 学会"体会"。

我们构建的这个框架只是一个开始,它有粗糙、有不完美,但它代表了一个方向。

如果你也曾在某个深夜,因为一段文字而莫名感动,却无法用语言解释那种感觉——

那你就会理解我们在做什么。

让我们一起去造那把能测量风的尺子。



📚 目录

语言: 中文 | English



🚀 快速开始

一条命令安装并运行

pip install -r requirements.txt && python main.py --interactive

预计下载:约600MB(首次运行时)

  • all-MiniLM-L6-v2: ~90MB
  • gpt2: ~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 "此刻的感受"

🎬 实际示例

示例 1:清晨的阳光

输入情境

今天清晨,阳光透过窗帘的缝隙洒进房间,温暖而柔和。

状态向量特征(前5维):

[ 0.023, -0.156,  0.089,  0.234, -0.078, ... ]

生成输出

[情感状态: 情感适中,偏向积极,情绪稳定]

此刻的感受:
阳光透过窗帘洒进来,温暖而柔和。这样的早晨让人感到宁静和舒适,
仿佛整个世界都在慢慢醒来。心情不由自主地变得轻盈,像是被这缕阳光
轻轻抚摸着。

示例 2:深夜加班

输入情境

凌晨两点,办公室里只有我一个人,电脑屏幕的光映在脸上。
 deadline 还有三个小时。

状态向量特征(前5维):

[ -0.189,  0.267,  0.145, -0.203,  0.312, ... ]

生成输出

[情感状态: 情感适中,偏向内敛,情绪多变]

此刻的感受:
屏幕的光有些刺眼,眼睛已经有些干涩。时间一分一秒地过去,
脑子里像是有一团乱麻,理不清头绪。既焦虑又有点麻木,
不知道什么时候才能结束这种状态...

注意:连续向量没有"焦虑""疲惫"这样的标签,而是从生成的文本中体会情感。


示例 3:状态变化对比

第一轮输入:"收到期待已久的录取通知"

第二轮输入:"发现学费超出了家庭预算"

状态融合后(愉悦度从正变负,但未完全消失):

[情感状态: 情感适中,情绪多变]

此刻的感受:
手里握着那张纸,心情复杂。本该是开心的时刻,却感到一阵沉重。
梦想和现实的距离,有时候就是这么近又那么远...

🛠️ 高级选项

指定模型

# 使用更大的编码器
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-medium

GPU 加速

python 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 环境,可以使用以下方法运行:

方法一:转换为 Python 脚本(推荐)

# 安装转换工具
pip install nbconvert

# 转换为 Python 脚本
jupyter nbconvert --to script demo.ipynb

# 运行脚本
python demo.py

方法二:VS Code 直接打开

  1. 安装 VS Code
  2. 安装 Jupyter 插件(Python + Jupyter 扩展)
  3. 直接打开 demo.ipynb 文件即可运行

方法三:Google Colab(在线)

  1. 访问 colab.research.google.com
  2. 上传 demo.ipynb 文件
  3. 在线运行,无需本地环境

方法四:手动复制代码

直接打开 demo.ipynb 文件,将代码单元格中的内容复制到新的 .py 文件中运行。

注意:运行演示前需要先安装依赖:

pip install -r requirements.txt

📚 技术架构

输入情境文本
    ↓
┌─────────────────────┐
│ SituationEncoder    │  编码为384维向量
│ (all-MiniLM-L6-v2)  │
└─────────────────────┘
    ↓
┌─────────────────────┐
│ InfiniteState       │  加权融合状态
│ (连续情感向量)      │  update / decay / reset
└─────────────────────┘
    ↓
┌─────────────────────┐
│ ModelInjector       │  prompt拼接注入
│ (gpt2)              │  生成情感化文本
└─────────────────────┘
    ↓
输出情感化语言

⚙️ 配置说明

config.py 关键参数

# 编码器配置
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 sampling

命令行参数

python 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=30

🐛 常见问题

Q1: 安装很慢怎么办?

A: 使用国内镜像源:

pip install -r requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple

Q2: 模型下载很慢?

A: 使用 HuggingFace 国内镜像:

# Windows
set HF_ENDPOINT=https://hf-mirror.com

# Linux/macOS
export HF_ENDPOINT=https://hf-mirror.com

Q3: 内存不足?

A: 使用更小的模型或CPU运行:

python main.py --generator-model gpt2 --device cpu

Q4: 如何重置状态?

A: 交互模式输入 /reset 命令。

Q5: 如何换用其他模型?

A: 使用 --encoder-model--generator-model 参数。


💡 Python API

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 是一个学术研究和技术探索项目,旨在探索连续向量表示情感的可能性,而非提供生产级别的情感计算工具。

使用限制

  1. 不得用于人形机器人:本项目明确反对将情感生成技术用于人形机器人,以避免误导用户认为 AI 具有真实情感。

  2. 不得用于情感操纵:禁止将本技术用于任何形式的情感操纵、欺骗或诱导行为(如营销洗脑、情感诈骗等)。

  3. 不得用于医疗诊断:本系统不能替代专业心理健康评估和治疗。

  4. 明确告知用户:在任何应用场景中,必须明确告知用户"这是 AI 生成的文本,不代表真实情感"。

数据伦理

  • 本项目使用公开数据集和人类创作内容进行研究和演示
  • 如用于商业或大规模部署,需确保数据来源合法、获得适当授权
  • 敏感数据应进行去标识化处理

研究目的

本项目致力于:

  • 探索情感计算的范式转变(从"识别"到"体会")
  • 验证连续向量表达情感的可行性
  • 为下一代情感智能体提供新的研究方向

我们相信技术的价值在于增进人类理解,而非替代或操纵。


📄 许可证

本项目采用 MIT 许可证,自由使用和修改。

欢迎提交 Issue 和 Pull Request!


开始使用:

pip install -r requirements.txt && python main.py --interactive

享受情感化生成的乐趣! 🎉

About

此项目不是又一个情感识别工具。我觉得语言只能笼统的去表达情感,我们不应该给智能体去贴情感标签,我们应该让它一直存在,让它一直演变,让它带着某种状态去感知世界,而不是“输入-情感识别-输出”。

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages