Results 1 to 9 of 9

Thread: Het gebruik van Open AI en een klein voorbeeldje hoe Marco's Oliebollen kan zijn ;)

  1. #1
    Senior Member Thaddy's Avatar
    Join Date
    Dec 2004
    Location
    Amsterdam
    Posts
    2,211

    Het gebruik van Open AI en een klein voorbeeldje hoe Marco's Oliebollen kan zijn ;)

    https://openai.com is de plek waar je een key kan vragen voor privé gebruik.
    Daarna kun je dit rudimentair stukje code gebruiken voor allerlei zaken, zoals oliebollen recepten, het laten schrijven van Pascal functies, programma's of classes.
    Ik heb hier met de kerstdagen veel plezier aan beleefd... wellicht vinden jullie het ook interessant. Resultaten zijn niet altijd even goed, maar alles is nog beta.
    Code:
    program fpopenai_6;
    {
      Demo on how to use openai in Freepascal
      Find out more at https://openai.com where you can also obtain a key.
      Put the key in a file called openai.key surrounded by single quotes.
            
      Enjoy, Thaddy de Koning, 26 december 2022
    }  
    {$mode objfpc}{$ifdef mswindows}{$apptype console}{$endif}{$H+}
    uses classes,sysutils,fphttpclient,opensslsockets,fpJson,jsonparser;
    const
      model ='{"model": "text-davinci-003",  "prompt": "%s","temperature": 0.7,"max_tokens": 3000,"top_p": 1,  "frequency_penalty": 0,  "presence_penalty": 0}';
    var
      d:TJsonData;
      s:string;
    begin
      writeln('What is your request?');
      readln(s);
      writeln;
      with TfpHttpClient.Create(nil) do
      Try
        AllowRedirect:= true;
        RequestHeaders.Add('Content-Type: application/json');
        // put your key with single quotes in a textfile called openai.key
        RequestHeaders.Add('Authorization: Bearer '+{$I openai.key});
        RequestBody:=TStringStream.Create(format(model,[s]));    
        writeln('Please wait for the response, this can take some time:');
        try
          try
            d:=GetJson(Post('https://api.openai.com/v1/completions'));
            writeln(d.findpath('choices[0].text').AsString);
          except
            writeln('The engine was not able to answer your request');
          end;
        finally
          d.free;
        end;    
      finally
        RequestBody.Free;
        Free;
      end;
    end.
    Als je het programma runt, kun je bijvoorbeeld oliebollen recepten vragen, maar ook Pascal code genereren in natuurlijke taal.
    Zoals:
    Code:
    What is your request?
    ik wil drie verschillende oliebollen recepten met verse gist
    
    Please wait for the response, this can take some time:
    
    
    1. Oliebollen met verse gist
    
    Ingrediënten:
    
    - 2 cups (250 gram) bloem
    
    - 2 theelepels bakpoeder
    
    - 2 eetlepels suiker
    
    - 1 theelepel zout
    
    - 2 eetlepels versgemalen kaneel
    
    - 2 eetlepels versgemalen kardemom
    
    - 1 eetlepel gedroogde gist
    
    - ½ cup (110 ml) melk
    
    - ½ cup (110 ml) melk
    
    - 2 eieren
    
    - 2 eetlepels vanillesuiker
    
    - 1 kop (250 ml) plantaardige olie
    
    - Suiker en kaneel voor het bestrooien
    
    Bereidingswijze:
    
    1. Meng de bloem, bakpoeder, suiker, zout, kaneel en kardemom in een kom.
    
    2. Voeg de gist toe en roer tot alle ingrediënten goed gemengd zijn.
    
    3. Voeg de melk, eieren en vanillesuiker toe en roer tot een glad deeg.
    
    4. Verwarm de olie in een pan.
    
    5. Neem het deeg en maak er kleine balletjes van.
    
    6. Frituur de oliebollen in de olie totdat ze goudbruin zijn, ongeveer 3-4 minuten.
    
    7. Haal de oliebollen uit de olie en laat ze op een bord met keukenpapier uitlekken.
    
    8. Bestrooi met suiker en kaneel.
    
    9. Serveer warm.
    
    2. Oliebollen met verse gist en appel
    
    Ingrediënten:
    
    - 2 cups (250 gram) bloem
    
    - 2 theelepels bakpoeder
    
    - 2 eetlepels suiker
    
    - 1 theelepel zout
    
    - 2 eetlepels versgemalen kaneel
    
    - 2 eetlepels versgemalen kardemom
    
    - 1 eetlepel gedroogde gist
    
    - 1 kop (250 ml) melk
    
    - 1 kop (250 ml) appelsap
    
    - 1 geschilde en gehakte appel
    
    - 2 eieren
    
    - 2 eetlepels vanillesuiker
    
    - 1 kop (250 ml) plantaardige olie
    
    - Suiker en kaneel voor het bestrooien
    
    Bereidingswijze:
    
    1. Meng de bloem, bakpoeder, suiker, zout, kaneel en kardemom in een kom.
    
    2. Voeg de gist toe en roer tot alle ingrediënten goed gemengd zijn.
    
    3. Voeg de melk, appelsap, gehakte appel, eieren en vanillesuiker toe en roer tot een glad deeg.
    
    4. Verwarm de olie in een pan.
    
    5. Neem het deeg en maak er kleine balletjes van.
    
    6. Frituur de oliebollen in de olie totdat ze goudbruin zijn, ongeveer 3-4 minuten.
    
    7. Haal de oliebollen uit de olie en laat ze op een bord met keukenpapier uitlekken.
    
    8. Bestrooi met suiker en kaneel.
    
    9. Serveer warm.
    
    3. Oliebollen met verse gist en sinaasappel
    
    Ingrediënten:
    
    - 2 cups (250 gram) bloem
    
    - 2 theelepels bakpoeder
    
    - 2 eetlepels suiker
    
    - 1 theelepel zout
    
    - 2 eetlepels versgemalen kaneel
    
    - 2 eetlepels versgemalen kardemom
    
    - 1 eetlepel gedroogde gist
    
    - ½ cup (110 ml) melk
    
    - ½ cup (110 ml) versgeperst sinaasappelsap
    
    - 2 eieren
    
    - 2 eetlepels vanillesuiker
    
    - 1 kop (250 ml) plantaardige olie
    
    - Suiker en kaneel voor het bestrooien
    
    Bereidingswijze:
    
    1. Meng de bloem, bakpoeder, suiker, zout, kaneel en kardemom in een kom.
    
    2. Voeg de gist toe en roer tot alle ingrediënten goed gemengd zijn.
    
    3. Voeg de melk, sinaasappelsap, eieren en vanillesuiker toe en roer tot een glad deeg.
    
    4. Verwarm de olie in een pan.
    
    5. Neem het deeg en maak er kleine balletjes van.
    
    6. Frituur de oliebollen in de olie totdat ze goudbruin zijn, ongeveer 3-4 minuten.
    
    7. Haal de oliebollen uit de olie en laat ze op een bord met keukenpapier uitlekken.
    
    8. Bestrooi met suiker en kaneel.
    
    9. Serveer warm.
    Merk op dat ik de vraag in het Nederlands stel...
    ============================
    Ok, nu een voorbeeld waarin ik vraag om een pascal implementatie van het knapsack probleem:
    Code:
    What is your request?
    write a program in pascal to solve the knapsack problem. Note variable names should not be the same as type names
    
    Please wait for the response, this can take some time:
    
    
    program Knapsack;
    uses sysutils, math; // dat moest handmatig toegevoegd worden
    type
        Item = record
            value, weight: real;
        end;
        ItemArray = array of Item;
    
    var
        items: ItemArray;
        maxWeight, maxValue: real;
        itemCount, i, j: integer;
        currentWeight, currentValue: real;
    
    begin
        //read the input
        readln(maxWeight);
        readln(itemCount);
        setlength(items, itemCount);
        for i := 0 to itemCount - 1 do
            readln(items[i].value, items[i].weight);
    
        //initialize the matrix
        maxValue := 0;
        for i := 0 to itemCount do
        begin
            for j := 0 to trunc(maxWeight) do
            begin
                if (i = 0) or (j = 0) then
                    currentValue := 0
                else
                begin
                    if (items[i - 1].weight <= j) then
                        currentValue :=
                            max(items[i - 1].value +
                                maxValue(i - 1, j - items[i - 1].weight),
                                maxValue(i - 1, j))
                    else
                        currentValue := maxValue(i - 1, j);
                end;
                maxValue := max(maxValue, currentValue);
            end;
        end;
        writeln(maxValue);
    end.
    Veel plezier!! en een gelukkig nieuwjaar
    Last edited by Thaddy; 28-Dec-22 at 17:18.
    Werken aan Ansi support voor Windows is verspilde tijd, behalve voor historici.

  2. #2
    Hey leuk, ik was net bezig om eens naar die api te kijken. Welke units zijn dit: fphttpclient,opensslsockets,fpJson,jsonparser? Die zijn volgens mij geen onderdeel van standaard Delphi (community version).

  3. #3
    Senior Member Thaddy's Avatar
    Join Date
    Dec 2004
    Location
    Amsterdam
    Posts
    2,211
    Quote Originally Posted by Bodevinaat View Post
    Hey leuk, ik was net bezig om eens naar die api te kijken. Welke units zijn dit: fphttpclient,opensslsockets,fpJson,jsonparser? Die zijn volgens mij geen onderdeel van standaard Delphi (community version).
    Nee dat zijn FreePascal standaard units. Daarom heb ik ook gepost in FreePascal / Lazarus ....
    Maar in Delphi kan get ook met Synapse, geen grote veranderingen.

    Nog een leuke:
    Code:
    What is your request?
    schrijf een liedje in de stijl van Andre Hazes senior
    
    Please wait for the response, this can take some time:
    
    
    Refrein
    Wees niet bang voor de drukte
    Ga je gang en heb plezier
    En als je dan weer eenzaam bent
    Kom dan naar me toe, dan zal ik je verwarmen
    
    Kom mee met mij, het is fijn
    Ontdek de wereld en je kunt het aan
    Kom mee met mij, ik help je door
    Je kan vertrouwen dat ik je nooit in de steek laat
    
    Kijk om je heen, de wereld is mooi
    Dus ga je gang en beleef je leven
    Kijk naar boven, de sterren schijnen helder
    En wij zijn hier samen
    
    Refrein
    Wees niet bang voor de drukte
    Ga je gang en heb plezier
    En als je dan weer eenzaam bent
    Kom dan naar me toe, dan zal ik je verwarmen
    
    Kijk naar de toekomst, de horizon is ver
    En volg je dromen, geef nooit op
    Kijk naar je leven, voel je hart en ziel
    En je zult meer liefde voelen dan ooit tevoren
    
    Refrein
    Wees niet bang voor de drukte
    Ga je gang en heb plezier
    En als je dan weer eenzaam bent
    Kom dan naar me toe, dan zal ik je verwarmen
    
    
    ------------------
    (program exited with code: 0)
    Moet alleen nog even een melodie schrijven....
    Werken aan Ansi support voor Windows is verspilde tijd, behalve voor historici.

  4. #4
    Hi,

    ik ben jouw code aan het omzetten naar Delphi.
    Ik snap nog niet helemaal goed hoe dat met die key werkt. Normaliter gaat de key of token als string mee in het request. Wat doe je hier nu? Gaat de file mee als parameter?

    Sander

  5. #5
    Quote Originally Posted by Bodevinaat View Post
    ik ben jouw code aan het omzetten naar Delphi.
    Ik snap nog niet helemaal goed hoe dat met die key werkt. Normaliter gaat de key of token als string mee in het request. Wat doe je hier nu? Gaat de file mee als parameter?
    Met {$I openai.key} wordt de file openai.key geinclude.
    Daarom werd er gezegd dat je die key tussen quotes ' moest plaatsen zodat het door de code als string gezien wordt.
    Uiteraard kun je ook gewoon de key opnemen in je code.

    Dus
    Delphi Code:
    1. RequestHeaders.Add('Authorization: Bearer '+'abcdxxx');
    of dus
    Delphi Code:
    1. RequestHeaders.Add('Authorization: Bearer abcdxxx');

  6. #6
    Ah, helder. En waarom maak je een Streamobject aan voor de body? Dank voor je antwoorden!

  7. #7
    Quote Originally Posted by Bodevinaat View Post
    Ah, helder. En waarom maak je een Streamobject aan voor de body? Dank voor je antwoorden!
    Het is niet mijn code. Code is van Thaddy.

    Ik neem aan dat die TStringStream een makkelijke manier is om de vraag door te zetten naar de RequestBody.
    RequestBody is een property van TfpHttpClient.

    Note dat er gebruikt gemaakt wordt van "with TfpHttpClient" !
    Dus RequestBody en RequestHeaders worden direct uit dat object gebruikt.

  8. #8
    Senior Member Thaddy's Avatar
    Join Date
    Dec 2004
    Location
    Amsterdam
    Posts
    2,211
    Quote Originally Posted by rvk View Post
    Het is niet mijn code. Code is van Thaddy.

    Ik neem aan dat die TStringStream een makkelijke manier is om de vraag door te zetten naar de RequestBody.
    RequestBody is een property van TfpHttpClient.

    Note dat er gebruikt gemaakt wordt van "with TfpHttpClient" !
    Dus RequestBody en RequestHeaders worden direct uit dat object gebruikt.
    - Een Tstream afgeleide is de enige manier om de requestbody te vullen in FPC's fpHttpClient
    - De Key is bewaard in een include file, omdat ik altijd vergeet om mijn eigen hard gecodeerde key weg te halen voor ik de code publiceer - en niet alleen hier! - dus maak ik er een gewoonte van om een key op te slaan in een include bestand of een environment variabele zodat ik me om die sleutel geen zorgen meer hoef te maken. (behalve als ik de include mee zou sturen.)

    Voor omzetten naar Delphi is synapse het eenvoudigst, maar kan natuurlijk ook met Indy, dat komt omdat synapse en fphttpclient uit dezelfde familie komen.
    Last edited by Thaddy; 13-Jan-23 at 20:06.
    Werken aan Ansi support voor Windows is verspilde tijd, behalve voor historici.

  9. #9
    Quote Originally Posted by Thaddy View Post
    - Een Tstream afgeleide is de enige manier om de requestbody te vullen in FPC's fpHttpClient
    - De Key is bewaard in een include file, omdat ik altijd vergeet om mijn eigen hard gecodeerde key weg te halen voor ik de code publiceer - en niet alleen hier! - dus maak ik er een gewoonte van om een key op te slaan in een include bestand of een environment variabele zodat ik me om die sleutel geen zorgen meer hoef te maken. (behalve als ik de include mee zou sturen.)

    Voor omzetten naar Delphi is synapse het eenvoudigst, maar kan natuurlijk ook met Indy, dat komt omdat synapse en fphttpclient uit dezelfde familie komen.
    Ja, ik heb de code al aan de praat met NetHTTPRequest. Indy loopt niet lekker want heeft externe SSL libs nodig. Ik heb ook de DALL-E api werkend, die geeft een picture terug (via een URL). Bizar wat je daarmee kunt.

    De parameters codeer ik via een TJsonObject. Dat gaat heel goed en dan serialisatie via TStringStream. Ik kan mij vergissen maar volgens mij zou je in principe ook TJsonObject.ToString in het request kunnen zetten.

    Thanks!

    Sander

Thread Information

Users Browsing this Thread

There are currently 1 users browsing this thread. (0 members and 1 guests)

Bookmarks

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
  •