You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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错误。

修复步骤

  1. 使用正确的Embeddings接口:OpenAI专门提供Embedding.create接口用于生成文本嵌入向量,推荐使用官方指定的text-embedding-ada-002模型(成本低、效果稳定)。
  2. 解析正确的embedding数据:Embeddings接口返回的向量数据位于response['data'][0]['embedding'],是Python列表格式,可直接转为numpy数组用于相似度计算。
  3. 调整代码逻辑:替换生成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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.03 17:10:39