Aller au contenu

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

Liens