fix(rag): ubatch=2048 pour llama-embed + retry rag-ingest + nettoie defaults rag

L'instance llama-embed (:1238) tournait avec l'ubatch llama.cpp par défaut (512).
En mode --embeddings + pooling, toute l'entrée doit tenir dans un seul ubatch →
tout chunk > 512 tokens échouait en HTTP 500 « input too large to process.
increase the physical batch size ». ~46 chunks du RAG (CHUNK_MAX=2000 chars ≈
700 tokens) n'étaient pas indexés.

- llama_server : ajoute llama_embed_ubatch_size (2048 = ctx) + flags
  --batch-size/--ubatch-size dans le template llama-embed.service.
- rag-ingest : retry (5×, backoff) sur erreurs transitoires 5xx/réseau de l'embed.
- rag/defaults : aligne embed_url/embed_model sur nomic :1238 (étaient des vars
  mortes pointant encore qwen3-8b :1234 — trompeuses).

Résultat : ré-ingestion 436/436 chunks, 0 erreur.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
alkatrazz 2026-06-21 22:47:18 +02:00
parent f0e33c1121
commit 417d49c1ea
4 changed files with 30 additions and 4 deletions

View file

@ -3,6 +3,10 @@ rag_data_dir: /srv/data/rag
rag_docs_dir: /srv/data/rag/docs
qdrant_url: "http://127.0.0.1:6333"
embed_url: "http://192.168.10.20:1234/v1/embeddings"
embed_model: "qwen3-8b"
# Embeddings : instance dédiée nomic-embed-text (gpu-01 :1238, dim 768), pas le modèle de chat.
# NB : ces deux vars ne sont PAS injectées dans les scripts (le handler lance rag-ingest sans env) —
# les scripts files/rag-ingest et files/rag-query hardcodent ces mêmes valeurs par défaut.
# Conservées ici pour documenter la cible et éviter toute régression vers qwen3-8b/:1234.
embed_url: "http://192.168.10.20:1238/v1/embeddings"
embed_model: "nomic-embed-text"
rag_collection: "funk-docs"

View file

@ -7,6 +7,7 @@ Usage: rag-ingest [docs_dir]
import os
import sys
import json
import time
import hashlib
import re
import urllib.request
@ -57,8 +58,22 @@ def ensure_collection():
def embed(text):
result = _request("POST", EMBED_URL, {"model": EMBED_MODEL, "input": text})
return result["data"][0]["embedding"]
# L'instance llama-embed (:1238) renvoie occasionnellement des 500 transitoires sous charge
# soutenue (slot saturé) → retry avec backoff. Les chunks sont bornés (CHUNK_MAX=2000) donc
# un 500 n'est pas dû à un dépassement de contexte.
last = None
for attempt in range(5):
try:
result = _request("POST", EMBED_URL, {"model": EMBED_MODEL, "input": text})
return result["data"][0]["embedding"]
except (urllib.error.HTTPError, urllib.error.URLError) as e:
last = e
code = getattr(e, "code", None)
# Ne réessaie que sur erreurs transitoires (5xx) ou réseau
if code is not None and code < 500:
raise
time.sleep(0.5 * (attempt + 1))
raise last
def chunk_markdown(rel_path, content):