A.3 (Optional): Anbindung an ChatGPT
Contents
A.3 (Optional): Anbindung an ChatGPT#
Generative Modelle sind besonders im letzten Jahr verstärkt in den Fokus der Öffenlichkeit geraten. Zum einen Diffusion Modelle wie Dall-E oder Stable Diffusion, die zur textbasierten Generierung von Bildern genutzt werden können. Zum anderen dann besonders auch durch ChatGPT als (anfangs) sprachbasierter ChatBot.
ChatGPT [OpenAI, 2022] basiert auf einem Sprachmodell: den Generative Pre-trained Transformer. Dies sind eine Gruppe von generativen Modellen, die in der Sprachverarbeitung seit einigen Jahren Anwendung finden und hier sehr gute Ergebnisse zum Beispiel als Übersetzer liefern. Ein entscheidender Mechanismus von Transformer-Architekturen (wie sie in GPT Modellen und allen ähnlichen Ansätzen wie Bard, Llama etc. genutzt werden) ist die Idee der Self-Attention [Vaswani et al., 2017]. Grundsätzlich addressiert dieser Mechanismus das von uns in n-gram Modellen beobachtete Problem, dass inhaltliche und semantische Beziehungen nicht darstellbar sind sondern lediglich Nachbarschaften betrachtet werden. In Self-Attention Modellen werden einzelne Inputs (Wörter) nicht nur inhaltlich kodiert, sondern (parallel) werden Beziehungen zwischen diesen gelernt – auch über längere Textabschnitte hinweg (für eine detailierte Erklärung mit guter Visualisierung siehe [Alammar, 2018] und für GPT-3 [Alammar, 2020]). Dies erlaubt eine Einbeziehung des Kontextes (in einem gewissen Maße zumindest; in GPT-4 ist dieser Kontext z.B. deutlich erweitert worden).
Eine Schwäche dieser Modelle ist, dass sie zwar gut lernen, was auf einer oberflächlichen Ebene als Sprache durchgehen würde. Aber das sie dabei dann gerade auch Inhalte “generieren” oder halluzinieren:
Generative models have uneven capability surfaces, with the potential for surprisingly strong and surprisingly weak areas of capability. (OpenAI Statement on their generative model page, https://platform.openai.com/docs/model-index-for-researchers)
In der Entwicklung von ChatGPT [OpenAI, 2022] ist OpenAI hier eine bedeutende und extrem effektive Methode gelungen, diese generativen Modelle durch ein Nachtraining einzuengen und so deutlich zu beschränken (wobei es hier weiterhin noch Lücken und Schwächen gibt). Grundlage dieser Methode ist ein trainieren eines vorhersagenden Modells über Reinforcement Learning, bei dem Feedback von menschlichen Nutzern mit einbezogen wird. Während ein solches Feedback üblicherweise nicht möglich ist, da für ein Training sehr große Datenmengen genutzt werden, so hat OpenAI in ihrem Ansatz hier ein zusätzliches Modell trainiert, was die Einschätzungen der Nutzer widergibt. Dies Modell kann dabei viel einfacher sein und viel schneller trainiert werden, wodurch nur wenig echte Nutzerdaten notwendig werden (für mehr Details siehe die Veröffentlichung zum Vorgängermodell InstructGPT [Ouyang et al., 2022]).
Fig. 6 ChatGPT ist ein nachjustiertes GPT-3.5 Modell, was über menschliches Feedback nachtrainiert wurde (Fig. und weitere Erklärungen [OpenAI, 2022]).#
Ziel von Teilaufgabe A.3#
Aufgabe A.3 ist optional.
Ziel der Aufgabe ist die Anbindung an ChatGPT. Dabei wird das Nutzen einer offenen (Header-basierten) API gelernt. Der bisherige Chatbot kann so erweitert werden durch die direkte Anbindung über die OpenAI-API an die vers. GPT-Modelle und so Anfragen an diese in der Dialogschleife umgesetzt werden.
Grundlegende Struktur#
In dieser optionalen Aufgabe soll ihnen nur rudimentär die Anbindung vorgestellt werden (Anfrage und Rückgabe). Machen sie sich selbst vertraut mit der API. Die OpenAI API erlaubt Zugriffe über HTTP requests und stellt diese für Python zur Verfügung. Für C++ gibt es eine rein Header-basierte Anbindung, die wir hier nutzen können.
Anweisungen2
Machen sie sich mit der API einmal vertraut.
Sie müssen dann vor der Ausführung ihre OPENAI_API_KEY als Umgebungsvariable setzen (oder im Programm direkt). Hierzu müssen sie sich bei OpenAI anmelden und dann einen API_KEY erzeugen. Im Kurs wird auch ein Burner-Key vergeben (gültig nur bis Freitag, 31.6.2024, in ihrer Shell as Variable setzen:
export OPENAI_API_KEY='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'
).Unten sehen sie im Code eine minimale Anbindung. Leiten sie hier ihre Anfrage weiter.
Als Erweiterung: Im Gegensatz zu ChatGPT ist hier jeder Call eine neue Anfrage. Um einen Dialog zu führen, müssen sie die history immer mit übergeben als Teil ihres Promptes. Dazu können sie ihrem ChatBot auch eine Persönlichkeit geben oder vor-prompten.
Überlegen sie, wie sie diese History effizienter und kompakter gestalten können.
#include "chat_bot.h"
#include <openai/openai.hpp>
void giveWelcomeMessage()
{
// GPT Anfrage
// export OPENAI_API_KEY='sk- ... for OPENAI calls: export in shell
openai::start();
std::cout << "Welcome to ChatGPT. How can I help you (this message will be passed to ChatGPT?" << std::endl;
}
std::string askChatBotForAnswer( const std::string& userInput ) {
// TODO: ADAPT THE FOLLOWING CODE - the call to OpenAI is already given.
// You create a query object (there are other possibilies)
// You access this object and can set an entry for the Json object as query["key"] = "value";
openai::Json query;
// You have to fill the "model" entry, e.g. as "gpt-3.5-turbo"
// and the "max_tokens" with a number of allowed tokens for the answer as an int, plus the "temperature" as an int
// The messages has to be a complex openai::Json::array that has two tupels as entries
// - one for "role" which is "user"
// - one for "content" which is the userInput
query["model"] = "gpt-3.5-turbo"; // Model name
// TODO
auto completion = openai::completion().create(query);
// ToDo: Get the response from the JSON object completion.
return completion.dump(2);
}
CXX := c++
CXXFLAGS := -Wall -std=c++20
# Contain path for any includes (headers)
INCLUDES := -I./include
# Contains libraries we need to (-L is directory search path, -l is lib)
#LDFLAGS = -L/usr/local/lib -L/opt/homebrew/lib
LDLIBS = -lcurl #-lssl -lcrypto
SRCDIR := ./src
CHATGPT_OBS = chatgpt_bot.o main_chatbot.o
chatgpt: $(CHATGPT_OBS)
$(CXX) $^ -o $@ $(LDLIBS)
%.o: $(SRCDIR)/%.cpp
$(CXX) $(INCLUDES) $(CXXFLAGS) -c $^ -o $@
Tipp - hier öffnen
Die Anfrage wird als JSON Objekt generiert (openai::Json query;
), dies können sie anpassen (z.B. query["model"] = "gpt-3.5-turbo";
). Siehe auch nlohman Website.
Für den komplexen Eintrag der Nachricht (messages) an sich müssen sie ein array erzeugen:
query["messages"] = openai::Json::array({ {{"role", "user"}, {"content", userInput}} });
Mögliche Erweiterungen#
Prompt-Engineering – Bot mit spezieller Persönlichkeit versehen.
Anpassung auf neue GPT-4 API oder GPT-4o.
Für ein angepassteres neueres GPT-3.5 Modell können sie folgenden Code nutzen:
Wenn sie lokal ein LLM laufen lassen wollen, können sie auf eine Variante des Llama Modells (von Meta) zurückgreifen, z.B. Alpaca [Touvron et al., 2023, Taori et al., 2023] bietet eine fine-tuned Version an, die nur wenig Hardware-Voraussetzungen einfordert. Die Anbindung hierfür finden sie unter https://github.com/ggerganov/llama.cpp.
Referenzen#
- 1
Jay Alammar. The illustrated transformer. Blogpost., 2018. URL: https://jalammar.github.io/illustrated-transformer/.
- 2
Jay Alammar. How gpt3 works - visualizations and animations. Blogpost., 2020. URL: https://jalammar.github.io/how-gpt3-works-visualizations-animations/.
- 3(1,2,3)
OpenAI. Introducing chatgpt. OpenAI blog post, 2022. URL: https://openai.com/blog/chatgpt.
- 4
Long Ouyang, Jeff Wu, Xu Jiang, Diogo Almeida, Carroll L Wainwright, Pamela Mishkin, Chong Zhang, Sandhini Agarwal, Katarina Slama, Alex Ray, and others. Training language models to follow instructions with human feedback. arXiv preprint arXiv:2203.02155, 2022.
- 5
Rohan Taori, Ishaan Gulrajani, Tianyi Zhang, Yann Dubois, Xuechen Li, Carlos Guestrin, Percy Liang, and Tatsunori B. Hashimoto. Stanford alpaca: an instruction-following llama model. https://github.com/tatsu-lab/stanford_alpaca, 2023.
- 6
Hugo Touvron, Thibaut Lavril, Gautier Izacard, Xavier Martinet, Marie-Anne Lachaux, Timothée Lacroix, Baptiste Rozière, Naman Goyal, Eric Hambro, Faisal Azhar, Aurelien Rodriguez, Armand Joulin, Edouard Grave, and Guillaume Lample. Llama: open and efficient foundation language models. 2023. arXiv:2302.13971.
- 7
Ashish Vaswani, Noam Shazeer, Niki Parmar, Jakob Uszkoreit, Llion Jones, Aidan N Gomez, Łukasz Kaiser, and Illia Polosukhin. Attention is all you need. In Advances in neural information processing systems, 5998–6008. 2017. URL: http://arxiv.org/abs/1706.03762.