This is a viewer only at the moment see the article on how this works.
To update the preview hit Ctrl-Alt-R (or ⌘-Alt-R on Mac) or Enter to refresh. The Save icon lets you save the markdown file to disk
This is a preview from the server running through my markdig pipeline
Thursday, 08 January 2026
إذا كنت ' جديدة جداً لـ RAG , تبدأ مع شرح RAG و معمار RAG. هذا пост هو لتلك النقطة حيث قمت ببناء خط أنابيب RAG في الغالب يعمل … والآن أنت ' تدفع له في التكلفة
ما الذي يغطي هذا النمط المعماري وراء الإنتاج RAG. لليد- في التنفيذ بناء مُلخص दस्तावेज مع RAG.
من أين يأتي لقد بنيت DocSummarizer (آلة RAG للوثائق), المزيج للبيانات (حرك بيانات RAG), ImageSummarizer ( محرك التصوير RAG), AudioSummarizer ( محرك آوديو RAG ), و lucidRAG (multi-document Q&AM SK3 نفس النمط يستمر في الظهور على جميع المستندات
ملاحظة: ربما لاحظتم بشكل صحيح أن البحث الدلالي في هذا الموقع قد أُكسر...ونعم هوM SK2مشكلة بإعدادات لم أحصل علىها 'لم يكن لدي الوقت لإصلاحها بعدMSC4 ليست نظرية سيئة Mスク5
| مصطلح | ما يعنيه | مثال S | |||||||
|---|---|---|---|---|---|---|---|---|---|
| RAG | البحث- الجيل المتزايد | تقديم دليل لشركتك قبل الإجابة | |||||||
| تشيلينغ | تقسيم الملفات إلى أجزاء أصغر | تفكيك الPDF إلى فقرات | |||||||
| أعلى-k | أحصل على الـ k "أفضل" النتائج من بحث | 3 | 4 | أظهر لي | 5 | الأجزاء الأكثر أهمية | 6 | 7 | |
| البحث فيكتوري | العثور على نص متشابه باستخدام المداخلات | " | العثور على Docs مشابهة لهذه الرسالة الخطأ | ||||||
| BM25 | البحث عن الكلمات المحورية | "بحث عن المذكرات التي تحتوي على ♫'timeout' و ♫ 'database ♫ | |||||||
| نافذة السياق | كم عدد النص الذي يمكنك أن تضعه في الاقتراح | جميل و مكلف | |||||||
| الإشارات | الحقائق المستخرجة من دون الذكاء الصناعي | "خلقة: ♫2025-01-15", | " أوليةM SK6 مرتفعة |
الترميز-الجيل المتزايد M SK1RAG) أصبح أحد تلك العبارات التي تعني كل شيء ولا شيء.
بالنسبة للعديد من الفرق، , “ "RAG" ” هو الآن "M SK3"
إنه يعمل إلى أن يختفي
إنها مكلفة، مكلفه، مألوف، مئوف، صعبة للتفكير فيها، مآلف، صريحة، وتعطي مسؤولية النموذج، مبدئية، تحليل البنية، مئوية، تفرض المرشحات، مئة، تقرر ما يهم، سبعة، توصيل التعارضات، ثمانية، وتكون على يقين بها
عندما يقول الناس “RAG يسبب هلوس ” أو “RAg لا يفرز ’”, جيداً يلومون في الغالب على المكونات الخاطئة
المشكلة هي’t RAG. المشكلة هي RAG الغبي.
هذا пост يصف نموذجاً مختلفاً تقلل من RAG - تستخدم LLMs أقل, لا أكثر , من خلال استخراج الإشارات المعرفية مقدماً وعلاج النماذج كما محركات التصنيع, لا محلات البيانات.
نافذة السياق هي:
إنه ليس مخزن بيانات.
عندما تقول “ فقط ألصق المزيد في المؤشر ”, فأنت تسأل النماذج
هذا هو السبب في أن نماذج RAG تبدو عظيمة وأنظمة الإنتاج RAG تتحلل بصمت
reduced RAG flips the default.
بدلاً من:
استرجع النص ودع النموذج يقرر ما هو المهم.
أتعلمون
قرر ما الذي يهم مرة واحدة, تخزينه, وتشارك النموذج فقط عندما تحتاج إلى التركيبM SK2
في الواقع هذا يعني : الإمتصاص القطعي , البحث الرخيص , الإنتاج المحدود.
إذا كان هذا يبدو مألوفاً الغموض المقيد: ندع مكونات الإحتمالية تقترح; تترك الانظمة المعرفية يقرر.
أولاً دعونا نرى ما يفعله معظم الفرق
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
مشاكل:
الآن هنا ' مقاربة RAG المنخفضة :
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 والإجابة | فقط قم بتجميع الإجابة | |
| التكلفة | كل طلب يدفع مقابل السياق الكامل | استهلاك مرة واحدة, الطلبات رخيصة |
في وقت الإمتصاص, تحليل ما يمكنك بدون LLM.
مثال: نظام التذكرات لدعم
بدلاً من مجرد تجزئة التذكرات إلى نص
Traditional: "Ticket #1234: Customer complained about slow loading..."
→ Embed entire text
→ Hope the LLM figures out it's about performance
استخرج الإشارات إلى الأمام:
// 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 و DocSummarizer: بناء أنابيب RAG.
بدلاً من التعامل مع "chunks" كوحدة الحقيقةM SK2 تخزين الحقول المبنية , إشارة - وحدات غلظة M SK5 مداخلات MSC6 ومؤشرات رجوعاً إلى المصدر
النص لا يزال جزء من النظام - لكنه يصبح الأدلة, لا " مهما حدث لنا أن نلصق في المفتاح
هذا هو الفرق بين "أجابات RAG هي حوجة " وأجابات "أسئلة RAG قابلة للفحص
أنت لا
ذلك ' هو النقطة الكاملة للحفظ إشارات خام بدلا من LLM-خلاصات معالجة.
RAG التقليدية (تكلفة التغيير):
// ❌ 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 المنخفض ( رخيصة للتغيير):
// ✅ 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')
");
ما الذي حدث للتو
هذا نفس النمط كما :
القاعدة: تذكر جيداً قبل الـ 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 الصفحات | ), لا ♫" شكّلت الزبائن عن أوقات الشحن البطيئة .
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: "[email protected]"
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 | |
أغلب الأسئلة "RAG" هي فقط أسئلة بحث مع القيود
RAG التقليدية ( رخيصةM SK1 غير موثوقية):
// ❌ 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
// ✅ 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}
");
ما الذي حدث للتو
هذا هو السبب في أهمية البحث الهجين في الإنتاج البحث الهجين & Auto-Indexing هو الجزء الأكثر عمليّة من سلسلة RAG بأكملها.
إذا كان سؤالاً مشوشاً حقاً يمكن استخدام نموذج صغير لإستخراج الغرض/المرشحات ("تقارن vs شرح vs حل المشاكلM SK2
// 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
هذا هو أساس الغموض المقيد النمط.
للغوص العميق في أنماط تنفيذ مؤقتة حيث تستخدم LLMs مؤقتاً دون إستمرار بنتائجها, شاهد النار وdon't لا تنسى تماما.
فقط بعد البحث تتصل بالـ LLM . وتعطيه مجموعة صغيرة , من الحقائق الواضحة مع اشارات للدلائل وتعليمات واضحة عن عدم اليقين
النموذج' وظيفته: تنصي , شرح , مقارنة. لا: فرض القيود.
إذا كنت مهتماً بـ “LLMs تسحب النافذة السياقية بأكملها إلى الإجابة . . سحب السياق الخافت المقيد: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 التقليدية (آمل-الصفر المبني على الـ):
// ❌ Prompt says "only UK customers" but model can ignore it
var answer = await llm.Generate(prompt); // No guarantee
تقلل من RAG (الصفر المضغوط):
// ✅ Database physically prevents non-UK results
var results = db.Tickets.Where(t => t.Region == "UK"); // Guaranteed
لماذا هو أكثر أماناً المرشحات تم فرضها قبل الجيل (نموذج لم يكن يملكها مطلقاً , لا يمكنه ' لا ينسيها ), و الهلاوس محصورة بالدلائل التي تتحكم بها .
RAG التقليدي: "أخبرنا النموذج بهذا, لكنيM SK2 لست متأكدا لماذا أو من أي قطعة جاءت من
RAG تقلص :
// 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.
إذا كان لديك بالفعل نظام RAG يعمل, هنا's كيف تنتقل إلى :
قبل:
public class Document
{
public string Id { get; set; }
public string Text { get; set; } // ← Only unstructured text
public float[] Embedding { get; set; }
}
بعد:
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
}
قبل:
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
بعد:
// ✅ 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
// 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 لتنفيذ كامل.
تتبع هذه القياسات قبل وبعدها:
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 أن يتجمع ضمن الميزانية |
| النتائج | المزيد من الهندسة الأمامية ; سلوك عملي أفضل بشكل كبير |
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."
التحول:
البدائيات:
النمط:
هذا ما يحدث عندما تطبق تخصص البرمجة العادي للأنظمة التي تضم نماذج اللغة
إذا كنت مستعداً لبناء هذا
تطبيقات مرجعية:
البنية التحتية موجودة بالفعل. عليك فقط التوقف عن التعامل مع نافذة السياق مثل قاعدة بيانات
© 2026 Scott Galloway — Unlicense — All content and source code on this site is free to use, copy, modify, and sell.