Exercices Projets guidés Creer une base vectorielle ChromaDB
🎉

Bravo!

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.

Installe ChromaDB :

pip install chromadb

Voici comment ca marche :

import chromadb

client = chromadb.Client()
collection = client.create_collection("ma_faq")
collection.add(
documents=["texte du chunk 1", "texte du chunk 2"],
metadatas=[{"source": "faq.txt"}, {"source": "guide.txt"}],
ids=["chunk_0", "chunk_1"]
)

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
Documents et metadonnees corrects
chunks = [
    {"texte": "Texte A", "source": "doc.txt", "index": 0},
    {"texte": "Texte B", "source": "doc.txt", "index": 1},
]
base = simuler_base_vectorielle(chunks)
assert base["documents"] == ["Texte A", "Texte B"]
assert base["metadatas"][0]["source"] == "doc.txt"
assert base["metadatas"][1]["index"] == 1
Identifiants uniques
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.py