Super einfacher Zugriff auf GPT-3.5 mit Lazarus bzw. Free Pascal

In etwa seit diesem Jahr stehen der Allgemeinheit KI’s zur Verfügung, die erstaunliche Fähigkeiten haben. Unter anderem können sie Text erstellen, der nicht mehr von dem von menschlichen Autoren geschriebenem Text zu unterscheiden ist. Das reizte mich auszuprobieren, ob sie mir auch vollautomatisch einen Roman schreiben können. Doch das ist im Moment noch nicht der Fall. Der offensichtlichste Grund dafür ist die begrenzte Textmenge, die sie auf eine Anfrage hin ausgeben. Es ist natürlich möglich mit Hilfe der KI einen Roman aus zusammengesetzten Teilen zu bauen, aber es ist schwierig darin auch so etwas wie einen ‘roten Faden’ zu erkennen.

Relativ einfach können Bücher erstellt werden die aus voneinander weitgehend unabhängigen Kapiteln bestehen. Wie zum Beispiel ein Buch über die Arduino Programmierung. Aber auch diese müssen manuell zusammen gesetzt werden.

Mich reizt es diesen Prozess zu automatisieren und dabei ein paar besondere Techniken zu integrieren, um so  vielleicht doch eine durchlaufende Metaebene oder Handlungsstruktur zu erzeugen. Darum begann ich mit der Entwicklung von geeigneten Werkzeugen zu experimentieren. Als Programmiersprache wählte ich Free Pascal, da ich es von früher her kenne und in Verbindung mit der Entwicklungsumgebung Lazarus dazu geeignet ist fensterorientierte Anwendungen zu programmieren, mit denen es leicht ist mit der Anwendung zu interagieren.

Für dieses Projekt zur automatisierten Erstellung von Büchern, benötigte ich unbedingt Zugriff auf eine KI die Text formulieren kann. Ich hatte schon ein bisschen herum recherchiert und die Beispiele auf der zugehörigen Seite von OpenAI angesehen. Dort sind verschiedene Beispiele, die sich aber auf Python oder Node.js beziehen. Oberflächlich betrachtet schien es so, als ob es genügt ein bischen Json zu formulieren und an einen Server zu senden. Das Python Beispiel nutzte aber eine Bibliothek für die Verarbeitung einiger Angaben, was mich erst einmalig abschreckte. Darum stöberte ich weiter im Internet und fand die Seite von LANDGRAF.DEV, auf der ein OpenAI ChatGPT API Client For Delphi and Lazarus angeboten wird. Diesen Client probierte ich aus und nach etwas Programmierarbeit konnte mein neues Projekt auf eine Text erstellende AI zugreifen!

Einige Stunden und Experimente später stellte ich allerdings fest, dass das von LANDGRAF.DEV verwendete KI Model ‘text-davinci-003’ ist, was deutlich schlechter bei der Texterstellung ist, als man das von Chat-GPT normalerweise gewohnt ist.

Darum erinnerte ich mich an meine ursprüngliche Idee das Ganze selbst zu programmieren. Auf der Suche nach Beispielen fand ich in einem Forum ein Stück Code von Thaddy de Koning, der das so ähnlich, wie ich mir das vorstellte, für ‘text-davinci-003’ entwickelt hat. An diesem Code knobelte ich einige Zeit herum, bis ich es schließlich für das Model ‘gpt-3.5-turbo’ angepasst hatte!

Das Programm unten funktioniert nur wenn Ihr einen API key von OpenAI besitzt! Dazu benötigt Ihr einen Account bei OpenAI und für umfangreichere Tests auf jeden Fall auch eine hinterlegte Kreditkarte!

Das unten aufgeführte Programm ist nur ein funktionierendes Beispiel und es liefert schon gute Antworten und Texte. Es kann allein durch Veränderung des Json Strings beeinflusst werden.

program project1;

uses classes, sysutils, fphttpclient, opensslsockets, fpJson, jsonparser;
const
model ='{"model":"gpt-3.5-turbo",' +
'"messages":' +
'[{"role": "system",' +
'"content": "You are a helpful assistant."},' +
'{"role": "user",' +
'"content": "%s"}],' +
'"temperature": 1}';
var
d:TJsonData;
s:string;
RequestStr:string;
ResultStr: string;
begin
writeln('What is your request?');
readln(s);
writeln;
with TfpHttpClient.Create(nil) do
try
AllowRedirect := true;
RequestHeaders.Add('Content-Type: application/json');
RequestHeaders.Add('Authorization: Bearer ' + GetEnvironmentVariable('OPENAI_API_KEY'));
RequestStr := format(model,[s]);
RequestBody := TStringStream.Create(RequestStr);
writeln('Please wait for the response, this can take some time:');
try
ResultStr := Post('https://api.openai.com/v1/chat/completions');
d := GetJson(ResultStr);
writeln(d.findpath('choices[0].message.content').AsString);
finally
d.free;
end;
finally
RequestBody.Free;
Free;
end;
end.

Auf Basis diesen Beispiels könnt Ihr Eure eigenen Anwendungen entwickeln. Es ist sehr rudimentär, zeigt aber gerade dadurch die wesentlichen Elemente eines Zugriffs auf die KI von OpenAI. Viel Spaß damit!

2 Kommentare

  1. When I use this code with my API key, I get:

    Please wait for the response, this can take some time:
    An unhandled exception occurred at $000000010517DDF6:
    ESocketError: Connect to api.openai.com:443 failed.
    $000000010517DDF6
    $000000010515A501
    $000000010515D110
    $000000010515D929
    $000000010515E1AB

    I am on OSX Big Sur

    Grts,
    Richard

Kommentar hinterlassen

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert