Projektowanie systemu GenAI: podstawy i architektury dla zastosowań produkcyjnych
Próbujesz zintegrować LLM ze swoją aplikacją i zastanawiasz się, czy zrobić RAG, dostroić, czy po prostu poprawić podpowiedzi? Nie jesteś sam: według analizy do 2024 r 73% wdrożeń GenAI w przedsiębiorstwo upada w ciągu sześciu miesięcy, głównie z powodu błędnych wyborów architektonicznych w poszczególnych fazach inicjały projektu. Problemem nie jest model: wiele zespołów najpierw wybiera technologię zrozumieć problem.
Ten przewodnik zapewnia praktyczne ramy decyzyjne dotyczące projektowania systemów GenAI w produkcji, obejmujące podstawowe architektury — RAG, dostrajanie, szybka inżynieria — oraz kryteria wyboru podejścia odpowiedni dla konkretnego przypadku użycia.
Czego się nauczysz
- Trzy podstawowe architektury: RAG, dostrajanie i szybka inżynieria
- Ramy decyzyjne: kiedy zastosować każde podejście
- Architektury systemowe dla aplikacji GenAI w środowisku produkcyjnym
- Stos technologii 2026: LangChain, LlamaIndex, vLLM
- Typowe wzorce i antywzorce, których należy unikać
- Metryki jakości do oceny systemu RAG
Problem 73%: dlaczego wdrożenia GenAI kończą się niepowodzeniem
Zanim zajmiesz się architekturą, ważne jest, aby zrozumieć, dlaczego tak wiele projektów kończy się niepowodzeniem. Przyczyny główne z nich zidentyfikowane podczas post-mortem po wdrożeniu w przedsiębiorstwie to:
- Niekontrolowana halucynacja: model generuje prawdopodobne, ale fałszywe odpowiedzi i żadnych wdrożono system walidacji
- Niedopuszczalne opóźnienie:p99 dłużej niż 3-5 sekund w przypadku zapytań, których oczekuje użytkownik szybko
- Koszty materiałów wybuchowych: brak kalkulacji kosztu zapytania przed uruchomieniem, następnie budżet spala się w ciągu tygodni
- Niezarządzana granica wiedzy: Model nie zna aktualnych ani prywatnych danych firmy
- Brak identyfikowalności: nie wiadomo, na jakich dokumentach opiera się dany dokument reakcja (krytyczna w kontekstach regulowanych)
Każda architektura, której się przyjrzymy, rozwiązuje niektóre z tych problemów lepiej niż inne. Znając kompromis umożliwia projektowanie solidnych systemów od samego początku.
Trzy podstawowe architektury
1. Szybka inżynieria
Punkt wyjścia dla każdego systemu GenAI: ustrukturyzuj zachętę, w kierunku której poprowadzi model żądane wyjście. Kluczowe techniki w 2026 roku:
- Podpowiadanie o kilku strzałach: Podaj przykłady wejść i wyjść w wierszu poleceń
- Łańcuch myślowy (CoT): poproś modelkę, aby najpierw pomyślała krok po kroku odpowiedzieć
- Monit systemowy: Zdefiniuj zachowanie i kontekst modelu
- Ustrukturyzowane dane wyjściowe: Wymusza format wyjściowy JSON lub XML w celu niezawodnego analizowania
# Esempio: prompt engineering con structured output
import json
from openai import OpenAI
client = OpenAI()
def analyze_ticket(ticket_text: str) -> dict:
response = client.chat.completions.create(
model="gpt-4o",
messages=[
{
"role": "system",
"content": """Sei un sistema di triage per ticket di supporto.
Analizza il ticket e restituisci JSON con:
- priority: "high" | "medium" | "low"
- category: "bug" | "feature" | "question"
- sentiment: "frustrated" | "neutral" | "positive"
- estimated_resolution_hours: numero intero"""
},
{
"role": "user",
"content": f"Ticket: {ticket_text}"
}
],
response_format={"type": "json_object"}
)
return json.loads(response.choices[0].message.content)
# Uso
result = analyze_ticket("Il mio account e bloccato da ieri, non riesco ad accedere!")
# {"priority": "high", "category": "bug", "sentiment": "frustrated", ...}
Kiedy go używać: proste i dobrze zdefiniowane przypadki, szybkie prototypowanie, gdy nie masz dane prywatne do integracji, a model podstawowy zna już domenę.
Limity: nie działa z najnowszymi lub zastrzeżonymi danymi, halucynacje na temat faktów konkretny, koszt proporcjonalny do długości kontekstu.
2. RAG — pokolenie wzmocnione odzyskiwaniem
RAG rozwiązuje problem braku wiedzy i prywatnych danych: zamiast polegać wyłącznie na znajomość modelu, wyszukuje odpowiednie dokumenty z bazy danych i umieszcza je w kontekście przed pokoleniem.
Podstawowa architektura systemu RAG składa się z czterech faz:
- Indeksowanie: Dokumenty są dzielone na fragmenty konwertowane na wektory osadzania i zapisane w bazie danych wektorowych
- Wyszukiwanie: zapytanie użytkownika jest konwertowane na tę samą przestrzeń osadzania odzyskiwane są najbardziej podobne fragmenty
- Powiększenie: Pobrane fragmenty są wstawiane do zachęty jako kontekst
- Generacja: LLM generuje odpowiedź na podstawie dostarczonego kontekstu
# RAG minimo funzionante con LangChain e Qdrant
from langchain_openai import ChatOpenAI, OpenAIEmbeddings
from langchain_qdrant import QdrantVectorStore
from langchain.chains import RetrievalQA
from langchain_community.document_loaders import PyPDFLoader
from langchain.text_splitter import RecursiveCharacterTextSplitter
# 1. Carica e chunka i documenti
loader = PyPDFLoader("manuale_prodotto.pdf")
docs = loader.load()
splitter = RecursiveCharacterTextSplitter(
chunk_size=512,
chunk_overlap=64
)
chunks = splitter.split_documents(docs)
# 2. Crea il vector store
embeddings = OpenAIEmbeddings(model="text-embedding-3-small")
vectorstore = QdrantVectorStore.from_documents(
documents=chunks,
embedding=embeddings,
url="http://localhost:6333",
collection_name="manuale_prodotto"
)
# 3. Crea la chain RAG
llm = ChatOpenAI(model="gpt-4o-mini", temperature=0)
retriever = vectorstore.as_retriever(search_kwargs={"k": 5})
rag_chain = RetrievalQA.from_chain_type(
llm=llm,
chain_type="stuff",
retriever=retriever,
return_source_documents=True
)
# 4. Query
result = rag_chain.invoke({"query": "Come configuro le notifiche email?"})
print(result["result"])
# La risposta cita i documenti recuperati, non inventa
Kiedy go używać: baza wiedzy firmy, dokumentacja techniczna, FAQ, dowolne przypadku, gdy odpowiedź musi opierać się na konkretnych i możliwych do prześledzenia dokumentach.
Limity: jakość zależna od jakości pobierania, dodatkowe opóźnienie, koszty infrastruktury.
3. Dostrajanie
Dostrajanie dostosowuje zachowanie modelu poprzez dodatkowe szkolenie na danych specyficzne dla domeny. W roku 2026 dominującym paradygmatem jest Dostrajanie efektywne pod względem parametrów (PEFT) z technikami takimi jak LoRA i QLoRA, które umożliwiają szkolenie na sprzęcie konsumenckim.
# Fine-tuning con LoRA usando transformers e PEFT
from transformers import AutoModelForCausalLM, AutoTokenizer
from peft import LoraConfig, get_peft_model, TaskType
import torch
model_name = "meta-llama/Llama-3.1-8B-Instruct"
tokenizer = AutoTokenizer.from_pretrained(model_name)
model = AutoModelForCausalLM.from_pretrained(
model_name,
torch_dtype=torch.bfloat16,
device_map="auto"
)
# Configurazione LoRA: adatta solo il 0.1% dei parametri
lora_config = LoraConfig(
task_type=TaskType.CAUSAL_LM,
r=16, # rank della matrice di adattamento
lora_alpha=32, # scaling factor
lora_dropout=0.1,
target_modules=["q_proj", "v_proj", "k_proj", "o_proj"]
)
model = get_peft_model(model, lora_config)
model.print_trainable_parameters()
# trainable params: 6,815,744 || all params: 8,037,191,680
# trainable%: 0.0848%
Kiedy go używać: Jeśli masz tysiące przykładów szkoleniowych, potrzebujesz formatu bardzo konkretne i spójne dane wyjściowe lub chcesz skrócić długość podpowiedzi, eliminując przykłady kilka strzałów.
Krytyczny antywzór: Nie dostrajaj, aby wstrzyknąć wiedzę faktograficzną (daty, liczby, konkretne fakty). Modelka „zapamiętuje” bez zrozumienia i halucynacji w każdym razie. Do wiedzy użyj RAG.
Ramy decyzyjne
Najważniejszym pytaniem nie jest „jakiej technologii użyć”, ale „jaki jest mój prawdziwy problem”. To drzewo decyzyjne obejmuje 90% przypadków użycia:
Hai dati privati o recenti che il modello non conosce?
SI --> Considera RAG come base
NO --> Prompt engineering puo essere sufficiente
Il tuo knowledge base e aggiornato frequentemente?
SI --> RAG (indicizza i nuovi documenti, non ri-addestra)
NO --> Fine-tuning puo essere considerato
Hai 1000+ esempi di coppie input-output di alta qualita?
SI --> Fine-tuning e un'opzione valida
NO --> Stai nei limiti di RAG + few-shot
Hai bisogno di tracciabilita (citare le fonti)?
SI --> RAG obbligatorio
NO --> Piu flessibilita
Latenza critica (sotto 500ms)?
SI --> Fine-tuning (elimina retrieval overhead) o caching aggressivo
NO --> RAG funziona bene
Conclusione tipica 2026:
Start with RAG + prompt engineering
Add fine-tuning solo se RAG non raggiunge qualita richiesta
Architektura systemu dla produkcji
System GenAI klasy produkcyjnej wykracza daleko poza zwykłą „bazę danych LLM + wektorową”. Komponenty niezbędne do poważnego wdrożenia:
# Stack minimo per RAG in produzione (Docker Compose)
services:
api:
image: your-genai-api:latest
environment:
OPENAI_API_KEY: ${OPENAI_API_KEY}
QDRANT_URL: http://qdrant:6333
REDIS_URL: redis://redis:6379
depends_on:
- qdrant
- redis
qdrant:
image: qdrant/qdrant:v1.9.0
volumes:
- qdrant_storage:/qdrant/storage
ports:
- "6333:6333"
redis:
image: redis:7-alpine
# Semantic cache: evita LLM calls per query simili
volumes:
- redis_data:/data
prometheus:
image: prom/prometheus:latest
# Monitora: latency p50/p95/p99, costo per query, quality score
grafana:
image: grafana/grafana:latest
# Dashboard: LLM performance, retrieval quality, cost tracking
Krytyczne komponenty oddzielające prototyp od systemu produkcyjnego:
- Buforowanie semantyczne (Redis + biblioteka jak GPTCache): zmniejsza koszty o 30-60% dla aplikacji z podobnymi, powtarzającymi się zapytaniami
- Obserwowalność: śledź każde połączenie LLM pod kątem opóźnień, wykorzystanych tokenów, kosztów i wynik jakości — bez tych danych nie można przeprowadzić optymalizacji
- Strategia rezerwowa: co się stanie, gdy OpenAI przestanie działać? Masz model lokalny jak wykonać kopię zapasową?
- Ograniczanie stawek i zarządzanie kwotami: Chroń swój budżet przed zapytaniami anomalne
- Wykrywanie informacji osobistych: przed wysłaniem danych do LLM należy wykryć i ukryć dane osobowe wrażliwy
Stos Technologii 2026
Ekosystem GenAI ustabilizował się wokół kilku dominujących graczy:
Polecany stos 2026
- Orkiestracja: LangChain v0.3+ lub LlamaIndex v0.10+ dla złożonych rurociągów RAG; LangGraph dla przepływów pracy agentów
- Baza danych wektorowych: Qdrant (własny hosting, doskonała wydajność), pgvector (już w PostgreSQL, poniżej 1 miliona wektorów), Pinecone (zarządzane, gwarantowane opóźnienie)
- Wnioskowanie: vLLM lub TensorRT-LLM dla modeli open source hostowanych samodzielnie; OpenAI/Anthropic dla interfejsów API w chmurze
- Osadzenia: text-embedding-3-small autorstwa OpenAI (wyciemnienie 1536, token 0,02 USD/1 mln) lub all-MiniLM-L6-v2 do bezpłatnego samodzielnego hostingu
- Obserwowalność: LangSmith, Weights & Biases Weave lub Phoenix do śledzenia łańcuchów
- Ocena: RAGAS do automatycznych wskaźników RAG (wierność, trafność odpowiedzi, przypomnienie kontekstu)
Metryki jakości dla systemów RAG
Jak sprawdzić, czy Twój system RAG działa dobrze? Ramy RAGAS definiują mierzalne wskaźniki:
# Valutazione automatica con RAGAS
from ragas import evaluate
from ragas.metrics import (
faithfulness, # la risposta e supportata dai documenti recuperati?
answer_relevancy, # la risposta risponde alla domanda?
context_recall, # i documenti recuperati contengono le info necessarie?
context_precision # i documenti recuperati sono tutti rilevanti?
)
from datasets import Dataset
# Dataset di test (ground truth necessario)
test_data = {
"question": ["Come configuro l'autenticazione 2FA?"],
"answer": ["Per configurare 2FA, vai in Impostazioni > Sicurezza..."],
"contexts": [["Documentazione 2FA: ...", "Guida sicurezza: ..."]],
"ground_truth": ["La 2FA si configura tramite l'app mobile nelle impostazioni sicurezza"]
}
dataset = Dataset.from_dict(test_data)
result = evaluate(dataset, metrics=[
faithfulness,
answer_relevancy,
context_recall,
context_precision
])
print(result)
# faithfulness: 0.95 (la risposta non inventa)
# answer_relevancy: 0.88 (la risposta e pertinente)
# context_recall: 0.82 (i doc recuperati coprono la risposta)
# context_precision: 0.91 (i doc recuperati sono rilevanti)
Realistyczne cele dla systemu produkcyjnego: wierność > 0,85 (krytyczna: poniżej tego halucynacje progowe są częste), trafność odpowiedzi > 0,80, przypomnienie kontekstu > 0,75.
Anty-wzorce, których należy unikać
- Naprawiono rozmiar fragmentu dla wszystkich dokumentów: dokumenty strukturalne (FAQ, dokumentacja API) wymagają fragmentacji innej niż tekst narracyjny
- Tylko pobieranie semantyczne: nie spełnia dokładnych warunków technicznych; użyj wyszukiwania hybrydowego (BM25 + semantyczny)
- Żadnego ponownego rankingu: wektory górnego k niekoniecznie są najbardziej przydatne; a cross-enkoder poprawia precyzję o 15-20%
- RAG bez ciągłej oceny: Jakość ulega pogorszeniu w przypadku dokumentów zmieniają się; monitoruje wierność produkcji
- Dostrajanie jako pierwszy wybór: i drogie i powolne; RAG jest prawie zawsze obecny właściwy ruch, aby rozpocząć
Wnioski i dalsze kroki
Projekt systemu dla aplikacji GenAI wymaga wyborów architektonicznych, które wykraczają daleko poza wybór modelu. Praktyczna zasada na rok 2026: zawsze zaczyna się od komunikatu RAG + inżynieria, mierz jakość za pomocą RAGAS i dostrajaj tylko wtedy, gdy różnica jest jakość utrzymuje się po optymalizacji pobierania.
W kolejnych artykułach z tej serii szczegółowo omówimy każdy element: wybór prawidłowa baza danych wektorowych, strategie dzielenia, wyszukiwanie hybrydowe i architektura agentów LangGraf.







