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

如何使用OpenAI API批量生成Embeddings并提升处理速度?

提升OpenAI Embeddings生成效率的方案

并行发送请求确实能显著提升处理速度,但需要结合合理的批量划分和API速率限制来落地,以下是具体思路和实现方式:

核心逻辑

逐个请求完全串行等待,单次大列表请求如果包含数千条句子,单请求处理耗时会被拉长;而将句子划分为符合token限制的批量,并行发送这些批量请求,可以同时利用OpenAI API的处理能力,大幅压缩总耗时。

关键注意事项

  • 遵守速率限制:OpenAI API对请求频率(每分钟请求数)和token消耗(每分钟token数)有明确限制,并行请求的总请求数和token数不能超过你的API配额,否则会触发429限流错误。
  • 合理划分批量:text-embedding-ada-002模型单请求支持最多8191个token,需要将你的数千条句子拆分为多个批量,每个批量的总token数不超过上限(可通过tiktoken库计算单句token数来划分)。

代码示例(线程池并行)

import requests
from concurrent.futures import ThreadPoolExecutor
import tiktoken

# 初始化token计算器
tokenizer = tiktoken.get_encoding("cl100k_base")
API_KEY = "your-api-key"
MODEL = "text-embedding-ada-002"
MAX_TOKENS_PER_REQUEST = 8191

def get_embeddings(batch):
    try:
        response = requests.post(
            "https://api.openai.com/v1/embeddings",
            json={
                "model": MODEL,
                "input": batch
            },
            headers={
                "Authorization": f"Bearer {API_KEY}"
            }
        )
        response.raise_for_status()
        return response.json()["data"]
    except Exception as e:
        print(f"请求失败: {e}")
        return None

def split_into_batches(sentences):
    batches = []
    current_batch = []
    current_token_count = 0

    for sentence in sentences:
        token_count = len(tokenizer.encode(sentence))
        # 加上当前句子后超过上限则新建批次
        if current_token_count + token_count > MAX_TOKENS_PER_REQUEST:
            batches.append(current_batch)
            current_batch = [sentence]
            current_token_count = token_count
        else:
            current_batch.append(sentence)
            current_token_count += token_count
    # 添加最后一个批次
    if current_batch:
        batches.append(current_batch)
    return batches

# 替换为你的实际数千条句子列表
sentences = ["text:This is a test", "text:This is another test", ...]
batches = split_into_batches(sentences)

# 调整max_workers控制并行数(不要超过API速率限制)
with ThreadPoolExecutor(max_workers=5) as executor:
    results = list(executor.map(get_embeddings, batches))

# 整理所有embeddings结果
all_embeddings = []
for batch_result in results:
    if batch_result:
        all_embeddings.extend([item["embedding"] for item in batch_result])

额外优化建议

  • 加入重试机制:对429限流错误进行指数退避重试,避免请求失败。
  • 异步请求:使用aiohttp库实现异步HTTP请求,相比线程池可能有更高的效率(适合超大规模请求场景)。

内容的提问来源于stack exchange,提问作者Constantly Groovin'

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.07 07:15:35