Spaces:
Sleeping
Sleeping
Update RAG_OpenAI.py
Browse files- 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='
|
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'")
|