Aller au contenu

Interface graphique

Jusqu'à présent les questions à destination du LLM sont rédigées depuis notre programme, ce n'est évidemment pas une situation d'avenir ! Nous allons donc mettre en place une interface graphique afin de permettre aux utilisateurs de poser des questions sans avoir besoin de modifier le code.

Nous pourrions mettre en place un serveur qui pourrait être interrogé par un client (page web écrite en HTML et JavaScript), mais il existe une solution beaucoup plus simple à mettre en oeuvre qui va nous permettre de tout écrire en Python : Gradio

Gradio est une bibliothèque Python qui permet de mettre en place une interface graphique dans un navigateur Web en écrivant uniquement quelques lignes de Python.

Repartons sur l'exemple du chapitre 4 :

from dotenv import load_dotenv
from openai import OpenAI
from IPython.display import Markdown, display
from pypdf import PdfReader
import os
import gradio as gr

load_dotenv()

API_KEY = os.getenv('GOOGLE_API_KEY')
Seule petite nouveauté au niveau des ìmport : la bibliothèque gradio (que nous utiliserons avec l'alias gr).

reader = PdfReader("./reglement_interieur.pdf")
reglement = ""
for page in reader.pages:
    text = page.extract_text()
    if text:
        reglement += text

prompt_system = f"Tu dois répondre aux questions portant sur le règlement intérieur de lycée Rouvière de Toulon.\
Tu ne dois aborder aucun autre sujet. Si tu ne trouves pas la réponse à la question posée, tu ne dois pas inventer une réponse,\
tu dois simplement dire 'Désolé, je n'ai pas la réponse à cette question'. \
Pour t'aider à répondre aux questions, tu peux consulter le règlement intérieur du lycée Rouvière : \n {reglement}\n"

llm = OpenAI(api_key=API_KEY, base_url="https://generativelanguage.googleapis.com/v1beta/openai/")
Rien de nouveau ci-dessus : nous plaçons le contenu du pdf dans la variable reglement, nous créons notre prompt système et une instance de la classe OpenAI.

Petite nouveauté maintenant, nous allons créer une fonction chat qui va contenir l'appel au LLM. Cette fonction prend 2 paramètres : - message qui correspond au message que l'on va envoyer au LLM - historyque nous n'allons pas expliquer dans ce chapitre (mais sa présence est obligatoire pour le bon fonctionnement de gradio)

def chat(message, history):
     msg = [{"role": "system", "content": prompt_system}] + [{"role": "user", "content": message}]
     response = llm.chat.completions.create(model = 'gemini-2.0-flash', messages = msg)
     answer = response.choices[0].message.content
     return answer
Rien de très compliqué, nous avons pris les éléments déjà vus dans le chapitre précédent pour les mettre dans notre fonction chat. La fonction renvoie le texte correspondant à la réponse du LLM.

Il nous reste à mettre en place notre interface graphique avec cette unique ligne :

gr.ChatInterface(chat, type="messages").launch()
Voilà, vous pouvez désormais dialoguer avec le chatbot spécialisé dans le règlement intérieur du lycée Rouvière. Vous pouvez interagir directement depuis cette page ou en ouvrant une page de navigateur en cliquant sur le lien donné ci-dessus.

Code complet :

from dotenv import load_dotenv
from openai import OpenAI
from IPython.display import Markdown, display
from pypdf import PdfReader
import os
import gradio as gr

load_dotenv()

API_KEY = os.getenv('GOOGLE_API_KEY')

reader = PdfReader("./reglement_interieur.pdf")
reglement = ""
for page in reader.pages:
    text = page.extract_text()
    if text:
        reglement += text

prompt_system = f"Tu dois répondre aux questions portant sur le règlement intérieur de lycée Rouvière de Toulon.\
Tu ne dois aborder aucun autre sujet. Si tu ne trouves pas la réponse à la question posée, tu ne dois pas inventer une réponse,\
tu dois simplement dire 'Désolé, je n'ai pas la réponse à cette question'. \
Pour t'aider à répondre aux questions, tu peux consulter le règlement intérieur du lycée Rouvière : \n {reglement}\n"

llm = OpenAI(api_key=API_KEY, base_url="https://generativelanguage.googleapis.com/v1beta/openai/")

def chat(message, history):
     msg = [{"role": "system", "content": prompt_system}] + [{"role": "user", "content": message}]
     response = llm.chat.completions.create(model = 'gemini-2.0-flash', messages = msg)
     answer = response.choices[0].message.content
     return answer

gr.ChatInterface(chat, type="messages").launch()