Go语言不内置文本Embedding功能,实用方案依赖OpenAI/Ollama等外部服务或CGO调用;纯Go实现因算子缺失、权重加载难、性能差而不可行。

Go 语言本身不提供文本 Embedding 生成功能,没有内置的 text-embedding 模型或 API;所有实用方案都依赖外部服务(如 OpenAI、Ollama、本地 ONNX 模型)或通过 CGO 调用 C/C++ 推理库——直接用纯 Go 实现高质量文本向量生成目前不可行。
调用 OpenAI / Azure OpenAI 的 embeddings API 最简单可靠
这是绝大多数 Go 项目实际采用的方式:避开模型训练/部署复杂度,专注业务逻辑。关键点不是“怎么算”,而是“怎么安全高效地发请求”。
- 必须用
POST https://api.openai.com/v1/embeddings(注意路径不是/v1/chat/completions) - 请求体是 JSON:
{"model": "text-embedding-3-small", "input": ["hello world"]},input支持单字符串或字符串切片(批量请求省 token 和延迟) - 响应中向量在
response.Data[0].Embedding,类型是[]float64,长度由模型决定(如text-embedding-3-small是 1536 维) - 别硬编码
Authorization: Bearer xxx,用os.Getenv("OPENAI_API_KEY")+http.DefaultClient设置超时(建议10 * time.Second)
用 Ollama 在本地跑 all-minilm 类小模型(免 API Key)
适合离线环境或敏感文本,但需提前安装 Ollama 并拉取模型:ollama pull mxbai-embed-large 或 all-minilm。Go 侧只是 HTTP 客户端。
使用 uber-go/dig 在 Golang 中实现依赖注入——基于反射容器,提供 Provide/Invoke、dig.In/dig.Out 参数与结果对象,支持命名依赖等
- Ollama Embedding API 路径是
POST http://localhost:11434/api/embeddings - 请求体为:
{"model": "mxbai-embed-large", "prompt": "your text here"}(注意字段名是prompt,不是input) - 响应结构不同:向量在
response.Embedding,且返回的是[]float64,不是嵌套数组 - Ollama 默认只支持单文本,批量需循环调用;而内存占用比 OpenAI SDK 低,适合边缘设备
为什么别碰纯 Go 实现的 Embedding 模型(如 onnx-go、gorgonia)
现有 Go 生态中没有成熟、可直接加载 HuggingFace .bin 或 .onnx 并推理的文本 Embedding 库。尝试会立刻撞上三个硬伤:
立即学习“go语言免费学习笔记(深入)”;
-
onnx-go不支持Attention、LayerNorm等 Transformer 核心算子,加载all-minilm直接 panic -
gorgonia缺少预训练权重加载能力,你得自己解析 PyTorch bin 文件并手动映射参数——这已超出 Go 工程范畴 - 即使勉强跑通,CPU 推理速度比 Python+ONNX Runtime 慢 3–5 倍,且无量化支持,1536 维向量单次耗时常超 2s
真正卡点不在代码怎么写,而在选型时是否意识到:Embedding 是计算密集型任务,Go 的优势是并发调度和 HTTP 客户端,不是数值计算。把向量生成交给专用服务,用 Go 做 glue layer,才是稳定落地的路径。

















