ChatGPT schreibt einen kleinen Taschenrechner



  • @Th69 sagte in ChatGPT schreibt einen kleinen Taschenrechner:

    Wenn du selber ein Spiel spielst, möchtest du, das es bei einer falschen Eingabe sofort beendet wird? Das mit dem Wiederholen war ja auch nur ein Vorschlag (für ein gängiges Umsetzen bei Fehleingaben).

    Es lässt sich (im Sinne der Usability) darüber diskutieren, was gängig wäre ... zum Beispiel könnte der Spieler müde sein bzw. werden, und sollte mal eine Pause machen


  • Mod

    @Leon0402 sagte in ChatGPT schreibt einen kleinen Taschenrechner:

    @Fragender sagte in ChatGPT schreibt einen kleinen Taschenrechner:

    was hat das eine mit dem anderen zu tun ... "ChatGPT" ist nicht das Internet

    Was denkst du wie ChatGPT trainiert wurde? Garbage In, Garbage out.

    Das ist pauschal falsch. GPT ist auf allem trainiert worden, und es gibt gerade in fachlichen Bereichen auch viel Sinnvolles und Korrektes im Internet. Es haengt letztlich massgeblich vom Prompt ab, wie qualitativ die Ergebnisse sind. GPT-4 ist in der Lage ziemlich akkurate Antworten zu generieren, wenn der Kontext nicht falsch impliziert wird (d.h. Fachforum statt Youtube Kommentare)

    Andererseits wird ein Sprachmodell den Code nicht analytisch produzieren, wenn man es nicht explizit so fordert (step by step thinking). GPT ist bei einigen Fragen deutlich akkurater wenn man ausdruecklich nach einer langsamen Herleitung und keiner direkten Antwort verlangt. Alles Aspekte die wir von Menschen gewohnt sein sollten!

    Doch die Infos, mit denen es gefüttert wurde, stammen aus dem Internet (Stackoverflow, Github etc.).

    Ok? Und woher wurdest Du gefuettert? 😅



  • @Fragender sagte in ChatGPT schreibt einen kleinen Taschenrechner:

    Wodurch es aber immernoch nur ein Teil des "Internets" darstellt ...

    Wodurch aber eben die ursprüngliche Aussage wahr ist. Es ging darum, dass wenn es viel schlechten Code im Internet gibt und das KI Modell diesen - und sei es nur teilweise - zum lernen nutzt, tendenziell schlechtere Antworten gibt.

    @Columbo sagte in ChatGPT schreibt einen kleinen Taschenrechner:

    Das ist pauschal falsch. GPT ist auf allem trainiert worden, und es gibt gerade in fachlichen Bereichen auch viel Sinnvolles und Korrektes im Internet. Es haengt letztlich massgeblich vom Prompt ab, wie qualitativ die Ergebnisse sind. GPT-4 ist in der Lage ziemlich akkurate Antworten zu generieren, wenn der Kontext nicht falsch impliziert wird (d.h. Fachforum statt Youtube Kommentare)

    Ich weiß nicht, was du mir genau sagen willst. Selbstverständlich ist das Modell schlechter, wenn die Trainingsdaten schlechter sind. Da ist nichts pauschal dran falsch.
    Das das Modell in der Lage ist trotz falscher Daten im Training richtige Daten zu produzieren ist natürlich korrekt, stand aber hier nicht zur Debatte.

    Falls es um meine Gesamtaussage "Garbarge In, Garbage Out" ging. Das bezieht sich lediglich darauf, dass es eine Kausalität zwischen schlechtem Input und schlechtem Output gibt. Daher wenn das KI Modell eine schlechte Ausgabe gibt ist es nahliegend und realistisch, dass die Trainingsdaten nicht so toll waren. Das war die aussage Von Th69. Und in diesem Kontext sollte meine Antwort dann auch betrachtet werden.

    @Columbo sagte in ChatGPT schreibt einen kleinen Taschenrechner:

    Ok? Und woher wurdest Du gefuettert?

    Falls du darauf hinaus willst, dass auch wir mit Daten aus dem Internet etc. gefüttert wurden. Völlig richtig. Und du kannst dir auch sicher sein, dass wenn wir mit den falschen Daten gefüttert werden, ein Risiko besteht, dass wir es auch falsch lernen. Mit der KI ist es nicht anderes. Die ist schlau genug, um nicht alles exakt 1:1 aus ihren Trainingsdaten zu übernehmen, sonst müsste man auch drüber diskutieren, wie viel KI in dieser KI wirklich drin steckt, wenn das so wäre. Die Kausalität besteht natürlich trotzdem.


  • Mod

    @Leon0402 sagte in ChatGPT schreibt einen kleinen Taschenrechner:

    @Fragender sagte in ChatGPT schreibt einen kleinen Taschenrechner:

    Wodurch es aber immernoch nur ein Teil des "Internets" darstellt ...

    Wodurch aber eben die ursprüngliche Aussage wahr ist. Es ging darum, dass wenn es viel schlechten Code im Internet gibt und das KI Modell diesen - und sei es nur teilweise - zum lernen nutzt, tendenziell schlechtere Antworten gibt.

    Das ist ein Trugschluss. Ein LLM ist ein statistisches Modell dass semiotische Priors hat, welche kontextabhaengig sind. Wenn wir dem Modell explizit sagen, es soll RAII o.ae. konformen Code schreiben, dann wird das auch meistens passieren.

    Jetzt kann ein Anfaenger natuerlich nicht wissen, dass er dem Modell derartige Details diktieren muss, womit wir bei dem klassischen Teufelskreis waeren: Man kann Expertise nicht bootstrappen. Ein Experte weiss sowieso wie guter Code aussieht, und kann daher die KI problemlos anleiten. Ein Anfaenger fragt schon so daemlich, dass der semiotische prior zugunsten eines Anfaengerforums gekippt wird, was die Qualitaet der Antworten daempfen muesste.

    @Columbo sagte in ChatGPT schreibt einen kleinen Taschenrechner:

    Das ist pauschal falsch. GPT ist auf allem trainiert worden, und es gibt gerade in fachlichen Bereichen auch viel Sinnvolles und Korrektes im Internet. Es haengt letztlich massgeblich vom Prompt ab, wie qualitativ die Ergebnisse sind. GPT-4 ist in der Lage ziemlich akkurate Antworten zu generieren, wenn der Kontext nicht falsch impliziert wird (d.h. Fachforum statt Youtube Kommentare)

    Ich weiß nicht, was du mir genau sagen willst. Selbstverständlich ist das Modell schlechter, wenn die Trainingsdaten schlechter sind. Da ist nichts pauschal dran falsch.
    Das das Modell in der Lage ist trotz falscher Daten im Training richtige Daten zu produzieren ist natürlich korrekt, stand aber hier nicht zur Debatte.

    Deine Aussage "garbage in, garbage out" impliziert, dass die Mehrheit des Internets, welches ja aus ziemlich viel Garbage besteht, daher viel Garbage im Output der LLMs zu erwarten waere. Das ist Quatsch.

    Falls es um meine Gesamtaussage "Garbarge In, Garbage Out" ging. Das bezieht sich lediglich darauf, dass es eine Kausalität zwischen schlechtem Input und schlechtem Output gibt. Daher wenn das KI Modell eine schlechte Ausgabe gibt ist es nahliegend und realistisch, dass die Trainingsdaten nicht so toll waren.

    Nein, das ist ueberhaupt nicht naheliegend. Es ist naheliegend, dass der Prompt einen schlechten semiotischen prior erwischt hat. Es ist naheliegend, dass die Aufgabe iteratives Analysieren erfordert, zu welchem ein LLM nicht eo ipso in der Lage ist (ausser man setzt bestimmte prompt Techniken ein etc).

    @Columbo sagte in ChatGPT schreibt einen kleinen Taschenrechner:

    Ok? Und woher wurdest Du gefuettert?

    Falls du darauf hinaus willst, dass auch wir mit Daten aus dem Internet etc. gefüttert wurden.

    Ne. 🤣


  • Mod

    Hab es mal nach einem Taschenrechner in modernem, idiomatischem C++ gefragt. Das Ergebnis war identisch zu dem von Erhard Henkes oben, außer dass die Rechenoperationen in (einzeilige) Funktionen ausgelagert wurden, und ein völlig unbenutztes cmath eingebunden wurde. Nun, vielleicht gibt die Aufgabe auch einfach nicht mehr her. Bei vier Rechenoperationen würde ich es selber ja auch nicht anders machen. Erst wenn da Erweiterbarkeit geplant ist, würde ich da anfangen, die Eingabe in syntaktische Elemente zu zerlegen, die dann (anders als mit einer if-Kaskade) auf die Implementierung gemappt werden.

    Das hat natürlich zu dem Prompt geführt, dass es den Taschenrechner doch bitte erweiterbar machen sollte, wo dann dies rauskam:

    #include <iostream>
    #include <string>
    #include <vector>
    #include <cmath>
    
    using namespace std;
    
    double add(double a, double b) { return a + b; }
    double subtract(double a, double b) { return a - b; }
    double multiply(double a, double b) { return a * b; }
    double divide(double a, double b) { return a / b; }
    double power(double a, double b) { return pow(a, b); }
    double square_root(double a) { return sqrt(a); }
    
    struct operation {
        string symbol;
        double (*function)(double, double);
    };
    
    vector<operation> operations = {
        {"+", add},
        {"-", subtract},
        {"*", multiply},
        {"/", divide},
        {"^", power},
        {"sqrt", square_root}
    };
    
    int main() {
        double a, b;
        string op;
    
        cout << "Enter an expression (e.g. 2 + 3): ";
        cin >> a >> op >> b;
    
        for (auto& oper : operations) {
            if (oper.symbol == op) {
                cout << oper.function(a, b) << endl;
                return 0;
            }
        }
    
        cout << "Invalid operator" << endl;
        return 
    

    und dann ist der Stream abgebrochen, weil es zu lange zum generieren der Antwort gebraucht hat. Aber man sieht schon, da sind Logikfehler (und Compilierfehler!) im Aufbau, die sich nicht beheben lassen, selbst wenn es da noch mit irgendetwas anderem weiter ginge als 1;}. Das merke ich auch immer wieder bei Tests, wo ich es spaßeshalber auf echte Probleme loslasse. Sobald die Anforderung ein bisschen interessanter wird, kommt häufig diese Art von nicht-funktionaler Mischung aus professionellem Ansatz mit Anfängercode drumherum heraus. Das liegt wahrscheinlich daran, dass die vollständig ausprogrammierten Beispiele, die man im Internet findet, halt die Anfängercodes sind, wohingegen bei Expertenfragen nur Fragmente für den richtigen Ansatz gezeigt werden, weil man (zurecht) erwarten kann, dass ein Könner das Drumherum von alleine hinbekommt.

    PS: In Python (was es gefühlt besser kann als C++) macht es die gleiche Art Fehler. Es nimmt zwar mehr als zweiseitige Operatoren in seine Operationsliste auf, aber der Parser geht naiv von "Zahl->Whitespace->Operator->Whitespace->Zahl" aus.
    PPS: Und so interessant ist dieser Prompt eigentlich nicht. Ich bin ziemlich enttäuscht, dass es so krasse Fehler produziert, und nicht einmal einen brauchbaren Ansatz für das Parsing hat. Bisher war ich eigentlich immer positiv überrascht, wie weit man eine Anforderung treiben kann, bevor es anfängt zu spinnen. Vielleicht sind hier die Lerndaten bei dem "Taschenrechner"-Prompt zu sehr verseucht mit der hunderttausendfach gestellten Hausaufgabe, so dass bessere Ansätze völlig untergehen?


  • Mod

    @SeppJ Was ist "es"? Codex? GPT-3? GPT-4? Mit welchem fine tuning?

    Mit Copilot (d.h. Codex?) bekomme ich

    // Write a calculator app in modern C++ using RAII and the STL. It can do all basic calculator instructions (plus, minus, divide, multiply) and is extensible.
    #include <iostream>
    
    #include <functional>
    #include <memory>
    #include <string>
    #include <vector>
    
    #include <boost/algorithm/string.hpp>
    
    int main()
    {
        std::vector<std::string> instructions;
        std::string instruction;
        while (std::getline(std::cin, instruction))
        {
            instructions.push_back(instruction);
        }
    
        std::vector<std::function<void()>> actions;
        actions.reserve(instructions.size());
    
        for (auto const& instruction : instructions)
        {
            std::vector<std::string> tokens;
            boost::split(tokens, instruction, boost::is_any_of(" "));
    
            if (tokens.size() != 3)
            {
                std::cerr << "Invalid instruction: " << instruction << std::endl;
                return 1;
            }
    
            auto const& op = tokens[0];
            auto const& lhs = tokens[1];
            auto const& rhs = tokens[2];
    
            if (op == "add")
            {
                actions.push_back([lhs, rhs] {
                    std::cout << lhs << " + " << rhs << " = " << std::stoi(lhs) + std::stoi(rhs) << std::endl;
                });
            }
            else if (op == "sub")
            {
                actions.push_back([lhs, rhs] {
                    std::cout << lhs << " - " << rhs << " = " << std::stoi(lhs) - std::stoi(rhs) << std::endl;
                });
            }
            else if (op == "mul")
            {
                actions.push_back([lhs, rhs] {
                    std::cout << lhs << " * " << rhs << " = " << std::stoi(lhs) * std::stoi(rhs) << std::endl;
                });
            }
            else if (op == "div")
            {
                actions.push_back([lhs, rhs] {
                    std::cout << lhs << " / " << rhs << " = " << std::stoi(lhs) / std::stoi(rhs) << std::endl;
                });
            }
            else
            {
                std::cerr << "Invalid operation: " << op << std::endl;
                return 1;
            }
        }
    
        for (auto const& action : actions)
        {
            action();
        }
    
        return 0;
    }
    

    Was will man darueber sagen... die Syntax des Rechners ist zwar Prefix statt Infix, aber es funktioniert und setzt moderne Features mehr oder weniger korrekt ein (sieht schon affig aus mit dem action delay haha).



  • Hat jemand Ahnung aus welchem Elementen / Classifiern OpenAI besteht?

    Ist dies ein riesiges MLP, oder ein MLP in Kombination mit Case Based Reasoning?


  • Mod

    @Columbo sagte in ChatGPT schreibt einen kleinen Taschenrechner:

    @SeppJ Was ist "es"? Codex? GPT-3? GPT-4? Mit welchem fine tuning?

    Chat-GPT,, worum es hier im Thread schließlich geht, also eine GPT-3 Variante, die nicht speziell auf Programmierung getuned ist. Mit dem Prompt, modernes, idiomatisches C++ zu schreiben. Ich habe danach nicht versucht, es auf die Fehler aufmerksam zu machen um eine bessere Version zu bekommen. Denn wenn ich schon weiß, wie ein korrektes und besseres Programm aussieht, kann ich mir die KI-Unterstützung auch sparen; dann ist sie nicht mehr als ein schlechter Junior-Programmierer, den ich mit Gewalt zur "richtigen" Lösung leiten muss.


  • Mod

    Die Antwort von Sydney, welches auf GPT-4 basiert:

    #include <iostream>
    #include <string>
    #include <functional>
    #include <map>
    #include <boost/lexical_cast.hpp>
    
    class Calculator {
    public:
        Calculator() {
            // Initialize the operations map with some basic operations
            operations_["add"] = std::plus<double>();
            operations_["subtract"] = std::minus<double>();
            operations_["multiply"] = std::multiplies<double>();
            operations_["divide"] = std::divides<double>();
        }
    
        // Add a new operation to the calculator
        void add_operation(const std::string& name, const std::function<double(double,double)>& op) {
            operations_[name] = op;
        }
    
        // Perform a calculation using the specified operation
        double calculate(const std::string& operation, double x, double y) {
            auto it = operations_.find(operation);
            if (it != operations_.end()) {
                return it->second(x,y);
            } else {
                throw std::invalid_argument("Invalid operation: " + operation);
            }
        }
    
    private:
        // Map of available operations
        std::map<std::string,std::function<double(double,double)>> operations_;
    };
    
    int main(int argc,char* argv[]) {
      if(argc<4){
          std::cout<<"Usage: "<<argv[0]<<" [operation] [operand1] [operand2]"<<std::endl;
          return 1;
      }
      Calculator calc;
      try{
          double x=boost::lexical_cast<double>(argv[2]);
          double y=boost::lexical_cast<double>(argv[3]);
          double result=calc.calculate(argv[1],x,y);
          std::cout<<result<<std::endl;
      }catch(std::exception& e){
          std::cerr<<e.what()<<std::endl;
          return 1;
      }
    }
    

    Darauf hin habe ich gebeten, den Rechner mit Infix Notation und einer stdin Eingabe umzuschreiben, was prompt erfolgt ist, aber ein sehr komplexes Program mit einem Syntaxfehler und einem Segfault ergeben hat. Weiter habe ich nicht geschaut.

    @SeppJ sagte in ChatGPT schreibt einen kleinen Taschenrechner:

    @Columbo sagte in ChatGPT schreibt einen kleinen Taschenrechner:

    @SeppJ Was ist "es"? Codex? GPT-3? GPT-4? Mit welchem fine tuning?

    Chat-GPT,, worum es hier im Thread schließlich geht, also eine GPT-3 Variante, die nicht speziell auf Programmierung getuned ist. Mit dem Prompt, modernes, idiomatisches C++ zu schreiben. Ich habe danach nicht versucht, es auf die Fehler aufmerksam zu machen um eine bessere Version zu bekommen. Denn wenn ich schon weiß, wie ein korrektes und besseres Programm aussieht, kann ich mir die KI-Unterstützung auch sparen; dann ist sie nicht mehr als ein schlechter Junior-Programmierer, den ich mit Gewalt zur "richtigen" Lösung leiten muss.

    Schon klar. Der Punkt ist, dass der Progress in den letzten Jahren so enorm war, dass man davon ausgehen darf, in den naechsten LLM Generationen an einen Punkt zu kommen, an dem die Assistenz besser ist als ein schlechter (aber sehr schneller) Junior Programmierer.


  • Mod

    @SeppJ Ich wollte noch erwaehnen, dass wir natuerlich auch davon ausgehen muessen, dass die Daseinsberechtigung dieses Forums sich damit erledigt, dass KI sehr schnell und akkurat auf Anfaengerfragen antworten kann. 😉


  • Mod

    @Columbo sagte in ChatGPT schreibt einen kleinen Taschenrechner:

    @SeppJ Ich wollte noch erwaehnen, dass wir natuerlich auch davon ausgehen muessen, dass die Daseinsberechtigung dieses Forums sich damit erledigt, dass KI sehr schnell und akkurat auf Anfaengerfragen antworten kann. 😉

    Ja, ich habe ja selber schon mehrmals einfach die Frage eines Threaderstellers in Chat-GPT eingegeben (Copy & Paste auf Deutsch inklusive aller Fehler!) und dann ein perfektes(!) Ergebnis erhalten, das ich dann hier gepostet habe. Bis es mir langweilig wurde 🙂

    Aber bezüglich des Fortschritts in dieser Sache bleibt mir die Frage unbeantwortet, woher die Modelle das denn lernen sollen. Der Einwand, dass es im Internet viel Mist gibt wurde ja schon diskutiert ob und wie man da drum herum kommt, aber das Problem ist meines Erachtens eher, dass es wenig richtig gut designten Code gibt, der vollständig verfügbar ist. Mit den vielfach verfügbaren Hinweisen, wie man gut programmiert, und fragmentarischen Beispielen dazu, können die jetzigen Modelle nichts anfangen, wenn es darum geht, ein vollständiges Programm zu produzieren. Da wären noch 1-2 revolutionäre Fortschritte nötig.



  • @Columbo sagte in ChatGPT schreibt einen kleinen Taschenrechner:

    Das ist ein Trugschluss. Ein LLM ist ein statistisches Modell dass semiotische Priors hat, welche kontextabhaengig sind. Wenn wir dem Modell explizit sagen, es soll RAII o.ae. konformen Code schreiben, dann wird das auch meistens passieren.
    Jetzt kann ein Anfaenger natuerlich nicht wissen, dass er dem Modell derartige Details diktieren muss, womit wir bei dem klassischen Teufelskreis waeren: Man kann Expertise nicht bootstrappen. Ein Experte weiss sowieso wie guter Code aussieht, und kann daher die KI problemlos anleiten. Ein Anfaenger fragt schon so daemlich, dass der semiotische prior zugunsten eines Anfaengerforums gekippt wird, was die Qualitaet der Antworten daempfen muesste.

    Könntest du das näher erklären? Ich verstehe das nämlich nicht.

    Ich bin gedanklich bei den Classifiern (z.B. LogisticRegression, SVM, Adaline, Entscheidungsbäume, Perzeptrons,...) und deren Probleme wie hoher Bias, hohe Varianz, Fluch der Dimensionen, Auswahl aussagekräftiger Merkmale,... Und vor allen Dingen auch an das schöne Blumenbeispiel, wo man Blumensorten anhand der Länge des Kelchblattes und der Länge des Blütenblattes charakterisiert und die Entscheidungsgrenzen sieht.

    Aktuell stöbere ich mich durch den CelebFaces Attributes Datensatz zur Detektion Männlich / Weiblich mittels Tensorflow / Keras. Und dieser Datensatz beträgt 1.62 GByte.

    Und da frage ich mich, wie man an GByte von gutem Code kommt. Und wie sich guter Code qualifizieren lässt.

    Man stelle sich vor ein Codefragment von Jürgen Wolf würde in den Testdaten rutschen...



  • @SeppJ sagte in ChatGPT schreibt einen kleinen Taschenrechner:

    @Columbo sagte in ChatGPT schreibt einen kleinen Taschenrechner:

    @SeppJ Was ist "es"? Codex? GPT-3? GPT-4? Mit welchem fine tuning?

    Chat-GPT,, worum es hier im Thread schließlich geht, also eine GPT-3 Variante, die nicht speziell auf Programmierung getuned ist. Mit dem Prompt, modernes, idiomatisches C++ zu schreiben. Ich habe danach nicht versucht, es auf die Fehler aufmerksam zu machen um eine bessere Version zu bekommen. Denn wenn ich schon weiß, wie ein korrektes und besseres Programm aussieht, kann ich mir die KI-Unterstützung auch sparen; dann ist sie nicht mehr als ein schlechter Junior-Programmierer, den ich mit Gewalt zur "richtigen" Lösung leiten muss.

    Ein auf Programmierung spezialisiertes System ist natürlich besser, aber in unbekannten Sprachen bekommt man damit und schnellem Googlen nach den üblichen Idiomen schnell was hin, wenn man in C++ erfahren ist.


  • Mod

    @Quiche-Lorraine Das Modell ist so maechtig, dass es ist in der Lage ist, zu einem gegebenen Sachverhalt ganz unterschiedliche Meinungen/Ansaetze einzunehmen. Es ist bei einem Anfaengerforum wahrscheinlicher, schlechten Code zu sehen, als in der Mailingliste von std-discussion oder WG21 etc. oder vielleicht beim language-lawyer Tag auf SO. Indem wir den Kontext der Unterhaltung entsprechend darstellen, veraendern wir hiermit den vom Modell wahrgenommenen Kontext, der wiederum das Spektrum der Antworten zugunsten einer dieser Rahmen neigt.

    Das bedeutet, solange irgendwo im Datensatz korrekte Aussagen sind (vermischt mit vielen anderen Daten die falsch/irrefuehrend etc. sind), gilt es, diese mittels eines clever gewaehlten Prompts herauszufiltern. Das funktioniert solange

    1. 'schlechter' und 'guter' Code relativ strikt nach Kontext getrennt sind. Das ist hier gegeben; schlechter Code wird i.d.R. von Menschen geschrieben, die dann im Bezug auf diesen Code auch dumme Sachen schreiben und gewisse Begriffe wie RAII/TMP/etc etc gar nicht einsetzen.
    2. das Verhaeltnis von schlechtem Code und gutem Code nicht allzu krass ist. Auch das ist IMO gegeben.

    Man sieht ja an dem Code den ich habe generieren lassen, dass die Qualitaet deutlich besser ist als bei SeppJ, bspw. im ersten sogar ein logisch und sprachlich korrektes Programm produziert worden ist. Ich frag mich was passiert, wenn wir das Modell bitten, eine Antwort zu generieren, die von bspw. Herb Sutter stammen koennte... 😃

    Man stelle sich vor ein Codefragment von Jürgen Wolf würde in den Testdaten rutschen...

    Edit: das ist uebrigens ein guter Punkt. Juergen Wolf ist sehr irrefuehrend (auch fuer Menschen!) weil er zwar in fachlich ausgereifter Weise ueber seine Programme schreibt, diese dann aber ziemlicher Dreck sind. Zum Glueck ist das eine Ausnahme.



  • @Columbo sagte in ChatGPT schreibt einen kleinen Taschenrechner:

    Das ist ein Trugschluss. Ein LLM ist ein statistisches Modell dass semiotische Priors hat, welche kontextabhaengig sind. Wenn wir dem Modell explizit sagen, es soll RAII o.ae. konformen Code schreiben, dann wird das auch meistens passieren.

    Das impliziert aber ja, dass es diesen Kontext gibt, der (zum Großteil) mit guten Informationen gefüttert worden ist. Wenn in den Trainingsdaten lauter Daten Forumsbeiträge mit angeblich RAII konformen Code geflossen sind, der Code aber in Wahrheit mal so gar nicht RAII konform war, dann wird das Modell meistens wohl auch keinen RAII konformen Output generieren.

    @Columbo sagte in ChatGPT schreibt einen kleinen Taschenrechner:

    Deine Aussage "garbage in, garbage out" impliziert, dass die Mehrheit des Internets, welches ja aus ziemlich viel Garbage besteht, daher viel Garbage im Output der LLMs zu erwarten waere. Das ist Quatsch.

    Das ist kein Quatsch. Ganz im allgemeinen, wenn der Großteil der Trainingsdaten schlecht ist, dann ist ein Großteil des Ouputs ebenfalls schlecht. Das man mit selektiven Promts trotzdem immer guten Output generieren kann steht in keinem Widerspruch zu dieser Aussage. Auch ist es natürlich möglich, dass das Modell je nach Struktur der Trainingsdaten es schafft, die schlechten Trainingsdaten zu ignorieren (vereinfacht ausgedrückt).
    Diese Muster wird es in den Trainingsdaten garantiert geben und dem Modell zu einem gewissen Grad erlauben trotz falscher Daten das Richtige zu lernen. Beispiel wäre hier, dass das Modell vlt. bestimmte Quellen gegenüber anderen bevorzugt.

    Aber dennoch, eine Kausalität zwischen schlechten Trainingsdaten und schlechtem Output ist ganz Allgemein kaum von der Hand zu weisen.

    Das kann man sich auch ganz leicht bewusst machen. Wenn in den Trainingsdaten nur ganz toller Code gewesen wäre, wäre der Taschenrechner mit sehr großer Wahrscheinlichkeit besser gewesen.

    @Columbo sagte in ChatGPT schreibt einen kleinen Taschenrechner:

    Nein, das ist ueberhaupt nicht naheliegend. Es ist naheliegend, dass der Prompt einen schlechten semiotischen prior erwischt hat. Es ist naheliegend, dass die Aufgabe iteratives Analysieren erfordert, zu welchem ein LLM nicht eo ipso in der Lage ist (ausser man setzt bestimmte prompt Techniken ein etc).

    Man kann nicht einfach sagen: Da war der User halt zu dumm und hat ungenaue Angaben gemacht. Das mag in Ausnahmefällen mal der Fall sein, aber hier mit Sicherheit nicht. Wenn ich einem sehr guten C++ Entwickler den selben Input gegeben hätte, dann hätte dieser es besser gemacht.
    Es ist nun mal Teil der Aufgabe des KI Modells sich den Kontext auch zu erschließen und zwar den richtigen Kontext.

    Z.B. Sagen wir die Eingabedaten sind tatsächlich wie du sagst relativ strikt in guten und schlechten Code einteilbar. Dann müsste das Modell eben lernen:
    a) Welche der beiden Teilmengen ist der gute und der schlechte Code
    b) Das guter Code im allgemeinen zu bevorzugen ist

    Daher wenn ich nicht explizit spezifiziere, dass ich schlechten Code haben will, soll eine gutes Modell mir den guten Code by default geben.

    Das Modell hat das also nicht optimal gelernt, denn man muss ihm zusätzliche Hinweise geben wie z.B: RAII. Er hätte es mit Sicherheit besser gelernt, wenn es mehr guten Code als Trainingsdaten gehabt hätte. Oder wenn der schlechte Code (z.B. hier aus dem Forum) immer im Kontext gelernt wird, wo irgendein Nutzer sagt, der Code ist schlecht, weil. Trainingsdaten sind natürlich nicht der einzige Faktor, aber eben schon der einer der Hauptfaktoren. Je besser der Trainingsdatensatz desto besser das Modell im Allgemeinen.



  • @SeppJ sagte in ChatGPT schreibt einen kleinen Taschenrechner:

    Chat-GPT,, worum es hier im Thread schließlich geht, also eine GPT-3 Variante

    Du solltest schon die neuste Variante nehmen, wenn du kritisieren möchtest...

    @Columbo sagte in ChatGPT schreibt einen kleinen Taschenrechner:

    in den naechsten LLM Generationen an einen Punkt zu kommen, an dem die Assistenz besser ist als ein schlechter (aber sehr schneller) Junior Programmierer

    Oder... in einer (schlechten) Firma besser als ein schlechter Senior Programmierer wäre. 🤡 😅

    Ne, Punkt ist doch... irgendwer muss doch die KI schreiben oder diese verbessern, insofern werden Informatiker auch nicht arbeitslos.



  • @Fragender sagte in ChatGPT schreibt einen kleinen Taschenrechner:

    Ne, Punkt ist doch... irgendwer muss doch die KI schreiben oder diese verbessern, insofern werden Informatiker auch nicht arbeitslos.

    Nur erfordert das halt ganz andere Skills. Ich glaube auch, dass der Bedarf an Informatikern trotz KI nicht sinken wird. Aber einige Jobs werden wohl trotzdem bedroht sein, weil eben nicht jeder es schaffen wird diese Entwicklung mitzumachen. Das ist aber irgendwie immer so.


  • Mod

    Als ich mir gerade die Kommentare zum Bann von ChatGPT auf Stackoverflow anguckte, fiel mir ein interessanter Kommentar/Einwand auf: Diese Systeme beruhen darauf, dass sie aus menschlichen Antworten lernen. Aber die nächste Generation wird schon aus einem Pool lernen, in dem es Beiträge der vorherigen Generation gibt, die sich auch nicht so leicht von menschlichen Antworten unterscheiden lassen. Auf den ersten Blick sehen solche Beiträge sogar außerordentlich kompetent aus (das ist sogar, woran man sie am einfachsten erkennt), wie etwas an dem man sich orientieren sollte.

    Jetzt mag das zwar noch eine verschwindend geringe Menge sein, aber das wird im Laufe der Generationen immer mehr zum Problem werden, wenn die (KI-)Kinder den Unsinn lernen, den sie von ihren Urgroßeltern überliefert bekommen. Hat irgendwie Ähnlichkeit mit menschlicher Gesellschaft. Aber Menschenkinder haben die Möglichkeit (und sogar den Trieb) die alten Weisheiten zu hinterfragen, die KI-Modelle machen das Gegenteil.

    Bei Systemen, die klare Kriterien zur "Richtigkeit" haben, z.B. Spiel-KIs, ist das noch leicht zu filtern, weil die besser trainierten KIs einfach gewinnen, und sich dadurch als objektiv besser erweisen. Aber bei so Allgemeinwissenssystemen, wie hier, ist die Realität der objektive Maßstab, und diese ist für die KIs nicht messbar und kann daher nicht genutzt werden, um die Güte in einem Wettbewerb festzustellen.



  • @SeppJ sagte in ChatGPT schreibt einen kleinen Taschenrechner:

    Aber Menschenkinder haben die Möglichkeit (und sogar den Trieb) die alten Weisheiten zu hinterfragen, die KI-Modelle machen das Gegenteil

    Das ist erst einmal nur eine Behauptung. Kannst du deren Richtigkeit beweisen, in dem du das Gegenteil (KI-Modelle orientieren sich nicht ausschließlich an Vorgängerwissen) widerlegst? Das glaube ich kaum, weil hier keiner an der Entwicklung von ChatGPT beteiligt war/ist ... 😉



  • Sind mein Prompt, die Erklärungen und der Code von chatGPT OK?

    Schreibe bitte in sehr gutem idiomatischen C++ gemäß RAII ein erweiterbares Programm für einen Taschenrechner.

    chatGPT-3.5 (Version vom 23.03.2023)
    Erstellt am 09.04.2023

    Gerne! Hier ist ein Beispielprogramm für einen Taschenrechner in C++ mit RAII. Das Programm verwendet einen Stack, um die Operanden und Operationen zu speichern, und verfügt über eine einfache Benutzeroberfläche, die vom Benutzer Eingaben entgegennimmt und das Ergebnis auf der Konsole ausgibt. Es ist auch möglich, das Programm um weitere Funktionen zu erweitern, indem Sie die Klasse "Operation" erweitern und die entsprechenden Funktionen implementieren.

    #include <iostream>
    #include <stack>
    #include <string>
    
    class Operation {
    public:
        virtual ~Operation() {}
        virtual double evaluate(double a, double b) const = 0;
    };
    
    class AddOperation : public Operation {
    public:
        virtual double evaluate(double a, double b) const {
            return a + b;
        }
    };
    
    class SubtractOperation : public Operation {
    public:
        virtual double evaluate(double a, double b) const {
            return a - b;
        }
    };
    
    class MultiplyOperation : public Operation {
    public:
        virtual double evaluate(double a, double b) const {
            return a * b;
        }
    };
    
    class DivideOperation : public Operation {
    public:
        virtual double evaluate(double a, double b) const {
            if (b == 0) {
                throw std::runtime_error("Division by zero");
            }
            return a / b;
        }
    };
    
    class Calculator {
    public:
        void pushOperand(double operand) {
            operands_.push(operand);
        }
    
        void pushOperation(Operation* operation) {
            operations_.push(operation);
        }
    
        double calculate() {
            double result = 0;
            if (!operands_.empty()) {
                result = operands_.top();
                operands_.pop();
            }
    
            while (!operations_.empty() && !operands_.empty()) {
                Operation* operation = operations_.top();
                operations_.pop();
                double operand = operands_.top();
                operands_.pop();
                result = operation->evaluate(operand, result);
            }
    
            return result;
        }
    
    private:
        std::stack<double> operands_;
        std::stack<Operation*> operations_;
    };
    
    int main() {
        Calculator calculator;
        while (true) {
            std::string input;
            std::cout << "> ";
            std::getline(std::cin, input);
    
            if (input == "exit") {
                break;
            }
    
            try {
                double operand = std::stod(input);
                calculator.pushOperand(operand);
            } catch (const std::exception&) {
                if (input == "+") {
                    calculator.pushOperation(new AddOperation());
                } else if (input == "-") {
                    calculator.pushOperation(new SubtractOperation());
                } else if (input == "*") {
                    calculator.pushOperation(new MultiplyOperation());
                } else if (input == "/") {
                    calculator.pushOperation(new DivideOperation());
                } else if (input == "=") {
                    double result = calculator.calculate();
                    std::cout << "Result: " << result << std::endl;
                } else {
                    std::cerr << "Invalid input" << std::endl;
                }
            }
        }
    
        return 0;
    }
    

    In diesem Beispiel verwendet das Programm das Konzept der RAII, um sicherzustellen, dass die Ressourcen, die von den Operationen verwendet werden, automatisch freigegeben werden, wenn sie nicht mehr benötigt werden. Das Programm definiert eine abstrakte Basisklasse "Operation", die die Methode "evaluate" deklariert, die von allen abgeleiteten Klassen implementiert werden muss. Jede abgeleitete Klasse stellt eine spezifische Operation dar (Addition, Subtraktion, Multiplikation, Division), die in der Methode "evaluate" implementiert wird. Jede Operation kann dann durch Übergeben eines Zeigers auf ein Objekt der abgeleiteten Klasse an die Methode "pushOperation" des Taschenrechners hinzugefügt werden.

    Der Taschenrechner selbst verwendet zwei Stacks, einen für Operanden und einen für Operationen. Wenn der Benutzer eine Zahl eingibt, wird sie als Operand auf den Operanden-Stack gelegt. Wenn der Benutzer eine Operation eingibt, wird sie als Objekt der entsprechenden abgeleiteten Klasse erstellt und auf den Operationen-Stack gelegt.

    Wenn der Benutzer das Gleichheitszeichen "=" eingibt, wird die "calculate"-Methode des Taschenrechners aufgerufen, die die Operanden und Operationen auf den Stacks ausführt und das Ergebnis zurückgibt. Wenn eine Division durch Null auftritt, wird eine Ausnahme ausgelöst, die vom Hauptprogramm abgefangen wird und eine Fehlermeldung ausgibt.

    Insgesamt ist dieses Programm ein solides Beispiel für eine implementierung von RAII in C++. Es bietet eine solide Basis für einen erweiterbaren Taschenrechner, der um weitere Operationen und Funktionen erweitert werden kann, indem weitere Klassen abgeleitet und implementiert werden.

    Test:

    3+5

    Invalid input

    3 + 5

    Invalid input

    3
    +
    5

    Result: 8

    3
    *
    66

    Result: 198


Anmelden zum Antworten