Overweeg een applicatie te maken om te werken met ChatGPT. Haar taak zal zijn om spraakberichten te ontvangen via Telegram, ze om te zetten in tekst, ze door te sturen naar ChatGPT, en een antwoord terug te sturen naar Telegram. Tijdens het creatieproces moet u de volgende stappen doorlopen:
- Aanmaken van een bot voor Telegram en de basisinstelling ervan.
- Ontvangen van een bestand met een spraakbericht (Telegram gebruikt het .oga formaat).
- Bestand omzetten van oga naar mp3.
- Overdracht van het mp3 bestand naar de Whisper dienst voor conversie naar tekst.
- Versturen van een ontvangen tekst naar ChatGPT.
- Versturen van een antwoord van ChatGPT naar een gebruiker in Telegram.
Een bot maken voor Telegram en de basisinstelling ervan
Het begint allemaal met het registreren van een bot. En hiervoor gebruikt Telegram zijn eigen speciale bot - BotFather. U moet hem aanschrijven en eenvoudige stappen doorlopen.
Als resultaat zou u een link naar uw bot en een token voor verzoeken aan zijn API moeten hebben.
Nu kunt u overgaan tot het instellen van de bot in AppMaster. De eenvoudigste manier om dit te doen is door de juiste module te installeren. U hoeft deze enkel te selecteren in de lijst van modules en uw API-token op te geven in de instellingen.
De nodige modellen zullen automatisch worden gemaakt in uw project, blokken voor het werken met Telegram zal verschijnen, evenals de basis Telegram business process Telegram: Echo. Het is de moeite waard om zorgvuldig te overwegen en het werkingsprincipe te begrijpen.
Bij de invoer ontvangt het een bericht van Telegram (Message model). Het bevat de tekst van het verzonden bericht (text), evenals het model chat waaruit de identificatie van de afzender kan worden gehaald (id). Het laatste blok Telegram: Send Message stuurt het ontvangen bericht terug naar de afzender, maar namens de bot.
U kunt dit bedrijfsproces gebruiken voor het eerste testen van de bot en de communicatie ermee. Hiervoor moet u een endpoint aanmaken dat informatie ontvangt en een bedrijfsproces start.
Bij het aanmaken ervan is het belangrijk om het volgende uit te schakelen Middleware Token Auth. Het endpoint moet openstaan voor gebruik zonder autorisatie.
Het werkingsprincipe van de Telegram bot is vrij eenvoudig - alle berichten die naar hem worden gestuurd gaan naar een speciale webhook, die ze automatisch verder kan doorgeven en naar het eindpunt van uw keuze kan sturen voor verdere acties.
De laatste stap blijft dus het activeren van de bot - u moet dit endpoint registreren in Telegram en aangeven dat deze bot ermee geassocieerd moet worden. Hiervoor moet u een POST-request met de volledige endpoint-URL en met vermelding van uw bot-token in plaats van {Bot API Token} sturen naar het adres
https://api.telegram.org/bot{Bot API Token}/setWebhook
Als u zo'n bericht als antwoord krijgt, dan is alles correct verlopen.
{
"ok": true,
"result": true,
"description": "Webhook was set"
}
De bot is klaar om te werken, u kunt hem een bericht sturen en terugkrijgen.
Een bestand ontvangen met een spraakbericht
De module Telegram is in de eerste plaats ontworpen voor het werken met tekstberichten. En onze taak is om een bestand met een spraakbericht te ontvangen. Met AppMaster kunt u dit probleem gemakkelijk oplossen. Eerst moeten we analyseren wat we doorgaans ontvangen van Telegram om de structuur van het bericht te ontleden. Het blok Get Request Body blok is hiervoor ontworpen. Het elimineert de noodzaak om de verzoekstructuur van tevoren te specificeren en stelt u in staat het gehele verzoek te ontvangen, ongeacht de inhoud ervan. Dit blok stuurt het verzoekresultaat terug als een set bytes, en u kunt het To String blok gebruiken om het resultaat in een voor mensen leesbare vorm te presenteren, en om het op te slaan in logboeken (Write to Log blok) voor verdere analyse.
Wij zijn geïnteresseerd in twee parameters van het gehele verzoek:
Sender ID - in het verzoek gespecificeerd als "id":300493858
File ID - "file_id":"AwACAgIAAxkBAAMzZBk6QRvO-OYWsWUC-Bu1UXDM2FwAAkktAAKTZclIWTSkfTTw8wYvBA"
U kunt uw eigen model maken dat overeenkomt met het verzoek en het gebruiken om de vereiste velden te verkrijgen. Maar het zal sneller zijn om een reguliere expressie (Regex) te maken en die te gebruiken. Hiervoor neemt het String Match Regex blok de expressie zelf als invoer, evenals de string waarin de match met de gegeven expressie wordt gecontroleerd.
In het eerste geval is de uitdrukking "id":"\d+
Als resultaat krijgen we de string "id":300493858, waaruit we de extra ("id":) moeten verwijderen met behulp van het blok Replace String en alleen de identifier zelf overhouden.
In het tweede geval is het principe precies hetzelfde, maar wordt een iets complexere expressie gebruikt: "file_id":"[^"]+
Nu hebben we het afzender-id en het bestands-id, en dat kunnen we gebruiken om het bestand zelf te krijgen. Hiervoor moet je je wenden tot de Telegram API. Dit is al eerder gedaan bij het registreren van het eindpunt van de bot. Nu moet u een soortgelijk verzoek doen om het bestand te krijgen. {File ID} in de verzoek-URL moet worden vervangen door het ontvangen bestands-id.
https://api.telegram.org/bot{Bot API Token}/setWebhook/getFile?file_id={File ID}
Om een verzoek te versturen en het resultaat ervan te ontvangen, gebruiken we het HTTP Request blok, met URL en Method = GET als parameters.
Uit het ontvangen antwoord kun je het relatieve pad naar het bestand opmaken, het wordt doorgegeven in de "file_path" parameter. Dienovereenkomstig kunt u met de volgende reguliere uitdrukking ("file_path":"[^"]+) de gewenste waarde eruit halen en verbinden met "https://api.telegram.org/file/bot{Bot API Token}/" om de volledige link naar het bestand te krijgen.
Bestand omzetten van OGA naar MP3
Het bestand is ontvangen, maar het obstakel is dat de Whisper service het werken met het OGA formaat. U moet converteren naar een van de geschikte formaten.
Als voorbeeld wordt de Zamzar dienst gebruikt (zijn gratis plan ondersteunt de mogelijkheid om 100 conversies per maand uit te voeren) en converteert naar MP3.
U kunt de documentatie ervan raadplegen voor details of een andere soortgelijke dienst gebruiken. Wij zullen het werk ermee niet in detail analyseren, en alleen het deel dat rechtstreeks betrekking heeft op de uitvoering van AppMaster in beschouwing nemen.
Allereerst heeft het verzoek de juiste authenticatiegegevens nodig. Deze moeten worden verstrekt in het Basic Authentication formaat. Daartoe moet in het verzoek een header met waarden worden doorgegeven:
Key = 'Authorization'
Value = 'Basic '+ Gebruikers-ID en wachtwoord gescheiden door ":" in base64 formaat
De API-sleutel die wordt verkregen bij de registratie bij de dienst is de gebruikers-ID. Je moet er ":" aan toevoegen en het coderen in Base64 formaat met behulp van het To Base64 blok. Het resultaat moet worden omgezet in een header (Make Key-Value (String) blok).
De volgende stap is het maken van een model voor de query in de database designer. Het verzoek moet worden verzonden in het Multipart Form formaat, respectievelijk is het nodig een model te maken van de vorm van dit verzoek. In ons voorbeeld bestaat het model uit drie velden van het type String:
- source_file - het volledige pad naar het bronbestand (geleerd in de vorige stap).
- source_format - bronbestandsformaat, in dit voorbeeld een vaste waarde "ogg".
- target_format - doelformaat voor conversie. U kunt elk formaat kiezen dat wordt ondersteund door Whisper. Laten we als voorbeeld "mp3" nemen.
In de bedrijfsproces-editor moet u het Make blok de modelgegevens invullen en deze als een POST verzoek naar https://sandbox.zamzar.com/v1/jobs/ sturen met behulp van het HTTP Request blok (zorg ervoor dat u specificeert Serialize request body = Multipart Form).
Opgemerkt zij dat dit verzoek niet het geconverteerde bestand teruggeeft, maar alleen een taak creëert om het te converteren. U moet het resultaat afzonderlijk aanvragen; daarvoor hebt u de ID van de aangemaakte taak nodig. Deze ID moet worden verkregen uit de body van het antwoord op het verzoek, en hiervoor moet het reeds uitgewerkte proces worden uitgevoerd met behulp van reguliere expressies en het extraheren van de id-waarde.
Het resultaat van de omzetting moet afzonderlijk worden toegepast. Hiervoor zijn nog twee verzoeken nodig. De eerste is om uit te zoeken of het resultaat klaar is. De tweede is om het voltooide bestand op te halen. Tegelijkertijd weten we het exacte tijdstip van gereedheid niet, dus kunnen we een lus organiseren die met bepaalde tussenpozen (bijvoorbeeld elke seconde) herhaalde verzoeken stuurt om de gereedheid te controleren.
Een HTTP Request moet worden verzonden met de methode GET naar de URL https://sandbox.zamzar.com/v1/jobs/{id}, waarbij {id} de in de vorige stap verkregen taak-id is. Hierbij worden dezelfde headers gebruikt als in het vorige verzoek.
Uit het ontvangen antwoord moet de gereedheidsstatus blijken. Als de conversie is voltooid, bevat het antwoord "status": "successful" en voor ons is dit een signaal dat we de lus kunnen voltooien en verder kunnen gaan.
Naast de status moet het antwoord ook de ID van het voltooide bestand bevatten ("target_files":[{"id":). Deze moet worden geëxtraheerd om de definitieve link naar het bestand te krijgen in de vorm https://sandbox.zamzar.com/v1/files/{ID}/content
Tegelijkertijd is het ontvangen van een bestand alleen beschikbaar voor geautoriseerde gebruikers, dus moet u een HTTP Request uitvoeren met dezelfde headers als in eerdere verzoeken.
Als resultaat van het verzoek wordt de inhoud van het bestand verkregen, dat een naam moet krijgen en moet worden opgeslagen voor verder gebruik.
Verzenden van een MP3 bestand naar Whisper voor conversie naar tekst
Nu is alles klaar voor de volgende stap - het verzenden van een bestand met een spraakbericht voor herkenning. Hiervoor is nog een verzoek nodig in het Multipart Form formaat. Alleen in tegenstelling tot het vorige voorbeeld zal het verzoek het bestand zelf moeten overbrengen en niet een link ernaar.
Een model voor een dergelijk verzoek kan worden gemaakt in de External HTTP Request sectie. In dit geval kunt u geen volledig verzoek maken, maar beperkt u zich tot het maken van een model voor het verzoeklichaam. Het model zelf bestaat uit twee parameters:
- File (Virtual File type) - hetzelfde bestand dat moet worden herkend.
- model (type String) - hier geven we de waarde whisper-1.
Ook, voor het verzoek, is het noodzakelijk om een sleutel voor het werken met de OpenAI API en het genereren van een autorisatie header van het Bearer Token type.
Key = 'Authorization'
Value = 'Bearer '+ OpenAI API Key
Vervolgens stuurt u het POST verzoek zelf om het spraakbericht te herkennen naar de Whisper service op de URL https://api.openai.com/v1/audio/transcriptions
Als gevolg van een succesvolle herkenning van het bestand, zal een antwoord worden ontvangen in de vorm {"text": "Hello world.”}
Het verzenden van een ontvangen tekst naar ChatGPT
U kunt verder gebruik maken van HTTP Request blokken om een verzoek te sturen naar ChatGPT. Om de API documentatie te verkennen, maar ook zelfstandig modellen te maken voor verzoeken en antwoorden. Maar u kunt ook een eenvoudiger optie gebruiken in de vorm van een kant-en-klare module van AppMaster voor het werken met OpenAI, die moet worden geïnstalleerd in de sectie modules.
In de minimaal voldoende versie hoeft u alleen de parameters van het OAI ChatCompletionMessage model (role = user, content = te verzenden bericht), toe te voegen aan de array, en een verzoek te sturen naar ChatGPT met het OpenAI: Create Chat Completion blok (set parameter model = gpt-4).
Als resultaat krijgen we een antwoord van ChatGPT. We lezen het uit de content parameter van het OAI ChatCompletionChoice model.
Een antwoord sturen van ChatGPT naar een gebruiker in Telegram
De laatste stap is alleen herhalen wat al eerder is gedaan - een bericht sturen naar Telegram. Maar als we begonnen met het bericht gewoon terug te sturen naar de afzender, heeft dit bericht nu een reeks verschillende acties gestart en wordt het resultaat teruggestuurd als een antwoord van ChatGPT.
Bij de ontwikkeling van een dergelijke bot is het de moeite waard te overwegen:
- Telegram werkt zodanig dat elk verzoek dat door de bot wordt verzonden, met succes moet worden verwerkt. Anders zal hij het vele malen proberen te herhalen, wat betekent dat u bij eventuele problemen steeds weer het antwoord krijgt. Zorg ervoor dat de logica zo is opgebouwd dat het verzoek niet tot een fout leidt en succesvol kan worden verwerkt.
- Niet alle verzoeken zullen bij de eerste poging werken zoals bedoeld. U zult naar fouten moeten zoeken, en daarvoor moet u naar Write to Log blokken. Die zijn zowel nuttig om te controleren of elk blok daadwerkelijk de gegevens ontvangt die u van plan was te verzenden, als om het resultaat van het blok te analyseren en het antwoord in detail te bestuderen.
- In de handleiding zijn we ervan uitgegaan dat alle verzoeken voorspelbaar en succesvol zijn en dat het proces vrij lineair verloopt. In de praktijk zal het nodig zijn om verschillende opties te bieden voor acties (bijvoorbeeld wat te doen als de gebruiker een tekstbericht stuurt in plaats van een spraakbericht of zelfs een foto) en foutafhandeling (controleren van de status van HTTP-verzoeken, rekening houden met verschillende antwoordopties).