DashScope Embedding工具类详解(向量转换、Milvus知识库项目实战)

一、为什么需要Embedding?

在知识库项目中,Milvus 并不能直接存储和检索文本内容,而是需要先将文本转换成向量(Vector)。

例如:

复制代码
 新能源汽车
 动力电池
 电机控制系统

经过 Embedding 模型处理后:

复制代码
[
   0.123,
   -0.456,
   0.789,
...
]

这些向量会存入 Milvus,后续用户提问时再通过向量相似度检索相关知识。

本文使用阿里云 DashScope 的 text-embedding-v3 模型实现文本向量化。

二、工具类代码

python 复制代码
import os
from dotenv import load_dotenv
from dashscope import TextEmbedding

load_dotenv()

class EmbeddingUtil:

    api_key = os.getenv("DASHSCOPE_API_KEY")

    @staticmethod
    def embedding(text_list: list[str]):
        vectors = []

        # 🔥 分批(关键修复)
        batch_size = 10

        for i in range(0, len(text_list), batch_size):
            batch = text_list[i:i+batch_size]

            resp = TextEmbedding.call(
                model="text-embedding-v3",
                input=batch,
                api_key=EmbeddingUtil.api_key
            )

            if not resp or resp.status_code != 200:
                raise Exception(f"Embedding失败: {resp}")

            for item in resp.output["embeddings"]:
                vectors.append(item["embedding"])

        return vectors

三、代码解析

1. 加载环境变量
复制代码
load_dotenv()

项目根目录创建 .env 文件:

复制代码
DASHSCOPE_API_KEY=你的API_KEY

通过:

复制代码
os.getenv("DASHSCOPE_API_KEY")

读取 API Key。

2.定义 Embedding 工具类
复制代码
class EmbeddingUtil:

用于统一封装向量生成逻辑。

后续项目中只需要:

复制代码
EmbeddingUtil.embedding(texts)

即可获得向量结果

3. 定义静态方法
python 复制代码
@staticmethod
def embedding(text_list: list[str]):

参数:

python 复制代码
[
    "新能源汽车",
    "动力电池",
    "电机控制系统"
]

返回:

python 复制代码
[
    [0.12, 0.45, ...],
    [0.78, 0.91, ...],
    [0.34, 0.56, ...]
]
4. 分批处理
python 复制代码
batch_size = 10

如果一次性提交大量文本,可能出现:

  • 请求超时
  • 接口限流
  • 请求体过大

因此采用分批策略:

python 复制代码
for i in range(0, len(text_list), batch_size):

例如:

python 复制代码
len(text_list) = 25

将被拆分为:

python 复制代码
第1批:1~10
第2批:11~20
第3批:21~25
5. 调用 Embedding 模型
python 复制代码
resp = TextEmbedding.call(
    model="text-embedding-v3",
    input=batch,
    api_key=EmbeddingUtil.api_key
)

发送:

python 复制代码
[
    "新能源汽车",
    "动力电池"
]

返回:

python 复制代码
{
  "output": {
    "embeddings": [
      {
        "embedding": [...]
      },
      {
        "embedding": [...]
      }
    ]
  }
}