项目作品复盘 · 独立产品

👩‍❤️‍👨 不枕 Somnium

从会聊天,到会拿捏分寸

不枕不是一个 AI 恋人聊天壳子,而是我从 0 到 1 独立完成的 AI 情感陪伴产品。 这次重构的核心,是把容易失控的亲密体验,拆成一套可解释、可调试、可控成本的 Agent Harness

产品定位 用户研究 角色设计 Agent 架构 前后端实现 模型接入 上线部署 测试复盘
0-1 独立完成
从产品定义到部署上线,全链路负责
代码定分寸
Runtime 决定做什么,保证稳定可复盘
模型做表达
LLM 决定怎么说,保留自然和角色味道

从会聊天,到会拿捏分寸

第一版能聊,但我说不清它为什么这么回复
01 / PROBLEM

V1 已经会聊天,真正的问题是:当用户低落、回避或试探关系时,系统能不能稳定地拿捏分寸

V1Prompt Workflow

模型同时决定
做什么、怎么说

信息塞进 Prompt情绪、记忆、天气都只是素材。
行为临场判断安慰、调情、收住都靠模型发挥。
跑偏难以定位不知道错在感知、状态还是表达。
V2Agent Harness

Runtime 决定动作,
模型负责表达

素材先变信号情绪、时间、记忆进入状态。
Runtime 选动作接住、靠近、后退、短路可控。
Trace 可复盘每轮都能看见为什么这样回复。

关键风险链路

低落求安慰误判成暧昧关系推进过度
核心重构判断

亲密关系的“分寸”不能只靠模型自由发挥。Runtime 管动作,模型管表达。

用户真正要的不是聊天框

技术重构来自真实体验问题,而不是为了炫技
02 / PRODUCT INSIGHT

她不是缺一个会回答的 AI,
而是缺一个稳定存在的人

目标用户想要的不是模型知识量,而是细腻的关系体验:低落时被接住、日常里被记得、靠近时有分寸,并且角色像真的活在她的生活时间线里。

Surface Request

“我想和他聊天”

江予白头像

如果只把它理解成聊天框,产品会很快滑向“会说话,但不形成关系”。

被接住先承接情绪,再决定要安慰、陪伴,还是短路到安全话术。
被记得日常小事先进入记忆和状态,合适时机才自然提起。
有分寸靠近、后退、调情和克制都要被策略控制,而不是临场发挥。
有生活感时间、天气、语音和场景图让角色像活在同一条时间线里。
Core Scene 01

🌙深夜情绪急救

用户不是来要答案,而是在低落、焦虑、失眠时确认“有人在”。系统要先识别情绪强度和风险,再选择安慰、陪伴或安全兜底。

Signal情绪强度 / 风险词 / 深夜时间
Action接住情绪,降低推进感
Output温柔、稳定、不过度暧昧
Core Scene 02

☀️日常关系经营

用户真正沉浸的点,是他会记得、会主动、会在合适时间出现。记忆、天气和时间不只是 Prompt 素材,而是先进入状态和策略。

Signal记忆片段 / 天气 / 互动间隔
Action主动关心,或轻轻提起旧事
Output像关系延续,而不是问答重启

核心方案:Agent Harness

不让大模型自由发挥一个“会恋爱的角色”
03 / AGENT HARNESS

我把亲密陪伴拆成一套可计算、可追踪、可调节的 Agent Harness。

不枕表面上是在和江予白聊天,底层真正处理的是一连串“关系行为”判断:她现在是在求安慰、撒娇、试探关系,还是只是日常闲聊?这一轮应该接住、靠近、后退、主动提起记忆,还是短路到安全话术?这些决定不能全交给模型临场发挥。

不枕 Somnium Agent Harness 分层架构图:输入层、运行时、输出层、执行层和基础能力
Harness Architecture:输入信号、核心运行时、输出通道、LLM 执行和基础保障被组织成一套分层系统。 核心是把“做什么”收回到可解释、可复盘、可调节的决策链路里。
01
先判断情境用户文本、时间、天气和历史记忆先被转成结构化信号。
02
再更新关系好感、信任、张力和情绪能量会随互动升温,也会在回避时回退。
03
由代码选动作安慰、主动关心、轻微调情、克制后退和提起记忆都会被打分。
04
模型只负责表达LLM 在已确定的行为目标、关系温度和人设边界下生成台词。
05
外显走旁路语音、表情包和场景图增强沉浸感,但不干扰核心决策链路。
Code

代码负责“做什么”,保证稳定、可解释、可复盘。

Model

模型负责“怎么说”,保证自然、苏感和角色味道。

不枕 Agent Harness 决策闭环图:感知、关系状态、动作选择、表达执行和记忆更新
Decision Loop

每一轮回复,都先跑完一圈决策闭环。

不枕不是直接把用户消息丢给模型生成台词,而是先读懂当前情境,再更新关系状态,由代码选择本轮动作,最后让模型把动作目标表达出来;回复后的新信息再写回记忆,为下一轮对话做准备。

感知读世界 关系会变动 决策在代码 记忆会回写
System Architecture

它不是一层聊天壳,而是分层运行的情感 Agent。

用户看到的是文字、语音、多模态互动和关系变化;中间由情绪感知、时间关怀、天气关怀、记忆召回和主动问候支撑;再往下是 Agent Runtime,负责把信号汇合成状态与决策。

用户体验层 产品能力层 Agent Runtime 层 模型与数据底座
不枕 Somnium 五层产品能力架构图:用户层、应用层、Agent Runtime 层、模型层和基础层

每一句回复,都能回看它为什么发生

把“分寸”拆成可观测的五个机制
04 / MECHANISMS

这一节不再讲抽象架构,而是解释 Runtime 怎么在一轮对话里工作:先读懂用户,再更新关系状态,接着由代码选择动作,必要时调取记忆,最后把全链路写进 Trace。

01
情绪感知把用户文本拆成 emotion、intent、intensity、facts。
02
状态更新关系状态每轮先衰减,再根据本轮信号上下浮动。
03
动作打分代码选择安慰、靠近、后退、提起记忆或安全短路。
04
记忆闭环记忆先影响决策,选中后才进入表达层。
05
Trace 复盘每轮记录感知、状态、分数和最终指令。
情绪感知:用户文本到结构化信号

先读懂,不直接决定

感知层只负责把自然语言拆成结构化信号,不负责决定江予白该安慰还是调情。

状态引擎:关系状态上下浮动

关系会升温,也会回退

好感、信任、张力、情绪能量每轮重新计算,不用“聊够几轮就升级”的硬规则。

决策打分:代码选择动作

代码决定「做什么」

候选动作被统一打分,Runtime 选择最合适的动作;LLM 只接收最终动作目标和表达边界。

记忆闭环:记忆写入与召回

记忆不是传统 RAG

记忆先作为决策信号参与打分;只有“主动提起记忆”被选中,具体记忆才进入台词。

Trace 调试面板示意

回得不对时,不靠感觉猜

Trace 记录感知、状态变化、动作分数和最终指令,方便定位是感知错、权重错还是表达没服从。

我没有把所有东西都交给模型

知道边界,比堆能力更重要
05 / PRODUCT DECISIONS

不枕不是把能力越堆越多,而是明确哪些事情必须稳定、哪些事情可以交给模型发挥、哪些能力应该旁路化。下面是这套 MVP 里最关键的四个取舍。

Decision
没有选择
我的选择
为什么
01
决策不交给 LLM
让模型同时判断“做什么”和“怎么说”。
Runtime 先选动作,LLM 只负责把目标说自然。
亲密关系的分寸需要稳定、可测、可回放;模型适合表达,不适合独自承担行为边界。
02
高成本能力旁路化
把场景图、表情包等能力放进主回复链路。
主回复稳定返回,图片和外显能力异步触发、失败可回滚。
会慢、会贵、会失败的能力不能阻塞核心对话;普通文字轮成本保持可控。
03
Planner 不写死剧情
用多轮剧本强行制造“像 Agent”的连续性。
只保留短计划,每轮先检查用户当前状态,必要时重排。
情感陪伴的优先级是当下感受。用户回避或结束话题时,系统必须马上收住。
04
安全优先于亲密
让所有输入都进入普通亲密关系打分。
高风险输入先短路到安全话术,不进入暧昧和主动靠近策略。
用户越脆弱,系统越不能推进暧昧。安全不是合规附录,而是最高优先级。

可观测性:我如何知道系统为什么这样回复

把一次情感回复拆回可追踪、可解释、可定位的运行链路
06 / OBSERVABILITY

手机端里的调试视图

调试入口直接放进真实对话界面:先开启 dev 面板,再展开当轮 Agent Trace,最后查看动作分数、状态变化和上下文信号。

手机端设置中开启调试面板
入口:在设置里打开调试面板,发出一条消息后显示当轮 trace。
手机端 Agent Trace 展开
决策:查看本轮动作、记忆提取、候选动作分数和状态变化。
手机端 Agent Trace 详情
上下文:继续下钻到关系状态、计划指针、情绪强度和上下文信号。

情感陪伴最难调的地方,不是“回复不好看”,而是很难判断它为什么这样回复:是情绪识别错了,关系状态太激进,记忆召回不该出现,还是模型表达越界。为了解决这个问题,我给不枕做了 Trace 面板,让每轮对话都能回看系统在各层做过的判断。

不枕 Trace 调试面板示意
Trace 面板:每轮回复都保留输入、信号、状态、动作分数、最终动作和表达指令,方便复盘“为什么是这句话”。
01
先看输入被理解成什么用户文本会先被解析成情绪、意图、风险和语气信号,而不是直接塞进 Prompt。
02
再看状态有没有被推偏关系亲密度、信任、张力和情绪能量会被记录,方便判断系统是不是过度靠近。
03
继续看动作为什么被选中候选动作会经过打分,安慰、靠近、后退、主动提记忆都有可解释依据。
04
最后看模型拿到的表达目标模型只负责把已确定的动作目标说自然,而不是临场决定一切。
05
旁路输出也能单独排查语音、表情包和场景图不参与核心决策,失败时不会拖垮主回复。
Debug

当一句话显得太近或太冷,我可以定位是状态、策略还是表达层的问题,而不是反复猜 Prompt。

Review

产品体验和工程实现可以用同一份 Trace 讨论,把主观感受落到具体运行节点。

Cost

把可确定的判断放在代码里,模型调用集中在表达层,降低不必要的试错和调用成本。

SDD 规范:用工程约束 AI Coding

把冻结 PRD 拆成可追踪、可验证、可归档的实现依据
07 / SDD
Engineering Discipline

先固化产品边界,
再进入 AI 辅助实现。

不枕的 Agent Runtime 不是边聊边改 Prompt 的试错流,而是先把 PRD v1.2 冻结,再用 OpenSpec 把 proposal、spec、tasks 和验收门槛拆清楚。

决策不交给 LLM连续状态、动作打分、短期计划都在代码里。
成本调用固定非红线轮保持 1 Lite + 1 V4。
从需求到实现的 SDD 链路 PRD → Proposal → Specs → Tasks → Gates
冻结 PRD结构、schema、action 枚举不可随意改。
Proposal说明为什么做、影响什么、边界在哪。
Specs把能力拆成 requirement 和 scenario。
Tasks逐模块实现,每一步都有 verify。
Archive验收通过后归档,留下可复盘依据。
Quality Gate
180 passedRuntime 多轮回归验证通过。
Strict Boundary
不改 PRD 结构调参只改 config,不随手改流程。
Traceable Specs
7 个主规范感知、状态、记忆、策略、规划、执行、Runtime。

我在项目里负责什么

不是参与某个模块,而是独立跑通 0-1 产品闭环
08 / OWNERSHIP

AI Product Manager / AI Builder

本项目由我独立完成从 0 到 1 的产品定义、Agent 架构设计、体验设计、前端实现与部署上线,覆盖从想法验证到可运行 MVP 的完整闭环。

产品设计
  • 用户研究
  • 竞品分析
  • 核心场景定义
  • 功能边界规划
  • PRD 撰写
AI 工程
  • Agent Harness 设计
  • 关系状态引擎
  • 行为决策打分
  • 记忆与信号接入
  • Prompt 表达约束
UI/UX 设计
  • Figma 高保真原型
  • 聊天体验设计
  • 江予白人物视觉
  • 人脸一致性控制
前后端开发
  • 基于 Claude Code 的 React 开发
  • API 对接
  • 前后端联调
  • 决策追踪窗口实现
部署运维
  • Zeabur 云端部署
  • 环境变量配置
  • 线上调试与监控
  • 测试反馈复盘

商业化:这个项目必须算得过来

情感陪伴不是一次性工具,能不能持续成立,取决于付费意愿和成本结构
09 / COMMERCIALIZATION
💗
免费体验先验证角色魅力和睡前陪伴场景。
+
💳
订阅会员长期记忆、主动关怀、语音陪伴。
+
🎁
虚拟商品语音包、皮肤、剧情包、场景图。
+
🪙
能力额度图片、长语音等高成本能力单独控制。
Single Round Estimate
能力
单轮构成
模型 / 价格依据
成本级别
估算成本
产品处理
文字聊天主链路基础能力
情绪感知 + 表达生成固定两次文本模型调用
DeepSeek-Lite + DeepSeek-V4约 1,800-2,200 tokens 总量
约 ¥0.004-0.008 / 轮时间、天气、记忆打分不额外调模型
放进订阅适合做基础陪伴权益
语音陪伴提升沉浸感
按字符计费单轮增量可控
MiniMax TTS按约 ¥0.015 / 千字符估算
¥0.005-0.010 / 轮通常只增加不到 ¥0.002
会员权益可按次数或时长控制
场景图视觉代入能力
单张图片生成远高于文本和语音
Seedream 4.5场景图按单张低频触发估算
¥0.06-0.25 / 轮图片生成是主要成本来源
额度制低频触发,失败回滚

这里按 Harness 单轮上下文估算,包含人设 Prompt、状态 JSON、记忆候选和最近上下文。普通聊天成本接近固定,真正要被预算闸控制的是图片和长语音等高成本旁路能力。

Revenue Logic

卖的不是单次聊天

付费点应该围绕“更稳定、更懂我、更有仪式感”的长期陪伴,而不是让用户感觉每句话都在扣钱。

Cost Logic

成本决定体验边界

文本便宜,语音中等,图片最贵。 所以高成本能力要低频触发、额度控制、失败可回滚。

文本
语音
图片