cdupland commited on
Commit
a4aa0ab
·
1 Parent(s): 5a01379

Mise en place de LlamaParce pour l'extraction des informations des documents.

Browse files
README.md CHANGED
@@ -37,6 +37,8 @@ L'application est structurée en trois parties principales :
37
 
38
  - **Documents Communs** :
39
  Cette section permet de déposer des documents accessibles à tous les utilisateurs de l'application. Ces documents sont vectorisés et stockés dans une base de données vectorielle (voir section dédiée). Ils seront explorés lors des interactions avec l'IA.
 
 
40
 
41
  - **Vos Documents** :
42
  Chaque utilisateur peut uploader ses propres documents, qui seront pris en compte pendant sa session. Ces documents sont temporaires et ne sont accessibles que durant la session active de l'utilisateur.
 
37
 
38
  - **Documents Communs** :
39
  Cette section permet de déposer des documents accessibles à tous les utilisateurs de l'application. Ces documents sont vectorisés et stockés dans une base de données vectorielle (voir section dédiée). Ils seront explorés lors des interactions avec l'IA.
40
+ L'extraction des éléments (textes, tableaux, etc) se fait via la librairie LlamaParse, qui nécessite une clé API pour Llama Cloud.
41
+ Celle-ci doit être renseignée dans lma variable d'environmment **LLAMA_CLOUD_API_KEY**
42
 
43
  - **Vos Documents** :
44
  Chaque utilisateur peut uploader ses propres documents, qui seront pris en compte pendant sa session. Ces documents sont temporaires et ne sont accessibles que durant la session active de l'utilisateur.
pages/persistent_documents.py CHANGED
@@ -5,13 +5,20 @@ import streamlit as st
5
  def uploadToDb():
6
 
7
  for file in st.session_state["file_uploader_commun"]:
8
- with tempfile.NamedTemporaryFile(delete=False) as tf:
9
- tf.write(file.getbuffer())
10
- file_path = tf.name
 
 
 
 
 
 
11
 
12
  with st.session_state["ingestion_spinner"], st.spinner(f"Chargement {file.name}"):
13
- st.session_state["assistant"].ingestToDb(file_path, filename=file.name)
14
- os.remove(file_path)
 
15
 
16
  def page():
17
  st.subheader("Montez des documents communs")
 
5
  def uploadToDb():
6
 
7
  for file in st.session_state["file_uploader_commun"]:
8
+
9
+ # Récupération de l'extension du fichier original
10
+ original_filename = file.name
11
+ file_extension = os.path.splitext(original_filename)[1]
12
+
13
+ # Créer un fichier temporaire avec la bonne extension
14
+ with tempfile.NamedTemporaryFile(delete=False, suffix=file_extension) as temp_file:
15
+ temp_file.write(file.read())
16
+ temp_file_path = temp_file.name
17
 
18
  with st.session_state["ingestion_spinner"], st.spinner(f"Chargement {file.name}"):
19
+ st.session_state["assistant"].ingestToDb(temp_file_path, filename=file.name)
20
+
21
+ os.remove(temp_file_path)
22
 
23
  def page():
24
  st.subheader("Montez des documents communs")
rag.py CHANGED
@@ -13,7 +13,7 @@ from langchain_community.vectorstores.utils import filter_complex_metadata
13
  from langchain_community.document_loaders.csv_loader import CSVLoader
14
 
15
  from util import getYamlConfig
16
-
17
 
18
  # load .env in local dev
19
  load_dotenv()
@@ -46,17 +46,21 @@ class Rag:
46
 
47
  def ingestToDb(self, file_path: str, filename: str):
48
 
49
- docs = PyPDFLoader(file_path=file_path).load()
 
50
 
51
- # Extract all text from the document
52
- text = ""
53
- for page in docs:
54
- text += page.page_content
 
 
 
 
 
55
 
56
- # Split the text into chunks
57
- chunks = self.text_splitter.split_text(text)
58
 
59
- return self.vector_store.addDoc(filename=filename, text_chunks=chunks, embedding=self.embedding)
60
 
61
  def getDbFiles(self):
62
  return self.vector_store.getDocs()
 
13
  from langchain_community.document_loaders.csv_loader import CSVLoader
14
 
15
  from util import getYamlConfig
16
+ from llama_parse import LlamaParse
17
 
18
  # load .env in local dev
19
  load_dotenv()
 
46
 
47
  def ingestToDb(self, file_path: str, filename: str):
48
 
49
+ load_dotenv()
50
+ api_key = os.environ.get("LLAMA_CLOUD_API_KEY")
51
 
52
+ documents = LlamaParse(
53
+ api_key=api_key,
54
+ result_type="markdown",
55
+ premium_mode=True,
56
+ ).load_data(file_path)
57
+
58
+ contents = ""
59
+ for doc in documents:
60
+ contents += doc.text
61
 
 
 
62
 
63
+ return self.vector_store.addDoc(filename=filename, text_chunks=contents, embedding=self.embedding)
64
 
65
  def getDbFiles(self):
66
  return self.vector_store.getDocs()
requirements.txt CHANGED
@@ -19,4 +19,11 @@ langchain_mistralai
19
  langchain_anthropic
20
  llamaapi
21
  pyyaml
22
- st_copy_to_clipboard
 
 
 
 
 
 
 
 
19
  langchain_anthropic
20
  llamaapi
21
  pyyaml
22
+ st_copy_to_clipboard
23
+
24
+ llama-index
25
+ llama-index-core
26
+ llama-index-embeddings-openai
27
+ llama-index-postprocessor-flag-embedding-reranker
28
+ git+https://github.com/FlagOpen/FlagEmbedding.git
29
+ llama-parse
vectore_store/PineconeConnector.py CHANGED
@@ -10,6 +10,8 @@ from langchain_core.documents import Document
10
 
11
  import unicodedata
12
  import time
 
 
13
 
14
  class PineconeConnector(ConnectorStrategy):
15
  def __init__(self):
@@ -57,26 +59,18 @@ class PineconeConnector(ConnectorStrategy):
57
  vector_store = PineconeVectorStore(index=self.index, embedding=embedding, namespace=self.namespace)
58
 
59
  file_name = filename.split(".")[0].replace(" ","_").replace("-","_").replace(".","_").replace("/","_").replace("\\","_").strip()
60
-
61
- documents = []
62
- uuids = []
63
-
64
- for i, chunk in enumerate(text_chunks):
65
- clean_filename = remove_non_standard_ascii(file_name)
66
- uuid = f"{clean_filename}_{i}"
67
-
68
- document = Document(
69
- page_content=chunk,
70
- metadata={ "filename":filename, "chunk_id":uuid },
71
- )
72
-
73
- uuids.append(uuid)
74
- documents.append(document)
75
 
 
 
 
 
76
 
77
- vector_store.add_documents(documents=documents, ids=uuids)
 
 
78
 
79
- return {"filename_id":clean_filename}
80
 
81
  except Exception as e:
82
  print(e)
 
10
 
11
  import unicodedata
12
  import time
13
+ from datetime import datetime
14
+ import uuid
15
 
16
  class PineconeConnector(ConnectorStrategy):
17
  def __init__(self):
 
59
  vector_store = PineconeVectorStore(index=self.index, embedding=embedding, namespace=self.namespace)
60
 
61
  file_name = filename.split(".")[0].replace(" ","_").replace("-","_").replace(".","_").replace("/","_").replace("\\","_").strip()
62
+ file_name = remove_non_standard_ascii(file_name)
 
 
 
 
 
 
 
 
 
 
 
 
 
 
63
 
64
+ document = Document(
65
+ page_content=text_chunks,
66
+ metadata={ "filename":filename },
67
+ )
68
 
69
+ id = f"{file_name}_{ uuid.uuid5(uuid.NAMESPACE_DNS, str(datetime.now())) }"
70
+
71
+ vector_store.add_documents(documents=[document], ids=[id])
72
 
73
+ return {"filename_id":file_name}
74
 
75
  except Exception as e:
76
  print(e)