नेटिव RAG,नेटिव AI का हिस्सा है, जो NL2SQL के साथ ऑराबेसबैकएंड में एकीकृत है: सामान्य बेस के शीर्ष पर असेंबल की जाने वाली कोई तृतीय-पक्ष सेवा नहीं है। इस ट्यूटोरियल का अनुसरण करने के लिए आवश्यक शर्तें: एक मौजूदा ऑराबेस प्रोजेक्ट, एक कॉन्फ़िगर किया गया एलएलएम प्रदाता (एंबेडिंग के लिए ओपनएआई या गूगल जेमिनी, जेनरेशन के लिए तीन मूल प्रदाताओं में से एक), और एक प्रोजेक्ट एपीआई कुंजी।
- ऑराबेस RAG पाइपलाइन में दो कॉल होते हैं: किसी दस्तावेज़ को अनुक्रमित करने के लिए
ragIngest(), क्वेरी करने और प्रतिक्रिया उत्पन्न करने के लिएrag()। चंकिंग, एम्बेडिंग और वेक्टर खोज को सर्वर साइड पर प्रबंधित किया जाता है। - हुड के तहत, यह मानक PostgreSQL और pgvector है: एक
embeddingsतालिका जिसमें एक वेक्टर कॉलम प्रति आयाम वर्ग (768, 1536, 3072) और प्रति वर्ग एक आंशिक HNSW सूचकांक होता है। - चंकिंग एक वास्तविक टोकननाइज़र (
tiktokeno200k) का उपयोग करता है, जिसमें कॉन्फ़िगर करने योग्य ओवरलैप और बड़े दस्तावेज़ों पर एक विस्फोट-रोधी गार्ड होता है। - पुनर्प्राप्त सामग्री को प्रॉम्प्ट में इंजेक्ट करने से पहले निष्प्रभावी कर दिया जाता है: एक दस्तावेज़ जो सिस्टम निर्देशों को खराब करने के लिए अपने टैग से बचने का प्रयास करता है उसे स्पष्ट रूप से निष्क्रिय कर दिया जाता है।
- केवल OpenAI और जेमिनी ऑराबेस पक्ष पर एम्बेडिंग उत्पन्न करते हैं। एंथ्रोपिक/क्लाउड में सार्वजनिक एम्बेडिंग एपीआई नहीं है, यह अंतिम प्रतिक्रिया उत्पन्न करने के लिए आरक्षित रहता है।
यह RAG पाइपलाइन कैसे काम करती है
पाइपलाइन पांच चरणों में होती है। अंतर्ग्रहण पर, पाठ को काट दिया जाता है, प्रत्येक टुकड़े को बैच में वेक्टरकृत किया जाता है और फिर संग्रहीत किया जाता है। पूछताछ करने पर, प्रश्न को कोसाइन समानता द्वारा संग्रहीत खंडों की तुलना में वेक्टरकृत किया जाता है, और निकटतम स्निपेट्स को पीढ़ी मॉडल पर भेजे गए प्रॉम्प्ट में इंजेक्ट किया जाता है।
चंकिंग (टिकटॉकन)→एंबेडिंग (बैच)→पीजीवेक्टर स्टोरेज (HNSW)→समानता खोज→संवर्धित पीढ़ी
एक वास्तुशिल्प विवरण जो उत्पादन में मायने रखता है: एम्बेडिंग या जेनरेशन प्रदाता को नेटवर्क कॉल के दौरान कोई पोस्टग्रेज़ कनेक्शन नहीं रखा जाता है। डीबी लेनदेन बाहरी कॉल से पहले बंद हो जाता है और बाद में फिर से खुलता है, ताकि तीसरे पक्ष के नेटवर्क विलंबता के लिए साझा पीजीबाउंसर बैकएंड को कभी भी ब्लॉक न किया जा सके।
प्रोजेक्ट बनाएं
एक सामान्य स्व-होस्ट किए गए pgvector के विपरीत, आपको इस पाइपलाइन के लिए CREATE EXTENSION vector चलाने या स्वयं एक तालिका बनाने की आवश्यकता नहीं है। प्रोजेक्ट की embeddings स्कीमा, इसके वेक्टर कॉलम और HNSW इंडेक्स के साथ, प्रोजेक्ट बनने पर स्वचालित रूप से प्रावधानित होती है।
एम्बेडिंग प्रदाता को प्रोजेक्ट साइड (स्टूडियो → आईए → आपूर्तिकर्ता) पर एक बार कॉन्फ़िगर किया गया है। यह वह प्रदाता है जो आपके वैक्टर के प्रभावी आयाम को निर्धारित करता है, इसलिए embeddingsतालिका पर उपयोग किया जाने वाला कॉलम।
अपने दस्तावेज़ों को ragIngest() के साथ अनुक्रमित करें
किसी दस्तावेज़ को अनुक्रमित करने के लिए एक कॉल पर्याप्त है: पाठ को टुकड़ों में विभाजित किया जाता है, प्रत्येक टुकड़े को वेक्टरकृत किया जाता है, फिर अनुरोधित नामस्थान में संग्रहीत किया जाता है। विभाजन एक वास्तविक टोकननाइज़र (tiktoken, एन्कोडिंग o200k_base) का उपयोग करता है, न कि रिक्त स्थान द्वारा सरल विभाजन, जो कुछ एशियाई भाषाओं की तरह रिक्त स्थान के बिना पाठ पर सही रहता है।
कच्चे HTTP में, समतुल्य मार्ग POST /v1/ai/{project_id}/rag/ingestहै, जो प्रोजेक्ट की एपीआई कुंजी द्वारा प्रमाणित है।
अंतर्ग्रहण डिफ़ॉल्ट रूप से निष्क्रिय है: एक दस्तावेज़ पहचानकर्ता स्वचालित रूप से प्राप्त होता है (सामग्री का SHA-256 हैश, या यदि आप इसे प्रदान करते हैं तो metadata.document_id)। उसी सामग्री को पुनः प्राप्त करने से उसके मौजूदा हिस्सों को डुप्लिकेट करने के बजाय उन्हें बदल दिया जाता है, जिससे आवधिक सिंक कार्य को दोबारा चलाने के लिए सुरक्षित बना दिया जाता है।
वास्तव में पोस्टग्रेज़ में क्या आता है
यहां कोई मालिकाना जादू नहीं है: जो तालिका आपके वैक्टर प्राप्त करती है वह एक साधारण पोस्टग्रेज तालिका है, जिसमें प्रति आयाम वर्ग में एक vector कॉलम और प्रति कॉलम आंशिक एचएनएसडब्ल्यू इंडेक्स होता है (केवल उन पंक्तियों पर सक्रिय होता है जो इसे पॉप्युलेट करते हैं)। यहाँ इसकी वास्तविक परिभाषा, सरलीकृत है:
Each search compares the vectors with the cosine distance operator (<=>), the one targeted by the index's vector_cosine_ops and halfvec_cosine_ops operator classes. For details of the recall/latency trade-offs of HNSW versus IVFFlat, see the article dedicated to HNSW indexing. For the choice of the embedding dimension itself, see the comparison 768 vs 1536 vs 3072.
रैग के साथ क्वेरी करें और प्रतिक्रिया उत्पन्न करें ()
क्वेरी पक्ष पर, rag() क्लाइंट पक्ष पर एकल नेटवर्क राउंड ट्रिप में प्रश्न के वेक्टरीकरण, नेमस्पेस में समानता के आधार पर खोज, संवर्धित प्रॉम्प्ट का निर्माण और जेनरेशन मॉडल पर कॉल को श्रृंखलाबद्ध करता है।
प्रतिक्रिया में उत्पन्न प्रतिक्रिया और उसके स्रोत शामिल होते हैं, प्रदाता द्वारा वास्तव में उपयोग किया जाता है:
पुनर्प्राप्त सामग्री को सिस्टम प्रॉम्प्ट में कभी भी कच्चा इंजेक्ट नहीं किया जाता है। यह अविश्वसनीय डेटा है (उपयोगकर्ता अपलोड, अनुक्रमित पृष्ठ): एक दस्तावेज़ जिसमें उदाहरण के लिए, एक समापन अनुभाग टैग होता है जिसके बाद गलत निर्देश होते हैं, असेंबली से पहले बेअसर हो जाता है, इसके कोण ब्रैकेट को ब्रैकेट द्वारा प्रतिस्थापित किया जाता है, टेक्स्ट संरक्षित होता है लेकिन संरचना निष्क्रिय हो जाती है।
यदि rag() को कुछ भी नहीं मिलता है, भले ही आपका नामस्थान खाली न हो, तो प्रतिक्रिया में भ्रामक चुप्पी के बजाय एक स्पष्ट चेतावनी होती है: आपका कॉर्पस संभवतः किसी अन्य मॉडल या किसी अन्य एम्बेडिंग आयाम के तहत अनुक्रमित होता है। इसे POST /v1/ai/{project_id}/rag/{namespace}/reindexके माध्यम से पुनः अनुक्रमित करें।
लैंगचेन और एक हस्तनिर्मित पीजीवेक्टर से: क्या बदलता है
यदि आपने पहले से ही लैंगचेन के साथ PostgreSQL पर एक RAG चैटबॉट बनाया है, तो अंतर्निहित डेटाबेस को बदले बिना, प्रत्येक मैनुअल ईंट में सर्वर-साइड प्रबंधित समकक्ष होता है।
| पाठ को तोड़ना | स्वयं को सेट करने के लिए RecursiveCharacterTextSplitter | ragIngest(): एकीकृत टिकटोकन चंकिंग, 512 टोकन / 64 डिफ़ॉल्ट रूप से ओवरलैप |
|---|---|---|
| एंबेडिंग | OpenAIEmbeddings को मैन्युअल कॉल, बैच सीमाओं का प्रबंधन | स्वचालित रूप से बैच किया गया, अंतर्निहित क्षणिक पुनः प्रयास |
| वेक्टर भंडारण | स्वयं बनाने और माइग्रेट करने के लिए pgvector तालिका + HNSW अनुक्रमणिका | प्रति प्रोजेक्ट स्कीमा और अनुक्रमणिका का प्रावधान किया गया |
| खोजें + शीघ्र | PGVector.similarity_search() फिर प्रॉम्प्ट को मैन्युअल रूप से असेंबल करना | रैग(): एक कॉल में खोज और संवर्धित पीढ़ी |
| पुनर्प्राप्त सामग्री | जैसा संकेत में है वैसा ही इंजेक्ट किया गया | असेंबली से पहले संरचना टैग का स्वचालित निराकरण |
क्या आप इस तरह की मैन्युअल असेंबली के साथ सुपाबेस पर बने मौजूदा प्रोजेक्ट को माइग्रेट कर रहे हैं? बाकी बैकएंड (स्कीमा, आरएलएस नीतियां, एसडीके) के लिए माइग्रेशन तर्क हमारे सुपाबेस से ऑराबेस माइग्रेशन गाइडमें शामिल है।
उत्पादन में जाने से पहले सेटिंग्स और सीमाओं के बारे में जागरूक होना चाहिए
तीन सेटिंग्स सीधे लागत और विलंबता को प्रभावित करती हैं, सभी aura-aiसेवा कोड में सत्यापित हैं। क्षणिक एम्बेडिंग कॉल (नेटवर्क विफलता, प्रदाता त्रुटि 429) पर प्रयासों की संख्या डिफ़ॉल्ट रूप से 3 है, 100 एमएस के बेस बैकऑफ़ के साथ। बड़े दस्तावेज़ों को डिफ़ॉल्ट रूप से 2048 टुकड़ों तक सीमित उप-बैचों में एम्बेड किया जाता है, ताकि एक भी बड़े दस्तावेज़ में विफल हुए बिना आपूर्तिकर्ताओं की एपीआई सीमा का सम्मान किया जा सके। एक रेलिंग (डिफ़ॉल्ट रूप से 10,000 टुकड़े, कॉन्फ़िगर करने योग्य) किसी दस्तावेज़ के अंतर्ग्रहण को स्पष्ट रूप से अस्वीकार कर देता है जो बड़ी संख्या में टुकड़ों का उत्पादन करेगा।
खोज पक्ष पर, HNSW उम्मीदवार सूची का आकार स्वचालित रूप से max(64, top_k × 4)पर समायोजित हो जाता है: आप जितने अधिक परिणामों का अनुरोध करेंगे, सूचकांक उतने ही अधिक उम्मीदवारों को याद रखने के लिए खोजेगा। यदि आपके कोष में एक विशेष प्रोफ़ाइल है तो पर्यावरण चर के माध्यम से एक निश्चित मान संभव रहता है।
विभिन्न मॉडलों के वेक्टर रिक्त स्थान की तुलना कभी भी एक-दूसरे से नहीं की जाती है: प्रत्येक खोज वर्तमान एम्बेडिंग मॉडल तक ही सीमित रहती है, और मॉडल बदलने के लिए एक मूक स्विच के बजाय एक स्पष्ट रीइंडेक्सिंग की आवश्यकता होती है जो परिणामों की स्थिरता को तोड़ देगी।
वर्तमान सीमाओं के बारे में जागरूक होना चाहिए
एम्बेडिंग आयाम को तीन समर्थित वर्गों में से एक में आना चाहिए: 768, 1536, या 3072। एक प्रदाता जो अन्य आयाम लौटाता है उसे एक स्पष्ट त्रुटि के साथ अस्वीकार कर दिया जाता है, कभी भी छोटा नहीं किया जाता है या चुपचाप डाला नहीं जाता है।
एंबेडिंग जेनरेशन केवल तीन मूल प्रदाताओं के बीच ओपनएआई या गूगल जेमिनी के माध्यम से उपलब्ध है: एंथ्रोपिक/क्लाउड सार्वजनिक एंबेडिंग एपीआई को उजागर नहीं करता है, इसलिए इसका उपयोग केवल इस पाइपलाइन में अंतिम प्रतिक्रिया उत्पन्न करने के लिए किया जाता है, वेक्टराइजेशन के लिए कभी नहीं।
जावास्क्रिप्ट एसडीके अभी तक top_k और threshold को rag() कॉल पर ओवरराइड नहीं करता है: वे सीधे HTTP में पहुंच योग्य रहते हैं, क्रमशः [1, 50] और [0, 1] तक सीमित हैं, लेकिन आज की तरह aura.ai.rag() से नहीं। डिफ़ॉल्ट समानता सीमा (0.3) जानबूझकर अनुमेय है; प्रॉम्प्ट में अप्रासंगिक स्रोतों से बचने के लिए इसे सघन कोष तक सीमित करें।
आगे जाने के लिए
आरएजी असंरचित सामग्री (दस्तावेज़, नोट्स, टिकट) पर प्रश्नों को शामिल करता है। आपके रिलेशनल डेटा के बारे में प्रश्नों के लिए, ऑराबेस का मूल NL2SQL सीधे प्रश्न को मान्य SQL में अनुवादित करता है। ऊपर उल्लिखित HNSW मापदंडों और आयाम वर्गों के विवरण के लिए, HNSW अनुक्रमण और एम्बेडिंग आयामों की तुलनापर लेख देखें। पूर्ण एपीआई संदर्भ RAG और pgvector दस्तावेज़ और AI गेटवे दस्तावेज़रहता है।