如何将Python列表格式Embedding批量插入PolarDB IMCI的VECTOR列?
解决MySQL VECTOR类型插入OpenAI Embedding的问题
1. 字符串格式转换方案(快速解决)
直接把Python浮点数列表转成[x1, x2, ..., xn]格式的字符串,再通过CAST函数转换为VECTOR类型,就能解决类型不匹配问题:
# 将embedding列表转为字符串格式 vec_str = str(my_list) cursor.execute( "INSERT INTO embeddings_store (id, vec) VALUES (%s, CAST(%s AS VECTOR))", (1, vec_str) )
这种方式无需额外依赖,适合小批量插入或测试场景,但字符串解析会有一定性能开销。
2. 二进制格式方案(批量插入首选)
MySQL的VECTOR类型支持二进制序列化格式,相比字符串解析性能提升明显,适合大规模批量插入。可以借助numpy将浮点数列表转为二进制字节流,再用FROM_BINARY函数解析:
步骤1:安装numpy(如果未安装)
pip install numpy
步骤2:二进制转换与插入代码
import numpy as np # 将Python列表转为float32类型的numpy数组,再转为字节流 vec_binary = np.array(my_list, dtype=np.float32).tobytes() cursor.execute( "INSERT INTO embeddings_store (id, vec) VALUES (%s, FROM_BINARY(%s, VECTOR(1536)))", (1, vec_binary) )
批量插入优化
如果是批量插入,用executemany配合二进制格式能大幅提升效率:
# 构造批量数据:假设data是[(id1, embedding1), (id2, embedding2), ...] batch_data = [] for idx, embedding in data: vec_binary = np.array(embedding, dtype=np.float32).tobytes() batch_data.append((idx, vec_binary)) cursor.executemany( "INSERT INTO embeddings_store (id, vec) VALUES (%s, FROM_BINARY(%s, VECTOR(1536)))", batch_data )
注意事项
- 确保numpy数组的 dtype 是
float32,因为MySQL的VECTOR默认使用单精度浮点数存储(如果你的VECTOR定义是双精度,需改用float64)。 - 批量插入时建议控制批次大小,避免单次提交数据量过大导致性能问题。
内容的提问来源于stack exchange,提问作者大兔崽子
相关产品推荐
相关产品推荐

