OutrageousOtter commited on
Commit
a8270a2
·
verified ·
1 Parent(s): 385982e

Update RAG_OpenAI.py

Browse files
Files changed (1) hide show
  1. RAG_OpenAI.py +96 -96
RAG_OpenAI.py CHANGED
@@ -1,96 +1,96 @@
1
- import os
2
- import numpy as np
3
- import fitz # PyMuPDF pour extraction PDF
4
- import faiss
5
- import openai
6
- from openai import OpenAI
7
- from sklearn.manifold import TSNE
8
- from llama_index.core import VectorStoreIndex, SimpleDirectoryReader
9
- from dotenv import load_dotenv
10
-
11
- # Charger les variables d'environnement
12
- load_dotenv()
13
- OPENAI_API_KEY = os.getenv('OPENAI_API_KEY')
14
-
15
- # 📌 Initialisation du client OpenAI
16
- client = OpenAI(api_key='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')
17
- model_embedding = "text-embedding-ada-002"
18
- model_chat = "gpt-4-turbo"
19
-
20
- # 📌 Paramètres de segmentation
21
- chunk_size = 256
22
- chunk_overlap = 10
23
-
24
- # 📌 Extraction et segmentation des PDF
25
- def extract_and_chunk_pdfs(pdf_folder):
26
- """Extrait et segmente les textes des PDF en chunks optimisés pour OpenAI."""
27
- documents = SimpleDirectoryReader(pdf_folder).load_data()
28
- chunked_docs = [doc.text for doc in documents]
29
- return chunked_docs
30
-
31
- # 📌 Génération des embeddings par batch
32
- def get_embeddings_in_batches(text_chunks, batch_size=5):
33
- """Génère les embeddings en batch pour éviter les dépassements de tokens."""
34
- embeddings = []
35
- for i in range(0, len(text_chunks), batch_size):
36
- batch = text_chunks[i:i + batch_size]
37
- response = client.embeddings.create(
38
- input=batch,
39
- model=model_embedding
40
- )
41
- batch_embeddings = [data.embedding for data in response.data]
42
- embeddings.extend(batch_embeddings)
43
-
44
- return np.array(embeddings).astype('float32')
45
-
46
- # 📌 Chargement et embedding des documents
47
- pdf_folder = 'C:/Users/MIPO10053340/OneDrive - Groupe Avril/Bureau/Salon_Agriculture_2024/Micka_API_Call/Docs_pdf/'
48
- chunked_docs = extract_and_chunk_pdfs(pdf_folder)
49
- embeddings = get_embeddings_in_batches(chunked_docs)
50
-
51
- # 📌 Indexation des embeddings avec FAISS
52
- dimension = embeddings.shape[1]
53
- index = faiss.IndexFlatL2(dimension)
54
- index.add(embeddings)
55
-
56
- # 📌 Récupération des chunks les plus pertinents
57
- def retrieve_relevant_chunks(question, k=5):
58
- """Recherche les chunks les plus pertinents en fonction de la similarité des embeddings."""
59
- response = client.embeddings.create(
60
- input=[question],
61
- model=model_embedding
62
- )
63
- question_embedding = np.array(response.data[0].embedding).astype('float32').reshape(1, -1)
64
- distances, indices = index.search(question_embedding, k)
65
- return [chunked_docs[i] for i in indices[0]]
66
-
67
- # 📌 Génération de réponse avec OpenAI
68
- def generate_response(context, question):
69
- """Génère une réponse basée sur le contexte extrait du corpus."""
70
- messages = [
71
- {"role": "system", "content": f"Voici des informations contextuelles : {context}"},
72
- {"role": "user", "content": question}
73
- ]
74
-
75
- response = client.chat.completions.create(
76
- model=model_chat,
77
- messages=messages
78
- )
79
- return response.choices[0].message.content
80
-
81
- # 📌 Exécuter une requête utilisateur
82
- user_question = "Quelles souches de poulet et poules se trouvent dans ce corpus de texte ?"
83
- relevant_chunks = retrieve_relevant_chunks(user_question)
84
- context = "\n".join(relevant_chunks)
85
- answer = generate_response(context, user_question)
86
-
87
- # 📊 Affichage de la réponse
88
- print("\n🔹 Réponse OpenAI :")
89
- print(answer)
90
-
91
- # 💾 Sauvegarde des résultats
92
- with open("openai_response.txt", "w", encoding="utf-8") as f:
93
- f.write(f"Question : {user_question}\n")
94
- f.write(f"Réponse :\n{answer}\n")
95
-
96
- print("\n✅ Réponse enregistrée dans 'openai_response.txt'")
 
1
+ import os
2
+ import numpy as np
3
+ import fitz # PyMuPDF pour extraction PDF
4
+ import faiss
5
+ import openai
6
+ from openai import OpenAI
7
+ from sklearn.manifold import TSNE
8
+ from llama_index.core import VectorStoreIndex, SimpleDirectoryReader
9
+ from dotenv import load_dotenv
10
+
11
+ # Charger les variables d'environnement
12
+ load_dotenv()
13
+ OPENAI_API_KEY = os.getenv('OPENAI_API_KEY')
14
+
15
+ # 📌 Initialisation du client OpenAI
16
+ client = OpenAI(api_key='') #todo : mettre la clé en secret et get avec os env
17
+ model_embedding = "text-embedding-ada-002"
18
+ model_chat = "gpt-4-turbo"
19
+
20
+ # 📌 Paramètres de segmentation
21
+ chunk_size = 256
22
+ chunk_overlap = 10
23
+
24
+ # 📌 Extraction et segmentation des PDF
25
+ def extract_and_chunk_pdfs(pdf_folder):
26
+ """Extrait et segmente les textes des PDF en chunks optimisés pour OpenAI."""
27
+ documents = SimpleDirectoryReader(pdf_folder).load_data()
28
+ chunked_docs = [doc.text for doc in documents]
29
+ return chunked_docs
30
+
31
+ # 📌 Génération des embeddings par batch
32
+ def get_embeddings_in_batches(text_chunks, batch_size=5):
33
+ """Génère les embeddings en batch pour éviter les dépassements de tokens."""
34
+ embeddings = []
35
+ for i in range(0, len(text_chunks), batch_size):
36
+ batch = text_chunks[i:i + batch_size]
37
+ response = client.embeddings.create(
38
+ input=batch,
39
+ model=model_embedding
40
+ )
41
+ batch_embeddings = [data.embedding for data in response.data]
42
+ embeddings.extend(batch_embeddings)
43
+
44
+ return np.array(embeddings).astype('float32')
45
+
46
+ # 📌 Chargement et embedding des documents
47
+ pdf_folder = 'C:/Users/MIPO10053340/OneDrive - Groupe Avril/Bureau/Salon_Agriculture_2024/Micka_API_Call/Docs_pdf/'
48
+ chunked_docs = extract_and_chunk_pdfs(pdf_folder)
49
+ embeddings = get_embeddings_in_batches(chunked_docs)
50
+
51
+ # 📌 Indexation des embeddings avec FAISS
52
+ dimension = embeddings.shape[1]
53
+ index = faiss.IndexFlatL2(dimension)
54
+ index.add(embeddings)
55
+
56
+ # 📌 Récupération des chunks les plus pertinents
57
+ def retrieve_relevant_chunks(question, k=5):
58
+ """Recherche les chunks les plus pertinents en fonction de la similarité des embeddings."""
59
+ response = client.embeddings.create(
60
+ input=[question],
61
+ model=model_embedding
62
+ )
63
+ question_embedding = np.array(response.data[0].embedding).astype('float32').reshape(1, -1)
64
+ distances, indices = index.search(question_embedding, k)
65
+ return [chunked_docs[i] for i in indices[0]]
66
+
67
+ # 📌 Génération de réponse avec OpenAI
68
+ def generate_response(context, question):
69
+ """Génère une réponse basée sur le contexte extrait du corpus."""
70
+ messages = [
71
+ {"role": "system", "content": f"Voici des informations contextuelles : {context}"},
72
+ {"role": "user", "content": question}
73
+ ]
74
+
75
+ response = client.chat.completions.create(
76
+ model=model_chat,
77
+ messages=messages
78
+ )
79
+ return response.choices[0].message.content
80
+
81
+ # 📌 Exécuter une requête utilisateur
82
+ user_question = "Quelles souches de poulet et poules se trouvent dans ce corpus de texte ?"
83
+ relevant_chunks = retrieve_relevant_chunks(user_question)
84
+ context = "\n".join(relevant_chunks)
85
+ answer = generate_response(context, user_question)
86
+
87
+ # 📊 Affichage de la réponse
88
+ print("\n🔹 Réponse OpenAI :")
89
+ print(answer)
90
+
91
+ # 💾 Sauvegarde des résultats
92
+ with open("openai_response.txt", "w", encoding="utf-8") as f:
93
+ f.write(f"Question : {user_question}\n")
94
+ f.write(f"Réponse :\n{answer}\n")
95
+
96
+ print("\n✅ Réponse enregistrée dans 'openai_response.txt'")