Quand on découvre ChatGPT, une des premières choses que les personnes font, moi y compris, est de lui poser des questions. Comme le modèle est entrainé sur des données fixes, il répond souvent avec des réponses incomplètes, qui ne prennent pas en compte l’actualité. Cependant, ses réponses sont souvent complètes et bien formulées. Il pourrait répondre à bien plus de questions, de manière plus précise surtout si on lui fournit les connaissances nécessaires pour y répondre.
Et c’est exactement ce que je souhaite vous partager aujourd’hui, comment créer votre assistant textuel, qui utilise une base de connaissances existante, pour vous répondre.
Petit point sur la protection des données
Pour ce petit tutoriel, je vais utiliser l’API d’OpenAI. OpenAI, actuellement n’utilise pas les données qu’elle reçoit de leur API pour entrainer leur modèle (voir cet article). Mais, parce que les conditions d’utilisation d’un service peuvent changer, je vous déconseille d’envoyer des données trop sensibles via l’API d’OpenAI, ou de n’importe quel autre LLM qui n’est pas hébergé chez vous.
Ce point étant écarté, passons au début de ce tutoriel.
Comment s’y prendre
Dans cet article, je veux vous montrer une manière simple et rapide pour faire cet assistant, et pour ça on va avoir besoin de 2 composants principaux :
- Un mécanisme pour récupérer les éléments de la base de connaissance
- L’appel à l’API de ChatGPT avec les bons prompts
Récupérer les éléments de la base de connaissances
Pour ce projet, il vous faut un moyen de récupérer les éléments de la base de connaissance sous un format texte. Le but de ce mécanisme est d’à partir de la phrase que l’utilisateur va envoyer à votre assistant, déterminer quels éléments de votre base de connaissances peuvent y répondre, et les rassembler.
Comme les modèles de ChatGPT limite le nombre de tokens que vous pouvez envoyer, et donc le nombre de caractères (1 token équivaut à 1 syllabe environ), il faut ne récupérer que que les éléments utiles pour répondre à la requête de l’utilisateur.
Il vous faudra donc un service qui va chercher dans vos diverses sources de données pour les informations. Vous pouvez par exemple avoir une base d’indexation comme ElasticSearch, Apache Solr, Lucene, ou autre solution à requêter pour récupérer les informations. Vous pouvez aussi utiliser des services cloud comme Azure Cognitive Search ou AWS CloudSearch.
Appel à OpenAI
Maintenant que vous avez récupérer les données, il faut les transmettre à ChatGPT avec la demande de l’utilisateur.
Utilisation de l’API OpenAI
OpenAI, pour communiquer avec ChatGPT, fourni des librairies en Python et JavaScript . Il en existe dans d’autres langages, développés par la communauté.
Cette librairie est très simple d’utilisation, il suffit de l’installer, d’avoir une clé API qu’on génère depuis son compte OpenAI et on est parti.
Voici un exemple d’intégration en TypeScript:
async getAnswer(question: string, postsContents: string[]): Promise<string>
{
const posts = postsContents.join("\n");
const response = await this.openAi.chat.completions.create({
model: "gpt-3.5-turbo-16k",
messages: [{
role: "system",
content: "Tu vas recevoir un texte en markdown précédé de 'Texte:'"
}, {
role: "system",
content: "Tu vas recevoir une question précédée de 'Question:'"
}, {
role: "system",
content: "Résume le texte que je vais te donner"
}, {
role: "system",
content: "Tu répondras à la question en utilisant le texte que je t'ai donné"
}, {
role: "system",
content: "Ta réponse n'incluera pas la question à laquelle tu réponds"
}, {
role: "user",
content: `Texte: ${posts}\n\nQuestion: ${question}`
}]
});
return response.choices[0].message.content || '';
}
Comme vous pouvez le voir, l’API est très simple d’utilisation, la réponse renvoyée par OpenAI est un peu complexe, mais la documentation permet de s’y retrouver très facilement.
Vous pouvez adapter les prompts systèmes à votre besoin pour formater la réponse de ChatGPT et varier les réponses. Vous pouvez même laisser l’utilisateur en ajouter. Dans cet exemple, qui est volontairement simple, j’ai laissé certains paramètres par défaut, comme le nombre de tokens en sortie, la température, etc… Je vous laisse fouiller la documentation du SDK d’OpenAI pour adapter votre assistant à vos besoins.
Conclusion et prochaines étapes
Intégrer ChatGPT à une application est très simple grâce au SDK qui est simple d’utilisation et surtout très rapide à intégrer pour un développeur confirmé. On a juste besoin d’une clé API et on peut faire ce que l’on souhaite. Les prix sont abordables, surtout si on continue à utiliser GPT 3.5 qui reste très performant et abordable à $0.002 pour 1000 tokens (environ 300-400 mots). Vous pouvez aussi utiliser GPT 4, qui donne encore de meilleurs réponses, mais qui est 10 fois plus cher.
Je vous invite à vous renseigner sur la tarification des modèles, si vous voulez plus de détails.
Améliorations possibles
Pour aller plus loin, et vous donner des pistes pour continuer, il y a aussi possibilité d’utiliser des embeddings qui permettent de simplifier la recherche dans vos documents en les transformant.