Pandas对CSV中OpenAI Embedding按相似度排序报错,求解决方案
嵌入向量余弦相似度计算错误的解决方法
问题背景
构建基于ChatGPT的嵌入搜索模型时,将问题转为向量后,与CSV中维基百科文章的OpenAI Embedding向量计算余弦相似度时触发错误。代码如下:
input_datapath = "data/wiki_data_embeddings.csv" df = pd.read_csv(input_datapath) question = "What temperature is a high fever?" question_vector = get_embedding(question, engine=embedding_model) df["similarities"] = df['embedding'].apply(lambda x: cosine_similarity(x, question_vector)) df = df.sort_values("similarities", ascending=False).head(5) print(df)
错误信息:
numpy.core._exceptions._UFuncNoLoopError: ufunc 'multiply' did not contain a loop with signature matching types (dtype('<U34386'), dtype('<U23')) -> None
错误原因
错误中的dtype('<U34386')和dtype('<U23')表明,CSV里的embedding列存储的是字符串类型,而非数值型的向量数组。cosine_similarity无法对字符串执行数值运算,因此触发报错。
解决步骤
解析字符串向量为数值数组
读取CSV后,将字符串形式的向量转换为可计算的数值数组,使用ast.literal_eval解析字符串:import ast import numpy as np import pandas as pd from sklearn.metrics.pairwise import cosine_similarity input_datapath = "data/wiki_data_embeddings.csv" df = pd.read_csv(input_datapath) # 把字符串向量转为Python列表,再转为numpy数组 df['embedding'] = df['embedding'].apply(lambda x: np.array(ast.literal_eval(x)))调整余弦相似度计算逻辑
cosine_similarity要求输入为二维数组,需将单个向量reshape为(1, n)的格式:question = "What temperature is a high fever?" question_vector = get_embedding(question, engine=embedding_model) # 将问题向量转为二维数组 question_vector = np.array(question_vector).reshape(1, -1) # 计算每个向量与问题向量的相似度 df["similarities"] = df['embedding'].apply( lambda x: cosine_similarity(x.reshape(1, -1), question_vector)[0][0] ) df = df.sort_values("similarities", ascending=False).head(5) print(df)验证数据格式
处理后可检查embedding列的类型,确认已转为数值型:print(df['embedding'].iloc[0].dtype)正常输出应为
float64类的数值类型。
额外优化建议
- 保存嵌入向量时,优先使用numpy专用格式(如
.npy)或序列化格式(如pickle),避免CSV存储字符串带来的解析问题。 - 如果CSV中的向量字符串存在格式错误(如括号不匹配),
ast.literal_eval会触发报错,需先清理数据格式。
内容的提问来源于stack exchange,提问作者Jared Watson
相关产品推荐
相关产品推荐

