# DoomSummarizer-:-DocSummarinizer-'-Jüngere, intelligentere Bruder

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

Tiefe Forschung ohne tiefe Taschen

Als ich in den Premium-KI-Tools landete, war ich neugierig, was das ist.,, also zog ich es auseinander... und sobald ich die Architektur verstand, realisierte ich, dass I', bereits das meiste davon gebaut wurde.

### DoomSummarizer nutzt einen ähnlichen Workflow, aber sein Design optimiert das -"-Lesen -+-Reduzierprozess meist deterministisch und lokalisiert zu sein, mit dem Large Language Model - (-LLM.)-Reduktion vor allem für die Synthese verwendet

In diesem Ansatz beseitigt die Stärke des Reduktionsschrittes den Bedarf an einem großen, teuren Modell, um zufriedenstellende Ergebnisse zu erzielen.

Bemerkenswerterweise besaß ich bereits viele wesentliche Bausteine, darunter Multi-- source retrieval, die mit lucidRAG und der DocSummarizer Serie geteilt werden.

Die fehlende Komponente war kein Mangel an Fähigkeiten, sondern eher zu verstehen, wie man diese vorhandenen Elemente effektiv anwendet.

In den kommerziellen Werkzeugen, die ,...Deep Research... bedeutet normalerweise einen Workflow, der einen Forschungsansatz plant..., ist multi--.step searching... /.browsing./.reading quer durch viele Quellen ?(.often web?

Ein großer Teil des Wertes ist die Verbesserung der Eingabe- ,:' Pull in frischer , ,' höher als jedes Modell , ’'s Training Data Cut , -off date , und reduzieren Sie die Chance des Modells machen Dinge up ,.'

Beispiele [OpenAI Deep Research](https://openai.com/index/introducing-deep-research/), [Tiefenforschung von Zwillingen](https://blog.google/products/gemini/new-gemini-app-features-march-2025/)L 347 vom 20.12.2013, S. 671. [Komplexität vertiefte Forschung](https://www.perplexity.ai/hub/blog/introducing-perplexity-deep-research) (, auch als “ bezeichnet, Forschungsmodus ” in ihren UI-/, Docs, ).

DoomSummarizer folgt dem gleichen Workflow, aber es wird entwickelt, so dass der größte Teil des “read-Verfahrens reduziert wird.”e Arbeit ist deterministisch und lokal und das LLM wird hauptsächlich für die Synthese verwendet.

Wenn der Reduktionsschritt stark ist, brauchen Sie ein großes, teures Modell, um ein gutes Ergebnis zu erhalten.

Zwischen [LucidRAG](https://github.com/scottgal/lucidrag) und die DocSummarizer series--,- Ich hatte bereits die meisten der Bausteine -:- multi...--Quelle Retrieval ,,-Entitätsextraktion , ,-Wissensgraphen , ,-Einbettung ,--basierte Rangliste ,.

Das fehlende Stück war ,''t Fähigkeit , .' Es war *Orchestrierung*Wie nehmen Sie all diese Signale und verschmelzen sie in etwas, das mit einem winzigen Modell zusammenhängt?

Dass ,''s DoomSummarizer , . , benannt nach doom scrolling , weil es doom Scrolls, so dass Sie nicht müssen , um ,. , Punkt es auf Ihre Quellen , die ?, , setzen eine Vibe , , , erhalten Sie eine Synthese .. ,

Aber dieser Artikel ist... über das Werkzeug... über die Ideen, die es funktionieren lassen.

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

Das ist **Teil** von der DocSummarizer-Serie

Wenn du das Fundament zuerst haben willst

- [Teil Architektur](/blog/building-a-document-summarizer-with-rag)
- [Teil mit dem Werkzeug](/blog/docsummarizer-tool)
- [Teil - Fortgeschrittene Konzepte](/blog/docsummarizer-advanced-concepts)
- [Teil Gebäude RAG Pipelines](/blog/docsummarizer-rag-pipeline)

Dies ist auch ein [Zeit Boxed Tool](/blog/timeboxedtool-consoleimage).

---


[Weitere Informationen:

## Die Kernidee ,: , reduzierte RAG

Standard RAG macht bereits semantische Retrieval-Dokumente, :, Klumpendokumente, ,, embedded them, ,, und holt die meisten ähnlichen Brocken.

Der Schmerz ist der letzte Schritt, den du noch am Ende ein lautes Dumping von ,e überlappenden Haufen Brocken in eine LLM und bitten sie zu versöhnen Duplikate-,e wiegen Quellen... und halten Sie einen kohärenten Thread... Das funktioniert, ,e aber es drückt dich auf große Kontextfenster und teure Modelle...

Was, wenn du mehr Arbeit machst? *Vorher* die LLM sieht alles ?

Das ist das Muster. **reduzieren, bevor Sie generieren**Nehmen Sie rohe Dokumente und deterministisch reduzieren sie zu ihren wesentlichen Signalen, Embeddings, ,, Ränge, Prägende Segmente, ,, Entitätsprofile, ., Bis die LLM alles sieht, ist die harte Arbeit erledigt.

```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
```

Die Reduktionsphase ist deterministisch, die Embeddings – , – Ranking – , – Entitätsextraktion –, – TextRank-, – Segment Scoring – MSC5 – Keine LLM-Anrufe – MSV6 –

Synthesis ist der einzige LLM-Schritt.. Für eine Standardabfrage sind die reduzierten Signale sauber genug, dass **Ein Anruf** tut die Arbeit, .-Für lange, --Form Dokumente, ein Sentinel plant die Struktur und das Hauptmodell erzeugt Abschnitte in parallelen (-**INSGESAMT** Anrufe für N-Abschnitte

Für mehr Details zu diesem Muster siehe [Reduzierte RAG](/blog/reduced-rag).

## Die Map-Phase von der Abfrage zu den Quellen

Bevor irgendetwas reduziert wird, muss die Abfrage Suchaktionen werden.

Ein kleines lokales Sentinel-Modell in meinem Fall: ,.JSON-Modus: ,.Temperatur: 0.1). interpretiert die Rohabfrage in eine strukturierte Intent:,. Dann verwandelt ein YAML.-.driven Source Router diese Absicht in Beton.

```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
```

Der Sentinel extrahiert strukturierte Felder

- Thematische Kategorien mit Konfidenzgewichten
- Such-Intent - (-news - ,-QA-,-Forschung - Vergleich: , - howto-) -
- Temporale Sensitivität (-breaking Heute / - Woche ) -
- Benannte Stellen
- Für zusammengesetzte Fragen – zersetzte Unterfragen – mit gelösten Pronomen –

**Auswahl der Quellen** geschieht in sechs Phasen

1. **Explizite Quellen**Benutzer sagte: `"from HackerNews"` → `hn` geht gerade rein
2. **Suchanfragen**Die optimierten Suchbegriffe des Sentinel' werden zu Vibe-. Qualifizierte API-Aufrufe der (.DuckDuckGo.,. Brave.,. Google News RSS.MSC6.
3. **Kategorie-Routing**Thema Gewichte Karte RSS-Feeds über YAML-Konfiguration ..Eine Frage nach der Regulierung ".AI. *und* policy feeds
4. **Forschungsanreicherung**: `research` oder `deep_dive` Absichten hinzufügen arxiv
5. **Anreicherung der Einrichtung**Benannte Entities von NER erhalten ihre eigenen Gnews-Abfragen `gnews:OpenAI`)
6. **Boden der Vielfalt**Wenn weniger als ausgewählte Quellen als Standard-,

Das Ergebnis: :-Quellenkennungen, die parallel mit Per---Quellschaltungen abgerufen werden

Vibes modifizieren die Suchbegriffe, bevor sie irgendeine API treffen. `--vibe doom` prefixes Abfragen mit *Probleme im Zusammenhang mit Risiken*Umformung, was zurückkommt, bevor ein Ranking passiert

Wenn Sie den Hintergrund auf der Resilienz-Bits wollen, sehen [Polly für Retries verwenden](/blog/usingpollyforretries) (-Circuit Breaker, ) und [Rückdruck in Queueing Systemen](/blog/backpressure-queueing-systems) Begrenzer- und Gegendruckmittel (MSK)

## Dekonstruieren der Abfrage

Die meisten Suchsysteme behandeln neue KI-Sicherheit und was sind die neuesten Vorschriften ,?" , wie eine Abfrage , . , es ist zwei .. , behandelt es als ein verdünntes beide ?. ,

Der Sentinel zersetzt zusammengesetzte Abfragen.

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

Die interessante Wahl ist, was als nächstes geschieht.Jede Unterfrage bekommt ihre eigene ONNX Einbettung ..(.see [ONNX-:-Laufen von ML Modellen vor Ort](/blog/docsummarizer-advanced-concepts#onnx-running-ml-models-locally)Wenn Artikel gescort werden, nehme ich die **maximale Kosinusgleichheit** über alle Subquery-Embeddings, nicht den Durchschnitt, sondern

Warum Max-?-Ein Artikel, der perfekt antwortet "-AI Sicherheit sollte "-sollten nicht bestraft werden, weil nichts über "-regulationen gesagt wird.".- Averaging würde es unter mittelmäßigen partiellen Streichhölzern begraben. .- Max Ähnlichkeit bedeutet, wenn ein Artikel Nägel *keine* Teil deiner Frage... es erhebt sich... die Alternative... durchschnittlich... ..,... belohnt bland Artikel, die alles vage berühren...

## Verbundene Heterogene Signale

Ich habe sechs Ranking-Signale, die völlig unterschiedliche Skalen haben.

```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-Punkte gehen zu Tausenden – .-Kosin-Ähnlichkeit ist ,-1- bis .1.-Frischheit zerfällt exponentiell - .-Sie können sicher diese zusammen hinzufügen – .-Die Skalen sind inkompatibel -.-

Das Keyword-Signal hier ist BM ,25 , über mehrere Felder .( ,BM , 25 , F , ). , Wenn Sie den Hintergrund auf BM wollen , sehen [DocSummarizer Teil](/blog/docsummarizer-advanced-concepts#bm25-the-sparse-retrieval-workhorse).

**[Gegenseitigkeitsrang Fusion](/blog/docsummarizer-advanced-concepts#hybrid-search-with-rrf)** U.S.MS.K.Cormack et al..,.Löst dies durch Ignorieren von Rohpunktzahlen U.s.M.K3. jedes Signal ordnet Elemente unabhängig an, dann kombinieren Sie die *Reihen*: `score = Σ weight × 1/(k + rank)` ,( mit `k=60`).

Wenn Sie den vollen Hintergrund auf RRF-,-Teil möchten, decken Sie es ab.-Hier ist der Twist **Gewichte passen sich dem Abfragetyp an**Der Sentinel erkennt Intent-, und der Torschütze formt sich neu

- Timeline-Abfragen Was heute passiert ist ?")Crank Frische nach oben und Qualität nach unten (Crecency zählt am meisten
- Explainer-Abfragen Wie funktioniert Quantencomputer??") Wie macht das Gegenteil mehr als Neuheit?).
- Roundups und Vergleiche haben ihre eigenen abgestimmten Profile

## Vibes as a Retrieval Dimension

Dies begann als ein Witz... jetzt ist es... mein Lieblingsfeature.

Eine "-Vibe-" ist eine prompte Formulierung von .. **Erstes --Klasse-Rankingsignal** eingebettet in die Retrieval-Pipeline

```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
```

Drei Dinge passieren, wenn Sie eine Vibe setzen.

1. **Abfrageerweiterung** Suche wird mit Stimmung vorfixiert
2. **Einbettung der Stimmung** Repräsentativer Text wird als Ziel eingebettet
3. **Ranking-Signal** Artikel, die durch Cosine-Ähnlichkeit mit der Vibe-Einbettung erzielt wurden

Benutzerdefinierte Vibes funktionieren identisch `--vibe "contemplative philosophical"`Ihr Text wird sowohl zum Abfrage-Präfix als auch zum Ranking-Ziel.Das System unterscheidet nicht vordefiniert von custom... Es bettet einfach ein, was immer Sie ihm geben.

## Entitätsprofile],-nicht entity Counts

Hier ist ein Fehler, den ich zuerst gemacht habe, indem ich geteilte Entitäten zwischen Dokumenten gezählt habe.

Zwei Artikel, die beide erwähnen

1. *Büro in Kalifornien kündigt Sicherheitsteam an*
2. *Kalifornien Mandelbauern stehen vor Dürre"*

Geteilte Entity count .: . . 1. . Daher verwandt .

Die Lösung war, über Entities als Vektoren zu denken .. . ."

Das ist die [Eingeschränktes Fuzziness-Muster](/blog/constrained-fuzziness-pattern)Das NER-Modell schlägt Entities vor, aber deterministische Gewichtung entscheidet, was zählt.

Jedes Dokument erhält eine **gewichtetes Unternehmensprofil** Kodierung des Vektors *bei der* Entitäten erscheinen und wie unverwechselbar sie sind

```
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
```

IDF ist der Schlüssel, der in Tonnen von Artikeln erscheint.-... niedriges IDF-,... schwaches Signal....... OpenAI®"... ist unverwechselbares IDF9... dominiert das Profil....... jetzt Ähnlichkeit Sucharbeiten... .... Openai Artikel cluster together... .... Farming Artikel Cluster separat... .... Die geteilte "...Kalifornien... wird zu Lärm...

Der clevere Teil **Sättigung von TF**Anstelle der rohen Erwähnung count-, wende ich `1 + log(mentions)`Eine Entität, die in einem langen Artikel erwähnt wird, erhält das Gewicht einer Person, die einmal erwähnt wurde... Es bekommt ,~5×.. Dies verhindert eine Überflutung des Profils durch boilerplate entities

## Semantische Graphen-Entdeckung

Entitätsprofile sind ,' , nur für das Verständnis von Dokumenten , . , Sie , ' , eine **Retrieval Dimension**Jedes Documen-Profil wird in einem HNSW-Diagramm indexiert.'s VSS-Erweiterung ),e ermöglicht die Entdeckung von semantisch verwandten Artikeln, die Schlüsselwortsuche vollständig verpassen würde.

Wenn Sie mehr Details über HNSW und DuckDB VSS-, möchten, siehe [GraphRAG Teil 2:-Mindestlebend GraphRAG](/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
```

Dies funktioniert in zwei Phasen .:

**Beim Abrufen**Wenn der Sentinel Entitäten aus der Abfrage extrahiert, wird ein Abfrage-Entitätsprofil unter Verwendung derselben TF-Formel berechnet... Dies durchsucht den HNSW Index nach Artikeln mit ähnlichen Entity-Fingerabdrücken.MSC5. Mit einer minimalen Ähnlichkeit von 0.25.. Ein Artikel über die Sicherheit von U".OpenAI betrifft Oberflächen, auch wenn er nie die genauen Abfragebegriffe erwähnt.,. weil sein Entity Profil durch hohe -.IDF dominiert ist.

**Nach Rangfolge**Diese aggregierte Suche nach verwandten Artikeln, die das Schlüsselwort und Einbettung Schichten verpasst vollständig gefundenen Artikel erhalten knapp unter dem niedrigsten Punkt gepunktet bewertet und als entdeckt markiert *Über Entitäten*Dies fängt die primären Quellen, die Nachrichten Artikel Referenz aber don.'.t Zitat verbatim-..

Drei Retrieval-Schichten verschmelzen über union:- Lucene Schlüsselwort-Matches - Einbettung von HNSW-Maches - Entitätsprofil HNSK2-Makes - .- Union ist bewusst breiter als Schnittpunkt. Es fängt Gegenstände, die jedes einzelne Signal aufdecken würde.

Der Fallback-Pfad für Korpora ohne Entitätsprofile verwendet SQL entity co-.-®occurrence Counting`HAVING shared_count >= 2`Es funktioniert nicht, aber es funktioniert nicht. `--backfill-entity-profiles` Befehl migriert vorhandene Corpora zum HNSW-Pfad

## Standard-Synthese: ein LLM-Aufruf

Dies ist der normale Pfad. `scroll "AI safety and regulation"` trefft dieses... nach der Reduktionsphase destilliert Ihre Quellen in geordnete ,, deduplizierte ,, Entity, -, profilierte Segmente...

```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
```

Die Reduktionsphase tut die harte Arbeit... bis das LLM alles sieht, was es empfängt.

- **Nur Top-Artikel**Relevanz Boden bei der besten item , ' score ,, , URL , - , dedupliziert
- **Quellenvielfalt**Für Rundum-Abfragen bei den Einträgen pro Domäne von 3 eingeschlossen
- **Semantisches Re---Ranking**Elemente, die durch Cosine-Ähnlichkeit zur Einbettung der Abfrage angeordnet werden
- **Intelligente Evidenz-Budgets**Kurze Gegenstände spenden unbenutztes Charakterbudget an lange Gegenstände.
- **Strukturierte Beweisblöcke**: `[E1] Title | topic | relevance` mit dem Inhalt in den Haushalt gekürzt

Eine LLM-Anrufe, die die Auszahlung von [Verringerung der RAG](/blog/reduced-rag):-Auswahl,-Ranking,-deduplizieren und Budgetierung alles passieren, bevor die LLM sieht, was alles

## Die lange ,- , Form Pipeline , : Beschränkte parallele Generation

Langform --Form`--template blog-article`) ist ein anderes Biest, das aus Dutzenden von Quellen ein Multi---Sektionsdokument erzeugt und Sie brauchen Kohärenz über Abschnitte hinweg ohne teure LLM-Kompressionsaufrufe.

Die Antwort lautet: **[eingeschränkte fuzzy Kontext ziehen](/blog/constrained-fuzzy-context-dragging)**Dies sind deterministische Mechanismen, die die Kohärenz der cross---Abschnitte wahren und gleichzeitig eine parallele Generation ermöglichen.

```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
```

Zählen Sie die LLM-Aufrufe. **1** Umrisse von ), +, **1** (-intro-)-+- **N** Körperteile aus ), +, **1** Schlussbemerkung **INSGESAMT**Vier der sechs Phasen sind deterministisch.

### Beschränkte Fuzzy Kontext Drackging

Das Problem mit der parallelen Sektionsgenerierung ist die Kohärenz..-Wenn Abschnitte nicht wissen, was andere Abschnitte gesagt haben, erhalten Sie Wiederholung und Drift. .-Der übliche Fix ist die sequentielle Erzeugung mit vollem Kontext.

Stattdessen erhält jeder Abschnitt ein **eingeschränkter Kontext** dass-'s gebaut deterministisch -:

```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
```

- **Zusammenfassung**,, nach jedem Abschnitt MSK1, dem oberen --Evidenz-Evidence-Segment (200, wird chars), aufgezeichnet ., neuere 2, erhalten volle Verdauung ;, ältere Abschnitte erhalten Überschrift +, erster Satz ., Gesamtbudget :, Zeichen 1400, keine LLM Zusammenfassung
- **Negative Aufforderungen**Die abgedeckten Konzepte werden extrahiert.(.proper Substantive, technische Begriffe, Überschriften, Schlüsselwörter, max. *Besprechen Sie diese Themen NICHT bereits abgedeckt.*
- **Kontinuität der Stelle**Entities, die nicht in den Abschnitten von 2+ erwähnt werden, erhalten eine Markierung für die Wiedereinführung der ..Aktive Entities werden vor kurzem erwähnt.). werden verfolgt. .. Die LLM erhält Führung. *"-Re---Einführung, falls relevant, :-Entität, 1-Engineering, zuletzt erwähnter Abschnitt :-Eigner*
- **Driftdetektion**Die ersten Zeichen von 1000 sind eingebettet und mit dem Thema plan embedding verglichen. Wenn die Kosinusgleichheit unter 0.35 für aufeinander folgende Abschnitte fällt, wird die Einbettung des Themas aus den ersten Abschnitten der . rekalibriert.

Im Parallelmodus erzeugt das Intro erste -(-Sets der Ausgangskörperabschnitte von ),, die parallel zu ( auf 3 laufen. `SemaphoreSlim` zu cap concurrency-,-jedes ausgenommen intro Themen, aber nicht einander und die Schlussfolgerung läuft letzten (-Ausnahme alles

Sequentieller Modus gibt eine engere Kohärenz jeder Abschnitt schließt alle früheren Konzepte kumulativ aus.),, aber parallel ist -~3,x schneller für große Dokumente.

### Evidenz-Zuweisungen:-Das Herz der reduzierten RAG

Jeder Abschnitt braucht Beweise, aber nicht *keine* evidence-.-Jedes Segment erhält eine Kompositpunktzahl-MSC1- **.60%-Thema Ähnlichkeit** Der Abstand des Kosinus zum Abschnitt des Themas der Einbettung von ), **WICHTIGSTE GESUNDHEIT** Wie informativ das Segment ist, ), und **Relevanz des Artikels** Wie relevant der Quellartikel insgesamt ist, diese Bewertung ist völlig deterministisch, keine LLM entscheidet, was relevant ist, .

Dann die Tore

- **Salience boden** Qualitätssegmente erreichen das LLM nie
- **Thema Ähnlichkeitsfläche** (0.45): Auswärts-Auswärtstopische Beweise bleiben aus
- **Querschnittsabfolge** Die gleiche Tatsache erscheint zweimal
- **Per---Quellenkappe** Segmente pro Artikel pro Abschnitt – keine einzelne Quelle dominiert
- **Rollenbewußtsein der Fachgruppe**Intro-Abschnitte bestrafen technische Details. Spätere Abschnitte belohnen es.
- **Abfrage des Kohäsionstors** Der Nachweis muss sich auf die ursprüngliche Abfrage beziehen, nicht nur das Abschnittsthema.

Die LLM-Zielwortzahl passt sich an die Evidenzqualität an..-starke Evidence-Evidenzen. (-Salience-Segmente, )-Signmente und →-Vollwortanzahl.MSC9-Schwachzeichen, <-Sility-Soldaten, MSC13-Skala, MSC14-60%-Ziel: .-Sliance verhindert Halluzinationen, wenn der Evident dünn ist.

### Propositionsextraktion – :-Dense---X in der Praxis

Vor Beweisen erreicht das LLM-, , es ,' , atomisiert in Sätzen , ( inspiriert durch die [Dense---X Retrieval Papier](https://arxiv.org/abs/2312.06648)Jedes Segment ist in sechs Arten atomarer Tatsache unterteilt. **Forderungen** Allgemeine Tatsachenbehauptungen **Zitate** Direkt aus der Quelle **Statistik** Zahlen und Metriken **Begriffsbestimmungen** ("-X ist Y-"),-X **Prozesse** (-step---by---stepe-),- und **Name der Einheit Fakten** Konzentriert auf eine bestimmte Entität

Jeder Abschnitt erhält .~15-Propositionen . ,-dedupliziert über Abschnitte mit semantischer Ähnlichkeit . (-not string matching .).-Die LLM empfängt strukturierte Kugelpunkte gruppiert nach Quelle .

Bis das LLM einen Abschnitt schreibt, hat die Reduktionsphase es gegeben.

- Eine klare Überschrift und ein Thema
- Kuratierte Evidenz-Segmente Qualität
- ~15 atomare Propositionen Zitate , Statistiken , Entitäten )
- Eine laufende Zusammenfassung dessen, was die vorangegangenen Abschnitte bereits behandelt haben
- Negative Aufforderungen für was *nicht* zu wiederholen
- Leitlinien für die Kontinuität des Unternehmens

Ein kleines Modell kann ausgezeichnete Arbeit mit dieser Art von Pre---Verarbeitung tun.

## TextRank-:-Deterministische Zusammenfassung

Wenn Artikel für die Evidenz-Pipeline zu lang sind, muss ich sie komprimieren, aber ich will nicht einen LLM-Aufruf auf Zusammenfassung verbringen.

TextRank (-Mihalcea - Tarau-,-2004)-Tut es deterministisch -:-

```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
```

Jeder Satz erhält eine Einbettung.. pairwise Ähnlichkeiten oberhalb von 0.15 werden zu Graphkanten. . , PageRank findet die meisten *Zentral* die Sätze, die am meisten mit allem anderen verbunden sind, sind jene, die das Dokument am besten repräsentieren.

Die ausgewählten Sätze werden zurückgegeben **in Original-Dokumentenreihenfolge**Dieses konserviert narrativen Fluss... Sie erhalten eine kohärente Zusammenfassung... nicht einen zufälligen Beutel von wichtigen Sätzen...

Keine LLM-Anrufe, die in Millisekunden ausgeführt werden `TensorPrimitives` (`System.Numerics.Tensors`Ausgewählt zur Laufzeit

## Eins---Hop-Link folgt

Artikel Nachschlagewerk andere Artikel Diese Referenzen enthalten oft die besten Belege, dass ein Nachrichtenartikel zusammenfasst.

DoomSummarizer folgt Links-,, aber selektiv.., Jeder Kandidat Link wird gewertet.

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

Wo Segment Salience kombiniert wird

- **Position** Frühere Absätze zählen mehr
- **Begründetheit** Länge des Absatzes und Informationsdichte

Links unter einer Relevanz Boden -(0.15) suppped .. . Das System folgt der journalistischen invertierten Pyramide heuristic . : . wichtige Links neigen dazu, früh in gut erscheinen .

Die Ergebnisse werden mit Content-Hashes gecached und ETags-.-Second Runs sind schnell. [Ansprech-Caching-,-ETags-,- und Bedingte Anfragen](/blog/ASPNET-STATE-BETWEEN-REQUESTS).

## Crawl-Modus: Build eine lokale Wissensbasis

Alles, was bisher beschrieben wird, geht davon aus, dass Web-Hotching... Aber du kannst das Netz komplett überspringen.

`crawl` nimmt eine Website in eine lokale Wissensbasis ein Es tut eine Breite ,- , erste Crawler , ( , BFS , ) , von einer Samen-URL , die Tiefe und Seitengrenzen respektieren , mit adaptiver Geschwindigkeit begrenzt , dass Verzögerung auf Server Reaktionszeiten basiert , : ,

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

Alles wird persistent ,: , voller Inhalt , , ONNX Einbettungen , , , Entitätsprofile , , , SQLite FTS , 5 , Schlüsselwort-Indizes , S( , Volltext-Suche, ), , Sentiment- und Themenergebnisse ,( , berechnet über Einbettungsanker , ohne LLM-, ). , Inkrementale Re... `If-None-Match` / `If-Modified-Since` Kopfzeilen.-Unveränderte Seiten geben HTTP zurück und überspringen die Wiederaufbereitung.-Für Server ohne ETag-Unterstützung,-SHAM256-Inhalt hasches fangen Duplikate.-

Einmal gekribbelt, ,-Abfrage komplett offline,:-Abfragen

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

Das `--name` Flagge Routen zu den lokalen KB anstelle von Web-Quellen Die gleichen drei ,-'layer Retrieval Brände , : , FTS , 5 , voll , - text pre ,- , Filter , HNSW Suche , , , Entitätsprofil HNSK8 , Sie sind Gewerkschaft , und gereihte .. , gleiche Reduktion Pipeline ,...

Der Speicher ist leichtgewichtig.:-SQLite für Metadaten und FTS-5-Indizes,-DuckDB mit der VSS-Erweiterung für HNSW-Vektorindizes.-Keine externen Dienste,-Keine Docker-,-keine API-Schlüssel.-Eine gekrochene Wissensbasis von Hunderten Seiten passt in ein paar Megabytes und Abfragen in Millisekunden.-

## Zusammenstellen

```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...
```

## Die Ideen, die es bewirkten

Dies sind die Einsichten, die sie in Ihren eigenen Systemen verwenden.

1. **Reduzieren, bevor Sie generieren**Der Standardweg benötigt nur einen LLM-Anruf, weil die Pipeline das schwere Heben deterministisch erledigt. [Reduzierte RAG](/blog/reduced-rag) ist das Muster, das die Embeddings, ,, PageRank-,, heuristics, und Qualitätstore so sauberen Eingang produziert, dass auch kleine Modelle gut synthetisieren
2. **Sentinel---getriebenes Quellrouting**Ein kleines Modell interpretiert Abfragen in strukturierte Intentionen., , dann YAML- ,- ,gesteuertes Routing wählt und vibe , - , qualifiziert Quellen , . , Das Sentinel ist billig genug, um jede Anfrage anzurufen ,. ,
3. **Maximale Ähnlichkeit für zusammengesetzte Abfragen**Ein Artikel, der einen Teil deiner Frage nagelt, ist besser als eine Hälfte, die alles zusammenpasst.
4. **Ranks kombinieren – nicht Punkte**Mit RRF können Sie Signale mit inkompatiblen Skalen fusionieren.
5. **Vibes als Einbettungen**Jeder Text kann eine Retrieval-Dimension sein ,. , es einbetten , , , Score gegen sie , , , Gewicht es in RRF , . , Keine speziellen Fälle erforderlich ,
6. **Entitätsprofile als Vektoren**Nicht Entity-String zählend Seltene Entities dominieren das Profil Die gemeinsamen Entities werden zu Rauschen und die Suche nach HNSW entdeckt verwandte Artikel in O.(®log N.MSC7
7. **Beschränkter Fuzzy-Kontext ziehen**: [deterministisches Kontextmanagement](/blog/constrained-fuzzy-context-dragging) ermöglicht die parallele Sektionsgenerierung – .-Ausführung von Zusammenfassungen – , – negative Eingabeaufforderung –,-Entitätskontinuität – ,- und Driftdetektion – erhalten Kohärenz ohne LLM-Kompressionsanrufe – .-
8. **Deterministisch, wo möglich**TextRank ersetzt die LLM-Zusammenfassung... Evidence-Zuweisung ersetzt die Auswahl von LLM.

## Aufkommen

- **[DoomSummarizer veröffentlicht](https://github.com/scottgal/lucidrag/releases?q=doomsummarizer)**Keine Laufzeit erforderlich
- **[lucidRAG-Repository](https://github.com/scottgal/lucidrag)**Das übergeordnete Projekt
- **[Quellencode](https://github.com/scottgal/lucidrag/tree/main/src/DoomSummarizer)**

### Verwandte Artikel

- [Reduzierte RAG](/blog/reduced-rag)Das reduzierte -, bevor das - erzeugte Muster in der Tiefe
- [Beschränkte Fuzzy Kontext Drackging](/blog/constrained-fuzzy-context-dragging)Wie parallele Sektionsgenerierung die Kohärenz aufrecht erhält
- [Eingeschränktes Fuzziness-Muster](/blog/constrained-fuzziness-pattern)Das breitere Muster hinter deterministischer Kontrolle

### Auch

- [ConsoleImage Zeit Boxed Tool](/blog/timeboxedtool-consoleimage)