In eerdere delen van de OpenAI API-workshopserie hebben we informatie uit teksten samengevat, vertaald en geëxtraheerd. Dit bleef altijd beperkt tot één vraag en één antwoord. In dit laatste deel gaan we nog een stap verder: je voert volledige gesprekken met het ChatGPT-taalmodel in je Python-programma’s.
Nu weet je hoe je via de OpenAI API een vraag kunt stellen aan ChatGPT in je Python-programma’s. Dat hebben we in de voorgaande vier delen van deze workshopreeks met veel toepassingen gedemonstreerd. Maar onze programma’s hebben altijd dezelfde structuur gehad: je stelt een vraag (de prompt), je krijgt een antwoord (de afronding) en dan stopt de interactie.
Als je ChatGPT ooit op de website van OpenAI hebt gebruikt, weet je dat je er ook hele gesprekken mee kunt voeren. Deze optie gaan we nu ook inbouwen in onze Python-programma’s. In plaats van de klassieke, beperkte interface met invoer in vaste stijl, kunt u een conversatie-interface creëren.
Basiscode
In de voorgaande delen van deze serie hebben we steeds een basisfunctie gebruikt krijg_voltooiing Hiervoor hebben we optioneel Gebruikersprompt en Systeemprompt geleverd, met ook een optioneel formulier. Deze functie heeft de claims doorgegeven aan de OpenAI API en het antwoord geretourneerd.
Om een gesprek te kunnen voeren moet het taalmodel toegang hebben tot de gehele context, inclusief eerdere berichten die jij en het taalmodel hebben uitgewisseld. Daarom hebben we in dit deel een nieuwe helperfunctie gemaakt: get_completion_from_messages. U geeft er de volledige berichtgeschiedenis aan door. Onze basiscode ziet er als volgt uit:
Klik daarvoor op het Visual Studio-pictogram bestand/nieuw bestand En kies Python-bestand. Plaats daar de vorige Python-code. Je moet, net als in de vorige delen van deze workshopreeks, zelf een API-sleutel aanmaken in je OpenAI-account.
Google Nest Mini
Een apparaat dat ook luistert naar wat jij te zeggen hebt
Rollen
Waar bestaan die berichten nu uit? Het argument Berichten Dat we een baan hebben get_completion_from_messages Om te slagen is een lijst met Python-woordenboeken, een datastructuur met sleutels en waarden. Elk woordenboek in de berichtenlijst heeft twee sleutels: “rol” en “inhoud”. De eerste beschrijft de rol van de boodschap in het gesprek en de tweede de inhoud (tekst).
De OpenAI API heeft drie rollen: systeem, gebruiker en helper. Bericht met scrollen Systeem Beschrijft de systeemprompt. Zoals we in de vorige secties hebben uitgelegd, geeft de beheerder algemene instructies voor het taalmodel. Bericht met scrollen gebruiker Beschrijft een vraag van de gebruiker. En bericht met scroll assistent Beschrijft een antwoord vanuit een taalmodel.
Een gesprek met de OpenAI API kan er in Python als volgt uitzien in de vorm van berichten met rol en inhoud:
Voeg deze lijst toe aan uw code. Vervolgens kunt u de OpenAI API vragen om het gesprek voort te zetten in deze berichten:
Sla dit bestand op in Visual Studio Code met behulp van Ctrl+S En geef het een naam. Druk vervolgens op Nieuw station/station, waarmee een nieuw paneel onder uw code wordt geopend met een opdrachtprompt. Klik rechtsboven op de knop Uitvoeren (de driehoek met de tooltip Run Python File als u erover beweegt). Als alles goed gaat, krijg je nu op het station een antwoord in de vorm van “Voor het geval het in de wolk begint te regenen!”.
Met deze kennis over rollen weet jij nu ook de reden van de laatste regel van de baan get_completion_from_messages (en de get_completion-functie die we in eerdere workshops gebruikten) Reactiekeuzes[0].bericht[“content”] Situaties. Widget bericht[“content”] Retourneert de antwoordtekst van het taalmodel. Als je bent bericht[“role”] In deze functie ziet u “Assistent”.
Wat onthoudt een chatbot?
Je hebt gezien dat elk gesprek dat je voert met een taalmodel bestaat uit een lijst met berichten. Het taalmodel houdt rekening met alle informatie in deze berichten. Als u bijvoorbeeld in één bericht uw naam vertelt, kunt u daar in een van de volgende berichten naar vragen en kan het taalmodel deze perfect beantwoorden. Vervang de band Berichten Ga vanuit het vorige voorbeeld naar dit menu en voer het programma uit:
Een gesprek is eenvoudig. Het taalmodel zou een vriendelijke chatbot zijn. Vervolgens stelt de gebruiker zichzelf voor en vraagt het taalmodel wat hij kan doen. Vervolgens wordt de gebruiker gevraagd wat zijn naam is.
Wanneer u dit programma uitvoert, zult u zien dat het taalmodel de naam heeft onthouden. Je krijgt immers een antwoord in de trant van: “Je naam is Quinn. Dat heb je me net verteld! Is er iets specifieks waar je meer over wilt weten?”
In een ander gesprek waarin u uw naam niet vermeldt, kan het chatformulier de vraag hoe u heet niet beantwoorden. Dit gesprek bijvoorbeeld:
Dan krijg je zoiets als: “Sorry, maar ik ben een chatbot en ik heb geen toegang tot persoonlijke informatie. Ik weet je naam niet.”
Het is belangrijk om te weten dat elk gesprek dat je voert met een taalmodel volledig los staat van andere gesprekken. Het feit dat u eerder uw naam in het andere gesprek hebt verteld, is geen informatie die beschikbaar is in het nieuwe gesprek. Het taalmodel kent alleen de algemene informatie waarop het is getraind en de lijst met berichten die u eraan doorgeeft.
Hij bespreekt
Hierboven hebben we de berichten in de programmacode geplaatst. Maar we willen de gebruiker zelf input laten geven. hoe doe je dat? Met een extra helperfunctie, die een lijst met berichten aanmaakt en telkens nieuwe invoer opvraagt en de uitvoer weergeeft. Dit doen we door de basiscode uit te breiden met:
Wanneer u dit programma uitvoert, kunt u een vraag typen en op Enter drukken om deze door te sturen. Functie Spreken Voegt uw vraag als prompt toe aan de lijst met berichten in de gewijzigde context. Het antwoord van het taalmodel voegt de functie ook toe aan de lijst en geeft dat antwoord weer. We blijven de functie aanroepen in een oneindige lus (met while True), waarbij we telkens de context uitbreiden met uw vraag en antwoord. Hierdoor onthoudt het taalmodel eerdere berichten en kunnen we een echt gesprek voeren.
Conversatie-interface
We hebben nu een eenvoudige interface voor ChatGPT gebouwd in een terminalvenster. Maar we willen hier een conversatie-interface van maken om op een gebruiksvriendelijke manier input te krijgen voor een groter programma. Laten we als voorbeeld een computerspel nemen, waarbij je eerst je eigen spelpersonage moet ontwerpen.
Neem even de tijd om te ontspannen
Met je favoriete spelpersonage
Een gamekarakter bestaat uit een aantal attributen, zoals naam, vaardigheid, uitrusting en ras. De game kan je vragen om alles in te vullen op een formulier, maar waarom niet in een chat? Dat programmeren we in de rest van dit artikel. Als eerste stap moeten we dus een uitgebreide systeemprompt maken die het gespreksframe definieert:
Ja, de systeemprompt moet erg lang zijn. Als we niet expliciet aangeven wat een chatbot wel en niet kan doen, krijgen we uiteindelijk niet wat we willen: een JSON-string die de eigenschappen van het personage bevat.
JSON
Een groot deel van onze systeemprompt bestaat uit instructies om definitieve selecties aan de gebruiker te verstrekken in JSON-vorm (JavaScript Object Notation). Waarom is dat zo belangrijk? Omdat we de rest van ons programma alleen kunnen laten omgaan met gestructureerde gegevens, niet met tekst.
Dus als de gebruiker in een gesprek met onze assistent een speler selecteert met de naam Born, een orc-schurk met een boog, zou ons programma dit uiteindelijk als volgt moeten kunnen lezen:
Praten richting het doel
Het doel van ons gesprek is dus om uiteindelijk een JSON-string zoals hierboven te krijgen, zodat het programma kan doorgaan en we het spel kunnen spelen. We kunnen ons gesprek dus stoppen als de helperuitvoer een geldige JSON-tekenreeks is.
Om JSON in Python te gebruiken, importeer je eerst de gelijknamige bibliotheek aan het begin van het programma:
import json
Vervolgens komt onze basiscode en de systeemprompt met de gedetailleerde instructies hierboven, daarna creëren we de volgende functie:
Deze functie neemt dus input van de gebruiker, voegt deze toe aan de context en bevraagt de OpenAI API. We voegen het antwoord van de helper toe aan de context.
De functie probeert vervolgens het helperantwoord te laden als een JSON-object. Als dit lukt, retourneert de functie dit JSON-object. Als dat niet werkt, geeft Python een foutmelding json.decoder.JSONDecodeError We gaan terug en reageren zodra het antwoord van de assistent wordt getoond. Dit is immers niet het definitieve antwoord bij data gestructureerd in JSON-vorm, maar het is een vraag. In dit geval keert de functie terug niemand Nogmaals, omdat de gegevens nog niet compleet zijn.
Gestructureerde gegevens
Hoe creëren we die functie? Spreken het gebruik? Dit doen we met de volgende code:
Eerst initialiseren we de variabele Eigenschappen Door ze waarde te geven niemand Geven. Vervolgens tonen we het eerste bericht van de assistent waarin we de gebruiker vragen naar de naam van het spelpersonage.
Vervolgens roepen we de functie voortdurend aan Spreken Met context ingeschakeld, zolang de waarde wordt geretourneerd door deze functie niemand Hij is. Zoals we in die functie hebben gezien, retourneert de helper, als hij JSON-gegevens retourneert, een JSON-tekenreeks, enzovoort niemand. Als de assistent de instructies goed opvolgt (zie het kader “Doet uw programma niet wat het moet doen?”), stopt het gesprek als de gegevens compleet zijn.
Op dit punt wordt de code na het while-blok uitgevoerd. We kunnen nu de eigenschappen van het spelpersonage op een gestructureerde manier uit het JSON-eigenschappenobject extraheren. We presenteren ze hier één voor één. Natuurlijk moet je een aantal controles uitvoeren om er zeker van te zijn dat er geen ongeldige waarden zijn als het taalmodel niet goed werkt. Maar dit is een oefening voor de lezer!
Lees ook:
Aangedreven door
“Valt vaak neer. Subtiel charmante tv-liefhebber. Toegewijde internetfan. Muziekbeoefenaar.”