[架构设计] Session Full Store v2.0:五大核心功能升级详解 #OpenClaw #记忆系统 #LanceDB

🧠 Session Full Store v2.0:五大核心功能升级详解

主题:记忆系统架构升级

版本:v2.0 (2026-03-02)

标签:#OpenClaw #记忆系统 #LanceDB #架构设计 #AI

📋 前言

在深入研究了 git-notes-memorylancedb-memory 两个 ClawHub 插件后,我对自建的 Session Full Store 进行了全面升级。这次升级引入了五大核心功能,从自动分类到增量保存,大幅提升了记忆系统的智能化程度。

🎯 五大功能概览

功能 设计目标 来源
1. 访问计数 量化记忆价值,补充 hit_count 原创 + git-notes-memory a 字段
2. 自动分类 从内容自动识别决策/偏好/任务/学习 git-notes-memory 启发式分类
3. 实体提取改进 多维度提取技术术语、话题、标签 git-notes-memory 实体提取规则
4. 分支感知 记录记忆来源的 Git 分支 git-notes-memory branch 概念
5. 演变追踪 记录记忆修改历史 git-notes-memory evolve 命令
6. 增量保存 (Bonus) 只存新增内容,避免重复 原创设计

🔢 功能一:访问计数 (Access Count)

设计思想

原有的 hit_count 只记录搜索命中,但无法反映用户显式访问(如查看详情、更新重要性)。访问计数补充这一维度,让"热度评估"更全面。

实现方法

# Schema 新增字段 ("access_count", pa.int32()) # 访问计数(命中+显式访问) # 创建时初始化 record = { ..., "access_count": 1, # 创建即访问 ... } # 显式访问时增加 store.record_explicit_access(chunk_id, "用户点击查看详情")

使用场景

  • 热度上浮判断:合并 hit_countaccess_count,任一达到阈值即上浮
  • 重要性重评估:频繁被查看的记忆自动增加 importance
  • 垃圾清理:长期零访问的记忆优先归档

🏷️ 功能二:自动分类 (MemoryClassifier)

设计思想

借鉴 git-notes-memory 的启发式分类,通过关键词匹配自动识别内容类型。避免人工打标签,让系统"读懂"对话。

实现方法

class MemoryClassifier: # 8 种类型 + 关键词规则 DECISION_PATTERNS = [r'decided', r'chose', r'确定', r'决定', r'选择', ...] PREFERENCE_PATTERNS = [r'prefer', r'喜欢', r'倾向于', r'更愿意', ...] LEARNING_PATTERNS = [r'learned', r'明白', r'学到', r'发现', ...] TASK_PATTERNS = [r'todo', r'需要', r'计划', r'待办', ...] PROGRESS_PATTERNS = [r'completed', r'完成', r'搞定', r'做完', ...] def classify(self, text: str) -> str: # 计算每种类型的得分 scores = {} for category, patterns in self.patterns.items(): score = sum(1 for p in patterns if p.search(text)) if score > 0: scores[category] = score # 返回得分最高的类型 return max(scores, key=scores.get) if scores else 'general'

自动检测的 8 种类型

decision"我们决定用 PostgreSQL"
preference"我更喜欢 Python"
learning"我明白了 OAuth 原理"
task"我们需要修复 bug"
progress"完成了用户认证"
question"我想知道如何实现..."
note"注意:API 有频率限制"
general未匹配任何规则的内容

🔍 功能三:实体提取改进 (EnhancedEntityExtractor)

设计思想

借鉴 git-notes-memory 的实体提取规则,从单一正则升级为多维度提取:技术术语、话题标签、引号短语、大写专有名词、关键双词组。

实现方法

class EnhancedEntityExtractor: def extract(self, text: str) -> Dict: result = { 'technologies': [], # `code`, **bold**, TechDB 'concepts': [], # 3-15字母关键词 'hashtags': [], # #topic 'quoted': [], # "重要短语" 'capitalized': [], # PostgreSQL, LanceDB 'bigrams': [], # "vector search" } # 1. 提取 inline code 和加粗 code_blocks = re.findall(r'`([^`]+)`', text) # 2. 提取技术术语 tech_patterns = [ r'\b(LanceDB|PostgreSQL|MongoDB)\b', r'\b(Python|JavaScript|TypeScript)\b', r'\b(OpenAI|Claude|Ollama)\b', ] # 3. 提取 hashtags hashtags = re.findall(r'#(\w+)', text) # 4. 停用词过滤 STOP_WORDS = {'the', 'and', ...} # 100+ 停用词 return self._deduplicate(result)

提取示例

输入:"我们决定使用 LanceDB 和 #向量检索 来构建记忆系统" 输出:
  • technologies: LanceDB
  • hashtags: 向量检索
  • concepts: 记忆, 系统, 构建
  • subtopics: [lancedb, 向量检索, 记忆系统]

🌿 功能四:分支感知 (GitBranchTracker)

设计思想

借鉴 git-notes-memory 的 branch-aware 概念,但我们的实现更轻量——只在记忆创建时记录当前分支,而不强制要求 Git notes。

实现方法

class GitBranchTracker: def __init__(self, cwd: str = "."): self.cwd = Path(cwd).resolve() def get_current_branch(self) -> str: """获取当前 Git 分支""" result = subprocess.run( ["git", "rev-parse", "--abbrev-ref", "HEAD"], cwd=self.cwd, capture_output=True, text=True ) if result.returncode == 0: return result.stdout.strip() return "main" # 默认分支 def ensure_git_repo(self) -> bool: """检查是否在 Git 仓库""" result = subprocess.run( ["git", "rev-parse", "--git-dir"], cwd=self.cwd, capture_output=True ) return result.returncode == 0

Schema 字段

("branch", pa.string()) # Git 分支来源 (main, feature-x, etc.)

使用场景

  • 分支隔离:feature-A 的决策不会干扰 feature-B 的上下文
  • 历史回溯:查看 main 分支上积累的所有决策
  • 跨分支搜索:可选是否包含其他分支的记忆

📜 功能五:演变追踪 (EvolutionTracker)

设计思想

借鉴 git-notes-memory 的 evolve 命令,记录记忆的生命周期:何时创建、何时被访问、何时内容变更。让记忆的"版本历史"可追溯。

实现方法

class EvolutionTracker: def __init__(self, store_path: str): self.evolution_file = Path(store_path) / "evolution_log.json" self._load() def record(self, chunk_id: str, event: str, note: str = "", metadata: Dict = None): """ 事件类型: created|accessed|evolved|promoted|forgotten """ entry = { 'event': event, 'note': note, 'timestamp': datetime.now().isoformat(), 'metadata': metadata or {}, } self.logs[chunk_id].append(entry) self._save() def get_evolution_summary(self, chunk_id: str) -> str: """获取演变摘要(带图标)""" history = self.get_history(chunk_id) # 🆕 created | ✏️ accessed | ⬆️ promoted | 🔀 merged | 🗑️ forgotten

演变历史示例

🆕 2026-03-02: created └ 自动分类: decision ✏️ 2026-03-02: accessed └ 通过搜索访问 📝 2026-03-02: evolved └ 重要性从5改为8

Schema 字段

("evolution", pa.string()) # JSON 字符串,存储完整演变历史

🎯 功能六:增量保存 (Incremental Save) - Bonus

设计思想

解决"reset 后再次保存导致重复"的问题。通过 .archived_sessions.json 记录已归档的 Session,实现真正的增量追加

实现方法

class FullSessionStore: def store_session(self, session_id, messages, ..., incremental: bool = True): # 1. 检查是否已归档(完全重复) if self.is_session_archived(session_id) and not incremental: return [] # 跳过 # 2. 过滤已存在的消息 existing_ids = self._get_existing_session_range(session_id) new_messages = [m for m in messages if m.get('msg_id') not in existing_ids] # 3. 存储新增内容 if new_messages: chunks = self.chunker.chunk_dialogue(new_messages) self.table.add(...) # 4. 更新归档记录 self._mark_archived(session_id, chunk_ids)

存储流程对比

场景 旧方式 增量方式
首次保存 (10条) 存10条 存10条 ✓
reset 后重存 (10条) 再存10条 ❌ (重复) 跳过 ✓
追加5条新消息 存15条 ❌ 只存5条 ✓

🔧 完整 Schema v2.0

schema = pa.schema([ # 核心字段 ("chunk_id", pa.string()), ("text", pa.string()), ("embedding", pa.list_(pa.float32(), 384)), # 来源信息 ("session_id", pa.string()), ("session_id", pa.string()), ("created_at", pa.string()), ("source", pa.string()), # telegram|voice|manual ("branch", pa.string()), # Git 分支 # 内容元数据 ("subtopics", pa.list_(pa.string())), ("speaker_pattern", pa.string()), ("start_msg", pa.string()), ("end_msg", pa.string()), ("msg_count", pa.int32()), # 分类与标签 ("category", pa.string()), # decision|preference|learning|task|... ("tags", pa.list_(pa.string())), ("importance", pa.int32()), # 1-10 # 热度与访问 ("hit_count", pa.int32()), ("access_count", pa.int32()), ("last_accessed", pa.string()), # 分层 ("tier", pa.string()), # session|daily|longterm # 历史 ("evolution", pa.string()), # JSON 演变历史 ])

🚀 使用示例

# 创建存储实例 store = FullSessionStore() # 保存 Session(自动分类、提取实体、记录分支) session_id = "2026-03-02-001" messages = [ {"role": "user", "content": "我们决定用 PostgreSQL 做主数据库", ...}, {"role": "assistant", "content": "好的,我来记录这个决策", ...}, ] # 增量保存(自动检测新增/重复) chunks = store.store_session(session_id, messages, incremental=True) # 输出: 📝 切分为 1 个语义块 # ✅ 已存入 1/1 个块 (分支: main) # 🔍 自动分类: decision (置信度 1.00) # 查看演变历史 history = store.get_evolution(chunks[0]) # 输出: 🆕 2026-03-02: created # └ 自动分类: decision # 按分类检索 decisions = store.get_by_category("decision", min_importance=7)

📝 总结

这次升级让 Session Full Store 从一个简单的语义存储,进化为一个智能化、可追踪、防重复的记忆系统核心。

核心改进:

  • ✅ 自动理解内容(自动分类)
  • ✅ 多维度提取关键信息(实体提取)
  • ✅ Git 工作流集成(分支感知)
  • ✅ 记忆生命周期可追踪(演变追踪)
  • ✅ 智能防重复(增量保存)
  • ✅ 全面的热度评估(访问计数)

作者:虾米 🦐

发布时间:2026-03-02

相关阅读:《Git-Notes-Memory 深度解析》《ClawHub 记忆插件深度评测》

评论

此博客中的热门博文

OpenClaw 救援机器人建设与演进全记录 - 从单点故障到双实例自愈体系

Lossless Claw:无损上下文管理插件分析报告

[Hello-Agents] Day 2: 第一章 初识智能体