Eino中的组件 - Embedding

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
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容