PRODसंप्रभु यूरोपीय BaaS मंचडैशबोर्ड खोलें →

मूल एआई · 10 मिनट पढ़ा

ट्यूटोरियल: Postgres और pgvector के साथ RAG पाइपलाइन

Affane Daylami · Fondateur · 13 अप्रैल 2026

ब्लॉग पर वापस जाएँ

पोस्टग्रेज़ पर RAG पाइपलाइन बनाने के लिए आम तौर पर कई टुकड़ों को स्वयं असेंबल करने की आवश्यकता होती है: एक टेक्स्ट स्लाइसर, एक एम्बेडिंग कॉल, एक पीजीवेक्टर टेबल, एक समानता क्वेरी। यह क्लासिक लैंगचेन + पीजीवेक्टरचेन है। ऑराबेस पर, यह पाइपलाइन पहले से ही सर्वर साइड पर मौजूद है: दो कॉल, ragIngest() और rag(), मानक PostgreSQL और pgvector पर भरोसा करते हुए, इसे जोड़ने के लिए मालिकाना वेक्टर आधार के बिना इसे प्रतिस्थापित करें।

यह अंग्रेजी पाठ फ़्रेंच मूल से स्वचालित रूप से उत्पन्न हुआ था और अभी तक इसकी समीक्षा नहीं की गई है।
यह पृष्ठ स्वचालित रूप से अनुवादित किया गया था. अंग्रेजी संस्करण प्रामाणिक है.

नेटिव RAG,नेटिव AI का हिस्सा है, जो NL2SQL के साथ ऑराबेसबैकएंड में एकीकृत है: सामान्य बेस के शीर्ष पर असेंबल की जाने वाली कोई तृतीय-पक्ष सेवा नहीं है। इस ट्यूटोरियल का अनुसरण करने के लिए आवश्यक शर्तें: एक मौजूदा ऑराबेस प्रोजेक्ट, एक कॉन्फ़िगर किया गया एलएलएम प्रदाता (एंबेडिंग के लिए ओपनएआई या गूगल जेमिनी, जेनरेशन के लिए तीन मूल प्रदाताओं में से एक), और एक प्रोजेक्ट एपीआई कुंजी।

अनिवार्य है
  • ऑराबेस RAG पाइपलाइन में दो कॉल होते हैं: किसी दस्तावेज़ को अनुक्रमित करने के लिए ragIngest(), क्वेरी करने और प्रतिक्रिया उत्पन्न करने के लिए rag()। चंकिंग, एम्बेडिंग और वेक्टर खोज को सर्वर साइड पर प्रबंधित किया जाता है।
  • हुड के तहत, यह मानक PostgreSQL और pgvector है: एक embeddings तालिका जिसमें एक वेक्टर कॉलम प्रति आयाम वर्ग (768, 1536, 3072) और प्रति वर्ग एक आंशिक HNSW सूचकांक होता है।
  • चंकिंग एक वास्तविक टोकननाइज़र (tiktoken o200k) का उपयोग करता है, जिसमें कॉन्फ़िगर करने योग्य ओवरलैप और बड़े दस्तावेज़ों पर एक विस्फोट-रोधी गार्ड होता है।
  • पुनर्प्राप्त सामग्री को प्रॉम्प्ट में इंजेक्ट करने से पहले निष्प्रभावी कर दिया जाता है: एक दस्तावेज़ जो सिस्टम निर्देशों को खराब करने के लिए अपने टैग से बचने का प्रयास करता है उसे स्पष्ट रूप से निष्क्रिय कर दिया जाता है।
  • केवल OpenAI और जेमिनी ऑराबेस पक्ष पर एम्बेडिंग उत्पन्न करते हैं। एंथ्रोपिक/क्लाउड में सार्वजनिक एम्बेडिंग एपीआई नहीं है, यह अंतिम प्रतिक्रिया उत्पन्न करने के लिए आरक्षित रहता है।
#
अवधारणा

यह RAG पाइपलाइन कैसे काम करती है

पाइपलाइन पांच चरणों में होती है। अंतर्ग्रहण पर, पाठ को काट दिया जाता है, प्रत्येक टुकड़े को बैच में वेक्टरकृत किया जाता है और फिर संग्रहीत किया जाता है। पूछताछ करने पर, प्रश्न को कोसाइन समानता द्वारा संग्रहीत खंडों की तुलना में वेक्टरकृत किया जाता है, और निकटतम स्निपेट्स को पीढ़ी मॉडल पर भेजे गए प्रॉम्प्ट में इंजेक्ट किया जाता है।

चंकिंग (टिकटॉकन)→एंबेडिंग (बैच)→पीजीवेक्टर स्टोरेज (HNSW)→समानता खोज→संवर्धित पीढ़ी

एक वास्तुशिल्प विवरण जो उत्पादन में मायने रखता है: एम्बेडिंग या जेनरेशन प्रदाता को नेटवर्क कॉल के दौरान कोई पोस्टग्रेज़ कनेक्शन नहीं रखा जाता है। डीबी लेनदेन बाहरी कॉल से पहले बंद हो जाता है और बाद में फिर से खुलता है, ताकि तीसरे पक्ष के नेटवर्क विलंबता के लिए साझा पीजीबाउंसर बैकएंड को कभी भी ब्लॉक न किया जा सके।

#
स्टेप 1

प्रोजेक्ट बनाएं

एक सामान्य स्व-होस्ट किए गए pgvector के विपरीत, आपको इस पाइपलाइन के लिए CREATE EXTENSION vector चलाने या स्वयं एक तालिका बनाने की आवश्यकता नहीं है। प्रोजेक्ट की embeddings स्कीमा, इसके वेक्टर कॉलम और HNSW इंडेक्स के साथ, प्रोजेक्ट बनने पर स्वचालित रूप से प्रावधानित होती है।

terminalbash
# ऑराबेस खाता + सीएलआई
npm i -g @aurabase/cli
aura login

# प्रोजेक्ट बनाएं और इसे इस फ़ोल्डर से लिंक करें
aura projects create mon-assistant --engine postgres
aura link --project-id <uuid-du-projet>

# लिंक किए गए प्रोजेक्ट की एपीआई कुंजी पुनर्प्राप्त करें
aura projects api-keys

एम्बेडिंग प्रदाता को प्रोजेक्ट साइड (स्टूडियो → आईए → आपूर्तिकर्ता) पर एक बार कॉन्फ़िगर किया गया है। यह वह प्रदाता है जो आपके वैक्टर के प्रभावी आयाम को निर्धारित करता है, इसलिए embeddingsतालिका पर उपयोग किया जाने वाला कॉलम।

#
चरण दो

अपने दस्तावेज़ों को ragIngest() के साथ अनुक्रमित करें

किसी दस्तावेज़ को अनुक्रमित करने के लिए एक कॉल पर्याप्त है: पाठ को टुकड़ों में विभाजित किया जाता है, प्रत्येक टुकड़े को वेक्टरकृत किया जाता है, फिर अनुरोधित नामस्थान में संग्रहीत किया जाता है। विभाजन एक वास्तविक टोकननाइज़र (tiktoken, एन्कोडिंग o200k_base) का उपयोग करता है, न कि रिक्त स्थान द्वारा सरल विभाजन, जो कुछ एशियाई भाषाओं की तरह रिक्त स्थान के बिना पाठ पर सही रहता है।

app/api/ingest/route.tstypescript
import { aura } from '@/lib/aurabase'

export async function POST(req: Request) {
  const { content, metadata } = await req.json()

  const { data, error } = await aura.ai.ragIngest({
    namespace: 'docs-produit',
    content,
    metadata,
  })

  if (error) return Response.json({ error }, { status: 400 })
  return Response.json(data) // {आईडी, भाग }
}

कच्चे HTTP में, समतुल्य मार्ग POST /v1/ai/{project_id}/rag/ingestहै, जो प्रोजेक्ट की एपीआई कुंजी द्वारा प्रमाणित है।

terminalbash
curl -X POST https://<votre-gateway>/v1/ai/<project_id>/rag/ingest \
  -H "apikey: <votre-cle-api>" \
  -H "Content-Type: application/json" \
  -d '{
    "namespace": "docs-produit",
    "content": "Le texte complet de votre document ici...",
    "metadata": { "source": "guide-utilisateur.pdf" }
  }'

अंतर्ग्रहण डिफ़ॉल्ट रूप से निष्क्रिय है: एक दस्तावेज़ पहचानकर्ता स्वचालित रूप से प्राप्त होता है (सामग्री का SHA-256 हैश, या यदि आप इसे प्रदान करते हैं तो metadata.document_id)। उसी सामग्री को पुनः प्राप्त करने से उसके मौजूदा हिस्सों को डुप्लिकेट करने के बजाय उन्हें बदल दिया जाता है, जिससे आवधिक सिंक कार्य को दोबारा चलाने के लिए सुरक्षित बना दिया जाता है।

#
चरण 3

वास्तव में पोस्टग्रेज़ में क्या आता है

यहां कोई मालिकाना जादू नहीं है: जो तालिका आपके वैक्टर प्राप्त करती है वह एक साधारण पोस्टग्रेज तालिका है, जिसमें प्रति आयाम वर्ग में एक vector कॉलम और प्रति कॉलम आंशिक एचएनएसडब्ल्यू इंडेक्स होता है (केवल उन पंक्तियों पर सक्रिय होता है जो इसे पॉप्युलेट करते हैं)। यहाँ इसकी वास्तविक परिभाषा, सरलीकृत है:

परियोजना का प्लेटफ़ॉर्म आरेख (सरलीकृत)sql
create table embeddings (
  id               uuid primary key default gen_random_uuid(),
  project_id       text not null,
  namespace        text not null,
  content          text not null,
  embedding_768    vector(768),
  embedding_1536   vector(1536),
  embedding_3072   vector(3072),
  embedding_model  text,
  dims             int,
  metadata         jsonb default '{}'::jsonb,
  created_at       timestamptz not null default now()
);

-- आयाम वर्ग द्वारा आंशिक HNSW सूचकांक
create index idx_embeddings_vec_1536 on embeddings
  using hnsw (embedding_1536 vector_cosine_ops)
  where embedding_1536 is not null;

-- 2000 आयामों से परे, HNSW वेक्टर प्रकार का समर्थन नहीं करता है:
-- कक्षा 3072 के लिए हाफवेक में कास्ट करें
create index idx_embeddings_vec_3072 on embeddings
  using hnsw ((embedding_3072::halfvec(3072)) halfvec_cosine_ops)
  where embedding_3072 is not null;

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.

#
चरण 4

रैग के साथ क्वेरी करें और प्रतिक्रिया उत्पन्न करें ()

क्वेरी पक्ष पर, rag() क्लाइंट पक्ष पर एकल नेटवर्क राउंड ट्रिप में प्रश्न के वेक्टरीकरण, नेमस्पेस में समानता के आधार पर खोज, संवर्धित प्रॉम्प्ट का निर्माण और जेनरेशन मॉडल पर कॉल को श्रृंखलाबद्ध करता है।

app/api/ask/route.tstypescript
import { aura } from '@/lib/aurabase'

export async function POST(req: Request) {
  const { question } = await req.json()

  const { data, error } = await aura.ai.rag({
    question,
    namespace: 'docs-produit',
  })

  if (error) return Response.json({ error }, { status: 400 })
  return Response.json(data)
}

प्रतिक्रिया में उत्पन्न प्रतिक्रिया और उसके स्रोत शामिल होते हैं, प्रदाता द्वारा वास्तव में उपयोग किया जाता है:

प्रतिक्रिया (अंश)json
{
  "data": {
    "answer": "D'après la documentation, ...",
    "sources": [
      { "id": "...", "content": "...", "similarity": 0.87 }
    ],
    "model": "claude-3-5-sonnet",
    "tokens": 412,
    "provider": "anthropic",
    "fallback_used": false
  }
}

पुनर्प्राप्त सामग्री को सिस्टम प्रॉम्प्ट में कभी भी कच्चा इंजेक्ट नहीं किया जाता है। यह अविश्वसनीय डेटा है (उपयोगकर्ता अपलोड, अनुक्रमित पृष्ठ): एक दस्तावेज़ जिसमें उदाहरण के लिए, एक समापन अनुभाग टैग होता है जिसके बाद गलत निर्देश होते हैं, असेंबली से पहले बेअसर हो जाता है, इसके कोण ब्रैकेट को ब्रैकेट द्वारा प्रतिस्थापित किया जाता है, टेक्स्ट संरक्षित होता है लेकिन संरचना निष्क्रिय हो जाती है।

कॉर्पस को दूसरे मॉडल के तहत अनुक्रमित किया गया

यदि rag() को कुछ भी नहीं मिलता है, भले ही आपका नामस्थान खाली न हो, तो प्रतिक्रिया में भ्रामक चुप्पी के बजाय एक स्पष्ट चेतावनी होती है: आपका कॉर्पस संभवतः किसी अन्य मॉडल या किसी अन्य एम्बेडिंग आयाम के तहत अनुक्रमित होता है। इसे POST /v1/ai/{project_id}/rag/{namespace}/reindexके माध्यम से पुनः अनुक्रमित करें।

#
तुलना

लैंगचेन और एक हस्तनिर्मित पीजीवेक्टर से: क्या बदलता है

यदि आपने पहले से ही लैंगचेन के साथ PostgreSQL पर एक RAG चैटबॉट बनाया है, तो अंतर्निहित डेटाबेस को बदले बिना, प्रत्येक मैनुअल ईंट में सर्वर-साइड प्रबंधित समकक्ष होता है।

पाठ को तोड़नास्वयं को सेट करने के लिए RecursiveCharacterTextSplitterragIngest(): एकीकृत टिकटोकन चंकिंग, 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 गेटवे दस्तावेज़रहता है।

#
अक्सर पूछे जाने वाले प्रश्नों

पूछे जाने वाले प्रश्न

क्या आपको पीजीवेक्टर एक्सटेंशन और एचएनएसडब्ल्यू इंडेक्स को स्वयं प्रबंधित करना होगा?+
नहीं, प्रोजेक्ट बनने पर एम्बेडिंग स्कीमा, पीजीवेक्टर एक्सटेंशन और आंशिक एचएनएसडब्ल्यू इंडेक्स (एक प्रति आयाम वर्ग: 768, 1536, 3072) स्वचालित रूप से प्रावधानित होते हैं। आप सीधे ragIngest() फिर rag() को कॉल करें; यदि आपके कॉर्पस में एक विशेष प्रोफ़ाइल है, तो इंडेक्स की फाइन ट्यूनिंग (ef_search, iterative_scan मोड) सर्वर साइड पर पहुंच योग्य रहती है।
मुझे अपने उपयोग के मामले के लिए कौन सा एम्बेडिंग आयाम चुनना चाहिए?+
ऑराबेस आपके आपूर्तिकर्ता द्वारा दिए गए आयाम को तीन समर्थित वर्गों के विरुद्ध मान्य करता है: 768, 1536 और 3072। विकल्प कॉन्फ़िगर किए गए एम्बेडिंग मॉडल पर निर्भर करता है (उदाहरण के लिए ओपनएआई पर टेक्स्ट-एम्बेडिंग-3-छोटा 1536 आयामों का उत्पादन करता है) और इसमें एम्बेडिंग आयामों के लिए समर्पित हमारी तुलना में विस्तृत रिकॉल, लागत और भंडारण आकार के बीच एक समझौता शामिल है।

तैनाती के लिए तैयार हैं?

पाँच मिनट में आपका बैकएंड।

किसी क्रेडिट कार्ड की आवश्यकता नहीं · 500 एमबी निःशुल्क · 50,000 एमएयू