<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Local AI on kenji.blog</title><link>http://kenji.blog/hi/tags/local-ai/</link><description>Recent content in Local AI on kenji.blog</description><generator>Hugo -- gohugo.io</generator><language>hi</language><copyright>kenjinote</copyright><lastBuildDate>Fri, 11 Sep 2026 16:00:00 +0900</lastBuildDate><atom:link href="http://kenji.blog/hi/tags/local-ai/index.xml" rel="self" type="application/rss+xml"/><item><title>TinyLLaMA को ऑन-प्रिमाइसेस वातावरण में सबसे तेज़ी से ट्यून करने का तरीका</title><link>http://kenji.blog/hi/p/tinyllama-on-premises-fast-tuning-guide/</link><pubDate>Fri, 11 Sep 2026 16:00:00 +0900</pubDate><guid>http://kenji.blog/hi/p/tinyllama-on-premises-fast-tuning-guide/</guid><description>&lt;img src="http://kenji.blog/p/tinyllama-on-premises-fast-tuning-guide/img/eyecatch.jpg" alt="Featured image of post TinyLLaMA को ऑन-प्रिमाइसेस वातावरण में सबसे तेज़ी से ट्यून करने का तरीका" />&lt;h2 id="1-परचय-अभ-tinyllama-और-ऑन-परमइसस-कय">1. परिचय: अभी TinyLLaMA और ऑन-प्रिमाइसेस क्यों?
&lt;/h2>&lt;p>लार्ज लैंग्वेज मॉडल (LLM) का विकास अविश्वसनीय गति से आगे बढ़ रहा है, और इसके साथ, मॉडल के मापदंडों की संख्या सैकड़ों अरबों तक फैल रही है। GPT-4 और Claude 3 जैसे विशाल मॉडल बेजोड़ प्रदर्शन का दावा करते हैं, लेकिन अनुमान और प्रशिक्षण से जुड़ी गणना लागत, साथ ही बाहरी API का उपयोग करते समय सुरक्षा और डेटा गोपनीयता की चिंताएँ कंपनियों के लिए बड़ी बाधाएँ बन गई हैं। विशेष रूप से, अत्यधिक गोपनीय आंतरिक डेटा या व्यक्तिगत जानकारी से जुड़े कार्यों में, अनुपालन (जैसे GDPR और APPI) के दृष्टिकोण से सार्वजनिक क्लाउड LLM API में डेटा भेजना अक्सर अस्वीकार्य होता है।&lt;/p>
&lt;p>यहीं पर &lt;strong>स्मॉल लैंग्वेज मॉडल (SLM)&lt;/strong> और &lt;strong>ऑन-प्रिमाइसेस वातावरण में स्थानीय संचालन&lt;/strong> सुर्खियों में आ रहे हैं। इनमें से &amp;ldquo;&lt;strong>TinyLLaMA&lt;/strong>&amp;rdquo;, केवल 1.1B (1.1 बिलियन) मापदंडों के अपने कॉम्पैक्ट आकार के बावजूद, लगभग 3 ट्रिलियन टोकन के विशाल डेटासेट पर पूर्व-प्रशिक्षित किया गया है, और अपने वर्ग के अन्य मॉडलों की तुलना में आश्चर्यजनक प्रदर्शन प्रदान करता है।&lt;/p>
&lt;p>इस लेख में, हम आपकी कंपनी के विशिष्ट कार्यों के लिए ऑन-प्रिमाइसेस वातावरण (स्थानीय सर्वर या वर्कस्टेशन) में इस TinyLLaMA को &amp;ldquo;सबसे तेज़ और अत्यधिक कुशल&amp;rdquo; तरीके से फाइन-ट्यून करने के लिए एक संपूर्ण मार्गदर्शिका प्रदान करते हैं। हम गणितीय पृष्ठभूमि, नवीनतम अनुकूलन तकनीकों और विशिष्ट PyTorch कार्यान्वयन कोड को व्यापक रूप से कवर करेंगे।&lt;/p>
&lt;hr>
&lt;h2 id="2-tinyllama-क-आरकटकचर-और-वशषतए">2. TinyLLaMA का आर्किटेक्चर और विशेषताएं
&lt;/h2>&lt;p>TinyLLaMA, Meta द्वारा विकसित LLaMA (Large Language Model Meta AI) आर्किटेक्चर का अनुसरण करता है। मापदंडों की संख्या को 1.1B तक कम करते हुए, यह LLaMA 2 के समान प्रौद्योगिकी स्टैक का उपयोग करता है, जिससे इसका इकोसिस्टम अत्यधिक संगत हो जाता है।&lt;/p>
&lt;h3 id="परमख-आरकटकचर-घटक">प्रमुख आर्किटेक्चर घटक
&lt;/h3>&lt;ol>
&lt;li>&lt;strong>RMSNorm (Root Mean Square Normalization):&lt;/strong>
यह एक सामान्यीकरण विधि है जो पारंपरिक LayerNorm गणनाओं से माध्य घटाव को हटा देती है, जिससे कम्प्यूटेशनल दक्षता में सुधार होता है। यह प्रशिक्षण स्थिरता बनाए रखते हुए थ्रूपुट को बढ़ाता है।&lt;/li>
&lt;li>&lt;strong>SwiGLU एक्टिवेशन फंक्शन:&lt;/strong>
Feed Forward Network (FFN) में, पारंपरिक ReLU या GELU के बजाय SwiGLU को अपनाया गया है। इसे गणितीय रूप से इस प्रकार दर्शाया गया है:
$$ \text{SwiGLU}(x, W, V) = \text{Swish}(xW) \otimes (xV) $$
यहां, $\otimes$ तत्व-वार गुणन (Hadamard उत्पाद) को दर्शाता है, और Swish फ़ंक्शन $\text{Swish}(z) = z \cdot \sigma(\beta z)$ है। इससे अभिव्यक्ति की क्षमता में काफी सुधार होता है।&lt;/li>
&lt;li>&lt;strong>RoPE (Rotary Position Embedding):&lt;/strong>
यह एक ऐसी तकनीक है जो पूर्ण (absolute) और सापेक्ष (relative) पोजीशन एन्कोडिंग के लाभों को जोड़ती है। अनुक्रम (sequence) की लंबाई बढ़ने पर भी यह उच्च सामान्यीकरण (generalization) प्रदर्शन बनाए रखती है।&lt;/li>
&lt;li>&lt;strong>Grouped Query Attention (GQA):&lt;/strong>
यह Multi-Head Attention (MHA) और Multi-Query Attention (MQA) के बीच का एक मध्यवर्ती दृष्टिकोण है, जो कुंजियों (keys) और मूल्यों (values) के हेड्स को समूहित करके मेमोरी बैंडविड्थ को बचाता है और अनुमान की गति में नाटकीय रूप से सुधार करता है।&lt;/li>
&lt;/ol>
&lt;p>नीचे दिया गया Mermaid आरेख TinyLLaMA के समग्र डेटा प्रवाह और Transformer ब्लॉक की संरचना को दर्शाता है।&lt;/p>
&lt;div class="mermaid">graph TD
A["इनपुट टेक्स्ट"] --> B["टोकनाइज़र (BPE)"]
B --> C["एम्बेडिंग लेयर"]
C --> D["ट्रांसफॉर्मर ब्लॉक्स (TinyLLaMA के लिए 22 लेयर्स)"]
D --> E["RMSNorm (अंतिम)"]
E --> F["लीनियर प्रोजेक्शन (वोकैब का आकार)"]
F --> G["आउटपुट संभावनाएं (Softmax)"]
subgraph "ट्रांसफॉर्मर ब्लॉक एनाटॉमी"
D1["इनपुट हिडन स्टेट"] --> D2["RMSNorm"]
D2 --> D3["ग्रुप्ड क्वेरी अटेंशन (GQA)"]
D3 --> D4["रेसिडुअल ऐड"]
D4 --> D5["RMSNorm"]
D5 --> D6["SwiGLU FFN"]
D6 --> D7["रेसिडुअल ऐड"]
D7 --> D8["अगली लेयर के लिए आउटपुट"]
D1 -.-> D4
D4 -.-> D7
end&lt;/div>
&lt;hr>
&lt;h2 id="3-फइन-टयनग-म-सफलत-lora-और-qlora">3. फाइन-ट्यूनिंग में सफलता: LoRA और QLoRA
&lt;/h2>&lt;p>ऑन-प्रिमाइसेस वातावरण में पूर्ण-पैरामीटर फाइन-ट्यूनिंग करने के लिए, यहां तक कि 1.1B मॉडल के साथ भी, ऑप्टिमाइज़र की स्थिति और ग्रेडिएंट को बनाए रखने के लिए दसियों गीगाबाइट VRAM (वीडियो मेमोरी) की खपत होती है। सीमित संसाधनों के साथ कुशलतापूर्वक प्रशिक्षण के लिए आवश्यक &lt;strong>PEFT (Parameter-Efficient Fine-Tuning)&lt;/strong> तकनीक &amp;ldquo;&lt;strong>LoRA&lt;/strong>&amp;rdquo; और इसका क्वांटाइज़ेशन एक्सटेंशन &amp;ldquo;&lt;strong>QLoRA&lt;/strong>&amp;rdquo; है।&lt;/p>
&lt;h3 id="31-lora-low-rank-adaptation-क-गणतय-पषठभम">3.1 LoRA (Low-Rank Adaptation) की गणितीय पृष्ठभूमि
&lt;/h3>&lt;p>LoRA एक ऐसी तकनीक है जो पूर्व-प्रशिक्षित वज़न मैट्रिक्स को स्थिर (फ़्रीज़) कर देती है और उसके वज़न अपडेट ($\Delta W$) का अनुमान दो छोटे लो-रैंक मैट्रिक्स के गुणनफल के रूप में लगाती है।&lt;/p>
&lt;p>मान लें कि पूर्व-प्रशिक्षित वज़न $W_0 \in \mathbb{R}^{d \times k}$ है। पूर्ण फाइन-ट्यूनिंग में, $W_0$ को स्वयं अपडेट करके $W_0 + \Delta W$ किया जाता है, लेकिन LoRA में, अपडेट मैट्रिक्स $\Delta W$ को इस प्रकार विघटित किया जाता है:&lt;/p>
$$ \Delta W = B \times A $$
&lt;p>यहां, $B \in \mathbb{R}^{d \times r}$ और $A \in \mathbb{R}^{r \times k}$, जहां $r$ एक हाइपरपैरामीटर है जिसे रैंक कहा जाता है, जो एक बहुत छोटा मान है (आमतौर पर 8, 16, 32, आदि) और $r \ll \min(d, k)$ को संतुष्ट करता है।&lt;/p>
&lt;p>फॉरवर्ड पास की गणना इस प्रकार है:&lt;/p>
$$ h = W_0 x + \Delta W x = W_0 x + B A x $$
&lt;p>प्रारंभिक अवस्था में, मैट्रिक्स $A$ को सामान्य वितरण (गॉसियन वितरण) का उपयोग करके यादृच्छिक रूप से प्रारंभ (initialize) किया जाता है, और मैट्रिक्स $B$ को शून्य मैट्रिक्स के साथ प्रारंभ किया जाता है। इससे यह सुनिश्चित होता है कि प्रशिक्षण की शुरुआत में $\Delta W$ शून्य है, जिससे बेस मॉडल के आउटपुट को पूरी तरह से सुरक्षित रखते हुए प्रशिक्षण शुरू किया जा सकता है।&lt;/p>
&lt;div class="mermaid">graph LR
X["इनपुट वेक्टर x"] --> W0["स्थिर पूर्व-प्रशिक्षित वज़न (W_0)"]
X --> A["प्रशिक्षित करने योग्य LoRA मैट्रिक्स A (r x k)"]
A --> B["प्रशिक्षित करने योग्य LoRA मैट्रिक्स B (d x r)"]
W0 --> Add["वेक्टर संयोजन"]
B --> Add
Add --> Y["आउटपुट वेक्टर h"]&lt;/div>
&lt;h3 id="32-qlora-quantized-lora-क-नवचर">3.2 QLoRA (Quantized LoRA) का नवाचार
&lt;/h3>&lt;p>QLoRA LoRA के दृष्टिकोण को और आगे ले जाता है, जिसमें बेस मॉडल $W_0$ को मेमोरी में लोड करने से पहले 4-बिट परिशुद्धता (NormalFloat 4, NF4) में क्वांटाइज़ किया जाता है। इससे VRAM की खपत में काफी कमी आती है।&lt;/p>
&lt;p>QLoRA में तीन महत्वपूर्ण तकनीकें शामिल हैं:&lt;/p>
&lt;ol>
&lt;li>&lt;strong>4-बिट NormalFloat (NF4) क्वांटाइज़ेशन:&lt;/strong> सामान्य वितरण का पालन करने वाले वज़न के लिए अनुकूलित एक सैद्धांतिक रूप से इष्टतम डेटा प्रकार।&lt;/li>
&lt;li>&lt;strong>डबल क्वांटाइज़ेशन:&lt;/strong> क्वांटाइज़ेशन स्थिरांक (स्केलिंग फैक्टर) को स्वयं क्वांटाइज़ करके मेमोरी की और अधिक बचत।&lt;/li>
&lt;li>&lt;strong>पेज्ड ऑप्टिमाइज़र:&lt;/strong> NVIDIA के यूनिफाइड मेमोरी फ़ीचर का उपयोग करके, VRAM कम होने पर ऑप्टिमाइज़र की स्थिति को अस्थायी रूप से CPU RAM में ले जाने का एक तंत्र।&lt;/li>
&lt;/ol>
&lt;p>इसके परिणामस्वरूप, फाइन-ट्यूनिंग जिसके लिए आम तौर पर 16GB से 24GB VRAM की आवश्यकता होती है, आसानी से उपभोक्ता श्रेणी के GPU (जैसे RTX 3060 12GB या RTX 4070) पर निष्पादित की जा सकती है।&lt;/p>
&lt;hr>
&lt;h2 id="4-ऑन-परमइसस-वतवरण-क-लए-हरडवयर-आवशयकतए-और-सटअप">4. ऑन-प्रिमाइसेस वातावरण के लिए हार्डवेयर आवश्यकताएं और सेटअप
&lt;/h2>&lt;p>जब QLoRA के साथ TinyLLaMA (1.1B) को ट्यून किया जाता है, तो हार्डवेयर आवश्यकताएं बहुत कम रखी जा सकती हैं।&lt;/p>
&lt;h3 id="अनशसत-हरडवयर-वनरदश">अनुशंसित हार्डवेयर विनिर्देश
&lt;/h3>&lt;ul>
&lt;li>&lt;strong>GPU:&lt;/strong> NVIDIA RTX 3060 (12GB), RTX 3090/4090 (24GB), या NVIDIA A10G/A100 आदि। यह कम से कम 8GB VRAM के साथ चलेगा, लेकिन बड़े बैच आकार को संभालने के लिए 12GB या अधिक की अनुशंसा की जाती है।&lt;/li>
&lt;li>&lt;strong>CPU:&lt;/strong> 8 या अधिक कोर वाला आधुनिक CPU (Intel Core i7/i9, AMD Ryzen 7/9)।&lt;/li>
&lt;li>&lt;strong>RAM:&lt;/strong> 32GB या अधिक (पेज्ड ऑप्टिमाइज़र का उपयोग करते समय VRAM से डेटा निकालने के लिए महत्वपूर्ण)।&lt;/li>
&lt;li>&lt;strong>स्टोरेज:&lt;/strong> NVMe SSD (डेटासेट लोड करने और मॉडल को तेज़ी से सहेजने के लिए)।&lt;/li>
&lt;/ul>
&lt;h3 id="सफटवयर-वतवरण-सटअप">सॉफ्टवेयर वातावरण सेटअप
&lt;/h3>&lt;p>यहां Ubuntu 22.04 LTS वातावरण के लिए सेटअप प्रक्रिया दी गई है। यह Python 3.10 या बाद के संस्करण का उपयोग करता है।&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;span class="lnt">2
&lt;/span>&lt;span class="lnt">3
&lt;/span>&lt;span class="lnt">4
&lt;/span>&lt;span class="lnt">5
&lt;/span>&lt;span class="lnt">6
&lt;/span>&lt;span class="lnt">7
&lt;/span>&lt;span class="lnt">8
&lt;/span>&lt;span class="lnt">9
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># वर्चुअल एनवायरनमेंट बनाना और सक्रिय करना&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">python3 -m venv tinyllama_env
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">source&lt;/span> tinyllama_env/bin/activate
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># PyTorch इंस्टॉल करना (CUDA 12.1 के लिए)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">pip install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu121
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># ट्रांसफार्मर से संबंधित लाइब्रेरी इंस्टॉल करना&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">pip install transformers datasets peft trl accelerate bitsandbytes
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;hr>
&lt;h2 id="5-सबस-तज-टयनग-क-लए-अनकलन-तकनक">5. सबसे तेज़ ट्यूनिंग के लिए अनुकूलन तकनीकें
&lt;/h2>&lt;p>सिर्फ स्क्रिप्ट चलाने के अलावा, &amp;ldquo;सबसे तेज़&amp;rdquo; ट्यूनिंग पूरी करने के लिए निम्नलिखित अनुकूलन विधियों को संयोजित करना आवश्यक है।&lt;/p>
&lt;h3 id="51-flash-attention-2">5.1 Flash Attention 2
&lt;/h3>&lt;p>मानक अटेंशन तंत्र की समय और स्थान जटिलता अनुक्रम (sequence) लंबाई $N$ के लिए $O(N^2)$ होती है। Flash Attention 2 GPU के SRAM और HBM (High Bandwidth Memory) के बीच मेमोरी एक्सेस को अनुकूलित करता है, गणना की मात्रा को कम किए बिना IO अड़चनों को दूर करता है, प्रशिक्षण गति को कई गुना बढ़ाता है, और मेमोरी खपत को काफी कम करता है।&lt;/p>
&lt;h3 id="52-gradient-checkpointing-गरडएट-चकपइटग">5.2 Gradient Checkpointing (ग्रेडिएंट चेकपॉइंटिंग)
&lt;/h3>&lt;p>यह एक ऐसी तकनीक है जहां फॉरवर्ड पास के दौरान गणना किए गए सभी मध्यवर्ती एक्टिवेशन को VRAM में सहेजने के बजाय, केवल कुछ को ही सहेजा जाता है और जब बैकवर्ड पास के दौरान आवश्यकता होती है तो उनकी पुनर्गणना की जाती है। गणना समय लगभग 20% बढ़ जाता है, लेकिन मेमोरी खपत नाटकीय रूप से कम हो जाती है, जिससे बड़े बैच आकार सेट किए जा सकते हैं और समग्र थ्रूपुट में सुधार होता है।&lt;/p>
&lt;h3 id="53-mixed-precision-training-मशरत-सटक-परशकषण-और-bfloat16">5.3 Mixed Precision Training (मिश्रित सटीक प्रशिक्षण) और Bfloat16
&lt;/h3>&lt;p>GPU के Tensor Cores का पूरा लाभ उठाने के लिए, प्रशिक्षण के दौरान गणना &lt;code>bfloat16&lt;/code> (Brain Floating Point) में की जाती है। &lt;code>float16&lt;/code> की तुलना में, घातांक (exponent) की बिट लंबाई &lt;code>float32&lt;/code> के समान है, इसलिए ओवरफ्लो और अंडरफ्लो का जोखिम बेहद कम है, जिससे स्थिर प्रशिक्षण सुनिश्चित होता है।&lt;/p>
&lt;hr>
&lt;h2 id="6-अभयस-tinyllama-क-लए-qlora-फइन-टयनग-कड">6. अभ्यास: TinyLLaMA के लिए QLoRA फाइन-ट्यूनिंग कोड
&lt;/h2>&lt;p>अब, आइए सबसे तेज़ ट्यूनिंग के लिए एक PyTorch स्क्रिप्ट देखें जिसमें उपरोक्त सभी अनुकूलन शामिल हैं। यहाँ, हम Hugging Face की &lt;code>trl&lt;/code> (Transformer Reinforcement Learning) लाइब्रेरी से &lt;code>SFTTrainer&lt;/code> का उपयोग करेंगे।&lt;/p>
&lt;h3 id="61-डटसट-तयर-करन-और-मडल-लड-करन">6.1 डेटासेट तैयार करना और मॉडल लोड करना
&lt;/h3>&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt"> 1
&lt;/span>&lt;span class="lnt"> 2
&lt;/span>&lt;span class="lnt"> 3
&lt;/span>&lt;span class="lnt"> 4
&lt;/span>&lt;span class="lnt"> 5
&lt;/span>&lt;span class="lnt"> 6
&lt;/span>&lt;span class="lnt"> 7
&lt;/span>&lt;span class="lnt"> 8
&lt;/span>&lt;span class="lnt"> 9
&lt;/span>&lt;span class="lnt">10
&lt;/span>&lt;span class="lnt">11
&lt;/span>&lt;span class="lnt">12
&lt;/span>&lt;span class="lnt">13
&lt;/span>&lt;span class="lnt">14
&lt;/span>&lt;span class="lnt">15
&lt;/span>&lt;span class="lnt">16
&lt;/span>&lt;span class="lnt">17
&lt;/span>&lt;span class="lnt">18
&lt;/span>&lt;span class="lnt">19
&lt;/span>&lt;span class="lnt">20
&lt;/span>&lt;span class="lnt">21
&lt;/span>&lt;span class="lnt">22
&lt;/span>&lt;span class="lnt">23
&lt;/span>&lt;span class="lnt">24
&lt;/span>&lt;span class="lnt">25
&lt;/span>&lt;span class="lnt">26
&lt;/span>&lt;span class="lnt">27
&lt;/span>&lt;span class="lnt">28
&lt;/span>&lt;span class="lnt">29
&lt;/span>&lt;span class="lnt">30
&lt;/span>&lt;span class="lnt">31
&lt;/span>&lt;span class="lnt">32
&lt;/span>&lt;span class="lnt">33
&lt;/span>&lt;span class="lnt">34
&lt;/span>&lt;span class="lnt">35
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-python" data-lang="python">&lt;span class="line">&lt;span class="cl">&lt;span class="kn">import&lt;/span> &lt;span class="nn">torch&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kn">from&lt;/span> &lt;span class="nn">datasets&lt;/span> &lt;span class="kn">import&lt;/span> &lt;span class="n">load_dataset&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kn">from&lt;/span> &lt;span class="nn">transformers&lt;/span> &lt;span class="kn">import&lt;/span> &lt;span class="p">(&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">AutoModelForCausalLM&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">AutoTokenizer&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">BitsAndBytesConfig&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">TrainingArguments&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kn">from&lt;/span> &lt;span class="nn">peft&lt;/span> &lt;span class="kn">import&lt;/span> &lt;span class="n">LoraConfig&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">get_peft_model&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">prepare_model_for_kbit_training&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kn">from&lt;/span> &lt;span class="nn">trl&lt;/span> &lt;span class="kn">import&lt;/span> &lt;span class="n">SFTTrainer&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 1. मॉडल और टोकनाइज़र निर्दिष्ट करना&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">model_id&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="s2">&amp;#34;TinyLlama/TinyLlama-1.1B-Chat-v1.0&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 2. QLoRA के लिए 4-बिट क्वांटाइज़ेशन कॉन्फ़िगरेशन&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">bnb_config&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">BitsAndBytesConfig&lt;/span>&lt;span class="p">(&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">load_in_4bit&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="kc">True&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">bnb_4bit_use_double_quant&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="kc">True&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">bnb_4bit_quant_type&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s2">&amp;#34;nf4&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">bnb_4bit_compute_dtype&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="n">torch&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">bfloat16&lt;/span> &lt;span class="c1"># गणना bfloat16 में की जाती है&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 3. मॉडल लोड करना (Flash Attention 2 सक्षम करना)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">print&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34;मॉडल लोड हो रहा है...&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">model&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">AutoModelForCausalLM&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">from_pretrained&lt;/span>&lt;span class="p">(&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">model_id&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">quantization_config&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="n">bnb_config&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">device_map&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s2">&amp;#34;auto&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">use_flash_attention_2&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="kc">True&lt;/span> &lt;span class="c1"># सबसे तेज़ गति की कुंजी&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 4. टोकनाइज़र लोड करना&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">tokenizer&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">AutoTokenizer&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">from_pretrained&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">model_id&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">trust_remote_code&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="kc">True&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">tokenizer&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">pad_token&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">tokenizer&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">eos_token&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">tokenizer&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">padding_side&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="s2">&amp;#34;right&amp;#34;&lt;/span> &lt;span class="c1"># fp16/bf16 प्रशिक्षण के दौरान बग से बचने के लिए &amp;#34;right&amp;#34; पर सेट करें&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;h3 id="62-lora-अडपटर-लग-करन-और-डटसट-क-फरमट-करन">6.2 LoRA अडैप्टर लागू करना और डेटासेट को फ़ॉर्मेट करना
&lt;/h3>&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt"> 1
&lt;/span>&lt;span class="lnt"> 2
&lt;/span>&lt;span class="lnt"> 3
&lt;/span>&lt;span class="lnt"> 4
&lt;/span>&lt;span class="lnt"> 5
&lt;/span>&lt;span class="lnt"> 6
&lt;/span>&lt;span class="lnt"> 7
&lt;/span>&lt;span class="lnt"> 8
&lt;/span>&lt;span class="lnt"> 9
&lt;/span>&lt;span class="lnt">10
&lt;/span>&lt;span class="lnt">11
&lt;/span>&lt;span class="lnt">12
&lt;/span>&lt;span class="lnt">13
&lt;/span>&lt;span class="lnt">14
&lt;/span>&lt;span class="lnt">15
&lt;/span>&lt;span class="lnt">16
&lt;/span>&lt;span class="lnt">17
&lt;/span>&lt;span class="lnt">18
&lt;/span>&lt;span class="lnt">19
&lt;/span>&lt;span class="lnt">20
&lt;/span>&lt;span class="lnt">21
&lt;/span>&lt;span class="lnt">22
&lt;/span>&lt;span class="lnt">23
&lt;/span>&lt;span class="lnt">24
&lt;/span>&lt;span class="lnt">25
&lt;/span>&lt;span class="lnt">26
&lt;/span>&lt;span class="lnt">27
&lt;/span>&lt;span class="lnt">28
&lt;/span>&lt;span class="lnt">29
&lt;/span>&lt;span class="lnt">30
&lt;/span>&lt;span class="lnt">31
&lt;/span>&lt;span class="lnt">32
&lt;/span>&lt;span class="lnt">33
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-python" data-lang="python">&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 5. k-बिट प्रशिक्षण की तैयारी करना और ग्रेडिएंट चेकपॉइंटिंग सक्षम करना&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">model&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">gradient_checkpointing_enable&lt;/span>&lt;span class="p">()&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">model&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">prepare_model_for_kbit_training&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">model&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 6. LoRA सेटिंग्स&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">peft_config&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">LoraConfig&lt;/span>&lt;span class="p">(&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">r&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="mi">16&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="c1"># रैंक&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">lora_alpha&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="mi">32&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="c1"># स्केलिंग फैक्टर&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">lora_dropout&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="mf">0.05&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">bias&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s2">&amp;#34;none&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">task_type&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s2">&amp;#34;CAUSAL_LM&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">target_modules&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="s2">&amp;#34;q_proj&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s2">&amp;#34;k_proj&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s2">&amp;#34;v_proj&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s2">&amp;#34;o_proj&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s2">&amp;#34;gate_proj&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s2">&amp;#34;up_proj&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s2">&amp;#34;down_proj&amp;#34;&lt;/span>&lt;span class="p">]&lt;/span> &lt;span class="c1"># सभी लीनियर लेयर्स को लक्षित करने से प्रदर्शन में सुधार होता है&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">model&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">get_peft_model&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">model&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">peft_config&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">model&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">print_trainable_parameters&lt;/span>&lt;span class="p">()&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># आउटपुट उदाहरण: trainable params: 14,286,848 || all params: 1,114,335,232 || trainable%: 1.282%&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 7. डेटासेट लोड करना (यहां हम उदाहरण के रूप में जापानी निर्देश डेटासेट का उपयोग कर रहे हैं)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># वास्तव में, आप ऑन-प्रिमाइसेस निजी JSONL फ़ाइलें आदि लोड करेंगे&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">dataset&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">load_dataset&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34;kunishou/databricks-dolly-15k-ja&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">split&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s2">&amp;#34;train&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">def&lt;/span> &lt;span class="nf">format_instruction&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">sample&lt;/span>&lt;span class="p">):&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s2">&amp;#34;&amp;#34;&amp;#34;
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="s2"> स्ट्रिंग को ChatML फॉर्मेट या प्रॉम्ट टेम्प्लेट में फ़ॉर्मेट करें
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="s2"> &amp;#34;&amp;#34;&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">prompt&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="sa">f&lt;/span>&lt;span class="s2">&amp;#34;&amp;lt;|im_start|&amp;gt;user&lt;/span>&lt;span class="se">\n&lt;/span>&lt;span class="si">{&lt;/span>&lt;span class="n">sample&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="s1">&amp;#39;instruction&amp;#39;&lt;/span>&lt;span class="p">]&lt;/span>&lt;span class="si">}&lt;/span>&lt;span class="s2">&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">if&lt;/span> &lt;span class="n">sample&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">get&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34;input&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s2">&amp;#34;&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="o">!=&lt;/span> &lt;span class="s2">&amp;#34;&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">prompt&lt;/span> &lt;span class="o">+=&lt;/span> &lt;span class="sa">f&lt;/span>&lt;span class="s2">&amp;#34;&lt;/span>&lt;span class="se">\n&lt;/span>&lt;span class="si">{&lt;/span>&lt;span class="n">sample&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="s1">&amp;#39;input&amp;#39;&lt;/span>&lt;span class="p">]&lt;/span>&lt;span class="si">}&lt;/span>&lt;span class="s2">&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">prompt&lt;/span> &lt;span class="o">+=&lt;/span> &lt;span class="sa">f&lt;/span>&lt;span class="s2">&amp;#34;&amp;lt;|im_end|&amp;gt;&lt;/span>&lt;span class="se">\n&lt;/span>&lt;span class="s2">&amp;lt;|im_start|&amp;gt;assistant&lt;/span>&lt;span class="se">\n&lt;/span>&lt;span class="si">{&lt;/span>&lt;span class="n">sample&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="s1">&amp;#39;output&amp;#39;&lt;/span>&lt;span class="p">]&lt;/span>&lt;span class="si">}&lt;/span>&lt;span class="s2">&amp;lt;|im_end|&amp;gt;&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">return&lt;/span> &lt;span class="p">{&lt;/span>&lt;span class="s2">&amp;#34;text&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="n">prompt&lt;/span>&lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">dataset&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">dataset&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">map&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">format_instruction&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;h3 id="63-परशकषण-नषपदत-करन">6.3 प्रशिक्षण निष्पादित करना
&lt;/h3>&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt"> 1
&lt;/span>&lt;span class="lnt"> 2
&lt;/span>&lt;span class="lnt"> 3
&lt;/span>&lt;span class="lnt"> 4
&lt;/span>&lt;span class="lnt"> 5
&lt;/span>&lt;span class="lnt"> 6
&lt;/span>&lt;span class="lnt"> 7
&lt;/span>&lt;span class="lnt"> 8
&lt;/span>&lt;span class="lnt"> 9
&lt;/span>&lt;span class="lnt">10
&lt;/span>&lt;span class="lnt">11
&lt;/span>&lt;span class="lnt">12
&lt;/span>&lt;span class="lnt">13
&lt;/span>&lt;span class="lnt">14
&lt;/span>&lt;span class="lnt">15
&lt;/span>&lt;span class="lnt">16
&lt;/span>&lt;span class="lnt">17
&lt;/span>&lt;span class="lnt">18
&lt;/span>&lt;span class="lnt">19
&lt;/span>&lt;span class="lnt">20
&lt;/span>&lt;span class="lnt">21
&lt;/span>&lt;span class="lnt">22
&lt;/span>&lt;span class="lnt">23
&lt;/span>&lt;span class="lnt">24
&lt;/span>&lt;span class="lnt">25
&lt;/span>&lt;span class="lnt">26
&lt;/span>&lt;span class="lnt">27
&lt;/span>&lt;span class="lnt">28
&lt;/span>&lt;span class="lnt">29
&lt;/span>&lt;span class="lnt">30
&lt;/span>&lt;span class="lnt">31
&lt;/span>&lt;span class="lnt">32
&lt;/span>&lt;span class="lnt">33
&lt;/span>&lt;span class="lnt">34
&lt;/span>&lt;span class="lnt">35
&lt;/span>&lt;span class="lnt">36
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-python" data-lang="python">&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 8. प्रशिक्षण तर्क (arguments) सेट करना&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">training_args&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">TrainingArguments&lt;/span>&lt;span class="p">(&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">output_dir&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s2">&amp;#34;./tinyllama-lora-output&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">per_device_train_batch_size&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="mi">8&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="c1"># यदि VRAM की अनुमति हो तो बढ़ाएं&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">gradient_accumulation_steps&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="mi">2&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="c1"># प्रभावी बैच आकार = 8 * 2 = 16&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">optim&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s2">&amp;#34;paged_adamw_32bit&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="c1"># पेज्ड ऑप्टिमाइज़र के साथ VRAM की बचत&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">save_steps&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="mi">100&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">logging_steps&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="mi">10&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">learning_rate&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="mf">2e-4&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">fp16&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="kc">False&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">bf16&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="kc">True&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="c1"># मिश्रित सटीक प्रशिक्षण (bfloat16)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">max_grad_norm&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="mf">0.3&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">max_steps&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="mi">500&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="c1"># परीक्षण के लिए 500 कदम। उत्पादन में इपोक (epochs) की संख्या निर्दिष्ट करें&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">warmup_ratio&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="mf">0.03&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">group_by_length&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="kc">True&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">lr_scheduler_type&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s2">&amp;#34;cosine&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 9. SFTTrainer का उपयोग करके प्रशिक्षण शुरू करना&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">trainer&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">SFTTrainer&lt;/span>&lt;span class="p">(&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">model&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="n">model&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">train_dataset&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="n">dataset&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">peft_config&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="n">peft_config&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">dataset_text_field&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s2">&amp;#34;text&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">max_seq_length&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="mi">1024&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="c1"># अपेक्षित इनपुट लंबाई के अनुसार समायोजित करें&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">tokenizer&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="n">tokenizer&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">args&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="n">training_args&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">print&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34;प्रशिक्षण शुरू हो रहा है...&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">trainer&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">train&lt;/span>&lt;span class="p">()&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 10. LoRA अडैप्टर को सहेजना&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">trainer&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">model&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">save_pretrained&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34;./tinyllama-lora-final&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">tokenizer&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">save_pretrained&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34;./tinyllama-lora-final&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">print&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34;प्रशिक्षण पूरा हुआ और मॉडल सहेज लिया गया।&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;hr>
&lt;h2 id="7-परदरशन-मलयकन-और-समसय-नवरण">7. प्रदर्शन मूल्यांकन और समस्या निवारण
&lt;/h2>&lt;p>ऑन-प्रिमाइसेस वातावरण में प्रशिक्षण चलाते समय आने वाली सामान्य समस्याएं और उनके समाधान।&lt;/p>
&lt;ol>
&lt;li>&lt;strong>OOM (Out Of Memory) होता है:&lt;/strong>
&lt;ul>
&lt;li>&lt;code>per_device_train_batch_size&lt;/code> को &lt;code>1&lt;/code> पर कम करें।&lt;/li>
&lt;li>प्रभावी बैच आकार को बनाए रखने के लिए &lt;code>gradient_accumulation_steps&lt;/code> बढ़ाएं।&lt;/li>
&lt;li>&lt;code>max_seq_length&lt;/code> को &lt;code>2048&lt;/code> से &lt;code>1024&lt;/code> या &lt;code>512&lt;/code> तक कम करें।&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>&lt;strong>Loss कम नहीं हो रहा है या डाइवर्ज हो रहा है:&lt;/strong>
&lt;ul>
&lt;li>लर्निंग रेट (&lt;code>learning_rate&lt;/code>) बहुत अधिक हो सकता है। इसे &lt;code>2e-4&lt;/code> से घटाकर लगभग &lt;code>5e-5&lt;/code> करने का प्रयास करें।&lt;/li>
&lt;li>यदि Bfloat16 के बजाय Float16 का उपयोग किया जा रहा है, तो ग्रेडिएंट अंडरफ्लो हो सकता है। सुनिश्चित करें कि &lt;code>bf16=True&lt;/code> सेट है।&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>&lt;strong>अनुमान के दौरान रहस्यमय स्ट्रिंग्स उत्पन्न होती हैं:&lt;/strong>
&lt;ul>
&lt;li>सुनिश्चित करें कि &lt;code>padding_side=&amp;quot;right&amp;quot;&lt;/code> सही ढंग से सेट है। साथ ही, जांचें कि डेटासेट फ़ॉर्मेट (जैसे &lt;code>&amp;lt;|im_start|&amp;gt;&lt;/code> विशेष टोकन) बेस मॉडल के पूर्व-प्रशिक्षण के साथ संगत है या नहीं।&lt;/li>
&lt;/ul>
&lt;/li>
&lt;/ol>
&lt;hr>
&lt;h2 id="8-टयनग-क-बद-मडल-क-तनत-deployment">8. ट्यूनिंग के बाद मॉडल की तैनाती (Deployment)
&lt;/h2>&lt;p>ट्यूनिंग पूरी होने के बाद, जो सहेजा जाता है वह &amp;ldquo;संपूर्ण बेस मॉडल&amp;rdquo; नहीं है, बल्कि केवल कुछ MB से दसियों MB का &amp;ldquo;&lt;strong>LoRA अडैप्टर (अंतर वज़न)&lt;/strong>&amp;rdquo; है। अनुमान को तेज़ी से निष्पादित करने के लिए, आपको इस LoRA वज़न को मूल बेस मॉडल के साथ मर्ज (एकीकृत) करना होगा और इसे एकल मॉडल के रूप में निर्यात करना होगा।&lt;/p>
&lt;h3 id="मडल-मरजग-सकरपट">मॉडल मर्जिंग स्क्रिप्ट
&lt;/h3>&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt"> 1
&lt;/span>&lt;span class="lnt"> 2
&lt;/span>&lt;span class="lnt"> 3
&lt;/span>&lt;span class="lnt"> 4
&lt;/span>&lt;span class="lnt"> 5
&lt;/span>&lt;span class="lnt"> 6
&lt;/span>&lt;span class="lnt"> 7
&lt;/span>&lt;span class="lnt"> 8
&lt;/span>&lt;span class="lnt"> 9
&lt;/span>&lt;span class="lnt">10
&lt;/span>&lt;span class="lnt">11
&lt;/span>&lt;span class="lnt">12
&lt;/span>&lt;span class="lnt">13
&lt;/span>&lt;span class="lnt">14
&lt;/span>&lt;span class="lnt">15
&lt;/span>&lt;span class="lnt">16
&lt;/span>&lt;span class="lnt">17
&lt;/span>&lt;span class="lnt">18
&lt;/span>&lt;span class="lnt">19
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-python" data-lang="python">&lt;span class="line">&lt;span class="cl">&lt;span class="kn">import&lt;/span> &lt;span class="nn">torch&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kn">from&lt;/span> &lt;span class="nn">peft&lt;/span> &lt;span class="kn">import&lt;/span> &lt;span class="n">AutoPeftModelForCausalLM&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kn">from&lt;/span> &lt;span class="nn">transformers&lt;/span> &lt;span class="kn">import&lt;/span> &lt;span class="n">AutoTokenizer&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">output_dir&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="s2">&amp;#34;./tinyllama-lora-final&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># FP16/BF16 में मॉडल और अडैप्टर लोड करें&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">model&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">AutoPeftModelForCausalLM&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">from_pretrained&lt;/span>&lt;span class="p">(&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">output_dir&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">device_map&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s2">&amp;#34;auto&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">torch_dtype&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="n">torch&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">bfloat16&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">tokenizer&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">AutoTokenizer&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">from_pretrained&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">output_dir&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># वज़न मर्ज करें और सहेजें&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">merged_model&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">model&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">merge_and_unload&lt;/span>&lt;span class="p">()&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">merged_model&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">save_pretrained&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34;./tinyllama-merged&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">safe_serialization&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="kc">True&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">tokenizer&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">save_pretrained&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34;./tinyllama-merged&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">print&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34;मॉडल को सफलतापूर्वक मर्ज और सहेजा गया!&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;h3 id="vllm-क-सथ-अत-तवर-अनमन-सरवर-शर-करन">vLLM के साथ अति-तीव्र अनुमान सर्वर शुरू करना
&lt;/h3>&lt;p>ऑन-प्रिमाइसेस डिप्लॉयमेंट में अनुमान गति (टोकन प्रति सेकंड) को अधिकतम करने के लिए, हम Hugging Face की मानक &lt;code>pipeline&lt;/code> के बजाय &lt;strong>vLLM&lt;/strong> या &lt;strong>TGI (Text Generation Inference)&lt;/strong> का उपयोग करने की दृढ़ता से अनुशंसा करते हैं। vLLM GPU मेमोरी विखंडन को रोकने के लिए PagedAttention तकनीक का उपयोग करता है और समवर्ती अनुरोध प्रसंस्करण क्षमता में नाटकीय रूप से सुधार करता है।&lt;/p>
&lt;p>नीचे दिया गया Mermaid आरेख प्रशिक्षण से लेकर अनुमान सर्वर परिनियोजन तक की पाइपलाइन को दर्शाता है।&lt;/p>
&lt;div class="mermaid">graph TD
A["कच्चा निजी डेटा"] --> B["प्रीप्रोसेसिंग और फ़ॉर्मेटिंग (JSONL)"]
B --> C["QLoRA फाइन-ट्यूनिंग (SFTTrainer)"]
C --> D["LoRA अडैप्टर वज़न (.safetensors)"]
D --> E["बेस TinyLLaMA 1.1B के साथ मर्ज करें"]
E --> F["मर्ज किया गया मॉडल"]
F --> G["vLLM सर्वर के माध्यम से डिप्लॉय करें"]
G --> H["API एंडपॉइंट / UI (उदा. चैटबॉट)"]&lt;/div>
&lt;p>vLLM का उपयोग करके API सर्वर शुरू करना निम्नलिखित एकल कमांड के साथ पूरा किया जा सकता है:&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;span class="lnt">2
&lt;/span>&lt;span class="lnt">3
&lt;/span>&lt;span class="lnt">4
&lt;/span>&lt;span class="lnt">5
&lt;/span>&lt;span class="lnt">6
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">python -m vllm.entrypoints.openai.api_server &lt;span class="se">\
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="se">&lt;/span> --model ./tinyllama-merged &lt;span class="se">\
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="se">&lt;/span> --host 0.0.0.0 &lt;span class="se">\
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="se">&lt;/span> --port &lt;span class="m">8000&lt;/span> &lt;span class="se">\
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="se">&lt;/span> --max-model-len &lt;span class="m">2048&lt;/span> &lt;span class="se">\
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="se">&lt;/span> --dtype bfloat16
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>इसके साथ, आपके ऑन-प्रिमाइसेस वातावरण में एक OpenAI API-संगत एंडपॉइंट बनाया जाता है, जिससे आप सुरक्षित और तेज़ी से स्थानीय AI का उपयोग कर सकते हैं।&lt;/p>
&lt;hr>
&lt;h2 id="9-नषकरष">9. निष्कर्ष
&lt;/h2>&lt;p>इस लेख में, हमने बताया है कि ऑन-प्रिमाइसेस वातावरण में सबसे तेज़ और मेमोरी-कुशल तरीके से &amp;ldquo;TinyLLaMA&amp;rdquo; को कैसे फाइन-ट्यून किया जाए, जो कि 1.1B मापदंडों के साथ एक हल्का लेकिन उच्च प्रदर्शन करने वाला मॉडल है।&lt;/p>
&lt;ul>
&lt;li>&lt;strong>LoRA / QLoRA&lt;/strong> उपभोक्ता-ग्रेड GPU पर भी पूर्ण विकसित LLM ट्यूनिंग को सक्षम बनाता है।&lt;/li>
&lt;li>&lt;strong>Flash Attention 2&lt;/strong> और &lt;strong>Gradient Checkpointing&lt;/strong> का पूरा उपयोग करके, प्रशिक्षण समय और VRAM खपत को सीमा तक अनुकूलित किया जाता है।&lt;/li>
&lt;li>&lt;strong>vLLM&lt;/strong> का उपयोग करके डिप्लॉयमेंट उत्पादन वातावरण में भी उच्च थ्रूपुट प्राप्त करता है।&lt;/li>
&lt;/ul>
&lt;p>ऑन-प्रिमाइसेस स्थानीय LLM का संचालन न केवल डेटा गोपनीयता की रक्षा करता है, बल्कि कम लागत पर विशिष्ट डोमेन (कानूनी, चिकित्सा, आंतरिक कंपनी नियम, आदि) के अनुरूप विशेष AI बनाने के लिए सबसे मजबूत हथियार बन जाता है। कृपया इस मार्गदर्शिका को संदर्भ के रूप में उपयोग करें और अपना स्वयं का समर्पित TinyLLaMA विकसित करने का प्रयास करें।&lt;/p></description></item><item><title>C++ के साथ छोटे AI मॉडल (जैसे TinyLLaMA) विकसित करने की प्रक्रिया</title><link>http://kenji.blog/hi/p/cpp-small-ai-model-tinyllama-dev-guide/</link><pubDate>Fri, 11 Sep 2026 14:00:00 +0900</pubDate><guid>http://kenji.blog/hi/p/cpp-small-ai-model-tinyllama-dev-guide/</guid><description>&lt;img src="http://kenji.blog/p/cpp-small-ai-model-tinyllama-dev-guide/img/eyecatch.jpg" alt="Featured image of post C++ के साथ छोटे AI मॉडल (जैसे TinyLLaMA) विकसित करने की प्रक्रिया" />&lt;h1 id="c-क-सथ-छट-ai-मडल-जस-tinyllama-वकसत-करन-क-परकरय">C++ के साथ छोटे AI मॉडल (जैसे TinyLLaMA) विकसित करने की प्रक्रिया
&lt;/h1>&lt;p>हाल के वर्षों में, स्थानीय वातावरण में बड़े भाषा मॉडल (LLM) चलाने में रुचि तेजी से बढ़ी है। विशेष रूप से, TinyLLaMA (1.1B पैरामीटर) जैसे छोटे मॉडल सीमित संसाधनों वाले एज डिवाइस और सामान्य लैपटॉप (Windows वातावरण सहित) पर भी व्यावहारिक गति से अनुमान लगाने में सक्षम हैं। जहाँ Python और PyTorch का उपयोग करके विकास मुख्यधारा है, वहीं जब अंतिम प्रदर्शन और मेमोरी दक्षता की बात आती है, तो C++ और C-आधारित टेंसर लाइब्रेरी &amp;ldquo;ggml&amp;rdquo; का संयोजन वास्तविक मानक बन गया है।&lt;/p>
&lt;p>इस लेख में, हम C++ का उपयोग करके TinyLLaMA को लोड करने और पाठ निर्माण के लिए एक अनुमान इंजन को शून्य से बनाने (या मौजूदा llama.cpp की आंतरिक संरचना को गहराई से समझने) के लिए एक बहुत ही विस्तृत विकास प्रक्रिया की व्याख्या करेंगे।&lt;/p>
&lt;hr>
&lt;h2 id="1-c-और-ggml-ह-कय">1. C++ और ggml ही क्यों?
&lt;/h2>&lt;p>AI के प्रशिक्षण चरण में, Python अपने लचीलेपन और समृद्ध इकोसिस्टम के कारण अत्यधिक लाभप्रद है। हालाँकि, परिनियोजन (डिप्लॉयमेंट) या &amp;ldquo;अनुमान (Inference)&amp;rdquo; के चरण में, निम्नलिखित कारणों से C++ एक शक्तिशाली विकल्प बन जाता है:&lt;/p>
&lt;ol>
&lt;li>&lt;strong>ओवरहेड में कमी&lt;/strong>: Python के ग्लोबल इंटरप्रेटर लॉक (GIL) और रनटाइम ओवरहेड को पूरी तरह से समाप्त किया जा सकता है।&lt;/li>
&lt;li>&lt;strong>मेमोरी दक्षता और एरिना एलोकेशन&lt;/strong>: चूँकि मेमोरी के आवंटन और मुक्ति को मैन्युअल रूप से नियंत्रित किया जा सकता है, इसलिए गार्बेज कलेक्शन के कारण होने वाले अप्रत्याशित स्पाइक्स को रोका जा सकता है।&lt;/li>
&lt;li>&lt;strong>हार्डवेयर तक सीधी पहुँच&lt;/strong>: AVX-512, AVX2, और ARM NEON जैसे SIMD इंट्रिंसिक्स (Intrinsics) को सीधे कॉल किया जा सकता है, जिससे CPU की गणना क्षमता को अधिकतम किया जा सकता है।&lt;/li>
&lt;li>&lt;strong>निर्भरता का उन्मूलन&lt;/strong>: ggml शून्य-निर्भरता (Zero dependencies) वाली एक C/C++ लाइब्रेरी है, और इसे केवल एक कंपाइलर के साथ Windows पर MSVC वातावरण में भी आसानी से बनाया (बिल्ड किया) जा सकता है।&lt;/li>
&lt;/ol>
&lt;hr>
&lt;h2 id="2-वसतकल-क-समगर-चतर-आरकटकचर-ओवरवय">2. वास्तुकला का समग्र चित्र (आर्किटेक्चर ओवरव्यू)
&lt;/h2>&lt;p>संपूर्ण अनुमान पाइपलाइन का प्रवाह नीचे दिए गए Mermaid आरेख में दिखाया गया है। यह उपयोगकर्ता के इनपुट पाठ से शुरू होकर अंततः अगले टोकन के उत्पन्न होने तक की एक श्रृंखला है।&lt;/p>
&lt;div class="mermaid">graph TD
A["उपयोगकर्ता इनपुट पाठ"] --> B["BPE टोकनाइज़र"]
B --> C["टोकन आईडी एरे"]
C --> D["एम्बेडिंग लेयर लुकअप"]
D --> E["ट्रांसफॉर्मर ब्लॉक्स"]
E --> F["RMSNorm"]
F --> G["LM हेड लेयर"]
G --> H["लॉजिट्स एरे"]
H --> I["सैंपलर मॉड्यूल"]
I --> J["अगला टोकन आईडी"]
J --> K["डिटोकनाइज़र"]
K --> L["आउटपुट टेक्स्ट चंक"]
J -.-> |"संदर्भ में जोड़ें"| C&lt;/div>
&lt;p>चूँकि यह एक ऑटो-रिग्रेसिव मॉडल है, इसलिए आउटपुट टोकन को फिर से संदर्भ (कॉन्टेक्स्ट) में जोड़ा जाता है और यह अगले टोकन की भविष्यवाणी के लिए इनपुट के रूप में चक्रित होता है (आरेख में बिंदीदार रेखा वाला भाग)।&lt;/p>
&lt;hr>
&lt;h2 id="3-मडल-पररप-और-ममर-मपग-mmap">3. मॉडल प्रारूप और मेमोरी मैपिंग (mmap)
&lt;/h2>&lt;p>विशाल न्यूरल नेटवर्क के वेट्स (weights) को संभालने में सबसे बड़ी बाधा डिस्क I/O और मेमोरी की खपत है। C++ कार्यान्वयन में इसे &lt;strong>मेमोरी मैपिंग (mmap)&lt;/strong> से हल किया जाता है।&lt;/p>
&lt;h3 id="31-ममर-मपग-क-ततर-और-windows-म-करयनवयन">3.1 मेमोरी मैपिंग का तंत्र और Windows में कार्यान्वयन
&lt;/h3>&lt;p>mmap का उपयोग करने से, फ़ाइल की सामग्री को सीधे प्रक्रिया के वर्चुअल मेमोरी स्पेस में मैप किया जा सकता है।&lt;/p>
&lt;ul>
&lt;li>&lt;strong>ज़ीरो-कॉपी (Zero-copy)&lt;/strong>: डेटा सीधे डिस्क से कर्नेल के पेज कैश में पढ़ा जाता है, जिससे यूज़र स्पेस में कोई अतिरिक्त कॉपी नहीं होती।&lt;/li>
&lt;li>&lt;strong>ऑन-डिमांड लोड (Page Fault)&lt;/strong>: जब CPU वास्तव में उस मेमोरी एड्रेस तक पहुँचता है, तभी एक पेज फॉल्ट होता है, और केवल आवश्यक चंक (आमतौर पर 4KB) भौतिक मेमोरी में लोड होता है।&lt;/li>
&lt;/ul>
&lt;p>Windows वातावरण में, POSIX के &lt;code>mmap&lt;/code> के बजाय Win32 API के &lt;code>CreateFileMapping&lt;/code> और &lt;code>MapViewOfFile&lt;/code> का उपयोग किया जाता है।&lt;/p>
&lt;div class="mermaid">sequenceDiagram
participant OS["Windows OS"]
participant RAM["भौतिक मेमोरी"]
participant App["C++ एप्लिकेशन"]
App->>OS: "CreateFileMapping / MapViewOfFile"
OS-->>App: "वर्चुअल मेमोरी एड्रेस पॉइंटर"
App->>App: "पॉइंटर पर टेंसर डेटा पढ़ें"
OS->>RAM: "पेज फॉल्ट / डिस्क से पेज लोड करें"
RAM-->>App: "SIMD गणना के लिए डेटा तैयार है"&lt;/div>
&lt;h3 id="32-gguf-पररप-क-बइनर-सरचन">3.2 GGUF प्रारूप की बाइनरी संरचना
&lt;/h3>&lt;p>Hugging Face जैसे प्लेटफार्मों से &lt;code>.safetensors&lt;/code> प्रारूप से परिवर्तित &lt;strong>GGUF (GPT-Generated Unified Format)&lt;/strong> अनुमान के लिए अंतिम प्रारूप है। इसका एक सख्त बाइनरी लेआउट है जैसा कि नीचे दिया गया है:&lt;/p>
&lt;ol>
&lt;li>&lt;strong>मैजिक बाइट्स (Magic Bytes)&lt;/strong>: &lt;code>0x46554747&lt;/code> (GGUF)।&lt;/li>
&lt;li>&lt;strong>संस्करण (Version)&lt;/strong>: प्रारूप का संस्करण क्रमांक।&lt;/li>
&lt;li>&lt;strong>टेंसर गणना और मेटाडेटा गणना&lt;/strong>: टेंसर की संख्या और मेटाडेटा के की-वैल्यू पेयर की संख्या।&lt;/li>
&lt;li>&lt;strong>मेटाडेटा (Key-Value Pairs)&lt;/strong>: स्ट्रिंग लेंथ प्रीफिक्स के साथ की (Key), और टाइप की गई वैल्यू।&lt;/li>
&lt;li>&lt;strong>टेंसर इन्फो (Tensor Info)&lt;/strong>: प्रत्येक टेंसर का नाम, आयामों की संख्या, डेटा प्रकार (FP16, Q4_K आदि), और फ़ाइल के भीतर ऑफ़सेट स्थिति।&lt;/li>
&lt;li>&lt;strong>पैडिंग (Padding)&lt;/strong>: पैडिंग डाली जाती है ताकि टेंसर डेटा एक विशिष्ट सीमा (आमतौर पर 32 बाइट्स या 64 बाइट्स) पर संरेखित (aligned) हो। यह SIMD निर्देशों (विशेष रूप से AVX) में उच्च गति मेमोरी एक्सेस के लिए आवश्यक है।&lt;/li>
&lt;li>&lt;strong>टेंसर डेटा&lt;/strong>: संरेखित वास्तविक वेट (weight) डेटा एरे।&lt;/li>
&lt;/ol>
&lt;hr>
&lt;h2 id="4-tinyllama-क-गणतय-आधर-और-c-एलगरदम">4. TinyLLaMA का गणितीय आधार और C++ एल्गोरिदम
&lt;/h2>&lt;p>TinyLLaMA दक्षता के लिए कई उन्नत आर्किटेक्चरल तकनीकों को शामिल करता है। C++ में इन्हें सही ढंग से लागू करने के लिए हम गणितीय अभिव्यक्तियों की व्याख्या करेंगे।&lt;/p>
&lt;h3 id="41-rmsnorm-root-mean-square-normalization">4.1 RMSNorm (Root Mean Square Normalization)
&lt;/h3>&lt;p>LayerNorm से माध्य (mean) की सेंटरिंग को हटाकर और केवल वेरिएंस स्केलिंग करके गणना लागत को कम किया जाता है।&lt;/p>
$$ \text{RMSNorm}(x) = \frac{x}{\sqrt{\frac{1}{d}\sum_{i=1}^{d} x_i^2 + \epsilon}} \odot \gamma $$
&lt;p>$d$ आयामों की संख्या है, $\gamma$ सीखा हुआ स्केलिंग टेंसर है।
C++ में इसे लागू करते समय, एरे के वर्ग का योग पहले AVX2 के &lt;code>_mm256_fmadd_ps&lt;/code> आदि के साथ उच्च गति से गणना किया जाता है, और फिर व्युत्क्रम वर्गमूल (जैसे &lt;code>_mm256_rsqrt_ps&lt;/code> निर्देश) से गुणा करके इसे अनुकूलित किया जाता है।&lt;/p>
&lt;h3 id="42-rope-rotary-position-embedding">4.2 RoPE (Rotary Position Embedding)
&lt;/h3>&lt;p>यह एक ऐसी तकनीक है जो टेंसर स्पेस में रोटेशन (Rotate) के रूप में टोकन की स्थितिगत जानकारी लागू करती है। इसे जटिल संख्या तल (complex plane) पर रोटेशन माना जा सकता है, और वेक्टर $x$ के आसन्न आयाम जोड़े $(x_1, x_2)$ पर निम्नलिखित रोटेशन लागू किया जाता है।&lt;/p>
$$ \text{RoPE}(x, m) = \begin{pmatrix} x_{1} \cos(m\theta) - x_{2} \sin(m\theta) \\ x_{1} \sin(m\theta) + x_{2} \cos(m\theta) \end{pmatrix} $$
&lt;p>यहाँ, $m$ टोकन का पूर्ण स्थिति सूचकांक है, और $\theta$ पूर्व-गणना की गई मूल आवृत्ति है। ggml में, अनुमान ग्राफ के निर्माण के दौरान &lt;code>ggml_rope&lt;/code> ऑपरेटर जोड़ने से यह समानांतर रूप से निष्पादित होता है।&lt;/p>
&lt;h3 id="43-grouped-query-attention-gqa">4.3 Grouped-Query Attention (GQA)
&lt;/h3>&lt;p>सामान्य Multi-Head Attention (MHA) में, Query, Key और Value प्रत्येक के लिए समान संख्या में हेड्स होते हैं। हालाँकि, TinyLLaMA मेमोरी बैंडविड्थ और KV कैश खपत को भारी मात्रा में कम करने के लिए &lt;strong>Grouped-Query Attention (GQA)&lt;/strong> का उपयोग करता है।&lt;/p>
$$ \text{Attention}(Q, K, V) = \text{softmax}\left(\frac{Q K^T}{\sqrt{d_k}}\right) V $$
&lt;p>GQA में, कई Query हेड्स एक ही Key/Value हेड साझा shared करते हैं। C++ कार्यान्वयन में, मैट्रिक्स गुणा &lt;code>ggml_mul_mat&lt;/code> निष्पादित करने से पहले, Query की संख्या से मेल खाने के लिए KV टेंसर को ब्रॉडकास्ट करने की आवश्यकता होती है।&lt;/p>
&lt;h3 id="44-swiglu-एकटवशन-फकशन">4.4 SwiGLU एक्टिवेशन फ़ंक्शन
&lt;/h3>&lt;p>Feed-Forward Network (FFN) लेयर में, GELU के बजाय SwiGLU का उपयोग किया जाता है।&lt;/p>
$$ \text{SwiGLU}(x) = \text{Swish}(x W_{\text{gate}}) \otimes (x W_{\text{up}}) $$
$$ \text{Swish}(z) = z \cdot \sigma(z) = z \cdot \frac{1}{1 + e^{-z}} $$
&lt;p>कम्प्यूटेशन ग्राफ में, इसे &lt;code>ggml_silu&lt;/code> ऑपरेटर और &lt;code>ggml_mul&lt;/code> के संयोजन से दर्शाया जाता है।&lt;/p>
&lt;hr>
&lt;h2 id="5-ggml-क-सथ-कमपयटशन-गरफ-क-नरमण-और-ममर-परबधन">5. ggml के साथ कम्प्यूटेशन ग्राफ का निर्माण और मेमोरी प्रबंधन
&lt;/h2>&lt;p>ggml &amp;ldquo;Define-and-Run&amp;rdquo; दृष्टिकोण अपनाता है, जहाँ यह अनुमान के लिए एक स्थिर कम्प्यूटेशन ग्राफ बनाता है और बाद में उसका मूल्यांकन (evaluate) करता है।&lt;/p>
&lt;h3 id="51-ggml_context-और-एरन-एलकटर">5.1 ggml_context और एरिना एलोकेटर
&lt;/h3>&lt;p>ggml की सबसे अनूठी विशेषता &amp;ldquo;एरिना एलोकेशन&amp;rdquo; है, जो अनुमान लूप के भीतर कोई डायनामिक मेमोरी आवंटन (&lt;code>malloc&lt;/code> या &lt;code>new&lt;/code>) नहीं करता है।
प्रारंभिकरण के दौरान, एक विशाल निरंतर मेमोरी क्षेत्र (एरिना) सुरक्षित किया जाता है, और जब भी &lt;code>ggml_new_tensor&lt;/code> आदि को कॉल किया जाता है, तो इस क्षेत्र का पॉइंटर बढ़ा (increment) दिया जाता है। एक अनुमान चरण के पूरा होने के बाद, आवंटन पॉइंटर को प्रारंभिक स्थिति में रीसेट करने से, अगले अनुमान चरण के लिए मेमोरी आवंटन तुरंत पूरा हो जाता है।&lt;/p>
&lt;h3 id="52-गरफ-नरमण-क-वशषट-उदहरण">5.2 ग्राफ निर्माण का विशिष्ट उदाहरण
&lt;/h3>&lt;p>प्रत्येक अनुमान चरण के लिए, मेमोरी में निम्नलिखित कम्प्यूटेशन ग्राफ बनाया जाता है।&lt;/p>
&lt;div class="mermaid">graph TD
A["टोकन इनपुट आईडी"] --> B["एम्बेड लुकअप"]
B --> C["ggml_rms_norm"]
C --> D["Q / K / V प्रोजेक्शन्स"]
D --> E["ggml_rope पोजीशनल"]
E --> F["KV कैश स्टोर"]
E --> G["KV कैश लोड"]
G --> H["सेल्फ अटेंशन"]
H --> I["स्केल और सॉफ्टमैक्स"]
I --> J["अटेंशन आउटपुट"]
J --> K["आउट प्रोजेक्शन"]
K --> L["अवशिष्ट जोड़ें (Add Residual)"]&lt;/div>
&lt;hr>
&lt;h2 id="6-कवटइजशन-quantization-और-windows--simd-ऑपटमइजशन">6. क्वांटाइज़ेशन (Quantization) और Windows / SIMD ऑप्टिमाइज़ेशन
&lt;/h2>&lt;p>TinyLLaMA (1.1B) को FP16 में सँभालने के लिए लगभग 2.2GB मेमोरी की आवश्यकता होती है, लेकिन 4-बिट क्वांटाइज़ेशन (जैसे Q4_K) के साथ इसे नाटकीय रूप से लगभग 600MB तक संपीड़ित किया जा सकता है।&lt;/p>
&lt;h3 id="61-बलक-कवटइजशन-आरकटकचर">6.1 ब्लॉक क्वांटाइज़ेशन आर्किटेक्चर
&lt;/h3>&lt;p>ggml पूरे टेंसर को एक साथ क्वांटाइज़ करने के बजाय इसे &amp;ldquo;ब्लॉक&amp;rdquo; के आधार पर करता है।
&lt;code>Q4_0&lt;/code> प्रारूप में, 32 FP16 मानों को एक ब्लॉक में समूहीकृत किया जाता है।&lt;/p>
&lt;ul>
&lt;li>&lt;strong>स्केल फैक्टर&lt;/strong>: 1 FP16 मान (2 बाइट्स)&lt;/li>
&lt;li>&lt;strong>क्वांटाइज़्ड डेटा&lt;/strong>: 32 4-बिट मान (16 बाइट्स)
यह स्थानीय आउटलायर्स के प्रभाव को कम करता है।&lt;/li>
&lt;/ul>
&lt;h3 id="62-avx2-क-सथ-डट-उतपद-क-तवरण">6.2 AVX2 के साथ डॉट उत्पाद का त्वरण
&lt;/h3>&lt;p>Windows वातावरण में नवीनतम x86 CPU के लिए बिल्ड करते समय, &lt;code>/arch:AVX2&lt;/code> जैसे कंपाइलर फ्लैग्स का उपयोग करके SIMD प्रोसेसिंग निम्नलिखित प्रवाह में की जाती है:&lt;/p>
&lt;ol>
&lt;li>&lt;strong>लोड&lt;/strong>: मेमोरी से 4-बिट क्वांटाइज़्ड डेटा को 256-बिट AVX रजिस्टर में लोड करना।&lt;/li>
&lt;li>&lt;strong>विस्तार और अनपैक&lt;/strong>: बिट मास्क और शिफ्ट ऑपरेशंस का उपयोग करके 4-बिट मानों को Int8 या Int16 में विस्तारित करना।&lt;/li>
&lt;li>&lt;strong>डीक्वांटाइज़ेशन&lt;/strong>: फ्लोटिंग पॉइंट में बदलने के लिए स्केल फैक्टर से गुणा करना।&lt;/li>
&lt;li>&lt;strong>FMA ऑपरेशंस&lt;/strong>: एक्टिवेशन मानों और &lt;code>_mm256_fmadd_ps&lt;/code> (Fused Multiply-Add) के साथ समानांतर में मल्टीप्लाई-ऐड (multiply-add) ऑपरेशंस निष्पादित करना।&lt;/li>
&lt;/ol>
&lt;hr>
&lt;h2 id="7-kv-कश-करयनवयन-क-ववरण">7. KV कैश कार्यान्वयन का विवरण
&lt;/h2>&lt;p>ऑटो-रिग्रेसिव जनरेशन में, पिछले टोकनों के Key और Value की गणना को छोड़ने के लिए &amp;ldquo;KV कैश&amp;rdquo; एक आवश्यक विशेषता है।&lt;/p>
&lt;p>C++ में इसे लागू करते समय मुख्य बिंदु इस प्रकार हैं:&lt;/p>
&lt;ol>
&lt;li>&lt;strong>टेंसर का पूर्व-आवंटन&lt;/strong>: KV कैश के लिए अधिकतम संदर्भ लंबाई (उदा: 2048 टोकन) के लिए एक विशाल टेंसर को इनिशियलाइज़ किया जाता है (FP16 अनुशंसित है)।&lt;/li>
&lt;li>&lt;strong>ऑफ़सेट कॉपी&lt;/strong>: जब टोकन स्थिति $N$ के लिए गणना की जाती है, तो उस चरण पर प्राप्त K और V वेक्टर्स को &lt;code>ggml_cpy&lt;/code> आदि का उपयोग करके KV कैश टेंसर की $N$-वीं पंक्ति में स्टोर किया जाता है।&lt;/li>
&lt;li>&lt;strong>अटेंशन के दौरान व्यू बनाना&lt;/strong>: अटेंशन की गणना करते समय, एक &amp;ldquo;व्यू (view)&amp;rdquo; बनाया जाता है जो केवल 0 से $N$वें टोकन भाग को इंगित करता है और उसे मैट्रिक्स गुणन में पास किया जाता है।&lt;/li>
&lt;/ol>
&lt;hr>
&lt;h2 id="8-bpe-टकनइजर-और-डकडग">8. BPE टोकनाइज़र और डिकोडिंग
&lt;/h2>&lt;p>इनपुट स्ट्रिंग को UTF-8 बाइट्स के अनुक्रम के रूप में माना जाता है और पूर्वनिर्धारित शब्दावली के विरुद्ध मिलान किया जाता है। C++ में, शब्दावली खोज को तेज करने के लिए &lt;strong>ट्राई ट्री (प्रिफिक्स ट्री)&lt;/strong> या प्राथमिकता कतारों (priority queues) का उपयोग करने वाले एल्गोरिदम लागू किए जाते हैं।&lt;/p>
&lt;p>LM Head से आउटपुट लॉजिट्स (logits) से, संभावितताओं को Temperature पैरामीटर का उपयोग करके स्केल किया जाता है, उम्मीदवारों को Top-K निष्कर्षण या Top-P (न्यूक्लियस सैंपलिंग) विधियों का उपयोग करके कम किया जाता है, और यादृच्छिक संख्याओं का उपयोग करके अंतिम अगला टोकन निर्धारित किया जाता है।&lt;/p>
&lt;hr>
&lt;h2 id="9-c-परजकट-सट-अप-करन-windows--powershell-वतवरण">9. C++ प्रोजेक्ट सेट अप करना (Windows / PowerShell वातावरण)
&lt;/h2>&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt"> 1
&lt;/span>&lt;span class="lnt"> 2
&lt;/span>&lt;span class="lnt"> 3
&lt;/span>&lt;span class="lnt"> 4
&lt;/span>&lt;span class="lnt"> 5
&lt;/span>&lt;span class="lnt"> 6
&lt;/span>&lt;span class="lnt"> 7
&lt;/span>&lt;span class="lnt"> 8
&lt;/span>&lt;span class="lnt"> 9
&lt;/span>&lt;span class="lnt">10
&lt;/span>&lt;span class="lnt">11
&lt;/span>&lt;span class="lnt">12
&lt;/span>&lt;span class="lnt">13
&lt;/span>&lt;span class="lnt">14
&lt;/span>&lt;span class="lnt">15
&lt;/span>&lt;span class="lnt">16
&lt;/span>&lt;span class="lnt">17
&lt;/span>&lt;span class="lnt">18
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-cmake" data-lang="cmake">&lt;span class="line">&lt;span class="cl">&lt;span class="nb">cmake_minimum_required&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s">VERSION&lt;/span> &lt;span class="s">3.14&lt;/span>&lt;span class="p">)&lt;/span>&lt;span class="err">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="err">&lt;/span>&lt;span class="nb">project&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s">TinyLLaMACpp&lt;/span>&lt;span class="p">)&lt;/span>&lt;span class="err">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="err">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="err">&lt;/span>&lt;span class="nb">set&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s">CMAKE_CXX_STANDARD&lt;/span> &lt;span class="s">17&lt;/span>&lt;span class="p">)&lt;/span>&lt;span class="err">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="err">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="err">&lt;/span>&lt;span class="c"># Windows (MSVC) के लिए ऑप्टिमाइज़ेशन और AVX2 फ्लैग की सेटिंग
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c">&lt;/span>&lt;span class="nb">if&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s">MSVC&lt;/span>&lt;span class="p">)&lt;/span>&lt;span class="err">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="err">&lt;/span> &lt;span class="nb">add_compile_options&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s">/O2&lt;/span> &lt;span class="s">/arch:AVX2&lt;/span> &lt;span class="s">/fp:fast&lt;/span>&lt;span class="p">)&lt;/span>&lt;span class="err">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="err">&lt;/span> &lt;span class="nb">add_link_options&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s">/STACK:8388608&lt;/span>&lt;span class="p">)&lt;/span>&lt;span class="err">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="err">&lt;/span>&lt;span class="nb">else&lt;/span>&lt;span class="p">()&lt;/span>&lt;span class="err">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="err">&lt;/span> &lt;span class="nb">add_compile_options&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s">-O3&lt;/span> &lt;span class="s">-march=native&lt;/span> &lt;span class="s">-ffast-math&lt;/span>&lt;span class="p">)&lt;/span>&lt;span class="err">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="err">&lt;/span>&lt;span class="nb">endif&lt;/span>&lt;span class="p">()&lt;/span>&lt;span class="err">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="err">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="err">&lt;/span>&lt;span class="nb">add_library&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s">ggml&lt;/span> &lt;span class="s">OBJECT&lt;/span> &lt;span class="s">ggml/ggml.c&lt;/span> &lt;span class="s">ggml/ggml-alloc.c&lt;/span>&lt;span class="p">)&lt;/span>&lt;span class="err">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="err">&lt;/span>&lt;span class="nb">target_compile_definitions&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s">ggml&lt;/span> &lt;span class="s">PRIVATE&lt;/span> &lt;span class="s">GGML_USE_AVX2&lt;/span> &lt;span class="s">GGML_USE_F16C&lt;/span> &lt;span class="s">GGML_USE_FMA&lt;/span>&lt;span class="p">)&lt;/span>&lt;span class="err">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="err">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="err">&lt;/span>&lt;span class="nb">add_executable&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s">main&lt;/span> &lt;span class="s">main.cpp&lt;/span>&lt;span class="p">)&lt;/span>&lt;span class="err">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="err">&lt;/span>&lt;span class="nb">target_link_libraries&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s">main&lt;/span> &lt;span class="s">ggml&lt;/span>&lt;span class="p">)&lt;/span>&lt;span class="err">
&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>PowerShell में बिल्ड कमांड का उदाहरण:&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;span class="lnt">2
&lt;/span>&lt;span class="lnt">3
&lt;/span>&lt;span class="lnt">4
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-powershell" data-lang="powershell">&lt;span class="line">&lt;span class="cl">&lt;span class="n">mkdir&lt;/span> &lt;span class="n">build&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">cd &lt;/span>&lt;span class="n">build&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">cmake&lt;/span> &lt;span class="p">..&lt;/span> &lt;span class="n">-G&lt;/span> &lt;span class="s2">&amp;#34;Visual Studio 17 2022&amp;#34;&lt;/span> &lt;span class="n">-A&lt;/span> &lt;span class="n">x64&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">cmake&lt;/span> &lt;span class="p">-&lt;/span>&lt;span class="n">-build&lt;/span> &lt;span class="p">.&lt;/span> &lt;span class="p">-&lt;/span>&lt;span class="n">-config&lt;/span> &lt;span class="n">Release&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;hr>
&lt;h2 id="10-नषकरष">10. निष्कर्ष
&lt;/h2>&lt;p>C++ और ggml का उपयोग करके TinyLLaMA जैसे छोटे AI मॉडल के लिए शून्य से एक अनुमान इंजन लागू करना डीप लर्निंग के ब्लैक बॉक्स को खोलने और निम्न-स्तरीय हार्डवेयर नियंत्रण की सुंदरता सीखने का एक उत्कृष्ट अवसर है। मेमोरी मैपिंग का उपयोग करके ज़ीरो-कॉपी लोडिंग, SIMD ऑप्टिमाइज़ेशन और KV कैश के निर्माण जैसी सिस्टम प्रोग्रामिंग के सार का आनंद लेते हुए, आइए एज AI के भविष्य का मार्ग प्रशस्त करें।&lt;/p></description></item><item><title>【RAG इम्प्लीमेंटेशन गाइड】 लोकल AI को अपने दस्तावेज़ कैसे पढ़ाएं</title><link>http://kenji.blog/hi/p/rag-local-ai-implementation-guide/</link><pubDate>Fri, 11 Sep 2026 13:00:00 +0900</pubDate><guid>http://kenji.blog/hi/p/rag-local-ai-implementation-guide/</guid><description>&lt;img src="http://kenji.blog/p/rag-local-ai-implementation-guide/img/eyecatch.jpg" alt="Featured image of post 【RAG इम्प्लीमेंटेशन गाइड】 लोकल AI को अपने दस्तावेज़ कैसे पढ़ाएं" />&lt;h1 id="परचय">परिचय
&lt;/h1>&lt;p>हाल के वर्षों में, लार्ज लैंग्वेज मॉडल (LLM) का विकास उल्लेखनीय रहा है, और ChatGPT और Claude जैसी कई AI हमारी जिंदगी और काम का अहम हिस्सा बन गई हैं। हालाँकि, सामान्य LLMs की एक स्पष्ट कमजोरी होती है। वह यह है कि वे केवल &amp;ldquo;ट्रेनिंग के समय उपलब्ध सार्वजनिक जानकारी&amp;rdquo; ही जानते हैं। स्वाभाविक रूप से, वे कंपनी के नियमों, व्यक्तिगत नोट्स, और अप्रकाशित प्रोजेक्ट दस्तावेज़ों जैसे &amp;ldquo;निजी दस्तावेज़ों&amp;rdquo; के बारे में सवालों का जवाब नहीं दे सकते। यदि आप उन्हें जबरदस्ती जवाब देने के लिए कहते हैं, तो इस बात का बहुत अधिक जोखिम होता है कि वे मनगढ़ंत और झूठी जानकारी (हैलुसिनेशन) उत्पन्न कर दें।&lt;/p>
&lt;p>इसलिए, वर्तमान में दुनिया भर में &lt;strong>RAG (Retrieval-Augmented Generation: रिट्रीवल-ऑगमेंटेड जनरेशन)&lt;/strong> नामक एक तकनीकी आर्किटेक्चर तेजी से लोकप्रिय हो रहा है। RAG का उपयोग करके, बाहरी डेटाबेस से LLM को गतिशील रूप से अपना खुद का ज्ञान प्रदान करना और इसके आधार पर सटीक और प्रामाणिक उत्तर उत्पन्न करना संभव है।&lt;/p>
&lt;p>इसके अलावा, जब एंटरप्राइज़ क्षेत्र या व्यक्तिगत गोपनीय जानकारी से निपटते हैं, तो सुरक्षा नीतियों के कारण OpenAI जैसे क्लाउड-आधारित API में डेटा भेजना अक्सर अस्वीकार्य होता है। ऐसी स्थिति में, एक &lt;strong>लोकल AI&lt;/strong> (एक LLM जो आपके अपने PC या ऑन-प्रिमाइस सर्वर पर पूरी तरह से चलता है) के साथ संयुक्त &amp;ldquo;लोकल RAG&amp;rdquo; का निर्माण आवश्यक हो जाता है।&lt;/p>
&lt;p>इस लेख में, हम RAG के बुनियादी सिद्धांत से लेकर, Python का उपयोग करके लोकल RAG के विशिष्ट इम्प्लीमेंटेशन, इसके गणितीय आधार (वेक्टर सर्च कैसे काम करता है), और सिस्टम को उत्पादन (प्रोडक्शन) में चलाने की उन्नत तकनीकों तक सब कुछ विस्तार से समझाएंगे।&lt;/p>
&lt;hr>
&lt;h1 id="1-rag-क-समगर-आरकटकचर">1. RAG का समग्र आर्किटेक्चर
&lt;/h1>&lt;p>RAG कोई एक AI मॉडल नहीं है, बल्कि एक सिस्टम आर्किटेक्चर है जहां कई कंपोनेंट्स एक साथ काम करते हैं। इसे मुख्य रूप से दो चरणों में बांटा जा सकता है: &amp;ldquo;इंजेस्ट (डेटा इनपुट) चरण&amp;rdquo; और &amp;ldquo;रिट्रीवल और जनरेशन (सर्च और जनरेशन) चरण&amp;rdquo;।&lt;/p>
&lt;p>नीचे दिया गया Mermaid आरेख RAG सिस्टम का समग्र दृश्य दिखाता है।&lt;/p>
&lt;div class="mermaid">graph TD
subgraph "इंजेस्ट चरण (पूर्व तैयारी)"
Doc["स्वयं के दस्तावेज़ (PDF, TXT, आदि)"] --> Loader["दस्तावेज़ लोडर"]
Loader --> Splitter["टेक्स्ट विभाजन (चंकिंग)"]
Splitter --> EmbedModel1["एम्बेडिंग मॉडल (Embedding)"]
EmbedModel1 --> VectorDB["वेक्टर डेटाबेस"]
end
subgraph "इन्फ्रेंस चरण (उपयोगकर्ता की क्वेरी के समय)"
User["उपयोगकर्ता के प्रश्न (क्वेरी)"] --> EmbedModel2["एम्बेडिंग मॉडल (Embedding)"]
EmbedModel2 --> QueryVector["क्वेरी वेक्टर"]
QueryVector --> Search["समानता सर्च (वेक्टर सर्च)"]
VectorDB --> Search
Search --> Context["संबंधित चंक एक्सट्रैक्शन (संदर्भ)"]
User --> PromptBuilder["प्रॉम्प्ट निर्माण"]
Context --> PromptBuilder
PromptBuilder --> LocalLLM["लोकल LLM"]
LocalLLM --> Answer["अंतिम उत्तर जनरेशन"]
end&lt;/div>
&lt;h2 id="इजसट-चरण-परव-तयर">इंजेस्ट चरण (पूर्व तैयारी)
&lt;/h2>&lt;ol>
&lt;li>&lt;strong>दस्तावेज़ों को पढ़ना&lt;/strong>: PDF, Word, और टेक्स्ट फ़ाइलों जैसे अनस्ट्रक्चर्ड डेटा को लोड किया जाता है।&lt;/li>
&lt;li>&lt;strong>चंकिंग (टेक्स्ट विभाजन)&lt;/strong>: LLM की इनपुट सीमा (संदर्भ विंडो) के भीतर फिट होने और सर्च सटीकता में सुधार करने के लिए, लंबे टेक्स्ट को अर्थपूर्ण भागों (चंक्स) में विभाजित किया जाता है।&lt;/li>
&lt;li>&lt;strong>एम्बेडिंग (वेक्टराइजेशन)&lt;/strong>: विभाजित चंक्स को एक एम्बेडिंग मॉडल (Embedding Model) में इनपुट किया जाता है और सैकड़ों से हजारों आयामों वाले संख्याओं की एक ऐरे (वेक्टर) में बदल दिया जाता है।&lt;/li>
&lt;li>&lt;strong>डेटाबेस में सेव करना&lt;/strong>: परिवर्तित वेक्टर्स और मूल टेक्स्ट डेटा को एक साथ जोड़ा जाता है और एक वेक्टर डेटाबेस (Vector DB) में सेव किया जाता है।&lt;/li>
&lt;/ol>
&lt;h2 id="इनफरस-चरण-रनटइम">इन्फ्रेंस चरण (रनटाइम)
&lt;/h2>&lt;ol>
&lt;li>&lt;strong>क्वेरी का वेक्टराइजेशन&lt;/strong>: पूर्व तैयारी के समान एम्बेडिंग मॉडल का उपयोग करके उपयोगकर्ता के प्रश्न को एक वेक्टर में बदल दिया जाता है।&lt;/li>
&lt;li>&lt;strong>समानता सर्च (Similarity Search)&lt;/strong>: डेटाबेस में क्वेरी वेक्टर और दस्तावेज़ वेक्टर्स के बीच समानता की गणना की जाती है, और अर्थपूर्ण रूप से निकटतम (अत्यधिक प्रासंगिक) टेक्स्ट चंक्स में से शीर्ष कुछ को प्राप्त किया जाता है।&lt;/li>
&lt;li>&lt;strong>प्रॉम्प्ट का निर्माण&lt;/strong>: प्राप्त संबंधित टेक्स्ट को उपयोगकर्ता के प्रश्न के साथ &amp;ldquo;संदर्भ (पृष्ठभूमि ज्ञान)&amp;rdquo; के रूप में जोड़ा जाता है ताकि LLM के लिए एक इनपुट प्रॉम्प्ट बनाया जा सके।&lt;/li>
&lt;li>&lt;strong>उत्तर का जनरेशन&lt;/strong>: विस्तारित प्रॉम्प्ट प्राप्त करने वाला LLM प्रदान की गई संदर्भ जानकारी के आधार पर एक उत्तर उत्पन्न करता है।&lt;/li>
&lt;/ol>
&lt;hr>
&lt;h1 id="2-वकटर-सरच-और-एमबडग-embeddings-क-गहर-समझ">2. वेक्टर सर्च और एम्बेडिंग (Embeddings) की गहरी समझ
&lt;/h1>&lt;p>RAG का मूल &amp;ldquo;वेक्टर सर्च (सिमेंटिक सर्च)&amp;rdquo; है। पारंपरिक कीवर्ड सर्च (जैसे BM25) के विपरीत, जो सटीक शब्द मिलान या आवृत्ति पर आधारित होता है, वेक्टर सर्च &amp;ldquo;अर्थ की समानता&amp;rdquo; पर आधारित होता है। उदाहरण के लिए, भले ही शब्द भिन्न हों जैसे &amp;ldquo;कुत्ता&amp;rdquo; और &amp;ldquo;पिल्ला&amp;rdquo;, या &amp;ldquo;PC&amp;rdquo; और &amp;ldquo;कंप्यूटर&amp;rdquo;, वे सर्च में दिखाई देंगे यदि उनके अर्थ करीब हैं।&lt;/p>
&lt;h2 id="एमबडग-मडल-embedding-model-कय-ह">एम्बेडिंग मॉडल (Embedding Model) क्या है?
&lt;/h2>&lt;p>एक एम्बेडिंग मॉडल एक न्यूरल नेटवर्क है जो प्राकृतिक भाषा के टेक्स्ट को इनपुट के रूप में लेता है और एक फिक्स्ड-लेंथ डेंस वेक्टर (Dense Vector) आउटपुट करता है। सामान्य मॉडल (जैसे &lt;code>text-embedding-3-small&lt;/code> या ओपन-सोर्स &lt;code>multilingual-e5-large&lt;/code>) टेक्स्ट को 384-आयामी या 1024-आयामी वास्तविक संख्या वेक्टर में मैप करते हैं।&lt;/p>
&lt;p>इस बहुआयामी स्पेस (लेटेंट स्पेस) में, मॉडल को इस तरह से प्रशिक्षित किया जाता है कि समान अर्थ वाले वाक्यों की कोआर्डिनेट स्पेस में दूरी कम हो।&lt;/p>
&lt;h2 id="समनत-गणन-क-गणतय-पषठभम-कसइन-समनत-cosine-similarity">समानता गणना की गणितीय पृष्ठभूमि: कोसाइन समानता (Cosine Similarity)
&lt;/h2>&lt;p>जब एक वेक्टर डेटाबेस संबंधित दस्तावेज़ों को खोजता है, तो सबसे अधिक इस्तेमाल किया जाने वाला दूरी मीट्रिक &lt;strong>कोसाइन समानता (Cosine Similarity)&lt;/strong> है। यूक्लिडियन दूरी (पूर्ण स्थानिक दूरी) के विपरीत, कोसाइन समानता &amp;ldquo;दो वेक्टर्स के बीच के कोण&amp;rdquo; पर केंद्रित होती है। क्योंकि यह वाक्यों की लंबाई (वेक्टर नॉर्म) से कम प्रभावित होती है, यह टेक्स्ट समानता की गणना के लिए बहुत उपयुक्त है।&lt;/p>
&lt;p>गणितीय रूप से व्यक्त किया गया, वेक्टर $\mathbf{A}$ और $\mathbf{B}$ की कोसाइन समानता इस प्रकार है:&lt;/p>
$$ \text{Cosine Similarity}(\mathbf{A}, \mathbf{B}) = \cos(\theta) = \frac{\mathbf{A} \cdot \mathbf{B}}{\|\mathbf{A}\| \|\mathbf{B}\|} = \frac{\sum_{i=1}^{n} A_i B_i}{\sqrt{\sum_{i=1}^{n} A_i^2} \sqrt{\sum_{i=1}^{n} B_i^2}} $$
&lt;ul>
&lt;li>$\mathbf{A} \cdot \mathbf{B}$ डॉट प्रोडक्ट (Dot Product) को दर्शाता है।&lt;/li>
&lt;li>$\|\mathbf{A}\|$ वेक्टर $\mathbf{A}$ के L2 नॉर्म (लंबाई) को दर्शाता है।&lt;/li>
&lt;li>$n$ वेक्टर के आयामों की संख्या है।&lt;/li>
&lt;/ul>
&lt;p>कोसाइन समानता का मान -1 से 1 के बीच होता है:&lt;/p>
&lt;ul>
&lt;li>&lt;strong>1 के करीब&lt;/strong>: दो वेक्टर्स की दिशा लगभग समान होती है (अर्थ बहुत समान हैं)।&lt;/li>
&lt;li>&lt;strong>0 के करीब&lt;/strong>: दो वेक्टर्स एक-दूसरे के समकोण पर हैं (असंबंधित)।&lt;/li>
&lt;li>&lt;strong>-1 के करीब&lt;/strong>: दो वेक्टर्स विपरीत दिशाओं में हैं (अर्थ विपरीत हैं)।&lt;/li>
&lt;/ul>
&lt;p>नवीनतम वेक्टर DBs (Chroma, FAISS, Qdrant, आदि) HNSW (Hierarchical Navigable Small World) नामक एक अनुमानित निकटतम पड़ोसी (Approximate Nearest Neighbor - ANN) एल्गोरिदम का उपयोग करते हैं, जो लाखों वेक्टर डेटा से मिलीसेकंड में उच्च कोसाइन समानता वाले दस्तावेज़ों को खोजने के लिए अनुकूलित है।&lt;/p>
&lt;hr>
&lt;h1 id="3-लकल-rag-क-नरमण-क-लए-तकनक-सटक">3. लोकल RAG के निर्माण के लिए तकनीकी स्टैक
&lt;/h1>&lt;p>क्लाउड से स्वतंत्र पूरी तरह से लोकल RAG बनाने के लिए, हम ओपन-सोर्स इकोसिस्टम का लाभ उठाते हैं। नीचे अनुशंसित तकनीकी स्टैक दिया गया है:&lt;/p>
&lt;ol>
&lt;li>&lt;strong>लैंग्वेज मॉडल (LLM)&lt;/strong>
&lt;ul>
&lt;li>टूल्स: &lt;code>Ollama&lt;/code> या &lt;code>Llama.cpp&lt;/code>&lt;/li>
&lt;li>मॉडल: &lt;code>Llama-3-8B-Instruct&lt;/code>, &lt;code>Gemma-2-9B-It&lt;/code>, &lt;code>Qwen2-7B-Instruct&lt;/code> जैसे हल्के और उच्च-प्रदर्शन वाले ओपन मॉडल। जापानी कार्यों के लिए, जापानी-ट्यून किए गए &lt;code>Llama-3-ELYZA-JP-8B&lt;/code> आदि उपयुक्त हैं।&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>&lt;strong>एम्बेडिंग मॉडल (Embedding)&lt;/strong>
&lt;ul>
&lt;li>मॉडल: &lt;code>intfloat/multilingual-e5-large&lt;/code> या &lt;code>BAAI/bge-m3&lt;/code>। जब इसे लोकली चलाया जाता है, तो आमतौर पर इसे Hugging Face से डाउनलोड किया जाता है और Sentence-Transformers के साथ निष्पादित किया जाता है।&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>&lt;strong>वेक्टर डेटाबेस (Vector DB)&lt;/strong>
&lt;ul>
&lt;li>&lt;code>ChromaDB&lt;/code>: Python-आधारित और सेट अप करने में बेहद आसान। लोकल डेवलपमेंट के लिए आदर्श।&lt;/li>
&lt;li>&lt;code>FAISS&lt;/code>: Meta द्वारा विकसित एक तेज़ वेक्टर सर्च लाइब्रेरी।&lt;/li>
&lt;li>&lt;code>Qdrant&lt;/code> / &lt;code>Milvus&lt;/code>: बड़े पैमाने और उत्पादन (प्रोडक्शन) वातावरण के लिए अधिक उपयुक्त।&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>&lt;strong>ऑर्केस्ट्रेशन फ्रेमवर्क&lt;/strong>
&lt;ul>
&lt;li>&lt;code>LangChain&lt;/code>: कंपोनेंट्स को जोड़ने (Chain) के लिए वास्तविक मानक (de facto standard)।&lt;/li>
&lt;li>&lt;code>LlamaIndex&lt;/code>: विशेष रूप से RAG के लिए एक डेटा कनेक्शन फ्रेमवर्क।&lt;/li>
&lt;/ul>
&lt;/li>
&lt;/ol>
&lt;p>इस बार, हम &lt;strong>LangChain + ChromaDB + Ollama + HuggingFaceEmbeddings&lt;/strong> के संयोजन का उपयोग करके इसे लागू करेंगे, जिसे इंस्टॉल करना सबसे आसान है।&lt;/p>
&lt;hr>
&lt;h1 id="4-इमपलमटशन-टयटरयल-python-क-उपयग-करक-परण-लकल-rag-क-नरमण">4. इम्प्लीमेंटेशन ट्यूटोरियल: Python का उपयोग करके पूर्ण लोकल RAG का निर्माण
&lt;/h1>&lt;p>यहाँ से, हम वास्तव में Python कोड लिखते हुए एक लोकल RAG बनाएंगे। कृपया सुनिश्चित करें कि Ollama आपके PC पर स्थापित है और पहले से ही बैकग्राउंड में चल रहा है। इसके अलावा, Ollama पर मॉडल को पुल करें (उदाहरण के लिए: &lt;code>ollama run llama3&lt;/code>)।&lt;/p>
&lt;h2 id="चरण-1-आवशयक-लइबररज-इसटल-करन">चरण 1: आवश्यक लाइब्रेरीज़ इंस्टॉल करना
&lt;/h2>&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;span class="lnt">2
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">pip install langchain langchain-community langchain-huggingface
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">pip install chromadb sentence-transformers pypdf
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;h2 id="चरण-2-समपरण-इमपलमटशन-कड">चरण 2: सम्पूर्ण इम्प्लीमेंटेशन कोड
&lt;/h2>&lt;p>नीचे एक पूर्ण Python स्क्रिप्ट दी गई है जो PDF फ़ाइलों को पढ़ती है, उन्हें वेक्टराइज करती है, और एक लोकल LLM को प्रश्नों का उत्तर देने की अनुमति देती है।&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt"> 1
&lt;/span>&lt;span class="lnt"> 2
&lt;/span>&lt;span class="lnt"> 3
&lt;/span>&lt;span class="lnt"> 4
&lt;/span>&lt;span class="lnt"> 5
&lt;/span>&lt;span class="lnt"> 6
&lt;/span>&lt;span class="lnt"> 7
&lt;/span>&lt;span class="lnt"> 8
&lt;/span>&lt;span class="lnt"> 9
&lt;/span>&lt;span class="lnt">10
&lt;/span>&lt;span class="lnt">11
&lt;/span>&lt;span class="lnt">12
&lt;/span>&lt;span class="lnt">13
&lt;/span>&lt;span class="lnt">14
&lt;/span>&lt;span class="lnt">15
&lt;/span>&lt;span class="lnt">16
&lt;/span>&lt;span class="lnt">17
&lt;/span>&lt;span class="lnt">18
&lt;/span>&lt;span class="lnt">19
&lt;/span>&lt;span class="lnt">20
&lt;/span>&lt;span class="lnt">21
&lt;/span>&lt;span class="lnt">22
&lt;/span>&lt;span class="lnt">23
&lt;/span>&lt;span class="lnt">24
&lt;/span>&lt;span class="lnt">25
&lt;/span>&lt;span class="lnt">26
&lt;/span>&lt;span class="lnt">27
&lt;/span>&lt;span class="lnt">28
&lt;/span>&lt;span class="lnt">29
&lt;/span>&lt;span class="lnt">30
&lt;/span>&lt;span class="lnt">31
&lt;/span>&lt;span class="lnt">32
&lt;/span>&lt;span class="lnt">33
&lt;/span>&lt;span class="lnt">34
&lt;/span>&lt;span class="lnt">35
&lt;/span>&lt;span class="lnt">36
&lt;/span>&lt;span class="lnt">37
&lt;/span>&lt;span class="lnt">38
&lt;/span>&lt;span class="lnt">39
&lt;/span>&lt;span class="lnt">40
&lt;/span>&lt;span class="lnt">41
&lt;/span>&lt;span class="lnt">42
&lt;/span>&lt;span class="lnt">43
&lt;/span>&lt;span class="lnt">44
&lt;/span>&lt;span class="lnt">45
&lt;/span>&lt;span class="lnt">46
&lt;/span>&lt;span class="lnt">47
&lt;/span>&lt;span class="lnt">48
&lt;/span>&lt;span class="lnt">49
&lt;/span>&lt;span class="lnt">50
&lt;/span>&lt;span class="lnt">51
&lt;/span>&lt;span class="lnt">52
&lt;/span>&lt;span class="lnt">53
&lt;/span>&lt;span class="lnt">54
&lt;/span>&lt;span class="lnt">55
&lt;/span>&lt;span class="lnt">56
&lt;/span>&lt;span class="lnt">57
&lt;/span>&lt;span class="lnt">58
&lt;/span>&lt;span class="lnt">59
&lt;/span>&lt;span class="lnt">60
&lt;/span>&lt;span class="lnt">61
&lt;/span>&lt;span class="lnt">62
&lt;/span>&lt;span class="lnt">63
&lt;/span>&lt;span class="lnt">64
&lt;/span>&lt;span class="lnt">65
&lt;/span>&lt;span class="lnt">66
&lt;/span>&lt;span class="lnt">67
&lt;/span>&lt;span class="lnt">68
&lt;/span>&lt;span class="lnt">69
&lt;/span>&lt;span class="lnt">70
&lt;/span>&lt;span class="lnt">71
&lt;/span>&lt;span class="lnt">72
&lt;/span>&lt;span class="lnt">73
&lt;/span>&lt;span class="lnt">74
&lt;/span>&lt;span class="lnt">75
&lt;/span>&lt;span class="lnt">76
&lt;/span>&lt;span class="lnt">77
&lt;/span>&lt;span class="lnt">78
&lt;/span>&lt;span class="lnt">79
&lt;/span>&lt;span class="lnt">80
&lt;/span>&lt;span class="lnt">81
&lt;/span>&lt;span class="lnt">82
&lt;/span>&lt;span class="lnt">83
&lt;/span>&lt;span class="lnt">84
&lt;/span>&lt;span class="lnt">85
&lt;/span>&lt;span class="lnt">86
&lt;/span>&lt;span class="lnt">87
&lt;/span>&lt;span class="lnt">88
&lt;/span>&lt;span class="lnt">89
&lt;/span>&lt;span class="lnt">90
&lt;/span>&lt;span class="lnt">91
&lt;/span>&lt;span class="lnt">92
&lt;/span>&lt;span class="lnt">93
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-python" data-lang="python">&lt;span class="line">&lt;span class="cl">&lt;span class="kn">import&lt;/span> &lt;span class="nn">os&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kn">from&lt;/span> &lt;span class="nn">langchain_community.document_loaders&lt;/span> &lt;span class="kn">import&lt;/span> &lt;span class="n">PyPDFLoader&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kn">from&lt;/span> &lt;span class="nn">langchain_text_splitters&lt;/span> &lt;span class="kn">import&lt;/span> &lt;span class="n">RecursiveCharacterTextSplitter&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kn">from&lt;/span> &lt;span class="nn">langchain_huggingface&lt;/span> &lt;span class="kn">import&lt;/span> &lt;span class="n">HuggingFaceEmbeddings&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kn">from&lt;/span> &lt;span class="nn">langchain_community.vectorstores&lt;/span> &lt;span class="kn">import&lt;/span> &lt;span class="n">Chroma&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kn">from&lt;/span> &lt;span class="nn">langchain_community.llms&lt;/span> &lt;span class="kn">import&lt;/span> &lt;span class="n">Ollama&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kn">from&lt;/span> &lt;span class="nn">langchain_core.prompts&lt;/span> &lt;span class="kn">import&lt;/span> &lt;span class="n">PromptTemplate&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kn">from&lt;/span> &lt;span class="nn">langchain.chains&lt;/span> &lt;span class="kn">import&lt;/span> &lt;span class="n">RetrievalQA&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">def&lt;/span> &lt;span class="nf">main&lt;/span>&lt;span class="p">():&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1"># 1. दस्तावेज़ लोड करना&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nb">print&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34;दस्तावेज़ लोड हो रहा है...&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1"># आप जिस PDF को पढ़ना चाहते हैं उसका पाथ निर्दिष्ट करें&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">file_path&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="s2">&amp;#34;sample_company_policy.pdf&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">loader&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">PyPDFLoader&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">file_path&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">documents&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">loader&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">load&lt;/span>&lt;span class="p">()&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1"># 2. चंक विभाजन (Text Splitting)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1"># वाक्यों के अर्थ को नष्ट किए बिना उन्हें उचित आकार में विभाजित करें&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">text_splitter&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">RecursiveCharacterTextSplitter&lt;/span>&lt;span class="p">(&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">chunk_size&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="mi">500&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="c1"># प्रति चंक अधिकतम कैरेक्टर्स&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">chunk_overlap&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="mi">50&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="c1"># आसन्न चंक्स में ओवरलैपिंग कैरेक्टर्स (संदर्भ के टूटने को रोकने के लिए)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">separators&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="s2">&amp;#34;&lt;/span>&lt;span class="se">\n\n&lt;/span>&lt;span class="s2">&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s2">&amp;#34;&lt;/span>&lt;span class="se">\n&lt;/span>&lt;span class="s2">&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s2">&amp;#34;।&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s2">&amp;#34;、&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s2">&amp;#34; &amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s2">&amp;#34;&amp;#34;&lt;/span>&lt;span class="p">]&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">chunks&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">text_splitter&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">split_documents&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">documents&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nb">print&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="sa">f&lt;/span>&lt;span class="s2">&amp;#34;&lt;/span>&lt;span class="si">{&lt;/span>&lt;span class="nb">len&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">chunks&lt;/span>&lt;span class="p">)&lt;/span>&lt;span class="si">}&lt;/span>&lt;span class="s2"> चंक्स में विभाजित किया गया।&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1"># 3. एम्बेडिंग मॉडल का इनिशियलाइज़ेशन (Local HuggingFace Model)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1"># मजबूत बहुभाषी मॉडल का उपयोग करें&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nb">print&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34;एम्बेडिंग मॉडल लोड हो रहा है...&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">embeddings&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">HuggingFaceEmbeddings&lt;/span>&lt;span class="p">(&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">model_name&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s2">&amp;#34;intfloat/multilingual-e5-large&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">model_kwargs&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="p">{&lt;/span>&lt;span class="s1">&amp;#39;device&amp;#39;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s1">&amp;#39;cpu&amp;#39;&lt;/span>&lt;span class="p">}&lt;/span> &lt;span class="c1"># अगर GPU है तो &amp;#39;cuda&amp;#39; या &amp;#39;mps&amp;#39;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1"># 4. वेक्टर डेटाबेस का निर्माण (Chroma)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nb">print&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34;वेक्टर डेटाबेस का निर्माण हो रहा है...&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">persist_directory&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="s2">&amp;#34;./chroma_db&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">vectorstore&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">Chroma&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">from_documents&lt;/span>&lt;span class="p">(&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">documents&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="n">chunks&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">embedding&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="n">embeddings&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">persist_directory&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="n">persist_directory&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1"># रिट्रीवर (Retriever) बनाना। शीर्ष 3 प्रासंगिक दस्तावेज़ प्राप्त करने के लिए सेट किया गया&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">retriever&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">vectorstore&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">as_retriever&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">search_kwargs&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="p">{&lt;/span>&lt;span class="s2">&amp;#34;k&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="mi">3&lt;/span>&lt;span class="p">})&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1"># 5. लोकल LLM का इनिशियलाइज़ेशन (Ollama)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nb">print&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34;लोकल LLM से कनेक्ट हो रहा है...&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1"># &amp;#39;ollama pull llama3&amp;#39; आदि के साथ पहले से मॉडल प्राप्त करना सुनिश्चित करें&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">llm&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">Ollama&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">model&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s2">&amp;#34;llama3&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1"># 6. प्रॉम्प्ट टेम्पलेट की परिभाषा&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">prompt_template&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="s2">&amp;#34;&amp;#34;&amp;#34;आप एक बेहतरीन सहायक हैं जो कंपनी के नियमों और आंतरिक जानकारी से अच्छी तरह वाकिफ हैं।
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="s2">कृपया उपयोगकर्ता के प्रश्न का हिंदी में विस्तार से उत्तर देने के लिए केवल निम्नलिखित संदर्भ (पृष्ठभूमि जानकारी) का उपयोग करें।
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="s2">यदि आपको संदर्भ में उत्तर नहीं मिल रहा है, तो कृपया अनुमान न लगाएं और ईमानदारी से कहें, &amp;#34;प्रदान की गई जानकारी से मैं उत्तर नहीं दे सकता।&amp;#34;
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="s2">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="s2">【संदर्भ】
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="s2">&lt;/span>&lt;span class="si">{context}&lt;/span>&lt;span class="s2">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="s2">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="s2">【प्रश्न】
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="s2">&lt;/span>&lt;span class="si">{question}&lt;/span>&lt;span class="s2">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="s2">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="s2">【उत्तर】:
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="s2">&amp;#34;&amp;#34;&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">PROMPT&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">PromptTemplate&lt;/span>&lt;span class="p">(&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">template&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="n">prompt_template&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">input_variables&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="s2">&amp;#34;context&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s2">&amp;#34;question&amp;#34;&lt;/span>&lt;span class="p">]&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1"># 7. RAG चेन का निर्माण&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">qa_chain&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">RetrievalQA&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">from_chain_type&lt;/span>&lt;span class="p">(&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">llm&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="n">llm&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">chain_type&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s2">&amp;#34;stuff&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">retriever&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="n">retriever&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">return_source_documents&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="kc">True&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="c1"># क्या स्रोत दस्तावेज़ वापस करने हैं, यह सेट करें&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">chain_type_kwargs&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="p">{&lt;/span>&lt;span class="s2">&amp;#34;prompt&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="n">PROMPT&lt;/span>&lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1"># 8. प्रश्न का निष्पादन&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">query&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="s2">&amp;#34;रिमोट वर्क के लिए परिवहन खर्च के भत्ते की शर्तों के बारे में बताएं।&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nb">print&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="sa">f&lt;/span>&lt;span class="s2">&amp;#34;&lt;/span>&lt;span class="se">\n&lt;/span>&lt;span class="s2">प्रश्न: &lt;/span>&lt;span class="si">{&lt;/span>&lt;span class="n">query&lt;/span>&lt;span class="si">}&lt;/span>&lt;span class="se">\n&lt;/span>&lt;span class="s2">&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">result&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">qa_chain&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">invoke&lt;/span>&lt;span class="p">({&lt;/span>&lt;span class="s2">&amp;#34;query&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="n">query&lt;/span>&lt;span class="p">})&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nb">print&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34;【उत्तर】&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nb">print&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">result&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="s1">&amp;#39;result&amp;#39;&lt;/span>&lt;span class="p">])&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nb">print&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34;&lt;/span>&lt;span class="se">\n&lt;/span>&lt;span class="s2">---&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nb">print&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34;【संदर्भित स्रोत】&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">for&lt;/span> &lt;span class="n">doc&lt;/span> &lt;span class="ow">in&lt;/span> &lt;span class="n">result&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="s1">&amp;#39;source_documents&amp;#39;&lt;/span>&lt;span class="p">]:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nb">print&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="sa">f&lt;/span>&lt;span class="s2">&amp;#34;- पृष्ठ &lt;/span>&lt;span class="si">{&lt;/span>&lt;span class="n">doc&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">metadata&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">get&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;page&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s1">&amp;#39;अज्ञात&amp;#39;&lt;/span>&lt;span class="p">)&lt;/span>&lt;span class="si">}&lt;/span>&lt;span class="s2">: &lt;/span>&lt;span class="si">{&lt;/span>&lt;span class="n">doc&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">page_content&lt;/span>&lt;span class="p">[:&lt;/span>&lt;span class="mi">50&lt;/span>&lt;span class="p">]&lt;/span>&lt;span class="si">}&lt;/span>&lt;span class="s2">...&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">if&lt;/span> &lt;span class="vm">__name__&lt;/span> &lt;span class="o">==&lt;/span> &lt;span class="s2">&amp;#34;__main__&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">main&lt;/span>&lt;span class="p">()&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;h2 id="कड-क-मखय-बदओ-क-वयखय">कोड के मुख्य बिंदुओं की व्याख्या
&lt;/h2>&lt;ol>
&lt;li>&lt;strong>RecursiveCharacterTextSplitter&lt;/strong>:
यह प्राकृतिक भाषा को विभाजित करने के लिए सबसे अधिक अनुशंसित स्प्लिटर है। यह पैराग्राफ (&lt;code>\n\n&lt;/code>), लाइन्स (&lt;code>\n&lt;/code>), और पूर्ण विराम (&lt;code>。&lt;/code> या &lt;code>।&lt;/code>) के क्रम में विभाजित करने का प्रयास करता है, और अर्थ को यथासंभव संरक्षित रखते हुए निर्दिष्ट &lt;code>chunk_size&lt;/code> में फिट होने के लिए विभाजित करता है। &lt;code>chunk_overlap&lt;/code> सेट करके, यह संदर्भ की सीमाओं को टूटने और जानकारी के नुकसान को रोकता है।&lt;/li>
&lt;li>&lt;strong>HuggingFaceEmbeddings&lt;/strong>:
&lt;code>intfloat/multilingual-e5-large&lt;/code> एक बहुत शक्तिशाली ओपन-सोर्स एम्बेडिंग मॉडल है जो कई भाषाओं का समर्थन करता है। क्लाउड API (जैसे OpenAI का &lt;code>text-embedding-ada-002&lt;/code>) का उपयोग किए बिना, आप टेक्स्ट को ऑफलाइन अपनी लोकल मेमोरी में वेक्टराइज़ कर सकते हैं।&lt;/li>
&lt;li>&lt;strong>ChromaDB&lt;/strong>:
चूंकि यह इन-मेमोरी या लोकल स्टोरेज (SQLite पर आधारित) में काम करता है, इसलिए किसी जटिल डेटाबेस सर्वर को स्थापित करने की आवश्यकता नहीं है। &lt;code>persist_directory&lt;/code> को निर्दिष्ट करके, आप फिर से निष्पादित करते समय वेक्टराइजेशन प्रक्रिया को छोड़ सकते हैं और डेटाबेस को डिस्क से लोड कर सकते हैं।&lt;/li>
&lt;/ol>
&lt;hr>
&lt;h1 id="5-उननत-rag-तकनक-advanced-rag-techniques">5. उन्नत RAG तकनीकें (Advanced RAG Techniques)
&lt;/h1>&lt;p>उपरोक्त ट्यूटोरियल में बनाया गया बुनियादी RAG सिस्टम (Naive RAG) काम करेगा, लेकिन यदि उत्पादन वातावरण में उच्च उत्तर सटीकता की आवश्यकता है, तो आपको निम्नलिखित उन्नत तकनीकों को पेश करने की आवश्यकता होगी:&lt;/p>
&lt;h2 id="51-हइबरड-सरच-hybrid-search">5.1 हाइब्रिड सर्च (Hybrid Search)
&lt;/h2>&lt;p>वेक्टर सर्च &amp;ldquo;अर्थ&amp;rdquo; को पकड़ने में अच्छा है, लेकिन यह सटीक कीवर्ड खोजों जैसे &amp;ldquo;विशिष्ट उचित संज्ञा (proper nouns)&amp;rdquo;, &amp;ldquo;उत्पाद मॉडल संख्या&amp;rdquo;, या &amp;ldquo;कर्मचारी ID&amp;rdquo; के साथ संघर्ष कर सकता है।
इसलिए, वेक्टर सर्च के माध्यम से &lt;strong>सिमेंटिक सर्च&lt;/strong> और BM25 एल्गोरिदम आदि का उपयोग करके &lt;strong>कीवर्ड सर्च&lt;/strong> समानांतर में करके, और दोनों परिणामों को स्कोरिंग और एकीकृत करके (रेसिप्रोकल रैंक फ्यूजन; RRF जैसी तकनीकों का उपयोग करके), आप छूटे हुए सर्च परिणामों को काफी कम कर सकते हैं।&lt;/p>
&lt;h2 id="52-र-रकग-re-ranking">5.2 री-रैंकिंग (Re-ranking)
&lt;/h2>&lt;p>वेक्टर सर्च तेज है, लेकिन यह हमेशा संदर्भ की सटीक प्रासंगिकता का आकलन नहीं करता है। सर्च सटीकता में सुधार के लिए एक सामान्य पाइपलाइन इस प्रकार है:&lt;/p>
&lt;ol>
&lt;li>&lt;strong>प्रारंभिक सर्च (First-stage Retrieval)&lt;/strong>: वेक्टर DB से मोटे तौर पर और सतही तौर पर लगभग 20-30 संबंधित चंक्स प्राप्त किए जाते हैं।&lt;/li>
&lt;li>&lt;strong>पुनर्मूल्यांकन (Re-ranking)&lt;/strong>: एक अन्य भारी मशीन लर्निंग मॉडल जिसे Cross-Encoder कहा जाता है (उदाहरण के लिए: &lt;code>bge-reranker&lt;/code> आदि) का उपयोग करके, उपयोगकर्ता की क्वेरी और प्राप्त चंक्स की जोड़ी को इनपुट किया जाता है, और सिमेंटिक प्रासंगिकता स्कोर की पुनर्गणना की जाती है।&lt;/li>
&lt;li>&lt;strong>चयन&lt;/strong>: केवल उच्चतम स्कोर वाले शीर्ष 3-5 चंक्स को अंतिम संदर्भ के रूप में LLM के प्रॉम्प्ट में पास किया जाता है।&lt;/li>
&lt;/ol>
&lt;p>यह तकनीक अप्रासंगिक नॉइज़ जानकारी को LLM तक पहुंचने से रोकती है और उत्तर की सटीकता (Precision) में काफी सुधार करती है।&lt;/p>
&lt;div class="mermaid">graph LR
Query["क्वेरी"] --> VSearch["वेक्टर सर्च (शीर्ष 20)"]
VSearch --> Reranker["री-रैंकर मॉडल (Cross-Encoder)"]
Query --> Reranker
Reranker --> TopK["उच्च सटीकता वाले शीर्ष 3"]
TopK --> LLM["LLM जनरेशन"]&lt;/div>
&lt;h2 id="53-समटक-चकग-और-परट-दसतवज-सरच">5.3 सिमेंटिक चंकिंग और पेरेंट दस्तावेज़ सर्च
&lt;/h2>&lt;p>वाक्यों को उनकी निश्चित लंबाई के आधार पर यंत्रवत विभाजित करने के बजाय, &amp;ldquo;सिमेंटिक चंकिंग (Semantic Chunking)&amp;rdquo; नामक एक तकनीक है जो वाक्यों के अर्थ में परिवर्तन का पता लगाने और तदनुसार उन्हें विभाजित करने के लिए AI का उपयोग करती है।
इसके अलावा, &amp;ldquo;पेरेंट डॉक्यूमेंट रिट्रीवर (Parent Document Retriever)&amp;rdquo; तकनीक में, सटीक सर्च प्राप्त करने के लिए सर्च के उद्देश्य से वेक्टरकरण बहुत छोटी इकाइयों (जैसे वाक्यों) में किया जाता है, लेकिन जब इसे LLM को पास किया जाता है, तो &amp;ldquo;मूल बड़ा पैराग्राफ (पेरेंट दस्तावेज़)&amp;rdquo; जिसमें वह वाक्य शामिल होता है, LLM को पर्याप्त संदर्भ प्रदान करने के लिए पास किया जाता है।&lt;/p>
&lt;hr>
&lt;h1 id="6-लकल-rag-क-सचलत-करत-समय-चनतय-और-समधन">6. लोकल RAG को संचालित करते समय चुनौतियां और समाधान
&lt;/h1>&lt;p>जब लोकल वातावरण में RAG के निर्माण और संचालन की बात आती है, तो कुछ विशिष्ट बाधाएं होती हैं।&lt;/p>
&lt;ul>
&lt;li>&lt;strong>VRAM (वीडियो मेमोरी) की कमी&lt;/strong>:
व्यावहारिक गति (दसियों टोकन प्रति सेकंड) पर एक लोकल LLM चलाने के लिए, मॉडल को GPU के VRAM में लोड करने की आवश्यकता होती है। एक 8B क्लास मॉडल को fp16 (16-बिट फ्लोटिंग पॉइंट) में चलाने के लिए लगभग 16GB VRAM की आवश्यकता होती है, लेकिन &lt;strong>क्वांटाइजेशन (Quantization)&lt;/strong> तकनीक (GGUF या AWQ प्रारूप जैसे इसे 4-बिट या 8-बिट में संपीड़ित करने की तकनीक) का उपयोग करके, इसे 8GB VRAM (जैसे सामान्य गेमिंग PC) के साथ भी काफी तेज गति से चलाना संभव है। Llama.cpp और Ollama मानक रूप से इन क्वांटाइजेशन प्रारूपों का समर्थन करते हैं।&lt;/li>
&lt;li>&lt;strong>संदर्भ विंडो (Context Window) की सीमाएं&lt;/strong>:
यदि सर्च के माध्यम से प्राप्त संदर्भ की मात्रा बहुत अधिक है, तो यह LLM की इनपुट सीमा (टोकन सीमा) को पार कर सकती है, या मॉडल जानकारी के मध्य भाग को भूल सकता है (Lost in the middle की घटना)। निकाले गए चंक्स की संख्या को समायोजित करना और पहले बताई गई री-रैंकिंग तकनीक के माध्यम से उन्हें सावधानीपूर्वक चुनना आवश्यक है।&lt;/li>
&lt;li>&lt;strong>डेटा की ताजगी (Data Freshness) का प्रबंधन&lt;/strong>:
जब स्रोत दस्तावेज़ अपडेट किया जाता है, तो वेक्टर डेटाबेस में संबंधित दस्तावेज़ के वेक्टर को भी अपडेट या हटाया (CRUD ऑपरेशन) जाना चाहिए। चूंकि ChromaDB दस्तावेज़ ID के आधार पर अपडेट करने का समर्थन करता है, इसलिए फ़ाइल के हैश मान को प्रबंधित करना और केवल अंतर (differences) को सिंक्रनाइज़ करने के लिए एक बैच प्रक्रिया (batch process) सेट अप करना व्यावहारिक है।&lt;/li>
&lt;/ul>
&lt;hr>
&lt;h1 id="नषकरष">निष्कर्ष
&lt;/h1>&lt;p>RAG (रिट्रीवल-ऑगमेंटेड जनरेशन) एक शक्तिशाली प्रतिमान (paradigm) है जो AI को एक सामान्य-उद्देश्य सहायक से &amp;ldquo;आपके अपने विशेष विशेषज्ञ&amp;rdquo; या &amp;ldquo;कंपनी के संचालन में एक विशेषज्ञ&amp;rdquo; के रूप में विकसित करता है।&lt;/p>
&lt;p>हमने सीखा कि यहां तक ​​कि अत्यधिक गोपनीय आवश्यकताओं के लिए भी जहां क्लाउड सेवाओं का उपयोग नहीं किया जा सकता है, Ollama, LangChain, और ChromaDB जैसे ओपन-सोर्स इकोसिस्टम को मिलाकर पूरी तरह से &amp;ldquo;लोकल RAG&amp;rdquo; वातावरण बनाना अपेक्षाकृत आसान है।&lt;/p>
&lt;p>इस लेख में समझाए गए वेक्टर स्पेस की गणितीय समझ, और टेक्स्ट विभाजन (text splitting) और री-रैंकिंग (re-ranking) जैसे उन्नत दृष्टिकोणों के आधार पर, कृपया अपने स्वयं के डेटा का उपयोग करके अपना मूल AI सिस्टम विकसित करने का प्रयास करें। लोकल AI के विकास की गति चौंका देने वाली है, और जो सिस्टम आप आज बनाते हैं उसे कल आने वाले एक और भी अधिक स्मार्ट और हल्के मॉडल के साथ बदलकर तुरंत अपडेट किया जा सकता है।&lt;/p>
&lt;hr>
&lt;p>&lt;em>यह ब्लॉग AI तकनीक और RAG पर गहन लेख प्रकाशित करता रहेगा। यदि आपके कोई प्रश्न या प्रतिक्रिया (feedback) है, तो कृपया उन्हें टिप्पणी अनुभाग (comments section) में छोड़ें।&lt;/em>&lt;/p></description></item><item><title>【2026 का नवीनतम】विंडोज़ वातावरण में लोकल LLM चलाने की संपूर्ण मार्गदर्शिका</title><link>http://kenji.blog/hi/p/local-llm-windows-2026/</link><pubDate>Fri, 11 Sep 2026 10:00:00 +0900</pubDate><guid>http://kenji.blog/hi/p/local-llm-windows-2026/</guid><description>&lt;img src="http://kenji.blog/p/local-llm-windows-2026/img/eyecatch.jpg" alt="Featured image of post 【2026 का नवीनतम】विंडोज़ वातावरण में लोकल LLM चलाने की संपूर्ण मार्गदर्शिका" />&lt;h1 id="1-परसतवन-अब-वडज-पर-लकल-llm-कय">1. प्रस्तावना: अब विंडोज़ पर लोकल LLM क्यों?
&lt;/h1>&lt;p>2026 तक, जनरेटिव AI और लार्ज लैंग्वेज मॉडल (LLM) का विकास एक बड़ा प्रतिमान बदलाव (paradigm shift) दिखा रहा है, जो क्लाउड पर विशाल API सेवाओं से हटकर व्यक्तिगत पीसी और ऑन-प्रिमाइसेस वातावरण में चलने वाले &amp;lsquo;लोकल LLM&amp;rsquo; की ओर बढ़ रहा है। OpenAI का GPT-5 और Anthropic का Claude 3.5 जैसे क्लाउड AI बहुत शक्तिशाली हैं, लेकिन कंपनियाँ और व्यक्ति अपना सारा डेटा क्लाउड पर नहीं भेज सकते हैं। गोपनीयता (Privacy), सुरक्षा, विलंबता (latency), और दीर्घकालिक व टिकाऊ लागत के दृष्टिकोण से लोकल LLM की मांग पहले से कहीं अधिक तेजी से बढ़ रही है।&lt;/p>
&lt;p>विशेष रूप से विंडोज़ वातावरण में लोकल LLM के इकोसिस्टम का विकास उल्लेखनीय रहा है। कुछ साल पहले तक &amp;ldquo;AI विकास और निष्पादन (execution) का मतलब Linux है&amp;rdquo; यह एक सामान्य बात थी, लेकिन 2026 में विंडोज़ एक बहुत ही शक्तिशाली और सुलभ AI प्लेटफॉर्म में बदल गया है।&lt;/p>
&lt;p>इस लेख में, 2026 के नवीनतम तकनीकी रुझानों को ध्यान में रखते हुए, विंडोज़ वातावरण में लोकल LLM के निर्माण, संचालन और अनुकूलन (optimization) के लिए एक संपूर्ण मार्गदर्शिका प्रदान की गई है। शुरुआती लोगों के लिए Ollama का उपयोग करके सरल सेटअप से लेकर, उन्नत उपयोगकर्ताओं के लिए llama.cpp का उपयोग करके अत्यधिक अनुकूलन (extreme optimization), VRAM गणना के गणितीय दृष्टिकोण, आर्किटेक्चर की गहरी समझ, और लोकल फाइन-ट्यूनिंग तक, हम इसे विस्तार से समझाएंगे।&lt;/p>
&lt;h2 id="11-2026-म-लकल-llm-क-तकनक-रझन">1.1 2026 में लोकल LLM के तकनीकी रुझान
&lt;/h2>&lt;p>वर्तमान लोकल LLM इकोसिस्टम को आकार देने वाले प्रमुख रुझान इस प्रकार हैं:&lt;/p>
&lt;ol>
&lt;li>&lt;strong>GGUF फॉर्मेट का पूर्ण उपयोग&lt;/strong>: GGUF (GPT-Generated Unified Format), जो मेटाडेटा और टेंसर को एक ही फ़ाइल में एकीकृत करता है, अब पूरी तरह से वास्तविक मानक (de facto standard) बन गया है। इसके कारण, केवल Hugging Face से एक फ़ाइल डाउनलोड करके इसे किसी भी वातावरण में चलाना संभव हो गया है।&lt;/li>
&lt;li>&lt;strong>MoE (Mixture of Experts) आर्किटेक्चर का लोकतंत्रीकरण (Democratization)&lt;/strong>: छोटे लेकिन उच्च-प्रदर्शन वाले कई MoE मॉडल जारी किए गए हैं। अनुमान (inference) के दौरान केवल कुछ विशेषज्ञों (experts) को सक्रिय करके, यह उपभोक्ता पीसी (consumer PC) के कम्प्यूटेशनल भार को कम रखते हुए विशाल मॉडलों के बराबर प्रदर्शन दे रहा है।&lt;/li>
&lt;li>&lt;strong>इन्फरेंस इंजन (Inference Engine) का उच्च अमूर्तीकरण (Abstraction) और अनुकूलन&lt;/strong>: Ollama, LM Studio, AnythingLLM जैसे टूल बहुत परिष्कृत हो गए हैं, जिससे उपयोगकर्ताओं को CUDA ड्राइवर इंस्टॉल करने जैसी जटिल निर्भरताओं (dependencies) की चिंता करने की आवश्यकता नहीं है। इसके अलावा, FlashAttention 3 के विंडोज़ नेटिव समर्थन (native support) से इन्फरेंस गति में नाटकीय रूप से सुधार हुआ है।&lt;/li>
&lt;li>&lt;strong>NPU का उपयोग और Windows Copilot+ PC का उदय&lt;/strong>: NPU (Neural Processing Unit) का उपयोग करके छोटे LLM (SLM: Small Language Models) को कम बिजली की खपत के साथ चलाने की तकनीक व्यावहारिक चरण में प्रवेश कर चुकी है, यहाँ तक कि उन लैपटॉप में भी जिनमें GPU नहीं है।&lt;/li>
&lt;/ol>
&lt;hr>
&lt;h1 id="2-हरडवयर-आवशयकतए-और-os-क-तयर">2. हार्डवेयर आवश्यकताएँ और OS की तैयारी
&lt;/h1>&lt;p>लोकल LLM को व्यावहारिक गति (15-30 टोकन प्रति सेकंड या अधिक) पर चलाने के लिए हार्डवेयर का चयन सबसे महत्वपूर्ण है।&lt;/p>
&lt;h2 id="21-अनशसत-हरडवयर-कनफगरशन">2.1 अनुशंसित हार्डवेयर कॉन्फ़िगरेशन
&lt;/h2>&lt;p>AI PC के विकास के साथ, आवश्यक विनिर्देश (specifications) भी बदल रहे हैं।&lt;/p>
&lt;ul>
&lt;li>&lt;strong>OS&lt;/strong>: Windows 11 Pro (24H2 या बाद का संस्करण)। WSL2 की पूर्ण कार्यक्षमता और उन्नत मेमोरी प्रबंधन, साथ ही नवीनतम DirectML API का उपयोग करने के लिए यह आवश्यक है।&lt;/li>
&lt;li>&lt;strong>CPU&lt;/strong>: Intel Core Ultra 200 सीरीज़ या उससे ऊपर, या AMD Ryzen 9000 सीरीज़ या उससे ऊपर। यदि CPU इन्फरेंस का भी उपयोग किया जा रहा है, तो ब्रॉडबैंड मेमोरी कम्युनिकेशन अनिवार्य है।&lt;/li>
&lt;li>&lt;strong>RAM&lt;/strong>: न्यूनतम 32GB, 64GB या उससे अधिक अनुशंसित। मुख्य मेमोरी की बैंडविड्थ (MB/s) CPU इन्फरेंस या ऑफलोडिंग के दौरान एक निर्णायक अड़चन (bottleneck) बन जाती है। DDR5-6000 या उच्चतर गति वाली मेमोरी आदर्श है।&lt;/li>
&lt;li>&lt;strong>GPU&lt;/strong>: NVIDIA RTX 4000/5000 सीरीज़। लोकल LLM में सबसे महत्वपूर्ण कम्प्यूटेशनल प्रदर्शन नहीं बल्कि &amp;ldquo;VRAM क्षमता&amp;rdquo; है।
&lt;ul>
&lt;li>&lt;strong>एंट्री लेवल&lt;/strong>: RTX 4060 Ti (16GB संस्करण) - सबसे अच्छा कॉस्ट-परफॉरमेंस। 8B से 14B क्लास के मॉडलों के लिए आदर्श।&lt;/li>
&lt;li>&lt;strong>मिड-रेंज&lt;/strong>: RTX 4070 Ti SUPER (16GB) / RTX 4080 SUPER (16GB)&lt;/li>
&lt;li>&lt;strong>हाई-एंड&lt;/strong>: RTX 4090 (24GB) / RTX 5090 (32GB) - 30B से 70B क्लास के क्वांटाइज्ड मॉडलों (quantized models) को चलाने के लिए आवश्यक।&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>&lt;strong>स्टोरेज&lt;/strong>: PCIe Gen4 या Gen5 NVMe SSD। यह दसियों GB के मॉडलों के लोड होने के समय को काफी कम कर देता है।&lt;/li>
&lt;/ul>
&lt;h2 id="22-wsl2-windows-subsystem-for-linux-2-सटअप">2.2 WSL2 (Windows Subsystem for Linux 2) सेटअप
&lt;/h2>&lt;p>कई GUI टूल मूल रूप से (natively) विंडोज़ पर काम करते हैं, लेकिन Python का उपयोग करके विकास करने, नवीनतम टूल को संकलित (compile) करने और बाद में बताए गए LoRA फाइन-ट्यूनिंग के लिए WSL2 बहुत उपयोगी है। नवीनतम Windows 11 वातावरण में, केवल होस्ट साइड पर NVIDIA ड्राइवर स्थापित करके WSL2 से पारदर्शी (transparently) रूप से GPU (CUDA) का उपयोग किया जा सकता है।&lt;/p>
&lt;p>एडमिनिस्ट्रेटर प्रिविलेज (Administrator privileges) के साथ PowerShell खोलें और निम्नलिखित चलाएँ:&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;span class="lnt">2
&lt;/span>&lt;span class="lnt">3
&lt;/span>&lt;span class="lnt">4
&lt;/span>&lt;span class="lnt">5
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-powershell" data-lang="powershell">&lt;span class="line">&lt;span class="cl">&lt;span class="c"># WSL2 और नवीनतम Ubuntu इंस्टाल करें&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">wsl&lt;/span> &lt;span class="p">-&lt;/span>&lt;span class="n">-install&lt;/span> &lt;span class="n">-d&lt;/span> &lt;span class="n">Ubuntu&lt;/span>&lt;span class="p">-&lt;/span>&lt;span class="mf">24.04&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c"># कर्नेल अपडेट करें&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">wsl&lt;/span> &lt;span class="p">-&lt;/span>&lt;span class="n">-update&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>इंस्टॉलेशन के बाद, WSL2 टर्मिनल में &lt;code>nvidia-smi&lt;/code> चलाएँ। यदि GPU सही तरीके से पहचाना जाता है, तो यह सफल है।&lt;/p>
&lt;hr>
&lt;h1 id="3-लकल-llm-आरकटकचर-और-इनफरस-मकनजम">3. लोकल LLM आर्किटेक्चर और इन्फरेंस मैकेनिज्म
&lt;/h1>&lt;p>यह समझना कि लोकल वातावरण में मॉडल टेक्स्ट कैसे उत्पन्न करता है और इसकी आंतरिक संरचना क्या है, समस्या निवारण (troubleshooting) और अनुकूलन (optimization) के लिए बहुत उपयोगी है।&lt;/p>
&lt;p>नीचे दिया गया Mermaid आरेख एक सामान्य लोकल LLM के इन्फरेंस पाइपलाइन को दर्शाता है।&lt;/p>
&lt;div class="mermaid">graph TD
User["यूज़र इनपुट (प्रॉम्प्ट)"] --> Tokenizer["टोकेनाइज़र (Tokenizer)"]
Tokenizer --> Embedding["एम्बेडिंग लेयर (Embedding)"]
subgraph "Transformer Block (x Layers)"
Embedding --> Attn["सेल्फ-अटेंशन (Self-Attention)"]
Attn --> KVCache["KV कैश (Key/Value स्टोरेज)"]
Attn --> FFN["फीड-फॉरवर्ड नेटवर्क (FFN)"]
end
FFN --> Logits["लॉजिट कैलकुलेशन (Logits)"]
Logits --> Sampler["सैंपलर (Temperature, Top-K, Top-P)"]
Sampler --> OutputToken["आउटपुट टोकन"]
OutputToken --> |"ऑटोरिग्रेसिव जनरेशन"| Tokenizer
OutputToken --> Decoder["डिटोकेनाइज़र (Detokenizer)"]
Decoder --> FinalOutput["अंतिम आउटपुट टेक्स्ट"]&lt;/div>
&lt;h2 id="31-2-चरण-phases-prefill-और-decode">3.1 2 चरण (Phases): Prefill और Decode
&lt;/h2>&lt;p>LLM टेक्स्ट जनरेशन को अलग-अलग कम्प्यूटेशनल विशेषताओं वाले दो चरणों में विभाजित किया गया है।&lt;/p>
&lt;ol>
&lt;li>&lt;strong>Prefill (प्रॉम्प्ट प्रोसेसिंग) चरण&lt;/strong>: यह वह चरण है जहाँ पूरे इनपुट प्रॉम्प्ट को एक साथ प्रोसेस किया जाता है और समझा जाता है। चूंकि समानांतर गणना (parallel computation) संभव है, इसलिए GPU की कम्प्यूटेशनल क्षमता (FLOPS) सीधे गति से संबंधित है। यदि प्रॉम्प्ट लंबा है, तो इस चरण में कुछ सेकंड लग सकते हैं।&lt;/li>
&lt;li>&lt;strong>Decode (टोकन जनरेशन) चरण&lt;/strong>: यह वह चरण है जो एक-एक करके टोकन की भविष्यवाणी करता है और इसे अगले इनपुट (autoregressive) में भेजता है। इस चरण में समानांतर गणना सीमित है, इसलिए GPU का VRAM बैंडविड्थ (Memory Bandwidth) एक निर्णायक अड़चन (bottleneck) बन जाता है।&lt;/li>
&lt;/ol>
&lt;hr>
&lt;h1 id="4-vram-खपत-क-गणन-और-मडल-सइज-क-गणतय-समझ">4. VRAM खपत की गणना और मॉडल साइज़ की गणितीय समझ
&lt;/h1>&lt;p>&amp;ldquo;मेरे पीसी पर कौन सा मॉडल चलेगा?&amp;rdquo; इसका सही अंदाजा लगाने के लिए, आपको VRAM गणना सूत्र को समझने की आवश्यकता है। जब VRAM की कमी के कारण सिस्टम मेमोरी (RAM) पर फॉलबैक होता है, तो इन्फरेंस की गति 10 से 100 गुना धीमी हो जाती है।&lt;/p>
&lt;h2 id="41-परमटर-आकर-क-आधर-पर-बस-vram">4.1 पैरामीटर आकार के आधार पर बेस VRAM
&lt;/h2>&lt;p>यह मॉडल वेट (weights) को VRAM में लोड करने के लिए आवश्यक मेमोरी की मात्रा है।
इसकी गणना मॉडल आकार $P$ (पैरामीटर्स की संख्या, इकाई: 1 बिलियन = 1B) और प्रति पैरामीटर बाइट्स की संख्या $B$ का उपयोग करके की जाती है।&lt;/p>
$$
V_{base} = P \times B \quad \text{(GB)}
$$
&lt;p>उदाहरण के लिए, यदि 8B (8 बिलियन) पैरामीटर वाले मॉडल को FP16 (हाफ-प्रिसिजन फ्लोटिंग-पॉइंट, 16 बिट्स = 2 बाइट्स) में लोड किया जाता है:&lt;/p>
$$
V_{base} = 8 \times 2 = 16 \text{ GB}
$$
&lt;p>यानी 16GB VRAM वाले GPU में भी केवल मॉडल को लोड करने से ही वह लगभग अपनी सीमा तक पहुँच जाएगा।&lt;/p>
&lt;h2 id="42-कवटइजशन-quantization-क-जद">4.2 क्वांटाइजेशन (Quantization) का जादू
&lt;/h2>&lt;p>यहीं पर &amp;ldquo;क्वांटाइजेशन&amp;rdquo; आता है। पैरामीटर्स की सटीकता (precision) को कम करके, मॉडल का आकार नाटकीय रूप से कम हो जाता है। सबसे आम 4-बिट क्वांटाइजेशन (उदा: Q4_K_M) के मामले में, यह प्रति पैरामीटर औसतन लगभग 0.55 बाइट्स होता है।&lt;/p>
$$
V_{base\_4bit} = 8 \times 0.55 = 4.4 \text{ GB}
$$
&lt;p>इस प्रकार, 16GB VRAM के साथ, आप 8B मॉडल को बहुत आसानी से चला सकते हैं।&lt;/p>
&lt;h2 id="43-kv-कश-क-गणन-gqa-समरथत-ससकरण">4.3 KV कैश की गणना (GQA समर्थित संस्करण)
&lt;/h2>&lt;p>इन्फरेंस के दौरान, पिछले संदर्भ (context) को बनाए रखने के लिए &amp;ldquo;KV कैश&amp;rdquo; VRAM की खपत करता है। Llama 3 जैसे नवीनतम मॉडलों में मेमोरी बचाने के लिए GQA (Grouped Query Attention) का उपयोग किया जाता है।&lt;/p>
&lt;p>KV कैश की खपत $V_{kv}$ (गीगाबाइट में) निम्नलिखित सूत्र द्वारा व्यक्त की जा सकती है:&lt;/p>
$$
V_{kv} = 2 \times b \times s \times l \times \left( \frac{h_{kv}}{h_q} \right) \times h_q \times d \times B_{kv} \div 10^9
$$
&lt;p>इसे सरल करते हुए, हम की (key) और वैल्यू (value) के हेड्स की संख्या $h_{kv}$ का उपयोग करके आसानी से गणना कर सकते हैं:&lt;/p>
$$
V_{kv} = 2 \times b \times s \times l \times h_{kv} \times d \times B_{kv} \div 10^9
$$
&lt;p>जहाँ:&lt;/p>
&lt;ul>
&lt;li>$b$: बैच साइज़ (व्यक्तिगत लोकल उपयोग के लिए आमतौर पर 1)&lt;/li>
&lt;li>$s$: सीक्वेंस लंबाई (संदर्भ लंबाई, उदा: 8192)&lt;/li>
&lt;li>$l$: लेयर्स की संख्या (उदा: 32)&lt;/li>
&lt;li>$h_{kv}$: KV हेड्स की संख्या (उदा: 8)&lt;/li>
&lt;li>$d$: प्रति हेड डायमेंशन (उदा: 128)&lt;/li>
&lt;li>$B_{kv}$: KV कैश के बाइट्स (FP16 के लिए 2)&lt;/li>
&lt;/ul>
&lt;p>गणना का उदाहरण (Llama 3 8B, कॉन्टेक्स्ट 8192, FP16 कैश):
$V_{kv} = 2 \times 1 \times 8192 \times 32 \times 8 \times 128 \times 2 \div 10^9 \approx 1.07 \text{ GB}$&lt;/p>
&lt;p>ध्यान दें कि संदर्भ की लंबाई $s$ जितनी लंबी होगी, आवश्यक VRAM उतना ही अधिक रैखिक (linearly) रूप से बढ़ेगा।&lt;/p>
&lt;hr>
&lt;h1 id="5-अभयस-1-ollama-क-उपयग-करक-सबस-तज-और-सबस-छट-सटअप">5. अभ्यास 1: Ollama का उपयोग करके सबसे तेज़ और सबसे छोटा सेटअप
&lt;/h1>&lt;p>अब जब हम थ्योरी समझ चुके हैं, तो आइए वास्तव में विंडोज़ वातावरण में LLM चलाएं।
2026 तक, &amp;ldquo;Ollama&amp;rdquo; सबसे यूज़र-फ्रेंडली टूल है। यह Docker की तरह ही एक बहुत ही सहज (intuitive) CLI प्रदान करता है।&lt;/p>
&lt;h2 id="51-इसटलशन-और-रन-installation-and-execution">5.1 इंस्टालेशन और रन (Installation and Execution)
&lt;/h2>&lt;ol>
&lt;li>&lt;a class="link" href="https://ollama.com/" target="_blank" rel="noopener"
>Ollama आधिकारिक वेबसाइट&lt;/a> से विंडोज़ इंस्टॉलर डाउनलोड करें और इसे चलाएं।&lt;/li>
&lt;li>PowerShell खोलें और निम्नलिखित कमांड दर्ज करें। यहाँ, हम जापानी समर्थित &lt;code>llama3:8b&lt;/code> का उपयोग करेंगे।&lt;/li>
&lt;/ol>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-powershell" data-lang="powershell">&lt;span class="line">&lt;span class="cl">&lt;span class="n">ollama&lt;/span> &lt;span class="n">run&lt;/span> &lt;span class="n">llama3&lt;/span>&lt;span class="err">:&lt;/span>&lt;span class="n">8b&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>पहली बार चलाने पर, मॉडल डाउनलोड होगा। इसके पूरा होने के बाद, आप सीधे टर्मिनल में चैट कर सकते हैं।&lt;/p>
&lt;h2 id="52-modelfile-क-उपयग-करक-कसटम-ai-बनन">5.2 Modelfile का उपयोग करके कस्टम AI बनाना
&lt;/h2>&lt;p>आप आसानी से एक विशिष्ट व्यक्तित्व (persona) वाला AI बना सकते हैं। किसी भी स्थान पर एक &lt;code>Modelfile&lt;/code> बनाएं।&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;span class="lnt">2
&lt;/span>&lt;span class="lnt">3
&lt;/span>&lt;span class="lnt">4
&lt;/span>&lt;span class="lnt">5
&lt;/span>&lt;span class="lnt">6
&lt;/span>&lt;span class="lnt">7
&lt;/span>&lt;span class="lnt">8
&lt;/span>&lt;span class="lnt">9
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">FROM llama3:8b
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">SYSTEM &amp;#34;&amp;#34;&amp;#34;
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">आप एक अत्यंत प्रतिभाशाली सीनियर सॉफ्टवेयर इंजीनियर हैं।
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">उपयोगकर्ता के प्रश्नों का उत्तर हमेशा कोड उदाहरणों के साथ तार्किक और संक्षिप्त रूप में दें।
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&amp;#34;&amp;#34;&amp;#34;
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">PARAMETER temperature 0.3
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">PARAMETER num_ctx 8192
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>अपने स्वयं के मॉडल को बिल्ड (build) करने और चलाने के लिए निम्नलिखित कमांड चलाएँ:&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;span class="lnt">2
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-powershell" data-lang="powershell">&lt;span class="line">&lt;span class="cl">&lt;span class="n">ollama&lt;/span> &lt;span class="n">create&lt;/span> &lt;span class="n">SeniorDev&lt;/span> &lt;span class="o">-f&lt;/span> &lt;span class="p">./&lt;/span>&lt;span class="n">Modelfile&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">ollama&lt;/span> &lt;span class="n">run&lt;/span> &lt;span class="n">SeniorDev&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;h2 id="53-बहर-ऐपस-ai-सपदक-स-उपयग">5.3 बाहरी ऐप्स (AI संपादक) से उपयोग
&lt;/h2>&lt;p>Ollama &lt;code>http://localhost:11434&lt;/code> पर OpenAI संगत API एंडपॉइंट को एक्सपोज़ करता है।
Cursor या Continue.dev जैसे VS Code एक्सटेंशन के बैकएंड सेटिंग्स में उपरोक्त URL निर्दिष्ट करके और मॉडल के नाम के रूप में &lt;code>SeniorDev&lt;/code> आदि निर्दिष्ट करके, आपको मुफ्त में एक शक्तिशाली लोकल कोडिंग असिस्टेंट मिल जाता है।&lt;/p>
&lt;hr>
&lt;h1 id="6-अभयस-2-llamacpp-क-सथ-अतयधक-परदरशन-टयनग-extreme-performance-tuning">6. अभ्यास 2: llama.cpp के साथ अत्यधिक प्रदर्शन ट्यूनिंग (Extreme Performance Tuning)
&lt;/h1>&lt;p>यदि आप विस्तृत मेमोरी प्रबंधन चाहते हैं या नवीनतम फॉर्मेट्स (जैसे EXL2 और IQ क्वांटाइजेशन) को जल्दी आज़माना चाहते हैं, तो कोर इंजन &lt;code>llama.cpp&lt;/code> का सीधे उपयोग करें।&lt;/p>
&lt;h2 id="61-llamacpp-क-लए-बलड-परकरय">6.1 llama.cpp के लिए बिल्ड प्रक्रिया
&lt;/h2>&lt;p>विंडोज़ वातावरण में, CUDA Toolkit और CMake का उपयोग करके स्रोत (source) से बिल्ड करना सबसे अच्छा तरीका है।&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;span class="lnt">2
&lt;/span>&lt;span class="lnt">3
&lt;/span>&lt;span class="lnt">4
&lt;/span>&lt;span class="lnt">5
&lt;/span>&lt;span class="lnt">6
&lt;/span>&lt;span class="lnt">7
&lt;/span>&lt;span class="lnt">8
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-powershell" data-lang="powershell">&lt;span class="line">&lt;span class="cl">&lt;span class="n">git&lt;/span> &lt;span class="n">clone&lt;/span> &lt;span class="n">https&lt;/span>&lt;span class="err">:&lt;/span>&lt;span class="p">//&lt;/span>&lt;span class="n">github&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">com&lt;/span>&lt;span class="p">/&lt;/span>&lt;span class="n">ggerganov&lt;/span>&lt;span class="p">/&lt;/span>&lt;span class="n">llama&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nb">cpp
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">cd &lt;/span>&lt;span class="n">llama&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nb">cpp
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">&lt;/span>&lt;span class="n">mkdir&lt;/span> &lt;span class="n">build&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">cd &lt;/span>&lt;span class="n">build&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c"># CUDA सपोर्ट के लिए कॉन्फ़िगर और कंपाइल करें&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">cmake&lt;/span> &lt;span class="p">..&lt;/span> &lt;span class="n">-DLLAMA_CUBLAS&lt;/span>&lt;span class="p">=&lt;/span>&lt;span class="n">ON&lt;/span> &lt;span class="n">-DBUILD_SHARED_LIBS&lt;/span>&lt;span class="p">=&lt;/span>&lt;span class="n">OFF&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">cmake&lt;/span> &lt;span class="p">-&lt;/span>&lt;span class="n">-build&lt;/span> &lt;span class="p">.&lt;/span> &lt;span class="p">-&lt;/span>&lt;span class="n">-config&lt;/span> &lt;span class="n">Release&lt;/span> &lt;span class="n">-j&lt;/span> &lt;span class="mf">16&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;h2 id="62-सरवर-मड-म-एडवस-सटरटअप">6.2 सर्वर मोड में एडवांस स्टार्टअप
&lt;/h2>&lt;p>मॉडल को होस्ट करने के लिए बिल्ड किए गए &lt;code>llama-server.exe&lt;/code> का उपयोग करें।&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;span class="lnt">2
&lt;/span>&lt;span class="lnt">3
&lt;/span>&lt;span class="lnt">4
&lt;/span>&lt;span class="lnt">5
&lt;/span>&lt;span class="lnt">6
&lt;/span>&lt;span class="lnt">7
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-powershell" data-lang="powershell">&lt;span class="line">&lt;span class="cl">&lt;span class="p">.\&lt;/span>&lt;span class="n">bin&lt;/span>&lt;span class="p">\&lt;/span>&lt;span class="n">Release&lt;/span>&lt;span class="p">\&lt;/span>&lt;span class="nb">llama-server&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="py">exe&lt;/span> &lt;span class="p">`&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">-&lt;/span>&lt;span class="n">-model&lt;/span> &lt;span class="s2">&amp;#34;C:\models\Llama-3-8B-Instruct.Q4_K_M.gguf&amp;#34;&lt;/span> &lt;span class="p">`&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">-&lt;/span>&lt;span class="n">-ctx-size&lt;/span> &lt;span class="mf">8192&lt;/span> &lt;span class="p">`&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">-&lt;/span>&lt;span class="n">-n-gpu-layers&lt;/span> &lt;span class="mf">99&lt;/span> &lt;span class="p">`&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">-&lt;/span>&lt;span class="n">-threads&lt;/span> &lt;span class="mf">8&lt;/span> &lt;span class="p">`&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">-&lt;/span>&lt;span class="n">-flash-attn&lt;/span> &lt;span class="p">`&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">-&lt;/span>&lt;span class="n">-port&lt;/span> &lt;span class="mf">8080&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;ul>
&lt;li>&lt;code>--n-gpu-layers 99&lt;/code>: जहाँ तक संभव हो सभी लेयर्स को GPU VRAM में ऑफलोड करता है।&lt;/li>
&lt;li>&lt;code>--flash-attn&lt;/code>: FlashAttention 3 को सक्षम करता है, इन्फरेंस गति में सुधार करता है और KV कैश की VRAM खपत को कम करता है।&lt;/li>
&lt;/ul>
&lt;hr>
&lt;h1 id="7-gui-फरटएड-lm-studio-और-लकल-rag-क-नरमण">7. GUI फ्रंटएंड: LM Studio और लोकल RAG का निर्माण
&lt;/h1>&lt;p>यदि आप कमांड लाइन का उपयोग नहीं करना चाहते हैं या RAG (Retrieval-Augmented Generation) को सहजता (intuitively) से करना चाहते हैं, तो GUI का उपयोग करें।&lt;/p>
&lt;h2 id="71-lm-studio">7.1 LM Studio
&lt;/h2>&lt;p>LM Studio एक बेहतरीन एप्लिकेशन है जो मॉडल सर्च, डाउनलोड, सिस्टम आवश्यकता पूर्व-जाँच और चैट UI को एक जगह मिलाता है। ऐप में &amp;ldquo;Local Server&amp;rdquo; बटन दबाने से ही OpenAI संगत API शुरू हो जाता है।&lt;/p>
&lt;h2 id="72-anythingllm-क-उपयग-करक-rag-आरकटकचर">7.2 AnythingLLM का उपयोग करके RAG आर्किटेक्चर
&lt;/h2>&lt;p>यहाँ RAG वातावरण का एक आर्किटेक्चर आरेख है जो आपके आंतरिक दस्तावेजों या व्यक्तिगत नोट्स को पढ़ सकता है:&lt;/p>
&lt;div class="mermaid">graph LR
Document["डॉक्यूमेंट (PDF, MD)"] --> Chunking["चंकिंग (Chunking)"]
Chunking --> EmbedModel["एम्बेडिंग मॉडल (Embedding Model)"]
EmbedModel --> VectorDB["वेक्टर डेटाबेस (Vector Database)"]
UserQuery["यूज़र की क्वेरी (User Query)"] --> EmbedQuery["क्वेरी एम्बेडिंग (Query Embedding)"]
EmbedQuery --> VectorDB
VectorDB --> |"समानता खोज (Similarity Search)"| RetrievedDocs["संबंधित डॉक्यूमेंट्स निकालना"]
UserQuery --> PromptBuilder["प्रॉम्प्ट निर्माण (Prompt Builder)"]
RetrievedDocs --> PromptBuilder
PromptBuilder --> LocalLLM["लोकल LLM"]
LocalLLM --> Answer["अंतिम उत्तर (Final Answer)"]&lt;/div>
&lt;p>AnythingLLM डेस्कटॉप संस्करण (विंडोज़) का उपयोग करके, बस सेटिंग स्क्रीन से Ollama (LLM और Embedding) निर्दिष्ट करें, और इसे लोकल VectorDB (LanceDB) का उपयोग करने के लिए सेट करें। केवल कुछ मिनटों में यह आर्किटेक्चर तैयार हो जाता है। यह एक ऐसा प्राइवेट AI बनाता है जो बाहरी रूप से कोई डेटा नहीं भेजता है।&lt;/p>
&lt;hr>
&lt;h1 id="8-windows-wsl2-पर-फइन-टयनग-lora">8. Windows WSL2 पर फाइन-ट्यूनिंग (LoRA)
&lt;/h1>&lt;p>यदि आप मॉडल को न केवल लोकल रूप से चलाना चाहते हैं बल्कि अपने स्वयं के डेटा के साथ इसे और स्मार्ट बनाना चाहते हैं, तो आप LoRA (Low-Rank Adaptation) का उपयोग करके फाइन-ट्यूनिंग कर सकते हैं। 2026 तक, &amp;ldquo;Unsloth&amp;rdquo; नामक एक लाइब्रेरी का उपयोग करके, विंडोज़ के WSL2 वातावरण में, 16GB VRAM वाले 8B मॉडल की ट्रेनिंग कुछ ही घंटों में पूरी की जा सकती है।&lt;/p>
&lt;p>वातावरण सेट करने के लिए WSL2 Ubuntu में निम्नलिखित चलाएँ:&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;span class="lnt">2
&lt;/span>&lt;span class="lnt">3
&lt;/span>&lt;span class="lnt">4
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">conda create --name unsloth_env &lt;span class="nv">python&lt;/span>&lt;span class="o">=&lt;/span>3.11
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">conda activate unsloth_env
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">pip install &lt;span class="s2">&amp;#34;unsloth[colab-new] @ git+https://github.com/unslothai/unsloth.git&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">pip install --no-deps trl peft accelerate bitsandbytes
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>Unsloth ने CUDA कर्नेल को चरम सीमा तक अनुकूलित (optimize) किया है, मानक Hugging Face लाइब्रेरी की तुलना में ट्रेनिंग गति को दोगुना कर दिया है और VRAM की खपत को आधा कर दिया है। बस Jupyter Notebook शुरू करें और डेटासेट (JSONL प्रारूप) लोड करें, और कुछ ही एपोक (epochs) की ट्रेनिंग RTX 4060 Ti जैसे 12GB से 16GB VRAM वाले GPU पर संभव है।&lt;/p>
&lt;hr>
&lt;h1 id="9-परफरमस-टरबलशटग-performance-troubleshooting">9. परफॉरमेंस ट्रबलशूटिंग (Performance Troubleshooting)
&lt;/h1>&lt;p>यहाँ कुछ सामान्य समस्याएं और उनके समाधान दिए गए हैं:&lt;/p>
&lt;h3 id="1-इनफरस-क-गत-बहत-धम-ह-1-स-2-टकनसकड">1. इन्फरेंस की गति बहुत धीमी है (1 से 2 टोकन/सेकंड)
&lt;/h3>&lt;p>&lt;strong>कारण&lt;/strong>: मॉडल VRAM में फिट नहीं हो रहा है और सिस्टम मेमोरी (RAM) पर ऑफलोड हो रहा है।
&lt;strong>समाधान&lt;/strong>: टास्क मैनेजर में &amp;ldquo;Dedicated GPU memory&amp;rdquo; चेक करें। यदि यह सीमा तक पहुँच गया है, तो कॉन्टेक्स्ट साइज़ (&lt;code>-c&lt;/code>) कम करें या कम बिट वाले क्वांटाइज्ड मॉडल (जैसे Q4_K_M) का उपयोग करें।&lt;/p>
&lt;h3 id="2-cuda-out-of-memory-एरर">2. &amp;ldquo;CUDA out of memory&amp;rdquo; एरर
&lt;/h3>&lt;p>&lt;strong>कारण&lt;/strong>: VRAM पूरी तरह से खत्म हो गया है। ऐसा अक्सर तब होता है जब चैट लंबी हो जाती है और KV कैश बहुत बड़ा हो जाता है।
&lt;strong>समाधान&lt;/strong>: जानबूझकर मान को कम करें; Ollama के मामले में &lt;code>num_ctx&lt;/code>, या llama.cpp के मामले में &lt;code>-c&lt;/code> का मान कम करें।&lt;/p>
&lt;h3 id="3-टकसट-जनरशन-वशषकर-जपन-य-हद-अजब-ह">3. टेक्स्ट जनरेशन (विशेषकर जापानी या हिंदी) अजीब है
&lt;/h3>&lt;p>&lt;strong>कारण&lt;/strong>: प्रॉम्प्ट टेम्पलेट का बेमेल होना, या मॉडल उस भाषा का समर्थन नहीं करता है।
&lt;strong>समाधान&lt;/strong>: ऐसे मॉडल का उपयोग करें जिसके नाम में &lt;code>Instruct&lt;/code> शामिल हो, और सुनिश्चित करें कि टूल में सही टेम्पलेट (जैसे ChatML या Llama3 फॉर्मेट) चुना गया है जो मॉडल के निर्माता द्वारा निर्दिष्ट किया गया था।&lt;/p>
&lt;hr>
&lt;h1 id="10-नषकरष-और-भवषय-क-सभवनए">10. निष्कर्ष और भविष्य की संभावनाएं
&lt;/h1>&lt;p>2026 में, विंडोज़ वातावरण में लोकल LLM का निर्माण अब केवल कुछ इंजीनियरों का विशेषाधिकार नहीं रह गया है। GGUF फॉर्मेट के वास्तविक मानक (de facto standard) बनने, Ollama और LM Studio जैसे परिष्कृत इकोसिस्टम के उदय, और FlashAttention जैसे हार्डवेयर ऑप्टिमाइज़ेशन के कारण, अब कोई भी आसानी से एंटरप्राइज़-ग्रेड AI वातावरण प्राप्त कर सकता है।&lt;/p>
&lt;p>कृपया इस लेख में बताए गए निम्नलिखित बिंदुओं का उपयोग करें:&lt;/p>
&lt;ol>
&lt;li>&lt;strong>VRAM की गणितीय गणना&lt;/strong> का उपयोग करके तार्किक रूप से अपने पीसी विनिर्देशों (specs) के लिए इष्टतम मॉडल आकार और क्वांटाइजेशन स्तर चुनें।&lt;/li>
&lt;li>&lt;strong>Ollama&lt;/strong> का उपयोग करके सबसे तेज़ वातावरण सेटअप करें, और अपनी उत्पादकता बढ़ाने के लिए इसे AI एडिटर के साथ एकीकृत (integrate) करें।&lt;/li>
&lt;li>&lt;strong>llama.cpp&lt;/strong> के उन्नत पैरामीटर नियंत्रण के साथ हार्डवेयर के चरम प्रदर्शन को प्राप्त करें।&lt;/li>
&lt;li>गोपनीय डेटा को संभालने के लिए &lt;strong>AnythingLLM&lt;/strong> के साथ एक सुरक्षित लोकल RAG सिस्टम बनाएं।&lt;/li>
&lt;li>अपना खुद का कस्टम AI बनाने के लिए &lt;strong>Unsloth (WSL2)&lt;/strong> का उपयोग करें जिसमें विशेष ज्ञान हो।&lt;/li>
&lt;/ol>
&lt;p>AI का &amp;ldquo;लोकतंत्रीकरण&amp;rdquo; अब सिर्फ एक चर्चा का शब्द (buzzword) नहीं है, बल्कि एक वास्तविक प्रणाली है जो आपके विंडोज़ डेस्कटॉप पर चलती है। क्लाउड API उपयोग की लागतों और सूचना रिसाव (information leakage) के जोखिमों से मुक्त होकर, अभी स्वतंत्र और शक्तिशाली प्राइवेट AI की दुनिया में कदम रखें।&lt;/p></description></item></channel></rss>