Skip to content

[Question]: 怎么才能验证构建成功了。 #286

@DamonDay

Description

@DamonDay

Your Question

大佬你好,我基于 OpenViking 在一个飞书 Bot 项目里集成了语义记忆功能,用了 Doubao embedding +
DeepSeek VLM + Stop Hook 架构。全程 vibe coding 摸索了一轮,15 个 commit
总算把基本链路跑通了,但说实话现在心里很虚——不知道怎样才算"构建成功"。

想请教几个核心问题:


  1. 怎样验证记忆系统真正在工作?

目前我的验证手段只有:

  • 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:// 下看到哪些路径有数据?


  1. 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——这是推荐的生产用法吗?


  1. 日志输出到 stdout 的问题

make_config() 里设了 log_level="WARNING",但 SyncOpenViking 初始化时仍然有大量 INFO 级别日志输出到
stdout(AGFS 启动、collection 加载、transaction manager 等),和我的 JSON 输出混在一起,导致调用方解析失败。

我目前的 workaround 是用 grep '^{' | tail -1 过滤。有没有正确的方式抑制这些日志?


  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,不知道是否遗漏了什么。

  1. 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

Metadata

Metadata

Assignees

No one assigned

    Labels

    questionFurther information is requested

    Type

    No type

    Projects

    Status

    Backlog

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions