chatgpt-sentiment-loop

textmining
nlp
transformer
chatgpt
sentiment
Published

December 5, 2023

Aufgabe

Fragen Sie ChatGPT via API zum Sentiment der ersten zwei Texte aus dem Germeval-2018-Datensatz (Train).

Hinweise:

  • Beachten Sie die Standardhinweise des Datenwerks.
  • Nutzen Sie Python, nicht R.
  • Das Verwenden der OpenAI-API kostet Geld. đź’¸ Informieren Sie sich vorab. Um auf die API zugreifen zu können, mĂĽssen Sie sich ein Konto angelegt haben und ĂĽber ein Guthaben verfĂĽgen.











Lösung

OpenAI hat eine neue API (Stand: 2023-11-23), V1.3.5. Der Code der alten API bricht. đź’” \(\square\)

Die richtige venv nutzen:

library(reticulate)
#virtualenv_create("chatgpt")
use_virtualenv("chatgpt")

Check zu Python:

reticulate::py_config()

Ggf. noch Module installieren:

#reticulate::py_install("pandas")

Module importieren:

from openai import OpenAI
import pandas as pd
import time 
import tiktoken  # Token zählen

Versionen der importierten Module:

pd.__version__
```{zsh}
pip list | grep openai
```

Wir brauchen >= 1.35.

Daten importieren:

csv_file_path_train = 'https://github.com/sebastiansauer/pradadata/raw/master/data-raw/germeval_train.csv'

germeval_train = pd.read_csv(csv_file_path_train)

Die ersten paar Texte herausziehen:

n_tweets = 2
tweets_first_few = germeval_train["text"].head(n_tweets).tolist()
tweets_first_few

Prompt definieren:

prompt_stem  = "Als KI mit Exertise in natürlicher Sprache und Emotionserkennung ist es Ihre Aufgabe, das Sentiment des folgenden Textes zu erkennen. Bitte antworten Sie nur mit einem Wort, entweder 'positiv', 'neutral' oder 'negativ'. Dieses Wort soll die Insgesamt-Einschätzung des Sentiments des Textes zusammenfassen. Nach dem Doppelpunkt folt der Text, dessen Sentiment Sie einschätzen sollen: \n"

Mit “List Comprehension” können wir die Tweets jeweils mit dem Prompt verknüpfen:

prompts = [prompt_stem + tweet for tweet in tweets_first_few]
prompts[0]

Check: Wie viele Elemente hat die Liste prompts?

len(prompts)

Check: Wie viele Tokens hat jeder String (jeder Prompt)?

Wir definieren eine Helper-Funktion:

def count_tokens(string: str, encoding_name: str) -> int:
    encoding = tiktoken.get_encoding(encoding_name)
    num_tokens = len(encoding.encode(string))
    return num_tokens

Und zählen:

encoding_name = "cl100k_base"

num_tokens_list = [count_tokens(prompt, encoding_name) for prompt in prompts]

for i, num_tokens in enumerate(num_tokens_list):
    print(f"The number of tokens in Prompt {[i]} is {num_tokens}.")

Mehr Infos zum Encoding bei ChatGPT finden sich hier.

Laut OpenAI kostet 1k Token fĂĽr das Modell gpt-3.5-turbo-1106 $0.001.

Anmelden bei OpenAI:

client = OpenAI()
Note

Dieses Anmeldeverfahren setzt voraus, dass in .Renviron die Variable OPENAI_API_KEY hinterlegt ist. \(\square\)

Anfrage an die API, in eine Funktion gepackt:

def get_completion(prompt, client_instance, model="gpt-3.5-turbo"):
  messages = [{"role": "user", "content": prompt}]
  response = client_instance.chat.completions.create(
    model=model,
    messages=messages,
    max_tokens=50,
    temperature=0,
  )
  return response.choices[0].message.content

Und jetzt als Schleife. Ergebnisliste anlegen, am Anfang noch leer:

results = []
start_time = time.time()

for prompt in prompts:
  result = get_completion(prompt, client) 
  results.append(result)

end_time = time.time()
end_time - start_time

VoilĂ :

print(results)