MarcdeFalco commited on
Commit
991572d
·
1 Parent(s): b1d2330

Rag fonctionnel

Browse files
Files changed (1) hide show
  1. app.py +124 -60
app.py CHANGED
@@ -1,63 +1,127 @@
1
  import gradio as gr
2
  from huggingface_hub import InferenceClient
 
 
 
 
3
 
4
- """
5
- For more information on `huggingface_hub` Inference API support, please check the docs: https://huggingface.co/docs/huggingface_hub/v0.22.2/en/guides/inference
6
- """
7
- client = InferenceClient("HuggingFaceH4/zephyr-7b-beta")
8
-
9
-
10
- def respond(
11
- message,
12
- history: list[tuple[str, str]],
13
- system_message,
14
- max_tokens,
15
- temperature,
16
- top_p,
17
- ):
18
- messages = [{"role": "system", "content": system_message}]
19
-
20
- for val in history:
21
- if val[0]:
22
- messages.append({"role": "user", "content": val[0]})
23
- if val[1]:
24
- messages.append({"role": "assistant", "content": val[1]})
25
-
26
- messages.append({"role": "user", "content": message})
27
-
28
- response = ""
29
-
30
- for message in client.chat_completion(
31
- messages,
32
- max_tokens=max_tokens,
33
- stream=True,
34
- temperature=temperature,
35
- top_p=top_p,
36
- ):
37
- token = message.choices[0].delta.content
38
-
39
- response += token
40
- yield response
41
-
42
- """
43
- For information on how to customize the ChatInterface, peruse the gradio docs: https://www.gradio.app/docs/chatinterface
44
- """
45
- demo = gr.ChatInterface(
46
- respond,
47
- additional_inputs=[
48
- gr.Textbox(value="You are a friendly Chatbot.", label="System message"),
49
- gr.Slider(minimum=1, maximum=2048, value=512, step=1, label="Max new tokens"),
50
- gr.Slider(minimum=0.1, maximum=4.0, value=0.7, step=0.1, label="Temperature"),
51
- gr.Slider(
52
- minimum=0.1,
53
- maximum=1.0,
54
- value=0.95,
55
- step=0.05,
56
- label="Top-p (nucleus sampling)",
57
- ),
58
- ],
59
- )
60
-
61
-
62
- if __name__ == "__main__":
63
- demo.launch()
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
  import gradio as gr
2
  from huggingface_hub import InferenceClient
3
+ import os
4
+ import cohere
5
+ import pickle
6
+ from annoy import AnnoyIndex
7
 
8
+ HF_TOKEN = os.getenv("HUGGINGFACE_TOKEN")
9
+
10
+ client = InferenceClient(token=HF_TOKEN)
11
+ system_message = """Tu es un assistant juridique spécialisé dans le Code de l'éducation français.
12
+ Ta mission est d'aider les utilisateurs à comprendre la législation en répondant à leurs questions.
13
+
14
+ Voici comment tu dois procéder :
15
+
16
+ 1. **Analyse de la question:** Lis attentivement la question de l'utilisateur.
17
+ 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.
18
+ 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...").
19
+ 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.
20
+ 5. **Cas ambigus:**
21
+ * Si la question est trop vague, demande des précisions à l'utilisateur.
22
+ * Si plusieurs articles pourraient s'appliquer, présente les différentes
23
+ interprétations possibles."""
24
+
25
+ co = cohere.Client(os.getenv("COHERE_API_KEY"))
26
+ articles = pickle.load(open('articles.pkl', 'rb'))
27
+ #embeds = pickle.load(open('articles_embeds.pkl', 'rb'))
28
+ #embeds_path = pickle.load(open('articles_path_embeds.pkl', 'rb'))
29
+ search_index = AnnoyIndex(1024, 'angular')
30
+ search_index.load('articles_embeds.ann')
31
+ search_index_path = AnnoyIndex(1024, 'angular')
32
+ search_index_path.load('articles_path_embeds.ann')
33
+
34
+ system_prompt = """Tu es un assistant juridique spécialisé dans le Code de l'éducation français.
35
+ Ta mission est d'aider les utilisateurs à comprendre la législation en répondant à leurs questions.
36
+
37
+ Voici comment tu dois procéder :
38
+
39
+ 1. **Analyse de la question:** Lis attentivement la question de l'utilisateur.
40
+ 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.
41
+ 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...").
42
+ 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.
43
+ 5. **Cas ambigus:**
44
+ * Si la question est trop vague, demande des précisions à l'utilisateur.
45
+ * Si plusieurs articles pourraient s'appliquer, présente les différentes interprétations possibles."""
46
+
47
+
48
+ def query_rag(query, model, with_paths=True):
49
+ # Get the query's embedding
50
+ query_embed = co.embed(texts=[query],
51
+ model="embed-multilingual-v3.0",
52
+ input_type="search_document").embeddings
53
+
54
+ # Retrieve the nearest neighbors
55
+ index = search_index
56
+ if with_paths:
57
+ index = search_index_path
58
+ similar_item_ids = index.get_nns_by_vector(query_embed[0],10,
59
+ include_distances=True)
60
+
61
+ article_dict = {}
62
+ context_list = []
63
+ for i in reversed(similar_item_ids[0]):
64
+ article = articles[i]
65
+ context_list.append(article['path']+'\n'+article['text']+'\n---\n')
66
+ article_dict[article['article']] = '**' + article['path'] + '** ' + article['text']
67
+
68
+ user = 'Question de l\'utilisateur : ' + query + '\nContexte législatif :\n' + '\n'.join(context_list)
69
+ messages = [ { "role" : "system", "content" : system_prompt } ]
70
+ messages.append( { "role" : "user", "content" : user } )
71
+
72
+ chat_completion = client.chat_completion(
73
+ messages=messages,
74
+ model=model,
75
+ max_tokens=1024)
76
+ return chat_completion.choices[0].message.content, article_dict
77
+
78
+ def create_context_response(response, article_dict):
79
+ response += '\n\n**Références**\n\n'
80
+ for i, article in enumerate(article_dict):
81
+ response += '* ' + article_dict[article].replace('\n', '\n ')+'\n'
82
+
83
+ return response
84
+
85
+ def chat_interface(query, model, with_paths):
86
+ response, article_dict = query_rag(query, model, with_paths)
87
+ response_with_context = create_context_response(response, article_dict)
88
+ return response_with_context
89
+
90
+ with gr.Blocks(title="Assistant Juridique pour le Code de l'éducation (Beta)") as demo:
91
+ gr.Markdown(
92
+ """
93
+ ## Posez vos questions sur le Code de l'éducation
94
+
95
+ **Créé par Marc de Falco**
96
+
97
+ **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.
98
+
99
+ **Conseil :** Survolez les numéros d'article dans les réponses pour voir le texte complet de l'article.
100
+ """
101
+ )
102
+
103
+ query_box = gr.Textbox(label="Votre question")
104
+
105
+ model = gr.Dropdown(
106
+ label="Modèle de langage",
107
+ choices=[
108
+ "meta-llama/Meta-Llama-3-70B",
109
+ "meta-llama/Meta-Llama-3-8B",
110
+ "HuggingFaceH4/zephyr-7b-beta",
111
+ "NousResearch/Nous-Hermes-2-Mixtral-8x7B-DPO",
112
+ "mistralai/Mixtral-8x22B-v0.1"
113
+ ],
114
+ value="HuggingFaceH4/zephyr-7b-beta")
115
+
116
+ with_paths = gr.Checkbox(label="Utiliser les chemins d'accès aux articles dans le code pour interroger le modèle.",
117
+ value=True)
118
+
119
+ submit_button = gr.Button("Envoyer")
120
+
121
+ response_box = gr.Markdown()
122
+
123
+ submit_button.click(chat_interface,
124
+ inputs=[query_box, model, with_paths],
125
+ outputs=[response_box])
126
+
127
+ demo.launch()