Ajout du parser, pour appeler les fonctions, il faut maintenant entrer la fonction désirée (run, add, reset ou query avec l'argument approprié, prochaine étape: ajouter un README pour décrire le fonctionnement et un evaluator permettant de jauger le RAG.

This commit is contained in:
2025-11-12 16:55:35 +01:00
parent 647ffa7a84
commit 3fc4020316
13 changed files with 154 additions and 57 deletions

1
.gitignore vendored
View File

@ -20,3 +20,4 @@ venv/
# Logs
*.log
.env

63
create_parser.py Normal file
View File

@ -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

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

98
main.py

File diff suppressed because one or more lines are too long

View File

@ -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

View File

@ -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 <result>...</result> tags — either as 'true' or 'fal
def evaluate(self, query: str, response: str, expected_answer: str) -> EvaluationResult:
user_prompt = f"""
<questions> \n{query} </question>
<question> \n{query} </question>
<response> \n{response} </response>
<expected_answer> \n{expected_answer} </expected_answer>
"""

View File

@ -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}")

View File

@ -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