Extractor(记忆提取)
每轮对话结束后异步提取记忆,不阻塞用户响应。NATS 消息格式
Copy
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 成本)
Copy
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(遗忘机制)
每周运行,模拟遗忘曲线。Copy
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 → 软删除