Interroger vos documents PDF avec GPT-4

C'est quoi un LLM ?

Un LLM (Large Language Model) est un modèle informatique avancé qui a été entraîné pour comprendre et manipuler le langage humain.

 En termes simples, c'est comme un programme informatique qui apprend à parler, lire et écrire dans différentes langues. 

Il fait cela en analysant d'énormes quantités de textes provenant de diverses sources, comme des livres, des articles et des sites Web.

 Grâce à cet apprentissage, il devient capable de répondre à des questions, de rédiger des textes et même de mener des conversations avec les utilisateurs. Un exemple de LLM est ChatGPT, qui est basé sur l'architecture GPT-4 d'OpenAI.

Comment utiliser un LLM avec mes données ?

Comment augmenter au mieux les LLM avec nos propres données privées ?

Un paradigme qui a émergé est l'apprentissage contextuel (l'autre est le finetuning), où nous insérons le contexte dans l'invite d'entrée. 

De cette manière, nous profitons des capacités de raisonnement du LLM pour générer une réponse.

Vous trouverez rapidement des exemples sur le web de code Python permettant de faire cela. Malheureusement, ceux-ci sont rapidement obsolètes, après quelques semaines seulement. En effet, les API de OpenAI évoluent très rapidement. 

Je vais donc m'efforcer de mettre à jour cet exemple fonctionnel régulièrement afin qu'il continue toujours à être utilisable. Attention, il vous faudra impérativement un compte payant pour pouvoir utiliser le modèle GPT-4.

Quelles librairies Python utiliser ?

Dans cet exemple nous allons utiliser les librairies Python suivantes :
  • openai: fournit un accès pratique à l’API OpenAI depuis des applications écrites en Python1.
  • gpt_index: est une bibliothèque Python pour la création d’index de textes basée sur GPT-2.
  • PyPDF2: est une bibliothèque Python pour travailler avec des fichiers PDF.
  • gradio: est une bibliothèque Python pour créer des interfaces utilisateur personnalisées pour les modèles de machine learning.
Pour les installer, taper les commandes suivantes :

python -m pip install -U pip
pip install openai
pip install gpt_index
pip install PyPDF2
pip install gradio

Dans le répertoire docs, j'ai ajouté une dizaine de documents PDF qui serviront à constituer mon corpus de base. Chaque document est composé d'un titre sous forme de question et d'une réponse.

L'interface utilisateur

Gradio permet de réaliser très rapidement des interfaces web de type Chat, dans ce style :


Le code source chat.py

Le fichier openai.key.txt doit contenir votre clé d'accès obtenue sur le site OpenAI API

from gpt_index import ServiceContext, SimpleDirectoryReader
from gpt_index import GPTListIndex, GPTSimpleVectorIndex, LLMPredictor, PromptHelper
from langchain.chat_models import ChatOpenAI
import gradio as gr
import sys
import os

### Read more:
### https://beebom.com/how-train-ai-chatbot-custom-knowledge-base-chatgpt-api/
### https://pypi.org/project/llama-index/

with open('openai.key.txt', 'r') as f:
    os.environ["OPENAI_API_KEY"] = f.read()

def construct_index(directory_path):
    max_input_size = 4096
    num_outputs = 512
    max_chunk_overlap = 20
    chunk_size_limit = 600

    prompt_helper = PromptHelper(max_input_size, num_outputs, \
        max_chunk_overlap, chunk_size_limit=chunk_size_limit)

    llm_predictor = LLMPredictor(llm=ChatOpenAI(temperature=0.2, \
        model_name="gpt-4", max_tokens=num_outputs))

    service_context = ServiceContext.from_defaults(llm_predictor=llm_predictor, \
        prompt_helper=prompt_helper)

    documents = SimpleDirectoryReader(directory_path).load_data()

    index = GPTSimpleVectorIndex.from_documents(documents, \
        service_context=service_context)

    index.save_to_disk('index.json')

    return index

def chatbot(input_text):
    index = GPTSimpleVectorIndex.load_from_disk('index.json')
    response = index.query(input_text, response_mode="compact")
    return response.response

iface = gr.Interface(fn=chatbot,
                     inputs=gr.Textbox(lines=5, \
                        label="Posez votre question à notre IA"),
                     outputs=gr.Textbox(lines=15, label="Réponse"),
                     title="myChatGPT")

index = construct_index("docs")
iface.launch(share=False)

Commentaires