Spaces:
Sleeping
Sleeping
import os | |
import numpy as np | |
import fitz # PyMuPDF pour extraction PDF | |
import faiss | |
import openai | |
from sklearn.manifold import TSNE | |
from llama_index.core import VectorStoreIndex, SimpleDirectoryReader | |
from dotenv import load_dotenv | |
# Charger les variables d'environnement | |
load_dotenv() | |
OPENAI_API_KEY = os.getenv('OPENAI_API_KEY') | |
# 📌 Initialisation du client OpenAI | |
openai.api_key = OPENAI_API_KEY | |
model_embedding = "text-embedding-ada-002" | |
model_chat = "gpt-4-turbo" | |
# 📌 Paramètres de segmentation | |
chunk_size = 256 | |
chunk_overlap = 10 | |
# 📌 Extraction et segmentation des PDF | |
def extract_and_chunk_pdfs(pdf_folder): | |
"""Extrait et segmente les textes des PDF en chunks optimisés pour OpenAI.""" | |
documents = SimpleDirectoryReader(pdf_folder).load_data() | |
chunked_docs = [doc.text for doc in documents] | |
return chunked_docs | |
# 📌 Génération des embeddings par batch | |
def get_embeddings_in_batches(text_chunks, batch_size=5): | |
"""Génère les embeddings en batch pour éviter les dépassements de tokens.""" | |
embeddings = [] | |
for i in range(0, len(text_chunks), batch_size): | |
batch = text_chunks[i:i + batch_size] | |
response = openai.Embedding.create( | |
input=batch, | |
model=model_embedding | |
) | |
batch_embeddings = [data['embedding'] for data in response['data']] | |
embeddings.extend(batch_embeddings) | |
return np.array(embeddings).astype('float32') | |
# 📌 Chargement et embedding des documents | |
pdf_folder = 'C:/Users/MIPO10053340/OneDrive - Groupe Avril/Bureau/Salon_Agriculture_2024/Micka_API_Call/Docs_pdf/' | |
chunked_docs = extract_and_chunk_pdfs(pdf_folder) | |
embeddings = get_embeddings_in_batches(chunked_docs) | |
# 📌 Indexation des embeddings avec FAISS | |
dimension = embeddings.shape[1] | |
index = faiss.IndexFlatL2(dimension) | |
index.add(embeddings) | |
# 📌 Récupération des chunks les plus pertinents | |
def retrieve_relevant_chunks(question, k=5): | |
"""Recherche les chunks les plus pertinents en fonction de la similarité des embeddings.""" | |
response = openai.Embedding.create( | |
input=[question], | |
model=model_embedding | |
) | |
question_embedding = np.array(response['data'][0]['embedding']).astype('float32').reshape(1, -1) | |
distances, indices = index.search(question_embedding, k) | |
return [chunked_docs[i] for i in indices[0]] | |
# 📌 Génération de réponse avec OpenAI | |
def generate_response(context, question): | |
"""Génère une réponse basée sur le contexte extrait du corpus.""" | |
messages = [ | |
{"role": "system", "content": f"Voici des informations contextuelles : {context}"}, | |
{"role": "user", "content": question} | |
] | |
response = openai.ChatCompletion.create( | |
model=model_chat, | |
messages=messages | |
) | |
return response["choices"][0]["message"]["content"] | |
# 📌 Exécuter une requête utilisateur | |
user_question = "Quelles souches de poulet et poules se trouvent dans ce corpus de texte ?" | |
relevant_chunks = retrieve_relevant_chunks(user_question) | |
context = "\n".join(relevant_chunks) | |
answer = generate_response(context, user_question) | |
# 📊 Affichage de la réponse | |
print("\n🔹 Réponse OpenAI :") | |
print(answer) | |
# 💾 Sauvegarde des résultats | |
with open("openai_response.txt", "w", encoding="utf-8") as f: | |
f.write(f"Question : {user_question}\n") | |
f.write(f"Réponse :\n{answer}\n") | |
print("\n✅ Réponse enregistrée dans 'openai_response.txt'") | |