# Reduced RAG: Stop Stuffing Context Windows and Start Extracting Signals

<datetime class="hidden">2026-01-08T19:00</datetime>

<!-- category -- AI, RAG, LLM, Architecture, Semantic Search -->
إذا كنت ' جديدة جداً لـ RAG , تبدأ مع [شرح RAG](/blog/rag-primer) و [معمار RAG](/blog/rag-architecture). هذا пост هو لتلك النقطة حيث قمت ببناء خط أنابيب RAG *في الغالب* يعمل … والآن أنت ' تدفع له في التكلفة

**ما الذي يغطي هذا** النمط المعماري وراء الإنتاج RAG. لليد- في التنفيذ [بناء مُلخص दस्तावेज مع RAG](/blog/building-a-document-summarizer-with-rag).

**من أين يأتي** لقد بنيت [DocSummarizer](/blog/building-a-document-summarizer-with-rag) (آلة RAG للوثائق), [المزيج للبيانات](/blog/datasummarizer-how-it-works) (حرك بيانات RAG), [ImageSummarizer](/blog/constrained-fuzzy-image-intelligence) ( محرك التصوير RAG), [AudioSummarizer](/blog/audiosummarizer-forensic-audio-characterization) ( محرك آوديو RAG ), و [lucidRAG](/blog/lucidrag-multi-document-rag-web-app) (multi-document Q&AM SK3 نفس النمط يستمر في الظهور على جميع المستندات

> ملاحظة: ربما لاحظتم بشكل صحيح أن البحث الدلالي في هذا الموقع قد أُكسر...ونعم هوM SK2مشكلة بإعدادات لم أحصل علىها 'لم يكن لدي الوقت لإصلاحها بعدMSC4 ليست نظرية سيئة Mスク5

## غلاف مصطلحات RAG السريع

| مصطلح | ما يعنيه | مثال S|
|------|---------------|---------|
| **RAG** | البحث- الجيل المتزايد | تقديم دليل لشركتك قبل الإجابة
| **تشيلينغ** | تقسيم الملفات إلى أجزاء أصغر | تفكيك الPDF إلى فقرات
| **أعلى-k** | أحصل على الـ k "أفضل" النتائج من بحث | | 3 | 4 | أظهر لي | 5 | الأجزاء الأكثر أهمية | 6 | 7
| **البحث فيكتوري** | العثور على نص متشابه باستخدام المداخلات | | | " | العثور على Docs مشابهة لهذه الرسالة الخطأ
| **BM25** | البحث عن الكلمات المحورية | "بحث عن المذكرات التي تحتوي على ♫'timeout' و ♫ 'database ♫
| **نافذة السياق** | كم عدد النص الذي يمكنك أن تضعه في الاقتراح | جميل و مكلف |
| **الإشارات** | الحقائق المستخرجة من دون الذكاء الصناعي | "خلقة: ♫2025-01-15", |" أوليةM SK6 مرتفعة

الترميز-الجيل المتزايد M SK1RAG) أصبح أحد تلك العبارات التي تعني *كل شيء ولا شيء*.

بالنسبة للعديد من الفرق، , “ "RAG" ” هو الآن "M SK3"

1. مستندات Chunk
2. دمجهم
3. Retrieve top-k
4. ألصق كل شيء في المؤشر
5. أسأل النموذج “إيجاده ”

إنه يعمل
إلى أن يختفي

إنها مكلفة، مكلفه، مألوف، مئوف، صعبة للتفكير فيها، مآلف، صريحة، وتعطي مسؤولية النموذج، مبدئية، تحليل البنية، مئوية، تفرض المرشحات، مئة، تقرر ما يهم، سبعة، توصيل التعارضات، ثمانية، وتكون على يقين بها

عندما يقول الناس “RAG يسبب هلوس ” أو “RAg لا يفرز ’”, جيداً يلومون في الغالب على المكونات الخاطئة

المشكلة هي’t RAG.
المشكلة هي **RAG الغبي**.

هذا пост يصف نموذجاً مختلفاً **تقلل من RAG** - تستخدم LLMs *أقل*, لا أكثر , من خلال استخراج الإشارات المعرفية مقدماً وعلاج النماذج كما *محركات التصنيع*, لا *محلات البيانات*.

[TOC]

## الخطأ الأساسي: في التعامل مع النوافذ السياقية كالخزن

نافذة السياق هي:

- المختبر
- لم يتم تدويرها
- غالية الثمن
- تم إعادة الدفع في كل طلب

إنه ليس مخزن بيانات.

عندما تقول “ فقط ألصق المزيد في المؤشر ”, فأنت تسأل النماذج

- re-parse structure every time
- استنتج المرشحات بدلاً من فرضها
- تلخص التفاصيل التي ربما تحتاجها لاحقاً
- تبدو متأكدة حتى عندما يكون ’ خاطئا

هذا هو السبب في أن نماذج RAG تبدو عظيمة وأنظمة الإنتاج RAG تتحلل بصمت

## ما يعنيه “Reduced RAG”

reduced RAG flips the default.

بدلاً من:

> استرجع النص ودع النموذج يقرر ما هو المهم.

أتعلمون

> قرر ما الذي يهم مرة واحدة, تخزينه, وتشارك النموذج فقط عندما تحتاج إلى التركيبM SK2

في الواقع هذا يعني : **الإمتصاص القطعي , البحث الرخيص , الإنتاج المحدود**.

إذا كان هذا يبدو مألوفاً [الغموض المقيد](/blog/constrained-fuzziness-pattern): ندع مكونات الإحتمالية *تقترح*; تترك الانظمة المعرفية *يقرر*.

## RAG التقليدية vs RAG المنخفض

أولاً دعونا نرى ما يفعله معظم الفرق

```mermaid
flowchart LR
    subgraph Traditional["❌ Traditional RAG: Everything Through the LLM"]
        T1[Documents] --> T2[Chunk Everything]
        T2 --> T3["Embed All Chunks<br/>(once)"]
        T3 --> T4[Vector Search]
        T4 --> T5["Paste Top-K<br/>(per query)"]
        T5 --> T6["LLM Decides<br/>(per query)"]
        T6 --> T7[Answer]
    end

    style Traditional stroke:#ef4444,stroke-width:3px
    style T6 stroke:#ef4444,stroke-width:3px
    style T5 stroke:#ef4444,stroke-width:2px
```

**مشاكل:**

- LLM re- يفسر الهيكل لكل سؤال
- هل يمكن أن تطبق المرشحات (only "ask nicelyM SK3 via prompt)
- مقياس تكاليف الرموز مع الطلبات (↑ لكل الطلبة)
- هلوسات عندما يخترع النموذج مرشحات

الآن هنا ' مقاربة RAG المنخفضة :

```mermaid
flowchart TB
    subgraph Ingestion["✅ Ingestion (Once - Pay Upfront)"]
        I1[Source Docs] --> I2[Parse Structure]
        I2 --> I3["Extract Signals<br/>(deterministic)"]
        I3 --> I4[(Structured Fields)]
        I2 --> I5[Semantic Units]
        I5 --> I6[(Vector Store)]
        I2 --> I7[(Evidence Store)]
    end

    subgraph Query["Query Time (Cheap Per Query)"]
        Q1[User Question] --> Q2{Extract Filters}
        Q2 --> Q3["Filter Database<br/>(no LLM)"]
        Q2 --> Q4["BM25 Search<br/>(no LLM)"]
        Q2 --> Q5["Vector Search<br/>(no LLM)"]

        Q3 --> R[Candidate Set]
        Q4 --> R
        Q5 --> R

        R --> S["Small Evidence Pack<br/>(5 sources not 50)"]
    end

    subgraph Generation["LLM (Bounded Synthesis Per Query)"]
        S --> L[Synthesize Answer]
        L --> A[Answer + Citations]
    end

    style Ingestion stroke:#22c55e,stroke-width:3px
    style Query stroke:#3b82f6,stroke-width:3px
    style Generation stroke:#f59e0b,stroke-width:2px
    style I3 stroke:#22c55e,stroke-width:3px
    style Q3 stroke:#3b82f6,stroke-width:3px
    style L stroke:#f59e0b,stroke-width:3px
```

**الاختلافات الرئيسية:**

| مرحلة | RAG تقليدي | RAg أقل |
|-------|----------------|-------------|
| **الإمتصاص** | فقط قم بتجزئة ودمج | استخرج dates, التصنيفاتMSC3 EntitiesM SK4 أعلام جودة |
| **التصفيف** | أطلب من LLM أن يرشح في الاقتراح | قاعدة بيانات أين Klauses |
| **البحث** | فقط فيكتور | BM25 + فيكتور
| **دور LLM** | فكّر, فلترM SK2 والإجابة | فقط قم بتجميع الإجابة | |
| **التكلفة** | كل طلب يدفع مقابل السياق الكامل | استهلاك مرة واحدة, الطلبات رخيصة |

## الخطوة 1: الإمتصاص المعرفي ( الجزء الممل الذي يهم

في وقت الإمتصاص, تحليل ما يمكنك *بدون* LLM.

**مثال: نظام التذكرات لدعم**

بدلاً من مجرد تجزئة التذكرات إلى نص

```
Traditional: "Ticket #1234: Customer complained about slow loading..."
→ Embed entire text
→ Hope the LLM figures out it's about performance
```

استخرج الإشارات إلى الأمام:

```csharp
// Parse once during ingestion
var ticket = new SupportTicket
{
    Id = "1234",
    CreatedDate = DateTime.Parse("2025-01-15"),
    Category = "Performance",              // ← Deterministic field
    Product = "WebApp",                     // ← Filterable
    Priority = "High",                      // ← Sortable
    Customer = "Enterprise",                // ← Segment filter
    SentimentScore = -0.3,                  // ← Computed once
    Tags = ["slow-loading", "timeout"],     // ← Searchable
    Text = "Customer complained about..."   // ← Still keep for RAG
};
```

**ما يمكن استخراجه بشكل محدد:**

| نوع الإشارات | أمثلة | لماذا يهم |
|-------------|----------|----------------|
| **مؤقتة** | التاريخ الذي تم إنشاءهM SK1 التاريخ المحدث, نهاية عمر | " يظهر الأسبوع الماضي فقطMSC5 الأخطاءMST6 ||
| **التصنيف** | حالة, أولويةM SK2 قسمMSC3 منتج | " محرك لتذكرات الفريق المحمولة " | |
| **رقمية** MSC0 السعرMSc1 الكمية MSc2 النتيجة MScs3 الثقة MSC4 msc5 تسلسل بدقة
| **الهوية** | الكاتبM SK1 رقم الزبون,SKUMSC3 faktury # | ≥"كل التذكرات من الزبون XMNK7 ||
| **الجودة** | ثقة في التصوير بالرنين المغناطيسي
| **البروفينس** | نظام المصدر, مسار دوتنهM SK2 موقع URL | | | " فقط من سجلات الإنتاج

افعلها مرة واحدة. احتفظوا بالانتاج. هذا هو substrate الذي يمكن نظامكم الاعتماد عليهM SK3

**الجزء الصلب من RAG هو ' هو النموذج - هو ' هو كل شيء قبل النموذج** للتطبيقات ال concretos , см. [بناء مُلخص दस्तावेज مع RAG](/blog/building-a-document-summarizer-with-rag) و [DocSummarizer: بناء أنابيب RAG](/blog/docsummarizer-rag-pipeline).

## الخطوة 2: تخزين الإشارات (وحفظ الأدلة)

بدلاً من التعامل مع "chunks" كوحدة الحقيقةM SK2 تخزين الحقول المبنية , إشارة - وحدات غلظة M SK5 مداخلات MSC6 ومؤشرات رجوعاً إلى المصدر

النص لا يزال جزء من النظام - لكنه يصبح **الأدلة**, لا " مهما حدث لنا أن نلصق في المفتاح

هذا هو الفرق بين "أجابات RAG هي حوجة " وأجابات "أسئلة RAG قابلة للفحص

### " لكن كيف أعرف أي إشارات يمكن استخراجها

أنت لا

ذلك ' هو النقطة الكاملة للحفظ **إشارات خام** بدلا من LLM-خلاصات معالجة.

**RAG التقليدية (تكلفة التغيير):**

```csharp
// ❌ You asked the LLM to "summarize the key points"
var summary = await llm.Summarize(ticket.Text); // Expensive
await db.SaveAsync(summary); // Threw away the original structure

// Later: "Actually, we need sentiment scores too"
// 😱 Have to re-process 10,000 tickets through LLM again!
```

**RAG المنخفض ( رخيصة للتغيير):**

```csharp
// ✅ Store raw signals extracted deterministically
var signals = new TicketSignals
{
    Text = ticket.Text,                    // ← Keep original
    WordCount = ticket.Text.Split().Length, // ← Cheap to compute
    ContainsErrorCode = Regex.IsMatch(ticket.Text, @"ERR-\d+"),
    MentionedProducts = ExtractProducts(ticket.Text), // ← Heuristic
    SentimentWords = CountSentimentWords(ticket.Text), // ← Word lists
    CreatedHour = ticket.Created.Hour      // ← Maybe useful later?
};

// Later: "We need to prioritize by sentiment"
// ✅ Just add a computed column - no LLM re-run needed!
await db.ExecuteSqlAsync(@"
    ALTER TABLE Tickets ADD COLUMN SentimentScore AS
    (SentimentWords->>'positive' - SentimentWords->>'negative')
");
```

**ما الذي حدث للتو**

- تم تخزينه **إشارات أكثر مما تحتاجه** (cheap)
- عندما تغيرت الشروط , أنت **تم إعادة حسابها من الإشارات المخزنة** (free)
- لم تقوموا بإعادة '-تشغيل استنتاج LLM على 10,000وثائق MSC3تكلفة MSC4 وقت msc5استهلاك msc6

هذا نفس النمط كما :

- **[DiSE (التطور الاصطناعي الموجه)](/blog/dise-architecture-overview)** - يحفظ نتائج الاختبارM SK1 تاريخ الطفرات , قياسات الجودة. عندما تقوم بتغيير وظيفة التقييمMSC4 لا تقوم بـ' لا تعيد ــ- تقوم بتشغيل تطور الـ LLM ــ — تعيد الـ - تقيم المتقدمين الحاليين من الإشارات المخزنة .
- **[إكتشاف البوت](/blog/learning-lrus-when-capacity-makes-systems-better)** - يحفظ نماذج الطلباتM SK1 إشارات زمنية, سلوكيات حُوصية . عندما تقوم بضبط الحد الفاصلي |(0.3 | → | МSK6 | لا تقوم بإعادة معالجة حركة المرور |— | تقوم بـ إعادة تقييم إشارات المخزنة | .

**القاعدة:** تذكر جيداً *قبل* الـ LLM . تحديث ذاكرتك "memory" | ( | منطق استرجاعي |) | مجاناً

**الفوائد المعمارية الرئيسية: التخفيف .**
لأنك تخزن الإشارات المعرفية جنباً إلى جنب مع الدمجات (لا بدلاً عنهم), يمكن لكل جزء من النظام أن يتغير بشكل مستقلM SK2 Swap embedding models ? ReMSC4 embed without touching signalsMST5 Add a new signalM ST6 Compute it from stored text without reM st7embeddingM St8 Tune rankingMst9 Adjust signal weights and scoring logic without reindexingMSt10

مع متاجر فائقة -vector (like Qdrant), يمكنك حتى إضافة **العديد من الدمجات لكل وثيقة**. تريد أن تحاول نموذجاً جديداً من الدمج? أضيفه إلى جانب النموذج الحالي وتقوم بتغييره تدريجياً . تجريب كلاً في الإنتاجM SK3 تقارن الجودةMSC4 ثم تخيّل النموذج القديم

يمكن لكل جزء أن يتطور دون الحاجة إلى إعادة بناء أنابيب كاملة - و بدون تحطيم الآخرين .

### ما هي الإشارات التي يجب أن تخزنها

تخزين أي شيء يمكنك حسابه **بسعر رخيص ومحدد**.

**مهم:** الإشارات هي فقط **تسلسلات نصية قصيرة, أرقام, وبووليان**—لا هياكل بيانات ضخمةM SK1 أنت'تم تخزينه "الكفاءةMSC4 |(8 الصفحات | ), لا ♫" شكّلت الزبائن عن أوقات الشحن البطيئة .

```csharp
public class DocumentSignals
{
    // Always extract (almost free)
    public int CharCount { get; set; }              // Example: 1247
    public int WordCount { get; set; }              // Example: 203
    public int ParagraphCount { get; set; }         // Example: 5
    public string[] UniqueWords { get; set; }       // Example: ["timeout", "error", "api"]

    // Structural (parse once)
    public bool HasCodeBlocks { get; set; }         // true/false
    public bool HasLinks { get; set; }              // true/false
    public int HeadingCount { get; set; }           // Example: 3

    // Heuristic (simple patterns)
    public string[] MentionedProducts { get; set; }       // Example: ["WebApp", "API"]
    public string[] ErrorCodes { get; set; }              // Example: ["ERR-404", "ERR-500"]
    public Dictionary<string, int> SentimentWords { get; set; } // { "positive": 3, "negative": 7 }

    // Metadata (already available)
    public DateTime Created { get; set; }           // Example: 2025-01-15T14:23:00
    public string Author { get; set; }              // Example: "user@example.com"
    public string Category { get; set; }            // Example: "Performance" (not essay-length)

    // Computed (cheap math)
    public double ReadingTimeMinutes { get; set; }  // Example: 4.2
    public double KeywordDensity { get; set; }      // Example: 0.034
}
```

**مقارنة في تكلفة تخزينها:**

| ما تخزنه | الحجم لكل ملف | S10k مستندات M|
|----------------|------------------|---------------|
| **النص الكامل** مسك0 ~5 كيب ماسك2 | | ماسك3 | MB | |
| **كل هذه الإشارات** | ~500 بايتات | | | 5 | MB ||
| **الخلاصة التي تنتجها LLM-** مسك0 ~2 كيب ماسك2 | | ماسك3 | MB | |

الإشارات هي **10x أصغر** أكثر من النص, **4x أصغر** من مجموعات LLM, و **أرخص بكثير** لإعادة الحساب (لأنك لا تحتاج إلى

**عندما تدرك أنك بحاجة إلى إشارة مختلفة** فقط قم بحسابها من البيانات الخام المخزنة.

هذا هو السبب "overM SK1extraction" is safeMSC3 you pay once in storage (negligibleMNK5 not repeatedly in inference | |

## الخطوة 3: البحث دون LLM ( أغلب الاسئلة لا تحتاجه

أغلب الأسئلة "RAG" هي فقط أسئلة بحث مع القيود

- "مجرد آخر المراجعات"
- "من أجل زبائن المملكة المتحدة فقط"
- "بصرف النظر عن الخطة المدفوعة
- "أخطاء فقط من الأسبوع الماضي"

**RAG التقليدية** ( رخيصةM SK1 غير موثوقية):

```csharp
// ❌ Paste everything into prompt and hope
var chunks = await vectorSearch.SearchAsync(query, k: 50); // 50 chunks!
var prompt = $@"
Given these 50 chunks of text, answer the question but ONLY use
docs from last week and ONLY for UK customers.

Chunks: {string.Join("\n", chunks)}

Question: {userQuestion}
";
var answer = await llm.GenerateAsync(prompt); // Expensive + unreliable
```

**تقلل من RAG** (cheap, deterministicM SK2

```csharp
// ✅ Filter first, retrieve less, synthesize last
var candidates = await db.Tickets
    .Where(t => t.CreatedDate > DateTime.Now.AddDays(-7))  // ← Database does this
    .Where(t => t.Region == "UK")                          // ← Not the LLM!
    .ToListAsync();

// Hybrid search on the filtered set
// (In production: push BM25 to database/index, not in-memory LINQ)
var bm25Results = candidates.Where(c => c.Text.Contains(keyword));
var vectorResults = await vectorSearch.SearchAsync(query, k: 5, filter: candidates);

// Small evidence pack
var evidence = RRF.Merge(bm25Results, vectorResults).Take(5);

// LLM only synthesizes
var answer = await llm.GenerateAsync($@"
Synthesize an answer using ONLY these 5 sources:
{FormatEvidence(evidence)}

Question: {userQuestion}
");
```

**ما الذي حدث للتو**

- قاعدة بيانات تلقائياً (ليس LLM)
- LLM يرى مصادر 5 بدلاً من 50 (90% تقليل الرموز
- فلترات متضمنة, لا "من المفترضM SK2

هذا هو السبب في أهمية البحث الهجين في الإنتاج [البحث الهجين & Auto-Indexing](/blog/rag-hybrid-search-and-indexing) هو الجزء الأكثر عمليّة من سلسلة RAG بأكملها.

### إختياري: استخدام الـ LLM لإستخلاص النية ( كعرض

إذا كان سؤالاً مشوشاً حقاً *يمكن* استخدام نموذج صغير لإستخراج الغرض/المرشحات ("تقارن vs شرح vs حل المشاكلM SK2

```csharp
// Use small model to propose filters (ephemeral - discarded after use)
var intent = await smallModel.ExtractIntent(userQuestion);
// Returns: { intent: "troubleshoot", filters: { priority: "high", product: "api" } }

// Validate the proposal against known fields (deterministic)
var validatedFilters = ValidateAgainstSchema(intent.filters);

// Use validated filters for retrieval
var results = await db.Tickets.Where(validatedFilters).ToListAsync();
```

**المبدأ الأساسي: يقترح LLM, ت Valides الطبقة المعياريةM SK2**

هذا هو أساس [الغموض المقيد](/blog/constrained-fuzziness-pattern) النمط.

للغوص العميق في أنماط تنفيذ مؤقتة حيث تستخدم LLMs مؤقتاً دون إستمرار بنتائجها, شاهد [النار وdon't لا تنسى تماما](/blog/fire-and-dont-quite-forget-ephemeral-execution).

## خطوة 4: LLMs as synthesis engines (not judges)

فقط بعد البحث تتصل بالـ LLM . وتعطيه مجموعة صغيرة , من الحقائق الواضحة مع اشارات للدلائل وتعليمات واضحة عن عدم اليقين

النموذج' وظيفته: **تنصي , شرح , مقارنة**. لا: **فرض القيود**.

إذا كنت مهتماً بـ “LLMs تسحب النافذة السياقية بأكملها إلى الإجابة . . [سحب السياق الخافت المقيد](/blog/constrained-fuzzy-context-dragging):it’is not malicious - it’s what you asked it to doM SK4

## لماذا هذا أكثر أماناً *و* أرخص

### مقارنة بالتكاليف (مثال ملموس)

الطلبية-of- مقياس مقارنة لنظام مساند عملاء نموذجي

**سيناريو:** 10,000 بطاقات دعم, 1,000 أسئلة يوميا

| المقاربة | تكلفة الإمتصاص | | | لكل |- | تكلفة البحث | | | التكلفة اليومية ||
|----------|----------------|----------------|------------|
| **RAG التقليدية** | نضع 10 تذاكر | 50 قطع S× سياق كبير SSK5 \~**$75/يوم** |
| **تقلل من RAG** | نضع + نستخرج الإشارات | 5 قطع × سياق صغير | \~**$7.50/يوم** |

**ترتيب الحجم:** ~10x تقليل من التكلفة في اليوم

**أفضل من ذلك** مع الأدلة الجيدة والتصفية الإفتراضية , أنت على الأرجح لا تحتاج إلى نموذج الحدود على الإطلاق . نموذج أولاما محلي | ( | خالي |) | مع مجموعة صغيرة من الأدلات غالباً يتفوق على GPT |

فائض: وقت تقليل لحل الأخطاء, أقل تدرجات مالية , ونماذج مرنة M SK3 نماذج تخريب بدون تغييرات معمارية

### الوثوقية

**RAG التقليدية** (آمل-الصفر المبني على الـ):

```csharp
// ❌ Prompt says "only UK customers" but model can ignore it
var answer = await llm.Generate(prompt); // No guarantee
```

**تقلل من RAG** (الصفر المضغوط):

```csharp
// ✅ Database physically prevents non-UK results
var results = db.Tickets.Where(t => t.Region == "UK"); // Guaranteed
```

**لماذا هو أكثر أماناً** المرشحات تم فرضها قبل الجيل (نموذج لم يكن يملكها مطلقاً , لا يمكنه ' لا ينسيها ), و الهلاوس محصورة بالدلائل التي تتحكم بها .

### التفسير

**RAG التقليدي:** "أخبرنا النموذج بهذا, لكنيM SK2 لست متأكدا لماذا أو من أي قطعة جاءت من

**RAG تقلص :**

```csharp
// You know exactly why each result matched
var result = new SearchResult
{
    Text = "Server timeout error",
    MatchedBecause = new[]
    {
        "Region = UK (database filter)",
        "Created in last 7 days (date filter)",
        "BM25 score: 4.2 (keyword 'timeout')",
        "Vector similarity: 0.89 (semantic match)"
    },
    SourceChunks = [chunk1, chunk2], // ← Audit trail
    ConfidenceScore = 0.89
};
```

يمكنك فحص لماذا كل نتيجة متطابقة, إظهار الأدلة عندما يكون الثقة منخفضة , وحل مشاكل الإنتاج عن طريق دراسة مجموعة المرشحين قبل تجميع LLM.

## Getting started: إعادة التصنيع التقليدي → reduced RAG

إذا كان لديك بالفعل نظام RAG يعمل, هنا's كيف تنتقل إلى :

### الخطوة 1: أضف الحقول المبنية إلى استهلاكك

**قبل:**

```csharp
public class Document
{
    public string Id { get; set; }
    public string Text { get; set; }           // ← Only unstructured text
    public float[] Embedding { get; set; }
}
```

**بعد:**

```csharp
public class Document
{
    public string Id { get; set; }
    public string Text { get; set; }           // ← Keep for evidence
    public float[] Embedding { get; set; }

    // Add deterministic signals (extract once during ingestion)
    public DateTime CreatedDate { get; set; }  // ← Parse from metadata
    public string Category { get; set; }       // ← Extract from filename/tags
    public string Author { get; set; }         // ← From file properties
    public string[] Tags { get; set; }         // ← Parse from content/metadata
    public double QualityScore { get; set; }   // ← Compute heuristics
}
```

### الخطوة 2: تحريك المرشحات خارج الملاحظات , الى الاسئلة

**قبل:**

```csharp
var prompt = "Only use docs from last month for product 'API'. Query: " + userQuery;
var chunks = await vectorStore.Search(userQuery, k: 50);
var answer = await llm.Generate(prompt + chunks); // ❌ LLM might ignore filters
```

**بعد:**

```csharp
// ✅ Database enforces filters
var candidates = await db.Documents
    .Where(d => d.CreatedDate > DateTime.Now.AddMonths(-1))
    .Where(d => d.Category == "API")
    .ToListAsync();

// Search only the filtered candidates
var results = await vectorStore.Search(userQuery, k: 5, filter: candidates.Select(c => c.Id));
var answer = await llm.Generate(FormatEvidence(results)); // Much smaller context
```

### الخطوة 3: إضافة البحث الهجين (BM25

```csharp
// Combine keyword and semantic search
var keywordResults = await db.Documents
    .Where(d => EF.Functions.ToTsVector("english", d.Text)
        .Matches(EF.Functions.ToTsQuery("english", keywords)))
    .ToListAsync();

var vectorResults = await vectorStore.Search(userQuery, k: 20);

// Merge using Reciprocal Rank Fusion (RRF)
var merged = RRF.Merge(keywordResults, vectorResults, k: 5);
```

أنظروا [البحث الهجين & Auto-Indexing](/blog/rag-hybrid-search-and-indexing) لتنفيذ كامل.

### الخطوة 4: نقيس الفرق

تتبع هذه القياسات قبل وبعدها:

```csharp
public class RAGMetrics
{
    public int PromptTokens { get; set; }           // Should drop by 80-90%
    public int CandidatesRetrieved { get; set; }    // Should drop from 50+ to 5-10
    public TimeSpan QueryLatency { get; set; }      // Should improve
    public bool FiltersEnforced { get; set; }       // Should be true
    public List<string> EvidenceSources { get; set; } // Should be traceable
}
```

## قاعدة إبهام

إذا كان نظامك يعتمد على أي وقت مضى.

## البطاقة النموذجية

| | |
|---|---|
| **الرغبة** | جعل RAG قابلة للتنبؤ, رخيصةM SK2 وقابلة للحل |
| **القوى** | تكاليف الرموز العالية, التصفية الضعيفةM SK2 الهلوسة الصامتة , الإشارات غير المطبعة
| **الحل** | نستخرج الإشارات مرة → نفرض القيود بشكل محدد | → | نحصل على الأدلة |→ | لنسمح لـ LLM أن يتجمع ضمن الميزانية |
| **النتائج** | المزيد من الهندسة الأمامية ; سلوك عملي أفضل بشكل كبير

---


## الخلاصة: نموذج عقلي reduced RAG

RAG المُقلص ليس ضد 't -LLM. إنه ضد \'M SK4wasteMSC5

فكروا بها بهذه الطريقة

```
Traditional RAG = "LLM, here's 50 chunks. Figure out what matters and answer."
Reduced RAG    = "Database, filter to 100. BM25, find keywords. Vector, find similar.
                  Now LLM, here are the 5 most relevant sources. Synthesize an answer."
```

**التحول:**

- **من:** LLM كأوركول (يفعل كل شيء)
- **إلى:** LLM كمحرك صناعي ( يفعل شيئًا واحدًا جيدا)

**البدائيات:**

1. **الإشارات** (إختباريM SK1 - fechas, categories, scoresSSK5 filters
2. **الأدلة** (text) - ما تظهره لـ LLM
3. **القيود** (حدودM SK1 - ميزانية الرموز, تصديق المرشحةMSC4 požadavky الاستشهاد

**النمط:**

- استخرج المؤشرات مرة واحدة (ingestion)
- فلتر بشكل محدد ( قواعد البيانات جيدة في هذا
- البحث الهجين (BM25 + فيكتوراتM SK3
- إعادة صياغة محدودة (حزمة أدلة صغيرة → LLM)

هذا ما يحدث عندما تطبق تخصص البرمجة العادي للأنظمة التي تضم نماذج اللغة

## الخطوة التالية

إذا كنت مستعداً لبناء هذا

1. **أبدأ ببساطة:** أضف حقل مكون واحد (CreatedDate) و فلتر قاعدة بيانات واحد
2. **القياس الأول:** تُعد رموز التتبع قبل /بعد
3. **إضافة البحث الهجين:** تنفيذ مصادر BM25 + مع RRF ([دليل هنا](/blog/rag-hybrid-search-and-indexing))
4. **بناء بشكل تدريجي:** لا تقلل كل شيء في الحال

**تطبيقات مرجعية:**

- [DoomSummarizer: بحوث عميقة](/blog/doomsummarizer-deep-research) - Reduced RAG in practiceMSC1 6-signal RRF fusionM SK3 entity profiles, semantic graph discoveryMska5 and parallel longM Ska6form synthesis mska7 all from a single binary
- [بناء مُلخص दस्तावेज مع RAG](/blog/building-a-document-summarizer-with-rag) - تقدم عملي للتطبيق
- [أنابيب DocSummarizer RAG](/blog/docsummarizer-rag-pipeline) - أنابيب الإمتصاص الكاملة
- [AudioSummarizer](/blog/audiosummarizer-forensic-audio-characterization) - تشخصية طبية صوتية مع تشويه السماعة
- [lucidRAG](/blog/lucidrag-multi-document-rag-web-app) - تطبيق كامل للويب مع البحث الهجين
- [StyloFlow:Signal-Workflows المحركة](/blog/styloflow-signal-driven-workflows) - محرك الأوركستراكس ل أنابيب RAG متعددة - المرحلة مع تنفيذ محدد و التدرج
- [الغموض المقيد](/blog/constrained-fuzziness-pattern) - النمط الأساسي

البنية التحتية موجودة بالفعل. عليك فقط التوقف عن التعامل مع نافذة السياق مثل قاعدة بيانات