Mistral â đ IntĂ©grations & API
Inference Engine (C++/CUDA) · Serving REST/gRPC & containers · Orchestration RAG (LangChain/LlamaIndex) · Plugins / Tool Calling. Modales ultra-densifiées : schémas, tableaux, snippets, checklists Dev/Ops.
OpenAI-compatible Tokens/s & latence RAG & tools sûrs
Glossaire express
- vLLM : moteur inférence OpenAI-like + KV cache paginé.
- FasterTransformer : kernels C++/CUDA optimisés.
- TensorRT-LLM : graph optim & builder TensorRT.
- OpenAI-compat : API /v1/chat.completions & functions.
- Streaming : SSE ou gRPC streams (tokens incrémentaux).
- LangChain : chaĂźnes/agents/outils modulaires.
- LlamaIndex : index + routing + citations RAG.
- Tool calling : fonctions typées appelées par le LLM.
- p50/p95/p99 : latences médiane/haut percentiles.
- Canary : déploiement fractionné sécurisé.
Inference Engine â C++/CUDA (vLLM, FasterTransformer, TensorRT-LLM)
Comparatif rapide
| Moteur | Points forts | Limites | Quand lâutiliser |
|---|---|---|---|
| vLLM | OpenAI-compat, KV cache paginé, batching dynamique | Build GPU requis | Serving général, multi-tenants |
| FasterTransformer | Kernels C++/CUDA, perfs stables | Moins âplug&playâ | IntĂ©gration bas-niveau |
| TensorRT-LLM | Optim graph & kernels TensorRT | Build/engine step | GPU NV hautes perfs |
vLLM â OpenAI-compatible
python -m vllm.entrypoints.openai.api_server \
--model mistralai/Mistral-7B-Instruct-v0.3 \
--tensor-parallel-size 2 --max-model-len 32768 \
--gpu-memory-utilization 0.92# Appel client (Python)
from openai import OpenAI
client = OpenAI(base_url="http://HOST:PORT/v1", api_key="dummy")
client.chat.completions.create(model="mistral", messages=[{"role":"user","content":"Bonjour"}])Bonnes pratiques
- Activer paged KV cache, adapter max_model_len.
- Quantization prudente (8-bit) + canary FP16.
- Profiler : tokens/s, VRAM, latence p95/p99, OOM tardifs.
Throughput â (batch_effectif Ă tokens_sorts) / latence_step
MĂ©moire â poids + KV(T Ă d Ă nb_tĂȘtes) + activation (si non purged)
Tip : pour prompts longs, préférer long-context + RAG ciblé plutÎt que w=inf ; mesurer la qualité vs latence.
Serving â REST, gRPC, Containers, Autoscaling
REST (FastAPI â streaming SSE)
@app.post("/v1/chat/completions")
async def chat(req: ChatReq):
async with sse_response() as stream:
async for token in llm.stream(req):
await stream.send({"delta": token})
return {"finish_reason":"stop"}gRPC (proto â extrait)
service LLM {
rpc ChatStream(ChatReq) returns (stream ChatChunk);
}
message ChatReq { repeated Message messages = 1; string model = 2; }
message ChatChunk { string delta = 1; bool end = 2; }Conteneurs
# Dockerfile (extrait)
FROM nvidia/cuda:12.2.0-runtime
RUN pip install vllm fastapi uvicorn
CMD ["python","-m","vllm.entrypoints.openai.api_server","--model","mistralai/Mistral-7B-Instruct"]K8s (extraits)
# Deployment
spec:
template:
spec:
containers:
- name: vllm
image: registry/vllm:latest
resources: {limits: {nvidia.com/gpu: 1}}
---
# HPA (QPS/tokens/s métrique custom)Sécurité & quotas
- Auth Bearer + rate-limit (clé/par org).
- CORS restrictif, request/response size limits.
- Quota par modĂšle, âmax_new_tokensâ et âfrequency penaltyâ.
Tip : exposer également un endpoint
/v1/embeddings pour RAG & dĂ©tection de doublons ; mettre un cache de rĂ©ponses (hash prompt+ctx).Orchestration & RAG â LangChain / LlamaIndex
RAG : Docs â Split â Embed â Index â Retrieve (k) â Re-rank â Prompt (citations) â LLM â Post (schema/guardrails)
LangChain (ex.)
from langchain_openai import ChatOpenAI, OpenAIEmbeddings
from langchain.vectorstores import FAISS
from langchain.chains import RetrievalQA
llm = ChatOpenAI(base_url="http://HOST:PORT/v1", api_key="x", model="mistral")
emb = OpenAIEmbeddings(base_url="http://HOST:PORT/v1", api_key="x", model="mistral-embed")
vs = FAISS.from_texts(texts, emb)
qa = RetrievalQA.from_chain_type(llm=llm, retriever=vs.as_retriever(k=5))
qa({"query":"Quelles sont les étapes du pipeline ?"})LlamaIndex (ex.)
from llama_index.core import VectorStoreIndex, SimpleDirectoryReader
from llama_index.llms.openai import OpenAI
docs = SimpleDirectoryReader("docs").load_data()
index = VectorStoreIndex.from_documents(docs, embed_model="openai")
resp = index.as_query_engine(llm=OpenAI(base_url="http://HOST:PORT/v1", api_key="x")).query("...")Bonnes pratiques RAG
- Split 500â1500 tok, overlap 10â20 %, titres informatifs.
- Re-rank (BM25/bi-encoder) avant prompt.
- Afficher citations (URL, date) + groundedness.
Prompt RAG (JSON schema)
<policy>Réponds uniquement si justifié par les PASSAGES.</policy>
<format>{"answer":"...","citations":[{"url":"...","title":"..."}]}</format>Anti-patterns
- Pas de normalisation dâURL/dates â citations incohĂ©rentes.
- Top-k trop Ă©levĂ© â bruit & coĂ»ts â.
- Absence de cache embeddings/index (coûts récurrents).
Tip : journaliser les IDs de passages utilisés pour chaque réponse et leur contribution au score.
Plugins / Tool Calling â fonctions typĂ©es & sandbox
Déclarer une fonction
{
"type":"function","function":{
"name":"search_news",
"description":"Recherche d'articles",
"parameters":{
"type":"object","properties":{"q":{"type":"string"}}, "required":["q"]
}}}Cycle dâappel
- LLM propose tool_call + arguments JSON.
- Orchestrateur exécute dans une sandbox (allow-list, timeouts).
- Résultat renvoyé comme message tool au LLM (réponse finale).
Sécurité
- Allow-list stricte des outils + scopes limités.
- Quota & timeouts par outil ; pas dâaccĂšs rĂ©seau brut.
- Audit des appels (inputs/outputs hashés).
Exécution (pseudo FastAPI)
if tool_call:
if tool_call.name not in ALLOW: refuse()
result = run_in_sandbox(tool_call.name, tool_call.args)
messages += [{"role":"tool","name":tool_call.name,"content":serialize(result)}]
return llm(messages)Anti-patterns
- Outils non idempotents â effets indĂ©sirables.
- Fuite de secrets dans arguments/tools.
- Absence de validations JSON Schema cÎté serveur.
Tip : logger les tool_failures sĂ©parĂ©ment pour lâobservabilitĂ© et la remĂ©diation (retries, backoff).
Observability & CoĂ»ts â mĂ©triques, traces, logs
Métriques clés
| Métrique | Description | Cible |
|---|---|---|
| latency_p50/p95/p99 | temps de réponse | SLA-dépendant |
| tokens_in/out | volume par requĂȘte | observĂ© |
| throughput | tokens/s | >= objectif |
| cost_per_1k_tok | coĂ»t unitaire | â continu |
| refusal_rate | refus sûrs | cohérent policy |
Export (Prometheus)
llm_latency_seconds_bucket{model="mistral",le="0.5"} 42
llm_tokens_total{type="in"} 123456
llm_cost_per_1k_tok{env="prod"} 0.0042Traces (OpenTelemetry)
Span: chat.completions
ââ attr: model, temp, top_p, max_new_tokens
ââ event: retrieval (k, time, sources)
ââ event: moderation (scores)Logs & PII
- Hash/masquer PII, TTL configurable.
- Redact prompts/contexte sensibles.
- AccĂšs restreint (RBAC) & audit.
Budgets
cost â (tok_in + tok_out) Ă prix_tok + stockage + egress
alerte si coĂ»t/jour > budget Ă (1+ÎŽ)Tip : construire une âcarteâ coĂ»tâfeature : quels paramĂštres (k RAG, top-p, max_new_tokens) impactent le plus vos coĂ»ts.
DĂ©ploiement & Patterns â Docker/K8s, A/B, canary, cache, SLA
Patterns:
(1) Single-tenant (sĂ©curitĂ©â, coĂ»tâ) (2) Multi-tenant (batching, coĂ»tâ) (3) Edge (latenceâ, contraintes VRAM)
Cache & idempotence
# Clé = hash(model, params, prompt, ctx_ids)
resp = cache.get(key) or compute_and_set(key, ttl=300)- ETag cÎté client pour réutilisation.
- Cache embeddings pour RAG.
A/B & canary
router:
v1: 90% â modĂšle A (rĂ©fĂ©rence)
v2: 10% â modĂšle B (nouvelle version)- Tracker : win-rate, rĂ©gressions (golden set online).
SLO/SLA
| Indicateur | SLO | Action |
|---|---|---|
| p95 latence | < 2s | Augmenter TP/PP, batch, cache |
| Erreur 5xx | < 0.5% | Backoff, retry, circuit-breaker |
| CoĂ»t/1k tok | â5%/mois | Quantization/INT8, RAG kâ |
CD (extrait)
- build: docker image
- test: CI (golden set, red-team)
- deploy: canary 10%
- observe: p95, refus, coûts
- promote: 100% si OKAnti-patterns
- Routage statique â aucun rollback instantanĂ©.
- Pas de quotas â abus multi-tenant.
- Logs non nettoyĂ©s â risques PII & coĂ»t stockage.
Tip : conserver une rĂ©fĂ©rence (modĂšle + prompt) prĂȘte pour rollback automatique en cas de dĂ©viation des mĂ©triques.
