From 33f54e8e30184b567a34d9d4aba5e8d7f3529c02 Mon Sep 17 00:00:00 2001 From: LJ5O <75009579+LJ5O@users.noreply.github.com> Date: Thu, 5 Feb 2026 11:54:40 +0100 Subject: [PATCH] =?UTF-8?q?Documents=20charg=C3=A9s=20dans=20Chroma?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 1 + RAG/init.py | 51 +++++++++++++++++++++++++++++++++++++++++++++++++++ readme.md | 22 +++++++++++++++++++++- 3 files changed, 73 insertions(+), 1 deletion(-) create mode 100644 RAG/init.py diff --git a/.gitignore b/.gitignore index 25bea00..e6f64b5 100644 --- a/.gitignore +++ b/.gitignore @@ -4,6 +4,7 @@ mlflow.db # Par sécurité documents_projet/ +chroma_db/ # Python __pycache__/ \ No newline at end of file diff --git a/RAG/init.py b/RAG/init.py new file mode 100644 index 0000000..a328e71 --- /dev/null +++ b/RAG/init.py @@ -0,0 +1,51 @@ +# Ce fichier vise à préparer les documents dans le RAG. +# Une fois lancé, une base de données vectorielle locale sera générée + +from pathlib import Path +from langchain_community.document_loaders import DirectoryLoader, TextLoader # Charge les docs +from langchain_text_splitters import RecursiveCharacterTextSplitter # Divise le texte en chunks +from langchain_huggingface import HuggingFaceEmbeddings # Tokénize le texte +from langchain_chroma import Chroma # BDD, serait PG vector en prod' + +print("=== GENERATION DE LA BDD LOCALE ===") + +base_dir = Path(__file__).resolve().parent.parent # Dossier parent, où sont les données + +# Chargement de tous les documents txt du dossier docs/ +try: + loader = DirectoryLoader( + path= base_dir.as_posix() + "/documents_projet/", + glob="**/*.txt", + loader_cls=TextLoader, + show_progress=True) + docs = loader.load() + +except FileNotFoundError: + print("ERREUR: Le dossier \"documents_projet\" n'est pas présent ! Il faut l'ajouter à la racine du projet avant de lancer ce script.") + import sys + sys.exit(1) # J'arrête ici + + +print(f"Documents chargés: {len(docs)}") + +# Maintenant que j'ai chargé les documents, je vais les découper en chunks +# (taille d'un chunk = 500 caractères, chevauchement = 100 caractères) +text_splitter = RecursiveCharacterTextSplitter(chunk_size=1000/2, chunk_overlap=200/2) +chunks = text_splitter.split_documents(docs) # Découpage des documents + +print(f"Ces documents ont été divisés en {len(chunks)} chunks de texte.") +print("Exemple de chunk : ") +print("===") +print(chunks[-1]) +print("===") + + +# Création du modèle d'embeddings +# https://docs.langchain.com/oss/python/integrations/text_embedding/huggingfacehub +# https://huggingface.co/jinaai/jina-clip-v2 +embeddings = HuggingFaceEmbeddings(model_name="jinaai/jina-embeddings-v3", model_kwargs={"trust_remote_code": True}) + +# Stockage des embeddings dans ChromaDB dans un dossier local "chroma_db" +vectorstore = Chroma.from_documents(documents=chunks,embedding=embeddings, persist_directory=base_dir.as_posix()+"/chroma_db/",) # https://docs.langchain.com/oss/python/integrations/vectorstores/chroma + +print(f"Documents chargés et base de données créée à {base_dir.as_posix()+"/chroma_db/"} !") \ No newline at end of file diff --git a/readme.md b/readme.md index 5f8a351..be0e0cb 100644 --- a/readme.md +++ b/readme.md @@ -3,4 +3,24 @@ **Les documents liés au projet ne sont pas inclus dans ce repo, il faut les ajouter à la racine dans "documents_projet/" !** ## Workflow -![image](imgs/workflow.png) \ No newline at end of file +![image](imgs/workflow.png) + +## Mise en place + +La première étape est d'installer le `venv` Python: +``` +python -m venv .venv +source .venv/bin/activate +pip install -r requirements.txt +``` + +Puis de définir les variables d'env de l'agent +``` +cp AgentReact/.env.template AgentReact/.env +nano AgentReact/.env +``` + +Une fois le dossier **documents_projet** ajouté à la racine, il est possible de générer la base de données vectorielle +``` +python RAG/init.py +```