跳到主要内容
极客日志极客日志面向AI+效率的开发者社区
首页博客我的书AI学习GitHub 精选镜像AI 生图工具UI配色美学关于
搜索内容 / 工具 / 仓库 / 镜像...⌘K搜索
注册
博客列表
Go / GolangAI算法

Eino Embedding 组件详解:从文本向量化到 RAG 应用

Embedding 是将文本转换为向量表示的技术,使程序能按语义理解文本而非仅做字符串匹配。 Eino 框架中 Embedding 组件的核心用法,包括初始化 embedder、调用 EmbedStrings 生成向量、通过 Option 动态调整参数、结合 Chain 与 Graph 进行编排以及使用 Callback 监控流程。重点阐述了其在 RAG 知识库问答中的实际应用,涵盖文本切块、向量生成、存储检索及最终由大模型回答的完整链路。掌握 Embedding 不仅是学会调用接口,更是构建语义检索与智能问答系统的基础。

lzdxwyh发布于 2026/4/11更新于 2026/10/15119 浏览
Eino Embedding 组件详解:从文本向量化到 RAG 应用

Embedding 组件详解

说到 Embedding,本质上就是把文本变成一串数字向量,让程序能'按语义理解文本',而不只是按字符串匹配。

你可以把它理解成:

  • 原始文本:"今天天气不错"
  • 转成向量后:[0.12, -0.87, 0.44, ...]

这串向量人看不太懂,但机器可以拿它来算'两个文本像不像'。

它能做什么?

平时大家会用到的地方,最常见就是这几类:

1. 文本相似度计算 比如:

  • '怎么退款'
  • '我要申请退钱'

虽然字不一样,但意思接近。Embedding 后,这两句话的向量距离会比较近,系统就知道它们语义相似。

2. 语义搜索 这也是最常见的用途。比如你有很多文档、知识库、FAQ,用户问:

  • '怎么修改收货地址'

系统不是只搜关键词'修改''地址',而是把这个问题也做成向量,然后去找语义最接近的文档片段。这样即使文档里写的是'变更配送地址',也能搜出来。

3. RAG / 知识库问答 这类项目里 Embedding 基本是核心组件之一了。流程通常是:

  • 先把知识库里的文本切块
  • 然后为每个文本块生成 embedding
  • 存到向量库里
  • 用户提问时,也生成一个 embedding
  • 去向量库里找最相关的内容
  • 再把找到的内容喂给大模型回答

也就是说,它是'先找资料'这一步的关键。

4. 文本聚类 / 分类 / 去重 比如你有很多评论、工单、反馈,可以用 embedding 做:

  • 相似工单归类
  • 重复问题合并
  • 用户反馈主题聚类

它不能直接干嘛?

它不是直接拿来生成回答的。它更像一个'文本编码器'或者'语义检索工具'。

也就是:

  • LLM:负责生成、总结、对话
  • Embedding:负责把文本映射到语义空间,方便检索、匹配、聚类

基础用法

接下来,我先说下基础语法。

EmbedStrings(ctx, texts []string, opts ...Option)([][]float64, error)

意思就是:

  • 输入:多段文本
  • 输出:每段文本对应的一个向量

例如:

texts := []string{"hello", "how are you"}
vectors, err := embedder.EmbedStrings(ctx, texts)

返回的 vectors 就是两段文本的向量表示。后面你可以拿这些向量去做相似度比较、存入向量数据库、召回相关知识片段或聚类分析。

实战用法

它的使用可以分成两层来看:一是直接给几段文本生成向量,二是配合检索、向量库、RAG 一起用。我直接教你上手怎么写。

一、最基本用法:直接调用 EmbedStrings

本质核心就这几步:

1. 创建 embedder
import (
    "github.com/cloudwego/eino-ext/components/embedding/openai"
)

// 这个导入的包,是兼容 openai 的。如果你要用豆包,可以专门调用 embedding/ark 这个包。
embedder, err := openai.NewEmbedder(ctx, &openai.EmbeddingConfig{
    APIKey:   accessKey,
    Model:    "text-embedding-3-large",
    Dimensions: &defaultDim,
    Timeout:  0,
})
if err != nil {
    panic(err)
}

这里的作用是初始化一个'文本转向量'的对象。

几个关键参数:

  • APIKey:调用模型服务的密钥
  • Model:选哪个 embedding 模型
  • Dimensions:向量维度
  • Timeout:超时时间
2. 调用 EmbedStrings
texts := []string{"hello", "how are you"}
vectors, err := embedder.EmbedStrings(ctx, texts)
if err != nil {
    panic(err)
}

这一步做完后:

  • texts[0] 对应 vectors[0]
  • texts[1] 对应 vectors[1]

也就是说,输入几段文本,输出几组向量。

3. 向量拿来干嘛

生成出来的 vectors 一般不会直接打印给用户看,而是继续做下面这些事:

  • 存到向量数据库
  • 跟别的向量算相似度
  • 做召回
  • 做聚类
  • 做去重
二、完整 demo

你可以把它理解成一个普通组件,哪里需要文本转向量,哪里调用。

package main

import (
    "context"
    "fmt"
    "log"

    "github.com/cloudwego/eino-ext/components/embedding/openai"
)

func main() {
    ctx := context.Background()
    defaultDim := 3072
    accessKey := "your-api-key"

    embedder, err := openai.NewEmbedder(ctx, &openai.EmbeddingConfig{
        APIKey:     accessKey,
        Model:      "text-embedding-3-large",
        Dimensions: &defaultDim,
        Timeout:    0,
    })
    if err != nil {
        log.Fatal(err)
    }

    texts := []string{"退款怎么申请", "如何进行退钱操作", "今天天气不错"}
    vectors, err := embedder.EmbedStrings(ctx, texts)
    if err != nil {
        log.Fatal(err)
    }

    fmt.Println("文本数量:", len(vectors))
    fmt.Println("第一条文本向量维度:", len(vectors[0]))
}

这就是最标准的'用'了!

三、带 Option 怎么用

公共 option 其实也挺有用的,比如 WithModel。

这表示你在调用时,可以临时覆盖模型参数。

vectors, err := embedder.EmbedStrings(ctx, texts, embedding.WithModel("text-embedding-3-small"))

大致意思就是:

  • embedder 初始化时有一个默认模型
  • 这次调用时,临时改成另一个模型

这个适合平时默认用大模型,某些场景为了省钱或提速,改用小模型。不过要注意,虽然向量在不同模型之间还是有一定的兼容性,但尽量不切换就不要切换,否则会影响效果。

四、在编排中怎么用

如果你不是手动一行一行写,而是用 Eino 的 Chain 或 Graph,就可以把 embedding 当成节点塞进去。

在 Chain 中使用

初次接触 chain 的话,你可以将其当成一条流水线。

chain := compose.NewChain[[]string, [][]float64]()
chain.AppendEmbedding(embedder)

意思是:

  • 输入:[]string
  • 输出:[][]float64

也就是整条链专门做'文本 -> 向量'。

在 Graph 中使用
graph := compose.NewGraph[[]string, [][]float64]()
graph.AddEmbeddingNode("embedding_node", embedder)

意思是把 embedding 作为图里的一个节点,后面可以接别的节点一起跑。

五、带 Callback 怎么用

这个一般用于记录日志、统计 token、监控调用过程或调试输入输出。

Callback 有点像给整个链路外挂了一层'生命周期中间件 / 钩子机制'。通常是定义 handler,然后通过 compose.WithCallbacks 传进去。

例如:

handler := &callbacksHelper.EmbeddingCallbackHandler{
    OnStart: func(ctx context.Context, runInfo *callbacks.RunInfo, input *embedding.CallbackInput) context.Context {
        log.Printf("开始 embedding,文本数:%d, 内容:%v\n", len(input.Texts), input.Texts)
        return ctx
    },
    OnEnd: func(ctx context.Context, runInfo *callbacks.RunInfo, output *embedding.CallbackOutput) context.Context {
        log.Printf("embedding 完成,生成向量数:%d\n", len(output.Embeddings))
        return ctx
    },
}

然后运行时:

callbackHandler := callbacksHelper.NewHandlerHelper().Embedding(handler).Handler()
runnable, _ := chain.Compile(ctx)
vectors, err := runnable.Invoke(ctx, []string{"hello", "how are you"}, compose.WithCallbacks(callbackHandler))

这样你就能看到输入了什么、什么时候开始、什么时候结束、输出了多少向量以及 token 消耗多少。

六、真实场景

真正业务里,embedding 很少是'调一下就结束'。我拿知识库问答给大家描绘一下整体流程。

场景:做知识库问答

第一步:把知识库切块 比如一篇文档切成很多段:

chunks := []string{
    "退款申请需要在订单完成后 7 天内提交",
    "修改收货地址请在发货前联系人工客服",
    "发票可在订单详情页申请",
}

第二步:给每个 chunk 生成向量

chunkVectors, err := embedder.EmbedStrings(ctx, chunks)

第三步:存起来 通常会存到向量数据库里,同时保存原文:

  • 文本内容
  • 对应向量
  • 文档来源
  • chunk id

第四步:用户提问时,也生成向量

query := []string{"订单下完以后地址还能改吗"}
queryVector, err := embedder.EmbedStrings(ctx, query)

第五步:拿 query 的向量去检索最相近的 chunk 找出最相似的几段知识。

第六步:把召回结果交给大模型回答 这才变成完整的 RAG。

七、语法总结
最小步骤
  1. 初始化 embedder
  2. 调 EmbedStrings
  3. 拿到 [][]float64
常见增强
  1. 用 Option 临时覆盖参数
  2. 用 Callback 打日志和监控
  3. 放进 Chain / Graph 编排
八、模板总结
package main

import (
    "context"
    "fmt"
    "log"

    "github.com/cloudwego/eino/components/embedding"
    embeddingOpenAI "github.com/cloudwego/eino-ext/components/embedding/openai"
)

func main() {
    ctx := context.Background()
    defaultDim := 3072 // 通常是定死的
    accessKey := "your-api-key"

    embedder, err := embeddingOpenAI.NewEmbedder(ctx, &embeddingOpenAI.EmbeddingConfig{
        APIKey:     accessKey,
        Model:      "text-embedding-3-large",
        Dimensions: &defaultDim,
        Timeout:    0,
    })
    if err != nil {
        log.Fatal(err)
    }

    texts := []string{"退款怎么申请", "如何退钱", "修改收货地址的方法"}
    vectors, err := embedder.EmbedStrings(
        ctx, texts,
        embedding.WithModel("text-embedding-3-small"),
    )
    if err != nil {
        log.Fatal(err)
    }

    fmt.Printf("生成了 %d 个向量\n", len(vectors))
    fmt.Printf("每个向量维度:%d\n", len(vectors[0]))
}
九、尾声

大家可以把它记成:

Embedding 的'用法'就是:先把文本喂进去生成向量,再把这个向量用于检索、匹配、聚类等后续处理。

相信大家看到这里,应该也明白了:'会调用 embedding'和'会用 embedding 做业务'是两回事。

前者很简单,就是:

  • NewEmbedder
  • EmbedStrings

后者才是完整链路,比如:

  • 文本切块
  • 向量生成
  • 向量存储
  • 相似检索
  • 大模型回答

目录

  1. Embedding 组件详解
  2. 它能做什么?
  3. 它不能直接干嘛?
  4. 基础用法
  5. 实战用法
  6. 一、最基本用法:直接调用 EmbedStrings
  7. 1. 创建 embedder
  8. 2. 调用 EmbedStrings
  9. 3. 向量拿来干嘛
  10. 二、完整 demo
  11. 三、带 Option 怎么用
  12. 四、在编排中怎么用
  13. 在 Chain 中使用
  14. 在 Graph 中使用
  15. 五、带 Callback 怎么用
  16. 六、真实场景
  17. 场景:做知识库问答
  18. 七、语法总结
  19. 最小步骤
  20. 常见增强
  21. 八、模板总结
  22. 九、尾声

更多推荐文章

查看全部
  • 2024 年 AI 大模型面试题集锦:大厂精选与答案全解析
  • 全平台开源 RSS 阅读器推荐
  • LLaMA-Factory 大语言模型微调框架详解与使用指南
  • 微软 Copilot Cowork 深度解析:使用 Kotlin 构建 AI Agent
  • Linux 下 WgCloud 服务器与客户端监控系统部署指南
  • AI 辅助诊断纳入医保支付的背景、意义与未来展望
  • 在本地跑起大模型:Ollama + Open WebUI 搭建记录
  • Moltbot 本地 AI 模型完全独立部署指南
  • Windows 安装 OpenClaw,配置 Qwen 及 Ollama 模型并接入飞书机器人
  • cann-recipes-train 解析:昇腾平台 DeepSeek-R1 与 Qwen2.5 强化学习实践
  • 清华大学发布仿生多模态触觉传感器 SuperTac,结合大模型实现类人感知
  • Blockly 可视化编程实现智能家居设备控制
  • Stable Diffusion 低成本部署与使用指南
  • C++ string 类常用成员函数与全局函数详解
  • HarmonyOS 网络请求实战:基于 Axios 的交互实现
  • RK3588 Linux 平台 ES8390 替换 ES8388 驱动移植实例
  • Xilinx Ultrascale+ FPGA XDMA 时序约束配置指南
  • OpenClaw 及 16 款 AI Agent 工具选型指南
  • 数据结构初阶:树的概念、术语及表示方法
  • Seedance 2.0 双分支扩散变换器架构解析与工程实现

相关免费在线工具

  • 加密/解密文本

    使用加密算法(如AES、TripleDES、Rabbit或RC4)加密和解密文本明文。 在线工具,加密/解密文本在线工具,online

  • RSA密钥对生成器

    生成新的随机RSA私钥和公钥pem证书。 在线工具,RSA密钥对生成器在线工具,online

  • Mermaid 预览与可视化编辑

    基于 Mermaid.js 实时预览流程图、时序图等图表,支持源码编辑与即时渲染。 在线工具,Mermaid 预览与可视化编辑在线工具,online

  • 随机西班牙地址生成器

    随机生成西班牙地址(支持马德里、加泰罗尼亚、安达卢西亚、瓦伦西亚筛选),支持数量快捷选择、显示全部与下载。 在线工具,随机西班牙地址生成器在线工具,online

  • Gemini 图片去水印

    基于开源反向 Alpha 混合算法去除 Gemini/Nano Banana 图片水印,支持批量处理与下载。 在线工具,Gemini 图片去水印在线工具,online

  • Base64 字符串编码/解码

    将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online