codeeducrag / app.py
MarcdeFalco's picture
Rag fonctionnel
991572d
raw
history blame
5.84 kB
import gradio as gr
from huggingface_hub import InferenceClient
import os
import cohere
import pickle
from annoy import AnnoyIndex
HF_TOKEN = os.getenv("HUGGINGFACE_TOKEN")
client = InferenceClient(token=HF_TOKEN)
system_message = """Tu es un assistant juridique spécialisé dans le Code de l'éducation français.
Ta mission est d'aider les utilisateurs à comprendre la législation en répondant à leurs questions.
Voici comment tu dois procéder :
1. **Analyse de la question:** Lis attentivement la question de l'utilisateur.
2. **Identification des articles pertinents:** Examine les 10 articles de loi fournis et sélectionne ceux qui sont les plus pertinents pour répondre à la question.
3. **Formulation de la réponse:** Rédige une réponse claire et concise en français, en utilisant les informations des articles sélectionnés. Cite explicitement les articles que tu utilises (par exemple, "Selon l'article L311-3...").
4. **Structure de la réponse:** Si ta réponse s'appuie sur plusieurs articles, structure-la de manière logique, en séparant les informations provenant de chaque article.
5. **Cas ambigus:**
* Si la question est trop vague, demande des précisions à l'utilisateur.
* Si plusieurs articles pourraient s'appliquer, présente les différentes
interprétations possibles."""
co = cohere.Client(os.getenv("COHERE_API_KEY"))
articles = pickle.load(open('articles.pkl', 'rb'))
#embeds = pickle.load(open('articles_embeds.pkl', 'rb'))
#embeds_path = pickle.load(open('articles_path_embeds.pkl', 'rb'))
search_index = AnnoyIndex(1024, 'angular')
search_index.load('articles_embeds.ann')
search_index_path = AnnoyIndex(1024, 'angular')
search_index_path.load('articles_path_embeds.ann')
system_prompt = """Tu es un assistant juridique spécialisé dans le Code de l'éducation français.
Ta mission est d'aider les utilisateurs à comprendre la législation en répondant à leurs questions.
Voici comment tu dois procéder :
1. **Analyse de la question:** Lis attentivement la question de l'utilisateur.
2. **Identification des articles pertinents:** Examine les 10 articles de loi fournis et sélectionne ceux qui sont les plus pertinents pour répondre à la question.
3. **Formulation de la réponse:** Rédige une réponse claire et concise en français, en utilisant les informations des articles sélectionnés. Cite explicitement les articles que tu utilises (par exemple, "Selon l'article L311-3...").
4. **Structure de la réponse:** Si ta réponse s'appuie sur plusieurs articles, structure-la de manière logique, en séparant les informations provenant de chaque article.
5. **Cas ambigus:**
* Si la question est trop vague, demande des précisions à l'utilisateur.
* Si plusieurs articles pourraient s'appliquer, présente les différentes interprétations possibles."""
def query_rag(query, model, with_paths=True):
# Get the query's embedding
query_embed = co.embed(texts=[query],
model="embed-multilingual-v3.0",
input_type="search_document").embeddings
# Retrieve the nearest neighbors
index = search_index
if with_paths:
index = search_index_path
similar_item_ids = index.get_nns_by_vector(query_embed[0],10,
include_distances=True)
article_dict = {}
context_list = []
for i in reversed(similar_item_ids[0]):
article = articles[i]
context_list.append(article['path']+'\n'+article['text']+'\n---\n')
article_dict[article['article']] = '**' + article['path'] + '** ' + article['text']
user = 'Question de l\'utilisateur : ' + query + '\nContexte législatif :\n' + '\n'.join(context_list)
messages = [ { "role" : "system", "content" : system_prompt } ]
messages.append( { "role" : "user", "content" : user } )
chat_completion = client.chat_completion(
messages=messages,
model=model,
max_tokens=1024)
return chat_completion.choices[0].message.content, article_dict
def create_context_response(response, article_dict):
response += '\n\n**Références**\n\n'
for i, article in enumerate(article_dict):
response += '* ' + article_dict[article].replace('\n', '\n ')+'\n'
return response
def chat_interface(query, model, with_paths):
response, article_dict = query_rag(query, model, with_paths)
response_with_context = create_context_response(response, article_dict)
return response_with_context
with gr.Blocks(title="Assistant Juridique pour le Code de l'éducation (Beta)") as demo:
gr.Markdown(
"""
## Posez vos questions sur le Code de l'éducation
**Créé par Marc de Falco**
**Avertissement :** Les informations fournies sont à titre indicatif et ne constituent pas un avis juridique. Les serveurs étant publics, veuillez ne pas inclure de données sensibles.
**Conseil :** Survolez les numéros d'article dans les réponses pour voir le texte complet de l'article.
"""
)
query_box = gr.Textbox(label="Votre question")
model = gr.Dropdown(
label="Modèle de langage",
choices=[
"meta-llama/Meta-Llama-3-70B",
"meta-llama/Meta-Llama-3-8B",
"HuggingFaceH4/zephyr-7b-beta",
"NousResearch/Nous-Hermes-2-Mixtral-8x7B-DPO",
"mistralai/Mixtral-8x22B-v0.1"
],
value="HuggingFaceH4/zephyr-7b-beta")
with_paths = gr.Checkbox(label="Utiliser les chemins d'accès aux articles dans le code pour interroger le modèle.",
value=True)
submit_button = gr.Button("Envoyer")
response_box = gr.Markdown()
submit_button.click(chat_interface,
inputs=[query_box, model, with_paths],
outputs=[response_box])
demo.launch()