一、为什么需要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": [...]
}
]
}
}