Embedding向量化客户端
前六篇把 Chat 子系统从路由选择到流式路由全部讲完了。这一篇离开 Chat,进入 Embedding 子系统。
在 RAG 系统中,Embedding 的核心作用是把文本转换为向量。两个关键场景:文档入库时,对每个 Chunk 调用 Embedding API 生成向量,存入 Pgvector 或 Milvus 这类向量数据库;用户提问时,对 Query 调用 Embedding API 生成向量,用于在向量数据库中做相似度检索。没有 Embedding,RAG 的检索阶段就无从谈起。
从架构上看,Embedding 子系统和 Chat 子系统遵循同样的三层设计——业务层接口、路由服务、供应商客户端——复用同一套路由和熔断机制。但实现上简单不少:Embedding 只有同步调用,没有流式,不需要 StreamCallback、首包探测那套复杂机制。路由层直接用第三篇讲的 executeWithFallback 就够了。
另一个简化来自协议层面。Ollama 现在通过 OpenAI 兼容模式暴露 /v1/embeddings 端点,和硅基流动走的是同一套 OpenAI 风格协议。于是 Embedding 子系统可以像 Chat 一样抽出一个模板方法基类 AbstractOpenAIStyleEmbeddingClient,把请求构建、HTTP 调用、响应解析全部封装起来。两个供应商实现各自只剩十几二十行代码,通过钩子方法微调差异点。这篇就围绕这个基类展开。