NOTA: Це не M SK1 це не звичайний блоговий artykuł, а МSK2 це МSK3spec ' Я створив для цієї функції в прозораРАГ. Потім я доставляю це назад і вперед до коду LLM, щоб отримати раціональний підхід
Це конкретний документ від мого прозораРАГ проект I'м зараз в розробці
Однією з проблем мого підходу є те, що мені потрібно: 'segmentsM SK1 із 'evidence' МSK4звичай текст МSK5 речення М SK6 абзаци M SK7 заголовки і т.д.
прозораРАГ працює шляхом інтелектуального аналізу та видобутку найкращих сегментів даних з зображень, аудіо , доків чи данихM SK2 На відміну від решти implementaцій RAG, я не зберігаю резюме LLM даних JSUT МSK3 насправді, більшу частину часу LLM не вимагається для вглинанняМSK4, але може бути використаний, якщо є nesessary Натомість прозораРАГ використовує багато методів WIDE для отримання шматків тексту і гарантує, що ми зберігаємо лише найкращі шматки тексту.
Найголовнішим є те, як відбувається відокремлення.
Потім, коли отримані результати: ( за допомогою звичайного SQL , векторних вбудований кодів МSK2 БМ, МSK3 і т.д. МСК4 нам потрібно переконатися, що LLM не має МСК5 багато фрагментів, які говорять одне й те саме, МКС6 MСК7 фрагменти різних документів, які по суті говорять те ж саме,
прозораРАГ використовує дві стратегії - фазного відокремлення, щоб уникнути надлишкового наповнення, зберігаючи важливі сигналиM SK1 Це сигнал-фільтр, що зберігає, ненормалізація змістуM SK1
┌─────────────────────────────────────────────────────────────────────────────┐
│ INGESTION (Per Document) │
│ │
│ Document → Extract → Embed → DEDUPE (intra-doc) → Index to Vector Store │
│ │ │
│ ├─ Near-duplicates: boost salience │
│ └─ Exact duplicates: drop (no boost) │
└─────────────────────────────────────────────────────────────────────────────┘
│
▼
┌─────────────────────────────────────────────────────────────────────────────┐
│ RETRIEVAL (Cross Document) │
│ │
│ Query → Search → Rank (RRF) → DEDUPE (cross-doc) → Top K → LLM Synthesis │
│ │ │
│ └─ Keep segment with highest RRF score │
└─────────────────────────────────────────────────────────────────────────────┘
Ці інваріанти підтримуються системою дедукції:
| МSK0 Гарантія | Описание МSK2 |
|---|---|
| Збережений порядок | Дедупликація ніколи не змінює семантичного порядку після рейтингу РР МSK1 |
| Жодна втрата концепції | Дедупликація ніколи не видаляє усіх instanцій концепції |
| Дослідження | Дедупликація ніколи не перетинає границі документу під час введення |
| Невідмінний зміст | Дедупликація ніколи не змінює вбудований або текстовий зміст , лише відбір та показники значущості |
| Детермінізм | Враховуючи однакові вхідні дані і конфігурацію, МSK1 дублування створює однакові вихідні дані. |
Ця система чітко робить не спробувати:
Дедупликація повністю детерміністична:
Чому це важливо: Використовуючи результати відтворення неполадів, можна довіряти тому, що ре-запуск з тими ж вхідних генерує ті самі вихідні даніM SK1 Це співпадає з прозораРАГ' з ширшою концепцією МSK1 обмежена невизначеність МSK2 філософія — невизначено співпадіння з детерміністичними поведінками
Мета: Скорінити зберігання і запобігти надлишкам всередині-документівM SK1
Проблема: Документи часто містять повторений зміст:
Рішення: Дедулікувати кожен документ перед indeksуванням.
Key Insight: Близькі - копії вважаються незалежні докази важливості, не надлишковість МSK1 Якщо автор пояснює концепцію трьома різними способами , ця концепція має значення
Мета: Захищати LLM від отримання надлишкових даних через документи.
Проблема: Коли ви шукаєте різні документи, схожі абзаци можуть з 'являтися в різних джерелах.
Рішення: Після рейтингу РАФ (, що об 'єднує семантичне подібність , співпадіння ключевих слів МSK2 значущість M SK3 та свіжість
Чому після RRF? Оцінка рейтингу RRF є найкращим всеохопним показником значущості.
Розрив навмисно:
| Фаза МSK1 Що він захоплює МSK2 | |
|---|---|
| Приштовхування | Автор підкреслює — наскільки документ підкреслює концепцію |
| Результат відтворення | Relevance of query — how well content matches user intent МSK2 |
Якщо їх помішати при відшуці, то ціль dokumentu заплутається з думкою користувача. Важливо повторити концепцію M SK1 раз у документі до цього документа,, але може не бути відповідним до цього запиту. Підштовхуючи при вживці ,, ми зберігаємо сигнал автору МSK2, не упереджуючи результати запитів
src/Mostlylucid.DocSummarizer.Core/Services/BertRagSummarizer.cs
DeduplicateSegments()
1. Filter segments by minimum salience threshold (0.05)
2. Sort by salience score (highest first)
3. For each segment:
a. If no embedding → keep (can't compare)
b. Check cosine similarity against all selected segments
c. If similarity >= 0.90:
- If same ContentHash → exact duplicate, drop silently
- If different ContentHash → near-duplicate, boost kept segment's salience
d. If no match → add to selected list
4. Apply salience boosts: +15% per near-duplicate merged
5. Cap salience at 1.0 to prevent any single concept from dominating
| Параметр МSK1 По замовчуванню МSK2 Описание | |
|---|---|
similarityThreshold |
0.90 МSK2 Схожість косину, над якою сегменти вважаються подібними |
salienceThreshold МSK0 0.05 ♫ ♫ МSK2 ♫ Minimalний відсоток, який треба взяти до уваги ♫ ( ♫ шуми фільтрів ♫ |
|
boostPerNearDuplicate МSK0 0.15 ♫ ♫ МSK2 ♫ Підтримка привабливості за майже ♫ - ♫ Двухразовий об 'єднання ♫ |
Точное копіювання (Невведення
Segment A: "Contact us at support@example.com" [hash: abc123]
Segment B: "Contact us at support@example.com" [hash: abc123] ← same hash
Result: Keep A, drop B, no boost (likely boilerplate)
Близько-Duplicate M SK1Boost Applied)
Segment A: "Machine learning models require training data" [hash: abc123]
Segment B: "ML systems need data for training" [hash: def456] ← different hash, 0.92 similarity
Segment C: "Training data is essential for ML" [hash: ghi789] ← different hash, 0.91 similarity
Result: Keep A with +30% salience boost (concept emphasized 3 ways)
src/LucidRAG.Core/Services/AgenticSearchService.cs
DeduplicateByEmbeddingPostRanking()
1. Receive ranked results (already sorted by RRF or dense score)
2. For each segment (in score order):
a. If no embedding → keep
b. Check cosine similarity against all selected segments
c. If similarity >= 0.90 → skip (higher-scored duplicate already selected)
d. If no match → add to selected list
3. Return deduplicated list (maintains score ordering)
| Параметр МSK1 По замовчуванню МSK2 Описание | |
|---|---|
similarityThreshold |
0.90 МSK2 Проміжок схожості косину для перетинівM SK3doc відхилення МSK4 |
РРФ (Реципрочний рейтинг об 'єднанняМSK1 об' єднує чотири сигналиM SK2
Дедуплексування AFTER RRF означає, що ми зберігаємо сегмент, який найкраще підходить до запиту у всіх вимірах.
Query: "How do I configure authentication?"
Results before dedup:
1. [Doc A] "Authentication is configured via config.yaml..." (RRF: 0.052)
2. [Doc B] "Configure auth using the config.yaml file..." (RRF: 0.048, similarity to #1: 0.93)
3. [Doc A] "Set the API key in environment variables..." (RRF: 0.041)
Results after dedup:
1. [Doc A] "Authentication is configured via config.yaml..." (RRF: 0.052)
2. [Doc A] "Set the API key in environment variables..." (RRF: 0.041)
Doc B's similar paragraph dropped - Doc A's version had higher RRF score.
| Режим непрацездатності | Description МSK2 Mitigation МSK3 |
|---|---|
| Поганий позитивний результат (впередуM SK1вгоруМSK2 | Два різні, але тісно пов 'язані поняття можуть перевершити МSK1 подібність МSK2 Прийнята торгівля - відхилення, що сприяє зменшенню зайнятості |
| Поганий негативний (внизуM SK1вгоріМSK2 | Дуже короткі сегменти можуть не вміщуватись добре , бракує семантичного подібності |
| Введення дрейфу | Зміняння моделей вбудованості заперечує припущення про дедуп МSK1 Потрібно повне переM SK2введення МSK3 вбудова є невідмінною, як тільки зберігається |
| Відчутність до порядку | Знепокоєння означає, що перший високого сегменту виграє - успішний сегмент виграв МSK2 Стриманий стабільним сортуванням |
Подібне поведінку з мультиlinguальним змістом:
| сценарій МSK1 поведінка МSK2 логіка | ||
|---|---|---|
| Та ж мова | Застосовується нормальна дедукція МSK1 Вбудова захоплює семантичні подібності МSK2 | |
| Парафрази на мові | Не подібне до МSK1 Захищає джерело МSK2 різноманіття мов | |
| М 'язовий dokument | Дедуп у мовних кластеріях | Схожість вбудованого коду природно розділяє мови МSK2 |
Вибір дизайну: Кросс- тлумачення мови явно не піддерюється . Це зберігає здатність отримувати той самий факт в обраному для користувача мові МSK2 або порівнювати те, як різні джерела формулюють речі
Майбутнє покращення: КроссM SK1зрозуміло, що мовні відхилення можна покласти за допомогою перекладу
Система відокремлення включає в себе імпульсивну захисту:
| Атаковий вектор МSK1 Захорона МSK2 | |
|---|---|
| Інфляція язика через повторення | Підштовхування закріплене на МSK1 точні подібні копії не МSK2 не підштовхуєш |
| Copy- вставляйте спам на всі документи | CrossM SK1doc дедуп при відтворення видаляє надлишкові результати |
| Маніпуляція оцінкою за допомогою подібного введення МSK0 Скидка відбувається після рейтингу, запобігає інфляції балів M SK2 | |
| Затоплення котла | Точное виявлення хаш-погони втрачається без підштовхування |
Nota: Дедупликація не є загрозою безпеки. Зловна zawartość, яка проходить через фільтри поглинання, буде відображана в Індексі . Filtrування контенту повинно відбуватися вгорі МSK2
Дедупликація та граф-RAG навмисно ортогональні:
| Система МSK1 Працює на МSK2 Цюди | |
|---|---|
| Дедупликація | сегменти МSK1 текстові фрагментиM SK2 МSK3 Вилучити надлишкові результати пошуку |
| GraphRAG | Об 'єкти МSK1 Реляції МSK2 Граф збудування знань , Відтворювані відмітки မ်SK4 |
Чому розділити:
Вживання:
[dim]Deduplication: 150 → 98 segments[/]
Видобуток:
Post-ranking deduplication: 50 → 42 segments (removed 8 cross-doc duplicates)
Для моніторингу виробництва
| МSK0 Метрічний | Описание МSK2 Здоровий діапазон | |
|---|---|---|
dedup_ratio_ingestion МSK0 % сегменти видалені під час вживання |
||
dedup_ratio_retrieval МSK0 % сегменти відібрані при відшуці |
||
avg_salience_boost |
Середньостатистичний приріст за документом МSK1 МSK2 | |
max_salience_boost |
Найвищий приріст у документі | |
dedup_by_doc_type |
Рівень відхилення поділений на типи документів | Варіації МSK2 |
Дедупликація конфігурована за допомогою DocSummarizerConfig.Deduplication розділити appsettings.json:
{
"DocSummarizer": {
"Deduplication": {
"Ingestion": {
"Enabled": true,
"SimilarityThreshold": 0.90,
"SalienceThreshold": 0.05,
"EnableSalienceBoost": true,
"BoostPerNearDuplicate": 0.15,
"MaxSalienceBoost": 1.0,
"BoostDecayMode": "Logarithmic",
"LogBase": 2.0
},
"Retrieval": {
"Enabled": true,
"SimilarityThreshold": 0.90,
"MinRelevanceScore": 0.25
},
"Analytics": {
"EnableLogging": true,
"EnableMetrics": true,
"HighIngestionDedupThreshold": 0.50,
"HighRetrievalDedupThreshold": 0.30,
"HighSalienceBoostThreshold": 0.60
}
}
}
}
| Параметр МSK1 По замовчуванню МSK2 Описание | ||
|---|---|---|
Enabled |
true |
ВвімкнутиM SK1ввімкнути відхилення поглинання МSK2 |
SimilarityThreshold |
0.90 |
Проміжок схожості косину для виявлення подібності |
SalienceThreshold |
0.05 |
Найменша відмінність, яку треба взяти до уваги ( шум фільтрів |
EnableSalienceBoost |
true |
Підвищення привабливості для близькоїM SK1утвори МSK2 |
BoostPerNearDuplicate |
0.15 |
Базовий приріст на близько МSK1замінник МSK2 |
MaxSalienceBoost |
1.0 |
Максимальна верхівка salience |
BoostDecayMode |
Logarithmic |
Linear або Logarithmic зруйнування |
LogBase |
2.0 |
Основа для логарифмічного розпаду |
| Параметр МSK1 По замовчуванню МSK2 Описание | ||
|---|---|---|
Enabled |
true |
ввімкнутиM SK1отключити відокремлення пошуку |
SimilarityThreshold |
0.90 |
Проміжок схожості косину |
MinRelevanceScore |
0.25 |
Minimum RRF score to include |
| Параметр МSK1 По замовчуванню МSK2 Описание | ||
|---|---|---|
EnableLogging |
true |
Операції відокремлення журналу |
EnableMetrics |
true |
Збирати метрики для моніторингу МSK1 |
HighIngestionDedupThreshold |
0.50 |
Застерегти, якщо МSK1 утворюється при вживці МSK2 |
HighRetrievalDedupThreshold |
0.30 |
Застерегайте, якщо >30% відтворюється при пошуці МSK2 |
HighSalienceBoostThreshold |
0.60 |
Застерегти, якщо прискорення перевищує МSK1 МSK2 |
Лінійний режим (простий, передбачуванийM SK2
boost = boostPerNearDuplicate × count
До прикладу: M SK1 біля-dupes × \0.15 | | МSK5 \ | +45% прискорення
Логарифмічний режим (знижуються результатиM SK1 по замовчуваннюМSK2
boost = boostPerNearDuplicate × log₂(1 + count)
До прикладу:: M SK1 біля-dupes → \0.15 | | МSK5 журнальна записьна інформація
Рекомендується логарифмічний режим, тому що
| МSK0 Фаза | Сложність МSK2 Типова величина | Вплив мSK4 | |||||||
|---|---|---|---|---|---|---|---|---|---|
| Введення | OM SK2n² МSK4 | 5 | сегменти | МSK6 | < | 100 | ms | МSK9 | |
| Діагностика | OmM SK3 МSK4 ♫ ♫ МSK5 ♫ сегменти ♫ | ♫ |
Для дуже великих документів (10,000+ сегментиM SK1
Текуча implementaція оптимізована для типових розмірів документу. LSH додає складності без жодної переваги для більшості випадків використання.
| Дослідження МSK1 Перехідний бар 'єр МSK2 Źródło | ||
|---|---|---|
| lucidRAG МSK1 МSK2 | Це введення | ||
| Куратор NVIDIA NeMo | МSK2 МSK3 Доки SemDeDup | |
| MinHash LSH Google C4, GPT-3 папір | ||
| МSK0 SemHash | МSK2 | GitHub |
Наше значення 0.90 співпадає з найкращою практикою в галузі семантичного відокремлення
| Тип змісту МSK1 Причина МSK2 | |
|---|---|
| КрестніM SK1документи при вглинанні МSK2 Захищають роздільну здатність та приналежність до джерела МSK4 | |
| Невеликий МSK1 Содержание схожості МSK2 | Зважається семантично розрізненим |
| Різні типи сегментів МSK1 Напис та абзац мають різні структурні ролі | |
| Парафразе мов МSK1 МSK2 Захищає різноманіття мов |
| Funkція МSK1 Статус МSK2 Местонахождение | |
|---|---|
| Сконфигуровані пороги | МSK2 Втілені МSK3 DeduplicationConfig клас |
| Пришвидшений розпад МSK1шкала журналу МSK2 | BoostDecayMode.Logarithmic |
| Аналітика відхиленняM SK1метрія МSK2 МSK3 Втілення | DeduplicationResult<T> запис |
Інтеграція DI-сервисів IDeduplicationService |
Ця стратегія розмноження:
© 2026 Scott Galloway — Unlicense — All content and source code on this site is free to use, copy, modify, and sell.