使用Pinecone时持续触发RateLimitError,寻求解决办法
解决Pinecone嵌入时的RateLimitError方案
- 拆分批次并添加固定延迟:将60份文档拆分成更小的批次(比如每10份一批),每处理完一批后暂停几秒,降低短时间内的请求密度。示例代码:
import time from langchain.vectorstores import Pinecone batch_size = 10 for idx in range(0, len(texts), batch_size): batch_texts = texts[idx:idx+batch_size] Pinecone.from_texts( [t.page_content for t in batch_texts], embeddings, index_name=index_name ) time.sleep(2) # 根据API限流阈值调整延迟时长
- 实现指数退避重试:遇到RateLimitError时自动重试,且每次重试的等待时间指数级增长,避免持续触发限流规则。可以借助
tenacity库实现:
from tenacity import retry, stop_after_attempt, wait_exponential from langchain.vectorstores import Pinecone @retry( stop=stop_after_attempt(5), # 最多重试5次 wait=wait_exponential(multiplier=1, min=2, max=10) # 等待时间从2秒起步,上限10秒 ) def upsert_batch(texts_batch, embeddings, index_name): Pinecone.from_texts( [t.page_content for t in texts_batch], embeddings, index_name=index_name ) batch_size = 10 for idx in range(0, len(texts), batch_size): upsert_batch(texts[idx:idx+batch_size], embeddings, index_name)
- 直接使用Pinecone原生SDK:绕过LangChain的封装,用Pinecone官方SDK更精细地控制请求流程,减少中间层可能带来的额外请求压力:
import pinecone import time pinecone.init(api_key="你的API密钥", environment="你的环境名") index = pinecone.Index(index_name) batch_size = 10 for idx in range(0, len(texts), batch_size): batch = texts[idx:idx+batch_size] # 生成嵌入向量 vectors = embeddings.embed_documents([t.page_content for t in batch]) # 构造Pinecone要求的数据格式 records = [ (f"doc-{idx+i}", vec, {"content": t.page_content}) for i, (vec, t) in enumerate(zip(vectors, batch)) ] index.upsert(vectors=records) time.sleep(2)
- 检查API配额:确认你的Pinecone账号是否超出了当前的请求配额(免费版配额有限),如果是,考虑升级付费套餐或者联系官方调整配额。
内容的提问来源于stack exchange,提问作者Akash Kundu
相关产品推荐
相关产品推荐

