अगर आप RAG के लिए नया है RAG स्पष्ट किया गया और आरएजी वास्तुकला. यह पोस्ट उस बिंदु के लिए है जहां आप ' एक RAG पाइपलाइन बनाया है कि अधिकतर काम करता है, … , और अब आप के लिए यह लागत में भुगतान कर रहे हैं
यह क्या शामिल करता है उत्पादन के पीछे वास्तुकला संबंधी पैटर्न RAG. हाथ के लिएM SK1 कार्यान्वयन पर, देखें आरएजी के साथ एक दस्तावेज सारणी तैयार करना.
यह कहाँ से आता है मैंने बनाया डॉक-सममैरिजर दस्तावेज़ आरएजी इंजन डेटा-सममारीजरName डेटा RAG इंजन ImageSummarizerComment छवि RAG इंजन ऑडियोसममारीजरName (ऑडियो RAG इंजन सुस्पष्टRAG दस्तावेज़ Q
नोट: आप सही रूप से इस साइट पर सेमेटिक खोज टूटी है ध्यान दिया गया हो सकता है-और हाँ यह है, यह एक कॉन्फ़िगरेशन समस्या है मैं नहीं हूँ।
| काल | इसका अर्थ क्या है |
|---|---|
| आरएजी उत्तर देने से पहले अपने कंपनी डक को LLM देना | |
| चाइंगिंग दस्तावेजों को छोटे टुकड़ों में विभाजित करना | |
| Top-k खोज से परिणाम प्राप्त करें | |
| भेक्टर खोज | इनमेडिंग का उपयोग करते हुए समान पाठ ढूंढना |
| BM25 | शब्दकुञ्जी खोज |
| संदर्भ विंडो कितनी पाठ आप एक prompt में फिट कर सकते हैं | |
| संकेत | आकलन के बिना तथ्य निकाले गए |
पुनःप्राप्ति-अग्रिम जेनरेशन (RAGM SK2 उन वाक्यांशों में से एक बन गया है जिसका अर्थ होता है सब कुछ और कुछ नहीं.
बहुत से टीमों के लिए RAG कर रहा है
यह काम करता है जब तक यह नहीं करता है
यह’ महंगा है, यह’ इस बारे में तर्क करने के लिए कठिन हैं, और यह चुपचाप मॉडल को उत्तरदायित्व सौंपता है। : संरचना का विश्लेषण करना, फिल्टरों पर बल देना, decide what matters, reconcile contradictions,
जब लोग कहते हैं, “RAG भ्रमित करता है, ” या “RAg अच्छी तरह से फ़िल्टर नहीं करता है
समस्या है समस्या है लचीला RAG.
यह पोस्ट एक भिन्न डिफ़ॉल्ट वर्णित करता है कम RAG - LLMs का उपयोग करें कम, नहीं अधिकM SK1 पहले से निर्धारक संकेतों को निकाल कर और मॉडलों के रूप में इलाज संश्लेषण इंजन, नहीं डेटा भंडार.
एक संदर्भ विंडो है
यह डेटा भंडार नहीं है
जब आप “ बस प्रवर्धन में अधिक चिपकाएँ
यही कारण है कि RAG डेमो बहुत अच्छे लगते हैं और उत्पादन RAG प्रणालियां शांत रूप से खराब हो जाती हैं
कम RAG डिफ़ॉल्ट फ्लिप करता है
के बजाय
पाठ पुनः प्राप्त करें और मॉडल को यह तय करने दें कि क्या महत्वपूर्ण है
आप कर रहे हैं
एक बार यह तय करें कि क्या महत्वपूर्ण है , इसे भंडारित करें, और केवल जब आप संश्लेषण की जरूरत है तो मॉडल शामिल
व्यवहार में इसका मतलब है deterministic ingestion, cheap retrieval, bounded generation.
यदि यह परिचित लग रहा है, तो यह अवरोधित अस्पष्टता: probabilistic घटकों को छोड़ दें प्रस्तावित करना; निर्णायक प्रणालियों को छोड़ें निर्णय लेना.
सबसे पहले-,-मुझे यह दिखाना चाहिए कि अधिकांश टीमें क्या करते हैं और यह क्यों होता है
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 | |
|---|---|---|
| अवशोषण | सिर्फ टुकड़े और एम्बेड करें। | |
| फ़िल्टरिंग LLM से फ़िल्टर करने के लिए पूछें | ||
| ढूंढें केवल भेक्टर | BMM SK2 + भेक्टर | |
| एलएलएम भूमिका | पार्से, फ़िल्टर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
};
क्या आप निर्णायक रूप से बाहर निकाल सकते हैं
| सिग्नल प्रकार | उदाहरण | क्यों यह महत्वपूर्ण है |
|---|---|---|
| अस्थायी | आरंभ किया गया तारीख़ | |
| श्रेणिक वस्तुस्थिति1 प्राथमिकता2 विभाग3 उत्पाद4 मोबाइल टीम टिकट फ़िल्टर | ||
| अंकीय | मूल्य, मात्राM SK2 प्राप्ताङ्क , विश्वसनीयता | |
| पहचान | लेखक | |
| गुणवत्ता | ओसीआर विश्वसनीयता | |
| प्रवीणता स्रोत प्रणाली |
इसे एक बार करें
RAG का हार्ड भाग मॉडल नहीं है ' यह ' मॉडल से पहले सब कुछ है ठोस क्रियान्वयन के लिए आरएजी के साथ एक दस्तावेज सारणी तैयार करना और DocSummarizer: Building RAG Pipelines.
सही के एकक के रूप में व्यवहार करने के बजाय "chunks" भंडारित संरचनात्मक क्षेत्रों को धारण करता है
पाठ अभी भी सिस्टम - का हिस्सा है लेकिन यह बन जाता है प्रमाणक्या भी हम prompt में टाँसने के लिए हुआ है
यह भिन्नता है "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')
");
अभी क्या हुआ
यह उसी पैटर्न है जैसे :
नियम अच्छी तरह याद रखें पहले अपने "memory को अद्यतन करें
प्रमुख वास्तुकला लाभ चूंकि आप अंतःकरणों के साथ निर्णायक संकेतों को भंडारित करते हैं (उनके स्थान पर नहीं),प्रणाली का प्रत्येक भाग स्वतंत्र रूप से बदल सकता है।
बहुल -वेक्टर भंडारों के साथ |( |Qdrant की तरह), |आप यहां तक कि जोड़ सकते हैं एक दस्तावेज पर कई एम्बेडिंग्स. एक नया एम्बेडिंग मॉडल का प्रयास करना चाहते हैं।
प्रत्येक घटक पूर्ण पाइपलाइन को पुनः निर्माण करने के लिए बाध्य किए बिना विकसित हो सकता है - और अन्यों को विकृत करने के बिना
कुछ भी भंडारित करें जिसे आप संगणन कर सकते हैं सस्ती और निर्णायक ढंग-से.
महत्वपूर्ण संकेत सिर्फ हैं छोटा पाठ स्ट्रिंग—Not Giant Data Structures. YouM SK2re storing "PerformanceMSC4 CSK5 charsMST6 not "Customer complained about slow loading timesMSP8 | | (50+ words |
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
}
भंडारण लागत तुलना
| क्या आप भंडारित कर रहे हैं | प्रति दस्तावेज़ आकार | 10 | ||
|---|---|---|---|---|
| पूरा पाठ | ~5 के.बी. | |||
| इन सभी संकेतों बाइट्स | ||||
| LLM-generated summary | ~2 के.बी. |
संकेत हैं 10x छोटा से अधिक text, 4x छोटा LLM सारांशों से अधिक, और अनन्त सस्ती पुनः गणना करने के लिए (क्योंकि आप नहीं कर रहे हैं
जब आप महसूस करते हैं कि आपको एक अलग संकेत की जरूरत है सिर्फ भंडारित कच्चे डेटा से इसे गणना करें
यही कारण है कि आप एक बार भंडारण में पैसे देते हैं।
अधिकतर "RAG क्वेरी
पारंपरिक RAG (expensiveM SK1unreliable):
// ❌ 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 (
// ✅ 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}
");
अभी क्या हुआ
इसीलिए हाइब्रिड खोज उत्पादन में महत्वपूर्ण है हाइब्रिड खोज & स्वचालित पूरे RAG श्रृंखला के सबसे व्यावहारिक टुकड़ा है
अगर एक क्वेरी वास्तव में गडबड है शक़्ति उद्देश्य निकालने के लिए एक छोटा मॉडल का उपयोग करें
// 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();
कोर सिद्धांत: एलएलएम प्रस्तावित करता है
यह आधार है अवरोधित अस्पष्टता पैटर्न
दीर्घकालिक निष्पादन पैटर्न में एक गहरी खोज के लिए जहाँ आप उनके आउटपुटों को जारी रखने के बिना अस्थायी रूप से LLMs का उपयोग करते हैं आग और Don't Quite Forget.
पुनःप्राप्ति के बाद ही आप LLM को बुलाते हैं।
मॉडल संश्लेषित करेंनहीं बाध्यताओं को लागू करना, निर्णय सत्य, आविष्कार संरचना.
अगर आप के बारे में “LLMs उत्तर में पूरी संदर्भ विंडो को खींचने की चिंता करते हैं प्रतिबंधित अस्पष्ट संदर्भ खींचनायह क्या तुमने उससे करने के लिए कहा है
एक विशिष्ट ग्राहक समर्थन RAG प्रणाली के लिए ऊँचाई तुलना
परिदृश्य प्रति दिन 10,000 समर्थन टिकट
| दृष्टिकोण | इंजेक्शन लागत | प्रति- क्वेरी लागत |
|---|---|---|
| पारंपरिक RAG सम्मिलित करें**$75/दिन** | ||
| कम RAG सम्मिलित करें**$7.50/दिन** |
गुरुत्व क्रम: ~10x प्रतिदिन लागत कटौती
और बेहतर अच्छे साक्ष्य और निर्णायक फिल्टरिंग के साथ-साथ आपको संभवतः कोई सीमा मॉडल की जरूरत नहीं है।
प्लस: त्रुटिमोचन समय कम करता है, कम समर्थन स्काल्सन होता है , और मॉडल लचीलापन 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 मॉडल ने यह कहा था, लेकिन मैं नहीं पता क्यों या किस टुकड़े से यह आया है
कम 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 तंत्र है
से पहले
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);
देखें हाइब्रिड खोज & स्वचालित पूर्ण कार्यान्वयन के लिए
इन मापनों को पहले और बाद में ट्रैक करें
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 को पूर्वानुमानीय बनाना | |||
| बल उच्च टोकन लागत | |||
| समाधान एक बार संकेत निकालें जब → प्रतिबंधों को निर्णायक रूप से लागू करें | → | साक्ष्य प्राप्त करें \ → | एलएलएम को बजट के भीतर संश्लेषण करने दें |
| परिणाम अधिक इंजीनियरिंग अग्रभाग में |
घटा RAG anti-' नहीं है।
इस तरह सोचें
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.