Il semble qu’il existe des possibilités infinies d’innovation avec les LLM. Si vous êtes comme moi, vous avez utilisé des applications et des outils GenAI, comme ChatGPT intégré à Expedia, Copilot pour l'écriture de code ou même DALL-E pour générer des images. Mais en tant que technologue, je veux faire plus que simplement utiliser des outils basés sur le LLM. Je veux construire le mien.
Avec toutes les nouvelles technologies, devenir constructeur, c’est commencer simplement. C'est comme ça pour tout nouveau langage de programmation que j'apprends ou tout nouveau framework que j'examine. Construire avec des LLM n’est pas différent. C'est donc ce que je vais aborder ici. Je vais créer une API rapide et sale qui interagit avec Google Gemini, me donnant ainsi mon propre petit assistant chatbot.
Voici ce que nous ferons :
La plupart des consommateurs quotidiens connaissent ChatGPT, qui repose sur le LLM GPT-4. Mais en ce qui concerne les LLM, GPT-4 n'est pas le seul jeu en ville. Il existe également Google Gemini (anciennement connu sous le nom de Bard). Dans la plupart des tests de performances (tels que les problèmes de raisonnement multidisciplinaires de niveau universitaire ou la génération de code Python), Gemini surpasse GPT-4.
Que disent les Gémeaux d’eux-mêmes ?
En tant que développeurs, nous pouvons accéder à Gemini via l'API Gemini dans Google AI Studio . Des SDK sont également disponibles pour Python , JavaScript , Swift et Android .
Bien. Passons à la construction.
Notre application Node.js sera un simple serveur API Express qui fonctionne comme un chatbot Gemini. Il écoutera sur deux points de terminaison. Tout d'abord, une requête POST
vers /chat
(qui inclura une charge utile JSON avec un attribut message
) enverra le message à Gemini puis renverra la réponse. Notre application maintiendra une conversation de chat en cours avec Gemini. Cela transforme notre chatbot en un assistant utile qui peut conserver des notes pour nous.
Deuxièmement, si nous envoyons une requête POST
à /reset
, cela réinitialisera la conversation de chat pour qu'elle reparte de zéro, effaçant ainsi la mémoire de Gemini des interactions précédentes avec nous.
Si vous souhaitez ignorer cette procédure pas à pas de code, vous pouvez voir tout le code sur mon dépôt GitHub ici .
Pour commencer, nous initialisons notre application Node.js et installons les dépendances.
~/project$ npm init -y && npm pkg set type="module" ~/project$ npm install @google/generative-ai dotenv express
Ensuite, nous ajoutons ceci aux scripts
dans notre fichier package.json
:
"scripts": { "start": "node index.js" },
index.js
Notre application se compose d'un seul fichier, et c'est assez simple. Nous allons le parcourir section par section.
Tout d’abord, nous importons tous les packages que nous utiliserons. Ensuite, nous initialisons le SDK de Google AI. Nous utiliserons le modèle Gemini-pro. Enfin, nous appelons startChat() , qui crée une nouvelle instance ChatSession pour ce que Google appelle une conversation à plusieurs tours .
import 'dotenv/config'; import express from 'express'; import { GoogleGenerativeAI } from '@google/generative-ai'; const genAI = new GoogleGenerativeAI(process.env.GEMINI_API_KEY); const model = genAI.getGenerativeModel({ model: "gemini-pro"}); let chat = model.startChat();
Ensuite, nous instancions une nouvelle application Express, qui est notre serveur API.
const app = express(); app.use(express.json())
Ensuite, nous configurons notre écouteur pour les requêtes POST
vers le point de terminaison /chat
. Nous nous assurons que le corps de la charge utile JSON inclut un message
. Nous utilisons notre objet chat
pour envoyer ce message à Gemini. Ensuite, nous répondons à notre appelant API avec le texte de réponse de Gemini.
app.post('/chat', async (req, res) => { if ((typeof req.body.message) === 'undefined' || !req.body.message.length) { res.status(400).send('"message" missing in request body'); return; } const result = await chat.sendMessage(req.body.message); const response = await result.response; res.status(200).send(response.text()); })
Gardez à l'esprit qu'en utilisant une ChatSession
, il existe un historique stocké et en cours de notre interaction avec Gemini pour tous les appels d'API. Donner aux Gémeaux un « souvenir » de notre conversation est utile pour le contexte.
Mais que se passe-t-il si vous voulez que les Gémeaux recommencent complètement et oublient tout le contexte précédent ? Pour cela, nous avons le point de terminaison /reset
. Cela démarre simplement une nouvelle ChatSession
.
app.post('/reset', async (req, res) => { chat = model.startChat(); res.status(200).send('OK'); })
Enfin, nous démarrons notre serveur pour commencer l'écoute.
const PORT = process.env.PORT || 3000; app.listen(PORT, () => { console.log(`Server is running on port ${PORT}`) })
En passant, l’ensemble de ce projet n’est qu’une mini démo. Il n'est pas destiné à être utilisé en production ! De la façon dont je l'ai conçu pour l'instant (sans authentification), toute personne disposant de l'URL peut envoyer une requête à /chat
à /reset
. Dans une configuration de production, nous aurions une authentification appropriée en place et chaque utilisateur aurait sa propre instance de conversation avec Gemini que personne d'autre ne pourrait manipuler.
À ce stade, nous sommes presque prêts à partir. La dernière chose dont nous avons besoin est une clé API pour accéder à l'API Gemini. Pour obtenir une clé API, commencez par créer un compte Google AI for Developers .
Une fois connecté, sélectionnez Lancer Google AI Studio pour démarrer un nouveau projet Google Gemini.
Dans le projet, cliquez sur Obtenir la clé API pour accéder à la page des clés API. Cliquez ensuite sur Créer une clé API pour générer une clé. Copiez la valeur.
Dans votre projet, copiez le fichier appelé .env.template
en tant que nouveau fichier appelé .env
. Collez la valeur de votre clé API Gemini. Votre fichier .env
devrait ressembler à ceci :
GEMINI_API_KEY=ABCDEFGH0123456789_JJJ
Une fois tout en place, nous pouvons faire tourner notre serveur localement pour le tester.
~/project$ npm start > [email protected] start > node index.js Server is running on port 3000
Dans un autre terminal, nous pouvons envoyer des requêtes curl :
$ curl -X POST -H 'content-type:application/json' \ --data '{"message":"I would like to bake a shepherds pie to feed 8 \ people. As you come up with a recipe, please keep a grocery \ list for me with all of the ingredients that I would need to \ purchase."}' \ http://localhost:3000/chat **Shepherd's Pie Recipe for 8** **Ingredients:** **For the Filling:** * 1 pound ground beef * 1/2 pound ground lamb * 2 medium onions, diced … **For the Mashed Potatoes:** * 3 pounds potatoes, peeled and quartered * 1/2 cup milk … **Instructions:** **For the Filling:** 1. Heat a large skillet over medium heat. Add the ground beef and lamb and cook until browned. … $ curl -X POST -H 'content-type:application/json' \ --data '{"message":"I also need to buy fresh basil, for a different dish (not the shepherds pie). Add that to my grocery list \ too."}' \ http://localhost:3000/chat **Updated Grocery List for Shepherd's Pie for 8, and Fresh Basil:** * 1 pound ground beef * 1/2 pound ground lamb * 2 medium onions * 2 carrots * 2 celery stalks * 1 bag frozen peas * 1 bag frozen corn * 1 tablespoon Worcestershire sauce * 1 teaspoon dried thyme * 1 cup beef broth * 1/4 cup tomato paste * 3 pounds potatoes * 1/2 cup milk * 1/4 cup butter * **Fresh basil** $ curl -X POST -H 'content-type:application/json' \ --data '{"message":"What items on my grocery list can I find in the \ produce section?"}' \ http://localhost:3000/chat The following items on your grocery list can be found in the produce section: * Onions * Carrots * Celery * Potatoes * Fresh basil $ curl -X POST http://localhost:3000/reset OK $ curl -X POST -H 'content-type:application/json' \ --data '{"message":"What items are on my grocery list?"}' \ http://localhost:3000/chat I do not have access to your grocery list, so I cannot give you the items on it.
Ça marche. On dirait que nous sommes prêts à déployer !
Pour déployer notre application, j'ai choisi d'utiliser Heroku. C'est rapide, simple et peu coûteux. Je peux exécuter mon code dans le cloud en quelques étapes simples, sans m'embourber dans tous les problèmes d'infrastructure les plus importants. De cette façon, je peux simplement me concentrer sur la création d’applications intéressantes.
Après avoir créé un compte Heroku et installé la CLI , voici ce qu'il faut pour déployer.
Procfile
à la base de code Nous devons inclure un fichier appelé Procfile
qui indique à Heroku comment démarrer notre application. Le contenu de Procfile
ressemble à ceci :
web: npm start
Nous validons ce fichier dans notre dépôt de base de code.
~/project$ heroku login
~/project$ heroku create gemini-chatbot Creating ⬢ gemini-chatbot... done https://gemini-chatbot-1933c7b1f717.herokuapp.com/ | https://git.heroku.com/gemini-chatbot.git
~/project$ heroku config:add \ --app gemini-chatbot \ GEMINI_API_KEY=ABCDEFGH0123456789_JJJ Setting GEMINI_API_KEY and restarting ⬢ gemini-chatbot... done, v3 GEMINI_API_KEY: ABCDEFGH0123456789_JJJ
~/project$ git push heroku main ... remote: -----> Building on the Heroku-22 stack remote: -----> Determining which buildpack to use for this app remote: -----> Node.js app detected ... remote: -----> Build succeeded! remote: -----> Discovering process types remote: Procfile declares types -> web remote: remote: -----> Compressing... remote: Done: 45.4M remote: -----> Launching... remote: Released v4 remote: https://gemini-chatbot-1933c7b1f717.herokuapp.com/ deployed to Heroku
C'est ça? C'est ça.
Une fois notre application déployée, envoyons quelques requêtes curl à l'URL de notre application Heroku.
$ curl -X POST -H 'content-type:application/json' \ --data '{"message":"If I ask you later for my PIN, remind me that it \ is 12345."}' \ https://gemini-chatbot-1933c7b1f717.herokuapp.com/chat Sure, if you ask me for your PIN later, I will remind you that it is 12345. **Please note that it is not a good idea to share your PIN with anyone, including me.** Your PIN is a secret code that should only be known to you. If someone else knows your PIN, they could access your account and withdraw your money. $ curl -X POST -H 'content-type:application/json' \ --data '{"message":"What is my PIN?"}' \ https://gemini-chatbot-1933c7b1f717.herokuapp.com/chat Your PIN is 12345. $ curl -X POST https://gemini-chatbot-1933c7b1f717.herokuapp.com/reset OK $ curl -X POST -H 'content-type:application/json' \ --data '{"message":"What is my PIN?"}' \ https://gemini-chatbot-1933c7b1f717.herokuapp.com/chat Unfortunately, I am unable to provide your personal PIN as I do not have access to your private information. If you can't remember it, I suggest you visit the bank or organization that issued the PIN to retrieve or reset it.
C’est le moment idéal pour créer des applications basées sur LLM. Surfez sur la vague !
Nous avons expliqué comment créer une application simple basée sur LLM sur Google Gemini. Notre simple assistant chatbot est basique, mais c'est un excellent moyen de vous familiariser avec l'API Gemini et ses SDK associés. Et en utilisant Heroku pour le déploiement, vous pouvez vous décharger des préoccupations secondaires afin de pouvoir vous concentrer sur l'apprentissage et la construction là où cela compte.