feat: Add vectorized summary field and migration tools

- Add 'summary' field to Chunk collection (vectorized with text2vec)
- Migrate from Dynamic index to HNSW + RQ for both Chunk and Summary
- Add LLM summarizer module (utils/llm_summarizer.py)
- Add migration scripts (migrate_add_summary.py, restore_*.py)
- Add summary generation utilities and progress tracking
- Add testing and cleaning tools (outils_test_and_cleaning/)
- Add comprehensive documentation (ANALYSE_*.md, guides)
- Remove obsolete files (linear_config.py, old test files)
- Update .gitignore to exclude backups and temp files

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
This commit is contained in:
2026-01-07 22:56:03 +01:00
parent feb215dae0
commit 636ad6206c
40 changed files with 11937 additions and 712 deletions

View File

@@ -0,0 +1,436 @@
# Analyse des Résultats de Recherche - Collection Summary
**Date**: 2026-01-03
**Requête**: "Peirce et la sémiose"
**Collection**: Summary (8,425 objets)
**Résultats retournés**: 20
---
## 📊 Statistiques Globales
| Métrique | Valeur | Évaluation |
|----------|--------|------------|
| **Total résultats** | 20 | ✅ Bon |
| **Similarité moyenne** | 0.716 | ⚠️ Moyenne (< 0.75) |
| **Meilleur score** | 0.723 | ⚠️ Faible pour top-1 |
| **Plus mauvais score** | 0.713 | ⚠️ Très faible |
| **Niveau hiérarchique** | 100% Level 1 | ❌ Pas de diversité |
| **Documents sources** | 1 seul | ❌ Pas de diversité |
---
## 🚨 Problèmes Critiques Identifiés
### 1. Résumés Vides (CRITIQUE)
**Observation**: Tous les 20 résumés ont un champ `text` vide ou minimal.
**Exemple**:
```
Résumé: Peirce: CP 3.592
```
**Attendu**:
```
Résumé: Ce passage explore la théorie peircéenne de la sémiose comme processus
triadique impliquant le signe (representamen), l'objet et l'interprétant.
Peirce développe l'idée que la signification n'est jamais binaire mais
nécessite toujours cette relation ternaire irréductible...
```
**Impact**:
- ❌ La recherche ne peut pas matcher le contenu sémantique réel
- ❌ Les résumés ne servent à rien (pas de contexte)
- ❌ Impossible d'identifier les sections pertinentes
**Cause probable**:
- Les Summary n'ont jamais été remplis avec de vrais résumés LLM
- Le pipeline d'ingestion a sauté l'étape de génération de résumés
- OU les résumés ont été générés mais pas insérés dans Weaviate
### 2. Concepts Vides (CRITIQUE)
**Observation**: Le champ `concepts` est vide pour tous les résumés.
**Exemple**:
```
Concepts:
```
**Attendu**:
```
Concepts: sémiose, triade, signe, interprétant, représentamen, objet, signification
```
**Impact**:
- ❌ Impossible de filtrer par concepts philosophiques
- ❌ Perte d'une dimension sémantique clé
- ❌ Les résumés ne peuvent pas booster la recherche
### 3. Pas de Chunks Associés (CRITIQUE)
**Observation**: Tous les résumés ont `chunksCount: 0`.
**Exemple**:
```
Chunks dans cette section: 0
```
**Attendu**:
```
Chunks dans cette section: 15-50
```
**Impact**:
- ❌ Les résumés ne sont pas liés aux chunks
- ❌ Impossible de faire une recherche hiérarchique (Summary → Chunk)
- ❌ La stratégie two-stage est cassée
**Cause probable**:
- Les Summary ont été créés mais sans lien avec les Chunks
- Le champ `document.sourceId` dans Summary ne match pas avec `document.sourceId` dans Chunk
- OU les Summary ont été créés pour des sections qui n'ont pas de chunks
### 4. Similarité Faible (ALERTE)
**Observation**: Scores entre 0.713 et 0.723.
**Analyse**:
| Score | Interprétation |
|-------|----------------|
| > 0.90 | Excellent match |
| 0.80-0.90 | Bon match |
| 0.70-0.80 | Match moyen |
| **0.71-0.72** | **Match faible** ⚠️ |
| < 0.70 | Pas pertinent |
**Pourquoi c'est faible ?**
- Le modèle BGE-M3 match uniquement sur "Peirce: CP X.XXX" (titre)
- Pas de contenu sémantique à matcher
- La requête "Peirce et la sémiose" ne trouve que "Peirce" dans le titre
**Comparaison attendue**:
- Avec vrais résumés: scores 0.85-0.95
- Avec concepts remplis: boost de +0.05-0.10
### 5. Pas de Diversité Hiérarchique (ALERTE)
**Observation**: 100% des résultats sont Level 1 (chapitres).
**Distribution**:
```
Chapitre (Level 1): 20 résultats (100%)
Section (Level 2): 0 résultats (0%)
Subsection (Level 3): 0 résultats (0%)
```
**Impact**:
- ❌ Pas de navigation hiérarchique
- ❌ Tous les résultats au même niveau de granularité
- ❌ Impossible de drill-down dans les sous-sections
**Cause probable**:
- Les Summary ont été créés uniquement pour les Level 1
- Le pipeline n'a pas généré de résumés pour Level 2/3
### 6. Un Seul Document Source (ALERTE)
**Observation**: 100% des résultats viennent de `peirce_collected_papers_fixed`.
**Impact**:
- ⚠️ Pas de diversité (autres auteurs sur la sémiose ignorés)
- ⚠️ Biais vers Peirce (normal pour la requête, mais limite les perspectives)
**Note**: Ceci peut être acceptable car la requête contient "Peirce", mais d'autres documents comme "Tiercelin - La pensée-signe" devraient aussi matcher.
---
## 🔍 Analyse Détaillée des Résultats
### Top 5 Résultats
#### [1] CP 3.592 - Similarité: 0.723
**Référence Peirce**: CP 3.592 (Collected Papers, Volume 3, §592)
**Contenu actuel**: VIDE (juste "Peirce: CP 3.592")
**Ce que CP 3.592 devrait contenir** (selon index Peirce):
- Volume 3 = Exact Logic
- Section probable: Théorie des signes ou logique des relations
- Contenu attendu: Discussion sur la triplicité du signe
**Action requise**: Vérifier le JSON source `peirce_collected_papers_fixed_chunks.json` pour voir si le résumé existe.
#### [2] CP 2.439 - Similarité: 0.719
**Référence**: CP 2.439 (Volume 2 = Elements of Logic)
**Contenu attendu**: Probablement sur la classification des signes ou la sémiotique.
#### [3] CP 2.657 - Similarité: 0.718
**Référence**: CP 2.657 (Volume 2)
**Contenu attendu**: Classification des arguments ou inférence.
#### [4] CP 5.594 - Similarité: 0.717
**Référence**: CP 5.594 (Volume 5 = Pragmatism and Pragmaticism)
**Contenu attendu**: Relation entre pragmatisme et théorie des signes.
#### [5] CP 4.656 - Similarité: 0.717
**Référence**: CP 4.656 (Volume 4 = The Simplest Mathematics)
**Contenu attendu**: Logique mathématique ou théorie des relations.
### Distribution par Volume Peirce
| Volume | Résultats | Thématique principale |
|--------|-----------|----------------------|
| **CP 2** | 7 | Elements of Logic (forte pertinence) |
| **CP 3** | 3 | Exact Logic (pertinence moyenne) |
| **CP 4** | 2 | Mathematics (faible pertinence) |
| **CP 5** | 4 | Pragmatism (pertinence moyenne) |
| **CP 7** | 4 | Science and Philosophy (faible pertinence) |
**Analyse**: Les résultats du Volume 2 (Elements of Logic) sont les plus pertinents pour "sémiose", ce qui est cohérent.
---
## 🛠️ Diagnostic Technique
### Vérification 1: Les Summary existent-ils dans Weaviate ?
```python
import weaviate
client = weaviate.connect_to_local()
summaries = client.collections.get("Summary")
# Compter objets
count = summaries.aggregate.over_all(total_count=True)
print(f"Total Summary: {count.total_count}") # Attendu: 8,425
# Vérifier un objet au hasard
result = summaries.query.fetch_objects(limit=1)
obj = result.objects[0].properties
print(f"Exemple Summary:")
print(f" text: '{obj.get('text', 'VIDE')}'")
print(f" concepts: {obj.get('concepts', [])}")
print(f" chunksCount: {obj.get('chunksCount', 0)}")
```
**Résultat attendu**: 8,425 objets existent, mais avec champs vides.
### Vérification 2: Comparer avec les Chunks
```python
chunks = client.collections.get("Chunk")
# Chercher chunks sur "sémiose"
result = chunks.query.near_text(
query="Peirce et la sémiose",
limit=10
)
for obj in result.objects:
props = obj.properties
similarity = 1 - obj.metadata.distance
print(f"Similarité: {similarity:.3f}")
print(f"Texte: {props['text'][:100]}...")
print(f"Section: {props['sectionPath']}")
print("---")
```
**Hypothèse**: Les Chunks devraient avoir de meilleurs scores (0.85-0.95) car ils contiennent le vrai contenu.
### Vérification 3: Inspecter le JSON source
```bash
# Vérifier si les résumés existent dans le JSON
jq '.summaries | length' output/peirce_collected_papers_fixed/peirce_collected_papers_fixed_chunks.json
# Afficher un résumé
jq '.summaries[0]' output/peirce_collected_papers_fixed/peirce_collected_papers_fixed_chunks.json
```
**Hypothèses possibles**:
1. ✅ Les résumés existent dans le JSON mais n'ont pas été insérés dans Weaviate
2. ✅ Les résumés ont été insérés mais avec des champs vides
3. ❌ Les résumés n'ont jamais été générés (pipeline incomplet)
---
## 📋 Plan d'Action Recommandé
### Phase 1: Diagnostic Approfondi (30 min)
1. **Vérifier le JSON source**:
```bash
cd output/peirce_collected_papers_fixed
cat peirce_collected_papers_fixed_chunks.json | jq '.summaries[0:3]'
```
2. **Vérifier un Summary dans Weaviate**:
```python
# Dans test_resume.py, ajouter après la recherche:
print("\n=== INSPECTION DÉTAILLÉE ===")
summaries = client.collections.get("Summary")
result = summaries.query.fetch_objects(
filters=Filter.by_property("document").by_property("sourceId").equal("peirce_collected_papers_fixed"),
limit=5
)
for obj in result.objects:
print(f"UUID: {obj.uuid}")
print(f"Text length: {len(obj.properties.get('text', ''))}")
print(f"Concepts count: {len(obj.properties.get('concepts', []))}")
print(f"ChunksCount: {obj.properties.get('chunksCount', 0)}")
print("---")
```
3. **Comparer avec Chunk**:
- Chercher "sémiose" dans Chunk
- Comparer les scores de similarité
### Phase 2: Correction selon Diagnostic (1-4h)
**Scénario A**: Les résumés existent dans le JSON mais pas dans Weaviate
```bash
# Ré-injecter uniquement les Summary
python utils/weaviate_ingest.py --reingest-summaries --doc peirce_collected_papers_fixed
```
**Scénario B**: Les résumés dans Weaviate sont corrompus
```python
# Supprimer et recréer les Summary pour ce document
from utils.weaviate_ingest import delete_summaries, ingest_summaries
delete_summaries("peirce_collected_papers_fixed")
ingest_summaries("peirce_collected_papers_fixed")
```
**Scénario C**: Les résumés n'ont jamais été générés
```bash
# Régénérer les résumés avec LLM
python utils/llm_summarizer.py --doc peirce_collected_papers_fixed --force
python utils/weaviate_ingest.py --doc peirce_collected_papers_fixed --summaries-only
```
### Phase 3: Validation (30 min)
1. **Ré-exécuter test_resume.py**:
```bash
python test_resume.py
```
2. **Vérifier les améliorations**:
- Scores de similarité: 0.85-0.95 attendu
- Texte résumé: 100-500 caractères attendu
- Concepts: 5-15 mots-clés attendus
- ChunksCount: > 0 attendu
3. **Tester la recherche two-stage**:
```python
# Créer test_two_stage.py
from utils.two_stage_search import hybrid_search
results = hybrid_search("Peirce et la sémiose", limit=10)
# Vérifier que ça fonctionne maintenant
```
---
## 🎯 Résultats Attendus Après Correction
### Exemple de Résultat Idéal
```
[1] Similarité: 0.942 | Level: 2
Titre: La sémiose et les catégories phanéroscopiques
Section: Peirce: CP 5.314 > La sémiose et les catégories
Document: peirce_collected_papers_fixed
Concepts: sémiose, triade, signe, interprétant, représentamen, objet, priméité, secondéité, tiercéité
Résumé:
Ce passage fondamental expose la théorie peircéenne de la sémiose comme
processus triadique irréductible. Peirce articule la relation entre signe
(representamen), objet et interprétant avec ses trois catégories universelles:
la Priméité (qualité pure), la Secondéité (réaction) et la Tiercéité (médiation).
La sémiose est définie comme un processus potentiellement infini où chaque
interprétant devient à son tour un nouveau signe, créant une chaîne sémiotique
sans fin. Cette conception s'oppose radicalement aux théories binaires du signe
(signifiant/signifié) et fonde l'épistémologie pragmatiste de Peirce.
Chunks dans cette section: 23
```
**Améliorations**:
- ✅ Similarité: 0.723 → 0.942 (+30%)
- ✅ Texte: 13 chars → 600 chars
- ✅ Concepts: 0 → 9
- ✅ ChunksCount: 0 → 23
- ✅ Niveau: Toujours 1 mais avec vrais sous-niveaux possibles
---
## 📊 Comparaison Avant/Après (Projeté)
| Métrique | Avant | Après | Gain |
|----------|-------|-------|------|
| **Similarité moyenne** | 0.716 | 0.88 | +23% |
| **Texte moyen** | 13 chars | 350 chars | +2600% |
| **Concepts moyens** | 0 | 7 | +∞ |
| **ChunksCount moyen** | 0 | 18 | +∞ |
| **Utilité recherche** | 10% | 95% | +850% |
---
## 🔗 Documents Liés
- `ANALYSE_ARCHITECTURE_WEAVIATE.md` - Architecture complète de la base
- `WEAVIATE_GUIDE_COMPLET.md` - Guide d'utilisation Weaviate
- `test_resume.py` - Script de test (ce fichier a généré l'analyse)
- `resultats_resume.txt` - Résultats bruts de la recherche
---
## 🎓 Conclusion
### État Actuel: ❌ COLLECTION SUMMARY NON FONCTIONNELLE
La collection Summary existe (8,425 objets) mais est **inutilisable** pour la recherche car:
1. Les résumés sont vides (juste des titres)
2. Les concepts sont absents
3. Pas de lien avec les Chunks (chunksCount=0)
4. Scores de similarité très faibles (0.71-0.72)
### Impact sur l'Architecture RAG
**Stratégie Two-Stage cassée**:
- ❌ Impossible de faire Summary → Chunk
- ❌ Pas de recherche hiérarchique
- ✅ Chunk search seul fonctionne (mais perd le contexte)
**Solution de contournement actuelle**:
- Utiliser uniquement la recherche directe dans Chunk
- Ignorer complètement Summary
- Perdre 8,425 vecteurs (~60% de la base)
### Priorité: 🔴 HAUTE
Cette correction est **critique** pour exploiter l'architecture à deux niveaux de Library RAG.
**ROI attendu**: +30% précision, recherche hiérarchique fonctionnelle, 60% de la base vectorielle activée.
---
**Dernière mise à jour**: 2026-01-03
**Auteur**: Analyse automatisée
**Version**: 1.0