|
|
import google.generativeai as genai |
|
|
import gradio as gr |
|
|
from sentence_transformers import SentenceTransformer |
|
|
import faiss |
|
|
import numpy as np |
|
|
from datasets import load_dataset |
|
|
import pandas as pd |
|
|
|
|
|
|
|
|
dataset = load_dataset("ayouubelb/embeddings") |
|
|
data = pd.DataFrame(dataset) |
|
|
embeddings = np.array(data['embedding']).astype('float32') |
|
|
texts = data['metadata'] |
|
|
|
|
|
|
|
|
dim = embeddings.shape[1] |
|
|
index = faiss.IndexFlatIP(dim) |
|
|
index.add(embeddings) |
|
|
|
|
|
genai.configure(api_key="AIzaSyBLlaGtxtzHmVgMfOC02AfgvOoKTwXGGIc") |
|
|
model_gene = genai.GenerativeModel("gemini-2.0-flash") |
|
|
model = SentenceTransformer("dangvantuan/sentence-camembert-base") |
|
|
|
|
|
def rag_legal_bot(user_input): |
|
|
|
|
|
query_embedding = model.encode([user_input]).astype("float32") |
|
|
distances, indices = index.search(query_embedding, 5) |
|
|
|
|
|
print(distances, indices) |
|
|
|
|
|
contextes = [texts[i] for i in indices[0]] |
|
|
contexte = "\n\n".join([f"[Contexte {i+1}]\n{ctx}" for i, ctx in enumerate(contextes)]) |
|
|
|
|
|
|
|
|
prompt = f""" |
|
|
Tu es un assistant juridique expert en droit français. Ta mission est de fournir des réponses précises, |
|
|
factuelles, claires et pédagogiques, destinées à un public mixte (non-juristes et professionnels). |
|
|
Tu t’appuies uniquement sur les textes de loi et contextes fournis, sans interpréter ni spéculer. |
|
|
|
|
|
Consignes détaillées : |
|
|
|
|
|
1. Rigueur juridique : |
|
|
- Cite précisément les articles de loi pertinents. |
|
|
- Mentionne toujours le critère ou principe juridique central lié à la question (ex. lien de subordination pour contrat de travail). |
|
|
- Ne réponds qu’à partir du contexte et des lois fournies. |
|
|
|
|
|
2. Structure et pédagogie : |
|
|
- Organise ta réponse avec titres, sous-titres et listes à puces pour faciliter la lecture. |
|
|
- Explique clairement les notions juridiques, en évitant le jargon technique inutile. |
|
|
- Utilise un exemple concret chaque fois que possible pour illustrer les concepts. |
|
|
|
|
|
3. Portée juridique : |
|
|
- Indique la portée, les conditions d’application et les conséquences juridiques des règles. |
|
|
- Mentionne les enjeux pratiques ou contentieux liés au sujet (ex. risques de requalification, effets sur les droits). |
|
|
- Précise quand des informations complémentaires seraient nécessaires. |
|
|
|
|
|
4. Objectivité et professionnalisme : |
|
|
- Reste neutre, rigoureux et factuel, sans jugement ni supposition. |
|
|
- Si un élément manque ou n’est pas clair, indique-le explicitement. |
|
|
- Termine toujours par un résumé clair et synthétique des points essentiels. |
|
|
|
|
|
Exemple d’introduction dans la réponse : |
|
|
« Selon l’article X du Code Y, … » |
|
|
« Le critère principal pour distinguer est … » |
|
|
« Cette règle a pour conséquence … » |
|
|
|
|
|
Ce prompt incite à : |
|
|
|
|
|
- Mettre en avant le critère clé dans la réponse (ex. lien de subordination) |
|
|
- Donner la portée pratique et juridique des règles |
|
|
- Structurer la réponse de façon pédagogique et professionnelle |
|
|
- Signaler les limites éventuelles du contexte fourni |
|
|
|
|
|
Question : {user_input} |
|
|
|
|
|
{contexte} |
|
|
|
|
|
Réponse : |
|
|
""" |
|
|
|
|
|
response = model_gene.generate_content(prompt) |
|
|
print("Contexte utilisé :\n", contextes) |
|
|
return response.text |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
interface = gr.Interface( |
|
|
fn=rag_legal_bot, |
|
|
inputs=gr.Textbox(label="💬 Entrez votre question ici :"), |
|
|
outputs=gr.Textbox(label="📢 Réponse du chatbot :"), |
|
|
title="🧑⚖️ Assistant Juridique", |
|
|
description="Posez votre question juridique." |
|
|
) |
|
|
|
|
|
interface.launch() |