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:
1
.gitignore
vendored
1
.gitignore
vendored
@ -20,3 +20,4 @@ venv/
|
||||
|
||||
# Logs
|
||||
*.log
|
||||
.env
|
||||
|
||||
63
create_parser.py
Normal file
63
create_parser.py
Normal 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.
Binary file not shown.
@ -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
|
||||
@ -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>
|
||||
"""
|
||||
|
||||
@ -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}")
|
||||
|
||||
|
||||
@ -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
|
||||
|
||||
Reference in New Issue
Block a user