Stack IA¶
AKKO embarque une couche IA-native complète qui tourne 100 % dans le cluster. Aucun appel OpenAI, Anthropic, Bedrock ou service externe d'embedding. Chaque modèle vit à côté de vos données.
Topologie¶
flowchart TB
subgraph Interfaces[Interfaces utilisateur et agents]
direction LR
COCK[Chat Cockpit<br/>/api/cockpit/aden]
JH[JupyterHub<br/>jupyter-ai]
CLAUDE[Claude Desktop<br/>Cursor, VS Code]
SQL[Client SQL<br/>Trino CLI, DBeaver]
end
subgraph Sovereign[Couche IA souveraine]
direction TB
ADEN[ADEN<br/>FastAPI + Streamlit]
MCPT[MCP Trino<br/>8 outils]
MCPO[MCP OpenMetadata<br/>catalogue et lignage]
TPL[Plugin Trino AI<br/>17 UDF ai_*]
AIS[AI Service<br/>FastAPI]
RAG[Pipeline RAG<br/>pgvector + Ollama]
end
subgraph Gateway[Passerelle d'inférence]
LLM[LiteLLM<br/>compatible OpenAI]
OLL[Ollama<br/>qwen2.5-coder:7b<br/>qwen2.5:3b<br/>nomic-embed-text]
VLLM[vLLM<br/>backend GPU optionnel]
end
subgraph Data[Plan de données]
TRINO[Trino 480]
OM[OpenMetadata]
PG[(PostgreSQL<br/>pgvector)]
MLF[MLflow<br/>registre de modèles]
end
COCK --> ADEN
JH --> AIS
JH --> MLF
CLAUDE --> MCPT
CLAUDE --> MCPO
SQL --> TRINO
TRINO --> TPL
TPL --> AIS
ADEN --> OM
ADEN --> TRINO
ADEN --> LLM
MCPT --> TRINO
MCPT --> AIS
MCPO --> OM
AIS --> LLM
RAG --> PG
RAG --> LLM
LLM --> OLL
LLM -.optionnel.-> VLLM
Cartographie des composants¶
| Composant | Rôle | Doc |
|---|---|---|
| ADEN | Question en langage naturel -> SQL -> Trino -> dashboard Streamlit | IA / ADEN |
| Plugin Trino AI | 17 UDF scalaires ai_* dans la JVM Trino |
IA / Fonctions Trino |
| AI Service | Backend FastAPI appelé par le plugin Trino (sentiment, classify, summarize, embed, translate, entities) | Services / AI Service |
| Pipeline RAG | pgvector + nomic-embed-text + Ollama, notebook de démo | IA / Pipeline RAG |
| Serveurs MCP | Trino (8 outils) + OpenMetadata (catalogue, lignage) pour agents IA | IA / Serveurs MCP |
| LiteLLM | Passerelle compatible OpenAI, clés multi-tenants | Services / LiteLLM |
| Ollama | Inférence LLM locale (CPU / GPU) | Services / Ollama |
| vLLM | Backend GPU optionnel pour plus de throughput | Services / vLLM |
| MLflow | Tracking d'expérimentations, registre de modèles, artefacts sur SeaweedFS | Services / MLflow |
| jupyter-ai | Assistant IA dans le notebook connecté à LiteLLM | Services / JupyterHub |
Cycle de vie d'une requête ADEN¶
sequenceDiagram
participant U as Utilisateur (Cockpit)
participant A as ADEN
participant OM as OpenMetadata
participant OPA as OPA
participant L as LiteLLM / Ollama
participant T as Trino
participant S as Streamlit
U->>A: POST /ask {question, session_id}
A->>OM: rechercher tables candidates (top N)
A->>OPA: allow(user, role, table) par candidate
OPA-->>A: sous-ensemble autorisé
A->>L: prompt (système + tables + historique)
L-->>A: SQL candidat
A->>A: validation sqlglot + denylist + LIMIT 10000
A->>T: EXPLAIN (TYPE IO)
T-->>A: bytes_estimate
alt estimation > cost gate
A-->>U: 413 (confirm_cost=true pour forcer)
else sous le seuil
A->>T: exécuter avec jeton OAuth utilisateur
T-->>A: lignes
A->>A: masquer colonnes PII via tags OM
A->>S: publier dashboard dans PVC
A-->>U: 200 {dashboard_url, sql, session_id}
end
Fonctions ai_* Trino — IA dans le SQL¶
SELECT id,
akko_ai_sentiment(comment) AS sentiment,
akko_ai_classify(comment, 'fraud,retention,support') AS topic,
akko_ai_pii(comment) AS redacted,
akko_ai_embed(comment) AS vector
FROM iceberg.banking.transactions
WHERE ts > current_date - INTERVAL '7' DAY;
25 fonctions au total — 20 fonctions d'analyse (sentiment, classification, pii, sql, keywords, language, entities, risk, anomaly, embed, similarity, search, summarize, translate, ask, sensitivity, ocr, parse_document, transcribe, describe_image) + 5 helpers d'administration (cache_clear, cb_reset, stats, health, version). Voir Fonctions Trino pour la liste complète, les signatures et les notes de performance. Lancer bash scripts/check-ai-functions-count.sh pour vérifier le décompte vivant contre la doc.
Pipeline RAG — Embeddings locaux + récupération¶
flowchart LR
DOCS[Docs / PDF<br/>KB client] --> CHUNK[Chunker<br/>LangChain]
CHUNK --> EMB[Ollama<br/>nomic-embed-text<br/>768 dims]
EMB --> PG[(PostgreSQL<br/>pgvector)]
Q[Question utilisateur] --> EMBQ[Ollama<br/>nomic-embed-text]
EMBQ --> SEARCH[pgvector<br/>cosine top-k]
PG --> SEARCH
SEARCH --> CTX[Contexte<br/>top 5 chunks]
CTX --> LLM[Ollama<br/>qwen2.5:3b]
Q --> LLM
LLM --> ANS[Reponse]
Voir le guide complet dans Pipeline RAG et le notebook notebooks/rag-pipeline-demo.ipynb.
Checklist de souveraineté¶
| Garantie | Comment |
|---|---|
| Aucun appel externe | LiteLLM ne route que vers Ollama / vLLM ; egress bloqué par NetworkPolicies en production |
| Provenance des modèles | Modèles tirés à l'installation par ollama-init ; hashes pinnés |
| Inférence reproductible | temperature=0 par défaut dans ADEN, seed dans les notebooks |
| RBAC sur les modèles | Clés virtuelles LiteLLM par rôle Keycloak (voir RBAC LLM) |
| Observabilité | aden_query_duration_seconds, JMX ai_stats(), dashboards Grafana |