Dlaczego LLM zapominają fakty w długim kontekście: analiza attention i halucynacji
Modele LLM oparte na architekturze transformer cierpią na degradację uwagi w długich kontekstach: bias primacy i recency osłabiają przetwarzanie środkowej części tekstu. Prowadzi to do efektu Lost-in-the-Middle, wzrostu halucynacji i utraty dokładności nawet przy oknach obejmujących milion tokenów. W artykule – przyczyny problemu oraz techniki dla systemów RAG w środowisku produkcyjnym.
Problemy self-attention w długich sekwencjach
Self-attention w transformerach ma złożoność kwadratową O(n²), co ogranicza długość kontekstu. Optymalizacje takie jak FlashAttention, RoPE i ALiBi redukują koszty, ale wprowadzają przesunięcia pozycyjne:
- Bias primacy: początek kontekstu jest zapamiętywany najlepiej.
- Bias recency: koniec kontekstu również pozostaje dostępny.
- Środek się gubi: tokeny w centrum otrzymują osłabioną uwagę z powodu causal masking i rozpadu w positional embeddings.
Zwiększenie okna kontekstu nie eliminuje biasu, a rozszerza 'martwą strefę' w środku. Model nie przyznaje się do luk, lecz generuje wiarygodne, ale fałszywe fakty.
Efekt Lost-in-the-Middle w liczbach
Badanie Nelsona Liu (Stanford, 2023) wykazało krzywą dokładności w kształcie litery U: spadek o 30–50% dla informacji znajdującej się w środku 20–30 dokumentów. W latach 2025–2026 MIT i inne laboratoria potwierdziły utrzymywanie się efektu u modeli z 1M+ tokenów.
Benchmarki ewoluowały:
- Needle-in-a-Haystack: test wyszukiwania faktu w długim tekście.
- U-NIAH (2026): porównanie long-context LLM i RAG.
- NeedleBench, BABILong, LooGLE: weryfikacja syntezy z rozproszonych części.
Vectara Hallucination Leaderboard (HHEM-2.3, 2026) odnotowuje wzrost halucynacji przy 32K+ tokenach: model łączy fragmenty A i C, ignorując B, i wymyśla brakujące elementy.
Mechanizm halucynacji w długim kontekście
OpenAI (2025, 'When More Becomes Less') zauważył: większy kontekst zwiększa inferencję, ale obniża jakość. Model wypełnia luki 'wiarygodnymi' powiązaniami. MIT (2025) dodał: pewność języka rośnie proporcjonalnie do halucynacji – im mniej faktów, tym bardziej przekonujący jest wymysł.
Łańcuch przyczynowy: długi kontekst → szum → rozmycie uwagi → brak faktu → trening RLHF na 'zawsze odpowiadaj' → kreatywna halucynacja.
Strategie chunking dla RAG
Skuteczny RAG zaczyna się od właściwego podziału dokumentów. Unikaj domyślnych splitterów – stosuj ukierunkowane podejścia:
- RecursiveCharacterTextSplitter (LangChain): chunki 400–512 tokenów, overlap 10–20%. Solidny dla tekstów ustrukturyzowanych.
- SemanticChunker: podział na podstawie embeddingów, +15–20% dokładności na złożonych danych.
- HierarchicalNodeParser (LlamaIndex): hierarchia 2048 → 512 → 128 tokenów dla stopniowego wyszukiwania.
Przekazuj modelowi 3–5 relewantnych chunków zamiast 100K tokenów śmieci.
Przykład implementacji chunkingu z rerankingiem:
from langchain.text_splitter import RecursiveCharacterTextSplitter
from langchain.retrievers import ContextualCompressionRetriever
from langchain_community.embeddings import HuggingFaceEmbeddings
from langchain_community.vectorstores import FAISS
# Recursive + overlap
text_splitter = RecursiveCharacterTextSplitter(
chunk_size=512,
chunk_overlap=100,
separators=["\n\n", "\n", ". ", " ", ""]
)
# Semantic splitter
embeddings = HuggingFaceEmbeddings(model_name="sentence-transformers/all-mpnet-base-v2")
semantic_splitter = SemanticChunker(embeddings)
# Reranking
compressor = CrossEncoderReranker(model_name="BAAI/bge-reranker-large")
compression_retriever = ContextualCompressionRetriever(
base_compressor=compressor,
base_retriever=vectorstore.as_retriever(search_kwargs={"k": 20})
)
Pobieramy 20 chunków, reranker zostawia top-5 – redukuje szum.
Weryfikacja i agentic workflows
Po retrieval dodaj warstwy sprawdzające:
- Self-Consistency / CoVe: generuj odpowiedź, następnie pytania do samoweryfikacji.
- Critic Agent: osobna LLM waliduje odpowiedź względem kontekstu.
- Symbolic verification: Knowledge Graph lub Pydantic dla dat, liczb, nazw.
Agentic workflow (standard 2026):
- Planner: dzieli zadanie.
- Retriever Agent: wyszukiwanie według podzadań.
- Executor: generacja.
- Verifier: iteracyjna weryfikacja.
Minimalny verification loop:
from langchain.agents import create_react_agent, AgentExecutor
from langchain.tools import Tool
def verify_answer(answer: str, context: str) -> str:
prompt = (
"Sprawdź, czy odpowiedź odpowiada kontekstowi. "
"Odpowiedz YES/NO + wyjaśnienie.\n"
f"Context: {context}\n"
f"Answer: {answer}"
)
return llm.invoke(prompt)
tools = [Tool(name="Verifier", func=verify_answer, description="Sprawdza zgodność odpowiedzi z kontekstem")]
agent = create_react_agent(llm, tools, prompt=react_prompt)
agent_executor = AgentExecutor(agent=agent, tools=tools, verbose=True, max_iterations=5)
Hybrydowe neuro-symbolic dla high-stakes domen
W prawoznawstwie, medycynie, finansach łącz LLM + Knowledge Graph + symbolic verifier. Redukcja halucynacji o 60–80% (badania 2025), ale wymaga infrastruktury.
Co jest ważne:
- Długi kontekst wzmacnia Lost-in-the-Middle i halucynacje z powodu biasu attention.
- Chunking (recursive/semantic) + reranking – 70% sukcesu RAG.
- Warstwy weryfikacji (CoVe, critic agents) są obowiązkowe w produkcji.
- Agentic workflows opłacają się przy ryzyku reputacyjnym.
- Podejście hybrydowe dla regulowanych domen.
— Editorial Team
Brak komentarzy.