Files
SuperBizAgent-java/interview/archive/2026-07-24-legacy/rag-vectorstore-interview-notes.md
T
zhuyongxin de5a5b09d9 docs(interview): refresh materials for single-agent harness narrative
Archive pre-refactor interview notes and add current deep-dives on
architecture evolution, issue-derived stories, and evidence gates.
2026-07-24 18:14:49 +08:00

3.8 KiB
Raw Blame History

RAG VectorStore 面试要点

1. 60 秒讲法

我把 RAG 检索从 Milvus SDK-only 重构为 Spring AI VectorStore 主路径,同时保留 SDK fallback。
关键不是换了一个依赖,而是保留 VectorSearchService 作为边界,所以 lookup_knowledge 和 Agent workflow 不需要改。
现在支持 auto、spring-ai、sdk 三种模式。auto 会优先尝试 VectorStore,失败后 fallback 到 SDK。

现场验证时,第一次发现 VectorStore 指向了错误 collection:business_knowledge,而实际 Zilliz collection 是 biz。fallback 生效,所以系统仍能通过 SDK 返回结果。修正 collection 后,同一个 query 成功走 Spring AI VectorStore。

2. 架构回答

Agent / API
  -> lookup_knowledge or /api/search/similar
      -> VectorSearchService
          -> Spring AI VectorStore
          -> Milvus SDK fallback
              -> Milvus/Zilliz collection: biz

关键设计:VectorSearchService 是检索门面,避免 Spring AI 或 SDK 细节扩散到 Agent 工具层。

3. 为什么保留 SDK

  • 迁移安全:原 SDK 路径已验证可用。
  • 运行韧性:VectorStore schema、filter 或配置失败时,检索仍可用。
  • Demo 稳定:检索抽象变化不应该破坏主诊断演示。

这在实际验证中发挥了作用:VectorStore 配置错时,auto 模式 fallback 到 SDK,API 没有失败。

4. 为什么引入 Spring AI VectorStore

使用 VectorStore 可以让项目更接近标准 RAG 抽象:

  • 业务代码不再持有全部 Milvus search 细节。
  • 后续 QueryTransformer、DocumentPostProcessor、Retriever 等能力更容易接入。
  • 面试中也更容易解释和 Spring AI 生态的关系。

但我没有一次性迁移写入,因为读写同时迁移会让问题难定位。当前先稳定读路径。

5. 为什么保留 L0

L0 现在不是最终答案来源,而是确定性 hint 层:

  • 提取 domain/entity。
  • 在可能时生成 category filter。
  • 给 trace 提供解释信号。

当前职责:

L0 = domain/entity hint
L1 = semantic retrieval through VectorStore/SDK
postprocess = evidence trace + relevance normalization

真实故障诊断里有很多精确标识,完全只靠向量检索并不稳。

6. 为什么不用隐藏 Advisor

lookup_knowledge 保持显式工具,因为:

  • Trace 要展示什么时候检索。
  • tool_invocation 要记录输入、输出预览、相关性和 metadata。
  • 面试故事是可审计 Agent 执行,而不只是答案质量。

Advisor 后续可以接入,但需要先解决可观测性。

7. 分数设计

当前结果故意拆成:

score      -> 兼容旧 relevance normalization 的分数
rawScore   -> 当前检索实现原始分数
scoreLabel -> rawScore 的语义

SDK:

score = L2 distance
rawScore = L2 distance
scoreLabel = l2_distance

VectorStore:

score = metadata.distance if present
rawScore = Spring AI document score
scoreLabel = similarity

这样避免把 similarity 当成 L2 distance 的隐蔽 bug。

8. 如何证明 VectorStore 被使用

  • 日志出现 Starting Spring AI VectorStore search 和 Spring AI VectorStore search complete。
  • API 响应中 scoreLabel=similarity。
  • rawScore 是 Spring AI similarity,score 仍是兼容 distance。

9. 常见追问

为什么不删 SDK?

这是迁移,不是重写。fallback 提供回滚安全,并且已经证明配置错误时仍能保证主链路可用。

lookup_knowledge 变了吗?

外部契约没变。它仍然调用 VectorSearchService.searchSimilarDocuments(...),变化在门面背后的实现。

这是完整 Spring AI RAG 了吗?

还不是。当前是 Spring AI VectorStore 读路径 + 显式工具 + 自定义 evidence trace + SDK 写入。这样做是为了保留审计能力和分阶段迁移安全。