第 10 章 用户模型:偏好、情绪与历史
开篇段落
一个真正智能的具身系统,不仅能“听懂”当前的指令,更能“理解”与之交互的人。这种理解的核心,便是构建一个动态、多维、且具有生命周期的用户模型。本章将深入探讨如何为系统赋予记忆和同理心,使其能够感知用户的情绪状态,学习其长期偏好,并记录关键的交互历史。我们将超越简单的指令-响应模式,进入个性化、自适应交互的深水区,探讨从数据结构设计、多模态融合算法到社会性交互策略的全栈挑战。学完本章,您将能够设计和评估一个能够区分长期档案与短期状态、融合多模态信号进行绪和参与度估计、并处理冷启动、遗忘和多用户冲突等现实挑战的复杂用户模型。最终目标是让系统从一个确定性的“工具”演变为一个概率性的、不断进化的“伙伴”。
文字论述
10.1 长期档案与短期会话状态
用户模型并非铁板一块,而是由不同时间尺度、不同存储介质、不同更新策略的状态分层构成。精细地划分这些层次是实现高性能个性化与上下文感知响应的架构基础。
-
长期档案 (Long-term Profile):这是关于用户的持久化知识库,是系统建立长期关系和提供深度个性化的基石。它应被设计为可解释、可由用户审计和修改的。
- 数据结构与内容: 通常以结构化或半结构化形式存储(如 Protocol Buffers, JSONB)。
identity:user_id,name,relationship_graph(e.g.,{"user_id_2": "son"}), 声纹和人脸嵌入向量。preferences: 结构化的偏好向量如{"music_genre": {"classic": 0.8, "jazz": 0.5}, "news_topic": {"tech": 0.9}},每个偏好都附有置信度或权重。knowledge: 用户相关的实体图谱,如{"pet": {"name": "fido", "type": "dog"}}。habits: 识别出的周期性行为模式,如{"weekday_morning": "listen_to_podcast_xyz"}。
- 存储与更新: 通常存储在设备端的非易失性存储(如 SQLite)或云端数据库中,确保持久性。更新是低频的、事务性的,通常由一个后台的“模型提炼”服务在会话结束后异步执行。
- 数据结构与内容: 通常以结构化或半结构化形式存储(如 Protocol Buffers, JSONB)。
-
短期会话状态 (Short-term Session State):这是为当前交互上下文服务的“高速缓存”。它高度易变,决定了系统“此时此刻”应该如何响应。
- 数据结构与内容: 通常存储在内存中(如 Redis, in-memory dictionary),追求极低的读写延迟。
session_id: 本次交互的唯一标识。dialogue_history: 最近 N 轮的话记录(包括 ASR 转写、NLU 输出、系统响应)。emotional_state: 一个概率分布,如{"happy": 0.7, "neutral": 0.2, "surprised": 0.1},并附带时间戳和证据来源(如source: "visual_facial_expression")。engagement_level: 一个 [0, 1] 范围内的浮点数,表示用户的专注度。attentional_focus: 当前用户视线或语言指向的对象 ID 或空间坐标。task_stack: 当前正在执行或挂起的任务堆栈。
- 更新机制: 实时更新。每次用户输入、环境变化或系统动作后都可能刷新,更新频率可达数十赫兹。
- 数据结构与内容: 通常存储在内存中(如 Redis, in-memory dictionary),追求极低的读写延迟。
ASCII 图:用户模型架构与数据流
User Interaction (Voice, Vision, Touch)
|
v
+------------------------------------------------------+
| Short-term Session State (In-Memory) |
| +----------------+ +-----------------+ +---------+ |
| | Dialogue Hist. | | Emotional State | | Focus | | (TTL: ~30 mins)
| +----------------+ +-----------------+ +---------+ |
+------------------------------------------------------+
| ^
(Real-time Read) | | (Asynchronous Write/Summarization)
v |
+------------------------------------------------------+
| Dialogue & Planning Engine |
+------------------------------------------------------+
| ^
(Read for Context)| |
v |
+------------------------------------------------------+
| Long-term Profile (Persistent DB) |
| +------------+ +----------------+ +---------------+|
| | Identity | | Preferences | | Habits | | (Update: Low Freq)
| +------------+ +----------------+ +---------------+|
+------------------------------------------------------+
Rule-of-thumb: 将短期状态视为 CPU 的 L1/L2 缓存,将长期档案视为硬盘。数据流应是单向的短期状态用于实时决策,其有价值的部分在会话结束后被提炼、聚合,然后才更新到长期档案中。绝不要在实时交互循环中直接读写长期档案,以避免引入不可预测的延迟。
10.2 情绪/参与度估计(声学/视觉/语义)
情绪和参与度是高度动态的隐状态,其估计是一个典型的多模态融合与时序建模问题。
-
单模态特征提取:
- 声学 (Acoustic): 除了基础的韵律特征(语速、F0、能量),更高级的模型会使用 eGeMAPS 或 ComParE 特征集,它们包含了更丰富的谱、音质特征。基于深度学习的声纹模型(如 x-vector, ECAPA-TDNN)的中间层输出也能有效表征情感。
- 视觉 (Visual): 核心是面部表情分析。基于面部关键点,可以计算面部行为编码单元 (Facial Action Coding System, FACS) 的激活强度,如 AU12 (Lip Corner Puller) 对应微笑。头部姿态(点头/摇头)、眨眼频率和视线方向是关键的参与度指标。
- 语义 (Semantic): 使用预训练语言模型(如 BERT, RoBERTa)获取文本的上下文嵌入。通过在情感分类任务上微调,模型能捕捉到词汇、句法甚至反讽中的情感信号。
-
多模态融合策略:
- 早期融合 (Early Fusion): 在输入层将各模态特征向量拼接(concatenate),然后送入一个统一的分类器。优点是简单,能学习模态间的低层相关性。缺点是对特征同步要求高,且一个模态的数据缺失可能导致整个模型失效。
- 晚期融合 (Late Fusion): 为每个模态单独训练一个分类器,在决策层对它们的输出(如 logits 或概率)进行加权平均或投票。优点是鲁棒性好,模型可插拔。缺点是无法学习模态间的复杂交互。
- 混合/注意力融合 (Hybrid/Attentional Fusion): 这是当前的主流方法。通过跨模态注意力机制(cross-modal attention),模型可以动态地习在不同情境下应该“信任”哪个模态。例如,当用户说“太好了”但面无表情时,模型可能会给予视觉模态更高的注意力权重来修正语义的判断。
一个简化的注意力权重计算: $a_i = \text{softmax}(\frac{(W_q q) \cdot (W_{k_i} k_i)^T}{\sqrt{d_k}})$ 其中 $q$ 是一个模态(如文本)的查询向量,$k_i$ 是其他模态(如视觉、声学)的键向量。权重 $a_i$ 决定了在综合判断时,其他模态应该被关注多少。
Rule-of-thumb: 在资源允许的情况下,优先选择基于注意力的混合融合模型。在部署时,务必为每个模态的输入设计一个质量评估模块。例如,当光照过暗导致人脸识别置信度低时,应在融合模型中动态降低视觉模态的权重,而不是输入一堆噪声特征。情绪模型的输出应始终是概率分布,而非单一标签,以供下游模块进行不确定性感知决策。
10.3 偏好学习与个性化策略
偏学习的目标是从稀疏、有噪声的用户反馈中,构建一个能够预测用户对未知事物喜好的模型。
-
反馈信号的层次化:
- 强信号 (Strong Signals): 明确的用户指令(“收藏”、“我喜欢这个”)、评分、购买行为。
- 中等信号 (Medium Signals): 任务完成率、重复请求、完整播放率(音乐/视频)、主动追问。
- 弱信号 (Weak Signals): 停留时间(dwell time)、跳过率(skip rate)、非言语的正向反馈(如微笑、点头)。
-
建模技术:
-
嵌入式表征: 将用户和物品(歌曲、新闻、技能等)都映射到同一个高维向量空间。用户向量 $V_u$ 可以通过其交互过的物品向量 $V_i$ 的加权平均来计算。 $V_u = \frac{\sum_{i \in I_u} w_i V_i}{|I_u|}$ 其中 $I_u$ 是用户 $u$ 交互过的物品集合,$w_i$ 是基于反馈信号强度计算的权重。预测用户对新物品 $j$ 的喜好度,可通过计算 $V_u$ 和 $V_j$ 的余弦相似度得出。
-
探索与利用 (Exploration vs. Exploitation): 为了避免“信息茧房”,必须平衡对已知偏好的利用和对未知领域的探索。
- Epsilon-Greedy: 以 $\epsilon$ 的概率随机推荐,以 $1-\epsilon$ 的概率推荐当前最优选项。
- 上置信界 (UCB): 选择不仅得分高,而且不确定性也高的选项,其选择策略为 $\text{arg max}_i (\text{score}_i + C \sqrt{\frac{\ln t}{N_i(t)}})$,鼓励探索被推荐次数 $N_i$ 较少的项目。
-
Rule-of-thumb: 对不同强度的反馈信号赋予不同的权重。例如,一次显式“收藏”的权重可能是 10 次完整播放的权重。用户的偏好向量不应是静态的;每次交互后,都应使用一个小的学习率(如 0.01)来微调其向量方向,使其更接近刚刚产生正反馈的物品向量。
10.4 多人场景的优先级与公平性
在家庭等多人环境中,系统必须从个“个人助理”切换到“家庭协调员”的角色,核心是管理注意力和处理请求冲突。
-
注意力焦点管理 (Attentional Focus Management):
-
状态机模型: 系统的注意力可以用一个状态机来描述:
IDLE->LISTENING_TO_ALL-> (检测到特定用户说话) ->FOCUSED_ON_USER_A-> (处理请求) ->RESPONDING_TO_USER_A->IDLE. -
焦点切换触发器:
- 显式唤醒: “小X,帮我一下”。
- 视觉线索: 用户与机器人建立持续的眼神接触。
- 强意图语音: 用户的声音突然变大或使用祈使句。
- 超时: 当前焦点用户长时间无交互,自动释放焦点。
-
-
冲突解决策略: 当收到来自不同用户的冲突指令时(如 A说“开灯”,B说“关灯”):
- 优先级裁决: 基于预设的权限(如父母 > 孩子)。
- 寻求澄清/协商: “我收到了开灯和关灯两个指,请问应该执行哪一个?”
- 时间局部性: 优先执行最新的指令。
- 领域分割: 如果指令属于不同领域(A让放音乐,B让报天气),可以并行或串行执行。
Rule-of-thumb: 在多人场景中,默认的对话结束语不应是沉默,而应是明确的“还有什么可以帮您吗?”,并伴随一个转向所有人的姿态,这是一种释放焦点并邀请其他人开始交互的社会信号。记录对每个家庭成员的服务日志,并定期检查是否存在服务分布的严重不均,作为公平性审计的一部分。
10.5 冷启动、遗忘与重置
用户模型的整个生命周期都需要被精心设计,以应对新用户、变化的偏好和隐私需求。
-
冷启动 (Cold Start):
- 引导式画像 (Guided Profiling): 在首次设置时,通过一个简短有趣的对话来获取核心偏好,而不是枯燥的表单。“为了给您推荐音乐,您更喜欢在放松时听,还在运动时听?”
- 基于人口统计学的原型 (Demographic-based Prototypes): 在用户同意的情况下,可以利用相似年龄、地区用户的聚合数据作为初始偏好。但这必须透明,并告知用户这只是一个起点。
-
遗忘 (Forgetting): 用户的偏好不是一成不变的。模型必须能够遗忘过时的信息。
-
指数衰减 (Exponential Decay): 每次更新偏好时,旧偏好的权重会按一个衰减因子 $\lambda$ (0 < $\lambda$ < 1) 降低。对于一个偏好 $P$ 的值 $v$,其随时间 $t$ 的更新可以表示为: $P_t = (1 - \alpha) \cdot P_{t-1} + \alpha \cdot \text{NewObservation}_t$ 这本质上是一个指数移动平均,旧信息的权重会随时间指数级下降。
-
基于时间的窗口: 只考虑过去 N 天(如 30 天)的交互数据来计算偏好,彻底丢弃更早的数据。
-
-
重置 (Reset): 这是用户的基本数据权利。
- 实现: 重置功能触发一个级联删除操作,清除长期档案数据库中的相关条目,并使内存中的会话状态失效。重要的是,还要删除与该用户相关的、用于模型训练的脱敏日志(如果可能追溯),或至少确保未来的模型训练中不再包含这些数据。
Rule-of-thumb: 遗忘机制是防止偏好固化的关键。衰减因子 $\lambda$ 或时间窗口大小是一个需要根据应用场景仔细调整的超参数。对于变化快(如新闻偏好)和变化慢(如音乐品味)的领域,可以设置不同的遗忘速率。
10.6 触达边界:不打扰与尊重
一个强大的用户模型最大的风险就是滥用其“洞察力”。建立清晰的交互边界和抑制机制是赢得用户信任的唯一途径。
-
主动交互的决策模型: 系统是否应该主动发起交互,可以建模为一个效用评估问题: $U(\text{proactive_action}) = P(\text{success}) \times V(\text{success}) - (1 - P(\text{success})) \times C(\text{failure}) - C(\text{interruption})$
- $P(\text{success})$: 预测该行为能成功帮助用户的概率。
- $V(\text{success})$: 成功带来的价值(如帮用户找到钥匙)。
- $C(\text{failure})$: 失败的成本(如推荐错误,浪费用户时间)。
- $C(\text{interruption})$: 打扰本身的成本。这个成本应该是一个函数,其变量包括:时间(深夜成本高)、用户状态(正在通话或专注时成本极高)、地点(卧室成本高于客厅)。
-
抑制信号 (Inhibition Signals): 系统应持续监测预示着“请勿打扰”的信号:
- 显式: 用户说“别烦我”或开启勿扰模式。
- 强隐式: 检测到用户正在与他人进行面对面交谈(通过说话人分离和人脸朝向判断)、正在打电话、佩戴耳机。
- 弱隐式: 用户长时间保持静态专注姿势(如阅读)、环境噪音水平很高、情绪检测为“悲伤”或“愤怒”。
Rule-of-thumb: 设计一个“打扰预算”。系统每天或每小时只有有限次的主动交互机会(类似 token bucket 算法)。高价值、高置信度的机会才能消耗预算。这个预算在检测到抑制信号时应被冻结。永远为用户提供一个简单的方法来撤销或忽略主动建议,例如,当机器人主动走过来说话时,用户只需一个摆手手势或一句“不用了”,机器人就应立刻安静退下,而不是追问。
本章小结
本章系统地阐述了构建具身对话系统中用户模型的核心要素。一个健壮的用户模型是连接感知与个性化决策的关键桥梁,它决定了系统能否从一个冰冷的机器进化为一个有温度的伙伴。
- 核心分层与生命周期: 用户模型应清晰地区分为长期档案(持久化、低频更新)和短期会话状态(内存中、高频更新)。其冷启动、遗忘与重置机制是模型长期可用性和用户信任的保障。
- 多模态状态感知: 通过早期、晚期或混合/注意力融合策略,整合声学、视觉、语义等多模态信号,系统可以更准确地估计用户的情绪与参与度,这是实现共情交互的基础。
- 个性化与偏好学习: 结合不同强度的反馈信号,利用嵌入式表征和探索-利用算法,系统能够学习并适应用户的个性化偏好,同时避免信息茧房。
- 社会性挑战: 在多人场景下,必须设计精巧的注意力焦点管理和冲突解决策略,实现公平和高效的交互。
- 伦理边界与信任: 最重要的是,强大的用户模型必须与严格的交互边界和主动交互决策模型相结合,始终将不打扰和尊重用户隐私放在首位。
常见陷阱与错误 (Gotchas)
-
混淆短期意图与长期偏好 (Temporal Generalization Fallacy):
- 陷阱: 用户某天因为招待客人点播了儿童歌曲,系统立即将其类为用户的长期偏好,并在之后不断推荐。这本质上是把一个上下文相关的短期行为错误地泛化为长期特征。
- 调试技巧: 引入“行为速度”(behavioral velocity)或“上下文标签”概念。在记录交互时,不仅记录行为本身,还记录其上下文(如
context: "guest_present")。只有在多个不同上下文中反复出现的行为,才能被认为是更新长期偏好的强证据。在用户模型数据库中,为每个偏好项增加一个evidence_count和context_variety字段。
-
情绪识别的“模态失衡”陷阱 (Modality Imbalance):
- 陷阱: 融合模型在训练数据中,某个模态(如文本)的信号总是比其他模态(如视觉)更强,导致模型过度依赖该模态。当现实中该模态缺失或有噪声时(如用户只是叹气而没说话),模型性能急剧下降。
- 调试技巧: 在训练时使用模态丢弃(modality dropout)技术,机屏蔽掉某个或某几个模态的输入,迫使模型学习更鲁棒的跨模态表征。在推理时,监控每个模态的输入信噪比(SNR)或置信度,并将其作为注意力权重的一部分,动态调整模态贡献。
-
多人场景下的“注意力惯性” (Attentional Inertia):
- 陷阱: 系统在与用户 A 对话后,会过度保持对 A 的注意力,即使 B 后续用更清晰的语音发出了指令,系统仍然可能优先响应 A 的微弱后续话语,或完全忽略 B。
- 调试技巧: 实现一个明确的注意力焦点评分系统。每个潜在的用户都是一个焦点候选人,其得分由多个因素加权构成:
score = w1*is_current_focus + w2*voice_activity_confidence + w3*is_looking_at_robot + w4*recency。系统每 100 毫秒重新评估一次分数,并将焦点分配给最高分者,这比简单的超时机制更灵活。
-
偏好固化与过度拟合 (Overfitting to the Past):
- 陷阱: 系统的偏好学习模型(特别是复杂的深度模型)完美地拟合了用户过去的行为,但当用户的兴趣发生自然演变时,模型无法适应,反而会试图把用户“拉回”旧的偏好模式,导致体验僵化。
- 调试技巧: 在偏好模型中引入一个“年龄”或“新鲜度”特征,对近期的交互数据给予远高于陈旧数据的权重。定期(如每周)在推荐中注入一部分“多样性”或“惊喜”项(serendipity items),并密切监测用户对这些新事物的反应,作为探测用户兴趣是否漂移的“探针”。
-
边界感缺失导致的“数字幽灵”效应 (The Digital Ghost Effect):
- 陷阱: 系统过于“聪明”,例如在用户喃喃自语时突然插话回答,或者评论用户与家人的私密对话。这会让用户感到无所遁形,仿佛有一个“数字幽灵”在时刻监听,严重破坏信任感。
- 调试技巧: 建立一个严格的“交互启动协议。例如,只有当语音信号的能量、清晰度、以及说话人朝向等多个指标同时超过阈值,且内容符合“指令”或“问题”的分类时,才启动正式的对话流程。对于低能量的、非朝向的语音,应将其归类为“环境噪音”或“私下言语”并忽略。在日志中明确区分
private_speech和public_command事件,并严格审计前者是否被错误处理。