# Analyse de Cohérence des Collections Weaviate

**Date**: 2025-12-09
**Analysé**: 3 collections, 51 objets

---

## Résumé Exécutif

### Problèmes Critiques Identifiés

1. **Désynchronisation schéma défini vs schéma réel** - Le schéma dans `schema.py` ne correspond PAS au schéma actuel dans Weaviate
2. **Collection Section manquante** - Définie dans `schema.py` mais inexistante dans Weaviate
3. **Collection Work inutilisée** - 0 objets, redondante avec les autres collections
4. **Duplication massive de données** - author/work répétés 50 fois au lieu d'utiliser des références
5. **Métadonnées vides** - TOC et hiérarchie non exploitées
6. **Auto-schema non contrôlé** - Propriétés ajoutées automatiquement sans validation

---

## 1. Collection Document

### Configuration Actuelle
- **Vectorizer**: `TEXT2VEC_TRANSFORMERS` ⚠️
- **Objets**: 1
- **Auto-generated**: OUI (toutes les propriétés)

### ❌ Problèmes Identifiés

#### 1.1 Schéma Auto-Généré
```
"This property was generated by Weaviate's auto-schema feature on Fri Dec 5 16:10:30 2025"
```
- Le schéma réel n'a **PAS été créé** via `schema.py`
- Weaviate a auto-généré le schéma lors de l'insertion
- **Conséquence**: Perte de contrôle sur les types et la configuration

#### 1.2 Vectorizer Incorrect
**Attendu** (schema.py:21):
```python
vectorizer_config=wvc.Configure.Vectorizer.none()
```

**Réel**:
```
Vectorizer: TEXT2VEC_TRANSFORMERS
```

**Impact**: Vectorisation inutile des métadonnées → gaspillage de ressources

#### 1.3 Skip Vectorization Ignoré
**Attendu** (schema.py:85-86):
```python
skip_vectorization=True  # Pour sectionPath et title
```

**Réel**:
```
Toutes les propriétés: Skip Vectorization = ❌
```

**Impact**: Toutes les métadonnées sont vectorisées inutilement

#### 1.4 Données Vides/Invalides
```json
{
  "toc": "[]",              // ❌ Vide alors que le document a une TOC
  "hierarchy": "{}",         // ❌ Vide alors que le document a une hiérarchie
  "pages": 0.0,              // ❌ Devrait être > 0
  "chunksCount": 50.0        // ⚠️ Float au lieu de INT
}
```

#### 1.5 Type DATE Perdu
**Attendu** (schema.py:66):
```python
data_type=wvc.DataType.DATE
```

**Réel**:
```
createdAt: TEXT
```

**Impact**: Impossible de filtrer par date efficacement

---

## 2. Collection Passage

### Configuration Actuelle
- **Vectorizer**: `TEXT2VEC_TRANSFORMERS` ✅
- **Objets**: 50
- **Description**: Correcte

### ⚠️ Problèmes Identifiés

#### 2.1 Propriétés Non-Définies Ajoutées
Le schéma dans `schema.py` définit 9 propriétés, mais Weaviate en a **12**:

**Propriétés supplémentaires auto-générées**:
- `chapterTitle` (TEXT)
- `chapterConcepts` (TEXT_ARRAY)
- `sectionLevel` (NUMBER)

**Problème**: Ces propriétés ne sont pas dans le schéma original et ont été ajoutées automatiquement sans validation.

#### 2.2 Skip Vectorization Non Respecté
Selon `schema.py`, AUCUNE propriété de Passage ne devrait avoir `skip_vectorization=True`.

**Réel**: Toutes les propriétés sont vectorisées ✅ (correct)

#### 2.3 Duplication Massive de Données

**author** répété 50 fois:
```json
"author": "Platon"  // x50 passages
```

**work** répété 50 fois:
```json
"work": "Ménon ou de la vertu"  // x50 passages
```

**Impact**:
- Gaspillage d'espace (50 × ~20 octets = 1 Ko juste pour author)
- Pas de normalisation
- Impossible de changer l'auteur globalement
- Pas de relation avec la collection Work

#### 2.4 Données Incohérentes

**orderIndex**:
- Min: 1, Max: 49 (attendu: 0-49 pour 50 chunks)
- ⚠️ Manque l'index 0 OU l'index 50

**keywords**:
- Parfois vide `[]` (11 passages)
- Pas de normalisation

**chapterConcepts**:
- **TOUJOURS vide** `[]` pour tous les passages
- Feature non utilisée → propriété inutile

**unitType**:
- 5 valeurs: `exposition`, `main_content`, `argument`, `transition`, `définition`
- Pas de validation (pourrait contenir n'importe quoi)

**section**:
- 13 valeurs uniques pour 50 passages
- Très variable: `"SOCRATE"`, `"MENON"`, `"Qu'est-ce que la vertu?"`, etc.
- Pas de format standard

---

## 3. Collection Work

### Configuration Actuelle
- **Vectorizer**: `NONE` ✅
- **Objets**: **0** ❌
- **Schéma**: Correct

### 🚨 Problèmes Critiques

#### 3.1 Collection Complètement Inutilisée
```
Nombre d'objets: 0
```

**Pourquoi existe-t-elle?**
- Définie dans `schema.py`
- Jamais utilisée par `weaviate_ingest.py`

#### 3.2 Redondance Totale
Les informations de Work sont **dupliquées** dans:
1. **Document.author** + **Document.title**
2. **Passage.author** + **Passage.work** (x50)

**Solution attendue**: Utiliser Work comme source unique avec des références croisées.

#### 3.3 Propriétés Inutiles
```python
year: INT              # Jamais renseigné
edition: TEXT          # Jamais renseigné
referenceSystem: TEXT  # Jamais renseigné
```

---

## 4. Collection Section (Manquante!)

### 🚨 Définie mais Inexistante

**Dans schema.py** (lignes 74-120):
```python
client.collections.create(
    name="Section",
    description="A section/chapter with its summary and key concepts...",
    ...
)
```

**Dans Weaviate**:
```
Collections: Document, Passage, Work
```

**Section est ABSENTE!**

### Impact
- Impossible de faire des résumés de chapitres vectorisés
- Perte de la hiérarchie structurée
- Feature complète non implémentée

---

## 5. Problèmes de Conception Architecturale

### 5.1 Absence de Relations Croisées

**Attendu** (architecture normalisée):
```
Work (1) ──< Document (N) ──< Passage (N)
           └──< Section (N) ──< Passage (N)
```

**Réel**:
```
Document (1)  [pas de lien]
Passage (50)  [pas de lien]
Work (0)      [vide]
Section       [manquant]
```

**Conséquence**: Impossible de naviguer entre collections

### 5.2 Pas de Cross-References
Weaviate v4 supporte les références croisées, mais elles ne sont **pas utilisées**:

```python
# Ce qu'on devrait avoir dans Passage:
wvc.Property(
    name="document",
    data_type=wvc.DataType.REFERENCE,
    references="Document"
)
```

### 5.3 Duplication vs Normalisation

**Taille actuelle (estimée)**:
- Document: 1 × ~500 octets = 500 B
- Passage: 50 × ~600 octets = 30 Ko
- **Total dupliqué**: author (50×) + work (50×) ≈ 2 Ko de redondance

**Avec normalisation**:
- Work: 1 objet avec author + title
- Passage: Référence UUID vers Work
- **Économie**: ~1.5 Ko + meilleure intégrité

---

## 6. Analyse des Données

### 6.1 Document "Platon_-_Menon_trad._Cousin"

```json
{
  "title": "Ménon ou de la vertu",
  "author": "Platon",
  "sourceId": "Platon_-_Menon_trad._Cousin",
  "language": "fr",
  "pages": 0.0,           // ❌ Invalide
  "chunksCount": 50.0,    // ✅ Mais devrait être INT
  "toc": "[]",            // ❌ Vide
  "hierarchy": "{}",      // ❌ Vide
  "createdAt": "2025-12-09T09:20:30.970580"
}
```

**Problèmes**:
1. `pages: 0` → Le PDF avait forcément des pages
2. `toc: "[]"` → Le système extrait une TOC (voir `llm_toc.py`), pourquoi est-elle vide?
3. `hierarchy: "{}"` → Idem, la hiérarchie devrait être remplie

### 6.2 Distribution des Passages

**Par unitType**:
- main_content: ~25
- argument: ~15
- exposition: ~5
- transition: ~3
- définition: ~2

**Par section (top 5)**:
- "SOCRATE": 8 passages
- "MENON": 7 passages
- "Qu'est-ce que la vertu?": 6 passages
- "Vérification de la réminiscence": 5 passages
- "La vertu s'enseigne-t-elle?": 8 passages

**Par chapterTitle (top 3)**:
- "Ménon ou de la vertu": 7 passages
- "Présentation": 6 passages
- "La vertu s'enseigne-t-elle?": 8 passages

⚠️ **Confusion**: `section` et `chapterTitle` se chevauchent sans logique claire

---

## 7. Écart Schema.py vs Weaviate Réel

| Aspect | schema.py | Weaviate Réel | État |
|--------|-----------|---------------|------|
| **Collections** | 4 (Document, Section, Passage, Work) | 3 (Document, Passage, Work) | ❌ Section manquante |
| **Document.vectorizer** | NONE | TEXT2VEC_TRANSFORMERS | ❌ Incorrect |
| **Document.createdAt** | DATE | TEXT | ❌ Type perdu |
| **Document.skip_vectorization** | Défini | Ignoré | ❌ Non appliqué |
| **Passage propriétés** | 9 | 12 | ⚠️ 3 ajoutées automatiquement |
| **Section** | Définie | Absente | ❌ Non créée |
| **Work objets** | N/A | 0 | ⚠️ Inutilisée |

**Cause probable**: Le schéma n'a **jamais été appliqué** correctement. Les collections ont été créées par auto-schema lors de la première insertion.

---

## 8. Recommandations

### 8.1 Actions Immédiates (Critiques)

1. **Supprimer et recréer le schéma**
   ```bash
   python schema.py  # Recréer proprement
   ```

2. **Vérifier que Section est créée**
   - Ajouter des logs dans `schema.py`
   - Vérifier avec `client.collections.list_all()`

3. **Réparer les métadonnées du Document**
   - Remplir `toc` avec les vraies données
   - Remplir `hierarchy` avec la structure
   - Corriger `pages` (nombre réel de pages du PDF)

4. **Nettoyer les propriétés orphelines**
   - Soit définir `chapterTitle`, `chapterConcepts`, `sectionLevel` dans le schéma
   - Soit les supprimer des données

### 8.2 Améliorations Architecturales

1. **Normaliser avec Work**
   ```python
   # Dans Passage, remplacer author/work par:
   wvc.Property(
       name="work_ref",
       data_type=wvc.DataType.REFERENCE,
       references="Work"
   )
   ```

2. **Ajouter Document → Passage reference**
   ```python
   wvc.Property(
       name="document_ref",
       data_type=wvc.DataType.REFERENCE,
       references="Document"
   )
   ```

3. **Implémenter Section**
   - Créer des objets Section pour chaque chapitre
   - Lier Section ← Passage via référence
   - Ajouter des résumés LLM aux sections

### 8.3 Validation des Données

1. **Ajouter des contraintes**
   - `unitType` → Enum validé
   - `orderIndex` → Doit aller de 0 à chunksCount-1
   - `pages` > 0

2. **Normaliser keywords**
   - Éviter les doublons
   - Normaliser la casse
   - Supprimer les arrays vides si non utilisés

3. **Standardiser section/chapterTitle**
   - Décider d'un format unique
   - Séparer titre de chapitre vs nom de locuteur

### 8.4 Pipeline d'Ingestion

**Modifier `weaviate_ingest.py`**:

1. Créer un objet **Work** d'abord
2. Créer un objet **Document** avec référence à Work
3. Créer des objets **Section** avec références
4. Créer des **Passages** avec références vers Document + Section
5. Valider les données avant insertion

---

## 9. Impact Business

### Problèmes Actuels

| Problème | Impact Utilisateur | Gravité |
|----------|-------------------|---------|
| Section manquante | Pas de navigation par chapitre | 🔴 Haute |
| TOC vide | Impossible de voir la structure | 🔴 Haute |
| Work inutilisée | Duplication, pas de filtre par œuvre | 🟡 Moyenne |
| Auto-schema | Schéma imprévisible, bugs futurs | 🔴 Haute |
| orderIndex incorrect | Ordre des passages peut être faux | 🟡 Moyenne |

### Bénéfices de la Correction

1. **Navigation structurée** via Section
2. **Recherche optimisée** avec références croisées
3. **Métadonnées riches** (TOC, hiérarchie)
4. **Intégrité des données** avec schéma strict
5. **Performance** (moins de duplication)

---

## 10. Plan d'Action Proposé

### Phase 1: Diagnostic Complet (1h)
- [ ] Vérifier pourquoi `schema.py` n'a pas été appliqué
- [ ] Examiner les logs d'insertion dans `weaviate_ingest.py`
- [ ] Identifier quand l'auto-schema s'est déclenché

### Phase 2: Correction du Schéma (2h)
- [ ] Supprimer toutes les collections
- [ ] Ré-exécuter `schema.py` avec logs
- [ ] Vérifier que les 4 collections existent avec le bon schéma
- [ ] Tester l'insertion d'un document de test

### Phase 3: Migration des Données (3h)
- [ ] Exporter les 50 passages actuels
- [ ] Créer un objet Work pour "Ménon"
- [ ] Créer un Document avec TOC/hierarchy remplis
- [ ] Créer des Sections par chapitre
- [ ] Ré-insérer les Passages avec références

### Phase 4: Validation (1h)
- [ ] Tester les requêtes avec références
- [ ] Vérifier l'intégrité des données
- [ ] Documenter le nouveau schéma
- [ ] Mettre à jour `README.md`

**Temps total estimé**: ~7 heures

---

## Conclusion

Le système actuel souffre d'une **désynchronisation majeure** entre le schéma défini et la réalité dans Weaviate. Les collections ont été créées par auto-schema au lieu d'utiliser le schéma explicite, ce qui a conduit à:

1. ❌ Perte de contrôle sur les types et la vectorisation
2. ❌ Collection Section complètement absente
3. ❌ Duplication massive de données
4. ❌ Métadonnées vides et invalides
5. ❌ Pas de relations entre collections

**Priorité**: Recréer proprement le schéma et migrer les données pour exploiter tout le potentiel de l'architecture vectorielle.
