# ezechiel-sawadogo-nlp/merimee-rag architecture

> Architecture diagram of the GitHub repository ezechiel-sawadogo-nlp/merimee-rag, generated by GitDiagram from its file tree, README and a sample of source files (last updated 2026-09-29). It is an AI-made overview: check details against the source.

- Interactive diagram: https://gitdiagram.com/ezechiel-sawadogo-nlp/merimee-rag
- Repository: https://github.com/ezechiel-sawadogo-nlp/merimee-rag

## Overview

merimee-rag is a local French-monuments question-answering RAG system, with an accompanying evaluation workflow. Users ask questions in the Streamlit demo; the configured retriever finds passages, the pipeline supplies cited context to an Ollama model, and the UI presents the answer, sources, and map. Corpus ingestion and indexing support that workflow. The evaluation branch builds a test set and measures retrieval and generated answers. Edges reflect the excerpts, SOURCE INDEX references, and README; unsampled implementation details are not inferred.

Main entry points: [`src/merimee_rag/pipeline.py`](https://github.com/ezechiel-sawadogo-nlp/merimee-rag/blob/main/src/merimee_rag/pipeline.py) (RAG pipeline), [`app.py`](https://github.com/ezechiel-sawadogo-nlp/merimee-rag/blob/main/app.py) (Streamlit demo), [`eval/eval_generation.py`](https://github.com/ezechiel-sawadogo-nlp/merimee-rag/blob/main/eval/eval_generation.py) (Generation evaluation), [`src/merimee_rag/store.py`](https://github.com/ezechiel-sawadogo-nlp/merimee-rag/blob/main/src/merimee_rag/store.py) (Index and system)

## Diagram (Mermaid)

```mermaid
flowchart TD

subgraph group_corpus["Corpus and indexing"]
  node_cli["CLI commands<br/>[cli.py]"]
  node_source_data["Mérimée data<br/>[monuments.json.gz]"]
  node_corpus_parser["Notice loading<br/>[corpus.py]"]
  node_index_store["Index and system<br/>[store.py]"]
end

subgraph group_runtime["Question answering"]
  node_demo["Streamlit demo<br/>[app.py]"]
  node_config["Configuration<br/>[config.py]"]
  node_retrievers["Retrievers<br/>[retrievers.py]"]
  node_pipeline["RAG pipeline<br/>[pipeline.py]"]
  node_cache[("LLM cache<br/>[llm.py]")]
end

subgraph group_evaluation["Evaluation"]
  node_testset_builder["Test-set builder<br/>[build_testset.py]"]
  node_testset["Evaluation questions<br/>[testset.jsonl]"]
  node_retrieval_eval["Retrieval evaluation<br/>[eval_retrieval.py]"]
  node_generation_eval["Generation evaluation<br/>[eval_generation.py]"]
  node_judge["Answer judge<br/>[judge.py]"]
  node_metrics["Evaluation metrics<br/>[metrics.py]"]
  node_report["Evaluation report<br/>[report.py]"]
end

node_user(("Questioner"))
node_solr[("Solr index")]
node_ollama["Ollama model"]

node_user -->|"asks"| node_demo
node_demo -->|"submits question"| node_pipeline
node_demo -->|"reads settings"| node_config
node_cli -->|"uses settings"| node_config
node_cli -->|"loads corpus"| node_corpus_parser
node_cli -->|"builds index"| node_index_store
node_source_data -->|"loads notices"| node_corpus_parser
node_corpus_parser -->|"provides notices"| node_index_store
node_index_store -->|"builds indexes"| node_retrievers
node_index_store -->|"provides chunks"| node_pipeline
node_pipeline -->|"searches passages"| node_retrievers
node_pipeline -->|"generates answer"| node_ollama
node_demo -->|"configures cache"| node_cache
node_retrievers -.->|"queries index"| node_solr
node_testset_builder -->|"loads notices"| node_corpus_parser
node_testset_builder -->|"generates questions"| node_ollama
node_testset_builder -.->|"writes questions"| node_testset
node_testset -->|"evaluates retrieval"| node_retrieval_eval
node_testset -->|"evaluates answers"| node_generation_eval
node_retrieval_eval -->|"queries systems"| node_retrievers
node_generation_eval -->|"runs configurations"| node_pipeline
node_generation_eval -->|"scores answers"| node_judge
node_generation_eval -->|"computes metrics"| node_metrics
node_retrieval_eval -->|"computes metrics"| node_metrics
node_report -->|"reads paths"| node_config

click node_demo "https://github.com/ezechiel-sawadogo-nlp/merimee-rag/blob/main/app.py"
click node_cli "https://github.com/ezechiel-sawadogo-nlp/merimee-rag/blob/main/src/merimee_rag/cli.py"
click node_config "https://github.com/ezechiel-sawadogo-nlp/merimee-rag/blob/main/src/merimee_rag/config.py"
click node_source_data "https://github.com/ezechiel-sawadogo-nlp/merimee-rag/blob/main/data/monuments.json.gz"
click node_corpus_parser "https://github.com/ezechiel-sawadogo-nlp/merimee-rag/blob/main/src/merimee_rag/corpus.py"
click node_index_store "https://github.com/ezechiel-sawadogo-nlp/merimee-rag/blob/main/src/merimee_rag/store.py"
click node_retrievers "https://github.com/ezechiel-sawadogo-nlp/merimee-rag/blob/main/src/merimee_rag/retrievers.py"
click node_pipeline "https://github.com/ezechiel-sawadogo-nlp/merimee-rag/blob/main/src/merimee_rag/pipeline.py"
click node_cache "https://github.com/ezechiel-sawadogo-nlp/merimee-rag/blob/main/src/merimee_rag/llm.py"
click node_testset_builder "https://github.com/ezechiel-sawadogo-nlp/merimee-rag/blob/main/eval/build_testset.py"
click node_testset "https://github.com/ezechiel-sawadogo-nlp/merimee-rag/blob/main/eval/testset.jsonl"
click node_retrieval_eval "https://github.com/ezechiel-sawadogo-nlp/merimee-rag/blob/main/eval/eval_retrieval.py"
click node_generation_eval "https://github.com/ezechiel-sawadogo-nlp/merimee-rag/blob/main/eval/eval_generation.py"
click node_judge "https://github.com/ezechiel-sawadogo-nlp/merimee-rag/blob/main/eval/judge.py"
click node_metrics "https://github.com/ezechiel-sawadogo-nlp/merimee-rag/blob/main/eval/metrics.py"
click node_report "https://github.com/ezechiel-sawadogo-nlp/merimee-rag/blob/main/eval/report.py"

classDef toneNeutral fill:#f8fafc,stroke:#334155,stroke-width:1.5px,color:#0f172a
classDef toneBlue fill:#dbeafe,stroke:#2563eb,stroke-width:1.5px,color:#172554
classDef toneAmber fill:#fef3c7,stroke:#d97706,stroke-width:1.5px,color:#78350f
classDef toneMint fill:#dcfce7,stroke:#16a34a,stroke-width:1.5px,color:#14532d
classDef toneRose fill:#ffe4e6,stroke:#e11d48,stroke-width:1.5px,color:#881337
classDef toneIndigo fill:#e0e7ff,stroke:#4f46e5,stroke-width:1.5px,color:#312e81
classDef toneTeal fill:#ccfbf1,stroke:#0f766e,stroke-width:1.5px,color:#134e4a
class node_cli,node_source_data,node_corpus_parser,node_index_store toneBlue
class node_demo,node_config,node_retrievers,node_pipeline,node_cache,node_solr toneAmber
class node_testset_builder,node_testset,node_retrieval_eval,node_generation_eval,node_judge,node_metrics,node_report toneMint
class node_user,node_ollama toneIndigo
```

## Components

### Corpus and indexing

- [CLI commands](https://github.com/ezechiel-sawadogo-nlp/merimee-rag/blob/main/src/merimee_rag/cli.py): `src/merimee_rag/cli.py`
- [Mérimée data](https://github.com/ezechiel-sawadogo-nlp/merimee-rag/blob/main/data/monuments.json.gz): `data/monuments.json.gz`
- [Notice loading](https://github.com/ezechiel-sawadogo-nlp/merimee-rag/blob/main/src/merimee_rag/corpus.py): `src/merimee_rag/corpus.py`
- [Index and system](https://github.com/ezechiel-sawadogo-nlp/merimee-rag/blob/main/src/merimee_rag/store.py): `src/merimee_rag/store.py`

### Question answering

- [Streamlit demo](https://github.com/ezechiel-sawadogo-nlp/merimee-rag/blob/main/app.py): `app.py`
- [Configuration](https://github.com/ezechiel-sawadogo-nlp/merimee-rag/blob/main/src/merimee_rag/config.py): `src/merimee_rag/config.py`
- [Retrievers](https://github.com/ezechiel-sawadogo-nlp/merimee-rag/blob/main/src/merimee_rag/retrievers.py): `src/merimee_rag/retrievers.py`
- [RAG pipeline](https://github.com/ezechiel-sawadogo-nlp/merimee-rag/blob/main/src/merimee_rag/pipeline.py): `src/merimee_rag/pipeline.py`
- [LLM cache](https://github.com/ezechiel-sawadogo-nlp/merimee-rag/blob/main/src/merimee_rag/llm.py): `src/merimee_rag/llm.py`

### Evaluation

- [Test-set builder](https://github.com/ezechiel-sawadogo-nlp/merimee-rag/blob/main/eval/build_testset.py): `eval/build_testset.py`
- [Evaluation questions](https://github.com/ezechiel-sawadogo-nlp/merimee-rag/blob/main/eval/testset.jsonl): `eval/testset.jsonl`
- [Retrieval evaluation](https://github.com/ezechiel-sawadogo-nlp/merimee-rag/blob/main/eval/eval_retrieval.py): `eval/eval_retrieval.py`
- [Generation evaluation](https://github.com/ezechiel-sawadogo-nlp/merimee-rag/blob/main/eval/eval_generation.py): `eval/eval_generation.py`
- [Answer judge](https://github.com/ezechiel-sawadogo-nlp/merimee-rag/blob/main/eval/judge.py): `eval/judge.py`
- [Evaluation metrics](https://github.com/ezechiel-sawadogo-nlp/merimee-rag/blob/main/eval/metrics.py): `eval/metrics.py`
- [Evaluation report](https://github.com/ezechiel-sawadogo-nlp/merimee-rag/blob/main/eval/report.py): `eval/report.py`

### Other components

- **Questioner**
- **Solr index**
- **Ollama model**

## Connections

- Questioner → Streamlit demo: asks (evidence: `README.md`)
- Streamlit demo → RAG pipeline: submits question (evidence: `app.py`)
- Streamlit demo → Configuration: reads settings (evidence: `app.py`)
- CLI commands → Configuration: uses settings (evidence: `src/merimee_rag/cli.py`)
- CLI commands → Notice loading: loads corpus (evidence: `src/merimee_rag/cli.py`)
- CLI commands → Index and system: builds index (evidence: `src/merimee_rag/cli.py`)
- Mérimée data → Notice loading: loads notices (evidence: `README.md`)
- Notice loading → Index and system: provides notices (evidence: `src/merimee_rag/store.py`)
- Index and system → Retrievers: builds indexes (evidence: `src/merimee_rag/store.py`)
- Index and system → RAG pipeline: provides chunks (evidence: `app.py`)
- RAG pipeline → Retrievers: searches passages (evidence: `src/merimee_rag/pipeline.py`)
- RAG pipeline → Ollama model: generates answer (evidence: `src/merimee_rag/pipeline.py`)
- Streamlit demo → LLM cache: configures cache (evidence: `app.py`)
- Retrievers → Solr index: queries index (evidence: `README.md`)
- Test-set builder → Notice loading: loads notices (evidence: `eval/build_testset.py`)
- Test-set builder → Ollama model: generates questions (evidence: `eval/build_testset.py`)
- Test-set builder → Evaluation questions: writes questions (evidence: `README.md`)
- Evaluation questions → Retrieval evaluation: evaluates retrieval (evidence: `eval/eval_retrieval.py`)
- Evaluation questions → Generation evaluation: evaluates answers (evidence: `eval/eval_generation.py`)
- Retrieval evaluation → Retrievers: queries systems (evidence: `eval/eval_retrieval.py`)
- Generation evaluation → RAG pipeline: runs configurations (evidence: `eval/eval_generation.py`)
- Generation evaluation → Answer judge: scores answers (evidence: `eval/eval_generation.py`)
- Generation evaluation → Evaluation metrics: computes metrics (evidence: `eval/eval_generation.py`)
- Retrieval evaluation → Evaluation metrics: computes metrics (evidence: `eval/eval_retrieval.py`)
- Evaluation report → Configuration: reads paths (evidence: `eval/report.py`)
