# RAG

Récupère les passages pertinents de documents indexés et répond à la question en s'appuyant dessus.

## Vue d'ensemble

Le nœud RAG (Retrieval-Augmented Generation) charge un ou plusieurs documents, les embed, fait une recherche par similarité sur la requête utilisateur, puis demande à un LLM de répondre en s'appuyant uniquement sur le contexte récupéré. À utiliser pour du Q&A sur base de connaissances, du lookup de politique, ou un chat ancré dans la doc.

À l'exécution :

1. Charge chaque document configuré (PDF, CSV, texte).
2. Embed via OpenAI embeddings, stocke dans un index FAISS mémoire.
3. Récupère les **top-k** passages les plus similaires à la requête.
4. Demande au LLM : "réponds à partir de ce contexte ; si l'info n'y est pas, dis-le."
5. Écrit la réponse dans `last_output`, le texte récupéré dans `ctx.rag_context`, et les métadonnées dans `ctx.rag_sources`.

La requête vient de `data.query`, sinon `input`, sinon `last_output`. `input` est préféré aux labels de classifieur amont (`"sales"`), qui font de mauvaises requêtes.

## Configuration

| Champ | Description |
| --- | --- |
| `documents` | Liste de `{path, originalName}`. PDF, CSV, TXT, MD, JSON. |
| `filePath` | Raccourci document unique (legacy). |
| `query` | Surcharge optionnelle. Vide = `input` / `last_output`. |
| `k` | Top-k de récupération, défaut 4. Plus haut = plus de contexte, plus de tokens. |

## Exemple

Q&A sur un manuel PDF :

```
Webhook → RAG (documents: [handbook.pdf], k: 4) → Respond webhook
```

Dans un pipeline chat agent :

```
Start → RAG (documents: [policies/*]) → Agent (répond avec sources)
```

Les nœuds aval peuvent citer les sources via `ctx.rag_sources` :

```
HTTP Request body: {"answer": "{last_output}", "sources": "{rag_sources}"}
```

## Pièges

- L'index FAISS est reconstruit à chaque run. Pour de gros corpora, hébergez un vector store et appelez-le via **HTTP Request**.
- Seuls les fichiers dans le répertoire d'upload du workspace sont acceptés. Les chemins hors zone sont silencieusement ignorés.
- Les lignes CSV sont embeddées une par une (`col: val | col: val`) — utile pour du lookup structuré, pas pour de la prose.
- Le prompt LLM impose l'ancrage : si le contexte ne contient pas la réponse, le modèle le dit plutôt que d'halluciner. Ne contournez pas sans raison.
- Top-k 4 suffit pour des questions courtes. Montez à 8–12 pour de la synthèse cross-document ; attendez-vous à plus de coût et latence.

---

*Source: https://agentbuilder.systalink.sn/docs/node-rag — human documentation.*
*Other language: [/docs-md/en/node-rag.md](/docs-md/en/node-rag.md).*
*Machine-readable index: [/llms.txt](/llms.txt).*
