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
|
# Logs
|
||||||
*.log
|
*.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
|
evaluator: Optional[BaseEvaluator] = None
|
||||||
|
|
||||||
def reset(self) -> None:
|
def reset(self) -> None:
|
||||||
|
print("🗑️ Resetting the database...")
|
||||||
self.datastore.reset_table()
|
self.datastore.reset_table()
|
||||||
|
|
||||||
def add_documents(self, documents: List[str]) -> None:
|
|
||||||
items = self.indexer.index(documents)
|
|
||||||
self.datastore.add_items(items= items)
|
|
||||||
return
|
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:
|
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é.
|
"""Génère la réponse à la requête à partir du contexte récupéré.
|
||||||
Affiche éventuellement les sources.
|
Affiche éventuellement les sources.
|
||||||
@ -33,6 +51,7 @@ class RAGpipeline:
|
|||||||
Returns:
|
Returns:
|
||||||
str: Réponse générée
|
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)
|
context = self.retriever.search_retriever(query, top_k= top_k)
|
||||||
|
|
||||||
if( source):
|
if( source):
|
||||||
@ -40,10 +59,6 @@ class RAGpipeline:
|
|||||||
print(f"Based on the document {i+1}: {doc} \n")
|
print(f"Based on the document {i+1}: {doc} \n")
|
||||||
|
|
||||||
response = self.response_generator.generate_response(query= query, context= context)
|
response = self.response_generator.generate_response(query= query, context= context)
|
||||||
|
#print(f"Reponse: {response}")
|
||||||
return 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):
|
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.base_url = base_url
|
||||||
self.model_name = model_name
|
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:
|
def evaluate(self, query: str, response: str, expected_answer: str) -> EvaluationResult:
|
||||||
user_prompt = f"""
|
user_prompt = f"""
|
||||||
<questions> \n{query} </question>
|
<question> \n{query} </question>
|
||||||
<response> \n{response} </response>
|
<response> \n{response} </response>
|
||||||
<expected_answer> \n{expected_answer} </expected_answer>
|
<expected_answer> \n{expected_answer} </expected_answer>
|
||||||
"""
|
"""
|
||||||
|
|||||||
@ -2,7 +2,7 @@ from typing import List, Optional
|
|||||||
from ..interface.base_response_generator import BaseResponseGenerator
|
from ..interface.base_response_generator import BaseResponseGenerator
|
||||||
from groq import Groq
|
from groq import Groq
|
||||||
import os
|
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.
|
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):
|
class ResponseGenerator(BaseResponseGenerator):
|
||||||
|
|
||||||
def __init__(self, api_key: Optional[str] = None):
|
def __init__(self, api_key: Optional[str] = None):
|
||||||
try :
|
try :
|
||||||
|
load_dotenv()
|
||||||
self.api_key = api_key or os.getenv("GROQ_API_KEY")
|
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:
|
except Exception as e:
|
||||||
raise ValueError(f"erreur avec la clé API: {e}")
|
raise ValueError(f"erreur avec la clé API: {e}")
|
||||||
|
|
||||||
|
|||||||
@ -1,7 +1,7 @@
|
|||||||
from abc import ABC,abstractmethod
|
from abc import ABC,abstractmethod
|
||||||
from typing import List
|
from typing import List
|
||||||
from pydantic import BaseModel
|
from pydantic import BaseModel
|
||||||
|
from lancedb.table import Table
|
||||||
|
|
||||||
class DataItem(BaseModel):
|
class DataItem(BaseModel):
|
||||||
content: str = ""
|
content: str = ""
|
||||||
@ -9,6 +9,10 @@ class DataItem(BaseModel):
|
|||||||
|
|
||||||
class BaseDatastore(ABC):
|
class BaseDatastore(ABC):
|
||||||
|
|
||||||
|
@abstractmethod
|
||||||
|
def reset_table(self) -> Table:
|
||||||
|
pass
|
||||||
|
|
||||||
@abstractmethod
|
@abstractmethod
|
||||||
def add_items(self, items: List[DataItem]) -> None:
|
def add_items(self, items: List[DataItem]) -> None:
|
||||||
pass
|
pass
|
||||||
|
|||||||
Reference in New Issue
Block a user