Doramagic 项目包 · 项目说明书
memsearch 项目
生成时间:2026-05-31 18:47:49 UTC
项目概述
memsearch 是一款面向 AI 编码代理的跨平台语义记忆搜索工具,以 Markdown 文件为核心数据源,由 Milvus 向量数据库提供底层索引能力。资料来源:[mkdocs.yml:3]()
继续阅读本节完整说明和来源证据。
继续阅读本节完整说明和来源证据。
继续阅读本节完整说明和来源证据。
继续阅读本节完整说明和来源证据。
核心定位
memsearch 旨在解决 AI 编码代理在长时间任务中的记忆缺失问题。传统的编码代理每次对话都是全新的上下文窗口,无法主动回忆之前解决过的问题、做过的决策或积累的项目知识。
memsearch 通过三层渐进式检索机制,使代理能够:
- 快速定位历史讨论中的相关片段
- 展开查看完整的 Markdown 段落上下文
- 在必要时回溯原始会话记录
资料来源:README.md:50-60
核心概念
Markdown 作为事实来源(Source of Truth)
memsearch 坚持 Markdown 文件优先 的设计哲学。所有记忆内容都以 Markdown 格式存储在本地目录中,Milvus 仅作为可重建的影子索引(shadow index)存在。
┌──────────────────────────────────────────────────────────────┐
│ Memsearch 架构 │
├──────────────────────────────────────────────────────────────┤
│ │
│ Plugins ──→ Markdown 文件 (.memsearch/memory/) │
│ │ │
│ ▼ │
│ memsearch index → Milvus │
│ │ │
│ ▼ │
│ memsearch search ←──── CLI / API │
│ │
└──────────────────────────────────────────────────────────────┘
这种设计的优势包括:
- 可读性:记忆内容可被人类直接阅读和编辑
- 可移植性:无需依赖专有数据库即可迁移
- 可重建性:Milvus 索引损坏时可通过重新索引完全恢复
资料来源:README.md:65-72
项目级内存隔离
memsearch 默认采用项目级作用域的内存模型。每个项目拥有独立的 .memsearch/memory/ 目录,集合名称从项目路径派生,确保不同项目的记忆相互隔离。
~/.memsearch/memory/
└── ms_project_abc12345/
├── memory/
│ ├── 2026-03-27.md
│ ├── 2026-03-26.md
│ └── ...
└── config.yaml
这种设计使用户能够明确预测和理解记忆的归属范围。资料来源:README.md:75-85
插件生态
memsearch 通过插件层与主流 AI 编码代理集成,目前已支持的平台包括:
| 插件名称 | 集成方式 | 特点 |
|---|---|---|
| Claude Code | Claude Code hooks | 会话自动捕获、每日摘要 |
| Codex | Codex CLI hooks | 展开式对话解析 |
| OpenCode | TypeScript 工具 | 内存搜索、展开、回溯 |
| OpenClaw | 技能系统 | 项目回顾、用户画像 |
资料来源:README.md:20-35
核心模块
MemSearch 核心类
MemSearch 是库的公共 API 入口,位于 src/memsearch/__init__.py。该类封装了索引、搜索、监控等核心功能。
from memsearch import MemSearch
ms = MemSearch(["./docs", "./memory"])
ms.index()
results = ms.search("如何配置 Milvus")
资料来源:src/memsearch/__init__.py:5-9
文档分块器(Chunker)
分块器负责将 Markdown 文件拆分为语义上有意义的块,便于嵌入和检索。核心策略包括:
- 按标题层级拆分:H1-H6 标题作为自然分界点
- 最小有意义长度:过滤过短的标题段落(
_MIN_MEANINGFUL_LEN = 2) - HTML 注释清理:移除会话 UUID 和转录路径等元数据噪声
def clean_content_for_embedding(text: str) -> str:
"""Strip metadata noise from chunk content before embedding."""
cleaned = _HTML_COMMENT_RE.sub("", text)
cleaned = re.sub(r"\n{3,}", "\n\n", cleaned)
return cleaned.strip()
资料来源:src/memsearch/chunker.py:1-30
文件扫描器(Scanner)
scan_paths() 函数递归扫描指定路径,收集 Markdown 文件元数据(路径、修改时间、大小),并支持隐藏文件过滤。
@dataclass(frozen=True)
class ScannedFile:
"""Metadata for a discovered markdown file."""
path: Path
mtime: float
size: int
资料来源:src/memsearch/scanner.py:1-30
文件监控器(Watcher)
基于 watchdog 库实现,支持目录变化监控和防抖(debounce)处理:
| 参数 | 默认值 | 说明 |
|---|---|---|
debounce_ms | 1500 | 事件触发间隔(毫秒) |
| 扩展名过滤 | .md, .markdown | 监控文件类型 |
资料来源:src/memsearch/watcher.py:1-50
CLI 命令
memsearch CLI 提供以下核心命令:
| 命令 | 功能 |
|---|---|
memsearch index <paths> | 索引指定路径的 Markdown 文件 |
memsearch search <query> | 语义+关键词混合搜索 |
memsearch expand <chunk_hash> | 展开完整段落 |
memsearch watch <paths> | 监控文件变化并自动索引 |
memsearch config | 配置管理(init/set/get/list) |
memsearch stats | 显示索引统计信息 |
资料来源:src/memsearch/cli.py:1-50
检索流程
memsearch 采用三层渐进式搜索策略:
graph TD
A[用户提问] --> B[L1: memsearch search]
B --> C{需要更多细节?}
C -->|是| D[L2: memsearch expand]
D --> E{需要原始对话?}
E -->|是| F[L3: 解析 transcript]
C -->|否| G[返回排序结果]
E -->|否| G
F --> H[原始对话对话]
D --> G第一层:语义搜索
结合向量相似度和 BM25 关键词匹配,返回相关性排序的块列表。
第二层:段落展开
通过 chunk_hash 获取完整 Markdown 段落,可能包含会话锚点注释:
<!-- session:UUID turn:ID db:PATH -->
第三层:原始回溯
解析锚点指向的会话转录文件,返回原始对话记录(含工具调用)。
资料来源:README.md:90-110
配置选项
memsearch 支持丰富的配置项,主要分为以下类别:
嵌入模型配置
| 配置项 | 默认值 | 说明 |
|---|---|---|
embedding.provider | onnx | 嵌入提供者(onnx/openai) |
embedding.model | bge-m3 | 模型名称 |
Milvus 后端配置
| 配置项 | 默认值 | 说明 |
|---|---|---|
milvus.uri | milvus_lite.db | Milvus 服务器地址 |
milvus.token | - | 认证令牌 |
插件配置
各插件支持独立的摘要模型配置:
# 使用原生摘要模型
memsearch config set plugins.codex.summarize.provider native
# 使用外部 LLM 提供者
memsearch config set plugins.codex.summarize.provider openai
memsearch config set plugins.codex.summarize.model gpt-4o-mini
资料来源:plugins/codex/README.md:1-40
已知限制与社区问题
已识别的技术债务
| Issue | 影响范围 | 状态 |
|---|---|---|
| CLI 搜索在 Milvus Lite 中 collection 未加载 | #540 | 需手动调用 load() |
| 索引进程内存泄漏(约 9MB/块) | #533 | 单进程大批量索引时 OOM |
stats 命令在配置文件中设置 collection 时显示 0 | #538 | 需显式传递 -c 参数 |
| Milvus 2.5+ 远程模式写入未 flush | #534 | upsert 后数据不可查询 |
社区功能请求
- 全局/个人记忆(#337):在项目级内存之外增加跨项目共享的个人知识库
- 自动记忆精炼(#523):防止文档腐烂,将流水账式日记转化为结构化知识
资料来源:README.md:120-140
快速开始
安装
# 通过 uv 安装
uv tool install memsearch
# 或通过 pip 安装
pip install memsearch
初始化
# 全局配置
memsearch config init
# 项目级配置
memsearch config init --project
基本使用
# 索引当前目录
memsearch index .
# 搜索记忆
memsearch search "上次如何解决 CORS 问题"
# 监控变化
memsearch watch ./memory ./docs
版本历史
| 版本 | 主要变更 |
|---|---|
| v0.4.6 | 改进记忆捕获摘要和诊断功能 |
| v0.4.2 | 修复超大行拆分问题、插件 SIGPIPE 防护 |
| v0.4.1 | 修复 MEMSEARCH_DIR 集合派生问题 |
资料来源:mkdocs.yml:1-10
资料来源:README.md:50-60
快速入门
memsearch 是一个面向 AI 编码代理的跨平台语义记忆系统,采用 Markdown 文件作为数据源,通过 Milvus 向量数据库提供语义搜索能力。本指南将帮助用户在 5 分钟内完成安装、配置和基础使用。
继续阅读本节完整说明和来源证据。
继续阅读本节完整说明和来源证据。
继续阅读本节完整说明和来源证据。
继续阅读本节完整说明和来源证据。
系统要求
| 组件 | 要求 |
|---|---|
| Python | ≥ 3.10 |
| 操作系统 | macOS、Linux、Windows |
| 存储 | 至少 500MB 可用空间(用于嵌入模型和 Milvus Lite) |
安装
通过 uv 安装(推荐)
uv tool install memsearch
通过 pip 安装
pip install memsearch
安装完成后,验证版本:
memsearch --version
资料来源:pyproject.toml
核心概念
架构概览
graph TD
subgraph 用户层
A[Markdown 文件] --> B[memsearch CLI]
B --> C[搜索结果]
end
subgraph 处理层
D[scanner.py 扫描文件] --> E[chunker.py 分块]
E --> F[嵌入模型生成向量]
end
subgraph 存储层
G[Milvus Lite .db 文件] --> H[向量索引]
G --> I[集合管理]
end
F --> Gmemsearch 的核心数据流:
- 扫描:
scanner.py递归扫描指定路径下的.md和.markdown文件 - 分块:
chunker.py按标题层级将文件切分为语义块 - 嵌入:使用 ONNX 本地模型(默认 bge-m3)或 OpenAI API 生成向量
- 索引:将分块内容及其向量存储到 Milvus 集合
资料来源:src/memsearch/scanner.py:1-50
分块机制
chunker.py 实现基于标题层级的智能分块:
- 支持
#到######六级标题作为分块边界 - 自动移除 HTML 注释(包含会话 UUID 和转录路径)
- 过滤无意义内容(如仅有标题无正文的章节)
- 可配置最大分块大小
_HEADING_RE = re.compile(r"^(#{1,6})\s+(.+)$", re.MULTILINE)
_HTML_COMMENT_RE = re.compile(r"<!--.*?-->", re.DOTALL)
资料来源:src/memsearch/chunker.py:1-30
交互式配置
首次使用前,运行配置向导:
memsearch config init
配置向导将依次询问:
| 配置项 | 说明 | 默认值 |
|---|---|---|
| 嵌入提供商 | 向量生成方式 | onnx(本地) |
| 嵌入模型 | 具体模型名称 | bge-m3 |
| Milvus URI | 数据库连接地址 | milvus_lite.db |
| 批处理大小 | 单次索引块数 | 100 |
项目级配置
在当前目录初始化项目级配置:
memsearch config init --project
项目级配置存储在 .memsearch/config.toml,自动以目录名为基础派生集合名称。
手动配置命令
# 设置单个配置项
memsearch config set embedding.provider openai
memsearch config set milvus.uri http://localhost:19530
# 查看当前配置
memsearch config list
# 获取特定配置
memsearch config get embedding.provider
资料来源:src/memsearch/cli.py:1-100
基础使用
索引操作
#### 索引当前目录
memsearch index .
该命令扫描当前目录及子目录中的所有 Markdown 文件,将内容分块并写入 Milvus。
#### 索引指定路径
memsearch index ./docs ./memory
#### 索引单个文件
memsearch index ./README.md
搜索操作
#### 语义搜索
memsearch search "如何配置嵌入模型"
返回与查询语义最相关的分块列表,按相关性排序。
#### 展开分块
获取分块的完整上下文:
memsearch expand <chunk_hash>
chunk_hash 来自搜索结果。
查看统计信息
memsearch stats
显示当前集合的索引块数量。
注意:如果集合名称仅在配置文件中设置,stats 命令可能显示 0 块。请显式使用 -c 参数指定集合。
文件监控
启动实时监控,自动增量索引变更:
memsearch watch . --debounce-ms 1500
监控器使用 watchdog 检测文件变化,经过指定延迟后触发增量索引。
sequenceDiagram
participant U as 用户
participant W as Watcher
participant M as Milvus
participant FS as 文件系统
U->>W: memsearch watch .
W->>FS: 监控目录变化
U->>FS: 修改 memory/2026-03-27.md
FS->>W: 文件变更事件
W->>W: 延迟 1500ms
W->>M: 增量索引变更资料来源:src/memsearch/watcher.py:1-60
插件集成
memsearch 提供针对主流 AI 编码代理的插件支持:
| 插件 | 支持的代理 |
|---|---|
| claude-code | Claude Code |
| codex | OpenAI Codex |
| opencode | OpenCode |
| openclaw | OpenClaw |
Claude Code 插件
Claude Code 插件在每次会话结束时自动捕获记忆摘要:
graph LR
A[用户提问] --> B[Agent 响应]
B --> C[Stop Hook 触发]
C --> D[解析最后对话轮次]
D --> E[LLM 摘要 haiku]
E --> F[追加到 memory/日期.md]
F --> G[memsearch index]插件使用会话锚点标记记忆位置,支持后续精确召回原始对话。
安装后需要重启 Claude Code 会话以加载新状态。
资料来源:README.md
配置摘要模型
插件的摘要模型可独立配置:
# 使用 Codex 原生摘要模型
memsearch config set plugins.codex.summarize.model gpt-5.1-codex-mini
# 使用 OpenAI 模型
memsearch config set plugins.codex.summarize.provider openai
memsearch config set plugins.codex.summarize.model gpt-5-mini
常见问题
Milvus Lite 集合状态问题
使用 Milvus Lite(本地 .db 文件)时,memsearch search 可能失败并提示集合处于 released 状态:
pymilvus.exceptions.MilvusException: Collection 'xxx' is in state 'released'
解决方案:启动 memsearch watch 进程保持集合加载状态,或使用远程 Milvus 服务器。
索引内存泄漏
使用 ONNX 提供商索引大型语料库时,可能出现内存线性增长。每个分块约消耗 9MB 内存。建议对大型语料库分批处理或重启进程。
配置优先级
命令行参数 > 项目配置(.memsearch/config.toml)> 全局配置(~/.memsearch/config.toml)
下一步
| 任务 | 文档链接 |
|---|---|
| 深入配置选项 | Configuration |
| CLI 完整参考 | CLI Reference |
| Python API 使用 | Python API |
| 插件详情 | Claude Code Plugin |
| 故障排除 | Troubleshooting |
核心文件速查
| 文件 | 职责 |
|---|---|
src/memsearch/__init__.py | 入口,导出 MemSearch 类 |
src/memsearch/cli.py | CLI 命令实现 |
src/memsearch/scanner.py | 文件扫描和元数据收集 |
src/memsearch/chunker.py | Markdown 分块逻辑 |
src/memsearch/watcher.py | 目录监控和增量索引 |
资料来源:pyproject.toml
系统架构
MemSearch 是一个跨平台的语义记忆系统,专为 AI 编码代理设计,采用 Markdown 文件作为核心存储,Milvus 作为可重建的向量索引后端。项目仓库位于 zilliztech/memsearch。
继续阅读本节完整说明和来源证据。
继续阅读本节完整说明和来源证据。
继续阅读本节完整说明和来源证据。
继续阅读本节完整说明和来源证据。
概述
MemSearch 是一个跨平台的语义记忆系统,专为 AI 编码代理设计,采用 Markdown 文件作为核心存储,Milvus 作为可重建的向量索引后端。项目仓库位于 zilliztech/memsearch。
核心设计理念:Markdown 是唯一的事实来源(Source of Truth),Milvus 仅作为可重建的影子索引存在。当 Milvus 数据丢失时,可通过重新索引 Markdown 文件完整恢复所有数据。
资料来源:docs/architecture.md
核心架构分层
MemSearch 采用清晰的分层架构,从下到上依次为:
subgraph 插件层["插件层 (Plugins)"]
A1[Claude Code 插件]
A2[Codex 插件]
A3[OpenClaw 插件]
A4[OpenCode 插件]
end
subgraph CLI_API层["CLI / Python API 层"]
B1[memsearch CLI 命令]
B2[MemSearch Python 类]
end
subgraph 核心功能层["核心功能层 (src/memsearch/)"]
C1[core.py - 核心编排]
C2[chunker.py - Markdown 分块]
C3[scanner.py - 文件扫描]
C4[watcher.py - 文件监控]
end
subgraph 存储层["存储层 (Storage)"]
D1[Markdown 文件系统]
D2[Milvus 向量数据库]
end
subgraph 向量模型层["向量模型层"]
E1[ONNX (bge-m3)]
E2[OpenAI Embeddings]
end
A1 --> B1
A2 --> B1
A3 --> B1
A4 --> B1
B1 <--> B2
B2 --> C1
C1 --> C2
C1 --> C3
C1 --> C4
C2 --> D1
C3 --> D1
C4 --> D1
C2 --> E1
C2 --> E2
C2 --> D2
资料来源:docs/architecture.md
核心模块详解
核心编排 (core.py)
MemSearch 类是系统的核心编排器,负责协调文件扫描、分块、嵌入生成和 Milvus 存储操作。
| 模块 | 职责 | 关键方法 |
|---|---|---|
MemSearch.__init__ | 初始化,解析配置 | 接收路径列表、embedding 配置、Milvus 配置 |
index() | 协程方法,扫描并索引文件 | 使用 scan_paths() 发现文件,_index_file() 处理单个文件 |
search() | 语义 + 关键词混合搜索 | 调用 Milvus 向量搜索和 BM25 混合排序 |
expand() | 展开块哈希获取完整上下文 | 根据 chunk_hash 检索完整 markdown 段落 |
watch() | 启动文件监控守护进程 | 使用 watchdog 监听文件系统变化 |
get_stats() | 获取索引统计信息 | 返回集合的块数量等元数据 |
Markdown 分块 (chunker.py)
chunker.py 负责将 Markdown 文件语义化拆分为可索引的块。
核心流程:
A[Markdown 文件] --> B[按标题层级解析]
B --> C{标题级别变化?}
C -->|是| D[创建新块]
C -->|否| E[追加到当前块]
D --> F{块大小超限?}
E --> F
F -->|是| G[拆分块]
F -->|否| H[验证内容质量]
G --> H
H --> I{内容有意义?}
I -->|否| J[丢弃块]
I -->|是| K[生成块哈希]
K --> L[准备索引]
关键函数:
| 函数 | 用途 |
|---|---|
clean_content_for_embedding() | 清理 HTML 注释等噪声,生成嵌入向量时使用 |
_has_meaningful_content() | 验证块内容是否满足最小有意义长度(_MIN_MEANINGFUL_LEN = 2) |
_HEADING_RE | 正则表达式匹配 1-6 级标题 |
_HTML_COMMENT_RE | 正则表达式匹配 HTML 注释 <!-- ... --> |
文件扫描 (scanner.py)
scanner.py 实现多路径递归扫描,发现需要索引的 Markdown 文件。
@dataclass(frozen=True)
class ScannedFile:
"""发现的 Markdown 文件元数据"""
path: Path
mtime: float # 修改时间
size: int # 文件大小
扫描特性:
- 支持目录递归遍历
- 可配置扩展名过滤(默认
.md、.markdown) - 可选忽略隐藏文件/目录(以
.开头) - 基于路径的去重机制
文件监控 (watcher.py)
使用 watchdog 库实现文件系统监控,支持增量索引更新。
| 参数 | 默认值 | 说明 |
|---|---|---|
debounce_ms | 1500 | 事件防抖延迟(毫秒) |
extensions | (".md", ".markdown") | 监听的文件扩展名 |
class _MarkdownHandler(FileSystemEventHandler):
"""调度 Markdown 文件事件到回调函数,带防抖机制"""
工作原理:
- 监听文件系统的
created、modified、deleted事件 - 对同一文件的连续事件进行防抖合并
- 触发回调时携带事件类型和文件路径
数据流架构
索引流程
A[文件扫描] --> B[文件读取]
B --> C[Markdown 解析]
C --> D[语义分块]
D --> E[内容清理]
E --> F[嵌入生成]
F --> G[块哈希计算]
G --> H[Milvus 存储]
H --> I[Markdown 源文件]
搜索流程
A[用户查询] --> B[查询嵌入]
B --> C[Milvus 向量搜索]
A --> D[BM25 关键词匹配]
C --> E[混合排序]
D --> E
E --> F[结果排名]
F --> G[返回 chunk_hash]
资料来源:docs/architecture.md
存储模型
Markdown 文件组织
.memsearch/
└── memory/
└── YYYY-MM-DD.md # 按日期组织的记忆文件
每个记忆文件包含带锚点注释的会话记录:
## Session 14:32
- User asked about X
- Claude did Y
<!-- session:UUID db:PATH -->
Milvus 集合结构
| 字段 | 类型 | 说明 |
|---|---|---|
chunk_hash | VARCHAR (主键) | 块的唯一标识符 |
content | VARCHAR | 块的实际文本内容 |
embedding | FLOAT_VECTOR | BGE-M3 向量嵌入 |
file_path | VARCHAR | 源文件路径 |
headings | VARCHAR | 标题层级结构 |
集合名称通过项目目录名派生,格式为 ms_<项目标识>。
向量模型层
| 提供商 | 模型 | 特点 |
|---|---|---|
| ONNX (默认) | bge-m3 | 本地运行,无需 API Key |
| OpenAI | text-embedding-3-* | 云端服务,需 API Key |
# 切换到 OpenAI 嵌入
memsearch config set embedding.provider openai
# 切换回本地 ONNX
memsearch config set embedding.provider onnx
CLI 命令体系
| 命令 | 功能 |
|---|---|
memsearch index | 扫描并索引指定路径的 Markdown 文件 |
memsearch search | 语义搜索匹配的块 |
memsearch expand | 根据 chunk_hash 展开完整段落 |
memsearch watch | 监听文件系统变化,实时增量索引 |
memsearch stats | 显示集合统计信息 |
memsearch config | 配置管理(init/set/get/list) |
资料来源:src/memsearch/cli.py
插件架构
通用插件结构
subgraph 插件类型["插件类型"]
P1[Claude Code]
P2[Codex]
P3[OpenClaw]
P4[OpenCode]
end
subgraph 组件["每个插件包含"]
C1[Stop Hook - 会话总结]
C2[Start Hook - 会话开始]
C3[Memory Tools - 搜索/展开/对话]
C4[Skills - 配置引导]
C5[Prompts - 项目回顾模板]
end
P1 --> C1
P1 --> C2
P1 --> C3
P1 --> C4
P1 --> C5
捕获流程(以 Claude Code 为例)
用户提问 → Agent 响应 → Stop Hook 触发
│
┌────────────────┴────────────────┐
▼
解析最后对话轮次
│
LLM 总结 (haiku 模型)
"- User asked about X."
"- Claude did Y."
│
追加到 memory/YYYY-MM-DD.md
(带 <!-- session:UUID --> 锚点)
│
memsearch index → Milvus
三层召回机制
| 层级 | 操作 | 返回内容 |
|---|---|---|
| L1 | memsearch search | 排名最高的语义块列表 |
| L2 | memsearch expand <hash> | 完整 Markdown 段落 |
| L3 | 解析 transcript | 原始对话 JSONL |
资料来源:README.md
配置系统
配置层级
graph TD
A[默认配置] --> B[全局配置 ~/.memsearch/config.toml]
B --> C[项目配置 ./.memsearch/config.toml]
C --> D[CLI 参数覆盖]关键配置项
| 配置路径 | 类型 | 默认值 | 说明 |
|---|---|---|---|
embedding.provider | string | onnx | 向量嵌入提供商 |
embedding.model | string | bge-m3 | 嵌入模型名称 |
milvus.uri | string | 本地 .db | Milvus 服务器地址 |
milvus.token | string | - | Milvus 认证令牌 |
collection | string | 自动派生 | 集合名称 |
watch.debounce_ms | int | 1500 | 文件监控防抖延迟 |
plugins.*.summarize.* | - | - | 各插件的总结模型配置 |
资料来源:src/memsearch/cli.py
已知限制与社区问题
| 问题 | 严重程度 | 说明 |
|---|---|---|
| Issue #540 | 高 | Milvus Lite 搜索时集合处于 'released' 状态 |
| Issue #533 | 高 | ONNX 提供商索引时内存泄漏(约 9MB/块) |
| Issue #534 | 中 | Milvus 2.5+ 远程写入不持久化(缺少 flush) |
| Issue #539 | 中 | 批量 upsert 中重复主键错误 |
| Issue #102 | 低 | CJK 语言分词和 Markdown 解析需增强 |
资料来源:社区问题追踪
扩展阅读
- 设计理念 - 深入了解项目的核心设计决策
- Python API - MemSearch 类的详细 API 参考
- CLI 参考 - 命令行工具完整文档
- 平台对比 - 各代理插件的功能对比
资料来源:docs/architecture.md
核心模块详解
memsearch 是一个跨平台的语义记忆搜索系统,专为 AI 编程代理设计,采用 Markdown 文件作为数据源,Milvus 作为向量检索后端。系统采用分层架构,底层是 CLI/API 核心层,上层是插件生态层。
继续阅读本节完整说明和来源证据。
继续阅读本节完整说明和来源证据。
继续阅读本节完整说明和来源证据。
继续阅读本节完整说明和来源证据。
概述
memsearch 是一个跨平台的语义记忆搜索系统,专为 AI 编程代理设计,采用 Markdown 文件作为数据源,Milvus 作为向量检索后端。系统采用分层架构,底层是 CLI/API 核心层,上层是插件生态层。
graph TB
subgraph 插件层
CLAUDE[Claude Code 插件]
CODEX[Codex 插件]
OPENCLAW[OpenClaw 插件]
OPENCODE[OpenCode 插件]
end
subgraph 核心层
CLI[CLI 模块]
CORE[MemSearch 核心类]
CONFIG[配置管理]
end
subgraph 索引层
SCANNER[文件扫描器]
CHUNKER[Markdown 分块器]
WATCHER[文件监视器]
end
subgraph 存储层
MILVUS[Milvus Store]
MARKDOWN[Markdown 文件]
end
CLAUDE --> CLI
CODEX --> CLI
OPENCLAW --> CLI
OPENCODE --> CLI
CLI --> CORE
CORE --> CONFIG
CORE --> SCANNER
CORE --> CHUNKER
CORE --> WATCHER
SCANNER --> MARKDOWN
CHUNKER --> MILVUS
WATCHER --> MARKDOWNMemSearch 核心类
类定义与职责
MemSearch 是整个系统的核心入口类,封装了索引、搜索、配置等核心功能:
"""memsearch — semantic memory search for markdown knowledge bases."""
from .core import MemSearch
__all__ = ["MemSearch"]
资料来源:src/memsearch/__init__.py:1-5
核心类提供了统一的 API 接口,负责:
- 加载和合并配置(全局配置 + 项目配置)
- 管理 Milvus 集合的生命周期
- 协调扫描、分块、嵌入、存储等流程
- 提供搜索和查询接口
配置管理架构
memsearch 采用多层配置合并策略:
graph LR
GLOBAL[全局配置<br/>~/.memsearch/config.toml] --> MERGE[配置合并]
PROJECT[项目配置<br/>.memsearch/config.toml] --> MERGE
ENV[环境变量] --> MERGE
MERGE --> FINAL[最终配置]
FINAL --> CORE[MemSearch 实例]配置系统支持以下配置项:
| 配置分类 | 键路径 | 说明 |
|---|---|---|
| Milvus | milvus.uri | Milvus 服务器地址 |
| Milvus | milvus.token | 认证令牌 |
| 嵌入 | embedding.provider | 嵌入提供者 (onnx/openai/google 等) |
| 嵌入 | embedding.model | 嵌入模型名称 |
| LLM | llm.providers.*.type | LLM 提供者类型 |
| LLM | llm.providers.*.model | LLM 模型名称 |
| 插件 | plugins.*.summarize.* | 插件摘要配置 |
文件扫描器 (Scanner)
功能定位
scanner.py 模块负责递归扫描指定路径,收集 Markdown 文件元数据:
@dataclass(frozen=True)
class ScannedFile:
"""Metadata for a discovered markdown file."""
path: Path
mtime: float
size: int
资料来源:src/memsearch/scanner.py:10-14
扫描函数签名
def scan_paths(
paths: list[str | Path],
*,
extensions: tuple[str, ...] = (".md", ".markdown"),
ignore_hidden: bool = True,
) -> list[ScannedFile]:
| 参数 | 类型 | 默认值 | 说明 | |
|---|---|---|---|---|
paths | `list[str | Path]` | - | 要扫描的文件或目录列表 |
extensions | tuple[str, ...] | (".md", ".markdown") | 目标文件扩展名 | |
ignore_hidden | bool | True | 是否忽略隐藏文件/目录 |
扫描流程
graph TD
START[scan_paths 调用] --> FOR_LOOP[遍历 paths 列表]
FOR_LOOP --> IS_DIR{根路径是<br/>目录?}
IS_DIR -->|是| WALK[os.walk 递归遍历|
IS_DIR -->|否| IS_FILE{是文件?}
IS_FILE -->|是| CHECK_EXT{扩展名匹配?}
CHECK_EXT -->|是| ADD[添加到结果列表]
CHECK_EXT -->|否| SKIP[跳过]
WALK --> CHECK_HIDDEN{忽略隐藏?}
CHECK_HIDDEN -->|是| FILTER_DIRS[过滤隐藏目录]
CHECK_HIDDEN -->|否| KEEP_ALL[保持原样]
FILTER_DIRS --> FOR_FILES[遍历目录文件]
FOR_FILES --> CHECK_HIDDEN_FILES{忽略隐藏文件?}
CHECK_HIDDEN_FILES -->|是| FILTER_FILES[过滤隐藏文件]
CHECK_HIDDEN_FILES -->|否| CHECK_EXT2[检查扩展名]
FILTER_FILES --> CHECK_EXT3[检查扩展名]
CHECK_EXT2 --> ADD2[添加到结果]
CHECK_EXT3 --> ADD3[添加到结果]
ADD --> SORT[按路径排序]
ADD2 --> SORT
ADD3 --> SORT
SKIP --> END{遍历完成?}
SORT --> END
END --> RETURN[返回结果列表]关键特性:
- 使用
seen集合进行去重,防止同一文件被多次添加 - 支持自定义扩展名过滤
- 可选择性忽略
.开头的隐藏文件/目录 - 按文件路径排序返回结果
Markdown 分块器 (Chunker)
功能定位
chunker.py 模块负责将 Markdown 文件按语义结构拆分为可索引的分块:
"""Markdown chunking — split markdown files into semantic chunks by headings."""
资料来源:src/memsearch/chunker.py:1-2
核心正则表达式
| 模式 | 正则 | 用途 |
|---|---|---|
| 标题匹配 | r"^(#{1,6})\s+(.+)$" | 按 Markdown 标题层级拆分 |
| HTML 注释 | r"<!--.*?-->" | 清理元数据噪声 |
内容清洗
def clean_content_for_embedding(text: str) -> str:
"""Strip metadata noise from chunk content before embedding.
Removes HTML comments (<!-- ... -->), which often contain session/turn
UUIDs and transcript paths that dilute embedding quality. The original
content stored in Milvus is unchanged — this only affects the text
sent to the embedding model.
"""
cleaned = _HTML_COMMENT_RE.sub("", text)
# Collapse runs of blank lines left behind by removed comments
cleaned = re.sub(r"\n{3,}", "\n\n", cleaned)
return cleaned.strip()
资料来源:src/memsearch/chunker.py:15-24
内容质量过滤
_MIN_MEANINGFUL_LEN = 2
def _has_meaningful_content(text: str) -> bool:
"""Return True if *text* has enough substance to be worth indexing."""
资料来源:src/memsearch/chunker.py:10-11
系统会丢弃符合以下条件的分块:
- 仅包含标题无正文内容
- HTML 注释、标题行、空白字符剥离后剩余长度不足 2 字符
- 无实质语义内容
分块策略
graph LR
MD[Markdown 文件] --> PARSE[解析标题结构]
PARSE --> TREE[构建嵌套树]
TREE --> SPLIT[按 H1-H6 层级拆分]
SPLIT --> FILTER[过滤无意义分块]
FILTER --> CLEAN[清理 HTML 注释]
CLEAN --> CHUNKS[语义分块列表]文件监视器 (Watcher)
功能定位
watcher.py 模块使用 watchdog 库监控文件系统变化,实现增量索引:
"""File watcher — monitors directories for markdown changes using watchdog."""
资料来源:src/memsearch/watcher.py:1-2
核心类设计
class _MarkdownHandler(FileSystemEventHandler):
"""Dispatch markdown file events to a callback with debounce."""
def __init__(
self,
callback: Callable[[str, Path], None],
extensions: tuple[str, ...] = (".md", ".markdown"),
debounce_ms: int = DEFAULT_DEBOUNCE_MS,
) -> None:
| 参数 | 类型 | 说明 |
|---|---|---|
callback | Callable[[str, Path], None] | 文件变化时的回调函数 |
extensions | tuple[str, ...] | 监控的文件扩展名 |
debounce_ms | int | 防抖延迟(毫秒) |
防抖机制
sequenceDiagram
participant FS as 文件系统事件
participant WH as WatchHandler
participant Timer as 定时器
participant CB as 回调函数
FS->>WH: on_modified(file.md)
WH->>Timer: 创建/重置 Timer
Note over Timer: 等待 debounce_ms
Timer->>CB: 触发回调
Note over CB: 处理文件变化默认防抖延迟为 1500ms,用于:
- 避免同一文件的连续修改触发多次处理
- 等待文件写入完成后再处理
线程安全
self._timers: dict[str, threading.Timer] = {}
self._pending: dict[str, str] = {} # path -> latest event_type
self._lock = threading.Lock()
使用 threading.Lock 保护共享状态,防止竞态条件。
CLI 模块
命令行接口结构
cli.py 模块提供完整的命令行界面,支持交互式配置初始化:
# 交互式配置示例
result["plugins"]["claude-code"]["summarize"]["enabled"] = click.confirm(
" Claude Code summarization enabled",
default=current.plugins.claude_code.summarize.enabled,
)
result["plugins"]["codex"]["summarize"]["provider"] = click.prompt(
" Codex summarize provider",
default=current.plugins.codex.summarize.provider,
)
主要命令
| 命令 | 功能 |
|---|---|
memsearch search | 语义搜索记忆 |
memsearch expand | 展开分块上下文 |
memsearch index | 索引文件到 Milvus |
memsearch stats | 查看索引统计 |
memsearch config init | 初始化配置 |
memsearch config set/get/list | 配置管理 |
配置项详情
系统支持对各平台插件的摘要模型进行独立配置:
| 插件 | 配置键 | 类型 | 说明 |
|---|---|---|---|
| Claude Code | plugins.claude-code.summarize.model | string | 摘要模型 |
| Claude Code | plugins.claude-code.summarize.provider | string | 摘要提供者 |
| Codex | plugins.codex.summarize.model | string | 摘要模型 |
| Codex | plugins.codex.summarize.provider | string | 摘要提供者 |
| OpenClaw | plugins.openclaw.summarize.model | string | 摘要模型 |
| OpenClaw | plugins.openclaw.summarize.enabled | bool | 是否启用 |
数据模型
ScannedFile 数据类
@dataclass(frozen=True)
class ScannedFile:
"""Metadata for a discovered markdown file."""
path: Path # 文件绝对路径
mtime: float # 修改时间戳
size: int # 文件大小(字节)
配置数据模型
| 字段 | 说明 |
|---|---|
milvus.uri | Milvus 服务器地址 |
milvus.token | 认证令牌 |
embedding.provider | 嵌入提供者 |
embedding.model | 嵌入模型 |
collection.name | 集合名称 |
已知问题与限制
根据社区反馈,以下问题值得关注:
内存泄漏问题
Issue #533 报告使用 ONNX 提供者索引时存在内存泄漏,每分块约消耗 9MB 内存,在 15GB 内存主机上会导致 OOM。
Milvus Lite 集合状态
Issue #540 报告在非活跃会话中使用 Milvus Lite 时,memsearch search 可能因集合处于 "released" 状态而失败,需要手动调用 load()。
重复主键
Issue #539 报告批量索引时可能出现 "duplicate primary keys" 错误。
配置继承
Issue #538 报告 memsearch stats 在仅设置配置文件中的 collection name 时显示 0 分块,需显式传递 -c 参数。
模块依赖关系
graph TD
INIT["__init__.py<br/>MemSearch 导出"]
CORE["core.py<br/>MemSearch 核心类"]
CONFIG["config.py<br/>配置管理"]
SCANNER["scanner.py<br/>文件扫描"]
CHUNKER["chunker.py<br/>Markdown 分块"]
WATCHER["watcher.py<br/>文件监视"]
CLI["cli.py<br/>命令行界面"]
STORE["store.py<br/>Milvus 存储"]
INIT --> CORE
CORE --> CONFIG
CORE --> SCANNER
CORE --> CHUNKER
CORE --> WATCHER
CORE --> STORE
CLI --> CORE扩展指南
添加新的嵌入提供者
自定义分块策略
修改 chunker.py 中的分块逻辑:
- 调整
_HEADING_RE正则以改变标题层级 - 修改
_MIN_MEANINGFUL_LEN以过滤不同长度阈值 - 在
clean_content_for_embedding中添加额外的清洗规则
文本分块与索引机制
memsearch 的文本分块与索引机制是实现语义记忆搜索的核心基础设施。它负责将 Markdown 文件分割为语义完整的块(chunk),生成向量嵌入,并同步存储到 Milvus 向量数据库中。整个流程遵循"Markdown 即真相来源"的设计原则——Milvus 仅作为可重建的影子索引。
继续阅读本节完整说明和来源证据。
继续阅读本节完整说明和来源证据。
继续阅读本节完整说明和来源证据。
继续阅读本节完整说明和来源证据。
核心架构概览
graph TD
A[Markdown 文件] --> B[scanner.py 扫描文件]
B --> C[chunker.py 按标题分块]
C --> D[clean_content_for_embedding 清洗内容]
D --> E[生成向量嵌入]
E --> F[MilvusStore 写入 Milvus]
F --> G[向量数据库索引]
H[搜索请求] --> I[向量检索 + BM25 混合搜索]
I --> J[返回排序结果]文件扫描模块
ScannedFile 数据结构
文件扫描由 scanner.py 中的 ScannedFile 数据类定义元数据:
@dataclass(frozen=True)
class ScannedFile:
path: Path
mtime: float
size: int
scan_paths 扫描函数
scan_paths() 函数支持多路径递归扫描,核心参数如下:
| 参数 | 类型 | 默认值 | 说明 | |
|---|---|---|---|---|
| paths | list[str \ | Path] | - | 要扫描的文件或目录列表 |
| extensions | tuple[str, ...] | (".md", ".markdown") | 目标文件扩展名 | |
| ignore_hidden | bool | True | 是否忽略隐藏文件/目录 |
关键行为:
- 支持文件和目录混合输入
- 目录递归遍历时自动过滤以
.开头的隐藏文件/目录 - 通过
seen集合实现去重,避免同一文件被多次处理 - 结果按文件路径排序返回
def scan_paths(
paths: list[str | Path],
*,
extensions: tuple[str, ...] = (".md", ".markdown"),
ignore_hidden: bool = True,
) -> list[ScannedFile]:
资料来源:src/memsearch/scanner.py:12-47
Markdown 分块机制
分块策略
chunker.py 实现基于标题层级的语义分块,使用正则表达式识别 Markdown 标题:
_HEADING_RE = re.compile(r"^(#{1,6})\s+(.+)$", re.MULTILINE)
分块逻辑遵循以下原则:
- 按标题层级切分:每个 H1-H6 标题下方的内容成为一个独立的语义块
- 保留层级结构:包含标题本身的文本片段作为块的起始内容
- 过滤无意义内容:标题后无实际内容的空块被丢弃
内容清洗与过滤
#### clean_content_for_embedding 函数
在生成向量嵌入前,内容需要经过清洗以提高嵌入质量:
def clean_content_for_embedding(text: str) -> str:
"""Strip metadata noise from chunk content before embedding."""
cleaned = _HTML_COMMENT_RE.sub("", text)
cleaned = re.sub(r"\n{3,}", "\n\n", cleaned)
return cleaned.strip()
清洗步骤:
| 步骤 | 操作 | 目的 |
|---|---|---|
| 1 | 移除 HTML 注释 <!-- ... --> | 去除会话/轮次 UUID 和转录路径等噪声 |
| 2 | 折叠连续空行 | 规范化格式,减少嵌入噪声 |
| 3 | 首尾空白清理 | 确保内容一致性 |
注意:此函数仅影响发送给嵌入模型的内容,存储在 Milvus 中的原始内容不受影响。
#### _has_meaningful_content 函数
分块前会验证内容是否有足够的信息量:
_MIN_MEANINGFUL_LEN = 2
def _has_meaningful_content(text: str) -> bool:
"""Return True if text has enough substance to be worth indexing."""
stripped = _HTML_COMMENT_RE.sub("", text)
# ... further processing
判断标准:
- 移除 HTML 注释后
- 过滤标题行和空白
- 剩余正文长度需超过
_MIN_MEANINGFUL_LEN(默认 2 字符)
例如:
## Session 03:16→ 标题后无正文 → 拒绝## Title\nSome real content→ 有实际内容 → 保留
分块数据流
flowchart LR
A[原始 Markdown] --> B[解析标题层级]
B --> C{内容有意义?}
C -->|是| D[生成 Chunk 对象]
C -->|否| E[丢弃]
D --> F[clean_content_for_embedding]
F --> G[生成向量嵌入]
G --> H[Upsert 到 Milvus]索引存储机制
MilvusStore 数据存储
索引数据通过 MilvusStore 类管理,关键字段包括:
| 字段 | 类型 | 说明 |
|---|---|---|
| collection_name | str | Milvus 集合名称 |
| primary_field | str | 主键字段(chunk_hash) |
| vector_field | str | 向量字段 |
| text_field | str | 文本内容字段 |
向量生成与写入流程
- 文件扫描:递归发现
.md和.markdown文件 - 增量检测:基于
mtime字段判断文件是否变更 - 分块处理:按标题切分为语义块
- 内容清洗:移除 HTML 注释和噪声
- 向量生成:调用嵌入模型生成向量表示
- 批量写入:通过
upsert写入 Milvus
async def upsert(self, chunks: list[dict[str, Any]]) -> int:
"""Upsert chunks and return count of successfully indexed chunks."""
已知限制与社区问题
#### 内存泄漏问题(Issue #533)
大规模语料库索引时存在内存泄漏:
indexing a multi-MB markdown corpus with the ONNX provider walks anon-rss to ~11.5 GB and the kernel OOM-kills the process
现象:
- 每个 chunk 约泄漏 9 MB anon-rss
- 单进程内内存线性增长
- 进程重启后内存正常释放
#### 重复主键错误(Issue #539)
同一批次内不允许重复的主键:
duplicate primary keys are not allowed in the same batch: invalid parameter
当索引过程中同一文件被多次扫描或 chunk hash 冲突时触发。
#### 写入持久性问题(Issue #534)
远程 Milvus 2.5+ 的写入可能未真正持久化:
MilvusStore.upsert() reports success but writes are not durable on remote Milvus 2.5+
upsert 返回成功计数,但底层写入可能未真正持久化到 Milvus。
维护与压缩
compact_chunks 压缩机制
compact.py 提供了 LLM 驱动的块压缩功能:
async def compact_chunks(
chunks: list[dict[str, Any]],
*,
llm_provider: str = "openai",
model: str | None = None,
prompt_template: str | None = None,
base_url: str | None = None,
api_key: str | None = None,
) -> str:
支持的 LLM 提供商:
| 提供商 | 环境变量 |
|---|---|
| OpenAI | OPENAI_API_KEY / OPENAI_BASE_URL |
| Anthropic | ANTHROPIC_API_KEY |
| Gemini | GOOGLE_API_KEY |
默认压缩提示词:
You are a knowledge compression assistant. Given the following chunks of text \
from a knowledge base, create a concise but comprehensive summary that preserves \
all key facts, decisions, code patterns, and actionable insights.
compaction 状态标记
压缩前的转录内容可能在压缩后丢失(Issue #537):
Pre-compaction transcript not captured by Stop hook?
Stop 钩子的 parse-transcript.sh 在压缩完成后运行,导致压缩前的转录被 isCompactSummary 标记替代,原始对话细节丢失。
配置与调优
CLI 索引选项
memsearch index <paths> [options]
| 选项 | 说明 |
|---|---|
--provider, -p | 嵌入提供者 |
--model, -m | 覆盖嵌入模型 |
--batch-size | 嵌入批处理大小(0 = 提供商默认) |
--collection, -c | Milvus 集合名称 |
--milvus-uri | Milvus 连接 URI |
--max-chunk-size | 最大块大小限制 |
watch 模式
持续监控文件变更并自动重索引:
memsearch watch <paths> --debounce-ms 5000
变更检测基于 ScannedFile 中的 mtime 字段,实现增量更新。
故障排查
| 问题 | 可能原因 | 解决方案 |
|---|---|---|
| 搜索返回 0 结果 | 集合处于 released 状态 | 运行 memsearch index 重新加载 |
memsearch stats 显示 0 chunks | 集合名称未正确解析 | 显式传递 -c 参数 |
| 内存持续增长 | ONNX 嵌入提供者内存泄漏 | 分批处理或进程复用 |
| 写入失败但报告成功 | Milvus 未执行 flush | 检查 Milvus 服务状态 |
相关文档
- memsearch 架构 - 系统整体架构
- 配置指南 - 嵌入和 Milvus 配置
- 故障排查 - 常见问题解决方案
- 插件系统 - Claude Code 等平台的集成
检索算法实现
MemSearch 的检索系统是一个混合检索引擎,结合了向量语义搜索和关键词 BM25 搜索,以提供高质量的语义记忆召回能力。系统以 Markdown 文件为数据源,通过语义分块将内容切分为可索引的 chunk,然后存储到 Milvus 向量数据库中进行高效检索。
继续阅读本节完整说明和来源证据。
继续阅读本节完整说明和来源证据。
继续阅读本节完整说明和来源证据。
继续阅读本节完整说明和来源证据。
概述
MemSearch 的检索系统是一个混合检索引擎,结合了向量语义搜索和关键词 BM25 搜索,以提供高质量的语义记忆召回能力。系统以 Markdown 文件为数据源,通过语义分块将内容切分为可索引的 chunk,然后存储到 Milvus 向量数据库中进行高效检索。
检索流程遵循三层递进架构:L1 语义检索获取候选 chunk,L2 展开完整段落,L3 解析原始会话转录。资料来源:README.md
核心检索流程
搜索执行流程
用户查询 → 查询向量生成 → 混合检索 → 重排序 → 结果返回
MemSearch 支持两种后端模式:
| 后端类型 | 配置方式 | 适用场景 |
|---|---|---|
| Milvus Lite | 默认本地 .db 文件 | 单机、离线、个人使用 |
| 远程 Milvus | milvus.uri 配置 | 团队共享、大规模数据 |
已知限制:当使用 Milvus Lite 时,collection 默认处于 released 状态,需调用 load() 后才能执行搜索/查询操作。CLI search 在非活跃会话/watch 进程外执行时会失败。资料来源:社区 issue #540
配置文件解析流程
检索系统依赖配置解析来确定 collection 名称和连接参数:
def _safe_resolve_config(overrides: dict[str, Any] | None) -> Config:
"""解析配置,优先使用命令行覆盖值"""
已知问题:当 collection 名称仅在配置文件中设置时,memsearch stats 可能报告 0 chunks,即使数据已成功索引。必须显式传递 -c 参数才能正确识别 collection。资料来源:社区 issue #538
数据模型与索引结构
Chunk 数据结构
@dataclass
class Chunk:
chunk_hash: str # 内容 SHA256 哈希
content: str # 原始 Markdown 内容
path: Path # 来源文件路径
mtime: float # 文件修改时间
start_line: int # 起始行号
end_line: int # 结束行号
分块算法
Markdown 分块器 (chunker.py) 负责将文档切分为语义连贯的块:
_HEADING_RE = re.compile(r"^(#{1,6})\s+(.+)$", re.MULTILINE)
_HTML_COMMENT_RE = re.compile(r"<!--.*?-->", re.DOTALL)
_MIN_MEANINGFUL_LEN = 2 # 最小有意义内容长度
关键处理逻辑:
- 标题识别:使用正则
^(#{1,6})\s+(.+)$匹配 1-6 级标题作为分块边界 - HTML 注释过滤:移除
<!-- ... -->注释块,防止会话 UUID 等噪声干扰嵌入质量 - 内容验证:
_has_meaningful_content()检查块是否有足够的实质内容
def clean_content_for_embedding(text: str) -> str:
"""为嵌入模型清理内容 - 移除元数据噪声"""
cleaned = _HTML_COMMENT_RE.sub("", text)
cleaned = re.sub(r"\n{3,}", "\n\n", cleaned)
return cleaned.strip()
资料来源:src/memsearch/chunker.py:1-45
嵌入向量生成
嵌入模块负责将文本 chunk 转换为高维向量:
| 组件 | 默认实现 | 备选方案 |
|---|---|---|
| 向量模型 | BGE-M3 (ONNX 本地运行) | OpenAI text-embedding-* |
| 维度 | 模型自动确定 | 可配置 |
| Token 限制 | 512 tokens | 可通过 max_chunk_size 调整 |
# 配置嵌入提供商
memsearch config set embedding.provider onnx # 本地默认
memsearch config set embedding.provider openai # 需要 OPENAI_API_KEY
文件扫描与索引
扫描器架构
@dataclass(frozen=True)
class ScannedFile:
path: Path # 文件路径
mtime: float # 修改时间
size: int # 文件大小
扫描策略:
- 递归遍历指定路径,收集
.md和.markdown文件 - 默认跳过隐藏文件/目录(以
.开头) - 支持多路径同时扫描
def scan_paths(
paths: list[str | Path],
*,
extensions: tuple[str, ...] = (".md", ".markdown"),
ignore_hidden: bool = True,
) -> list[ScannedFile]:
资料来源:src/memsearch/scanner.py:1-45
增量索引机制
MemSearch 支持增量索引,仅处理自上次索引后修改的文件:
| 策略 | 实现方式 |
|---|---|
| 基于 mtime | 比较文件修改时间,跳过未变化文件 |
| Watch 模式 | 实时监控文件变化,触发增量索引 |
| Debounce | 1500ms 防抖,防止频繁写入 |
class _MarkdownHandler(FileSystemEventHandler):
def __init__(self, callback, debounce_ms=1500):
self._debounce_s = debounce_ms / 1000.0
self._timers: dict[str, threading.Timer] = {}
资料来源:src/memsearch/watcher.py:1-45
向量存储与查询
MilvusStore 实现
MilvusStore 负责向量数据的持久化和查询:
class MilvusStore:
def upsert(self, chunks: list[Chunk]) -> int:
"""写入 chunks,返回成功数量"""
def search(self, query_vector: list[float], top_k: int) -> list[SearchResult]:
"""向量相似度搜索"""
def get_collection_stats(self) -> dict:
"""获取 collection 统计信息"""
已知问题:在远程 Milvus 2.5+ 环境中,upsert() 可能报告成功但数据未真正持久化,缺少 flush() 调用。memsearch index 报告的 chunk 数量可能与 get_collection_stats() 返回的 row_count 不一致。资料来源:社区 issue #534
搜索结果格式
@dataclass
class SearchResult:
chunk_hash: str # 用于 expand 命令的标识符
content: str # 匹配的 chunk 内容
score: float # 相似度分数
path: Path # 来源文件路径
start_line: int # 起始行
end_line: int # 结束行
CLI 检索命令
search 子命令
memsearch search <query> [options]
# 常用选项
-c, --collection # 指定 collection 名称
--limit # 返回结果数量(默认 10)
--output # 输出格式 (json/text)
expand 子命令
根据 search 返回的 chunk_hash 展开完整段落:
memsearch expand <chunk_hash> [options]
# 示例
memsearch expand abc123def456 --collection my_collection
三层递进检索模式
用户: "我们讨论过关于批处理大小的问题吗?"
│
▼
┌─────────────────────────────────────┐
│ L1: memsearch search "批处理大小" │
│ → 返回语义相关 chunks │
└─────────────────────────────────────┘
│ (需要更多详情?)
▼
┌─────────────────────────────────────┐
│ L2: memsearch expand <chunk_hash> │
│ → 返回完整 .md 段落 │
└─────────────────────────────────────┘
│ (需要原始对话?)
▼
┌─────────────────────────────────────┐
│ L3: 解析 session.jsonl 原始转录 │
│ → 返回原始对话内容 │
└─────────────────────────────────────┘
性能优化与限制
内存管理
已知问题:使用 ONNX 提供者索引时,每个 chunk 泄漏约 9MB anon-rss 内存。索引多 MB 的 Markdown 语料库时,内存可能线性增长至 11.5GB,导致 OOM。资料来源:社区 issue #533
CJK 分词支持
当前检索系统在中文(CJK)语境下存在 tokenization 缺陷,影响信息检索效果。建议使用 jieba-next 等专业中文分词工具增强健壮性。资料来源:社区 issue #102
配置参考
| 配置项 | 默认值 | 说明 |
|---|---|---|
milvus.uri | milvus_lite | Milvus 连接 URI |
embedding.provider | onnx | 嵌入提供商 |
watch.debounce_ms | 1500 | 文件变化防抖时间 |
max_chunk_size | 512 | 单个 chunk 最大 tokens |
# 初始化配置
memsearch config init # 全局交互式配置
memsearch config init --project # 项目级配置
# 查看/修改配置
memsearch config list
memsearch config set embedding.provider openai
故障排除
| 问题 | 原因 | 解决方案 |
|---|---|---|
| Search 失败 "collection is in state 'released'" | Milvus Lite 未加载 | 确保 watch 进程运行或手动调用 load |
| Stats 显示 0 chunks | Collection 名称未正确解析 | 显式使用 -c 参数指定 |
| upsert 成功但 row_count=0 | Milvus 2.5+ 缺少 flush | 检查版本或手动 flush |
| 搜索无结果 | CJK 分词问题 | 考虑使用 jieba 分词增强 |
插件系统概述
MemSearch 采用分层架构设计,CLI/API 层负责索引、搜索和 Milvus 同步,而插件层则构建在 CLI/API 层之上,为不同的 AI 编码代理提供深度集成。插件系统的核心理念是:Markdown 文件始终是数据源的真实来源,Milvus 仅作为可重建的影子索引。
继续阅读本节完整说明和来源证据。
继续阅读本节完整说明和来源证据。
继续阅读本节完整说明和来源证据。
继续阅读本节完整说明和来源证据。
概述
MemSearch 采用分层架构设计,CLI/API 层负责索引、搜索和 Milvus 同步,而插件层则构建在 CLI/API 层之上,为不同的 AI 编码代理提供深度集成。插件系统的核心理念是:Markdown 文件始终是数据源的真实来源,Milvus 仅作为可重建的影子索引。
graph TB
subgraph "用户交互层"
User[用户/开发者]
end
subgraph "插件层 (Agent 集成)"
ClaudeCode[Claude Code 插件]
Codex[Codex 插件]
OpenCode[OpenCode 插件]
OpenClaw[OpenClaw 插件]
end
subgraph "CLI/API 层"
CLI[memsearch CLI]
API[Python API]
end
subgraph "核心功能层"
Index[索引引擎]
Search[搜索/检索]
Milvus[Milvus 向量存储]
end
User --> ClaudeCode
User --> Codex
User --> OpenCode
User --> OpenClaw
ClaudeCode --> CLI
Codex --> CLI
OpenCode --> CLI
OpenClaw --> CLI
CLI --> API
API --> Index
API --> Search
Index --> Milvus
Search --> Milvus资料来源:README.md
支持的插件平台
MemSearch 当前支持以下 AI 编码代理平台的插件集成:
| 插件名称 | 平台类型 | 集成方式 | 内存隔离 |
|---|---|---|---|
| Claude Code | Anthropic Claude Code | Stop Hook / SessionStart Hook | 独立 collection |
| Codex | OpenAI Codex | 生命周期 Hook | 独立 collection |
| OpenCode | OpenCode CLI | Native 工具集成 | 独立 collection |
| OpenClaw | OpenClaw 多代理 | Native 工具集成 | 按工作空间隔离 |
每个插件的 collection 名称通过工作空间路径派生算法生成,确保不同平台和不同工作空间之间的内存隔离。
资料来源:plugins/openclaw/README.md
插件架构
共享资源层
所有插件共享 plugins/_shared/ 目录下的公共资源,包括:
graph LR
subgraph "plugins/_shared/"
Scripts[脚本]
Prompts[提示词模板]
end
Scripts --> MaintenanceRunner[维护运行器]
Scripts --> CaptureScripts[捕获脚本]
Prompts --> Summarize[摘要提示词]
Prompts --> ProjectReview[项目回顾提示词]
Prompts --> UserProfile[用户画像提示词]
MaintenanceRunner --> ClaudeCode
MaintenanceRunner --> Codex
MaintenanceRunner --> OpenCode
MaintenanceRunner --> OpenClaw#### 共享提示词
项目回顾提示词 (project_review.txt) 定义了项目内存的推荐结构:
# Project Memory
## Current Direction
## Active Threads
## Recent Progress
## Decisions
## Open Questions
## Risks and Constraints
## Next Steps
## Cold Items
该提示词强调:
- 保持文件聚焦于项目,而非用户个人偏好
- 优先小范围增量更新,而非全面重写
- 包含 JSON 格式的操作指令 (
action:none/replace)
资料来源:plugins/_shared/prompts/project_review.txt
内存捕获流程
插件的核心功能之一是在每次对话轮次后自动捕获和摘要记忆。Claude Code 插件展示了典型的捕获流程:
sequenceDiagram
participant User as 用户
participant Agent as Claude Agent
participant StopHook as Stop Hook
participant Summarizer as LLM (haiku)
participant MemoryFS as memory/*.md
participant MemSearch as memsearch index
User->>Agent: 提问
Agent-->>User: 响应
Agent->>StopHook: 触发 Stop 钩子
StopHook->>StopHook: 解析最后轮次
StopHook->>Summarizer: 发送摘要请求
Summarizer-->>StopHook: 返回摘要
StopHook->>MemoryFS: 追加到每日内存文件
Note over MemoryFS: 添加 session:UUID 锚点
StopHook->>MemSearch: 执行索引
MemSearch->>Milvus: 更新向量索引资料来源:README.md
三层递进检索
当用户查询记忆时,插件提供三层递进式检索:
| 层级 | 工具 | 功能 | 适用场景 |
|---|---|---|---|
| L1 | memory_search | 语义 + 关键词混合搜索 | 快速召回 ("我们讨论过 X 吗?") |
| L2 | memory_get / memory_expand | 展开完整 markdown 节段 | 需要详情 ("解决方案是什么?") |
| L3 | memory_transcript | 解析原始会话转录 | 需要原始对话 ("给我看原始对话") |
graph TD
Query["用户查询: \"batch size 相关讨论\""]
L1["L1: memsearch search"]
Chunks["排名结果 chunks"]
L2{"需要详情?"}
L3{"需要原始对话?"}
Section["完整节段"]
Transcript["原始对话"]
End["返回结果"]
Query --> L1
L1 --> Chunks
Chunks --> L2
L2 -->|"否"| End
L2 -->|"是"| L3
L3 -->|"否"| Section
L3 -->|"是"| Transcript
Section --> End
Transcript --> End资料来源:plugins/openclaw/skills/memory-recall/SKILL.md
工具定义
OpenCode 插件工具
OpenCode 插件通过 TypeScript 定义了三个核心工具:
memory_search: tool({
description: "Search semantic memory with hybrid BM25 + vector search",
args: {
query: tool.schema.string(),
limit: tool.schema.number().optional()
}
})
memory_get: tool({
description: "Expand a memory chunk to see full markdown section with context",
args: {
chunk_hash: tool.schema.string()
}
})
memory_transcript: tool({
description: "Retrieve original conversation from past OpenCode session",
args: {
session_id: tool.schema.string(),
turn_id: tool.schema.string().optional()
}
})
资料来源:plugins/opencode/index.ts
配置管理
插件配置选项
每个插件支持独立的配置项,通过 memsearch config set 命令管理:
| 配置项 | 默认值 | 说明 |
|---|---|---|
plugins.{name}.summarize.enabled | true | 启用自动摘要捕获 |
plugins.{name}.summarize.provider | native | 摘要生成提供者 |
plugins.{name}.summarize.model | 平台默认 | 摘要生成模型 |
plugins.{name}.autoCapture | true | 自动捕获对话摘要 |
plugins.{name}.autoRecall | true | 启动时自动注入记忆 |
嵌入提供者配置
插件支持多种嵌入提供者:
| 提供者 | 说明 | API Key 要求 |
|---|---|---|
onnx | 本地 BGE-M3 模型 | 无 (默认) |
openai | OpenAI 嵌入 | 需要 OPENAI_API_KEY |
google | Google 嵌入 | 需要 API Key |
voyage | Voyage AI | 需要 API Key |
jina | Jina AI | 需要 API Key |
mistral | Mistral AI | 需要 API Key |
ollama | 本地 Ollama | 无 |
# 切换到 OpenAI 嵌入
memsearch config set embedding.provider openai
# 切换回本地 ONNX
memsearch config set embedding.provider onnx
Milvus 后端配置
| 配置项 | 默认值 | 说明 |
|---|---|---|
milvus.uri | milvus_lite | Milvus 服务器地址 |
milvus.token | 无 | 远程 Milvus 认证令牌 |
# 使用远程 Milvus 服务器
memsearch config set milvus.uri http://localhost:19530
插件隔离机制
多代理内存隔离
每个 AI 代理独立存储内存,使用独立的工作空间目录:
~/.claude/codex/.memsearch/memory/ ← Codex 主代理
~/.claude/workspace/.memsearch/memory/ ← Claude Code
~/.openclaw/workspace/.memsearch/memory/ ← OpenClaw 主代理
~/.openclaw/workspace-work/.memsearch/memory/ ← OpenClaw 工作代理
Collection 名称从工作空间路径派生,确保不同平台和不同工作空间之间的内存完全隔离。当一个代理的工作空间指向其他平台使用的项目目录时,记忆会自动跨平台共享。
资料来源:plugins/openclaw/README.md
已知限制与问题
已识别的社区问题
| Issue | 描述 | 影响 |
|---|---|---|
| #540 | Milvus Lite CLI 搜索在非活跃会话时失败 (collection 'released' 状态) | CLI search 命令无法独立工作 |
| #535 | Codex 插件仍使用已弃用的 features.codex_hooks | Codex CLI 产生弃用警告 |
| #520 | Stop hook 的 claude -p 调用触发 SessionStart | 污染每日日志 |
| #527 | API 速率限制时 Stop hook 写入错误字符串 | 摘要内容被污染 |
Codex 插件弃用警告
Codex CLI 当前会警告 [features].codex_hooks 已弃用,应替换为 [features].hooks。MemSearch Codex 插件的安装器、Stop hook 隔离和文档仍使用已弃用的键。
安装与维护
插件更新
# 重新安装插件以获取最新版本
memsearch plugin update
# 完全卸载插件
memsearch plugin uninstall
配置初始化
# 全局交互式配置
memsearch config init
# 项目级交互式配置
memsearch config init --project
# 直接设置配置
memsearch config set plugins.codex.summarize.model gpt-5.1-codex-mini
配置更改后建议启动新的代理会话,以确保加载最新的 hook/skill 状态。
扩展插件开发
开发新插件时应遵循以下架构原则:
- 共享资源优先:使用
plugins/_shared/下的共享脚本和提示词 - 工具三元组:实现
memory_search、memory_get、memory_transcript三个核心工具 - Hook 集成:通过 Stop/SessionStart Hook 触发捕获流程
- 配置隔离:支持独立的 provider/model 配置项
- Collection 派生:使用统一的算法从工作空间路径派生 collection 名称
项目内存结构建议
所有插件推荐使用统一的项目内存结构:
# Project Memory
## Current Direction
描述当前项目的核心方向和目标
## Active Threads
当前活跃的讨论或任务线索
## Recent Progress
近期完成的工作和进展
## Decisions
重要的技术决策记录
## Open Questions
待解决的问题
## Risks and Constraints
已识别的风险和约束条件
## Next Steps
下一步计划
## Cold Items
长期搁置或低优先级的事项
此结构通过 project_review.txt 提示词模板标准化,确保跨平台的一致性。
资料来源:README.md
Claude Code 插件
Claude Code 插件是 memsearch 为 Claude Code(claude.ai/code)提供的原生集成层,通过 Claude Code 的钩子(hooks)系统实现会话记忆的自动捕获、索引和检索。该插件使 Claude Code 在项目开发过程中积累的对话上下文成为可搜索的语义记忆,从而实现跨会话的知识保留和上下文恢复。
继续阅读本节完整说明和来源证据。
继续阅读本节完整说明和来源证据。
继续阅读本节完整说明和来源证据。
继续阅读本节完整说明和来源证据。
核心功能概览
| 功能模块 | 触发时机 | 作用 |
|---|---|---|
| SessionStart | 会话启动时 | 初始化当日记忆文件,记录会话元信息 |
| UserPromptSubmit | 用户提交提示时 | 标记当前对话轮次,锚定会话路径 |
| Stop | 会话结束时 | 解析并总结对话内容,追加至记忆文件 |
| 自动索引 | Stop 钩子完成后 | 将新增记忆内容同步至 Milvus 向量库 |
架构设计
数据流总览
graph TD
subgraph 捕获阶段["捕获阶段"]
A[用户对话] --> B[Stop 钩子触发]
B --> C[transcript.py 解析对话]
C --> D[claude -p 生成摘要]
D --> E[追加至 memory/YYYY-MM-DD.md]
E --> F[memsearch index 索引]
F --> G[Milvus 向量存储]
end
subgraph 检索阶段["检索阶段 (3层递进)"]
H[用户查询] --> I[L1: memsearch search]
I --> J[相关性排序结果]
J --> K{需要更多细节?}
K -->|是| L[L2: memsearch expand]
L --> M[完整 Markdown 段落]
M --> N{需要原始对话?}
N -->|是| O[L3: transcript.py 解析]
O --> P[原始对话记录]
end插件目录结构
plugins/claude-code/
├── README.md # 插件说明文档
├── hooks/
│ ├── session-start.sh # 会话启动钩子
│ ├── stop.sh # 会话停止钩子
│ └── user-prompt-submit.sh # 提示提交钩子
├── transcript.py # 对话记录解析器
├── prompts/
│ └── project_review.txt # 项目回顾提示模板
├── skills/
│ ├── memory-config/ # 记忆配置技能
│ └── memory-recall/ # 记忆检索技能
└── installer/ # 安装脚本
工作机制详解
1. 会话启动(SessionStart Hook)
session-start.sh 在每次 Claude Code 启动时执行,负责初始化当日记忆文件:
sequenceDiagram
participant U as 用户
participant CC as Claude Code
participant SS as session-start.sh
participant FS as 文件系统
CC->>SS: 触发 SessionStart 钩子
SS->>SS: 检查 .memsearch/memory/ 目录
SS->>FS: 创建/追加 memory/YYYY-MM-DD.md
Note over SS: 添加会话元信息标记
SS-->>CC: 完成关键功能:
- 检查
.memsearch/memory/目录是否存在,不存在则创建 - 在当日记忆文件中追加会话头信息(
## Session HH:MM) - 注入会话路径锚点,便于后续定位原始对话
⚠️ 已知问题:Issue #520 报告stop.sh中调用的claude -p子进程会意外触发 SessionStart 钩子,导致每日日志被污染并泄漏到嵌套目录。社区正在评估解决方案。
2. 提示提交(UserPromptSubmit Hook)
user-prompt-submit.sh 在用户每次提交提示时执行,用于标记对话轮次边界:
# 核心逻辑:追加会话锚点注释
<!-- session:${CLAUDE_SESSION_ID} turn:${TURN_COUNT} -->
此锚点嵌入记忆文件,使后续检索能追溯到原始对话记录。
3. 会话停止(Stop Hook)
stop.sh 是插件的核心,负责捕获和保存对话摘要:
flowchart LR
A[Stop 钩子触发] --> B[解析最后对话轮次]
B --> C{摘要提供者}
C -->|native| D[claude -p --model haiku]
C -->|openai| E[OpenAI API]
D --> F[生成结构化摘要]
E --> F
F --> G[追加至记忆文件]
G --> H[执行 memsearch index]摘要格式示例:
- 用户询问了 X 问题
- Claude 分析了 Y 方案
- 双方讨论了 Z 限制
<!-- session:uuid transcript:/path/to/transcript.jsonl -->
⚠️ 已知问题:Issue #527 报告当用户账户触发 Anthropic API 速率限制时,claude -p返回人类可读的错误字符串而非摘要内容,stop.sh仅检查非零退出码,未验证输出格式,导致错误信息被写入记忆文件。
4. 向量索引同步
Stop 钩子完成后,自动调用 memsearch index 将新增记忆同步至 Milvus:
memsearch index .memsearch/memory/
使用 BGE-M3 ONNX 模型生成分块向量,支持混合搜索(稠密向量 + BM25 + RRF)。
记忆文件格式
每日记忆文件
位置:.memsearch/memory/YYYY-MM-DD.md
# Daily Memory
## Session 14:23
- 用户询问关于批处理大小的问题
- Claude 分析了内存使用情况
- 决定使用 64 的批次大小
<!-- session:abc123 turn:5 transcript:/path/to/session.jsonl -->
## Session 15:45
- 讨论了缓存策略
- ...
项目回顾文件
位置:.memsearch/PROJECT_MEMORY.md
建议结构:
# Project Memory
## Current Direction
## Active Threads
## Recent Progress
## Decisions
## Open Questions
## Risks and Constraints
## Next Steps
## Cold Items
3层递进检索模式
graph LR
A[用户查询] --> B{L1 快速回忆}
B --> C[memsearch search]
C --> D{结果足够?}
D -->|否| E{L2 获取细节}
E --> F[memsearch expand]
F --> G{需要原始对话?}
G -->|是| H{L3 原始对话}
H --> I[transcript.py 解析]
style B fill:#90EE90
style E fill:#FFD700
style H fill:#FFB6C1| 层级 | 命令 | 返回内容 | 使用场景 |
|---|---|---|---|
| L1 | memsearch search | 相关性排序的分块列表 | 快速回忆"是否讨论过 X" |
| L2 | memsearch expand <hash> | 完整 Markdown 段落 | 需要具体解决方案细节 |
| L3 | transcript.py | 原始对话记录 | 需要查看具体措辞和上下文 |
配置选项
插件级配置
# 初始化配置
memsearch config init --project
# 查看当前配置
memsearch config list
| 配置项 | 默认值 | 说明 |
|---|---|---|
plugins.claude-code.enabled | true | 启用/禁用插件 |
plugins.claude-code.summarize.enabled | true | 自动摘要功能 |
plugins.claude-code.summarize.provider | native | 摘要提供者:native/openai |
plugins.claude-code.summarize.model | haiku | 摘要模型名称 |
plugins.claude-code.project_review.enabled | false | 项目回顾功能 |
plugins.claude-code.user_profile.enabled | false | 用户画像功能 |
使用外部摘要提供者
# 配置 OpenAI 作为摘要提供者
memsearch config set llm.providers.openai.type openai
memsearch config set llm.providers.openai.model gpt-4o-mini
memsearch config set llm.providers.openai.api_key env:OPENAI_API_KEY
memsearch config set plugins.claude-code.summarize.provider openai
memsearch config set plugins.claude-code.summarize.model gpt-4o-mini
安装与卸载
安装步骤
- 安装 memsearch:
uv pip install memsearch
- 在 Claude Code 中安装插件:
/install https://github.com/zilliztech/memsearch
- 初始化项目配置:
cd your-project
memsearch config init --project
卸载步骤
- 在 Claude Code 中卸载插件:
/uninstall memsearch
- 清理项目数据(可选):
rm -rf .memsearch/
⚠️ 注意:卸载插件不会自动删除 .memsearch/ 目录中的记忆数据。
与 Codex 插件的差异
| 特性 | Claude Code 插件 | Codex 插件 |
|---|---|---|
| 钩子系统 | Claude Code 原生 hooks | 自定义 hooks.json |
| 会话解析 | transcript.py | 自定义解析器 |
| 摘要生成 | claude -p 或外部 API | 类似机制 |
| 状态管理 | 文件锚点 + Milvus | 类似架构 |
| 弃用状态 | 活跃维护 | 使用废弃的 features.codex_hooks(见 Issue #535) |
故障排查
常见问题
| 问题 | 可能原因 | 解决方案 |
|---|---|---|
| 记忆未写入 | 钩子未正确安装 | 检查 ~/.claude/settings.json |
| 索引失败 | Milvus Lite 未加载 | 确保 watch 进程运行或手动 memsearch index |
| 摘要为空 | API 速率限制 | 检查 Issue #527,升级插件 |
| 会话污染 | claude -p 触发 SessionStart | 见 Issue #520,评估 --no-session-persistence |
诊断命令
# 检查插件状态
memsearch stats -c <collection>
# 查看索引详情
memsearch index .memsearch/memory/ -v
# 测试检索
memsearch search "your query"
相关社区议题
| Issue | 描述 | 状态 |
|---|---|---|
| #520 | claude -p 触发 SessionStart 导致日志污染 | 开放 |
| #527 | 速率限制错误被写入记忆摘要 | 开放 |
| #537 | 压缩前对话记录未捕获 | 开放 |
| #535 | 使用废弃的 features.codex_hooks 配置 | 开放 |
参考资料
来源:https://github.com/zilliztech/memsearch / 项目说明书
Codex CLI 插件
Codex CLI 插件是 memsearch 为 Anthropic Codex CLI 提供的原生集成方案,使 Codex 用户能够自动捕获对话记忆、进行语义搜索检索,并在会话之间保持上下文连续性。
继续阅读本节完整说明和来源证据。
继续阅读本节完整说明和来源证据。
继续阅读本节完整说明和来源证据。
继续阅读本节完整说明和来源证据。
概述
Codex CLI 插件是 memsearch 为 Anthropic Codex CLI 提供的原生集成方案,使 Codex 用户能够自动捕获对话记忆、进行语义搜索检索,并在会话之间保持上下文连续性。
该插件通过 Codex 的 hooks 机制工作,在每次对话轮次结束后自动将摘要追加到项目级 Markdown 记忆文件,并同步索引到 Milvus 向量数据库。
核心功能
记忆捕获(Capture)
每次对话轮次结束后自动执行:
- 解析最后一个对话回合
- 调用 haiku 模型生成结构化摘要
- 将摘要追加到
memory/YYYY-MM-DD.md文件 - 同时索引到 Milvus 向量数据库
记忆检索(Recall)
三层递进式检索机制:
| 层级 | 工具 | 功能描述 |
|---|---|---|
| L1 | memsearch search | 语义+关键词混合搜索,返回排名结果 |
| L2 | memsearch expand | 展开匹配块获取完整 Markdown 段落 |
| L3 | 解析 transcript | 从原始会话文件获取原始对话 |
工作原理
架构图
graph TD
A[Codex CLI 启动] --> B[SessionStart Hook]
B --> C[检查 memory 目录]
B --> D[注入会话锚点]
E[用户与 Codex 对话] --> F[对话轮次结束]
F --> G[Stop Hook 触发]
G --> H[解析最后回合]
H --> I[LLM 摘要 haiku]
I --> J[追加到 memory/YYYY-MM-DD.md]
J --> K[memsearch index]
K --> L[Milvus 向量索引]
M[用户检索记忆] --> N[memsearch search]
N --> O[hybrid BM25 + vector]
O --> P[返回排名结果]Stop Hook 执行流程
用户提问 → Agent 响应 → Stop Hook 触发
│
┌─────────────────┘
▼
解析最后回合
│
▼
LLM 摘要 (haiku)
"- 用户询问 X"
"- Codex 执行 Y"
│
▼
追加到 memory/YYYY-MM-DD.md
(含 <!-- session:UUID --> 锚点)
│
▼
memsearch index → Milvus
资料来源:README.md:59-72
安装与配置
安装命令
# 进入 Codex 插件目录
cd plugins/codex
# 运行安装脚本
./scripts/install.sh
安装脚本会自动配置以下内容:
- 创建项目级
.memsearch/目录结构 - 配置 Codex hooks(SessionStart 和 Stop)
- 设置默认的记忆摘要模型
初始化配置
# 全局交互式初始化
memsearch config init
# 项目级交互式初始化
memsearch config init --project
关键配置项
| 配置项 | 说明 | 默认值 |
|---|---|---|
plugins.codex.summarize.enabled | 是否启用自动摘要 | true |
plugins.codex.summarize.provider | 摘要服务提供商 | native |
plugins.codex.summarize.model | 摘要模型 | haiku |
plugins.codex.project_review.enabled | 项目回顾任务 | false |
plugins.codex.user_profile.enabled | 用户画像任务 | false |
资料来源:plugins/codex/skills/memory-config/SKILL.md:3-5
嵌入模型配置
# 切换到 OpenAI 嵌入(需要 OPENAI_API_KEY)
memsearch config set embedding.provider openai
# 切换回本地 ONNX
memsearch config set embedding.provider onnx
Milvus 后端配置
# 使用远程 Milvus 服务器
memsearch config set milvus.uri http://localhost:19530
# 默认使用 Milvus Lite(本地 .db 文件)
资料来源:plugins/codex/README.md:18-30
插件工具集
Codex 插件提供以下 MCP 工具:
memory_search
语义搜索工具,用于快速检索相关记忆块。
参数:
query: 搜索查询字符串
返回: 排名结果列表,包含 chunk_hash 和相关性分数
memory_get
展开工具,用于获取匹配块的完整 Markdown 段落及上下文。
参数:
chunk_hash: 搜索结果中的块哈希值
返回: 完整段落文本,可能包含会话锚点(如 <!-- session:UUID -->)
memory_transcript
原始对话检索工具,从会话转录文件解析原始对话内容。
参数:
session_id: 锚点注释中的会话 IDturn_id: 可选的回合 ID
返回: 格式化的对话内容,带 [User] 和 [Assistant] 标签
资料来源:plugins/claude-code/skills/memory-recall/SKILL.md:8-30
记忆文件结构
目录布局
.memsearch/
├── memory/
│ ├── 2026-03-27.md
│ ├── 2026-03-26.md
│ └── ...
└── config.yaml
记忆文件格式
# 2026-03-27
## 会话摘要
- 用户询问了关于 batch size 的配置问题
- Codex 建议使用环境变量覆盖默认值
- 用户确认了修改方案
<!-- session:abc12345 turn:1 transcript:/path/to/session.jsonl -->
PROJECT_MEMORY.md 结构
# Project Memory
## Current Direction
[当前项目方向]
## Active Threads
[活跃任务]
## Recent Progress
[近期进展]
## Decisions
[已做决策]
## Open Questions
[待解决问题]
## Risks and Constraints
[风险与约束]
## Next Steps
[下一步计划]
## Cold Items
[搁置事项]
资料来源:plugins/codex/prompts/project_review.txt:18-35
已知问题
Issue #535: 使用已弃用的 features.codex_hooks
Codex CLI 现在警告 [features].codex_hooks 已弃用,应替换为 [features].hooks。当前 memsearch Codex 插件仍在 installer、stop hook isolation 和文档中使用已弃用的键。
影响范围:
- 插件安装脚本
- Stop hook 隔离逻辑
- 相关文档说明
状态: 待修复
资料来源:社区 Issue #535
Issue #520: Stop hook 的 claude -p 调用触发 SessionStart
即使设置了 --no-session-persistence、--no-chrome 并清除 CLAUDECODE=,内部的 claude -p 调用仍会触发插件的 SessionStart Hook,导致:
- 每日日志被污染
- 记忆泄漏到嵌套目录
资料来源:社区 Issue #520
Issue #527: Rate-limit 错误被写入记忆摘要
当用户账户触发 API 速率限制时,stop.sh 中的 claude -p --model haiku 调用返回错误字符串而非摘要。当前 stop.sh 仅检查退出码,未验证输出内容是否为有效摘要。
资料来源:社区 Issue #527
Issue #537: 预压缩转录未被 Stop Hook 捕获
如果会话中间发生转录压缩(compaction),Stop 的 parse-transcript.sh 在压缩已将预压缩转录合并为单个 isCompactSummary 标记之后才运行,导致长时 Agent 运行在压缩中期的对话细节丢失。
资料来源:社区 Issue #537
配置初始化交互
memsearch CLI 提供交互式配置流程,支持 Codex 相关配置:
memsearch config init
交互提示包括:
| 配置项 | 提示文本 |
|---|---|
| Codex 摘要启用 | Codex automatic summaries enabled |
| Codex 摘要提供商 | Codex summarize provider |
| Codex 摘要模型 | Codex summarize model |
| Codex 项目回顾 | Codex project review enabled |
| Codex 用户画像 | Codex user profile enabled |
资料来源:src/memsearch/cli.py:145-160
最佳实践
会话恢复
遇到复杂问题时,可使用会话恢复功能获取之前对话的上下文:
memsearch expand <chunk_hash>
定期维护
- 项目回顾:启用
plugins.codex.project_review定期生成项目状态摘要 - 索引重建:定期运行
memsearch index确保 Milvus 索引与 Markdown 文件同步 - 配置检查:修改配置后启动新 Codex 会话以加载新状态
调试建议
配置变更后,建议启动新 Codex 会话,因为当前会话可能已缓存旧状态。配置项如 plugins.codex.summarize.*、[llm.providers.*]、[milvus.*] 等通常在下次捕获、检索、索引或维护调用时生效。
资料来源:plugins/codex/skills/memory-config/SKILL.md:3-6
与 Claude Code 插件对比
| 特性 | Codex 插件 | Claude Code 插件 |
|---|---|---|
| 摘要模型 | 可配置 | 可配置 |
| 项目回顾 | 支持 | 支持 |
| 用户画像 | 支持 | 支持 |
| 转录解析 | 支持 | 支持 |
| 记忆锚点 | session:UUID | session:UUID |
两个插件共享相同的底层 memsearch 核心,差异主要在于 hook 脚本的实现细节和 agent 特定的配置命名空间。
资料来源:README.md:59-72
OpenClaw 插件
OpenClaw 是 memsearch 项目支持的多 agent 平台插件之一,为 OpenClaw agent 提供语义记忆能力。与 Claude Code、Codex、OpenCode 等插件类似,OpenClaw 插件通过 hook 机制捕获会话内容,并将其持久化到 markdown 文件中,同时利用 memsearch 的向量搜索能力实现高效检索。
继续阅读本节完整说明和来源证据。
继续阅读本节完整说明和来源证据。
继续阅读本节完整说明和来源证据。
继续阅读本节完整说明和来源证据。
概述
OpenClaw 是 memsearch 项目支持的多 agent 平台插件之一,为 OpenClaw agent 提供语义记忆能力。与 Claude Code、Codex、OpenCode 等插件类似,OpenClaw 插件通过 hook 机制捕获会话内容,并将其持久化到 markdown 文件中,同时利用 memsearch 的向量搜索能力实现高效检索。
OpenClaw 插件的核心功能包括:
- 会话捕获:在每次对话轮次后自动生成摘要并追加到记忆文件
- 语义搜索:提供
memory_search、memory_get、memory_transcript三层递进式检索 - 自动维护:支持项目回顾(project_review)和用户画像(user_profile)自动维护任务
- 配置管理:提供
memory-configskill 引导式配置界面
资料来源:plugins/openclaw/README.md:1-20
架构设计
插件组件结构
OpenClaw 插件位于 plugins/openclaw/ 目录下,采用模块化设计:
| 组件路径 | 功能说明 |
|---|---|
index.ts | 主入口,定义 agent tools 和 hook 脚本 |
skills/memory-recall/SKILL.md | 记忆检索 skill,定义 memory_search/get/transcript 工具用法 |
skills/memory-config/SKILL.md | 配置管理 skill,引导用户完成 memsearch 配置 |
prompts/project_review.txt | 项目回顾 prompt 模板 |
scripts/parse-transcript.sh | 原始对话转录解析脚本 |
资料来源:plugins/openclaw/index.ts:1-50
记忆检索工具
OpenClaw 插件提供三个递进式记忆检索工具,形成"快速回忆 → 详情展开 → 原始对话"的检索链路:
graph LR
A[用户查询] --> B[memory_search]
B --> C{是否需要详情?}
C -->|是| D[memory_get]
D --> E{需要原始对话?}
E -->|是| F[memory_transcript]
E -->|否| G[返回展开内容]
C -->|否| H[返回搜索结果]#### 1. memory_search — 语义搜索
在记忆语料库中执行混合搜索(BM25 + 向量相似度),返回相关片段列表。
参数:
| 参数名 | 类型 | 必需 | 说明 |
|---|---|---|---|
| query | string | 是 | 搜索查询文本 |
返回:包含 chunk_hash、text、score 的结果数组
资料来源:plugins/openclaw/index.ts:100-130
#### 2. memory_get — 展开详情
根据 memory_search 返回的 chunk_hash 展开完整的 markdown 段落,包含周围上下文。
参数:
| 参数名 | 类型 | 必需 | 说明 |
|---|---|---|---|
| chunk_hash | string | 是 | 搜索结果中的 chunk_hash |
返回:完整的 markdown 区块文本,可能包含会话锚点注释 <!-- session:UUID transcript:PATH -->
资料来源:plugins/openclaw/index.ts:130-160
#### 3. memory_transcript — 原始对话
解析原始会话转录文件,返回格式化的对话内容,包含 [User] 和 [Assistant] 标签。
参数:
| 参数名 | 类型 | 必需 | 说明 |
|---|---|---|---|
| session_id | string | 是 | 会话 ID(从锚点注释获取) |
| turn_id | string | 否 | 指定轮次 ID |
| transcript_path | string | 否 | 转录文件路径 |
返回:带标签的原始对话,包含工具调用信息
注意:如果锚点格式与预期不符(如使用rollout:、turn:、db:而非transcript:),建议直接读取引用的文件探索其结构。
资料来源:plugins/openclaw/skills/memory-recall/SKILL.md:30-50
决策指南
| 用户意图 | 使用的工具 |
|---|---|
| 快速回忆("我们讨论过 X 吗?") | memory_search |
| 需要详情("解决方案是什么?") | memory_search → memory_get |
| 需要原始对话("展示原始对话内容") | memory_search → memory_get → memory_transcript |
资料来源:plugins/openclaw/skills/memory-recall/SKILL.md:55-65
工作流程
会话捕获流程
OpenClaw 插件在每次对话轮次结束后触发 hook,执行以下流程:
graph TD
A[用户提问] --> B[Agent 响应]
B --> C[Stop Hook 触发]
C --> D[解析最后轮次]
D --> E[LLM 摘要生成]
E --> F["摘要: '- 用户问了 X。<br/>- Agent 做了 Y.'"]
F --> G[追加到 memory/YYYY-MM-DD.md]
G --> H[添加 session 锚点]
H --> I[memsearch index → Milvus]资料来源:plugins/openclaw/README.md:50-80
自动维护任务
OpenClaw 支持两种自动维护任务(默认禁用):
| 任务类型 | 说明 | 配置项 |
|---|---|---|
| project_review | 项目回顾,维护 PROJECT.md 记忆文件 | plugins.openclaw.project_review.* |
| user_profile | 用户画像,维护 USER.md 个人偏好文件 | plugins.openclaw.user_profile.* |
这些任务按 min_interval_hours 间隔执行,可配置 provider、model 和 input_dir。
资料来源:src/memsearch/config.py:80-100
配置管理
可配置项
OpenClaw 插件的配置项位于 plugins.openclaw 命名空间下:
| 配置项 | 默认值 | 说明 |
|---|---|---|
summarize.enabled | true | 是否启用自动摘要 |
summarize.provider | native | 摘要 provider(native 表示使用插件内置) |
summarize.model | - | 摘要模型名称 |
project_review.enabled | false | 项目回顾任务开关 |
project_review.provider | native | 项目回顾 provider |
project_review.model | - | 项目回顾模型 |
project_review.min_interval_hours | 24 | 最小执行间隔(小时) |
project_review.input_dir | .memsearch/memory | 输入目录 |
user_profile.* | - | 用户画像配置(同 project_review) |
交互式配置
用户可以通过 memory-config skill 进入引导式配置流程:
memsearch config init --project # 项目级交互配置
memsearch config set/get/list # 直接 CLI 修改
重要提示:修改配置后,建议开启新的 agent 会话,因为当前会话可能已加载旧配置。配置变更会在下次捕获、检索、索引或维护调用时生效。
资料来源:plugins/openclaw/skills/memory-config/SKILL.md:1-30
项目回顾 Prompt 规范
项目回顾功能使用共享的 prompt 模板,关键要求包括:
必须遵守:
- 文件内容应聚焦于项目本身,而非用户个人偏好
- 将用户偏好、通信风格等放入
USER.md - 仅在项目明确要求时包含约束条件
- 保持文件简洁可审查
推荐的文件结构:
# Project Memory
## Current Direction
## Active Threads
## Recent Progress
## Decisions
## Open Questions
## Risks and Constraints
## Next Steps
## Cold Items
输出格式:
{"action":"none","reason":"Recent journals do not change durable project state."}
{"action":"replace","reason":"Recent journals add a new active thread.","content":"# Project Memory\n\n..."}
资料来源:plugins/openclaw/prompts/project_review.txt:1-30
与其他插件的对比
| 特性 | Claude Code | Codex | OpenCode | OpenClaw |
|---|---|---|---|---|
| 记忆工具 | memory_search/get/transcript | memory_search/get/transcript | memory_search/get/transcript | memory_search/get/transcript |
| 摘要生成 | claude -p (haiku) | 原生代码模型 | 原生模型 | 原生模型 |
| 自动维护 | project_review/user_profile | project_review/user_profile | project_review/user_profile | project_review/user_profile |
| Hook 机制 | SessionStart/Stop | SessionStart/Stop | SessionStart/Stop | SessionStart/Stop |
所有插件共享相同的记忆检索工具链和项目维护框架,确保用户体验一致性。
资料来源:plugins/_shared/prompts/project_review.txt:1-20
相关社区问题
以下社区报告的问题可能影响 OpenClaw 插件的使用体验:
| Issue | 问题描述 | 影响范围 |
|---|---|---|
| #540 | Milvus Lite 集合处于 'released' 状态导致搜索失败 | CLI search |
| #539 | 同一批次中不允许重复主键 | 索引操作 |
| #538 | 仅在配置文件中设置 collection name 时 stats 显示 0 chunks | 统计命令 |
| #533 | 索引时每 chunk 泄漏约 9MB 内存 | 大型语料库 |
| #534 | MilvusStore.upsert() 报告成功但数据未持久化 | 远程 Milvus |
提示:遇到搜索或索引问题时,首先确认 Milvus 集合状态是否正确加载(调用 load() 或重启 watch 进程)。
快速入门
``bash memsearch plugin install openclaw ``
- 安装 OpenClaw 插件:
``bash memsearch plugin list ``
- 验证安装:
``bash memsearch config set plugins.openclaw.summarize.provider openai memsearch config set plugins.openclaw.summarize.model gpt-5-mini ``
- 配置 provider(可选):
- 开始使用:
- 在 OpenClaw 会话中直接询问记忆相关问题
- 使用
memory_search、memory_get、memory_transcript工具检索
失败模式与踩坑日记
保留 Doramagic 在发现、验证和编译中沉淀的项目专属风险,不把社区讨论只当作装饰信息。
可能增加新用户试用和生产接入成本。
可能增加新用户试用和生产接入成本。
可能增加新用户试用和生产接入成本。
可能影响授权、密钥配置或安全边界。
Pitfall Log / 踩坑日志
项目:zilliztech/memsearch
摘要:发现 23 个潜在踩坑项,其中 6 个为 high/blocking;最高优先级:安装坑 - 来源证据:MilvusStore.upsert() reports success but writes are not durable on remote Milvus 2.5+ (missing flush)。
1. 安装坑 · 来源证据:MilvusStore.upsert() reports success but writes are not durable on remote Milvus 2.5+ (missing flush)
- 严重度:high
- 证据强度:source_linked
- 发现:GitHub 社区证据显示该项目存在一个安装相关的待验证问题:MilvusStore.upsert() reports success but writes are not durable on remote Milvus 2.5+ (missing flush)
- 对用户的影响:可能增加新用户试用和生产接入成本。
- 建议检查:来源问题仍为 open,Pack Agent 需要复核是否仍影响当前版本。
- 防护动作:不得脱离来源链接放大为确定性结论;需要标注适用版本和复核状态。
- 证据:community_evidence:github | cevd_e448ba5c18f74fbcac5193643cf9bf00 | https://github.com/zilliztech/memsearch/issues/534 | 来源讨论提到 python 相关条件,需在安装/试用前复核。
2. 安装坑 · 来源证据:OpenCode plugin installation silently fails
- 严重度:high
- 证据强度:source_linked
- 发现:GitHub 社区证据显示该项目存在一个安装相关的待验证问题:OpenCode plugin installation silently fails
- 对用户的影响:可能增加新用户试用和生产接入成本。
- 建议检查:来源问题仍为 open,Pack Agent 需要复核是否仍影响当前版本。
- 防护动作:不得脱离来源链接放大为确定性结论;需要标注适用版本和复核状态。
- 证据:community_evidence:github | cevd_6a8adfef7558499e973bb2775db7368a | https://github.com/zilliztech/memsearch/issues/552 | 来源讨论提到 python 相关条件,需在安装/试用前复核。
3. 安装坑 · 来源证据:Stop hook's `claude -p` summarize call fires SessionStart, polluting daily logs and leaking to nested directories
- 严重度:high
- 证据强度:source_linked
- 发现:GitHub 社区证据显示该项目存在一个安装相关的待验证问题:Stop hook's
claude -psummarize call fires SessionStart, polluting daily logs and leaking to nested directories - 对用户的影响:可能增加新用户试用和生产接入成本。
- 建议检查:来源问题仍为 open,Pack Agent 需要复核是否仍影响当前版本。
- 防护动作:不得脱离来源链接放大为确定性结论;需要标注适用版本和复核状态。
- 证据:community_evidence:github | cevd_f7c0535d74d940bba792903b440f1808 | https://github.com/zilliztech/memsearch/issues/520 | 来源类型 github_issue 暴露的待验证使用条件。
4. 安全/权限坑 · 来源证据:Enhance robustness of memory search with jieba-next CJK tokenizer and native Markdown parsing
- 严重度:high
- 证据强度:source_linked
- 发现:GitHub 社区证据显示该项目存在一个安全/权限相关的待验证问题:Enhance robustness of memory search with jieba-next CJK tokenizer and native Markdown parsing
- 对用户的影响:可能影响授权、密钥配置或安全边界。
- 建议检查:来源问题仍为 open,Pack Agent 需要复核是否仍影响当前版本。
- 防护动作:不得脱离来源链接放大为确定性结论;需要标注适用版本和复核状态。
- 证据:community_evidence:github | cevd_bcaeec224c444d9484142ebf19f6ecc8 | https://github.com/zilliztech/memsearch/issues/102 | 来源讨论提到 python 相关条件,需在安装/试用前复核。
5. 安全/权限坑 · 来源证据:Indexing leaks ~9 MB anon-rss per chunk in single process; OOM-kills mid-corpus on 15 GB host
- 严重度:high
- 证据强度:source_linked
- 发现:GitHub 社区证据显示该项目存在一个安全/权限相关的待验证问题:Indexing leaks ~9 MB anon-rss per chunk in single process; OOM-kills mid-corpus on 15 GB host
- 对用户的影响:可能影响授权、密钥配置或安全边界。
- 建议检查:来源问题仍为 open,Pack Agent 需要复核是否仍影响当前版本。
- 防护动作:不得脱离来源链接放大为确定性结论;需要标注适用版本和复核状态。
- 证据:community_evidence:github | cevd_b8e6b6226cfa4953ab4ffffc71e575e8 | https://github.com/zilliztech/memsearch/issues/533 | 来源讨论提到 python 相关条件,需在安装/试用前复核。
6. 安全/权限坑 · 来源证据:Stop hook writes Anthropic API rate-limit error string as memory summary content
- 严重度:high
- 证据强度:source_linked
- 发现:GitHub 社区证据显示该项目存在一个安全/权限相关的待验证问题:Stop hook writes Anthropic API rate-limit error string as memory summary content
- 对用户的影响:可能影响授权、密钥配置或安全边界。
- 建议检查:来源问题仍为 open,Pack Agent 需要复核是否仍影响当前版本。
- 防护动作:不得脱离来源链接放大为确定性结论;需要标注适用版本和复核状态。
- 证据:community_evidence:github | cevd_05b51b5d9b1145fca49076b5f0a3e9d2 | https://github.com/zilliztech/memsearch/issues/527 | 来源讨论提到 macos 相关条件,需在安装/试用前复核。
7. 安装坑 · 来源证据:Codex plugin still uses deprecated features.codex_hooks instead of features.hooks
- 严重度:medium
- 证据强度:source_linked
- 发现:GitHub 社区证据显示该项目存在一个安装相关的待验证问题:Codex plugin still uses deprecated features.codex_hooks instead of features.hooks
- 对用户的影响:可能影响升级、迁移或版本选择。
- 建议检查:来源显示可能已有修复、规避或版本变化,说明书中必须标注适用版本。
- 防护动作:不得脱离来源链接放大为确定性结论;需要标注适用版本和复核状态。
- 证据:community_evidence:github | cevd_c7024063d9bc4202803e0629e7ba02bc | https://github.com/zilliztech/memsearch/issues/535 | 来源类型 github_issue 暴露的待验证使用条件。
8. 安装坑 · 来源证据:Pre-compaction transcript not captured by Stop hook?
- 严重度:medium
- 证据强度:source_linked
- 发现:GitHub 社区证据显示该项目存在一个安装相关的待验证问题:Pre-compaction transcript not captured by Stop hook?
- 对用户的影响:可能增加新用户试用和生产接入成本。
- 建议检查:来源问题仍为 open,Pack Agent 需要复核是否仍影响当前版本。
- 防护动作:不得脱离来源链接放大为确定性结论;需要标注适用版本和复核状态。
- 证据:community_evidence:github | cevd_9276552f302c48309d9a27db91487d0d | https://github.com/zilliztech/memsearch/issues/537 | 来源类型 github_issue 暴露的待验证使用条件。
9. 安装坑 · 来源证据:v0.3.1
- 严重度:medium
- 证据强度:source_linked
- 发现:GitHub 社区证据显示该项目存在一个安装相关的待验证问题:v0.3.1
- 对用户的影响:可能增加新用户试用和生产接入成本。
- 建议检查:来源显示可能已有修复、规避或版本变化,说明书中必须标注适用版本。
- 防护动作:不得脱离来源链接放大为确定性结论;需要标注适用版本和复核状态。
- 证据:community_evidence:github | cevd_231ab841119e432ca1bf0cd072ff5b6a | https://github.com/zilliztech/memsearch/releases/tag/v0.3.1 | 来源类型 github_release 暴露的待验证使用条件。
10. 安装坑 · 来源证据:v0.4.2
- 严重度:medium
- 证据强度:source_linked
- 发现:GitHub 社区证据显示该项目存在一个安装相关的待验证问题:v0.4.2
- 对用户的影响:可能增加新用户试用和生产接入成本。
- 建议检查:来源显示可能已有修复、规避或版本变化,说明书中必须标注适用版本。
- 防护动作:不得脱离来源链接放大为确定性结论;需要标注适用版本和复核状态。
- 证据:community_evidence:github | cevd_0803c1e9097f43d8800b01f21f8a9c5a | https://github.com/zilliztech/memsearch/releases/tag/v0.4.2 | 来源类型 github_release 暴露的待验证使用条件。
11. 配置坑 · 可能修改宿主 AI 配置
- 严重度:medium
- 证据强度:source_linked
- 发现:项目面向 Claude/Cursor/Codex/Gemini/OpenCode 等宿主,或安装命令涉及用户配置目录。
- 对用户的影响:安装可能改变本机 AI 工具行为,用户需要知道写入位置和回滚方法。
- 建议检查:列出会写入的配置文件、目录和卸载/回滚步骤。
- 防护动作:涉及宿主配置目录时必须给回滚路径,不能只给安装命令。
- 证据:capability.host_targets | github_repo:1153190876 | https://github.com/zilliztech/memsearch | host_targets=claude, claude_code
12. 配置坑 · 来源证据:CLI search fails on Milvus Lite: collection in 'released' state
- 严重度:medium
- 证据强度:source_linked
- 发现:GitHub 社区证据显示该项目存在一个配置相关的待验证问题:CLI search fails on Milvus Lite: collection in 'released' state
- 对用户的影响:可能增加新用户试用和生产接入成本。
- 建议检查:来源问题仍为 open,Pack Agent 需要复核是否仍影响当前版本。
- 防护动作:不得脱离来源链接放大为确定性结论;需要标注适用版本和复核状态。
- 证据:community_evidence:github | cevd_5b382c2552e449c698d3757e72374f04 | https://github.com/zilliztech/memsearch/issues/540 | 来源讨论提到 python 相关条件,需在安装/试用前复核。
13. 配置坑 · 来源证据:duplicate primary keys are not allowed in the same batch: invalid parameter
- 严重度:medium
- 证据强度:source_linked
- 发现:GitHub 社区证据显示该项目存在一个配置相关的待验证问题:duplicate primary keys are not allowed in the same batch: invalid parameter
- 对用户的影响:可能增加新用户试用和生产接入成本。
- 建议检查:来源显示可能已有修复、规避或版本变化,说明书中必须标注适用版本。
- 防护动作:不得脱离来源链接放大为确定性结论;需要标注适用版本和复核状态。
- 证据:community_evidence:github | cevd_21c6616f42744bc89c90a6676994c526 | https://github.com/zilliztech/memsearch/issues/539 | 来源讨论提到 python 相关条件,需在安装/试用前复核。
14. 配置坑 · 来源证据:v0.4.0
- 严重度:medium
- 证据强度:source_linked
- 发现:GitHub 社区证据显示该项目存在一个配置相关的待验证问题:v0.4.0
- 对用户的影响:可能增加新用户试用和生产接入成本。
- 建议检查:来源显示可能已有修复、规避或版本变化,说明书中必须标注适用版本。
- 防护动作:不得脱离来源链接放大为确定性结论;需要标注适用版本和复核状态。
- 证据:community_evidence:github | cevd_a69a50a3b98b49b3a51e42111ca0fbf4 | https://github.com/zilliztech/memsearch/releases/tag/v0.4.0 | 来源讨论提到 windows 相关条件,需在安装/试用前复核。
15. 能力坑 · 来源证据:v0.3.0
- 严重度:medium
- 证据强度:source_linked
- 发现:GitHub 社区证据显示该项目存在一个能力理解相关的待验证问题:v0.3.0
- 对用户的影响:可能增加新用户试用和生产接入成本。
- 建议检查:来源显示可能已有修复、规避或版本变化,说明书中必须标注适用版本。
- 防护动作:不得脱离来源链接放大为确定性结论;需要标注适用版本和复核状态。
- 证据:community_evidence:github | cevd_7f7c966472bb4808a44bffed6062776f | https://github.com/zilliztech/memsearch/releases/tag/v0.3.0 | 来源类型 github_release 暴露的待验证使用条件。
16. 能力坑 · 能力判断依赖假设
- 严重度:medium
- 证据强度:source_linked
- 发现:README/documentation is current enough for a first validation pass.
- 对用户的影响:假设不成立时,用户拿不到承诺的能力。
- 建议检查:将假设转成下游验证清单。
- 防护动作:假设必须转成验证项;没有验证结果前不能写成事实。
- 证据:capability.assumptions | github_repo:1153190876 | https://github.com/zilliztech/memsearch | README/documentation is current enough for a first validation pass.
17. 维护坑 · 维护活跃度未知
- 严重度:medium
- 证据强度:source_linked
- 发现:未记录 last_activity_observed。
- 对用户的影响:新项目、停更项目和活跃项目会被混在一起,推荐信任度下降。
- 建议检查:补 GitHub 最近 commit、release、issue/PR 响应信号。
- 防护动作:维护活跃度未知时,推荐强度不能标为高信任。
- 证据:evidence.maintainer_signals | github_repo:1153190876 | https://github.com/zilliztech/memsearch | last_activity_observed missing
18. 安全/权限坑 · 下游验证发现风险项
- 严重度:medium
- 证据强度:source_linked
- 发现:no_demo
- 对用户的影响:下游已经要求复核,不能在页面中弱化。
- 建议检查:进入安全/权限治理复核队列。
- 防护动作:下游风险存在时必须保持 review/recommendation 降级。
- 证据:downstream_validation.risk_items | github_repo:1153190876 | https://github.com/zilliztech/memsearch | no_demo; severity=medium
19. 安全/权限坑 · 存在评分风险
- 严重度:medium
- 证据强度:source_linked
- 发现:no_demo
- 对用户的影响:风险会影响是否适合普通用户安装。
- 建议检查:把风险写入边界卡,并确认是否需要人工复核。
- 防护动作:评分风险必须进入边界卡,不能只作为内部分数。
- 证据:risks.scoring_risks | github_repo:1153190876 | https://github.com/zilliztech/memsearch | no_demo; severity=medium
20. 安全/权限坑 · 来源证据:memsearch stats shows 0 chunks when collection name is only set in config file
- 严重度:medium
- 证据强度:source_linked
- 发现:GitHub 社区证据显示该项目存在一个安全/权限相关的待验证问题:memsearch stats shows 0 chunks when collection name is only set in config file
- 对用户的影响:可能影响授权、密钥配置或安全边界。
- 建议检查:来源问题仍为 open,Pack Agent 需要复核是否仍影响当前版本。
- 防护动作:不得脱离来源链接放大为确定性结论;需要标注适用版本和复核状态。
- 证据:community_evidence:github | cevd_d0384d88066d481c99825331e5666168 | https://github.com/zilliztech/memsearch/issues/538 | 来源讨论提到 windows 相关条件,需在安装/试用前复核。
21. 安全/权限坑 · 来源证据:v0.4.1
- 严重度:medium
- 证据强度:source_linked
- 发现:GitHub 社区证据显示该项目存在一个安全/权限相关的待验证问题:v0.4.1
- 对用户的影响:可能增加新用户试用和生产接入成本。
- 建议检查:来源显示可能已有修复、规避或版本变化,说明书中必须标注适用版本。
- 防护动作:不得脱离来源链接放大为确定性结论;需要标注适用版本和复核状态。
- 证据:community_evidence:github | cevd_9f2b7289dff6472c91ca7c8570297cfb | https://github.com/zilliztech/memsearch/releases/tag/v0.4.1 | 来源类型 github_release 暴露的待验证使用条件。
22. 维护坑 · issue/PR 响应质量未知
- 严重度:low
- 证据强度:source_linked
- 发现:issue_or_pr_quality=unknown。
- 对用户的影响:用户无法判断遇到问题后是否有人维护。
- 建议检查:抽样最近 issue/PR,判断是否长期无人处理。
- 防护动作:issue/PR 响应未知时,必须提示维护风险。
- 证据:evidence.maintainer_signals | github_repo:1153190876 | https://github.com/zilliztech/memsearch | issue_or_pr_quality=unknown
23. 维护坑 · 发布节奏不明确
- 严重度:low
- 证据强度:source_linked
- 发现:release_recency=unknown。
- 对用户的影响:安装命令和文档可能落后于代码,用户踩坑概率升高。
- 建议检查:确认最近 release/tag 和 README 安装命令是否一致。
- 防护动作:发布节奏未知或过期时,安装说明必须标注可能漂移。
- 证据:evidence.maintainer_signals | github_repo:1153190876 | https://github.com/zilliztech/memsearch | release_recency=unknown
来源:Doramagic 发现、验证与编译记录