From 3fc4020316f783261ec4ba7c7ff0b7d4a637e7c1 Mon Sep 17 00:00:00 2001 From: Matthieu Date: Wed, 12 Nov 2025 16:55:35 +0100 Subject: [PATCH] =?UTF-8?q?Ajout=20du=20parser,=20pour=20appeler=20les=20f?= =?UTF-8?q?onctions,=20il=20faut=20maintenant=20entrer=20la=20fonction=20d?= =?UTF-8?q?=C3=A9sir=C3=A9e=20(run,=20add,=20reset=20ou=20query=20avec=20l?= =?UTF-8?q?'argument=20appropri=C3=A9,=20prochaine=20=C3=A9tape:=20ajouter?= =?UTF-8?q?=20un=20README=20pour=20d=C3=A9crire=20le=20fonctionnement=20et?= =?UTF-8?q?=20un=20evaluator=20permettant=20de=20jauger=20le=20RAG.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 1 + create_parser.py | 63 +++++++++++ data/source/bilan_comptable_2024.pdf | Bin 17782 -> 0 bytes data/source/database.pdf | Bin 48541 -> 0 bytes data/source/employes.pdf | Bin 17398 -> 0 bytes data/source/fournisseurs.pdf | Bin 16217 -> 0 bytes data/source/historique_commandes.pdf | Bin 19172 -> 0 bytes data/source/planning_production_mars_2025.pdf | Bin 16817 -> 0 bytes main.py | 98 ++++++++++-------- src/RAG_pipeline.py | 33 ++++-- src/impl/evaluator.py | 4 +- src/impl/response_generator.py | 6 +- src/interface/base_datastore.py | 6 +- 13 files changed, 154 insertions(+), 57 deletions(-) create mode 100644 create_parser.py delete mode 100644 data/source/bilan_comptable_2024.pdf delete mode 100644 data/source/database.pdf delete mode 100644 data/source/employes.pdf delete mode 100644 data/source/fournisseurs.pdf delete mode 100644 data/source/historique_commandes.pdf delete mode 100644 data/source/planning_production_mars_2025.pdf diff --git a/.gitignore b/.gitignore index f64ffe5..391c593 100644 --- a/.gitignore +++ b/.gitignore @@ -20,3 +20,4 @@ venv/ # Logs *.log +.env diff --git a/create_parser.py b/create_parser.py new file mode 100644 index 0000000..0e2cd5c --- /dev/null +++ b/create_parser.py @@ -0,0 +1,63 @@ +import argparse + +def create_parser(): + parser = argparse.ArgumentParser( + description="RAG pipeline CLI" + ) + + path_arg_parent = argparse.ArgumentParser(add_help=False) + path_arg_parent.add_argument( + "-p", + "--path", + type=str, + required=False, + help="Path to a directory containing documents to index.", + ) + + eval_file_arg_parent = argparse.ArgumentParser(add_help=False) + eval_file_arg_parent.add_argument( + "-f", + "--eval_file", + type=str, + required=False, + help="Path to a .json file with question/expected_answer pairs.", + ) + + + subparsers = parser.add_subparsers(dest="commands", help="Enter a command", required=True) + + subparsers.add_parser( + "run", + help="Run the full pipeline, i.e Reset, add and evaluate", + parents=[path_arg_parent, eval_file_arg_parent] + ) + + subparsers.add_parser( + "reset", + help="Reset the pipeline" + ) + + subparsers.add_parser( + "add", + help="Add the documents to the databaser", + parents=[path_arg_parent] + ) + + subparsers.add_parser( + "evaluate", + help="Evaluate the model", + parents=[eval_file_arg_parent] + ) + + query_parser = subparsers.add_parser( + "query", + help="Query the documents" + ) + + query_parser.add_argument( + "prompt", + type=str, + help="Enter the query" + ) + + return parser \ No newline at end of file diff --git a/data/source/bilan_comptable_2024.pdf b/data/source/bilan_comptable_2024.pdf deleted file mode 100644 index 9ae35aed8880c30fd19b31ff51b8dd5bc7e77c2e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 17782 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 e?*FP18(VE_TLm=P+^QS5{>?;0Mn=qd@*QK& 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 diff --git a/data/source/employes.pdf b/data/source/employes.pdf deleted file mode 100644 index fa0f565f7f1736774b47d3517ef89b366c935a34..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 17398 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 diff --git a/data/source/fournisseurs.pdf b/data/source/fournisseurs.pdf deleted file mode 100644 index 3ae5f1a8bc799ca1742d0937ee3545a5ba6f1053..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 16217 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 ST@W)n69YUMnXrrq{Qm*e;gOC2 diff --git a/data/source/historique_commandes.pdf b/data/source/historique_commandes.pdf deleted file mode 100644 index 6544f7e964d555138612b44bb7a0c22f31242876..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 19172 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 diff --git a/data/source/planning_production_mars_2025.pdf b/data/source/planning_production_mars_2025.pdf deleted file mode 100644 index 18ca74ce231c176dab82819dcd8aac5b38178100..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 16817 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 H3jMzT2otD$ diff --git a/main.py b/main.py index 5e0e420..9a228f9 100644 --- a/main.py +++ b/main.py @@ -1,49 +1,61 @@ +import os +import glob +from typing import List + from src.impl.datastore import Datastore, DataItem from src.impl.indexer import Indexer from src.impl.retriever import Retriever from src.impl.response_generator import ResponseGenerator -TEST_PATH = "data/source" + +from src.RAG_pipeline import RAGpipeline +from create_parser import create_parser + +DEFAULT_SOURCE_PATH = "data/source/" +DEFAULT_EVAL_PATH ="" + +def create_pipeline() -> RAGpipeline: + indexer = Indexer() + datastore = Datastore() + retriever = Retriever(datastore= datastore) + response_generator = ResponseGenerator() + return RAGpipeline(indexer = indexer, datastore = datastore, retriever= retriever, response_generator= response_generator) + def main(): - query_graphiste = "Quel est le salaire brut mensuel du graphiste ?" - query_graphiste_en = "What is the monthly gross salary of the graphist designer ?" - query_tshirt = "Quel est le prix du Tshirt rouge avec le motif1 ?" - print("Testing indexer") - indexer = Indexer() - items_from_indexer = indexer.index(["data/source/informations_entreprise.pdf", - "data/source/bilan_comptable_2024.csv", - "data/source/employes.csv", - "data/source/facture_14_03_2025.pdf", - "data/source/fournisseurs.csv", - "data/source/historique_commandes.csv", - "data/source/planning_production_mars_2025.csv", - "data/source/stock_tshirt.csv" - ]) + + parser = create_parser() + args = parser.parse_args() + pipeline = create_pipeline() + + source_path = getattr(args, "path", DEFAULT_SOURCE_PATH) or DEFAULT_SOURCE_PATH + documents_path = get_files_in_directory(source_path=source_path) + + #eval_path = args.eval_file if args.eval_file else DEFAULT_EVAL_PATH + #sample_questions = json.load(open(eval_path, "r")) + + commands = { + "run": lambda: pipeline.run(documents_path = documents_path), + "reset": lambda: pipeline.reset(), + "add": lambda: pipeline.add_documents(documents_path=documents_path), + "evaluate": lambda: pipeline.evaluate(), + "query": lambda: print(pipeline.process_query(args.prompt)), + } + + try: + commands[args.commands]() + except Exception as e: + print(f"❌ ERREUR: {e}") + import traceback + traceback.print_exc() + + commands[args.commands] + + return + +def get_files_in_directory(source_path: str) -> List[str]: + if os.path.isfile(source_path): + return [source_path] + return glob.glob(os.path.join(source_path, "*")) - - print("Testing datastore") - datastore = Datastore() - print(f"Model's maximum sequence length:{datastore.model.max_seq_length}") - test_vector = datastore.create_vector("test") - - data_item_to_test = DataItem( - content = "Data item being tested", - source = "from a test" - ) - - datastore.add_items([data_item_to_test]) - - datastore.add_items(items_from_indexer) - print(datastore.search_datastore(("Data item being tested"))) - print(datastore.search_datastore("Red t-shirt")) - - print("Testing retriever") - retriever = Retriever(datastore= datastore) - #print(retriever.search_retriever(query_graphiste)) - - print("Testing Response generator") - response_generator = ResponseGenerator() - print(response_generator.generate_response(query_graphiste, retriever.search_retriever(query_graphiste))) - print("fin") - exit - -main() \ No newline at end of file +if __name__ == "__main__": + main() + \ No newline at end of file diff --git a/src/RAG_pipeline.py b/src/RAG_pipeline.py index 5bee608..50f6ed0 100644 --- a/src/RAG_pipeline.py +++ b/src/RAG_pipeline.py @@ -16,13 +16,31 @@ class RAGpipeline: evaluator: Optional[BaseEvaluator] = None def reset(self) -> None: + print("đŸ—‘ïž Resetting the database...") self.datastore.reset_table() - - def add_documents(self, documents: List[str]) -> None: - items = self.indexer.index(documents) - self.datastore.add_items(items= items) return + def add_documents(self, documents_path : List[str]) -> None: + items = self.indexer.index(documents_path) + #print(f"🔍 Adding documents: {', '.join(docu)}") + self.datastore.add_items(items= items) + + return + + def evaluate(self, arg1 = None) -> None: + """A complĂ©ter lors de l'ajout de l'Ă©valuateur + """ + print("Function not completed.") + return + + def run(self, documents_path: List[str], arg2 = None) -> None: + self.reset() + self.add_documents(documents_path =documents_path) + if arg2 : + self.evaluate(arg2) + return + + def process_query(self, query: str, top_k: int = 5, source: bool = False) -> str: """GĂ©nĂšre la rĂ©ponse Ă  la requĂȘte Ă  partir du contexte rĂ©cupĂ©rĂ©. Affiche Ă©ventuellement les sources. @@ -33,6 +51,7 @@ class RAGpipeline: Returns: str: RĂ©ponse gĂ©nĂ©rĂ©e """ + print(f"[DEBUG] Traitement de la requĂȘte: {query}") context = self.retriever.search_retriever(query, top_k= top_k) if( source): @@ -40,10 +59,6 @@ class RAGpipeline: print(f"Based on the document {i+1}: {doc} \n") response = self.response_generator.generate_response(query= query, context= context) + #print(f"Reponse: {response}") return response - def evaluate(self) -> None: - """A complĂ©ter lors de l'ajout de l'Ă©valuateur - """ - print("Function not completed.") - pass \ No newline at end of file diff --git a/src/impl/evaluator.py b/src/impl/evaluator.py index f17bea4..a5271ee 100644 --- a/src/impl/evaluator.py +++ b/src/impl/evaluator.py @@ -3,7 +3,7 @@ import requests class Evaluator(BaseEvaluator): - def __init__(self, model_name: str = "llama3.2:3b", base_url: str = "http://localhost:11434"): + def __init__(self, model_name: str = "llama3.2:8b", base_url: str = "http://localhost:11434"): self.base_url = base_url self.model_name = model_name @@ -23,7 +23,7 @@ Then return the result in ... tags — either as 'true' or 'fal def evaluate(self, query: str, response: str, expected_answer: str) -> EvaluationResult: user_prompt = f""" - \n{query} + \n{query} \n{response} \n{expected_answer} """ diff --git a/src/impl/response_generator.py b/src/impl/response_generator.py index 7b6ce97..65cc7cc 100644 --- a/src/impl/response_generator.py +++ b/src/impl/response_generator.py @@ -2,7 +2,7 @@ from typing import List, Optional from ..interface.base_response_generator import BaseResponseGenerator from groq import Groq import os - +from dotenv import load_dotenv SYSTEM_PROMPT = """Tu es un assistant intelligent qui rĂ©pond aux questions en te basant sur le contexte fourni. @@ -17,8 +17,10 @@ RĂšgles importantes: class ResponseGenerator(BaseResponseGenerator): def __init__(self, api_key: Optional[str] = None): - try : + try : + load_dotenv() self.api_key = api_key or os.getenv("GROQ_API_KEY") + print("ClĂ© API rĂ©cupĂ©rĂ©e avec succĂšs \n") except Exception as e: raise ValueError(f"erreur avec la clĂ© API: {e}") diff --git a/src/interface/base_datastore.py b/src/interface/base_datastore.py index be6bd86..32b808b 100644 --- a/src/interface/base_datastore.py +++ b/src/interface/base_datastore.py @@ -1,7 +1,7 @@ from abc import ABC,abstractmethod from typing import List from pydantic import BaseModel - +from lancedb.table import Table class DataItem(BaseModel): content: str = "" @@ -9,6 +9,10 @@ class DataItem(BaseModel): class BaseDatastore(ABC): + @abstractmethod + def reset_table(self) -> Table: + pass + @abstractmethod def add_items(self, items: List[DataItem]) -> None: pass