DashScope Embedding工具类详解(向量转换、Milvus知识库项目实战)
一、为什么需要Embedding?
在知识库项目中,Milvus 并不能直接存储和检索文本内容,而是需要先将文本转换成向量(Vector)。
例如:
新能源汽车 动力电池 电机控制系统经过 Embedding 模型处理后:
[ 0.123, -0.456, 0.789, ... ]这些向量会存入 Milvus,后续用户提问时再通过向量相似度检索相关知识。
本文使用阿里云 DashScope 的 text-embedding-v3 模型实现文本向量化。
二、工具类代码
importosfromdotenvimportload_dotenvfromdashscopeimportTextEmbedding load_dotenv()classEmbeddingUtil:api_key=os.getenv("DASHSCOPE_API_KEY")@staticmethoddefembedding(text_list:list[str]):vectors=[]# 🔥 分批(关键修复)batch_size=10foriinrange(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)ifnotresporresp.status_code!=200:raiseException(f"Embedding失败:{resp}")foriteminresp.output["embeddings"]:vectors.append(item["embedding"])returnvectors三、代码解析
1. 加载环境变量
load_dotenv()项目根目录创建 .env 文件:
DASHSCOPE_API_KEY=你的API_KEY通过:
os.getenv("DASHSCOPE_API_KEY")读取 API Key。
2.定义 Embedding 工具类
class EmbeddingUtil:用于统一封装向量生成逻辑。
后续项目中只需要:
EmbeddingUtil.embedding(texts)即可获得向量结果
3. 定义静态方法
@staticmethoddefembedding(text_list:list[str]):参数:
["新能源汽车","动力电池","电机控制系统"]返回:
[[0.12,0.45,...],[0.78,0.91,...],[0.34,0.56,...]]4. 分批处理
batch_size=10如果一次性提交大量文本,可能出现:
- 请求超时
- 接口限流
- 请求体过大
因此采用分批策略:
foriinrange(0,len(text_list),batch_size):例如:
len(text_list)=25将被拆分为:
第1批:1~10第2批:11~20第3批:21~255. 调用 Embedding 模型
resp=TextEmbedding.call(model="text-embedding-v3",input=batch,api_key=EmbeddingUtil.api_key)发送:
["新能源汽车","动力电池"]返回:
{"output":{"embeddings":[{"embedding":[...]},{"embedding":[...]}]}}