Intermédiaire
🧠 Fondamentaux
20 XP
0 personnes ont réussi
Creer une base vectorielle ChromaDB
Tu as tes chunks. Maintenant il faut pouvoir retrouver les bons quand l'utilisateur pose une question. La recherche par mots-cles (comme un Ctrl+F) ne suffit pas : si l'utilisateur demande "comment prendre des vacances" et que le document dit "procedure de conge", une recherche textuelle ne trouvera rien.
C'est la que les embeddings entrent en jeu. Un embedding, c'est une representation numerique d'un texte. Deux textes qui parlent du meme sujet auront des embeddings proches, meme s'ils utilisent des mots differents. "vacances" et "conge" seront proches dans l'espace vectoriel.
ChromaDB est une base de donnees vectorielle simple et locale. Parfaite pour un projet comme le tien. Elle stocke tes chunks avec leurs embeddings et te permet de chercher par similarite.
ChromaDB genere automatiquement les embeddings avec un petit modele local (all-MiniLM-L6-v2). Pas besoin de cle API pour ca.
Ecris une fonction creer_collection(nom, chunks) qui prend un nom de collection et une liste de chunks (au format de l'exercice precedent : dicts avec "texte", "source", "index"). Elle doit creer une collection ChromaDB, y ajouter tous les chunks, et renvoyer la collection.
Pour que les tests marchent dans le sandbox, ecris aussi une fonction simuler_base_vectorielle(chunks) qui simule la meme chose en Python pur. Elle retourne un dictionnaire avec les cles "documents" (liste des textes), "metadatas" (liste des metadonnees), "ids" (liste des identifiants uniques genre "chunk_0", "chunk_1"...) et "count" (nombre de documents).
Exemple :
chunks = [ {"texte": "Les conges sont de 25 jours.", "source": "rh.txt", "index": 0}, {"texte": "Le teletravail est possible 3j/semaine.", "source": "rh.txt", "index": 1}, ] base = simuler_base_vectorielle(chunks) base["count"] # 2 base["ids"] # ["chunk_0", "chunk_1"] base["documents"] # ["Les conges sont de 25 jours.", "Le teletravail est possible 3j/semaine."]
Tests (4/5)
Structure de la base simulee
chunks = [
{"texte": "Premier chunk", "source": "a.txt", "index": 0},
{"texte": "Deuxieme chunk", "source": "b.txt", "index": 1},
]
base = simuler_base_vectorielle(chunks)
assert isinstance(base, dict), "La fonction doit retourner un dictionnaire"
assert "documents" in base
assert "metadatas" in base
assert "ids" in base
assert "count" in base
chunks = [
{"texte": f"Chunk {i}", "source": "test.txt", "index": i}
for i in range(5)
]
base = simuler_base_vectorielle(chunks)
assert len(set(base["ids"])) == 5, "Tous les ids doivent etre uniques"
assert base["ids"][0] == "chunk_0"
assert base["ids"][4] == "chunk_4"
Count correct
chunks = [{"texte": f"C{i}", "source": "t.txt", "index": i} for i in range(7)]
base = simuler_base_vectorielle(chunks)
assert base["count"] == 7, f"Le count doit etre 7, pas {base['count']}"
+ 0 tests cachés
Indices (3 disponibles)
Solution officielle
def creer_collection(nom, chunks):
import chromadb
client = chromadb.Client()
collection = client.create_collection(nom)
if chunks:
collection.add(
documents=[c["texte"] for c in chunks],
metadatas=[{"source": c["source"], "index": c["index"]} for c in chunks],
ids=[f"chunk_{i}" for i in range(len(chunks))],
)
return collection
def simuler_base_vectorielle(chunks):
return {
"documents": [c["texte"] for c in chunks],
"metadatas": [{"source": c["source"], "index": c["index"]} for c in chunks],
"ids": [f"chunk_{i}" for i in range(len(chunks))],
"count": len(chunks),
}