MNOT Bot

Uit Met Nerds om Tafel - Wiki
Naar navigatie springen Naar zoeken springen

Algemene informatie

De bot is geschreven in C#, wordt gehost in Microsoft Azure en werkt daarin hoofdzakelijk via Azure Functions. De bot wordt ontwikkeld door Slack-admin Dennis (Slack.png@CEO).

Voor vragen of suggesties over de bot kun je terecht op Slack in #mnotbot.

Meekijken met de ontwikkeling of meehelpen? Meld je dan bij Slack.png@CEO op Slack.

MNOT Bot ✕ OpenAI

Algemeen

MNOT Bot is gekoppeld aan het GPT-4 Turbo model van OpenAI. Dit maakt het mogelijk om gesprekken te voeren met de bot. Wanneer je de bot @-mentioned waar dan ook op Slack (de bot moet wel in het betreffende kanaal aanwezig zijn) zal hij in thread op je reageren. Vervolgens kun je in die thread het gesprek vervolgen. Ook andere mensen kunnen in het gesprek meedoen.

Prompt

De OpenAI API die gebruikt wordt is Chat Completion. We geven de bot een prompt (een stuk tekst) en hij zal die prompt vervolgens aanvullen. Omdat we willen dat de interactie aanvoelt als een gesprek bouwen we de prompt op als gesprek. De huidige opzet van de prompt is als volgt:

Het is vandaag {datum} en de tijd is {tijd}. Doe alsof dit een gesprek is tussen jou en vrienden. Jij bent amicaal en enthousiast.

In de intro geven we aan dat het om een gesprek gaat tussen vrienden. Ook proberen we het karakter van de bot te sturen door hem te omschrijven.

Vervolgens pakken we de laatste 15 berichten uit de thread om mee te sturen. Dit geeft de bot de gesprekscontext die nodig is om langere gesprekken te kunnen voeren. (Anders zou hij alles vóór het huidige bericht alweer vergeten zijn!)

Tokens & kosten

Het opsturen van een bericht naar OpenAI en het ontvangen van het antwoord kost tokens. Een token vertegenwoordigt ongeveer 4 letters of driekwart van een gemiddeld Engels woord en ons gebruikte model kost $0.01 per 1000 tokens. De prompt zoals hierboven in het voorbeeld is bijvoorbeeld 129 tokens lang, maar als een thread langer doorgaat en er langere antwoorden van de bot gevraagd worden kunnen die berichten oplopen tot honderden of zelfs duizenden tokens per request.

Verbruik verminderen

Dit is ook de reden dat we voor de gesprekscontext alleen de laatste 15 berichten meesturen en niet de hele thread. Dat zou op een gegeven moment zorgen voor extreem "dure" berichten en tot nu toe hebben we gemerkt dat 10-15 berichten aan context voldoende is voor een leuk gesprek.

Wat we ook doen om de prompt kleiner te houden is berichten weglaten die niet nodig zijn voor de gesprekscontext. Wanneer je bijvoorbeeld in een thread iets wil vragen aan iemand anders, of een opmerking wil maken over de reactie van de bot kun je je bericht prefixen met # . Dit zullen wij herkennen en dat bericht laten we dan weg.

API keys

Gelukkig hebben we tot nu toe niets uit eigen zak hoeven te betalen. Wanneer je een gratis account aanmaakt bij OpenAI krijg je $18 aan gratis tegoed die je kunt gebruiken. Als je vervolgens een API key aanvraagt en je DM't die op Slack naar Dennis (@CEO) dan voegen we hem toe aan de bot. Momenteel zijn er meerdere API keys in gebruik en voor elk request pakken we random een key van de lijst zodat het verbruik eerlijk verdeeld wordt.

Temperature

Eén van de instellingen van de bot is de Temperature. Deze instelling bepaald hoe strikt of hoe vrij de bot is in het antwoorden op berichten. De waarde van de temperature ligt tussen de 0 en de 1 waarbij 0 erg strikt is en bij 1 zal hij erg creatief zijn in zijn antwoord.

Karakter van de bot

Om de gesprekken met de bot gevarieerder te maken krijgt hij elke ochtend om 09:00 uur nieuwe karaktereigenschappen. We stellen een willekeurige nieuwe Temperature in tussen de 0 en1 en we kiezen uit een lijst met voorgedefinieerde karakteromschrijvingen willekeurig een nieuwe. Zo zal de bot elke dag iets anders reageren.

Handig om te weten

Er zijn nog een aantal dingen goed om te weten of om rekening mee te houden wanneer je met de bot praat:

  • De bot heeft geen toegang tot Slack of de kanalen en gebruikers in Slack. Het enige dat hij 'weet' is wat er in de afgelopen 15 berichten is gezegd en eventueel informatie over de gespreksdeelnemers.
  • De bot kan geen plaatjes 'zien' of informatie bekijken achter een link. Hij reageert alleen op de aangeleverde berichten.
  • Davinci (het GPT-3 model dat we gebruiken) is bijgeleerd tot halverwege 2021. Van recentere gebeurtenissen is de bot dus niet op de hoogte.

Slash commands

De bot reageert op een aantal ingebouwde Slash-commands:

  • /mnot help
    Toont een lijst van mogelijke Slash commands die je kunt gebruiken.
  • /mnot poll
    Opent een modal waarmee je een poll kan starten in het huidige kanaal.
  • /mnot slap @user
    Oude IRC functie. Mep een mede-Slacker met een forel!
  • /mnot invite
    Opent een modal waarmee je een uitnodiging kan posten naar een specifiek private channel.

Automatische functies

De bot reageert ook op andere zaken binnen Slack, zoals bepaalde berichten of reacji's die gepost worden:

  • Nadoen van een Mnot.png-reacji
    Wanneer iemand een Mnot.png als reacji geeft op een bericht zal MNOT Bot diezelfde reacji kopiëren.
  • Portal Parrot Matcher
    Wanneer je twee berichten post met in de ene een Portal-1.gif :portal-1: en in de andere een Portal-2.gif :portal-2: emoji,
    dan zal MNOT Bot deze berichten aan elkaar koppelen (de portal creëren) door in thread op deze berichten te reageren met een link.
  • Illegale 1337.png afkeuring
    Een 1337.png mag natuurlijk alleen om 13:37 uur in #huiskamer gepost worden. Wanneer dat op een ander tijdstip gebeurd zal MNOT Bot afwijzend reageren met een X.png reacji.
  • Berichten- en reacji teller
    De bot telt alle geplaatste berichten en reacji's in kanalen waarin de bot is toegevoegd. Hierbij wordt opgeslagen wie het bericht/de reacji plaatst, wanneer dat gebeurd en in welk kanaal. Berichtinhoud wordt niet opgeslagen. Deze informatie wordt gebruikt om elke maandag de Slack statistieken te kunnen posten.

Getimede functies

De bot voert ook bepaalde taken uit op bepaalde vastgelegde tijdstippen:

Goedemorgen

Een random goedemorgen bericht inclusief de weersverwachting van vandaag uit een random weerstation.
Dagelijks tussen 07:00 en 10:00 uur

1337 1337.png

Zoals traditie is op Slack post ook de bot dagelijks een 1337.png emoji.
Dagelijks tussen 13:37:00 en 13:37:55 uur

Shownotes posten

Na elke nieuwe podcast episode post de bot de bijbehorende shownotes in #napraten
Direct na elke nieuwe podcast episode (RSS triggered)

BTC koers

Elke 7 minuten worden de laatst bekende BTC-EUR en BTC-USD koersen opgehaald via de CoinMarketCap API. Deze info wordt getoond in bookmarks in het kanaal #bitcoin-en-crypto.
Elke 7 minuten tussen 06:00-23:59 in #bitcoin-en-crypto

Energieprijzen

De bookmarks in het kanaal #duurzaamheid-en-klimaat tonen verschillende informatie over de kWh-prijzen van de dag.

  • De eerste bookmark toont de huidige kWh-prijs
  • De tweede bookmark toont het goedkoopste tijdsblok van de dag
  • De derde bookmark toont het duurste tijdsblok van de dag

Prijzen worden dagelijks opgehaald uit de API van Nord Pool.

De prijzen die uit deze API komen zijn kale MWh-prijzen dus daar sleutelen we nog aan:

(kale MWh-prijs ÷ 1000 × BTW) + energiebelasting (€ 0,13165) + gemiddelde opslag van de energieleverancier (€ 0,02)

Die laatste toeslag verschilt natuurlijk per energieleverancier maar is een aardig gemiddelde.

Civilization VI functies

Een groepje MNOT'ers speelt via #games-civilization-vi al een tijdje Civilization VI online tegen elkaar via async cloud multiplayer (Play by Cloud). De bot ondersteunt hier als volgt bij:

  • Notificaties posten wanneer een volgende speler aan de beurt is.
  • Een lijst geven van alle openstaande potjes en wie daarin aan de beurt is (via !civbeurt)