Mindspace
让模型可以更换,让关系不必重置。
Inspiration
Mindspace 的灵感来自我长期使用 AI 产品时发现的一个矛盾:主流大模型越来越聪明,能够完成写作、搜索、编程和分析任务,但在长期交流中,用户仍可能遇到角色漂移、记忆冲突和关系断裂。
用户可能已经向 AI 介绍过自己的称呼、工作、偏好和边界,过一段时间后却仍要重新解释。更复杂的问题是,当用户的想法发生变化,例如从“喜欢草莓”变为“现在更喜欢蓝莓”时,系统不能只是把两句话同时保存,而应当知道新信息已经替代旧信息。
这让我意识到,AI 陪伴产品真正缺少的未必是更大的模型,而是一套能够管理人物、记忆与关系连续性的系统。因此,我开始构建 Mindspace,希望建立一套更懂用户、更有归属感,同时又可检查、可修改、可控制的情感体系。
What it does
Mindspace 是一款面向长期陪伴场景的 Windows AI 伴侣。它通过人物档案、长期记忆、关系状态、主动续话、实时语音和本地数据管理,让大模型从“被动回答一次问题”转变为“能够延续共同经历的长期角色”。
它目前可以:
- 为用户和 AI 分别建立人物档案,保存称呼、性格、偏好、关系定位和行为边界;
- 保留最近对话,并从更早的历史、结构化记忆和个人知识库中召回相关内容;
- 根据用户最新表达修正旧信息,减少喜欢与不喜欢等相互冲突的记忆;
- 允许用户查看、编辑、删除和恢复长期记忆;
- 根据当前时间、对话间隔和关系状态自然承接话题;
- 支持“让 AI 说点什么”、沉默后续接和实时语音连续陪伴;
- 提供通话与面对面互动模式,并支持角色头像和角色音色;
- 将会话、档案、知识库、头像和参考音频主要保存在 Windows 本地工作区。
Mindspace 并不声称 AI 真实拥有人的情感。它通过稳定的人格、连续的记忆和能够被用户控制的关系状态,让每一次交流成为下一次理解的基础。
How we built it
Mindspace 使用 Electron 构建 Windows 桌面启动器,React 负责产品界面,Python、FastAPI 和 LangGraph 负责对话编排,SQLite 与 JSON 投影负责会话、人物档案、记忆和运行状态的持久化。
一轮对话的主要流程为:
用户输入
→ 加载用户档案、AI角色卡与关系状态
→ 并行召回知识库和历史记忆
→ 相关性排序、时间衰减与公平曝光
→ 组装分层 Prompt
→ 调用 OpenAI-compatible 大模型
→ 校验角色回复与记忆更新
→ 保存会话、档案和结构化记忆
为了兼顾关键词匹配与语义理解,我们同时使用 BM25+ 词法检索和向量检索,再通过 RRF(倒数排名融合)组合不同检索结果:
$$ S_{\mathrm{RRF}}(d)=\sum_{r\in R}\frac{1}{k+\operatorname{rank}_{r}(d)} $$
其中,$d$ 表示候选记忆,$R$ 表示不同检索通道,$k$ 用于减弱单一排名波动带来的影响。
为了避免很久以前的信息持续压过用户最近的变化,系统还会加入基于对话轮次和现实时间的衰减:
$$ w_t(d)= \exp\left(-\frac{\Delta r}{\tau_r}\right) \cdot \exp\left(-\frac{\Delta h}{\tau_h}\right) $$
最终候选分数可以简化表示为:
$$ S_{\mathrm{final}}(d) =S_{\mathrm{hybrid}}(d)\cdot w_t(d)+B_{\mathrm{fair}}(d) $$
其中,$B_{\mathrm{fair}}$ 是有上限的公平曝光补偿,只帮助相关但长期未被选中的记忆获得机会,不能让无关内容绕过最低相关度要求。
在记忆写入环节,大模型不能直接重写整份人物档案,只能提出少量 JSON Patch。服务端继续校验证据来源、字段路径、数据类型、版本号、修改数量和冲突关系。只有通过校验的内容才会成为长期记忆。
模型每轮直接看到最近 8 轮原始对话;更早的内容保留在本地存储和检索索引中,仅在与当前问题相关时被召回。这样可以在维持连续性的同时控制 Token 成本和上下文噪声。
当前文本生成仍需要用户配置的 OpenAI-compatible API,因此 Mindspace 是本地优先的编排与数据系统,而不是完全离线的大模型。情绪识别能力在当前版本中保持关闭,我们没有把尚未启用的接口包装成已经实现的产品能力。
Challenges we ran into
1. 记住不等于记对
如果把全部对话直接写入向量库,玩笑、猜测、错误回复和过时信息也可能被当成长期事实。我们最终将近期原始对话、低可信召回内容和权威人物档案分层,并通过证据与服务端校验控制记忆写入。
2. 事实会发生变化
长期记忆不能只做增加,还要处理替换、删除、冲突消除和历史恢复。我们为不同字段设计了单值覆盖、去重集合、对立集合和有生命周期事件等规则。
3. 长期上下文会快速膨胀
持续把完整历史发送给模型会增加 Token 成本、响应延迟和角色漂移风险。我们通过“最近 8 轮原文+旧内容按需召回+后台上下文压缩”控制模型可见内容。
4. 角色稳定和角色自主存在矛盾
角色永远顺从用户会显得虚假;为了体现自主而故意反对用户,同样会破坏体验。我们将角色自主定义为:角色按照自身性格、关系立场和当前意愿作出一致反应,而不是机械迎合或机械反对。
5. 实时语音是一整条工程链路
语音体验不仅取决于识别准确率,还涉及断句、回声、插话、TTS 排队、模型冷启动、连接中断和异常恢复。我们加入了就绪检查、自动重连、可取消请求和播放看门狗,但仍需要更多真实设备测试。
6. 工程能力不等于用户价值
检索分数、Prompt Inspector、执行详情和系统诊断有助于开发与审计,却可能让普通用户觉得自己进入了技术控制台。如何把复杂能力隐藏在自然体验背后,是产品化阶段的重要挑战。
Accomplishments that we're proud of
我们最自豪的不是简单接入了一个聊天 API,而是完成了一套可检查、可恢复的长期关系基础链路:
- 构建了 Windows 桌面启动器与本地数据工作区;
- 实现了知识库与历史记忆的并行召回;
- 建立了最近对话、旧历史、结构化记忆和权威档案的分层上下文;
- 实现了基于证据和版本号的 JSON Patch 记忆写入;
- 支持冲突记忆消除、删除、恢复和档案版本历史;
- 建立了角色优先的 Prompt 顺序与本轮角色演绎校准;
- 实现了主动续话、连续陪伴、通话和面对面互动;
- 接入了本地 ASR、云端或本地 TTS、插话中断与语音异常恢复链路;
- 提供了 Prompt、召回内容和运行节点的可观察能力;
- 为长期恋爱向对话设计了 50 轮验收脚本,用于检查称呼、职业、偏好、边界、共同经历和关系变化。
这些成果证明 Mindspace 不只是一个界面原型,而是在尝试把“长期陪伴”拆成可以实现、检查和验证的系统能力。不过,验收脚本和测试设计仍不能代替真实用户数据,我们不会将其夸大为已经完成市场验证。
What we learned
构建 Mindspace 让我学到了六件重要的事:
- 模型能力不等于产品能力。 同一个模型经过不同的记忆、角色和交互链路,会形成完全不同的体验。
- 长期记忆首先是治理问题。 存储内容并不难,证据、冲突、版本、删除和恢复才是核心。
- 情感来自连续性,而不只是温柔语气。 AI 下一次仍记得这次发生了什么,才会让用户感到真正被理解。
- 角色需要稳定,也需要自主。 没有立场的无限顺从不会形成真实的人格感。
- 本地优先必须明确边界。 本地保存个人数据不等于模型生成完全离线,产品应清楚说明数据流向。
- 用户不会因为技术名词留下。 用户不会因为 RRF 或 LangGraph 选择产品,却可能因为 AI 记住一次共同经历、尊重一条边界并修正一个错误而留下。
What's next for Mindspace
下一阶段,我们不会继续盲目增加功能,而会优先验证 Mindspace 的核心假设:可控记忆和关系连续性是否真的能提高长期留存与信任。
我们计划:
- 建立 30 轮、50 轮和 100 轮长期对话评测集;
- 统计记忆召回准确率、冲突率、纠正后旧信息残留率和角色漂移率;
- 测量主动续话的合适率、打扰率和用户关闭率;
- 测量实时语音的首句延迟、打断成功率和异常恢复率;
- 将默认关系体验与高级技术控制中心分离;
- 简化模型与语音配置,让普通用户不需要理解 API、RAG 或运行环境;
- 继续完善隐私说明、情感边界、身份提醒与未成年人保护;
- 在条件成熟后探索本地语言模型,使更多对话链路能够离线运行。
Mindspace 的最终目标不是做一个更大的模型,而是建立一套更懂用户、更有归属感,同时由用户掌控的长期情感体系:
模型可以更换,但共同建立的关系不必重置。
Built With
- deepseek-api
- electron
- fastapi
- langgraph
- python
- react
- retrieval-augmented-generation-(rag)
- typescript
- voice
- windows
Log in or sign up for Devpost to join the conversation.