library(reticulate)
#virtualenv_create("chatgpt")
use_virtualenv("chatgpt")chatgpt-sentiment-loop
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:
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ählenVersionen 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_fewPrompt 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_tokensUnd 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()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.contentUnd 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_timeVoilĂ :
print(results)