# DoomSummarizer: DocSum marizer 's YoungerM SK2 Smarter Brother

<!--category-- AI, LLM, RAG, C#, Deep Research, Lucene, Knowledge Graph, Time Boxed Tool -->
<datetime class="hidden">2026-01-29T10:00</datetime>

Глибокі дослідження без глибоких кишень.

Коли "Deep Research" приземлився на високоякісних штучних інтелектівM SK2 я був цікавим : що це за штука МSK4 власне, МSK5 Я розтягнув її на шматки МСК6 І як тільки я зрозумів архітектуру М СК7 я зміг усвідомити, що М С К 8 я вже збудував більшість з неї М S К 9

### DoomSummarizer використовує подібний робочий процес,, але його дизайн оптимізує процес M SK1читання + скорочення МSK3, щоб він був переважно детерміністичним і локалізованим , з великою моделью мови МSK5LLMMSC6, що в основному використовується для синтезу.

В такому підході стійкість кроку до зниження eliminує потребу у великих, дорогих моделях, щоб отримати задовольняючі результати

Зокрема, МСК0 Я вже мав багато важливих будівельних блоків, МSK1, в тому числі багато МСК2, пошук джерел, МСК3, видобуток об 'єктів, ММСК4, графи знань, МНСК5 і вбудова, МПСК6, рейтинги на основі, МУСК7, які поширюються з lucidRAG та серії DocSummarizer.

Відсутня складова була не браком можливостей, а розумінням, як ефективно застосовувати ці існуючі елементи.

У комерційних інструментах

або

Значајне

або

Конnotativlow, що планує дослідницький підхід, робить багатоM SK1вишук кроків/обкладання /читування через багато джерел MSC4частенько веб МSK5 ваш завантаженийMska6зв 'язані файлиM Ska7 потім пише довший звіт з цитатамиMска8

Більшою частиною цінності є покращення вхідних даних: МСК0, більше свіжих сигналів, МСК1, вище, МSK2, джерело сигналу, ніж будь-яка модель; МСК3, скорочення тренувальних даних; МSK4, дата відліку; ,, ground claims in evidence. МSK6, і зменшення шансів, що модель зробить все правильно. МСК7

Приклади: [Дослідження на основі OpenAI](https://openai.com/index/introducing-deep-research/), [Дослідження про жінку](https://blog.google/products/gemini/new-gemini-app-features-march-2025/), і [Дослідження Perplexity Deep](https://www.perplexity.ai/hub/blog/introducing-perplexity-deep-research) ( також називається МSK1моди дослідженняM SK2 в їхньому інтерфейсі /docs).

DoomSummarizer слідує за тим самим робочим процесом ,, але він’ є розроблений таким чином, що більша частина M SK2 читає МSK3 знизує МSK4 робота є детерміністичною і локальноюMSC5, а LLM використовується в основному для синтезу.

Якщо знизити крок є сильним, то вам не потрібна велика модель, щоб отримати хороший результат.

Між [lucidRAG](https://github.com/scottgal/lucidrag) і серію DocSummarizer, У мене вже було більшість будівельних блоківM SK1 мультипліденція - пошук джерел МSK3 видобуток об 'єктів М SK4 графи знань M SK5 введення - рейтинг з базою на МSK7

Поганий шматок був "'", МSK1 , *оркестрування*. Як ви візьмете всі ці сигнали і поєднаєте їх у щось узгоджене з крихітною моделью

Те, що's DoomSummarizerM SK1 Названо після прокрутки проколу, тому що він прокручує прокол, тож ви не маєте ' мусите МSK4 Помічати його на ваші джерела M SK5 встановити вібрацію

Але ця стаття не про інструмент, а про ідеї, які роблять його дієвим.

[![Реліз GitHub](https://img.shields.io/github/v/release/scottgal/lucidrag?filter=doomsummarizer*&label=doomsummarizer)](https://github.com/scottgal/lucidrag/releases?q=doomsummarizer)

Це **Частина 5** з серии DocSummarizer.

Якщо ви хочете побудувати ланцюг спочатку:

- [Частина 1: Архітектура](/blog/building-a-document-summarizer-with-rag)
- [Частина 2: Використовуючи інструмент](/blog/docsummarizer-tool)
- [Частина 3: Заawansовані концепції](/blog/docsummarizer-advanced-concepts)
- [Частина 4: Збудування трубопроводів РАG](/blog/docsummarizer-rag-pipeline)

Це також [Устром із коробкою часу](/blog/timeboxedtool-consoleimage).

---


[toc]

## Основна ідея: Reduced RAG

Стандартний РАG вже робить семантичне відтворення: уривок документів, вміщує їхM SK2 і дістає верхні -k найпохожіші уривкиMSC4

Біль - це останній крок. МСК0, ви все ще закидаєте шумний пакет фрагментів в LLM і просите його узгоджувати екліпи. МSK2, важить джерела, МSK3 та зберігати послідовну нитку. МСК4. Це працює. М СК5, але це підштовхує вас до великих контекстних вікон та дорогих моделей. M СК6

Що, якби ви зробили більше роботи *до цього* LLM бачить все.

МSK0 - це модель . **зменшити перед тим, як генерувати**. Візьміть сирові документи і детерміністично скоротить їх до їхніх основних сигналів : вбудовані МSK2 ранги M SK3 виділені сегменти М SK4 профілі об 'єктів . До того часу, як ЛЛ побачить що-небудь

```mermaid
flowchart TD
    subgraph REDUCE["REDUCE: Distil to Signals"]
        Q[Query] --> Decompose[Composite Decomposition]
        Decompose --> S1[Subquery 1]
        Decompose --> S2[Subquery 2]
        S1 & S2 --> Fetch[Multi-Source Fetch]
        Fetch --> Embed[ONNX Embed Each Item]
        Embed --> Rank[6-Signal RRF Fusion]
        Rank --> TextRank[TextRank Extraction]
        TextRank --> NER[Entity Extraction]
        NER --> Profile[Entity Profile Vectors]
        Profile --> Segments[Salient Segment Extraction]
    end

    subgraph SYNTH["SYNTHESIZE"]
        Segments --> Standard["Standard Path - 1 LLM Call"]
        Segments --> LongForm["Long-Form Path - N+3 LLM Calls"]
    end

    style REDUCE fill:#1a1a2e,color:#e0e0e0
    style SYNTH fill:#162447,color:#e0e0e0
```

Фаза зниження є детерміністичною МСК0 вбудовані коди МSK1 рейтинги , виділення об 'єктів МСК3 TextRank М СК4 відлік сегментів M СК5 Ніяких LLM дзвінків MСК6

Синтез є єдиним кроком LLM. Для стандартного запиту зменшені сигнали достатньо чисті, щоб **один дзвінок** робить роботу. Для довгихM SK1формних документів, офіцер планує структуру, а головна модель генерує секції паралельно**N+3** виклики N секцій).

Для більш детального опису цієї моделі, читайте [Reduced RAG](/blog/reduced-rag).

## Фаза карти: Від запиту до джерел

Перед тим, як щось зменшиться,, запит має стати пошуковим актом.

Невелика локальна модель sentinel (0.6B у моєму випадку, tryb JSONM SK2 температура 0.1) інтерпретує сирове запитання в структурований намір МSK4 тоді YAML МSK5 керований джерелом роутер перетворює цей намір на бетонні приймачі \ .

```mermaid
flowchart TD
    Q["User Query"] --> Sentinel["Sentinel: JSON Interpretation - categories, intent, entities, - temporal hints, tone"]
    Sentinel --> Router["Source Router - YAML category → source mapping"]
    Router --> S1["gnews:AI safety"]
    Router --> S2["search:AI regulation"]
    Router --> S3["bbc:technology"]
    Router --> S4["reddit • hn"]
    S1 & S2 & S3 & S4 --> Fetch["Parallel Fetch - circuit breaking + rate limiting"]
    Fetch --> Merge["Merge + Deduplicate - → reduce phase"]

    style Sentinel fill:#1e3a5f,color:#e0e0e0
    style Router fill:#0d3b2e,color:#e0e0e0
```

В 'язник виділяє структуровані поля:

- Категорії тем (з вагами довіриM SK1
- Query intent (newsM SK1 QA
- Temporal sensitivity (breaking
- Наименовані об 'єкти
- Для складних питань: розщеплені підзапроси M SK1з відтвореними дієсловами )

**Вибір джерела** відбувається в шести етапах:

1. **Відкрите джерела**: - сказав пользователь `"from HackerNews"` → `hn` йде прямо в
2. **Поиск запитів**: постріл МSK1 оптимізовані пошукові терміни стають живими МSK2 квалифіковані API дзвінки ( ДюкДюкГо МСК4 Мудра СМСК5 RSS новин Google ПМСК6
3. **Руйтинг категорій**: обмірки тем до RSS feeds через YAML config . Запрос про МSK2 регулювання AI МSK3 маршрути до технологічних каналів *і* Policy feeds
4. **Поширення досліджень**: `research` або `deep_dive` наміри додавати архів
5. **Оббагачення об 'єктів**: названі об 'єкти з NER отримують власні запити на gnews. `gnews:OpenAI`)
6. **Полюс різноманітності**: якщо менше, ніж 3 вибрані джерелаM SK2 погані заповнюють

Результат:: M SK1 идентификатори джерел приймаються паралельно з розривом вихідного кола.

Виби змінюють терміни пошуку перед тим, як вони потрапляють до будь-якого API. НаприкладM SK1 `--vibe doom` запити про префикси з *"реагування на проблеми ризикує проблемами в МSK1*, переосмислення того, що повертається до рейтингу перед тим, як він з 'являється

Якщо ви хочете відобразити фон на бітах стійкості, см. [Використовуючи Polly для звільнення](/blog/usingpollyforretries) (розривники схемиM SK1 і [Вказівний тиск в системах чергування](/blog/backpressure-queueing-systems) (limitation rate and backpressureM SK1

## Зруйнування запиту

Більшість пошукових систем сприймають: " Що ' є новим у галузі безпеки ШІ і якими є останні нормативні акти МSK2 як одне запитання МSK3 Це СМС4 два МСК5 Якщо розглядати це як одне, то розчиняють обидві СМС6

Сентенель розкладає складні питання:

```json
{
  "is_composite": true,
  "subqueries": [
    "What's new in AI safety?",
    "What are the latest AI regulations?"
  ]
}
```

Цікавим варіантом є те, що відбувається далі. Кожна підзапроска отримує власний вбудований ONNX (гляньте [NX: Програмування моделей ML локально](/blog/docsummarizer-advanced-concepts#onnx-running-ml-models-locally)). Коли я встановлюю бал ArticlesM SK1 Я беру **Максимальна схожість косину** серед усіх вбудованих підзапросів, не середнійM SK1

Чому max? Artykuł, який чудово відповідає за M SK1безпеку штучного інтелекту " не повинен МSK3 бути караним за те, що нічого не говорить про МSK4регуляції M SK5 Перетягування покладає його під середньостатистичних частинних комбінацій *будь-яке* частина вашого питання, він зростаєМSK1 АльтернативаM SK2 середнє оцінювання, винагороджує легкі статті, які невідомо торкаються всьогоMSC4

## Поєднання гетерогенних сигналів

У мене є шість сигналів рейтингу. Вони мають зовсім інші шкалиM SK1

```mermaid
flowchart LR
    subgraph Signals
        BM25[BM25 - Keyword Match]
        Fresh[Freshness - 48h Half-Life]
        Auth[Authority - HN/Reddit Score]
        QSim[Query Similarity - Cosine]
        Vibe[Vibe Alignment - Cosine]
        Qual[Quality - Clickbait Detector]
    end

    subgraph RRF[RRF Fusion]
        direction TB
        R[Rank Each Signal - Independently]
        F["score = Σ weight × 1/(60 + rank)"]
    end

    BM25 & Fresh & Auth & QSim & Vibe & Qual --> R --> F

    style RRF fill:#1e3a5f,color:#e0e0e0
```

HN точки рухаються на тисячі. Схожість косину M SK1 до 1. Frischeness decays exponentially

Ключевим сигналом тут є BM25 по багатьох полях M SK1BM25FMSC3 Якщо ви хочете, щоб фон на BM 25, бачите [DocSummarizer Part 3](/blog/docsummarizer-advanced-concepts#bm25-the-sparse-retrieval-workhorse).

**[Об 'єднання рангів](/blog/docsummarizer-advanced-concepts#hybrid-search-with-rrf)** (Cormack et alM SK1 2009) вирішує це, не звертаючи уваги на сирові показники МSK3 кожен сигнал класифікує елементи незалежно М SK4 тоді ви поєднуєте *ранги*: `score = Σ weight × 1/(k + rank)` (с `k=60`).

Якщо ви хочете повний фон на РРФ, Частка МSK1 покриє йогоM SK2 Тут поворот є **вага адаптується до типу запиту**. Сенітель розпізнає наміри ,, а зірер перетворюється на саму себе МSK2

- Timeline queries ("What happened today?") crank freshness up and quality down
- (" Як працює квантовий комп 'ютер? ?") як працює протилежне? МSK2 глибина має більше значення, ніж новизна
- Округи та порівняння мають свої власні налаштовані профілі.

## Вибрання як вимір отримання

Це почалося як жарт.

"vibe **перший сигнал рейтингу класу МСК0 .** вбудований у ретривалий канал:

```mermaid
flowchart LR
    V["--vibe doom"] --> Expand["Query Expansion - 'concerning risks issues in...'"]
    V --> Embed["Vibe Embedding - 'vulnerability breach layoffs - recession crisis warning...'"]
    Embed --> Score["Cosine Similarity - per article"]
    Score --> RRF["RRF Signal - weight: 0.4"]

    style V fill:#8b0000,color:#e0e0e0
```

Три речі відбуваються, коли ви встановлюєте вібрацію:

1. **Поширення запиту** - пошук отримує префікс з настроєм
2. **Введення вібрацій** - відображаючий текст вбудований як 384-dim ціль
3. **Сигнал рейтингу** Статьи -, відібрані за допомогою схожості косину до введення вибудови

Custom vibes працюють однаково. `--vibe "contemplative philosophical"`- Ваш текст стає як префіксом запиту, так і ціллю рейтингу . Система не розрізняє МSK2 заздалегідь визначені з нашими за замовчанням МSK3 Вона просто вміщує все, що ви йому даєте

## Профіліエンті, Перерахунки не є

Тут: МСК0 - помилка, яку я зробив спочатку . : - розрахунок спільних об 'єктів між документами .

Два статті обговорюють: "КалифорнияM SK1

1. *California Office Announces Safety Team*
2. *"Альмондіоробці Каліфорнії стикаються з посухом*

Число об 'єднаних podmiotів: M SK1 Через це пов' язані! Очевидно неправильні .

Треба було думати про сутності як про вектори, а не про струниM SK1

Це [обмежений візерунок неясності](/blog/constrained-fuzziness-pattern): модель NER запропонує об 'єкти ,, але детерміністичне вагу вирішує, що має значення МSK2

Кожен документ отримує **вважений профіль об 'єкта** (a МSK1dim векторний кодування *які* entités з 'являються і наскільки вони відрізняються):

```
weight = TF × IDF × confidence × type_weight
profile = L2_normalize(Σ entity_embedding × weight)
```

```mermaid
flowchart TD
    subgraph Doc1["Article: OpenAI Safety Team"]
        E1["OpenAI (ORG) - IDF: high - weight: 2.1"]
        E2["California (LOC) - IDF: low - weight: 0.3"]
        E3["Safety Team (MISC) - IDF: high - weight: 1.8"]
    end

    subgraph Doc2["Article: Almond Farming"]
        E4["California (LOC) - IDF: low - weight: 0.3"]
        E5["Almond Farmers (MISC) - IDF: high - weight: 1.9"]
        E6["Drought (MISC) - IDF: medium - weight: 1.2"]
    end

    Doc1 --> P1["Profile Vector - Dominated by OpenAI + Safety"]
    Doc2 --> P2["Profile Vector - Dominated by Farming + Drought"]
    P1 -. "low similarity" .- P2

    style Doc1 fill:#1a1a2e,color:#e0e0e0
    style Doc2 fill:#2d1a2e,color:#e0e0e0
```

ІДФ є ключемМSK0 "КаліфорніяM SK2 виникає в тоннах статей МSK3 нижчий ІДF М SK4 слабкий сигнал . ♫ МSK6 Відкрита штучний інтелект МСК7 характерна МСК8 високий ІДР М СК9 домінує в профілі MСК10 Зараз пошук схожості працює ММСК11 кластер OpenAI статей разом МПСК12 кластері сільськогосподарських статей окремо МНСК13 Поширений MМСК14 Каліфорнія\ МАСК15 стає шумом МУСК16

Розумна частина: **Насилення TF**. Замість необробленого підрахунку, я використовую `1 + log(mentions)`. Об 'єкт, згаданий МSK1 разів у довгому artykule, не має МSK2 не отримує 50× маси одного з них, згадуваного один раз МСК4 він отримує \ ~5×. Це запобігає потопленню плити котла

## Знання семантичного графу

Профіліエンтів - це не тільки для розуміння документів, **вимір пошуку**. Кожний докуменM SK1t' профіф об 'єкту indeksується в графі HNSW МSK3DuckDBMSC4с VSS розширеннямMスク5 що дозволяє OMSSK6log NMСК7 відкриття речей, пов' язаних із семантичною теорією, які б повністю пропустили пошук по ключевым словам .

Якщо ви хочете більше інформації про HNSW та DuckDB VSS, читайте [GraphRAG частина 2: Minimal Viable Graph RAG](/blog/graphrag-minimum-viable-implementation).

```mermaid
flowchart TD
    subgraph Retrieval["Three-Layer Retrieval (UNION)"]
        L1["Lucene FTS - keyword matches"]
        L2["Embedding HNSW - semantic similarity"]
        L3["Entity Profile HNSW - entity fingerprint match"]
        L1 & L2 & L3 --> Union["Union of all candidates"]
    end

    subgraph Enrich["Post-RRF Enrichment"]
        Top["Top 5 Ranked Items"] --> Agg["Aggregate Profile - mean of entity profiles"]
        Agg --> Graph["HNSW Search - min similarity: 0.30"]
        Graph --> Related["+3 Related Articles - scored below existing items"]
    end

    Union --> RRF["RRF Fusion"] --> Enrich

    style Retrieval fill:#1a1a2e,color:#e0e0e0
    style Enrich fill:#0d3b2e,color:#e0e0e0
```

Це працює на двох етапах:

**Під час пошуку**: коли вартовий витягує МSK1 об 'єкти з запиту,, то комп' ютер обчислює профиль об' єктів запиту за допомогою тієї ж формули TFMSC3IDFM SK4 Це шукає в індексі HNSW статті з подібними відбитками пальців об 'єкту , з мінімальною схожістю на МSK6 Artykuł про мSK7OpenAI проблеми з безпекоюMСК8 поверхневі, навіть якщо він ніколи не згадує точних термінів питанняМСК9 тому що його profil об 'єктів MMСК10 домінує високим показникомМ СК11IDP МСК12Open AIM СК13 МКСК14 \МСК15безпека\МССК16 близький до запиту

**Після рейтингу**: найвищі МSK1 рейтинговані речі мають середні профілі в сукупному векторі . Цей сукупний пошук шукає пов 'язаних статей, які повністю пропустили ключове слово та вбудовані шари МSK3 Найдені статті отримують балівку просто нижче найнижчого рейтингового елементу МСК4 і позначені так, як виявлено *"за допомогою podmiotівM SK1*. Це захоплює головні джерела, на які звертаються новини, але не

Три шари розпізнавання об 'єднуються через union: Лаценний ключевое слово співпаде M SK1 вбудова HNSW співпадає ∪ профілі об' єктів HN SW співпадє МSK3 Союз навмисно ширший, ніж перехрестя МSK4 Він ловить речі, які могли б видаватися будь-якими одними сигналами

Путь зворотнього зв 'язку ( для корпорацій, у яких немає профіферів об' єктів, але ) використовує код об 'єктів SQL`HAVING shared_count >= 2`). Це працюєM SK1, але це 's OMSC3N²) замість OМSK5log NMNK6 `--backfill-entity-profiles` команда мігрує існуючі корпорації на шлях HNSW.

## Стандартна синтеза: Один LLM дзвінок

Це звичайний шлях. `scroll "AI safety and regulation"` hits this. After the reduce phase distils your sources into ranked, deduplicatedM SK2 entityMska3profiled segmentsMска4 synthesis is a single callM Ska5

```mermaid
flowchart TD
    subgraph REDUCE["Reduce Phase (ALL DETERMINISTIC)"]
        Items[Fetched Items] --> Embed[ONNX Embed All Items]
        Embed --> RRF[6-Signal RRF Fusion]
        RRF --> TR[TextRank Compression]
        TR --> Seg[Segment Extraction + Salience Scoring]
        Seg --> Dedup[Deduplication + Relevance Floor]
    end

    subgraph SYNTH["Synthesis (1 LLM CALL)"]
        Dedup --> Rerank["Semantic Re-Rank - by query similarity"]
        Rerank --> Budget["Smart Evidence Budgeting - redistribute unused chars"]
        Budget --> Gen["Single LLM Call - with curated evidence"]
        Gen --> Output[Final Summary]
    end

    style REDUCE fill:#0d3b2e,color:#e0e0e0
    style SYNTH fill:#1e3a5f,color:#e0e0e0
```

Фаза скорочення робить важку роботу. Коли LLM бачить щосьM SK1 він отримує:

- **Тільки верхні деталі**: рівень значущості на МSK1 найкращого товаруM SK2 результат балу МSK3 URL - копію
- **Різниця джерел**: закритий на 3 елементами на домен для обертання запитів
- **Semantic re-ranking**items re- ordered by cosine similarity to the query embedding
- **Розумний бюджетування доказів**: короткі додатки пожертвують непотрібний бюджет на довгої додатки , тому простір для доказів не марнується
- **Структуровані блоки доказів**: `[E1] Title | topic | relevance` з змістом, скороченим до бюджету

Один LLM: МСК0 , що "'" - це винагорода [зменшений рівень RAG](/blog/reduced-rag): вибір МSK1 рейтинг , відокремлення МSK3 і бюджетування все відбувається до того, як ЛЛМ побачить щось

## Довгий-Форм PipelineM SK1 Стримана паралельна генерація

Довгий-форм M SK1`--template blog-article`) - це інший божевільник . Ви МSK2 генеруєте мультипліковий МSK3 секційний документ з десятків джерел мSK4 і вам потрібна послідовність по всіх секціях без дорогих LLM комп ’ ютерних połączeń

Відповідь: **[обмежене просте перетягування контексту](/blog/constrained-fuzzy-context-dragging)**. Це детерміністичні механізми, які зберігають послідовність перетинів -, водночас дозволяючи паралельне генерування МSK2

```mermaid
flowchart TD
    subgraph Phase1["Phase 1: Evidence Preparation (DETERMINISTIC)"]
        Articles[Top 20 Articles] --> Segments[Chunk into Segments]
        Segments --> Salience[Score Salience per Segment]
        Salience --> EmbedSeg[Embed Each Segment]
    end

    subgraph Phase2["Phase 2: Document Planning (1 SENTINEL CALL)"]
        EmbedSeg --> Summary[Build Evidence Summary]
        Summary --> Sentinel["Sentinel: Generate Outline - with theme keywords per section"]
        Sentinel --> EmbedThemes[Embed Section Themes]
    end

    subgraph Phase3["Phase 3: Evidence Assignment (DETERMINISTIC)"]
        EmbedThemes --> Assign["Score: 60% theme similarity - + 25% salience + 15% relevance"]
        Assign --> Dedup[Cross-Section Deduplication]
        Dedup --> Gate["Quality Gates - • Min salience 0.35 - • Min theme sim 0.45 - • Max 2 per source per section"]
    end

    subgraph Phase4["Phase 4: Section Generation (N+2 LLM CALLS)"]
        Gate --> Intro["Intro (sequential)"]
        Intro --> Body["N Body Sections (parallel) - max 3 concurrent"]
        Body --> Conclusion["Conclusion (sequential)"]
    end

    subgraph Phase5["Phase 5: Validation (DETERMINISTIC)"]
        Conclusion --> Validate[Citation Validation - URL + Entity Grounding]
    end

    subgraph Phase6["Phase 6: Assembly (DETERMINISTIC)"]
        Validate --> Assemble[Final Document Assembly]
    end

    style Phase1 fill:#0d3b2e,color:#e0e0e0
    style Phase2 fill:#1e3a5f,color:#e0e0e0
    style Phase3 fill:#0d3b2e,color:#e0e0e0
    style Phase4 fill:#1e3a5f,color:#e0e0e0
    style Phase5 fill:#0d3b2e,color:#e0e0e0
    style Phase6 fill:#0d3b2e,color:#e0e0e0
```

Перерахуйте LLM дзвінки: **1** (сантинельний контурM SK1 МSK2 **1** МSK0intro) M SK2 **N** МSK0body sections) M SK2 **1** МSK0конkluzія) M SK2 **N+3**. Чотири з шести фаз - детермінативни

### Перетягування обмеженого неясного контексту

Проблема з генерацією паралельних секцій - це когерентність.. Якщо секції не знають, що інші секції сказали. , ви отримуєте повторення і дрейф. МSK3 Зазвичай регулює послідовне генерування з повним контекстом.

Натомість, each section gets a **обмежений контекст** що МСК0 будується детерміністично .

```mermaid
flowchart LR
    subgraph Context["Per-Section Context (ALL DETERMINISTIC)"]
        RS["Running Summary - 1400 char budget - recent 2 sections: full - older: heading only"]
        NP["Negative Prompts - 'Do NOT discuss: X, Y, Z' - from covered concepts"]
        EC["Entity Continuity - re-introduce entities - last seen 2+ sections ago"]
        Props["Propositions - ~15 atomic facts - per section"]
        Evidence["Curated Evidence - max 12 segments - quality-gated"]
    end

    Context --> LLM["LLM generates - with full awareness - of document state"]

    style Context fill:#1a1a2e,color:#e0e0e0
```

- **Переглянемо резюме**: після кожного сегментуM SK1 верхній сегментМSK2 сегмент доказів правдивості МSK3 символи ) записуються МСК5 останні МСК6 розділи отримують повний поглинання М СК7 старші розділи мають заголовок мСК8 перша реченняМ СК9 Общий бюджетM СК10 МСК11 символі М S К12 Жодна підсумка з ЛЛММ S К13
- **Негативні пропони**: виокремлюють закритих концепцій МSK1правильні іменники МSK2 технічні терміни , ключові слова на заголовку *МSK0 Не обговорюйте ці теми (на даний момент вже застосованоM SK2 X, YMSC4 Z "*
- **Неперервність**: podmiotи, які не були згадані в МSK1 секціях, зазнають позначки для повторюваності *МSK0Re-встановити, якщо це важливоM SK2 Організація МSK3 ( останній згаданий : розділ М SK6*
- **Розпізнавання дрейфу**: після того, як кожна секція генерує , її перші МSK2 символи вбудовані і порівнюються з планом МСК3 тематичне вбудова М СК4 Якщо схожість косину зменшується нижче М СК5 для M СК6 послідовних секцій М S К7 тематичне вбудова перелібрується з перших МСК8 секcji М ็ СК9

У паралельному режимі , інтро генерує перший ( встановлює базову лінію МSK2 частини тіла запускаються одночасно `SemaphoreSlim` закінчити співпадіння, кожен із яких не включає в себе вступні теми, але не один одного ), і висновок виходить на останній раз M SK2 виключаючи все ).

Последовательний режим дає більшу послідовність ( кожна секція виключає всі попередні концепти кумуляційно ), але паралельна є МSK2x швидша для великих документів МSK3

### Доказування: Серце скороченої РАГ

Кожен відділ потребує доказів, але не *будь-яке* докази. Кожен сегмент отримує композитний балM SK1 **60% схожість тем** ( відстані косину до секції ' вбудова тематики МSK2 **25% привабливість** ( наскільки інформаційним сегментом є **15% важливість статті** ( наскільки відповідним є загальноприйнятий текст джерела ). Ці оцінки повністю детерміністичними МSK2 Жоден ЛЛМ не вирішує, що

А потім ворота

- **Підлозі саліенсу** (0.35): низькийM SK1 сегменти якості ніколи не досягають LLM
- **Тема схожість пола** (0.45): відключеноM SK1випадковий доказ залишається позаду
- **Різний дедуп** (0.80 косину ): той самий факт не з 'являється двічі
- **Per-source cap** (2 сегменти за статтю за секцію ): не домінує лише один ресурс
- **Усвідомлення ролі секції**: вступні розділи карають технічну деталь (-0.3); пізніше розділи винагороджують її МSK2
- **Запроси про шлюз когезії** (0.30): докази повинні бути пов 'язані з первинним запитомM SK1 не лише з темою розділу

LLM регулює кількість слів на основі якості доказів. Сильні докази M SK1 лагідність МSK2 МSK3 \2+ джерела, | 4+ сегментиMSC7 | МSK8 повний відсоток слівMSL9 слабкі докази ♫ ( глянцевість ♫< ♫ ♫ МSK12 ♫ розсіяні ♫МSK13 \ \ МSK14 \ 60% \ з цілями ♫ Ми уникаємо галюцинацій, коли докази є тонкими \

### Видобуток запропонування: DenseM SK1X в практиці

До того, як докази дістаються до LLM , це ' атоmised в propositions МSK2 вдохновлені [Хворий-X Довідник](https://arxiv.org/abs/2312.06648)each segment is broken into six types of atomic fact **roszczenia** (загальне усвідомлення фактівM SK1 **цитати** (прямо від джерелаM SK1 **статистика** МSK0номера та метрики), **визначення** ("X - YM SK1 **процеси** (штовп МSK1по мSK2шт МSK3 і **факти** ( зосереджена на певному об 'єкті

Кожна секція отримує ~15 пропозиції , відокремлені через секції, використовуючи семантичні подібності МSK2не співпадіння струн МSK3 LLM отримує структуровані кулі точки, груповані за джереломM SK4 не сирові абзаци.

До того часу, як LLM пише секцію,, знижний етап дав йомуM SK1

- Ясна заголовка і тема
- Здоровлені сегменти доказів (якісністьМSK1залишенаМСК2відтворенаMСК3
- ~15 атомні пропозиції МSK1 цитати , статистичні дані
- Суточний підсумок того, що вже охоплено попередніми розділами
- Негативні стимули для чого *не* щоб повторити
- Руководство щодо безперервності

Невелика модель може виконувати чудову роботу з таким типом підготування

## TextRank: Детерміністичне підсумування

Коли статті надто довгі для потоку доказів, я мушу їх стиснути. Але я не хочу витрачати LLM на підсумки.

TextRank (Mihalcea МSK1 TarauM SK2 2004) робить це детерміністично:

```mermaid
flowchart LR
    Text[Article Text] --> Split[Split into Sentences]
    Split --> EmbedS[Embed Each Sentence]
    EmbedS --> Graph["Build Similarity Graph - (cosine > 0.15 = edge)"]
    Graph --> PR["PageRank - (20 iterations, d=0.85)"]
    PR --> Select["Select Top-K - in Original Order"]

    style Graph fill:#1e3a5f,color:#e0e0e0
```

Кожна речення отримує вбудовані. Поперечно схожості вище M SK1 стають крапочками графу. PageRank знаходить найбільше *центральний* речення, ті, що найбільш пов 'язані з усіма іншими . Це речення, які найкраще представляють документ

Key detail: вибрані речення повертаються **в оригіналному порядку**. Це зберігає розповідальний потік . Ви отримуєте koherentний підсумок МSK2 не випадковий пакет важливих речень

Жодного LLM дзвінка. Забігає в мілісекундіM SK1 Схожість косину SIMD- прискорюється за допомогою `TensorPrimitives` (`System.Numerics.Tensors`) МSK1AVXM SK2 AVX -512, або ARM NEON, вибрані в часі запуску МSK5

## One-Hop Ссылка:

Articles reference other articles. those reference often contain the best evidence - the primary source that a news article summarisesM SK2

DoomSummarizer слідує за зв 'язками , але вибірково. Кожна з кандидатів отримує балиM SK2

```
link_score = 0.7 × query_relevance(anchor_context) + 0.3 × segment_salience
```

Там, де з 'єднується сегментова привабливість

- **Позиція** МSK0 - перевернута пірамідія МSK2 попередні абзаци важливіші
- **Субстанція** МSK0 - довжина абзацу та щільність інформації

Ссылки, що знаходяться за межами релевантності (0.15) пропущені МSK1 Система слідує журналістичному зворотньому пираміаду эвристики МSK2 важливі зв 'язки мають тенденцію з' являтися в ранньому віці

Результати зберігаються в кэші за допомогою хешів контенту та ETags. Другий запуск швидкийM SK1 Погляньте [Caching відповідей , ETags, та умови](/blog/ASPNET-STATE-BETWEEN-REQUESTS).

## Краwl Mode: Побудувати локальну базу знань

Все, що описано до цього часу, припускає пошук в Інтернеті. Але ви можете повністю пропустити веб.

`crawl` вводить веб-сайт у локальну базу знань. Він робить широтуM SK1перший клік MSC2BFS) з семянної URLМSK4 враховуючи глибину та обмеження сторінокMスク5 з пристосовальним обмеженням частоти, що вимірює запізнення на основі часів реагування сервера

```bash
doomsummarizer crawl https://docs.example.com --name example-docs --depth 3 --max-pages 200
```

Все залишається незмінним: повний змістM SK1 вбудовані на NX , профілі об 'єктів МSK3 SQLite FTS M SK4 індекси ключевых слов ( повне - пошук тексту MSC7 показники почуття та тем Mska8 обчислені за допомогою вбудованих якорів M Ska9 без LLM MSKA10 Посилання зростаючих результатів `If-None-Match` / `If-Modified-Since` заголовки. Невимінні сторінки повертають HTTP 304 і перекидають переробкуM SK2 Для серверів без підтримки ETag, SHAMSC4 content hashes catch duplicates

Як тільки заглиблено, питання повністю відключено:

```bash
doomsummarizer scroll "how does authentication work?" --name example-docs
```

І `--name` маршрути на локальний кіб замість веб-ресурсів. ті ж три - спалахи відтворення ланцюгаM SK2 FTS5 повне M SK4 передвиборні тексти МSK5 фильтр М SK6 введення пошуку HNSWМSK7 профілі об 'єкту пошуку HNSW . Вони є союзамиMSC9 поєднані та класифікованіMNK10 той самий редукційний трубопровід

Утримка легка: SQLite для метадань та FTSM SK1 індекси, DuckDB з VSS розширенням для векторних індексів HNSWMSC3 Ніхто не надає сторонніх послуг , немає ДокеруMST5 немає API-клавішів МST6 База знань, що складається з сотень сторінок, вміщується в кілька мегабайт і за queries в милісекундіMst7

## Поєднати їх

```bash
doomsummarizer scroll "AI safety and regulation" --vibe doom --debug

Composite query detected: 2 subqueries
  • What's new in AI safety?
  • What are the latest AI regulations?

Searching...
├─ Lucene: 18 keyword matches (regulation^3, safety^2)
├─ Embedding: 12 semantic matches (max-sim across 2 subqueries)
├─ RRF fusion: 22 candidates, 6 signals
├─ Entity HNSW: +3 related via entity profiles
├─ TextRank: compressed 4 long articles
└─ Final: 12 items

Long-form: Phase 1 - 187 segments from 12 articles
Long-form: Phase 2 - "AI Safety Landscape" - 5 sections
Long-form: Phase 3 - Evidence assigned (cross-section dedup: 8 removed)
Long-form: Phase 4 - Generating sections...
```

## Ідеї, які зробили його дієвим

Ось що ми розуміємо. МСК0 Візьміть їх, МСК1 Застосуйте в своїх власних системах

1. **Снизити перед тим, як генерувати**: стандартний шлях потребує лише 1 LLM дзвінка, тому що трубопровод робить всі великі підйоми детерміністично [Reduced RAG](/blog/reduced-rag) є моделью: вбудовані , PageRank, гуристикаM SK3 і якісні ворота виробляють такий чистий вход, що навіть малі моделі синтезують добреMSC4
2. **Стентінель-за керованим маршрутизуванням джерела**: маленька модель інтерпретує пошуки в структурному намірі , тоді YAMLM SK2 керований маршрутизація вибирає і вібрує - оцінює МSK4 джерела M SK5 Сенітель досить дешевий, щоб викликати кожен запит MSC6
3. **Максимальна схожість для складних запитів**МSK0 не ' не середні результати підпитків МSK2 візьміть найкращий результат . Article nailing one part of your question is better than one half
4. **Порівняйте ранги, без балів**: РР дозволяє об 'єднати сигнали з неповносправними шкалами . Адміністрація МSK2 свіжість M SK3 вбудована подібність
5. **Виби як вбудова**: будь-який текст може бути виміром відтворення . вміщувати його МSK2 оцінити його в залежності від нього M SK3 покласти його у рРФ . Немає ніяких особливих випадків
6. **Профіліエンти як вектори**: IDFM SK1 вбудова зважених об 'єктів , не підрахунки строків об' єктів МSK3 рідкісні об 'єкти домінують в профілі M SK4 звичайні об ’ єкти стають шумом , і пошук HNSW відкриває пов 'язані статті в OMSC6log N).
7. **Перетягування обмеженого неясного контексту**: [детерміністичне управління контекстом](/blog/constrained-fuzzy-context-dragging) дозволяє генерувати паралельні секції. Переводні підсумки , негативні про prompts, безперервність об 'єктівM SK3 і виявлення дрейфів утримують послідовність без LLM kompresійних дзвінківMSC4
8. **Детерміністично, якщо це можливо**МСК0 з шести довгих МSK1 формових фаз , чотири determinістичні. TextRank замінює LLM сумірування M SK4 Приділ доказів заміняє LLM вибірок .

## Ресурс

- **[Релізи DoomSummarizer](https://github.com/scottgal/lucidrag/releases?q=doomsummarizer)**: один бінар МSK1 не потрібно часу для запуску
- **[Репозиторий lucidRAG](https://github.com/scottgal/lucidrag)**: - батьківський проект
- **[Источник](https://github.com/scottgal/lucidrag/tree/main/src/DoomSummarizer)**

### Подібні статті

- [Reduced RAG](/blog/reduced-rag): знизити - перед МSK2 створити модель в глибині
- [Перетягування обмеженого неясного контексту](/blog/constrained-fuzzy-context-dragging): як генерація паралельних секцій зберігає послідовність
- [Стриманий візерунок невизначеності](/blog/constrained-fuzziness-pattern): ширший візерунок за детерміністичним контролем

### Також

- [Консольні зображення (Time Boxed Tool)](/blog/timeboxedtool-consoleimage)