Python3.8调用GPT嵌入API时遇'type' object is not subscriptable错误
问题解决:嵌入GPT模型时的TypeError错误
问题描述
按照OpenAI官方教程实现数据集嵌入时,运行以下代码:
def get_embedding(text: str, model: str=EMBEDDING_MODEL) -> list[float]: result = openai.Embedding.create( model=model, input=text ) return result["data"][0]["embedding"] def compute_doc_embeddings(df: pd.DataFrame) -> dict[tuple[str, str], list[float]]: """ Create an embedding for each row in the dataframe using the OpenAI Embeddings API. Return a dictionary that maps between each embedding vector and the index of the row that it corresponds to. """ return { idx: get_embedding(r.content) for idx, r in df.iterrows() }
触发如下错误:
TypeError Traceback (most recent call last) Cell In[24], line 1 ----> 1 def get_embedding(text: str, mode: str=EMBEDDING_MODEL) -> list[float]: 2 result = openai.Embedding.create( 3 model=model, 4 input=text 5 ) 6 return result["data"][0]["embedding"] TypeError: 'type' object is not subscriptable
已尝试升级Python、改用List类型,问题仍未解决。
解决方案
1. 适配Python版本修正类型注解
Python 3.9及以上才支持直接用list[float]、dict[...]这类原生泛型注解,3.8及以下版本必须从typing模块导入对应泛型类型:
from typing import List, Dict, Tuple
随后将函数中的类型注解替换为:
list[float]→List[float]dict[tuple[str, str], list[float]]→Dict[Tuple[str, str], List[float]]
2. 修复参数名笔误
错误栈显示函数定义时参数名写为mode: str=EMBEDDING_MODEL,但函数内部使用的是model,这会导致后续执行时出现变量未定义错误,需将参数名修正为model。
修正后完整代码
from typing import List, Dict, Tuple import pandas as pd import openai # 定义嵌入模型名称 EMBEDDING_MODEL = "text-embedding-ada-002" def get_embedding(text: str, model: str=EMBEDDING_MODEL) -> List[float]: result = openai.Embedding.create( model=model, input=text ) return result["data"][0]["embedding"] def compute_doc_embeddings(df: pd.DataFrame) -> Dict[Tuple[str, str], List[float]]: """ Create an embedding for each row in the dataframe using the OpenAI Embeddings API. Return a dictionary that maps between each embedding vector and the index of the row that it corresponds to. """ return { idx: get_embedding(r.content) for idx, r in df.iterrows() }
说明
- 报错核心原因是Python版本不支持原生泛型下标注解,3.8及以下版本需通过
typing模块引入泛型类型。 - 同时修正参数名笔误,避免后续出现
NameError。
内容的提问来源于stack exchange,提问作者Gabry
相关产品推荐
相关产品推荐

