Skip to content

[Feature] 增加可选 Embedding Cache,减少重复生成 Embedding #1631

Description

@gordonlu

问题描述

当前文档 re-index 流程会删除原有 chunk 后重新切分并生成 embedding。

当文档仅发生少量修改时,大量 chunk 内容实际上没有变化,但仍会重复调用 Embedding API。

此外,不同文档中也可能存在相同内容(如企业制度、条款引用、产品说明等),当前会分别生成 embedding,无法复用已有结果。

例如:

  • 文档共 200 个 chunk
  • 修改内容仅影响其中 10 个 chunk
  • 其余 190 个 chunk 内容保持不变

当前仍会对全部 200 个 chunk 重新生成 embedding。

这会带来:

  • 不必要的 Embedding API 成本
  • 更长的索引耗时
  • 更高的限流风险

方案建议

增加可选的 Embedding Cache。

(content_hash, model_id, dimensions) 作为唯一键缓存 embedding 结果。

索引流程:

Chunk → 计算 Hash → 查询 Cache
                    Hit  → 直接复用向量
                    Miss → 调用 Embedding API → 写入 Cache

通过配置项控制开关,默认关闭,不影响现有行为。

预期收益

  • 避免对相同内容重复生成 embedding
  • 减少 Embedding API 调用成本
  • 对现有检索逻辑透明
  • 对首次索引场景无副作用

收益主要来自:

  • 文档 re-index 时未变化 chunk 的复用
  • 跨文档重复内容的复用

非目标

本提案不包含:

  • 增量 ingestion 系统
  • chunk diff 检测
  • cache 淘汰策略(LRU 等)
  • singleflight 请求合并
  • 不同 embedding model 之间的向量复用

实现方向

可增加独立的 embedding cache 存储层,在 embedding 生成流程中优先进行 cache lookup,命中时直接复用已有向量,未命中时生成并写入缓存。

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type
    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions