victorafarias commited on
Commit
f3be659
·
1 Parent(s): 952119b

evolução no processamento rag

Browse files
Files changed (1) hide show
  1. rag_processor.py +32 -43
rag_processor.py CHANGED
@@ -3,56 +3,45 @@
3
  import os
4
  from typing import List
5
  from langchain_community.document_loaders import PyPDFLoader, Docx2txtLoader, TextLoader
6
- from langchain.text_splitter import RecursiveCharacterTextSplitter
7
- from langchain_community.vectorstores import FAISS
8
- from langchain_community.embeddings import HuggingFaceEmbeddings
9
 
10
- embeddings_model = HuggingFaceEmbeddings(model_name="all-MiniLM-L6-v2")
11
-
12
- def get_relevant_context(file_paths: List[str], user_query: str) -> str:
13
  """
14
- Processa arquivos a partir de seus caminhos no disco, cria uma base de conhecimento
15
- e retorna os trechos mais relevantes para a consulta do usuário.
16
  """
17
- documents = []
18
 
19
- # 1. Carregar e Extrair Texto dos Arquivos a partir dos caminhos
20
  for file_path in file_paths:
21
  filename = os.path.basename(file_path)
22
-
23
- if filename.endswith(".pdf"):
24
- loader = PyPDFLoader(file_path)
25
- elif filename.endswith(".docx"):
26
- loader = Docx2txtLoader(file_path)
27
- elif filename.endswith(".txt"):
28
- loader = TextLoader(file_path, encoding='utf-8')
29
- else:
30
- continue
31
-
32
- documents.extend(loader.load())
33
-
34
- if not documents:
35
- return "Nenhum documento de referência foi fornecido ou os formatos não são suportados."
36
-
37
- # 2. Dividir o Texto em Chunks
38
- text_splitter = RecursiveCharacterTextSplitter(chunk_size=1000, chunk_overlap=200)
39
- texts = text_splitter.split_documents(documents)
40
-
41
- # 3. Criar a Base de Conhecimento Vetorial
42
- vector_store = FAISS.from_documents(texts, embeddings_model)
43
-
44
- # 4. Buscar os Chunks Mais Relevantes
45
- retriever = vector_store.as_retriever(search_kwargs={"k": 4})
46
- relevant_docs = retriever.invoke(user_query)
47
-
48
- # 5. Formatar e Retornar o Contexto
49
- context = "\n\n".join([doc.page_content for doc in relevant_docs])
50
-
51
- # Limpa os arquivos temporários após o uso
52
  for file_path in file_paths:
53
  try:
54
  os.remove(file_path)
55
  except OSError as e:
56
- print(f"Erro ao deletar o arquivo {file_path}: {e}")
57
-
58
- return context
 
 
 
 
 
3
  import os
4
  from typing import List
5
  from langchain_community.document_loaders import PyPDFLoader, Docx2txtLoader, TextLoader
 
 
 
6
 
7
+ def get_relevant_context(file_paths: List[str], user_query: str = None) -> str:
 
 
8
  """
9
+ Extrai o texto completo de todos os arquivos anexados e retorna como uma única string.
 
10
  """
11
+ all_contents: List[str] = []
12
 
 
13
  for file_path in file_paths:
14
  filename = os.path.basename(file_path)
15
+ try:
16
+ # Escolhe o loader adequado
17
+ if filename.lower().endswith(".pdf"):
18
+ loader = PyPDFLoader(file_path)
19
+ elif filename.lower().endswith(".docx"):
20
+ loader = Docx2txtLoader(file_path)
21
+ elif filename.lower().endswith(".txt"):
22
+ loader = TextLoader(file_path, encoding='utf-8')
23
+ else:
24
+ # ignora formatos não suportados
25
+ continue
26
+
27
+ # Carrega todos os documentos e concatena o conteúdo
28
+ docs = loader.load()
29
+ for doc in docs:
30
+ all_contents.append(doc.page_content)
31
+
32
+ except Exception as e:
33
+ # Log simples de erro de leitura, para você ver no console
34
+ print(f"[rag_processor] Erro ao carregar '{filename}': {e}", flush=True)
35
+
36
+ # Remove os arquivos temporários após a extração
 
 
 
 
 
 
 
 
37
  for file_path in file_paths:
38
  try:
39
  os.remove(file_path)
40
  except OSError as e:
41
+ print(f"[rag_processor] Erro ao deletar '{file_path}': {e}", flush=True)
42
+
43
+ if not all_contents:
44
+ return "Nenhum documento de referência foi fornecido ou os formatos não são suportados."
45
+
46
+ # Retorna todo o texto concatenado, separado por duas quebras de linha
47
+ return "\n\n".join(all_contents)