30% mniej kosztów RAG dzięki Ettin Reranker i Vercel AI Gateway
Praktyczny, kod-first poradnik: wpinamy Ettin Reranker do RAG w Next.js/TS i łączymy go z cache oraz limitami w Vercel AI Gateway. Mniej tokenów, lepsza trafność — bez zmiany modelu głównego.

Najważniejsze wnioski
- Reranking przed złożeniem kontekstu zwykle tnie prompt tokens o 25–40%.
- Vercel AI Gateway daje natychmiastowy cache i limity bez zmian w kodzie modelu.
- Stabilny prompt (polecenie dla modelu) = wyższy hit-rate cache’u i niższy koszt.
- A/B: porównaj top-8 bez rerank vs top-25 → Ettin top-4; mierz tokens i jakość.
- AEO/GEO: krótkie, jednoznaczne KB + JSON-LD = krótsze i tańsze odpowiedzi.
RAG (Retrieval‑Augmented Generation) to wzorzec, w którym LLM odpowiada na podstawie fragmentów znalezionych w Twojej bazie wiedzy, a nie wyłącznie „z głowy”. Działa, ale kosztuje — najwięcej płacisz za tokeny wrzucane do modelu głównego. Poniżej pokazuję, jak dodać Ettin Reranker (świeża rodzina od Hugging Face) oraz cache i limity Vercel AI Gateway w Next.js/TS, by obciąć o ~30% zużycie tokenów bez zmiany modelu. Krótko, konkretnie, z kodem.
Schemat: gdzie wpiąć Ettin i gdzie realnie oszczędzamy
Główne koszty RAG to długi kontekst. Retrieval zwraca kandydatów na poziomie fragmentów (chunks). Reranker jako cross‑encoder bierze pary (pytanie, fragment), wylicza score trafności dla każdego fragmentu, sortuje malejąco, a my odcinamy top‑N (np. 3–5), ewentualnie deduplikując źródła. Z tych krótkich, najbardziej pasujących fragmentów składamy kontekst z separatorami. Efekt: 25–40% mniej tokenów w prompt i bardziej jednoznaczne odpowiedzi.
Architektura krok po kroku (Next.js/TypeScript):
- 1) Użytkownik wysyła pytanie.
- 2) Retrieval: wektorowe (np. pgvector/Pinecone) + opcjonalnie BM25 → top-20..50 kandydatów.
- 3) Ettin Reranker ocenia pary (pytanie, dokument) → zwraca posortowaną listę.
- 4) Składamy krótki kontekst: np. top-4 fragmenty, każdy ≤ 1000 znaków.
- 5) Budujemy stabilny prompt (polecenie dla modelu) z jasnym stylem i formatem.
- 6) Wywołanie modelu głównego przez Vercel AI Gateway (cache + limity).
- 7) Logujemy usage i odpowiedź, opcjonalnie zapis do analytics.
Integracja Ettin Reranker w Next.js/TypeScript
Reranker to model cross-encoder: przyjmuje (query, dokument), zwraca trafność. Najprościej wywołać go przez Hugging Face Inference (lub własny endpoint). „Trzymaj token po stronie serwera” = przechowuj go jako zmienną środowiskową (Vercel → Project Settings → Environment Variables lub .env.local) i wywołuj Inference API wyłącznie w kodzie serwerowym (Route Handler w app/api/.../route.ts albo Server Action). Nie umieszczaj tokenu w komponentach client ani nie przekazuj go do przeglądarki. Opcjonalnie: ustaw export const runtime = 'nodejs', ogranicz scope tokenu i/lub włącz IP allowlist po stronie HF.
Szkielet w app/api/ask/route.ts (pseudo‑TS, uproszczony):
- // Next.js server-only (Route Handler) – token nie trafia do przeglądarki export const runtime = 'nodejs';
- // 1) Kandydaci z wektorów (przykład interfejsu) const candidates = await retrieveCandidates({ query, topK: 30 });
- // 2) Reranking przez Ettin (HF Inference API) async function rerankWithEttin(query: string, docs: string[], topN = 4) { const res = await fetch('https://api-inference.huggingface.co/models/<ettin-model-id>', { //:
- method: 'POST', headers: { Authorization: `Bearer ${process.env.HF_API_TOKEN}` }, body: JSON.stringify({ query, documents: docs, top_n: topN }) }); // Oczekuj listy { index, score }. Sprawdź schema w karc
- const ranked = await res.json(); return ranked.map((r: any) => ({ text: docs[r.index], score: r.score })); }
- // 3) Użycie const ranked = await rerankWithEttin(query, candidates.map(c => c.text), 4); const context = ranked.map(r => r.text).join('\n---\n');
- // 4) Zwróć dalej do warstwy LLM (patrz kolejna sekcja)
Vercel AI Gateway: cache + limity bez bólu
Gateway wpinamy między aplikację a dostawcę LLM. Dostajemy: cache odpowiedzi, limity tokens/min i budżet, metryki. Najważniejsze: utrzymuj stabilny prompt (polecenie dla modelu) – ten sam system, format i kolejność pól – by cache trafiał częściej.
Konfiguracja (wysoki poziom): w panelu Vercel → AI Gateway → dodaj provider (np. OpenAI), włącz cache (TTL 1–6 h dla pytań do stałej KB), ustaw limity RPM/TPM i budżet USD.
Wywołanie z AI SDK przez Gateway (Next.js/TS):
- import { generateText } from 'ai'; import { openai } from '@ai-sdk/openai'; const llm = openai({ apiKey: process.env.VERCEL_AI_KEY, baseURL: process.env.VERCEL_AI_URL });
- const res = await generateText({ model: llm('gpt-4o-mini'), // dostawca i model mapowane przez Gateway temperature: 0.2, maxTokens: 400, system: 'Odpowiadaj krótko, jednoznacznie. Jeśli brak danych — powiedz w
- prompt: `Kontekst:\n${context}\n\nPytanie: ${query}\n\nOdpowiedz w 5-7 zdaniach.` });
- // res.usage.promptTokens, res.usage.completionTokens → loguj do metryk
Testy A/B: potwierdź spadek kosztu i brak regresji jakości
Zrób mały harness testowy. Zbiór: 50–100 realnych pytań + krótkie referencyjne odpowiedzi (1–3 zdania). Dwie gałęzie:
A) Baseline: retrieval top-8 bez rerankingu. B) Z Ettin: retrieval top-30 → rerank top-4. Zbieraj usage.promptTokens, usage.completionTokens, łączny koszt, czas. Jakość: prosta metryka zawiera/nie zawiera, albo ocena przez tańszy model‑sędzię z rubryką.
Uproszczony szkic runnera (TS): minimalnie:
Jak to zrobić w praktyce (kroki, bez doświadczenia w eksperymentach):
- const variants = { baseline: { topK: 8, rerank: false }, ettin: { topK: 30, rerank: true, topN: 4 } }; for (const v of Object.values(variants)) { const stats = { q: 0, tokens: 0, pass: 0 }; for (const q of dataset) {
- const ctx = await buildContext(q, v); // z lub bez rerank const out = await askLLM(ctx, q); stats.tokens += out.usage.totalTokens; stats.pass += judge(out.text, q.reference) ? 1 : 0; stats.q++;
- } report(v, stats); }
- Oczekiwane: ~25–35% mniej tokenów przy porównywalnym lub lepszym pass-rate. Jeśli spadek <20% – zwiększ liczbę kandydatów do rerankingu lub skróć długość pojedynczego fragmentu.
- 1) Offline: wyłącz cache w Gateway (lub ustaw różne cache keys per wariant), zafiksuj system prompt i seed; uruchamiaj oba warianty na tym samym zbiorze w tej samej kolejności.
- 2) Produkcja: split 50/50 po stabilnym hashu (np. hash(userId + query) % 2). Loguj: wariant, prompt/completion/total tokens, latency P50/P95, koszt, wersja kodu, dokumenty w kontekście.
- 3) Jakość: porównanie pairwise (A vs B) z modelem‑sędzią (np. gpt‑4o‑mini) i rubryką „czy odpowiedź jest poprawna, kompletna i zgodna z KB (tak/nie)”. Dodatkowo policz binarne „pass@1”. 4) Wielkość próby: min. 200 zapyta
AEO/GEO: krótsze odpowiedzi dzięki lepszej KB i JSON-LD
AEO (Answer Engine Optimization) to praktyki przygotowania treści tak, by „silniki odpowiedzi” — LLM-y, Google AI Overviews, Perplexity — mogły łatwo wyekstrahować krótką, jednoznaczną odpowiedź. GEO (Graph/Entity Optimization) to jednoznaczne oznaczanie encji, relacji i źródeł w treści oraz metadanych (np. schema.org), by modele rozumiały kto/co/gdzie/kiedy. Oba podejścia zmniejszają niejednoznaczność, więc model generuje krótsze i tańsze odpowiedzi. Zasady dla KB:
- Chunks 400–700 słów, każdy z unikalnym H3 i datą ISO. - Sekcje FAQ przy każdym artykule (pytanie w trybie użytkownika, odpowiedź w 1–3 zdaniach). - Słowniczek pojęć (jednoznaczne definicje). - Linki kanoniczne i powtarzalny format nagłówków.
Minimalny JSON-LD FAQ (wstaw na stronach KB):
- { "@context": "https://schema.org", "@type": "FAQPage", "mainEntity": [ { "@type": "Question", "name": "Jak zresetować hasło?", "acceptedAnswer": { "@type": "Answer", "text": "Wejdź w Ustawienia → Zmień hasło → Wyś
- ]}] } // skrócono dla czytelności
Połączenie Ettin Reranker i Vercel AI Gateway to szybka wygrana: mniej tokenów, trafniejszy kontekst i kontrola kosztu bez zmiany modelu głównego. Jeśli chcesz, mogę pomóc w 2–3 godzinnym przeglądzie i POC na Twojej bazie wiedzy – z A/B i planem roll‑outu.
Najczęstsze pytania
Czy muszę zmieniać model główny, aby skorzystać z Ettin Reranker?
Nie. Reranker działa przed modelem głównym, selekcjonując kontekst. Wystarczy dodać krok rerankingu i utrzymać dotychczasowy model przez Vercel AI Gateway.
Czy reranker nie spowolni odpowiedzi?
Reranker dodaje krótki, dodatkowy krok oceny fragmentów, więc latencja może minimalnie wzrosnąć. W praktyce zwykle odzyskasz to dzięki krótszemu kontekstowi (mniej tokenów do przetworzenia) i trafieniom cache w Gateway. Zacznij od schematu: pobierz 20–30 kandydatów, wybierz top‑4 krótkie fragmenty. Jeśli latencja nadal przeszkadza, zmniejsz liczbę kandydatów lub hostuj reranker bliżej aplikacji.
Jakie wartości top-k i top-n na start?
Praktycznie: retrieval top-30, Ettin top-4. Jeśli domena jest szeroka, zwiększ top-30 do top-50. Zawsze weryfikuj A/B na własnych danych.
Czy cache w Vercel AI Gateway jest bezpieczny dla dynamicznych danych?
Cache stosuj dla treści stabilnych (KB, regulaminy). Dla danych dynamicznych ustaw krótki TTL lub wyłącz cache. Pamiętaj o anonimizacji promptów z PII.
Czy mogę hostować Ettin on‑prem?
Tak, jeśli model ma licencję do self‑hostingu. Wtedy wywołujesz własny endpoint zamiast Inference API. Gateway dalej obsługuje tylko model główny.