File size: 3,520 Bytes
ccf256d
da21448
 
 
 
ccf256d
da21448
ccf256d
da21448
 
ccf256d
 
da21448
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
---
title: TechDocs GraphRAG
emoji: 🕸️
colorFrom: indigo
colorTo: blue
sdk: docker
app_port: 7860
pinned: false
license: mit
short_description: GraphRAG sur documentation technique (Neo4j + OpenAI)
---

# 🕸️ TechDocs GraphRAG

Assistant de documentation technique qui combine **recherche vectorielle** et **graphe de connaissances Neo4j**
pour répondre à des questions multi-hop avec des sources traçables.

Un RAG classique retrouve des passages similaires à la question. TechDocs GraphRAG extrait en plus les
entités et relations du corpus (`StateGraph —PERSISTS_WITH→ Checkpointer —ENABLES→ Persistence`) et
suit ces liens au moment de répondre.

## Fonctionnalités

- Ingestion Markdown, découpage par paragraphes avec chevauchement.
- Extraction LLM d'entités typées et de relations avec preuve textuelle.
- Déduplication des entités par clé canonique (`State Graph`, `state_graph` → `stategraph`).
- Neo4j Community embarqué dans le conteneur, corpus indexé automatiquement au démarrage.
- Neo4j comme store unique : documents, chunks, index vectoriel, index plein texte, graphe.
- Recherche hybride : chunks proches → entités mentionnées + entités citées dans la question → traversée multi-hop.
- Interface Streamlit : sous-graphe utilisé, relations, extraits, sources.
- Mode comparaison RAG vectoriel vs GraphRAG.

## Architecture

```mermaid
flowchart LR
    A[Markdown] --> B[ParagraphSplitter]
    B --> C[Embeddings OpenAI]
    B --> D[Extraction LLM]
    C --> E[(Neo4j<br/>index vectoriel)]
    D --> F[(Neo4j<br/>graphe d'entités)]
    Q[Question] --> R[HybridRetriever]
    E --> R
    F --> R
    R --> G[GraphRAGAssistant]
    G --> S[Réponse sourcée]
```

### Modèle de graphe

```text
(:Document)-[:HAS_CHUNK]->(:Chunk {embedding})-[:MENTIONS]->(:Entity:Component)
(:Entity)-[:USES | PERSISTS_WITH | DEPENDS_ON | ...]->(:Entity)
```

Chaque relation porte `evidence` et `documents`, ce qui rend chaque fait vérifiable.

## Structure

```text
├── app.py
├── Dockerfile
├── data/
├── src/techdocs_graphrag/
│   ├── config.py
│   ├── models.py
│   ├── ports.py
│   ├── ingestion.py
│   ├── llm.py
│   ├── prompts.py
│   ├── extraction.py
│   ├── graph_store.py
│   ├── indexing.py
│   ├── retrieval.py
│   ├── answering.py
│   ├── visualization.py
│   ├── services.py
│   └── cli.py
└── tests/
```

## Configuration

| Variable | Défaut | Rôle |
|---|---|---|
| `OPENAI_API_KEY` | requis | Clé OpenAI |
| `NEO4J_URI` | `bolt://localhost:7687` | Neo4j embarqué dans le conteneur |
| `NEO4J_USERNAME` | `neo4j` | Utilisateur Neo4j |
| `NEO4J_PASSWORD` | `techdocs-local-password` | Mot de passe Neo4j (secret conseillé) |
| `NEO4J_DATABASE` | `neo4j` | Base Neo4j |
| `CHAT_MODEL` | `gpt-4o-mini` | Modèle de génération |
| `EMBEDDING_MODEL` | `text-embedding-3-small` | Modèle d'embeddings |
| `GRAPH_MAX_HOPS` | `2` | Profondeur de traversée |
| `VECTOR_TOP_K` | `5` | Nombre de chunks récupérés |

## Lancer en local

```bash
cp .env.example .env
pip install -e ".[dev]"
pytest
techdocs-index data --reset
streamlit run app.py
```

## Feuille de route

- Jeu d'évaluation annoté (30 à 50 questions) et métriques de fidélité.
- Fusion d'entités par similarité d'embeddings.
- Résumés de communautés (approche Microsoft GraphRAG) pour les questions globales.
- API FastAPI `POST /ask`.