Atsparaus kelių teikėjų dirbtinio intelekto maršruto parinkimo sluoksnio kūrimas su Vercel AI SDK
Praktinis gidas, kaip sukurti gamybinio lygio LLM maršruto parinkimo sluoksnį su automatiniu trikčių šalinimu (failover), atsarginiais modeliais ir struktūrizuota Zod išvestimi naudojant Vercel AI SDK.

Diegiant didelius kalbos modelius (LLM) gamybinėje aplinkoje, patikimumas dažnai tampa didžiausia kliūtimi. Pasikliavimas vienu modelio teikėju sukelia vieno gedimo taško riziką: API užklausų ribojimus (HTTP 429), laikinus paslaugos sutrikimus (HTTP 500/503) arba staigius vėlavimo šuolius.
Siekdamos užtikrinti nepertraukiamą veikimą ir sąnaudų efektyvumą, komandos turi sukurti dinaminį maršruto parinkimo sluoksnį, kuris pagal įvesties parametrus galėtų automatiškai persijungti į atsarginius modelius arba pakeisti teikėjus.
Šiame gide įdiegsime atsparų, tipams saugų kelių teikėjų maršruto parinkimo sluoksnį, naudodami Vercel AI SDK ir Zod.
LLM atsparumo architektūra
Atsparus maršruto parinkimo sluoksnis veikia remiantis trimis pagrindiniais principais:
- Nuoseklus trikčių šalinimas (Failover): jei pirminis teikėjas patiria gedimą, sistema automatiškai bando įvykdyti užklausą naudodama antrinį teikėją.
- Dinaminis pasirinkimas: trumpos užklausos siunčiamos greitiems, nebrangiems modeliams, o didesnės įvestys nukreipiamos į plataus konteksto modelius.
- Tipams saugi validacija: nepriklausomai nuo to, kuris modelis apdoroja užklausą, išvesties schema išlieka identiška ir patvirtinta.
+-------------------+
| Incoming Request |
+-------------------+
|
v
+-----------------------+
| Dynamic Route Selector|
+-----------------------+
/ \
(Short Input) (Long Input)
/ \
v v
+-----------------+ +-----------------+
| Primary Model | | Primary Model |
| (OpenAI Luna) | | (Gemini-3.1-Pro)|
+-----------------+ +-----------------+
| |
(On Failure) (On Failure)
v v
+-----------------+ +-----------------+
| Fallback Model | | Fallback Model |
| (Gemini-3.5-Fl) | | (Claude-Sonnet5)|
+-----------------+ +-----------------+
\ /
\ /
v v
+-------------------------+
| Zod Schema Validation |
+-------------------------+
|
v
+-------------------+
| Validated Output |
+-------------------+Atsarginių variantų (Fallbacks) diegimas su Vercel AI SDK
Vercel AI SDK turi integruotą fallback apvalkalą, kuris leidžia nurodyti prioritetinį modelių sąrašą. Jei pirmasis modelis patiria gedimą, SDK automatiškai bando dar kartą, naudodamas kitus masyvo modelius.
Štai kaip galite inicijuoti atsparų modelį su atsarginiais teikėjais:
import { fallback } from 'ai';
import { openai } from '@ai-sdk/openai';
import { google } from '@ai-sdk/google';
import { anthropic } from '@ai-sdk/anthropic';
// Initialize a resilient model that crosses three distinct providers
export const resilientModel = fallback([
openai('terra'),
anthropic('claude-sonnet-5'),
google('gemini-3.1-pro')
]);Kai iškviečiate generateText arba generateObject su resilientModel, SDK automatiškai valdo klaidas, laiko limitus ir pakartotinius bandymus.
Vietiniai atsarginiai variantai su Ollama
Siekdami užtikrinti veikimą neprisijungus, hibridinėse aplinkose arba nemokamą vykdymą vietinių bandymų metu, galite integruoti vietiniu būdu priglobtus modelius naudodami Ollama. Vercel AI SDK vertina Ollama modelius kaip pirmos klasės teikėjus, leisdamas tiesiogiai pereiti nuo debesų API prie vietinės aparatinės įrangos (vietinio silicio).
Štai kaip sukonfigūruoti hibridinį debesų ir vietinį atsarginį variantą:
import { fallback } from 'ai';
import { openai } from '@ai-sdk/openai';
import { ollama } from '@ai-sdk/ollama';
// Fallback to a locally hosted Llama 4 Scout model if the OpenAI API is unreachable
export const hybridModel = fallback([
openai('luna'),
ollama('llama4-scout')
]);Tipams saugus struktūrizuotų duomenų išgavimas
Vienas iš kelių teikėjų maršruto parinkimo iššūkių yra užtikrinti, kad skirtingi modeliai laikytųsi tiksliai tos pačios išvesties struktūros. Zod naudojimas su generateObject API išsprendžia šią problemą.
Apibrėžkime schemą, skirtą struktūrizuotiems metaduomenims išgauti iš kūrėjų profilių:
import { generateObject } from 'ai';
import { z } from 'zod';
import { resilientModel } from './models';
const ProfileSchema = z.object({
fullName: z.string(),
skills: z.array(z.string()),
yearsOfExperience: z.number(),
certifications: z.array(
z.object({
name: z.string(),
issuer: z.string()
})
)
});
export async function extractProfile(text: string) {
try {
const { object } = await generateObject({
model: resilientModel,
schema: ProfileSchema,
prompt: `Extract structured profile details from the following resume text:\n\n${text}`
});
return object;
} catch (error) {
console.error('Failed to extract profile after exhausting all fallbacks:', error);
throw new Error('Profile extraction failed');
}
}Kadangi išvestis yra analizuojama ir patvirtinama Zod vykdymo metu, jūsų programos kodas gali drąsiai pasikliauti grąžinta struktūra, nepriklausomai nuo to, kuris atsarginės grandinės modelis buvo sėkmingas.
Dinaminis maršruto parinkimas pagal konteksto dydžio
Nors nuoseklūs atsarginiai variantai apsaugo nuo prastovų, jie neoptimizuoja sąnaudų ar žetonų (tokens) ribų. Pavyzdžiui, siųsti 100 000 žetonų dokumentą modeliui, kurio riba yra 128 000 žetonų, yra visiškai normalu, tačiau siunčiant jį modeliui su 16 000 žetonų riba, iškart kils klaida.
Galime sukurti dinaminį maršrutizatorių, kuris patikrina įvesties dydį prieš parinkdamas modelių grandinę:
import { LanguageModel, generateText } from 'ai';
import { openai } from '@ai-sdk/openai';
import { google } from '@ai-sdk/google';
import { anthropic } from '@ai-sdk/anthropic';
// Define specialized model chains
const standardChain = fallback([
openai('luna'),
google('gemini-3.5-flash')
]);
const highContextChain = fallback([
google('gemini-3.1-pro'),
anthropic('claude-sonnet-5')
]);
// Estimate token count (simple word-count approximation for demo)
function estimateTokens(text: string): number {
return text.trim().split(/\s+/).length * 1.3;
}
export async function smartRouteRequest(promptText: string) {
const tokenEstimate = estimateTokens(promptText);
// Route to the appropriate chain based on input size
const model = tokenEstimate > 50000 ? highContextChain : standardChain;
return generateText({
model,
prompt: promptText
});
}Šis šablonas padeda išlaikyti mažas sąnaudas, nukreipiant standartines užduotis nebrangiems ir greitiems modeliams, o aukščiausios klasės modelius su didesniais konteksto langais pasiliekant sunkioms užklausoms.
Telemetrija ir stebėjimas (Observability)
Siekdami stebėti, kaip dažnai jūsų maršruto parinkimo sluoksnis suaktyvina atsarginius modelius, galite pasinaudoti eksperimentinėmis Vercel AI SDK telemetrijos funkcijomis. Tai renka žetonų naudojimo, vėlavimo ir teikėjų sėkmės rodiklių metrikas:
import { generateText } from 'ai';
import { resilientModel } from './models';
const response = await generateText({
model: resilientModel,
prompt: 'Analyze this log output...',
experimental_telemetry: {
isEnabled: true,
functionId: 'analyze-logs',
metadata: {
environment: 'production'
}
}
});Šie pėdsakai yra surenkami standartiniuose OpenTelemetry rinktuvuose, suteikiant jūsų komandai visišką matomumą apie trikčių šalinimą ir teikėjų būseną.
Išvados ir kompromisai
Kelių teikėjų maršruto parinkimo sluoksnis padidina patikimumą. Tačiau svarbu apsvarstyti tam tikrus kompromisus:
- Stiliaus skirtumai: atsarginiai modeliai gali pasižymėti skirtingu rašymo stiliu, formatavimo niuansais ar atitikties savybėmis.
- Šaltasis paleidimas (Cold Starts): nepavykusios užklausos pakartojimas su antriniu modeliu padidina vėlavimą vartotojui.
- Teikėjų API raktai: jūsų infrastruktūra turi sukonfigūruoti ir palaikyti API raktus, užklausų limitų lygius ir atsiskaitymo paskyras keliuose teikėjuose.
Naudodami Vercel AI SDK vieningas API sąsajas, galite sukurti itin atsparią maršruto parinkimo architektūrą, apsaugančią jūsų gamybines programas nuo atskirų teikėjų prastovų.