在Pandas DataFrame中调用openai.Embedding.create遇API服务器错误求助
问题:使用OpenAI Embedding API批量生成文本嵌入时遭遇服务器错误
问题详情
尝试通过Pandas的apply方法调用openai.Embedding.create,为DataFrame的text列生成嵌入向量并存储到新列embeddings中,代码如下:
import pandas as pd import openai df['embeddings'] = df.text.apply(lambda x: openai.Embedding.create(input=x, engine='text-embedding-ada-002')['data'][0]['embedding'])
执行时触发服务器错误,错误信息片段:
Traceback (most recent call last): File "/Users/adigweleo/web-crawl-q-and-a-example/web-qa.py", line 302, in <module> df['embeddings'] = df.text.apply(lambda x: openai.Embedding.create(input=x, engine='text-embedding-ada-002')['data'][0]['embedding']) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ # ... (其他错误信息部分) openai.error.APIError: The server had an error while processing your request. Sorry about that! { "error": { "message": "The server had an error while processing your request. Sorry about that!", "type": "server_error", "param": null, "code": null } }
已多次重试、验证API密钥、检查参数及依赖,但问题持续,需要排查和解决建议。
排查与解决建议
改用批量请求代替逐行调用:逐行
apply会发起大量单次请求,既低效又容易触发服务器负载问题。OpenAI Embedding API支持批量输入,可将文本分组后一次性请求:# 按每100条文本为一组批量处理(可根据文本长度调整) batch_size = 100 embeddings = [] for i in range(0, len(df), batch_size): batch_texts = df['text'].iloc[i:i+batch_size].tolist() response = openai.Embedding.create(input=batch_texts, engine='text-embedding-ada-002') batch_embeddings = [item['embedding'] for item in response['data']] embeddings.extend(batch_embeddings) df['embeddings'] = embeddings添加重试机制:服务器错误多为临时问题,可通过重试逻辑自动处理。手动实现或使用
tenacity库:from tenacity import retry, stop_after_attempt, wait_exponential, retry_if_exception_type @retry(stop=stop_after_attempt(5), wait=wait_exponential(multiplier=1, min=2, max=10), retry=retry_if_exception_type(openai.error.APIError)) def get_embedding(text): return openai.Embedding.create(input=text, engine='text-embedding-ada-002')['data'][0]['embedding'] df['embeddings'] = df['text'].apply(get_embedding)校验并处理超长文本:尽管
text-embedding-ada-002支持长文本,但极端长度的文本可能导致服务器处理失败。可预先截断文本:# 截断到ada-002支持的最大token数(8191),这里按字符数粗略估算(1token≈4字符) max_chars = 8191 * 4 df['text'] = df['text'].apply(lambda x: x[:max_chars] if len(x) > max_chars else x)检查API速率限制:确认你的OpenAI账号是否超过了速率配额(可在OpenAI后台查看)。如果是,可在请求间添加延时:
import time def get_embedding_with_delay(text): time.sleep(0.1) # 根据配额调整延时 return openai.Embedding.create(input=text, engine='text-embedding-ada-002')['data'][0]['embedding'] df['embeddings'] = df['text'].apply(get_embedding_with_delay)排查网络连接:确认本地网络是否能稳定访问OpenAI服务器,必要时可设置代理:
openai.proxy = "http://your-proxy-address:port"
内容的提问来源于stack exchange,提问作者adigwe4l
相关产品推荐
相关产品推荐

