-
Notifications
You must be signed in to change notification settings - Fork 317
Description
Your Question
大佬你好,我基于 OpenViking 在一个飞书 Bot 项目里集成了语义记忆功能,用了 Doubao embedding +
DeepSeek VLM + Stop Hook 架构。全程 vibe coding 摸索了一轮,15 个 commit
总算把基本链路跑通了,但说实话现在心里很虚——不知道怎样才算"构建成功"。
想请教几个核心问题:
- 怎样验证记忆系统真正在工作?
目前我的验证手段只有:
- client.find(query=..., target_uri="viking://resources/") 能返回结果且 score > 0.4
- 索引脚本跑完没报错
- E2E 测试 ingest-stop → recall 能跑通
但我不确定:
- L0/L1 摘要是否生成成功? auto_generate_l0=True, auto_generate_l1=True 配了,但怎么验证某个文件确实有 L0/L1
被提取出来了?在哪里能看到? - session.commit() 后的长期记忆提取是否成功? 每 5 轮对话自动 commit,VLM 应该提取 6 类记忆(profile,
preferences, entities, events, cases,
patterns),但我不知道怎么确认提取确实发生了、提取质量如何。viking://user/memories/ 下应该有东西,但目前
client.ls("viking://user/memories/") 返回空。
有没有一个"健康检查清单"? 比如:索引 N 个文件后,应该在 viking:// 下看到哪些路径有数据?
- AGFS 端口 1833 的单实例限制
实际遇到的问题:
- MCP server(通过 .mcp.json 启动)启动时占用 1833
- Stop Hook 调用 ov_memory.py 时也需要初始化 SyncOpenViking,又要启动 AGFS
- 两者互斥,导致 Stop Hook 在 MCP server 运行期间会失败
- 更麻烦的是进程退出后端口经常处于 CLOSE_WAIT 状态,需要手动 kill 孤儿进程
这个单实例限制是设计如此还是有解法?examples/claude-memory-plugin 里的方案是优先走 HTTP server,local 作为
fallback——这是推荐的生产用法吗?
- 日志输出到 stdout 的问题
make_config() 里设了 log_level="WARNING",但 SyncOpenViking 初始化时仍然有大量 INFO 级别日志输出到
stdout(AGFS 启动、collection 加载、transaction manager 等),和我的 JSON 输出混在一起,导致调用方解析失败。
我目前的 workaround 是用 grep '^{' | tail -1 过滤。有没有正确的方式抑制这些日志?
- Candidate data is None 警告
从 Ollama bge-m3(1024维)迁移到 Doubao embedding(也是1024维)后,每次 find() 调用都会打出大量 Candidate
data is None for label index N 的 WARNING。我猜测是旧索引残留数据和新 embedding 空间不兼容,但:
- 这个警告的实际影响是什么?会影响搜索质量吗?
- 全量 re-index 后会消失吗?
- 正确的 embedding 迁移流程是什么?我目前的做法是直接删除 vectordb/ 目录然后重新跑
index_kb.py,不知道是否遗漏了什么。
- examples/claude-memory-plugin 和 MCP server 的关系
项目里有两种集成方式:
- MCP server(openviking_mcp_server.py):通过 Claude Code 的 MCP 协议暴露 search/add_memory/ls 工具
- claude-memory-plugin(examples/claude-memory-plugin/):通过 4 个 Hook + recall skill 实现完整生命周期
我目前是混合使用:MCP server 提供搜索能力 + Stop Hook 做对话捕获(参考了 plugin 的 ov_memory.py)。但不确定:
- 这两种方式是否打算共存?还是 plugin 会替代 MCP server?
- 对于飞书 Bot 这种"每条消息 spawn 一次 Claude CLI"的短进程场景,推荐哪种方式?
我的构建背景
Tech Stack:
- Embedding: Volcengine Doubao (doubao-embedding-vision-251215, 1024dim)
- VLM: DeepSeek v3.1 via enterprise proxy
- Storage: local (SyncOpenViking, AGFS on port 1833)
- Integration: Node.js 飞书 Bot → spawn Claude CLI → MCP server + Stop Hook
Done:
- 15 commits on memory/viking-v0 branch
- Embedding 从 Ollama bge-m3 迁移到 Doubao
- MCP tools 精简 5→3,Stop Hook 自动对话捕获
- 49 个 Python 单元测试 + 16 个 E2E 集成测试
- 单文件索引测试通过 (CLAUDE.md, search score=0.524)
Pain points:
- 不知道 L0/L1/L2 是否真的生成了
- AGFS 端口冲突和孤儿进程
- 日志污染 stdout
- embedding 迁移后大量 None candidate 警告
- session.commit() 后 viking://user/memories/ 为空
感谢!
Context
No response
Code Example (Optional)
Related Area
Installation / Setup
Before Asking
- I have checked the documentation
Metadata
Metadata
Assignees
Labels
Type
Projects
Status