|
|
|
from pathlib import Path |
|
import ollama |
|
import faiss |
|
import numpy as np |
|
import os |
|
import glob |
|
import pickle |
|
|
|
|
|
|
|
|
|
def inicializar_rag(): |
|
""" |
|
Inicializa o modelo de embeddings, documentos e índice FAISS a partir dos arquivos de capítulo. |
|
Adaptado para retornar apenas documentos e índice FAISS, sem partes do Gradio. |
|
""" |
|
|
|
|
|
base_dir = Path(__file__).resolve().parent |
|
diretorio_rag = base_dir / "RAG" |
|
|
|
print(f">>> Looking for files under: {diretorio_rag}") |
|
|
|
if not diretorio_rag.exists(): |
|
raise FileNotFoundError( |
|
f"O diretório {diretorio_rag} não existe. Verifique se ele foi copiado corretamente para o container." |
|
) |
|
|
|
|
|
arquivos = list(diretorio_rag.glob("[bsde][1-9].txt")) |
|
caminhos_arquivos = [str(arquivo) for arquivo in arquivos] |
|
|
|
documentos = [] |
|
|
|
for caminho in caminhos_arquivos: |
|
with open(caminho, "r", encoding="utf-8") as f: |
|
conteudo = f.read().split("\n\n") |
|
documentos.extend(conteudo) |
|
|
|
if not documentos: |
|
raise ValueError("Nenhum documento foi carregado. Verifique os caminhos dos arquivos.") |
|
|
|
print(f"Trabalhando em {len(documentos)} documentos ...") |
|
|
|
embeddings = [] |
|
for index, doc in enumerate(documentos): |
|
if index % 200 == 0: |
|
print(f"= = = {index} Embeddings... = = = doc: {doc[:20]}") |
|
|
|
try: |
|
response = ollama.embed(model="nomic-embed-text", input=doc) |
|
embeddings.append(response["embeddings"][0]) |
|
except Exception as e: |
|
print(f"Error generating embedding for document {index}: {e}") |
|
|
|
embeddings.append(None) |
|
continue |
|
|
|
|
|
embeddings_valid = [emb for emb in embeddings if emb is not None] |
|
documentos_valid = [doc for i, doc in enumerate(documentos) if embeddings[i] is not None] |
|
|
|
if not embeddings_valid: |
|
raise ValueError("No valid embeddings were generated.") |
|
print(f"Trabalhando em {len(embeddings_valid)} embeddings...") |
|
embeddings_np = np.array(embeddings_valid, dtype=np.float32) |
|
|
|
|
|
dimension = embeddings_np.shape[1] |
|
faiss_index = faiss.IndexFlatL2(dimension) |
|
faiss_index.add(embeddings_np) |
|
|
|
return documentos_valid, faiss_index |
|
|
|
|
|
if __name__ == "__main__": |
|
print("Inicializando RAG localmente...") |
|
|
|
|
|
|
|
|
|
|
|
|
|
documentos_global, index_global = inicializar_rag() |
|
|
|
print(f"Total de documentos processados: {len(documentos_global)}") |
|
print(f"Dimensão do índice FAISS: {index_global.d}, Total de vetores: {index_global.ntotal}") |
|
|
|
|
|
with open("documentos.pkl", "wb") as f_docs: |
|
pickle.dump(documentos_global, f_docs) |
|
print("Lista de documentos salva em documentos.pkl") |
|
|
|
|
|
faiss.write_index(index_global, "faiss_index.idx") |
|
print("Índice FAISS salvo em faiss_index.idx") |
|
|