tferhan commited on
Commit
f28182b
1 Parent(s): ce8b96d

Upload 6 files

Browse files
Files changed (6) hide show
  1. data_process.py +50 -0
  2. finito.py +83 -0
  3. intents_v2 (1).txt +169 -0
  4. key_extract (1).py +23 -0
  5. qa_txt (2).py +62 -0
  6. requirements (4).txt +10 -0
data_process.py ADDED
@@ -0,0 +1,50 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import re
2
+ from bs4 import BeautifulSoup
3
+ import requests
4
+
5
+ def nettoyer_string(mot):
6
+ mot_non_special = re.sub(r'[^\w\sÀ-ÿ]' , '', mot)
7
+ mot_ns_ne = re.sub(r'\s+', ' ', mot_non_special)
8
+ mot_final = mot_ns_ne.strip()
9
+
10
+
11
+ return mot_final
12
+
13
+
14
+ def chercher_data(mot,titles = [], links = [] ):
15
+ response = requests.get("https://data.gov.ma/data/fr/dataset", params={'q': mot})
16
+ if response.status_code != 200:
17
+ return titles, links, response.url, 0
18
+ soup = BeautifulSoup(response.text, features="lxml")
19
+ nb_text = soup.find('h1').text
20
+ nombre_don = re.findall(r'\d+', nb_text)
21
+ media = soup.find('ul', class_='dataset-list list-unstyled')
22
+ if media:
23
+ thm = media.find_all('li', class_ = 'dataset-item')
24
+ for m in thm:
25
+ link = m.find('a')['href']
26
+ links.append('https://data.gov.ma' + link)
27
+ title = m.find('h2').text.strip()
28
+ titles.append(title)
29
+ else:
30
+ return titles, links, response.url, 0
31
+
32
+ if not titles:
33
+ return titles, links, response.url, 0
34
+
35
+ return titles, links ,response.url, nombre_don[0]
36
+
37
+
38
+ def format_reponse(data):
39
+ if len(data[0]) == 1:
40
+ response = f"Ici le lien vers la donnée correspondant au mot recherché : {data[-2]}\n"
41
+ response += f"Voici le seul résultat trouvé :\n"
42
+ response += f"Titre : {data[0][0]}\n"
43
+ response += f"Lien : {data[1][0]}\n"
44
+ return response
45
+ else:
46
+ response = f"Ici le lien vers toutes les {data[-1]} données correspondant au mot recherché : {data[-2]}\n"
47
+ response += f"Voici un exemple parmi les résultats trouvés :\n"
48
+ response += f"Titre : {data[0][-1]}\n"
49
+ response += f"Lien : {data[1][-1]}\n"
50
+ return response
finito.py ADDED
@@ -0,0 +1,83 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # -*- coding: utf-8 -*-
2
+ """finito.ipynb
3
+
4
+ Automatically generated by Colaboratory.
5
+
6
+ Original file is located at
7
+ https://colab.research.google.com/drive/1rNnk3xajWzVdyH2eXJ58ghLpk-zejGw-
8
+ """
9
+
10
+ !pip install -r requirements.txt
11
+
12
+ !pip install gradio
13
+
14
+ from langchain.prompts import StringPromptTemplate
15
+ import re
16
+ import langchain
17
+ from qa_txt import conversation_chain
18
+ from key_extract import chain
19
+ from bs4 import BeautifulSoup
20
+ import requests
21
+ from data_process import *
22
+ from langchain.tools.base import StructuredTool
23
+ from langchain.agents import initialize_agent
24
+ from qa_txt import llm
25
+ import gradio as gr
26
+
27
+ def faq(query: str) -> str:
28
+ reponse = conversation_chain({"question": query, "chat_history": []})
29
+ return reponse['answer']
30
+
31
+ qa_faq = StructuredTool.from_function(
32
+ func = faq ,
33
+ description="""
34
+ Repondre à des questions general .
35
+
36
+ Parameters :
37
+ - query (string) : the same input as the user input no more no less and dont translate it even if it is in another language.
38
+
39
+ Returns :
40
+ - string : the output as returned from the function in french.
41
+ """
42
+ )
43
+
44
+ def request_data(query: str) -> str:
45
+ request = chain.run(query)
46
+ mot_cle = nettoyer_string(request)
47
+ mots = mot_cle.split()
48
+ ui = mots[0]
49
+ rg = chercher_data(ui)
50
+ if len(rg[0]):
51
+ reponse_final = format_reponse(rg)
52
+ return reponse_final
53
+ else:
54
+ return "Désolé, il semble que nous n'ayons pas de données correspondant à votre demande pour le moment. Avez-vous une autre question ou avez-vous besoin d'aide sur quelque chose d'autre?"
55
+
56
+ fetch_data = StructuredTool.from_function(
57
+ func=request_data,
58
+ description="""
59
+ Rechercher des données.
60
+
61
+ Parameters :
62
+ - query (string) : the same input as the user input no more no less and dont translate it even if it is in another language.
63
+
64
+ Returns :
65
+ - string : the output as returned from the function in french.
66
+ """,
67
+ )
68
+
69
+ tools_add = [
70
+ qa_faq,
71
+ fetch_data,
72
+ ]
73
+
74
+ agent = initialize_agent(
75
+ tools = tools_add,
76
+ llm = llm,
77
+ agent = "zero-shot-react-description",
78
+ verbose = True
79
+ )
80
+
81
+ agent.invoke("bonjour je veux l'addresse de contact. Et donner moi les donnée de la finance")
82
+
83
+ gr.ChatInterface(agent.invoke).launch()
intents_v2 (1).txt ADDED
@@ -0,0 +1,169 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ "tag": "If the user say hello or hi or greet you",
2
+ "responses": [
3
+ "Bonjour! Comment puis-je vous aider aujourd'hui?",
4
+ ]
5
+
6
+ "tag": "if the user the user say bye or leave or quit",
7
+ "responses": [
8
+ "Au revoir! N'hesitez pas a revenir si vous avez d'autres questions.",
9
+ ]
10
+
11
+ "tag": "if the user ask about the date of the foundation of the website or the agency in control of it",
12
+ "responses": [
13
+ "Le portail www.data.gov.ma, qui a été initialement lancé en 2011 par le Ministère de l’Industrie, du Commerce et de l’Economie Numérique, est actuellement géré par l’Agence de Développement du Digital.",
14
+ ]
15
+
16
+ "tag": "if the user say thank you or thanks",
17
+ "responses": [
18
+ "Vous etes le bienvenu! Avez-vous besoin d'aide avec autre chose?",
19
+ ]
20
+
21
+ "tag": "if the user ask about useful links or other organizations links",
22
+ "responses": [
23
+ "Bien sûr, voici le lien vers la page contenant les liens utiles : https://data.gov.ma/fr/liens-utiles . Vous y trouverez une sélection de ressources pertinentes pour répondre à vos besoins. Si vous avez d'autres questions, n'hésitez pas à demander !",
24
+ ]
25
+
26
+ "tag": "if the user ask about social media pages",
27
+ "responses": [
28
+ "Vous pouvez nous trouver sur LinkedIn : https://www.linkedin.com/company/agence-de-developpement-du-digital/. Suivez notre page pour rester informé de nos dernières actualités et opportunités professionnelles.",
29
+ ]
30
+
31
+ "tag": "if the user ask about the agency localisation or the physical address",
32
+ "responses": [
33
+ "Notre agence est située à l'adresse suivante : Espace les Lauriers aile B, angle des Avenues Ennakhil et Mehdi Ben Barka, Hay Ryad - Rabat. Si vous souhaitez nous rendre visite ou avoir des indications pour venir, n'hésitez pas à nous contacter.",
34
+ ]
35
+
36
+ "tag": "if the user ask about the phone number contact",
37
+ "responses": [
38
+ "Vous pouvez nous contacter par téléphone au : +212 (0) 5 37 56 93 00. Notre équipe est disponible pour répondre à vos questions et vous fournir toute l'aide nécessaire. N'hésitez pas à nous appeler si vous avez besoin d'assistance supplémentaire.",
39
+ ]
40
+
41
+ "tag": "if the user ask about the contact email address",
42
+ "responses": [
43
+ "Bien entendu ! Vous pouvez nous contacter par e-mail à l'adresse suivante : opendata@add.gov.ma . Si vous avez des questions, des suggestions ou besoin d'assistance, n'hésitez pas à nous écrire. Nous serons heureux de vous aider !",
44
+ ]
45
+
46
+ "tag": "if the user ask about news of the website or the last events",
47
+ "responses": [
48
+ "Absolument ! Pour rester au courant des actualités et des nouveaux événements, vous pouvez consulter la rubrique "Actualités" sur notre site web. Vous y trouverez toutes les informations récentes sur nos activités, événements à venir, et autres nouvelles importantes. Cliquez sur ce lien pour y accéder : https://data.gov.ma/fr/actualites. Si vous avez d'autres questions, n'hésitez pas à demander !",
49
+ ]
50
+
51
+ "tag": "if the user ask about statistics ( number of data, ressources, producers , publishers, files downloaded, page views)",
52
+ "responses": [
53
+ "Bien sûr ! Pour obtenir des statistiques telles que le nombre de données disponibles, les tendances récentes, ou d'autres informations statistiques, vous pouvez consulter la rubrique "Statistiques" sur notre site web. Vous y trouverez des données actualisées et des analyses pertinentes. Cliquez sur ce lien pour y accéder : https://data.gov.ma/index.php/fr/node/7. Si vous avez besoin de plus de détails ou avez d'autres questions, n'hésitez pas à demander !",
54
+ ]
55
+
56
+
57
+
58
+ "tag": "if the user ask about the methodological guide for establishing a data inventory",
59
+ "responses": [
60
+ "Ce document a pour but la gestion d’un inventaire de données ouvertes au sein de leurs structures respectives. Vous pouvez le consulter ici : https://www.data.gov.ma/sites/default/files/2023-03/guide_inventaire_1.3_Fev.%202023.pdf",
61
+ ]
62
+
63
+ "tag": "if the user ask about the document that covers the key concepts of Open Data, the data lifecycle, and the responsibilities of the Open Data Manager?",
64
+ "responses": [
65
+ "Ce manuel est divisé en trois parties. La première partie présente les concepts clés de l’Open Data, la deuxième partie présente le cycle de vie de la donnée, et enfin la troisième partie présente les fonctions et activités du Responsable Open Data. Vous pouvez le telecharger ici : https://data.gov.ma/sites/default/files/docs/Open_data_manuel_ROD_Avril%202021.pdf",
66
+ ]
67
+
68
+ "tag": "if the user ask details about the procedures manual for Data Managers (DM) that covers the key concepts of Open Data, the data lifecycle, and the responsibilities of the Open Data Manager?",
69
+ "responses": [
70
+ "Ce document est un manuel à destination des Gestionnaires de Données (GdD) au sein des structures publiques. Vous pouvez le telecharger ici : https://data.gov.ma/sites/default/files/docs/Open_data_manuel_GgD%20_vf_Avril%202021.pdf",
71
+ ]
72
+
73
+ "tag": "if the user ask about more details about the awareness and training materials, workshops, and presentation slides regarding the key concepts of Open Data.",
74
+ "responses": [
75
+ "Bien sûr ! Nous avons organisé plusieurs ateliers et nous disposons de présentations que vous pouvez consulter. Vous pouvez trouver ces présentations dans ce lien dans la rubrique Supports de sensibilisation et formation : https://data.gov.ma/index.php/fr/documentations. Si vous avez des questions ou besoin de plus d'informations, n'hésitez pas à demander !",
76
+ ]
77
+
78
+
79
+
80
+ "tag": "if the user ask for the utility of the website or the service",
81
+ "responses": [
82
+ "Les donnees gouvernementales ouvertes, egalement connues sous le nom d'Open Government Data, sont des donnees accessibles a tous, librement utilisables, modifiables et partageables sans restrictions techniques ou legales. Elles sont publiees dans un format techniquement ouvert, tel que CSV ou TXT, permettant une utilisation facile par les programmes informatiques. De plus, elles sont accompagnees d'une licence ouverte qui autorise leur reutilisation a des fins commerciales et non commerciales, tout en preservant la provenance et l'accessibilite des informations."
83
+ ]
84
+
85
+
86
+ "tag": "if the user ask about how to use the website",
87
+ "responses": [
88
+ "Bienvenue sur data.gov.ma! Le site est organise en categories de donnees, une barre de recherche et des sections pour les dernieres mises a jour. Commencez par explorer les categories.",
89
+ ]
90
+
91
+
92
+ "tag": "if the user ask about the confidentiality of the data",
93
+ "responses": [
94
+ "Les informations à caractère personnel qui sont demandées à l’utilisateur via ce portail, sont nécessaires au traitement de sa demande. Les informations à caractère personnelles fournies, sont protégées conformément à la loi n°09-08 relative à la protection des personnes physiques à l'égard du traitement des données à caractère personnel."
95
+ ]
96
+
97
+
98
+ "tag": "if the user give a feedback",
99
+ "responses": [
100
+ "Votre avis est precieux pour nous! Vous pouvez soumettre vos commentaires ou suggestions via le formulaire de contact sur notre site."
101
+ ]
102
+
103
+
104
+ "tag": "if the user wanna download a dataset",
105
+ "responses": [
106
+ "Vous pouvez acceder et telecharger des jeux de donnees publiques directement depuis notre site. Utilisez la barre de recherche ou parcourez les categories pour trouver ce dont vous avez besoin."
107
+ ]
108
+
109
+
110
+ "tag": "if the user report a problem",
111
+ "responses": [
112
+ "Nous sommes desoles d'apprendre que vous rencontrez des problemes. Veuillez utiliser notre formulaire de contact pour signaler tout probleme ou erreur sur le site.",
113
+ ]
114
+
115
+
116
+ "tag": "if the user ask about the license of the data",
117
+ "responses": [
118
+ "Vous êtes libres de partager, de créer et d'adapter la base de données selon les conditions de la licence spécifiée. Cela signifie que vous pouvez copier, distribuer et utiliser la base de données, produire des créations à partir de celle-ci, et modifier, transformer et construire à partir de la base de données. Pour plus d'informations, veuillez consulter ce lein : https://data.gov.ma/fr/node/14"
119
+ ]
120
+
121
+
122
+ "tag": "if the user want to contribute",
123
+ "responses": [
124
+ "Votre enthousiasme a contribuer est tres apprecie! Vous pouvez participer en soumettant vos propres jeux de donnees via notre formulaire de soumission : https://data.gov.ma/node/add/feedback. N'oubliez pas de consulter les criteres de contribution.",
125
+ ]
126
+
127
+
128
+ "tag": "if the user ask about the update frequency",
129
+ "responses": [
130
+ "Nous nous engageons a maintenir nos donnees a jour. Les frequences de mise a jour peuvent varier selon les datasets. Verifiez la section 'derniere mise a jour' pour chaque jeu de donnees."
131
+ ]
132
+
133
+
134
+ "tag": "if the user reclame technical support",
135
+ "responses": [
136
+ "Si vous rencontrez des problemes techniques, n'hesitez pas a contacter notre support technique à travers les adresses de contact ici : https://data.gov.ma/fr/contact. Nous sommes la pour vous aider."
137
+ ]
138
+
139
+ "tag": "If the user asks for the terms of use and legal notices (include link).",
140
+ "responses": [
141
+ "Vous pouvez consulter nos conditions d'utilisation et mentions légales sur cette page : https://data.gov.ma/fr/node/13. Ces documents fournissent des informations importantes sur l'utilisation de nos services et les dispositions légales. Si vous avez des questions supplémentaires, n'hésitez pas à nous contacter."
142
+ ]
143
+
144
+
145
+
146
+ "tag": "if the user ask about the benefits of open data",
147
+ "responses": [
148
+ "L'Open Data vise a promouvoir la reutilisation des donnees publiques pour divers usages tels que repondre a des questions, prendre des decisions importantes, beneficier de services quotidiens, ou encourager la transparence des institutions. Le portail data.gov.ma est destine aux producteurs de donnees desireux de les publier de maniere ouverte, aux reutilisateurs souhaitant partager leurs travaux bases sur ces donnees, et a toute personne, association ou entreprise interessee par l'exploration et l'utilisation des donnees disponibles."
149
+ ]
150
+
151
+
152
+ "tag':"if the user ask about the producers or publisher of datasets in the website",
153
+ "responses": [ Les producteurs disponibles sont : ADD, Agence du Bassin Hydraulique de Souss Massa,
154
+ Agence Urbaine Safi - Youssoufia, ANRT, Archives du Maroc, Autorité de
155
+ Contrôle des Assurances et de la Prévoyance Sociale, Bank Al-Maghrib,
156
+ Centre Régional d'Investissement Drâa Tafilalet, Centre Régional
157
+ d'Investissement Souss Massa, Chambre de Commerce, d’Industrie et de
158
+ Services de la Région Marrakech – Safi (CCISRMS), CMR, CNOPS, CNSS,
159
+ Département de l'Agriculture, Département de la Pêche Maritime, Fondation
160
+ Nationale des Musées, HCP, IMANOR, INPPLC, MAECAMRE, MATNUHPV, MEF,
161
+ MENPS, MESRSI, MIC, MIEPEEC, Ministère de l'Equipement et de l'Eau, MJ,
162
+ MJCC, MSPS, MTAESS, MTNRA, Parlement, Poste Maroc, Région Béni MellalKhénifra, Région Souss Massa, Région Tanger-Tétouan-Al Hoceima, SOREAD
163
+ 2M]
164
+
165
+ "tag": "if the user ask about the different genres or themes inthe website",
166
+ "responses": [Les thèmes possibles sont: agriculture, assurance, cartographie, culture,
167
+ economie et finance, education, emploi, equipement, habitat et urbanisme,
168
+ it & télécoms, justice, média, normalisation, pêche maritime, recherche
169
+ et développement, santé, société, tourisme, transparence.]
key_extract (1).py ADDED
@@ -0,0 +1,23 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ from langchain.prompts.prompt import PromptTemplate
2
+ from langchain_community.llms import HuggingFaceEndpoint
3
+ from langchain.chains import LLMChain
4
+
5
+ llm = HuggingFaceEndpoint(
6
+ repo_id='mistralai/Mixtral-8x7B-Instruct-v0.1',
7
+ temperature = 0.2,
8
+ max_new_tokens = 10,
9
+ top_k = 30,
10
+ load_in_8bit = True,
11
+ )
12
+
13
+ template = """
14
+
15
+ Vous êtes un Système d'Extraction de Mots-Clés personnalisé pour une utilisation dans un environnement WhatsApp Business. Son rôle consiste à reconnaître et isoler les mots-clés cruciaux contenus dans les demandes des utilisateurs. Il est impératif de garantir que la sortie comporte exactement un mot français, sans aucun contexte supplémentaire ni texte explicatif. Cette conformité aux directives permettra une compatibilité avec les fonctions subséquentes, telles que la recherche de sites Web contenant des sources de données publiques à l'aide du mot-clé fourni.
16
+ Current conversation:
17
+ Human: {input}
18
+ AI Assistant:"""
19
+
20
+ prompt = PromptTemplate(input_variables=['input'], template = template)
21
+ chain = LLMChain(llm=llm, prompt=prompt)
22
+
23
+
qa_txt (2).py ADDED
@@ -0,0 +1,62 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ from langchain_community.document_loaders import TextLoader
2
+ from langchain.text_splitter import RecursiveCharacterTextSplitter
3
+ from langchain.chains import ConversationalRetrievalChain
4
+ from langchain_community.embeddings import HuggingFaceEmbeddings
5
+ from langchain_community.llms import HuggingFaceEndpoint
6
+ from langchain.prompts.prompt import PromptTemplate
7
+ from pathlib import Path
8
+ from unidecode import unidecode
9
+ import tqdm
10
+ from langchain.vectorstores import FAISS
11
+ import accelerate
12
+
13
+ def load_doc(file_path):
14
+ loader = TextLoader(file_path)
15
+ pages = loader.load()
16
+ text_splitter = RecursiveCharacterTextSplitter(chunk_size = 1212, chunk_overlap = 0)
17
+ doc_splits = text_splitter.split_documents(pages)
18
+ return doc_splits
19
+
20
+ splt = load_doc('intents_v2.txt')
21
+
22
+
23
+
24
+ llm = HuggingFaceEndpoint(
25
+ repo_id='mistralai/Mixtral-8x7B-Instruct-v0.1',
26
+ temperature = 0.2,
27
+ max_new_tokens = 512,
28
+ top_k = 30,
29
+ load_in_8bit = True,
30
+ )
31
+
32
+ def process_data():
33
+ splt = load_doc('/content/intents_v2.txt')
34
+ embeddings = HuggingFaceEmbeddings(model_name="sentence-transformers/paraphrase-multilingual-MiniLM-L12-v2")
35
+ db = FAISS.from_documents(splt, embeddings)
36
+ return db
37
+
38
+ db = process_data()
39
+
40
+
41
+ prompt = """Vous êtes un formateur de modèles GPT. Vous excellez dans l'affinement des modèles GPT, la lecture et l'analyse de documents ainsi que l'association de balises aux entrées utilisateur appropriées.
42
+
43
+ Mon contexte consiste en un document structuré comportant des balises et leurs réponses associées respectivement, servant de référence pour former un modèle GPT capable de produire des réponses pertinentes en fonction des entrées utilisateur.
44
+
45
+ Votre tâche consiste à former un modèle GPT pour associer les entrées utilisateur aux balises adéquates et renvoyer les réponses correspondantes figurant dans le document de référence.
46
+
47
+ Les étapes à suivre sont les suivantes : analyser le document et ses balises, entraîner le modèle GPT avec les exemples fournis, mapper les entrées utilisateur aux balises correspondantes et générer les réponses associées.
48
+
49
+ Les caractéristiques du résultat attendu consistent en des réponses cohérentes et exactement adaptées aux balises fournies dans le document de référence.
50
+
51
+ Si tout va bien, allez-y.
52
+ Human: {input}
53
+ AI Assistant:
54
+ """
55
+
56
+ # Set up a conversational chain to retrieve and generate responses.
57
+ conversation_chain = ConversationalRetrievalChain.from_llm(
58
+ llm=llm,
59
+ retriever=db.as_retriever(),
60
+ condense_question_prompt=PromptTemplate(input_variables=['input'], template=prompt),
61
+ )
62
+
requirements (4).txt ADDED
@@ -0,0 +1,10 @@
 
 
 
 
 
 
 
 
 
 
 
1
+ torch
2
+ transformers
3
+ sentence-transformers
4
+ langchain
5
+ tqdm
6
+ accelerate
7
+ pypdf
8
+ chromadb
9
+ unidecode
10
+ faiss-cpu