Skip to main content

Extractor(记忆提取)

每轮对话结束后异步提取记忆,不阻塞用户响应。

NATS 消息格式

interface MemoryExtractTask {
  entity_id: string;
  entity_type: 'user' | 'group';
  group_id?: string;              // 群场景下传群 ID,用于群记忆提取
  thread_id: string;
  messages: Array<{ role: string; content: string }>;
  tool_calls: Array<{
    tool_name: string;
    args: object;
    result: object;
    duration_ms: number;
  }>;
}

行为提取(零 LLM 成本)

function extractBehavior(task: MemoryExtractTask): BehaviorSignals {
  const tools = task.tool_calls;

  return {
    filters_used: tools.filter(t => t.tool_name === 'applyFilter').map(t => t.args.filter),
    ratios_used: tools.filter(t => t.tool_name === 'crop').map(t => t.args.ratio),
    tools_sequence: tools.map(t => t.tool_name),
    exported: tools.some(t => t.tool_name === 'export'),           // 满意信号
    undone: tools.some(t => t.tool_name === 'undo'),               // 不满意信号
    model_used: tools[0]?.args?.model,
    edit_count: tools.length,
  };
}

Consolidator(记忆固化)

每天凌晨运行,把情景记忆”蒸馏”成用户画像。

Decayer(遗忘机制)

每周运行,模拟遗忘曲线。
function calculateDecay(memory: Memory): number {
  const ageDays = daysSince(memory.created_at);
  const isConsolidated = memory.consolidated_at !== null;

  // 基础衰减:指数衰减曲线
  const recencyFactor = Math.exp(-ageDays / 90);  // ~63天半衰期(90天时衰减至 37%)

  // 访问加成:越常被检索越重要
  const accessBoost = 1 + Math.log1p(memory.access_count) * 0.2;

  // 固化惩罚:已蒸馏到 profile 的可以更快遗忘
  const consolidatedPenalty = isConsolidated ? 0.5 : 1.0;

  return memory.importance * recencyFactor * accessBoost * consolidatedPenalty;
}

// decay_weight < 0.05 → 软删除