OpenAI Embeddings余弦相似度报错:Input vector should be 1-D 求助
问题:使用OpenAI Embeddings进行联系人搜索时触发ValueError错误
运行代码时触发如下错误:
--------------------------------------------------------------------------- ValueError Traceback (most recent call last) Cell In[2], line 39 37 query = input("Enter your query: ") 38 print("Recommended contacts:") ---> 39 for contact in search_contacts(query): 40 print(contact) Cell In[2], line 33, in search_contacts(query) 31 scores = {} 32 for contact, embedding in embeddings.items(): ---> 33 scores[contact] = 1 - cosine(query_embedding, embedding) 34 return sorted(scores, key=scores.get, reverse=True)[:5] File ~\AppData\Local\Programs\Python\Python311\Lib\site-packages\scipy\spatial\distance.py:668, in cosine(u, v, w) 626 """ 627 Compute the Cosine distance between 1-D arrays. 628 (...) 663 664 """ 665 # cosine distance is also referred to as 'uncentered correlation', 666 # or 'reflective correlation' 667 # clamp the result to 0-2 --> 668 return max(0, min(correlation(u, v, w=w, centered=False), 2.0)) File ~\AppData\Local\Programs\Python\Python311\Lib\site-packages\scipy\spatial\distance.py:608, in correlation(u, v, w, centered) 575 def correlation(u, v, w=None, centered=True): 576 """ 577 Compute the correlation distance between two 1-D arrays. 578 (...) 606 607 """ --> 608 u = _validate_vector(u) 609 v = _validate_vector(v) 610 if w is not None: File ~\AppData\Local\Programs\Python\Python311\Lib\site-packages\scipy\spatial\distance.py:301, in _validate_vector(u, dtype) 299 if u.ndim == 1: 300 return u --> 301 raise ValueError("Input vector should be 1-D.") ValueError: Input vector should be 1-D.
我的代码如下:
import pandas as pd import openai import numpy as np from scipy.spatial.distance import cosine # Authenticate to OpenAI openai.api_key = "API_KEY" # Load the CSV file contacts = pd.read_csv("c:/tmp/connect.csv") # Generate embeddings for each contact using GPT-3 embeddings = {} for index, row in contacts.iterrows(): combined = row["Combined"] response = openai.Completion.create( model="text-davinci-002", prompt=f"generate embeddings for {combined}", temperature=0.5, ) embedding = response["choices"][0]["text"] embeddings[combined] = embedding # Search function to return recommended contacts based on a user's query def search_contacts(query): query_embedding = openai.Completion.create( model="text-davinci-002", prompt=f"generate embeddings for {query}", temperature=0.5, )["choices"][0]["text"] scores = {} for contact, embedding in embeddings.items(): scores[contact] = 1 - cosine(query_embedding, embedding) return sorted(scores, key=scores.get, reverse=True)[:5] # Example usage query = input("Enter your query: ") print("Recommended contacts:") for contact in search_contacts(query): print(contact)
connect.csv文件内容:
| Combined |
|---|
| FullName: Alex Goodwill; Company: HyperCap; Position: Business Consultant |
| FullName: Amy Power; Company: Hollywood; Position: Strategy & Operations - CEO's Office |
问题排查与修复
核心错误原因
你错误使用了OpenAI的**Completion接口(text-davinci-002模型)**生成embedding。该接口的作用是生成自然语言文本,返回的是字符串内容,而非数值型一维向量。当你把字符串传给scipy的cosine函数时,它无法识别为一维数组,因此抛出Input vector should be 1-D错误。
修复步骤
- 使用正确的Embeddings接口:OpenAI专门提供
Embedding.create接口用于生成文本嵌入向量,推荐使用官方指定的text-embedding-ada-002模型(成本低、效果稳定)。 - 解析正确的embedding数据:Embeddings接口返回的向量数据位于
response['data'][0]['embedding'],是Python列表格式,可直接转为numpy数组用于相似度计算。 - 调整代码逻辑:替换生成embedding的调用代码,确保所有参与计算的向量都是数值型一维数组。
修改后的完整代码
import pandas as pd import openai import numpy as np from scipy.spatial.distance import cosine # 设置OpenAI API密钥 openai.api_key = "API_KEY" # 加载联系人数据 contacts = pd.read_csv("c:/tmp/connect.csv") # 生成联系人的embedding向量 embeddings = {} for index, row in contacts.iterrows(): combined = row["Combined"] # 使用Embedding接口生成向量 response = openai.Embedding.create( model="text-embedding-ada-002", input=combined ) # 获取数值型embedding向量 embedding = np.array(response['data'][0]['embedding']) embeddings[combined] = embedding # 联系人搜索函数 def search_contacts(query): # 生成查询的embedding向量 query_response = openai.Embedding.create( model="text-embedding-ada-002", input=query ) query_embedding = np.array(query_response['data'][0]['embedding']) scores = {} for contact, embedding in embeddings.items(): # 计算余弦相似度(1-余弦距离) scores[contact] = 1 - cosine(query_embedding, embedding) # 按相似度从高到低排序,返回前5个结果 return sorted(scores, key=scores.get, reverse=True)[:5] # 测试使用 query = input("Enter your query: ") print("Recommended contacts:") for contact in search_contacts(query): print(contact)
关键改动说明
- 替换
openai.Completion.create为openai.Embedding.create,并使用text-embedding-ada-002模型; - 直接从接口返回的
data[0]['embedding']提取向量数据,转换为numpy数组; - 移除了原代码中无效的prompt(Embedding接口不需要生成embedding的提示,直接传入文本即可)。
内容的提问来源于stack exchange,提问作者user3137471
相关产品推荐
相关产品推荐

