Eino 中的Embedding 组件负责将上游DocumentTransformer处理好的Document文件进行向量化, 并由下游的Indexer存储到向量数据库中。
- Embedding在 RAG 工作流中的位置:
Loader → Transformer → Embedding → Indexer → Retriever → ChatModel
Indexer 把 Embedding 生成的向量写进 Redis 向量索引。
Retriever 用同一份 Embedder 把用户 query 转向量后做近似搜索
接口定义:
type Embedder interface {
EmbedStrings(ctx context.Context, texts []string, opts ...Option) ([][]float64, error) // invoke
}
// 输入:一批文本
// 输出:[][]float64,每个元素即对应文本的向量
- 维度 由具体实现决定(如 Ark 1024、OpenAI 1536)。
- 并发 & 批处理 由实现内部自动完成,调用方无感知。
- 回调 统一用 embedding.Callback 记录 Token 用量、耗时等性能指标
官方已提供的embedding组件实现(eino-ext), 均需要依赖第三方的向量模型, 如Ark, 即依赖doubao-embedding-text-240715向量模型
实现 | 包路径 | 关键配置示例 |
---|---|---|
OpenAI | eino-ext/components/embedding/openai |
APIKey , Model=text-embedding-3-large
|
Ark(字节跳动) | eino-ext/components/embedding/ark |
BaseURL , APIKey , Model=ep-2024xxxx
|
腾讯云混元 | eino-ext/components/embedding/tencentcloud |
SecretID , SecretKey , Model=hunyuan-embedding
|
官方Ark Embedding 实现:
代码略......(主要基于ARK的SDK进行接口调用)
最小可运行示例:
package main
import (
"context"
"fmt"
"github.com/cloudwego/eino-ext/components/embedding/ark"
"github.com/cloudwego/eino/components/embedding"
"os"
)
func main() {
ctx := context.Background()
eb, err := newEmbedding(ctx)
if err != nil {
panic(err)
}
vecs, err := eb.EmbedStrings(ctx, []string{"Eino 是什么?"})
if err != nil {
panic(err)
}
fmt.Println(vecs[0][:5]) // [0.0112 -0.0087 ...]
}
func newEmbedding(ctx context.Context) (eb embedding.Embedder, err error) {
// TODO Modify component configuration here.
config := &ark.EmbeddingConfig{
BaseURL: "https://ark.cn-beijing.volces.com/api/v3",
APIKey: os.Getenv("ARK_API_KEY"),
Model: os.Getenv("ARK_EMBEDDING_MODEL"),
}
eb, err = ark.NewEmbedder(ctx, config)
if err != nil {
return nil, err
}
return eb, nil
}
示例转换为向量内容:
image.png