AW: Programme bzw. Funktionen von KI schreiben lassen (OpenAI)
Zitat:
jetzt finde ich nur 0.03 EUR / 1000 Token. Hab aber nicht besonders tief nachgeforscht. |
AW: Programme bzw. Funktionen von KI schreiben lassen (OpenAI)
Zitat:
https://help.openai.com/en/articles/...oes-gpt-4-cost https://openai.com/pricing gpt-3.5-turbo (für Auftrag): $0.002 / 1K tokens gpt-4 (für Auftrag und Antwort): 8K context : $0.03 / 1K tokens + $0.06 / 1K tokens 32K context :$0.06 / 1K tokens + $0.12 / 1K tokens 1 Token = quasi 1 Wort von $0.002 auf $0.03 + $0.06 Also je mehr ausschweifend GPT labert, um so besser für sie. |
AW: Programme bzw. Funktionen von KI schreiben lassen (OpenAI)
Stimmt, das waren 0.002 USD / Token, das war noch halbwegs OK, jetzt auf 0.03 erhöht.
Ich habe noch eine Anfrage bei denen offen ob die GPT4 sich auch die Token einer Session merkt, so wie ChatGPT, das wäre dann halbwegs OK. Die verstehen jetzt so langsam auch wie man damit Millardär wird :stupid: Man kann dem Teil aber sagen dass es möglichst kurz antworten soll, ich hoffe das reicht aus um Kosten zu sparen. |
AW: Programme bzw. Funktionen von KI schreiben lassen (OpenAI)
Bei GPT-3 konnte man ja auch hinten rum in die API (nicht über den Chat)
aber ob die speicherbaren Presets nur beim Anlegen die Token zählen, oder jedesmal neu beim ausführen :?: Es gab auch irgendwo eine ChatKI, die kann man sich Downloaden und dann lokal ausführen (und vermutlich auch da weiter lernen lassen). Braucht bloß ein bissl Platz für einige paar Terrabytes. |
AW: Programme bzw. Funktionen von KI schreiben lassen (OpenAI)
Also als Assistent finde ich das ganze erschreckend gut. Ich hab hier mal folgende Frage gestellt:
Bitte vervollständige folgenden Code: procedure Sort(const List: TStringlist); begin for i:=0 to List.Count-1 do for j:=0 to List.Count-1 do if list[I]<list[j] do begin list[I] := List[j]; list[j] := List[I]; end; end; Mir ist klar, dass das Bubblesort Beispiel Fehler hat, die hab ich wissentlich integriert. Die Antwort war folgende: Das gegebene Sortierverfahren ist nicht korrekt. Es gibt zwei Fehler im Code: Die Zuweisungen list[I] := List[j] und list[j] := List[I] tauschen die Werte der beiden Listenpositionen nicht korrekt aus. Der korrekte Tausch sollte wie folgt aussehen: temp := List[I]; List[I] := List[j]; List[j] := temp; Das Sortierverfahren ist ineffizient, da es eine quadratische Laufzeit hat. Es vergleicht jedes Element mit jedem anderen Element, was dazu führt, dass die Anzahl der Vergleiche exponentiell mit der Größe der Liste wächst. Eine effizientere Möglichkeit, Listen zu sortieren, ist beispielsweise der QuickSort-Algorithmus. Hier ist eine korrigierte Version des gegebenen Codes:
Delphi-Quellcode:
In dieser Version werden nur Paare von Elementen verglichen, die noch nicht verglichen wurden. Außerdem werden die Werte korrekt ausgetauscht.
procedure Sort(const List: TStringlist);
var i, j: integer; temp: string; begin for i := 0 to List.Count - 1 do for j := i + 1 to List.Count - 1 do if List[i] > List[j] then begin temp := List[i]; List[i] := List[j]; List[j] := temp; end; end; |
AW: Programme bzw. Funktionen von KI schreiben lassen (OpenAI)
Hier die gleiche Frage wie im vorherigen Post und die Antwort dazu:
Zitat:
Delphi-Quellcode:
procedure Sort(const List: TStringList); var i, j: Integer; temp: string; begin for i := 0 to List.Count - 2 do for j := i + 1 to List.Count - 1 do if List[i] > List[j] then begin temp := List[i]; List[i] := List[j]; List[j] := temp; end; end; Zitat:
|
AW: Programme bzw. Funktionen von KI schreiben lassen (OpenAI)
Ist ja auch nicht verkehrt, aber in dem Fall wollte ich die Liste nicht so sortiert, wie vorgeschlagen.
Frage: Warum "if List[i] > List[j] then" ? Antwort: Die Bedingung if List[i] > List[j] then prüft, ob das Element an Position i größer ist als das Element an Position j. Wenn dies der Fall ist, werden die beiden Elemente getauscht. Auf diese Weise werden die Elemente in der Liste nach der Größe sortiert. Das Tauschen der beiden Elemente sorgt dafür, dass das größere Element an die spätere Position der Liste verschoben wird und das kleinere Element an die frühere Position. Dadurch wird im Laufe des Sortiervorgangs sichergestellt, dass die Elemente in aufsteigender Reihenfolge sortiert werden. Hinweis: Wenn Sie die Elemente in absteigender Reihenfolge sortieren möchten, müssten Sie die Bedingung im if-Statement auf if List[i] < List[j] then ändern. Christian |
AW: Programme bzw. Funktionen von KI schreiben lassen (OpenAI)
Liste der Anhänge anzeigen (Anzahl: 3)
Jetzt, nach einem halben Jahr, muss ich hier noch mal einen ergänzenden Post los werden.
Ich bin echt geflasht, wie sich die Fähigkeiten von ChatGPT entwickelt haben. Ich möchte das mal an einem Beispiel demonstrieren. Bin gerade dabei ein Text-Verarbeitungsprogramm, dass ich mal vor 30 Jahren für DOS geschrieben habe, in die moderne Windows-Welt (Cross-Plattform) für FMX zu transformieren. Mal abgesehen, dass mir ChatGPT eine Menge zu dem alten DOS-Kram und Turbo-Pascal helfen konnte (dazu mache ich mal ein eigenes Video), ich nutze ChatGPT seit einiger Zeit recht häufig, als besseren Such-Ersatz für Google. Und das ist echt 1000 mal besser. Aber hin und wieder lasse ich mir auch mal ein paar Code-Schnipsel erstellen. Ich bin echt beeindruckt, das die KI inzwischen an komplexen Beschreibungen versteht und dann auch einen (immer häufiger) sofort funktionierenden Code zurück liefert. Bei dem folgenden code hat es auf Anhieb funktioniert: Meine Frage lautete: Kontext: Delphi, FMX. Ich habe einen Text ( ein Inhaltsverzeichnis), da steht am Anfang jeder Zeile eine Gliederungsnummer (z.B. "1.1.") und am Ende der Zeile (zuvor ein Leerzeichen) die Seitenzahl. Kannst Du mir eine Routine schreiben, die diesen Text in ein TTreeview einliest und dabei die Gliederungsebene in den entsprechenden Levels abbildet? Der Text sieht so aus: 1. Einleitung ......................... 1 1.1. Ein Wort über dieses Handbuch ...... 2 1.2. System-Voraussetzungen ............. 3 1.3. Die Dateien auf der Originaldiskette 3 1.4. Die Installation des Programmes .... 4 1.5. Start des Programmes ............... 5 2. Die Menüs von SKRIPT ............... 9 2.1. Das Menü "Text" .................... 9 2.1.1. Der Befehl "Holen" ................. 9 2.1.2. Der Befehl "Sichern" ............... 11 2.1.3. Der Befehl "Als ... Sichern" ....... 12 2.1.4. Der Befehl "Neuanlage" ............. 12 2.1.5. Der Befehl "Dateiname" ............. 12 Die Antwort (die Erläuterungen habe ich mal wegelassen):
Delphi-Quellcode:
Kompiliert im Programm sieht das Ergebnis dann wie in Bild 1 in der Anlage aus.
procedure TextToTreeView(const Text: string; TreeView: TTreeView);
var Lines: TStringList; I: Integer; LastItem: array of TTreeViewItem; Level, CurLevel: Integer; Line, Num, S: string; P: Integer; begin Lines := TStringList.Create; try Lines.Text := Text; SetLength(LastItem, 10); // Unterstützt bis zur Gliederungsebene 9.x.x.x.x.x.x.x.x.x for I := 0 to Lines.Count - 1 do begin Line := Lines[I]; P := Pos('.', Line); if P > 0 then begin // Nummer extrahieren Num := Copy(Line, 1, P-1); Delete(Line, 1, P); Level := 1; while (Length(Line) > 1) and (Line[2] = '.') do begin Delete(Line, 1, 2); Inc(Level); end; // Text extrahieren (ohne führende und endende Leerzeichen) S := Trim(Line); // Item hinzufügen if Level = 1 then begin LastItem[0] := TTreeViewItem.Create(TreeView); LastItem[0].Parent := TreeView; LastItem[0].Text := S; end else if Level <= Length(LastItem) then begin CurLevel := Level - 1; LastItem[CurLevel] := TTreeViewItem.Create(LastItem[CurLevel-1]); LastItem[CurLevel].Parent := LastItem[CurLevel-1]; LastItem[CurLevel].Text := S; end; end; end; finally Lines.Free; end; end; Nun gefielen mir aber nicht die Punkte und die Seitenzahlen am Ende (sind eher nebensache), aber ich brauch die Seitenzahl auch irgendwo gespeichert, damit ich beim Klick auf einen Eintrag an die entsprechende Stelle im Text springen kann. Meine Ergänzende Bitte lautete also: Das funktioniert super! Kannst Du die Funktion noch so abändern, dass der Wert der Seitenzahl in den jeweiligen TTreeviewItems in den Tag-Wert gespeichert wird und die Punkte und die Seitenzahlen aus dem Text entfernt werden? Die neue Funktion und das Ergebnis im Programm einkompiliert in Bildanlage 2:
Delphi-Quellcode:
Bei dieser Variante fehlten aber die Punkte am Anfang und hier wurden teilweise - unpassender Weise - Zahlen wieder gegeben.
procedure TextToTreeView(const Text: string; TreeView: TTreeView);
var Lines: TStringList; I: Integer; LastItem: array of TTreeViewItem; Level, CurLevel: Integer; Line, Num, S: string; P, PPage: Integer; PageNum: Integer; begin Lines := TStringList.Create; try Lines.Text := Text; SetLength(LastItem, 10); // Unterstützt bis zur Gliederungsebene 9.x.x.x.x.x.x.x.x.x for I := 0 to Lines.Count - 1 do begin Line := Lines[I]; P := Pos('.', Line); if P > 0 then begin // Nummer extrahieren Num := Copy(Line, 1, P-1); Delete(Line, 1, P); Level := 1; while (Length(Line) > 1) and (Line[2] = '.') do begin Delete(Line, 1, 2); Inc(Level); end; // Seitenzahl extrahieren PPage := Length(Line); while (PPage > 0) and (Line[PPage] >= '0') and (Line[PPage] <= '9') do Dec(PPage); // Falls eine Seitenzahl gefunden wurde, extrahiere und lösche sie aus Line if PPage < Length(Line) then begin PageNum := StrToInt(Trim(Copy(Line, PPage+1, MaxInt))); SetLength(Line, PPage); // Schneidet den String ab, um die Seitenzahl zu entfernen end else PageNum := -1; // oder wie Sie nicht zugewiesene Werte darstellen möchten // Text extrahieren (ohne führende und endende Leerzeichen) S := Trim(Line); // Punkte aus dem Text entfernen S := StringReplace(S, '.', '', [rfReplaceAll]); // Item hinzufügen if Level = 1 then begin LastItem[0] := TTreeViewItem.Create(TreeView); LastItem[0].Parent := TreeView; LastItem[0].Text := S; LastItem[0].Tag := PageNum; end else if Level <= Length(LastItem) then begin CurLevel := Level - 1; LastItem[CurLevel] := TTreeViewItem.Create(LastItem[CurLevel-1]); LastItem[CurLevel].Parent := LastItem[CurLevel-1]; LastItem[CurLevel].Text := S; LastItem[CurLevel].Tag := PageNum; end; end; end; finally Lines.Free; end; end; Auch mit zwei weiteren Nachfragen hat ChatGPT das aber nicht hinbekommen, so dass ich es selber angepasst habe (siehe Erläuternungen mit // HS:):
Delphi-Quellcode:
Somit sieht es dann wie im dritten Bild dargestellt aus.
procedure TextToTreeView(const Text: string; TreeView: TTreeView);
var Lines: TStringList; I: Integer; LastItem: array of TTreeViewItem; Level, CurLevel: Integer; Line, Num, S: string; P, PPage: Integer; PageNum: Integer; begin Lines := TStringList.Create; try Lines.Text := Text; SetLength(LastItem, 10); // Unterstützt bis zur Gliederungsebene 9.x.x.x.x.x.x.x.x.x for I := 0 to Lines.Count - 1 do begin Line := Lines[I]; P := Pos('.', Line); if P > 0 then begin // Nummer extrahieren var oldLine:= Line; // HS: Punkte werden noch gebraucht, also merken Num := Copy(Line, 1, P-1); Delete(Line, 1, P); Level := 1; while (Length(Line) > 1) and (Line[2] = '.') do begin Delete(Line, 1, 2); Inc(Level); end; Line := OldLine; // HS: Die alte Line wiederherstellen // Seitenzahl extrahieren PPage := Length(Line); while (PPage > 0) and (Line[PPage] >= '0') and (Line[PPage] <= '9') do Dec(PPage); // Falls eine Seitenzahl gefunden wurde, extrahiere und lösche sie aus Line if PPage < Length(Line) then begin PageNum := StrToInt(Trim(Copy(Line, PPage+1, MaxInt))); SetLength(Line, PPage); // Schneidet den String ab, um die Seitenzahl zu entfernen end else PageNum := -1; // oder wie Sie nicht zugewiesene Werte darstellen möchten // Text extrahieren (ohne führende und endende Leerzeichen) S := Trim(Line); // Punkte aus dem Text entfernen var ALeftPart := Copy (S, 1, Pos (' ', S)-1); // HS: Punkte vorne lassen var ARightPart := ' ' + Trim (Copy (S, Length (AleftPart)+1, Length (s))); // HS: Rechter Teil //S := StringReplace(S, '.', '', [rfReplaceAll]); // HS: Nicht alle Punkte entfernen ARightPart := StringReplace(ARightPart, '.', '', [rfReplaceAll]); // HS: Sondern nur im rechten Teile s := ALeftPart + ARightPart; // HS // Item hinzufügen if Level = 1 then begin LastItem[0] := TTreeViewItem.Create(TreeView); LastItem[0].Parent := TreeView; LastItem[0].Text := S; LastItem[0].Tag := PageNum; end else if Level <= Length(LastItem) then begin CurLevel := Level - 1; LastItem[CurLevel] := TTreeViewItem.Create(LastItem[CurLevel-1]); LastItem[CurLevel].Parent := LastItem[CurLevel-1]; LastItem[CurLevel].Text := S; LastItem[CurLevel].Tag := PageNum; end; end; end; finally Lines.Free; end; end; Also auch wenn der Code es nicht 100 Prozentig war, es hat mir eine Menge Zeit eingespart, die kleine Anpassung meinerseits hat nur 10 Minuten gedauert. Also ich bin echt beindruckt.... |
AW: Programme bzw. Funktionen von KI schreiben lassen (OpenAI)
Verwendest Du das kostenlose chatGPT oder die Bezahlversion?
Nach meinen ziemlich enttäuschenden Erfahrungen mit der kostenlosen Version habe ich da schon seit einiger Zeit nicht mehr reingeschaut, aber das hört sich jetzt ja sogar brauchbar an. |
AW: Programme bzw. Funktionen von KI schreiben lassen (OpenAI)
Das Beispiel sieht in der Tat recht brauchbar aus. Mit ChatGPT habe ich noch nicht getestet, dafür aber mit Bard von Google. Und da sind die Ergebnisse katastrophal schlecht, imho. Erster Test war im Kontext meines Steckenpferdes, dem Auslesen von ID3Tags. Da hat Bard konssequent nur Codes wie
Delphi-Quellcode:
geliefert, mit erfundenen Klassen, die bei den Indy-Komponenten dabei sein sollten. Wie das konkret geht (und sei es nut Version 1, d.h. Auslesen der letztem 128 Bytes einer Datei) - komplette Fehlanzeige. Auch nach Nachfragen nicht.
TID3Tag.ReadFromFile()
Dann habe ich etwas destruktiver getestet: Zitat:
Zitat:
Meine allgemeine Meinung dazu ist: Diese Modelle können ein gutes Werkzeug sein, wenn man die Antwort leicht verifizieren kann. Im Grunde also gut für Probleme in NP: Aufwändig zu berechnen, aber leicht zu überprüfen. Für Recherche zu unbekannten Themen hingegen scheinen diese Tools komplett ungeeignet zu sein. Die erzählen zu oft kompletten Unsinn. Wenn man nicht genug zu der Thematik weiß, um das zu erkennen, kommt am Ende nur Stuss bei raus. Wikipedia war für Schüler beim Schreiben von Referaten eine tolle Erfindung, die "KIs" halte ich bislang für eine mittlere Katastrophe in dieser Hinsicht. Kann gut sein, dass ChatGPT besser ist. Aber die KI von Google ist echt kaputt, imho. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 14:11 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz