第 28 讲:Feedback 反馈机制

DeepSeek Harness 源码解析 · 第 28 讲

DeepSeek Harness 源码解析系列 第 28 讲:Feedback 反馈机制 基于 DeepSeek Harness 源码 · 2026-09-11 💡 本讲一句话: Harness 把"反馈"拆成两条完全独立的通道——对某条助手消息的点赞/点踩是带版本令牌(乐观锁)的持久化 sidecar,而 /feedback 命令只是往会话日志里追加一条永不进入模型上下文的事件;读完你能看懂 CAS、双端串行化和"先落盘再写反馈"的顺序保证是怎么实现的。 一、两条通道,一个词 "Feedback"在 Harness 里不是一个功能,而是两个包: message-feedback (packages/feedback/message-feedback)和 command-feedback (packages/feedback/command-feedback)。前者回答"用户对这条消息打几分、为什么",数据落在 storage-domain 的持久化 sidecar 表里;后者回答"用户想吐槽什么",只往会话事件日志追加一条 feedback/record 事件。两者唯一的交集是遥测共享策略:录下反馈这个动作本身,可能触发"feedback-only"模式下会话前缀被放行分享。 先给一张对照表,后面所有代码都围绕这两列展开: 维度 message-feedback(逐条评分) command-feedback(会话吐槽) 存储位置 storage-domain sidecar 表 message_feedback.sessions(持久化) 会话事件日志 feedback/record 事件(log-only) 并发控制 UUID 版本令牌 CAS + 按 session 串行化 无(append-only,天然幂等) 是否进模型上下文 否(纯 sidecar,不进派生历史) 否(事件注释明确"never enters model context") 幂等语义 相同内容 no-op 不 bump 版本;delete 缺失即成功 重复调用 = 追加多条事件(不去重) 遥测联动 无直接联动 ack 文案披露 sharing 策略(full / feedback-only / disabled) 暴露面 Typert Remote(list / put / delete)供 Web 客户端调用 /feedback 命令,所有 command adapter 可见 注意一个容易误解的点:两条通道都 不进入模型上下文 。反馈是给人和遥测看的,不是给 LLM 看的——点赞不会让下一轮回答"更卖力"。 二、message-feedback:一个只读日志的 sidecar 服务 MessageFeedbackService 继承 TypertRemoteService,注入三个依赖:storageDomain(持久化域)、sessionPersistence(日志投影读取)、sessions(活会话注册表)。类注释写得很直白:"It inspects persisted Session history and never creates or resumes an Agent or Session"——它只读别人的日志,绝不碰 Agent 生命周期。 先看初始化:打开 sidecar domain、注册关闭 effect、拿到表句柄。三件事,顺序有讲究。 📄 packages/feedback/message-feedback/src/index.ts (第 150-181 行) export class MessageFeedbackService extends TypertRemoteService { // 继承 Remote 基类,list/put/delete 三个方法经 @Remote 暴露给客户端 static inject = ['storageDomain', 'sessionPersistence', 'sessions'] // 声明式注入:持久化域 + 日志投影读取器 + 活会话注册表,Loader 按名装配 /** Loader validation for the required note-size policy. *…

阅读全文:DeepSeek Harness 源码解析 第 28 讲