Embedding 提供者抽象
Embedding Provider Abstraction
通过 Protocol 接口统一多种嵌入模型提供者,支持本地和远程 API 的即插即用切换
子问题
1.Dense vs Sparse 嵌入统一接口
2.多提供者切换
3.API 密钥与认证管理
4.本地模型跨实例内存共享(SPLADE 类级缓存)
5.OpenAI 兼容协议复用(Jina 通过 base_url 复用 OpenAI SDK)
6.BM25 自定义语料训练与内置编码器切换
各项目的解法1 solutions
Signals
横向对比
| 维度 | zvec |
|---|---|
| 接口定义 | @runtime_checkable Protocol[MD] 泛型,单方法 embed(),鸭子类型 |
| 提供者数量 | 5 家:OpenAI/Qwen/Jina/SentenceTransformer/BM25 |
| Dense-Sparse统一 | 双 Protocol 分离,Qwen 同时提供 Dense+Sparse 实现 |
| 依赖管理 | require_module 懒加载,按需导入,友好错误提示 |
| 缓存策略 | LRU 缓存 API 结果 + ClassVar 类级缓存本地模型 |
| 多模态支持 | 泛型 MD 支持 TEXT/IMAGE/AUDIO,当前仅 TEXT 有实现 |
| API兼容复用 | Jina 复用 OpenAI SDK 通过 base_url 切换端点 |
最佳实践
1.用 Protocol 而非 ABC 定义接口,允许鸭子类型
2.require_module 懒加载:延迟导入可选 SDK 并给出 pip install 提示
3.ClassVar 类级模型缓存:多实例共享同一本地模型减少内存
4.ClassVar 维度查表:_MODEL_DIMENSIONS 存储模型默认维度自动推断