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

如何优化OpenAI Chat Completions API的产品描述生成速度?

优化OpenAI API产品描述生成速度的方案

当前问题

我使用OpenAI Chat Completions API批量生成产品描述及短描述,单次生成耗时约40秒。已尝试并行发送两次API调用、调整temperature参数,但仍需更多优化生成效率的方案,以下是我的代码:

import openai
import random

openai.api_key = 'OPENAI-KEY'


def generateDescription(description, title):
    model = "gpt-3.5-turbo"

    # Generate a random word limit between 400 and 600
    max_words = random.randint(400, 600)
    input_text = "Reformule cette description pour qu'elle soit affichée dans un site présentant le produit" + title + \
        " et qu'elle fasse entre 400 et 600 mots. Tu dois donc respecter les règles de google et du référencement naturel afin d'optimiser le référencement au maximum.Tu dois appliquer des mots clés spécifiques au produit ainsi qu'utiliser une architecture spéciale ayant 3 parties avec des balises h2: la premiere étant la présentation du produit, la deuxième étant les recommandations d'utilisations et la troisième étant les précautions lors de l'emploi du produit.Voici un exemple d'architecture d'une autre fiche produit dont tu dois t'inspirer et utiliser le même style donné dans les balises: <h2 dir=\"ltr\" style=\"text-align: center;\"><span> Les e-liquides Alfaliquid sont fabriqués en France. </span></h2> <p style=\"text-align: center;\"></p><p style=\"text-align: justify;\"><span style=\"font-family: Montserrat, sans-serif;\"> Grand acteur dans l’élaboration de e-liquide pour e-cigarette, Alfaliquid est un fabricant qui nous montre qu’il n’a pas froid aux yeux. Toujours animée de générosité et de créativité sans bornes, cette marque originaire de la France a su attirer l’attention d’un grand nombre de vapoteurs. Cette notoriété étant régulièrement mise à l’épreuve, la marque propose différentes gammes de e-liquides aux consommateurs. On retrouve notamment la gamme So Fifty qui rassemble des recettes équilibrées et savoureuses. Les e-liquides Alfaliquid sont disponibles en flacon de 10ml et 50ml. </span></p><p style=\"text-align: justify;\"><span style=\"font-family: Montserrat, sans-serif;\"><span>Les arômes utilisés sont certifiés de qualité alimentaire. Cet e-liquide ne contient ni diacétyle, ni parabène, ni ambrox.</span></span></p><p></p><h2 dir=\"ltr\" style=\"text-align: center;\"><span>Recommandation </span></h2><p style=\"text-align: center;\"></p><ul><li dir=\"ltr\" aria-level=\"1\"><p dir=\"ltr\" role=\"presentation\"><span>Pour une efficacité optimale de vos e-liquides, veillez à les stocker dans un endroit sec à l’abri de la lumière.</span></p></li><li dir=\"ltr\" aria-level=\"1\"><p dir=\"ltr\" role=\"presentation\"><span>Afin que la saveur ne s’altère pas, pensez à bien reboucher votre flacon après utilisation.</span></p></li></ul><p></p><h2 dir=\"ltr\" style=\"text-align: center;\"><span>Précaution d’emploi </span></h2><p style=\"text-align: center;\"></p><ul><li dir=\"ltr\" aria-level=\"1\"><p dir=\"ltr\" role=\"presentation\"><span>Tenir hors de portée des enfants.</span></p></li><li dir=\"ltr\" aria-level=\"1\"><p dir=\"ltr\" role=\"presentation\"><span>La nicotine liquide est toxique par contact cutané.</span></p></li><li dir=\"ltr\" aria-level=\"1\"><p dir=\"ltr\" role=\"presentation\"><span>En cas de contact avec la peau : laver abondamment à l’eau et au savon.</span></p></li><li dir=\"ltr\" aria-level=\"1\"><p dir=\"ltr\" role=\"presentation\"><span>En cas d’ingestion ou de malaise, contactez un centre antipoison ou un médecin et montrez l’étiquette du flacon d’e-liquide.</span></p></li><li dir=\"ltr\" aria-level=\"1\"> <p dir=\"ltr\" role=\"presentation\"><span>Produit destiné uniquement à la recharge de cigarette électronique.</span></p> </li> </ul>.Tu n'es également pas un magasin ni quelqu'un travaillant pour la marque de ce produit, donc pas de formules souhaitant la bienvenue ou formules de politesse. Tu dois rester neutre dans tes propos et uniquement présenter le produit avec ses saveurs (si c'est un liquide ou un arôme) et ses caractéristiques spécifiques. La description a reformulée est : " + description
    response = openai.ChatCompletion.create(
        model=model,
        messages=[
            {"role": "system", "content": "You are a helpful assistant."},
            {"role": "user", "content": input_text}
        ],
        temperature=0.2,
        n=1
    )

    description = response['choices'][0]['message']['content'].strip()
    return description


def generateShortDescription(description, title):
    model = "gpt-3.5-turbo"

    # Generate a random character limit between 400 and 600
    max_characters = random.randint(600, 650)
    input_text = "Reformule cette description pour qu'elle soit affichée dans un site présentant le produit" + title + \
        " et qu'elle fasse minimum 550 caractères et maximum 650 caractères (c'est une description courte). Tu dois donc respecter les règles de google et du référencement naturel afin d'optimiser le référencement au maximum.Tu dois appliquer des mots clés spécifiques au produit ainsi qu'utiliser une architecture spéciale.Tu n'es également pas un magasin ni quelqu'un travaillant pour la marque de ce produit, donc pas de formules souhaitant la bienvenue ou formules de politesse. Tu dois rester neutre dans tes propos et uniquement présenter le produit. La description a reformulée est : " + description

    response = openai.ChatCompletion.create(
        model=model,
        messages=[
            {"role": "system", "content": "You are a helpful assistant."},
            {"role": "user", "content": input_text}
        ],
        temperature=0.2,
        n=1
    )

    generated_text = response['choices'][0]['message']['content'].strip()

    # Ensure the generated text doesn't exceed the maximum characters and ends with a complete sentence
    last_sentence_end = generated_text.rfind(".", 0, max_characters)
    final_description = generated_text[:last_sentence_end + 1]

    return final_description


@app.route('/generationDescription', methods=['POST'])
def generate_texts():
    description = request.form.get('description')
    title = request.form.get('title')
    shortDescription = generateShortDescription(description, title)
    description = generateDescription(description, title)

    response_data = {
        "description": description,
        "shortDescription": shortDescription
    }
    return jsonify(response_data)

优化方案

1. 精简提示词,转移规则到System Prompt

当前用户提示词包含大量重复规则和冗余示例,导致token消耗大、模型处理时间长。将固定规则(SEO要求、语气要求、结构格式)整合到System Prompt中,用户仅传递变量内容(产品标题、原始描述、字数限制),可大幅减少每次请求的输入长度,提升处理速度。

2. 切换到更快的模型

  • 使用gpt-3.5-turbo-16k:上下文窗口更大,响应速度优于基础版gpt-3.5-turbo,适合处理较长输出;
  • 尝试gpt-4o-mini:OpenAI轻量型旗舰模型,响应速度显著快于gpt-3.5-turbo,同时能保持足够的生成质量。

3. 深化异步并行处理

当前代码串行调用两个生成函数,即使并行也仅处理两组请求。改用Python asyncio结合OpenAI异步客户端,可同时发起多组请求(注意控制并发数,避免触发API速率限制);批量处理多个产品时,可将请求分组并行执行,进一步压缩总耗时。

4. 移除不必要的本地后处理

generateShortDescription中的截断逻辑可整合到提示词中,让模型直接生成符合字符限制的内容,避免本地处理的额外耗时。例如在提示词中明确要求“生成550-650字符的短描述,结尾为完整句子”。

5. 缓存重复请求

对相同的原始描述和标题,缓存生成结果,避免重复调用API。可使用Redis或本地字典存储缓存键值对,键采用原始描述+标题的哈希值。

6. 精细化调整API参数

  • 设置max_tokens:根据输出字数要求直接配置(比如长描述对应3000-4500tokens,短描述对应800-1000tokens),避免模型生成多余内容;
  • 降低temperature至0.1:当前0.2已较低,进一步降低可减少模型思考时间,同时保持输出一致性;
  • 保持stream=False(默认):一次性获取完整响应,避免流式传输的额外开销。

7. 使用OpenAI官方异步客户端

OpenAI提供的openai.AsyncOpenAI客户端比手动线程池更高效,适合高并发场景,能更充分利用API资源。

优化后的代码示例

import openai
import random
from fastapi import FastAPI, Form
from starlette.responses import JSONResponse
import asyncio

# 初始化异步客户端
client = openai.AsyncOpenAI(api_key='OPENAI-KEY')

# 整合所有固定规则的System Prompt
SYSTEM_PROMPT = """
你是专业的产品描述改写助手,严格遵循以下规则:
1. 保持中立语气,不使用欢迎语、礼貌用语,不代表品牌或商店发言;
2. 遵循SEO规则,优化自然搜索排名;
3. 按需求生成对应格式内容:
   - 长描述:400-600词,分为三个带h2标签的板块:产品介绍、使用建议、使用注意事项,HTML格式参考:
     <h2 style="text-align:center;">[板块标题]</h2>
     <p style="text-align:justify;font-family:Montserrat, sans-serif;">[内容]</p>
   - 短描述:550-650字符,结尾为完整句子,仅展示产品核心信息。
"""

async def generate_description(description, title, is_short=False):
    model = "gpt-4o-mini"  # 使用更快的轻量模型
    
    if is_short:
        user_prompt = f"""
        基于以下信息生成短描述(550-650字符,完整句子结尾):
        产品标题:{title}
        原始描述:{description}
        """
    else:
        max_words = random.randint(400, 600)
        user_prompt = f"""
        基于以下信息生成长描述({max_words}词左右),包含产品介绍、使用建议、使用注意事项三个h2板块:
        产品标题:{title}
        原始描述:{description}
        """
    
    response = await client.chat.completions.create(
        model=model,
        messages=[
            {"role": "system", "content": SYSTEM_PROMPT.strip()},
            {"role": "user", "content": user_prompt.strip()}
        ],
        temperature=0.1,
        max_tokens=4500 if not is_short else 1000
    )
    
    return response.choices[0].message.content.strip()

app = FastAPI()

@app.post('/generationDescription')
async def generate_texts(description: str = Form(...), title: str = Form(...)):
    # 并行发起两个异步请求
    short_task = asyncio.create_task(generate_description(description, title, is_short=True))
    long_task = asyncio.create_task(generate_description(description, title, is_short=False))
    
    # 等待两个任务完成
    short_description, long_description = await asyncio.gather(short_task, long_task)
    
    return JSONResponse({
        "description": long_description,
        "shortDescription": short_description
    })

内容的提问来源于stack exchange,提问作者Nicolas

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.12 23:47:02