Aller au contenu | Aller au menu | Aller à la recherche

Customisez ChatGPT avec vos données personnelles

ChatGPT est un outil puissant, mais qui à l'heure où cet article est rédigé, est limité aux données à fin 2021. Souvent ses réponses peuvent également être peu précises sur certaines informations ou données sur une personne, une société, ou un produit par exemple. Alors si vous avez besoin, pour votre support technique, de puiser dans votre base interne de connaissances mise à jour régulièrement et bien nous allons ajouter ces données personnelles à ChatGPT, et uniquement pour votre usage interne. Rien de ce que vous ajouterez à ce système ne sera publié dans le ChatGPT grand public.

Pour réaliser ce POC d'un ChatGPT étendu nous allons travailler dans un environnement Anaconda. Avec Anaconda vous aurez tout ce dont vous avez besoin pour vous lancer dans la data science sur votre poste de travail. Conda est un système de gestion de packages et d'environnement open source qui s'exécute sous Windows, macOS et Linux. Conda installe, exécute et met à jour rapidement les packages et leurs dépendances. Il crée, enregistre, charge et bascule facilement entre les environnements sur votre ordinateur local. Il a été créé pour les programmes Python, mais il peut empaqueter et distribuer des logiciels pour n'importe quel langage.

Commencez par installer Anaconda.

Dans notre cas nous sommes sur macOS, mais cela s'appliquera quasi de façon identique sur les autres OS supportés.

Lancez votre terminal pour contrôler votre installation :

conda --version

Validez que vous avez bien une version 23.x pour être un minimum à jour.

Ensuite nous allons commencer par faire une petite mise à jour de la plateforme, les choses évoluent vite :

conda update conda

Validez les mises à jour proposées cela ne peut pas vous faire de mal.

Puis nous allons créer un nouvel espace, ou projet dans anaconda, et l'activer :

conda create --name mychatbot
conda activate mychatbot

Comme pour le moment nous avons une configuration de base d'Anaconda il faut au minimum installer les packages nécéssaires pour travailler et en particulier le gestionnaire de paquets pip pour python.

conda install pip
pip install openai
pip install llama-index

Votre environnement de travail est fin prêt. Logiquement votre dossier de travail devrait être : ~/anaconda3/envs/mychatbot

Vous allez donc vous placer dans ce dossier :

cd ~/anaconda3/envs/mychatbot

Et nous allons éditer un fichier main.py qui devra avoir ce contenu :

# Import necessary packages
import os
import pickle

from llama_index import GPTSimpleVectorIndex, download_loader

# NOTE: for local testing only, do NOT deploy with your key hardcoded
# os.environ['OPENAI_API_KEY'] = "your key here"

# This loader is designed to be used as a way to load data from a directory into LlamaIndex
SimpleDirectoryReader = download_loader("SimpleDirectoryReader")

# Load data in the /data folder with subfolders
loader = SimpleDirectoryReader('./data', recursive=True, exclude_hidden=True)

index = None
index_name = "./index.json"

def initialize_index():
  global index

  # Load from file if an index already exists
  if os.path.exists(index_name):
      index = GPTSimpleVectorIndex.load_from_disk(index_name)
  else:
      # Create the index if is not existing
      documents = loader.load_data()
      index = GPTSimpleVectorIndex.from_documents(documents)
      # Then save the index to disk
      index.save_to_disk(index_name)

if __name__ == "__main__":
    # init the global index
    print("initializing index...")
    initialize_index()

    # Querying the index
    while True:
        prompt = input("User: ")
        response = index.query(prompt)
        print(f'Agent: {response}')

Le principe est simple, nous allons dans un premier temps indexer sous le format d'index vectoriel (format de stockage de ChatGPT - GPTSimpleVectorIndex) les fichiers qui se trouvent dans le dossier ./data. Pour mon exemple, j'ai simplement placé la sortie PDF de ma page Linkedin. Une fois le contenu indexé, il est sauvegardé dans un fichier index.json. Dans un but d'optimisation, nous ne relançons pas l'indexation si le fichier d'index est déjà présent au lancement du ChatBot. Puis nous lançons le bot qui va donc attendre un Prompt de votre part.

Concernant cette ligne :

os.environ['OPENAI_API_KEY'] = "your key here"

Pensez à ne jamais mettre votre clé openAI dans un script exécutable, il est toujours préférable de lire cette donnée depuis une variable d'environnement. Sur macOS ou Linux un export OPENAI_API_KEY="you key here" fera parfaitement l'affaire. Pensez à la mettre dans un script lancé au démarrage de votre machine pour automatiquement l'ajouter à vos variables globales.

Maintenant que nous avons rédigé notre script voyons ce que cela donne en terme de résultat.

Bien sûr nous allons voir un avant et un après, avant ChatGPT n'avait aucune information sur moi :

ChatGPT ne connait pas Hervé Piedvache, avr. 2023

Puis passons maintenant à notre script Python :

python ./from_file.py
initializing index...
User: Qui est Hervé Piedvache ?
INFO:llama_index.token_counter.token_counter:> [query] Total LLM token usage: 1033 tokens
INFO:llama_index.token_counter.token_counter:> [query] Total embedding token usage: 11 tokens
Agent:
Hervé Piedvache est un entrepreneur et un développeur d'applications qui a une vaste expérience dans la gestion de projets, le développement d'applications et l'administration de bases de données dans un environnement Linux. Il est particulièrement intéressé par la conception de bases de données client/serveur et relationnelles à l'aide de PostgreSQL. Il est spécialisé dans les projets open source, PostgreSQL, Linux, PHP, Javascript et le développement Web 2.0. Il a également été le fondateur et le PDG de plusieurs entreprises, dont Bilendi & respondi (CTO), Bilendi Technology (ex Elma), TapPublisher et Mirame.net.
User:

Nous avons vu dans un précédent article que le Prompt avait son importance, en voici une petite démonstration amusante, avec une présentation différente liée au rôle précisé dans le Prompt :

User: En temps que journaliste, que tu peux me dire sur Hervé Piedvache ?
INFO:llama_index.token_counter.token_counter:> [query] Total LLM token usage: 1122 tokens
INFO:llama_index.token_counter.token_counter:> [query] Total embedding token usage: 35 tokens
Agent:
Hervé Piedvache est un entrepreneur et un technicien expérimenté. Il a été un gestionnaire de projet, un développeur d'applications et un administrateur de bases de données dans une variété d'applications commerciales sur un environnement Linux. Il est particulièrement intéressé par la conception de bases de données client / serveur et relationnelles à l'aide de PostgreSQL.

Aujourd'hui, il est principalement entrepreneur dans différentes entreprises, responsable des équipes techniques, des choix stratégiques et de la technologie. Il est spécialisé dans les projets open source, PostgreSQL, Linux, PHP, Javascript et le développement Web 2.0.

Il est le CTO de Bilendi et CEO de Bilendi Technology, et a cofondé TapPublisher et Mirame.net. Il a également été le CEO de Sylaps et a travaillé dans le développement de nombreux logiciels.

Vous constaterez donc que ChatGTP couplé à Llama-index est donc parfaitement en mesure d'apporter des informations issues de bases externes. Cela laisse donc d'immenses possibilités pour faire votre ChatGTP personnel.

On peut facilement mettre d'autres sources de données pour les indexer, vous trouverez une liste avec un large éventail de choix sur le site [Llama-Hub|https://llamahub.ai/|en|Connect custom data sources to your LLM].

Voilà un autre exemple si vous travaillez par exemple avec Zendesk pour votre support client, et que vous voulez puiser dans l'aide en ligne publiée en temps réel depuis votre ChatBot il suffit de brancher ce code par exemple, qui va indexer vos données fraiches sur vos produits ou solutions :

# Import necessary packages
import os
import pickle

from llama_index import GPTSimpleVectorIndex, download_loader

# NOTE: for local testing only, do NOT deploy with your key hardcoded
# os.environ['OPENAI_API_KEY'] = "your key here"

# Use the ZendeskReader
ZendeskReader = download_loader("ZendeskReader")
# Configure you Zendesk sub-domain - default Zendesk support itself
loader = ZendeskReader(zendesk_subdomain="support", locale="en-us")

index = None
index_name = "./index.json"

def initialize_index():
  global index

  if os.path.exists(index_name):
      index = GPTSimpleVectorIndex.load_from_disk(index_name)
  else:
      documents = loader.load_data()
      index = GPTSimpleVectorIndex.from_documents(documents)
      index.save_to_disk(index_name)

if __name__ == "__main__":
    # init the global index
    print("initializing index...")
    initialize_index()

    # Querying the index
    while True:
        prompt = input("Customer: ")
        response = index.query(prompt)
        print(f'Agent: {response}')

ChatGPT combiné à Llama-Index peut donc aider à créer un chatbot ChatGPT personnalisé qui peut déduire des connaissances basées sur ses propres sources de documents. Bien que ChatGPT et d'autres LLM soient assez puissants, l'extension du modèle LLM offre une expérience beaucoup plus fine et ouvre la possibilité de créer un chatbot de style conversationnel qui peut être utilisé pour créer de véritables cas d'utilisations commerciales comme l'assistance client. Étant donné que nous pouvons alimenter des données en temps réel, nous pouvons combler certaines des limites des modèles ChatGPT toujours alimentés jusqu'à une certaine date.

La discussion continue ailleurs

URL de rétrolien : https://www.footcow.com/index.php?trackback/87

Fil des commentaires de ce billet