Однією з найпростіших способів пошкодити штучний інтелект - дозволити йому забагато запам 'ятати.
Більшість підходів "зрозумівання контекстуM SK1 зводяться до однієї з двох помилок
Обидві підходи дорого коштують, непрозрачні , і нестабільні на довгому горизонтіM SK2
Існує кращий образец - МСК0, який відображає те, як біологічні системи насправді масштабують когніцію.
Я називаю це Перетягування обмеженого неясного контексту МSK0CFCD).
Перетягування обмеженого неясного контексту це модель, в якій можливими моделями запропонують, що є вагомим, але лише детерміністичними правилами можна передати цю вагомість вперед, щоб вплинути на майбутнє мислення або покоління.
Або ще ясніше:
Моделі можуть помітити
Це те ж саме філософське розкол, що і Стримана неясність і Обмежений фузій МСМ - щойно застосували вздовж вісь часу замість вісь прийняття рішень.
ЛЛМ не мають МСК0 пам 'ятайтеМSK1 Вони мають шаблон - співпадіння над символами МSK3
Коли ми розглядаємо контекст як "just more text", ми отримуємоM SK2
Довгі контекстні вікна не розв 'язують цього. Вони просто затримають невдачі.
Справжнє питання - скільки контексту, щоб зберегти, алеM SK1
Що заслуговує на виживання?
CFCD стверджує жорстке відокремлення:
| МSK0 Роль | Дозволено бути неяскравим МSK2 | Дозвволено стати майбутнім обмеженням |
|---|---|---|
| Вив 'язування слизистості МSK1 Так МSK2 Ні | ||
| Пропагування у контексті МSK1 Ні МSK2 Так | ||
| МSK0 Покоління | Так MSК2 Ні МСК3 | |
| Помешкання на прикріпленні МSK1Ледер МSK2 | Ні M | Так МСК5 |
Ймовірність може запропонувати. Детермінізм вирішує, що рухається вперед
Детерміністичне значення: ті самі вхідні дані + ті самі правила МSK1 ті ж ланцюги. Ви все ще можете використовувати ймовірністі бали ; ви просто прокручуєте їх через фіксоване підвищення МSK2 функції, що закінчуються
CFCD - це те, як ви отримуєте переваги контексту без платити за контекст
Це не працює, тому що:
Найголовніша думка: виявлення salience не потребує LLM. Ви можете використати детермінативний ML (вбудовані модулі МSK2 TF МSK3IDF \ , BM \ МSK5 для того, щоб знайти те, що має значення
DocSummarizer implements this:
LLM ніколи не бачить повного документу.
// From DocSummarizer: SegmentExtractor.cs
public class SegmentExtractor
{
private readonly OnnxEmbeddingService _embeddingService; // ML, not LLM
public async Task<ExtractionResult> ExtractAsync(string docId, string markdown)
{
// 1. Parse document into typed segments
var segments = ParseToSegments(docId, markdown);
// 2. For large docs: semantic pre-filtering with multi-anchor approach
// - Guaranteed coverage: first/last sentences per section, constraints
// - BM25 candidate generation with pseudo-query from TF-IDF terms
// - Topic anchors via k-means clustering on sample embeddings
if (segments.Count > _config.MaxSegmentsToEmbed)
{
(segmentsToEmbed, centroid) = await SemanticPreFilterAsync(segments, targetCount);
}
else
{
await GenerateEmbeddingsAsync(segments);
centroid = CalculateCentroid(segments);
}
// 3. Score by salience using MMR (deterministic)
// Salience = lambda * sim(segment, centroid) * position_weight * content_weight
// - (1 - lambda) * max_sim(segment, higher_ranked_segments)
ComputeSalienceScores(segments, centroid, contentType);
// 4. Return top-K as anchors for synthesis
var topBySalience = segments
.OrderByDescending(s => s.SalienceScore)
.Take(Math.Max(_config.FallbackBucketSize, targetCount))
.ToList();
return new ExtractionResult
{
AllSegments = segments,
TopBySalience = topBySalience,
Centroid = centroid,
ContentType = contentType
};
}
/// <summary>
/// Greedy MMR selection: balances relevance with diversity
/// </summary>
private void ComputeSalienceScores(List<Segment> segments, float[] centroid, ContentType contentType)
{
var candidates = new HashSet<Segment>(segments.Where(s => s.Embedding != null));
var ranked = new List<Segment>();
// Pre-compute centroid similarities with content-type adjustments
foreach (var segment in candidates)
{
var baseSim = CosineSimilarity(segment.Embedding!, centroid);
var contentWeight = ComputeContentTypeWeight(segment, contentType);
segment.SalienceScore = baseSim * segment.PositionWeight * contentWeight;
}
// Greedy MMR: pick best, penalise similar, repeat
while (candidates.Count > 0)
{
var best = candidates
.Select(c => new {
Segment = c,
Score = _config.MmrLambda * c.SalienceScore
- (1 - _config.MmrLambda) * MaxSimToRanked(c, ranked)
})
.OrderByDescending(x => x.Score)
.First();
best.Segment.SalienceScore = 1.0 - ((double)ranked.Count / segments.Count);
ranked.Add(best.Segment);
candidates.Remove(best.Segment);
}
}
}
Тому що вихідний код рейтингова колекція, ви можете адаптувати число засадок до моделі синтезу під час запуску
public class AdaptiveSynthesizer
{
public int ComputeAnchorBudget(ModelProfile model, ExtractionResult extraction)
{
// Larger context windows → more anchors
var baseTokenBudget = model.ContextWindow / 4; // Reserve 25% for output
// More powerful models → can handle more complex synthesis
var complexityMultiplier = model.Tier switch
{
ModelTier.Small => 0.5, // tinyllama: fewer, simpler anchors
ModelTier.Medium => 1.0, // llama3.2:3b: standard
ModelTier.Large => 1.5, // llama3.1:8b+: more context, nuanced synthesis
_ => 1.0
};
var anchorBudget = (int)(baseTokenBudget * complexityMultiplier / _avgTokensPerSegment);
// Never exceed what we have
return Math.Min(anchorBudget, extraction.TopBySalience.Count);
}
public async Task<Summary> SynthesizeAsync(
ExtractionResult extraction,
ModelProfile model)
{
var budget = ComputeAnchorBudget(model, extraction);
// Take top-K from already-ranked segments
var anchors = extraction.TopBySalience.Take(budget).ToList();
// Synthesis model only sees what survived selection + adaptation
return await _llm.SynthesizeAsync(anchors, model);
}
}
Це все ще детерміністичне: ті самі вхідні дані + той самий модельний профиль МSK1 ті самі ланцюги. Рейтинг відбувається один раз МSK1 адаптація - це лише шматок МSK2
Це означає, що
Найголовніша думка: прикріплення - це структура, а не проза. Вбудова та MMR є детерміністичними МSK1 LLM робить тільки остаточну синтезу МSK2 обмеженою тим, що вижили .
Контракт на ancoraння: генерація може відрізнятися формулюванням, але не повинна протистояти ланцюгам
Конкретне представлення锚а:
{
"policyVersion": "cfcd-v1",
"segments": [
{"id":"seg-12","text":"Reset requires holding button 10s","salience":0.92},
{"id":"seg-45","text":"Factory reset clears all settings","salience":0.88}
],
"coverage": "3.2% semantic sample",
"hedging": "sampled 3% - avoid definitive conclusions"
}
Перевод exposses this pattern even more clearly.
Перевести речення
Навіть з величезним контекстним вікном , моделі все ще " почуваються вільними МSK2 змінювати фрази
Що є сильним локальним доказом?
Це детерміністичне: структурні сигнали виявлені за допомогою класифікації шаблону або аналітикаM SK1 а не модельного судження.
Поліція за замовчанням МСК0 Δ МSK1 розрив у довірі , W=50 шматки M SK4 fortuna per domain ).
public class TermLedger
{
private readonly Dictionary<string, TermMapping> _mappings = new();
public record TermMapping(
string SourceTerm,
string TargetTerm,
float Confidence,
string FirstSeenChunkId,
int LastSeenChunkIndex, // Track recency
int VotesForCurrentTarget,
int TotalVotes, // Preserve history
string? ChallengerTarget = null,
int ChallengerVotes = 0,
float ChallengerConfidence = 0);
public void ProposeMapping(string source, string target, float confidence, string chunkId, int chunkIndex)
{
source = source.ToLowerInvariant().Trim();
if (_mappings.TryGetValue(source, out var existing))
{
if (existing.TargetTerm == target)
{
// Same as current: accumulate votes
_mappings[source] = existing with
{
Confidence = Math.Max(existing.Confidence, confidence),
VotesForCurrentTarget = existing.VotesForCurrentTarget + 1,
TotalVotes = existing.TotalVotes + 1,
LastSeenChunkIndex = chunkIndex
};
}
else if (existing.ChallengerTarget == target)
{
// Same as challenger: accumulate challenger votes
var newChallengerVotes = existing.ChallengerVotes + 1;
var newChallengerConfidence = Math.Max(existing.ChallengerConfidence, confidence);
// Switch if challenger has >= 2 votes AND higher confidence
if (newChallengerVotes >= 2 && newChallengerConfidence > existing.Confidence)
{
// Swap: old current becomes challenger, challenger becomes current
_mappings[source] = existing with
{
TargetTerm = target,
Confidence = newChallengerConfidence,
VotesForCurrentTarget = newChallengerVotes,
TotalVotes = existing.TotalVotes + 1,
LastSeenChunkIndex = chunkIndex,
ChallengerTarget = existing.TargetTerm, // Preserve old mapping as challenger
ChallengerVotes = existing.VotesForCurrentTarget,
ChallengerConfidence = existing.Confidence
};
}
else
{
_mappings[source] = existing with
{
ChallengerVotes = newChallengerVotes,
ChallengerConfidence = newChallengerConfidence,
TotalVotes = existing.TotalVotes + 1,
LastSeenChunkIndex = chunkIndex
};
}
}
else if (confidence > existing.ChallengerConfidence)
{
// New challenger replaces old challenger
_mappings[source] = existing with
{
ChallengerTarget = target,
ChallengerVotes = 1,
ChallengerConfidence = confidence,
TotalVotes = existing.TotalVotes + 1,
LastSeenChunkIndex = chunkIndex
};
}
}
else
{
_mappings[source] = new TermMapping(
source, target, confidence, chunkId, chunkIndex,
VotesForCurrentTarget: 1, TotalVotes: 1);
}
}
public string? GetCanonicalTranslation(string source)
{
source = source.ToLowerInvariant().Trim();
return _mappings.TryGetValue(source, out var mapping)
? mapping.TargetTerm
: null;
}
}
У практиці ви також хочете, щоб голос застарів. ( або ліхтарне вікно. ) так, що ранні помилки не стають постійними. МSK3 Головне, що правило застарівання є детерміністичним.
Чому це важливо для виправлення: Якщо переклад перевертається: "factory reset " mid-documentM SK3 ви можете відокремити ledger і побачити точно, коли та чому
chunk-12: "factory reset" → "Werkseinstellungen" (votes: 3, conf: 0.82)
chunk-47: challenger "Zurücksetzen" reaches 2 votes, conf: 0.91
chunk-47: SWITCH - "factory reset" → "Zurücksetzen" (old mapping preserved as challenger)
Ніяких підозрювань МСК0 Ні МSK1модель тільки-но вирішила ". Невидимий, детерміністичнийМSK4 перевіряєтьсяM SK5
Це дає вам:
Ось чому послідовність термінів не можна розв 'язати за допомогою " тільки більше контекстуM SK1
CFCD робить не дати модель пам 'яті.
Він дає система пам 'ять.
Модель:
Система:
Правила закінчування терміну (детерміністичнийM SK1 немодельний -останавлений МSK3
T не звертаючись доN наступні шматочки руйнуютьсяЦя різниця - це все.
flowchart TB
subgraph Model["Probabilistic Model"]
M1[Detect Salience]
M2[Generate Output]
end
subgraph System["Deterministic System"]
S1[Promote Anchors]
S2[Store in Ledger]
S3[Enforce on Generation]
S4[Expire Stale Context]
end
M1 --> S1 --> S2
S2 --> S3 --> M2
S2 --> S4
style Model stroke:#f59e0b,stroke-width:2px
style System stroke:#22c55e,stroke-width:3px
Ось модель з рахунком як першим об 'єктом klasy-
flowchart LR
S[Stream: chunks/sentences] --> M[Model proposes salience]
M --> P[Promotion rules]
P --> L[Ledger / Anchors]
L --> G[Generation constrained by anchors]
G --> O[Output]
L --> E[Expiry rules]
E -.-> L
style L stroke:#22c55e,stroke-width:3px
style P stroke:#22c55e,stroke-width:2px
style E stroke:#22c55e,stroke-width:2px
style M stroke:#f59e0b,stroke-width:2px
style G stroke:#f59e0b,stroke-width:2px
Зелені коробки - детерміністики. Оранжеві - ймовірностіM SK1 Переводник сидить між ними, тримаючи те, що вижилиMSC3
Три зміни:
Про prompt стає перегляд not the ledger itself.
Те, що - це момент - це не контекст
Анкори не є "важливий текстM SK1 Вони є надруковані, структуровані факти що обмежують генерацію:
factory reset → restore factory settingsProductName, ModelNumber, UserIDpolicyVersion: "cfcd-v1", anchorSchemaVersion: 2Справа в тому, що ланкери не проза, вони структурні. Модель пише навколо них.
Це аналогія МСК0 не біологічна твердження МSK1 пунктом є вибіркова консолідація , не літеральний механізм.
Мозок не відтворює весь сенсорний поток.
Вони:
Мова, МСК0, рухові здібності, МSK1 та сприйняття залежать від стриманий ріст-вперед, не сировий зворотній зв 'язокM SK1
CFCD - це той самий принцип
| Біологічна система | |
|---|---|
| Зауважаність МSK1 Що помітити МSK2 | Вив 'язане слизистість мSK4 нерозбірливо M) мSK6 |
| МSK0 Консолідація ( Що запам 'ятовувати МSK2 | Продвиження якорів |
| Похибка МSK1 Що не слід ігнорувати МSK2 | Правила закінчування терміну служби M( детерміністична МСК5 МСК6 |
| Згадати МSK1 Що отримати МSK2 | Попит на Ledger |
CFMoM і CFCD - це одна і та сама ідея, яка розглядається з різних куточків:
| виміри МSK1 візерунок МSK2 |
|---|
| Єдиний заявитель МSK1 Стримана неясність |
| Множество кандидатів МSK1 Обмежений фузій МСМ |
| Довгий МSK1 горизонтальний контекст МSK2 Стримане схвильоване перетягування контексту |
Усі троє підтримують одне й те саме правило.
Ймовірність запропонує. Детермінізм залишаєтьсяM SK1
Як тільки ви internalizуєте це правило,
flowchart LR
subgraph CFP["Part 1: Constrained Fuzziness"]
P1[Single Proposer] --> C1[Constrainer] --> O1[Output]
end
subgraph CFMoM["Part 2: Constrained Fuzzy MoM"]
P2A[Proposer A] --> CS[Consensus Space]
P2B[Proposer B] --> CS
P2C[Proposer C] --> CS
CS --> C2[Coordination Constrainer] --> O2[Output]
end
subgraph CFCD["Part 3: Context Dragging"]
T1[Time T] --> A1[Anchors]
T2[Time T+1] --> A1
A1 --> C3[Constrained Generation] --> O3[Output]
end
style CFP stroke:#22c55e,stroke-width:2px
style CFMoM stroke:#3b82f6,stroke-width:2px
style CFCD stroke:#8b5cf6,stroke-width:2px
Тому що це
Іншими словами, це оптимізує виробництво
| АнтиM SK1 Патерн МSK2 Проблема МSK3 Решение CFCD | ||
|---|---|---|
| Помістити все у контексті | Нескінченна вартістьM SK1 розріджування уваги | Пропонувати тільки те, що виживає від селекції МSK3 |
| Рекурсивне підсумування | дрейф МSK1 протиріччя МSK2 Anchors are structure , not prose | |
| Сподіваюсь, модель запам 'ятає | Без жодних гарантій | Система має тривалість МSK2 |
| Per-запрос повного переM SK1розробки | Skalи витрат з історією | Переписник залишається на всіх запитах МSK2 |
| Природний язык "memory" | Семантичний дрейф МSK1 Надруковані ланкери МSK2 експлуатні мапи | |
| Один-масштаб-вписується в-всякий контекст | Модель з пропускною спроможністю для відходів або голоду МSK1 Пристосовальне відрізання з сортованої колекції |
Найяскравіший.Ефемеральний є субстратом, який робить CFCD практичною.
| Ефемерний примітив МSK1 Роль CFCD МSK2 | |
|---|---|
| Сигнал | Candidate salience МSK1model proposesM SK2 |
| Огранічені вікна | Немає безмежних зв 'язків. |
| Правила виведення | Забуття є явною |
| Вичерпнення Sliding | Стальний контекст автоматично закінчується |
| Поширення сигналу | Анкери рухаються вперед без мутації МSK1 |
Ефемеральний не " пам 'ятаєM SK1 Він вирішує, що можна запам 'ятати, і на який час.
Це саме те, що вимагає CFCD.
public class CFCDCoordinator
{
private readonly SignalSink _sink;
private readonly TermLedger _ledger;
private readonly TimeSpan _anchorLifetime = TimeSpan.FromHours(1);
public void PromoteAnchor(string term, string translation, string chunkId, int chunkIndex)
{
_ledger.ProposeMapping(term, translation, 0.8f, chunkId, chunkIndex);
// Emit signal for observability (key = chunkId for correlation)
_sink.Raise($"anchor.promoted:{term}", key: chunkId);
}
public void ExpireStaleAnchors()
{
var cutoff = DateTimeOffset.UtcNow - _anchorLifetime;
// Ledger entries older than cutoff without recent usage are removed
// This is deterministic, not model-decided
_ledger.ExpireOlderThan(cutoff);
_sink.Raise("anchors.expired");
}
}
Об 'єднати їх для створення повної системи перекладу документів:
public class CFCDTranslationPipeline
{
private readonly ILlmService _llm;
private readonly TermLedger _ledger;
private readonly SignalSink _sink;
private readonly int _seedChunks = 3; // K: configurable seed window
public async Task<TranslatedDocument> TranslateAsync(
Document source,
string targetLanguage)
{
var chunks = Chunker.Chunk(source, maxTokens: 500).ToList();
var translated = new List<TranslatedChunk>();
// Phase 1: Extract terminology candidates (first pass, fuzzy)
// Seed from first K chunks: front-loads terminology, avoids churn later
for (var i = 0; i < Math.Min(_seedChunks, chunks.Count); i++)
{
var chunk = chunks[i];
var candidates = await _llm.ExtractTerminologyAsync(chunk);
foreach (var term in candidates)
{
_ledger.ProposeMapping(
term.Source,
term.ProposedTranslation,
term.Confidence,
chunkId: chunk.Id,
chunkIndex: i);
}
}
_sink.Raise("terminology.seeded");
// Phase 2: Translate with ledger constraints
for (var i = 0; i < chunks.Count; i++)
{
var chunk = chunks[i];
// Get canonical translations for terms in this chunk
var constraints = ExtractConstraints(chunk, _ledger);
// Translate with constraints (model must respect ledger)
var result = await _llm.TranslateWithConstraintsAsync(
chunk,
targetLanguage,
constraints);
// Update ledger with any new terms (deterministic rules)
foreach (var newTerm in result.NewTerminology)
{
if (ShouldPromote(newTerm, _ledger))
{
_ledger.ProposeMapping(
newTerm.Source,
newTerm.Target,
newTerm.Confidence,
chunkId: chunk.Id,
chunkIndex: i);
_sink.Raise($"anchor.promoted:{newTerm.Source}");
}
}
translated.Add(result.Chunk);
}
return new TranslatedDocument(translated, _ledger.GetAllMappings());
}
private bool ShouldPromote(TermCandidate term, TermLedger ledger)
{
// Deterministic rules, not model judgment:
// - Proper nouns always promoted
// - Technical terms promoted if repeated
// - Common words never promoted
return term.Type == TermType.ProperNoun ||
(term.Type == TermType.Technical && term.OccurrenceCount >= 2);
}
}
Більшість систем штучного інтелекту робить помилку, вважаючи, що розум покращується, запам 'ятовуючи більше.
Взагалі-то, інтелект МСК0 вирішує, що робити ніколи більше не думати.
CFCD - це те, як ви це робите, не брехаючи собі.
| частина МSK1 візерунок МSK2 вісь | ||
|---|---|---|
| 1 | Стримана неясність | Едина компонента МSK1 |
| 2 | Обмежений фузій МСМ | Багато компонентів МSK1 |
| МSK1 ♫ ♫ МSK2 ♫ Стримане схвильоване перетягування контексту ♫ ( ♫ цей artykuł ♫ | ||
| 4 | Підсумовувач зображення | Практична Implementation МSK1 |
Усі три моделі мають однакову інваріантність: ймовірнісні компоненти запропонують; детерміністичні системи тривають.
І Десять заповідей використання LLM кодувати ці правила. Архітектура DiSE implements them for code evolution. Розпізнавання Bot implements them for request classification. DocSummarizer implements them for document retrieval. ImageSummarizer implements them for image analysis.
Різні домени. Схожа модельM SK1 Спеціальне правило. Доум-Суммарізер впроваджує відтягування контексту для паралельного довгого-форму генерації dokumentu M SK1 запуск сумісел , негативні про prompts M SK3 континуитет об 'єктів , і детекцію дрейфу підтримують послідовність над одночасними LLM wywołaннями MSC5
Частина 4 тепер доступна: Обкладач зображення : Конstrained Fuzzy Image RAG Engine. Він реалізує всі три візерунки в хвилі - базується на аналізі зображення каналу МSK2 КолірWave обчислює факти M SK3 VisionLlmWave пропонує , ImageLedger накопичує важливі риси MSC5 і детерміністичне відбору обмежує вихідні дані MNK6 Клоні його з github.comM SK1scottgal/lucidrag.
© 2026 Scott Galloway — Unlicense — All content and source code on this site is free to use, copy, modify, and sell.