0

I'm using the ChatGPT API to generate descriptions and short descriptions of many products. I developed a tool that can generate it, but it takes around 40 seconds to generate and create it.

I would like to know if there are solutions to optimize this generation time. I tried many things, like sending two API calls in parallel or playing with the parameters of the API (for example, temperature and so on).

Here is my code if someone has any solutions:

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)
Rok Benko
  • 14,265
  • 2
  • 24
  • 49
Nicolas
  • 107
  • 10
  • 1
    "Optimize this generation" as in "Make the API return results faster"? GPT models do take time to produce results, you'll never get instant responses like you would from more deterministic services. – tadman Aug 23 '23 at 14:06
  • @tadman OP is seeking the optimizations so that the output gets generated in less than 40s. Probably not going to get there anytime soon as per your comment because of the model takes time to think. – raiyan22 Aug 23 '23 at 14:09
  • 1
    @raiyan22 That's what I mean by "API return results faster". It runs at the speed it does. There's no turbo button here. – tadman Aug 23 '23 at 14:10
  • @tadman yes I got that. thanks – raiyan22 Aug 23 '23 at 14:10
  • @tadman yes that's what I wanted to mean and i know that GPT models take time to produce but I would like to know if there is a solutions to minimize production time – Nicolas Aug 23 '23 at 14:11
  • 1
    There's not really a lot of options here to make it faster, but there are ChatGPT alternatives that may perform better, so consider doing tests on those if speed is a concern. You can also host your own if you want maximum control. – tadman Aug 23 '23 at 14:13
  • Okay thanks I will search by this side ! – Nicolas Aug 23 '23 at 14:15

2 Answers2

1

The only thing you have control over in terms of getting a completion back faster is the model you choose, but you already chose gpt-3.5-turbo, which is one of the fastest.

But...

What I would do if I were you is use the stream parameter. If you set it to true, you'll get a response in the same way that ChatGPT does (i.e., token-by-token). Effectively, the user sees the completion faster because your chatbot displays the first token as soon as it gets it from the OpenAI API and doesn't wait for the full completion to be received.

See a simple Python example below (source).

import os
import openai
openai.api_key = os.getenv("OPENAI_API_KEY")

# Example of an OpenAI ChatCompletion request with stream=True
# https://platform.openai.com/docs/guides/chat

# record the time before the request is sent
start_time = time.time()

# send a ChatCompletion request to count to 100
response = openai.ChatCompletion.create(
    model='gpt-3.5-turbo',
    messages=[
        {'role': 'user', 'content': 'Count to 100, with a comma between each number and no newlines. E.g., 1, 2, 3, ...'}
    ],
    temperature=0,
    stream=True  # again, we set stream=True
)

# create variables to collect the stream of chunks
collected_chunks = []
collected_messages = []
# iterate through the stream of events
for chunk in response:
    chunk_time = time.time() - start_time  # calculate the time delay of the chunk
    collected_chunks.append(chunk)  # save the event response
    chunk_message = chunk['choices'][0]['delta']  # extract the message
    collected_messages.append(chunk_message)  # save the message
    print(f"Message received {chunk_time:.2f} seconds after request: {chunk_message}")  # print the delay and text

# print the time delay and text received
print(f"Full response received {chunk_time:.2f} seconds after request")
full_reply_content = ''.join([m.get('content', '') for m in collected_messages])
print(f"Full conversation received: {full_reply_content}")
Rok Benko
  • 14,265
  • 2
  • 24
  • 49
  • "*the faster the model, the cheaper it is, but the simpler tasks it can handle*", have to disagree on this one, not always anyway. :^) – doneforaiur Aug 23 '23 at 14:56
  • @doneforaiur After thinking for a while, I disagree with myself too. :) It really depends on what OpenAI models you compare (a certain model vs. its previous self, GPT-3 vs. GPT-3.5, etc.). This sentence is very relative, so I removed it from my answer. It's not really related to the question, anyway. – Rok Benko Aug 23 '23 at 15:35
0

Since you are using an external (to your service API), you can not control or optimize the response time.

Asking the GPT model myself, it recommended to batch multiple requests in an attempt to reduce the overall response time, but still that wouldn't help you that much.

Taking a step back and looking at a higher level, you may tackle the issue by introducing a new component to your stack, a cache.

Assuming your products list is finite, you may introduce a cache to temporarily store GPT responses for future use.

Doing that will optimize all future requests (except the first) for each product.

  • First request -> cache miss -> go ask GPT and wait for response.
  • Any future request -> cache hit -> return existing response/description.
Gr3at
  • 330
  • 6
  • 12