لماذا لا تكفي النسخة التجريبية العاملة في الإنتاج
التوليد المعزز بالاسترجاع، أو RAG، هو منتج بيانات وليس حيلة في prompt. يتحول الطلب إلى بحث واحد أو عدة أبحاث، ثم تُرشح النتائج حسب هوية المستخدم والمستأجر، ويحصل النموذج على سياق محدود، وتعود الإجابة مع أدلة. يمكن أن تكون كل مرحلة صحيحة منفردة ومع ذلك تكون الإجابة النهائية خاطئة. قد يعثر المسترجع على فقرة مناسبة من مستأجر لا يحق للمتصل رؤيته. وقد يحتوي المقطع على الجملة المطلوبة لكنه يفقد العنوان الذي يوضح معناها. كما يمكن للنموذج اللغوي أن ينشئ عنوان URL مقنعاً لم يكن من المصادر المسترجعة.
لذلك يجب أن يكون عقد الإنتاج واضحاً. خزّن مع كل مقطع هوية المستند الثابتة، والإصدار، وموقع المصدر، وترتيب المقطع، وتسميات الوصول، ونموذج embedding والتمثيل المعجمي. افصل الإصدار الحالي عن الإصدارات التاريخية. افرض حد المستأجر داخل PostgreSQL وكرر مرشح التفويض في استعلام الاسترجاع. يجب أن يكون الاقتباس معرّفاً اختير من الصفوف المسترجعة، لا نصاً يمكن للنموذج اختراعه.
يمكن تنفيذ هذا التصميم في قاعدة PostgreSQL واحدة، ثم نقل البحث المعجمي أو reranker إلى خدمة مستقلة لاحقاً. يشرح دليل تقييم وكلاء الذكاء الاصطناعي مجموعة الاختبارات بتفصيل أكبر، ويشرح دليل قابلية ملاحظة وكلاء الذكاء الاصطناعي تتبع المراحل. ويتناول دليل حقن prompt وأمان MCP سبب اعتبار النص المسترجع بيانات لا تعليمات.
حدّد وحدة الاسترجاع قبل اختيار الفهرس
التقسيم إلى مقاطع هو أول قرار متعلق بالجودة. ابدأ ببنية المصدر لا بعدد الأحرف. أبقِ العنوان مع الفقرات التي تحته، ولا تفصل صف جدول عن تسميته، وحافظ على حدود القوائم. يجب أن يجيب المقطع عن سؤال صغير بمفرده مع الاحتفاظ بسياق كافٍ لـ reranker. احسب بالرموز التي يستخدمها نموذج embedding المختار، لأن حد الأحرف لا يتوافق بالطريقة نفسها مع اللغات المختلفة أو الشيفرة.
يمكن للتداخل أن يحافظ على جملة تعبر الحد، لكنه يكرر المصطلحات ويزيد عمل embedding وقد يجعل المولد يكرر نفسه. استخدم أصغر تداخل يعالج أخطاء الحدود التي رصدتها. خزّن source_start وsource_end أو مرساة للمصدر مع hash موحد للنص. تصبح الإحالة دقيقة ويستطيع عمل ingestion تجاوز المقاطع التي لم تتغير. حافظ على كتلة الشيفرة كاملة عندما تكون صياغتها مهمة. وفي المستند الطويل أضف عنوان المستند ومسار العناوين إلى النص المرسل إلى embedder، مع إبقاء المتن النظيف للعرض.
Embedding تمثيل ذو إصدار للنص، وليس خاصية ثابتة له. سجل اسم النموذج، والأبعاد، وسياسة التطبيع، ووقت الإنشاء. يؤدي تغيير أي منها إلى تغيير ترتيب الجيران الأقرب. ويمنع تعريف العمود vector(1536) إدخال متجه بأبعاد أخرى، فيحمي من خلط النماذج عن طريق الخطأ. إذا تعايشت نماذج متعددة فاستخدم أعمدة أو جداول وفهارس منفصلة، ولا تضف أصفاراً إلى المتجهات بصمت.
عقد بيانات PostgreSQL مع حد للمستأجر
يحتفظ المخطط التالي بمؤشر إلى إصدار المستند الحالي وبكل البيانات الوصفية اللازمة للبحث والاقتباسات. إعداد english مثال فقط. استخدم إعداد بحث نصي لكل لغة في مجموعة متعددة اللغات، أو خدمة معجمية تفهم لغات المجموعة.
CREATE EXTENSION IF NOT EXISTS vector;
CREATE TABLE rag_documents (
tenant_id uuid NOT NULL,
document_id uuid NOT NULL,
current_revision bigint NOT NULL,
source_uri text NOT NULL,
deleted_at timestamptz,
PRIMARY KEY (tenant_id, document_id)
);
CREATE TABLE rag_chunks (
chunk_id bigint GENERATED ALWAYS AS IDENTITY PRIMARY KEY,
tenant_id uuid NOT NULL,
document_id uuid NOT NULL,
revision bigint NOT NULL,
chunk_no integer NOT NULL,
title text NOT NULL,
content text NOT NULL,
source_start integer NOT NULL,
source_end integer NOT NULL,
acl text[] NOT NULL DEFAULT ARRAY['public']::text[],
embedding vector(1536) NOT NULL,
embedding_model text NOT NULL,
search_tsv tsvector GENERATED ALWAYS AS (
setweight(to_tsvector('english', coalesce(title, '')), 'A') ||
setweight(to_tsvector('english', content), 'B')
) STORED,
updated_at timestamptz NOT NULL DEFAULT now(),
UNIQUE (tenant_id, document_id, revision, chunk_no)
);
CREATE INDEX rag_chunks_search_tsv_idx
ON rag_chunks USING gin (search_tsv);
CREATE INDEX rag_chunks_acl_idx
ON rag_chunks USING gin (acl);
CREATE INDEX rag_chunks_tenant_idx
ON rag_chunks (tenant_id);
CREATE INDEX rag_chunks_embedding_hnsw_idx
ON rag_chunks USING hnsw (embedding vector_cosine_ops);
إذا اخترت IVFFlat كفهرس تقريبي، فاستخدم إعدادات القوائم وprobes الخاصة به بدلاً من HNSW:
CREATE INDEX rag_chunks_embedding_ivfflat_idx
ON rag_chunks USING ivfflat (embedding vector_cosine_ops)
WITH (lists = 100);
احتفظ بفهرس تقريبي واحد للمسافة ومسار الوصول الذي يستخدمه المسار، إلا إذا كان الترحيل أو المقارنة المقصودة يتطلبان الاثنين.
يمثل البحث النصي الكامل في PostgreSQL الكلمات المعجمية الموحدة كـ tsvector ويمثل الاستعلام كـ tsquery. يبقي العمود المولد حساب الفهرس خارج مسار الطلب، ويكون فهرس GIN اختياراً معتاداً للبحث المتكرر. إذا احتجت دلالات BM25 بالضبط، استخدم محركاً معجمياً أو امتداداً يقدم BM25 وسلّم نتائجه كمجموعة مرشحين مرتبة. الدالة ts_rank_cd في PostgreSQL ترتيب معجمي مفيد، لكنها ليست BM25. لا تسمِّ الاثنين بالاسم نفسه لمجرد أن كليهما يعيد رقماً.
بالنسبة إلى دور التطبيق، فعّل أمان مستوى الصف على الجدولين واستخدم إعداد مستأجر محلياً للمعاملة مشتقاً من claims موثقة. لا ينبغي أن يكون الدور الذي يخدم الطلبات مالك الجدولين. ويمكن بدلاً من ذلك إجبار السياسات على التطبيق على المالك أيضاً.
ALTER TABLE rag_documents ENABLE ROW LEVEL SECURITY;
ALTER TABLE rag_documents FORCE ROW LEVEL SECURITY;
ALTER TABLE rag_chunks ENABLE ROW LEVEL SECURITY;
ALTER TABLE rag_chunks FORCE ROW LEVEL SECURITY;
CREATE POLICY rag_documents_tenant ON rag_documents
USING (tenant_id = NULLIF(current_setting('app.tenant_id', true), '')::uuid)
WITH CHECK (tenant_id = NULLIF(current_setting('app.tenant_id', true), '')::uuid);
CREATE POLICY rag_chunks_tenant ON rag_chunks
USING (tenant_id = NULLIF(current_setting('app.tenant_id', true), '')::uuid)
WITH CHECK (tenant_id = NULLIF(current_setting('app.tenant_id', true), '')::uuid);
اضبط القيمة باستدعاء ذي معاملات في بداية كل معاملة، ثم نفّذ البحث وثبّت المعاملة أو ألغها. الإعداد المفقود لا يطابق أي مستأجر. يجب رفض قيمة claims غير الصحيحة قبل فتح معاملة قاعدة البيانات. ويضيف التطبيق مع ذلك مرشحات tenant_id والإصدار الحالي وdeleted_at وACL. RLS هو الحاجز الأخير، وليس سبباً للثقة في tenant ID أو قائمة أدوار يرسلها العميل.
HNSW وIVFFlat خياران تشغيليان مختلفان
عند عدم وجود فهرس تقريبي، ينفذ pgvector بحثاً دقيقاً عن أقرب الجيران. وهو مرجع مفيد لـ recall وقد يكون عملياً بعد مرشح انتقائي للمستأجر أو الحالة. يبني HNSW رسمياً متعدد الطبقات. وهو يقدم عادةً مفاضلة أقوى بين السرعة والاسترجاع، لكنه يستهلك ذاكرة أكبر ويستغرق وقتاً أطول في البناء. ولا يحتاج إلى بيانات تدريب، لذلك يمكن إنشاؤه قبل ملء الجدول. تؤثر خيارات m وef_construction في حجم الرسم وعمل البناء وrecall.
يقسم IVFFlat المتجهات إلى قوائم ويفحص جزءاً من القوائم الأقرب. يستهلك ذاكرة أقل ويبنى أسرع، لكن recall يعتمد على عدد القوائم وتوزيع البيانات وعدد probes. أنشئه بعد تحميل بيانات ممثلة. يقترح مشروع pgvector إرشادات بداية لاختيار القوائم وضبط ivfflat.probes. هذه ليست benchmarks لحملك. قِس باستخدام لغاتك ومرشحاتك ومعدل تحديثك.
استخدم عامل المسافة الذي يطابق عقد embedding. مسافة cosine تستخدم <=>، والضرب الداخلي يستخدم <#>، ومسافة L2 تستخدم <->. يجب أن يستخدم فهرس HNSW لـ cosine الصنف vector_cosine_ops كما في المخطط. أضف مفتاحاً ثانوياً حتمياً إلى الترتيب. أثناء الترحيل أنشئ الفهرس الجديد بـ CREATE INDEX CONCURRENTLY حتى لا تحجب الكتابات العادية، وتذكر أن هذا الأمر لا يعمل داخل معاملة. افحص الخطط بواسطة EXPLAIN (ANALYZE, BUFFERS) على بيانات ممثلة وقارن النتائج التقريبية بالبحث الدقيق.
يتطلب البحث التقريبي المصفى عناية. يطبق pgvector المرشح العادي بعد فحص الفهرس التقريبي، لذلك قد تحتوي قائمة صغيرة على صفوف قليلة جداً لمستأجر أو ACL معين. زد ميزانية المرشحين، فعّل iterative scans عندما يدعمها إصدار pgvector المثبت، أو أضف فهرساً علائقياً انتقائياً. يفيد الفهرس المتجهي الجزئي مع عدد صغير من قيم المرشح. ومع مستأجرين كثيرين يمكن لتقسيم list أو hash عزل مجموعات البحث، لكن آلاف الأقسام تزيد وقت التخطيط والذاكرة. تحذر وثائق pgvector تحديداً من أن مشاركة الفهرس التقريبي تسمح لمتجهات مستأجر بالتأثير في recall مستأجر آخر.
اجمع النية المعجمية والتشابه المتجهي
يعالج البحث المتجهي إعادة الصياغة والمفاهيم المتقاربة. ويحمي البحث المعجمي المعرّفات الدقيقة، ورموز الأخطاء، وأسماء المنتجات، والعبارات المقتبسة، والمصطلحات الجديدة التي قد يمثلها embedding بشكل سيئ. يشغل خط أنابيب موثوق البحثين على مجموعة الإصدارات الحالية المسموح بها نفسها، ويأخذ مرشحين أكثر مما سيعرضه، ويدمج الرتب لا الدرجات الخام.
يستخدم الاستعلام التالي ترتيب النص الكامل في PostgreSQL للفرع المعجمي. وفي نظام لديه خدمة BM25 استبدل text_hits بمرشحيها وحافظ على عقد chunk_id وtext_rank وtenant وrevision وACL. يتجنب Reciprocal Rank Fusion افتراض أن مسافة cosine ودرجة BM25 على المقياس نفسه.
WITH q AS (
SELECT $1::vector AS embedding,
websearch_to_tsquery('english', $2::text) AS tsq,
$3::uuid AS tenant_id,
$4::text[] AS roles
),
vector_hits AS (
SELECT c.chunk_id,
row_number() OVER (
ORDER BY c.embedding <=> q.embedding, c.chunk_id
) AS vector_rank
FROM rag_chunks c
JOIN rag_documents d
ON d.tenant_id = c.tenant_id
AND d.document_id = c.document_id
AND d.current_revision = c.revision
CROSS JOIN q
WHERE c.tenant_id = q.tenant_id
AND d.deleted_at IS NULL
AND c.acl && q.roles
ORDER BY c.embedding <=> q.embedding, c.chunk_id
LIMIT 50
),
text_hits AS (
SELECT c.chunk_id,
row_number() OVER (
ORDER BY ts_rank_cd(c.search_tsv, q.tsq) DESC, c.chunk_id
) AS text_rank
FROM rag_chunks c
JOIN rag_documents d
ON d.tenant_id = c.tenant_id
AND d.document_id = c.document_id
AND d.current_revision = c.revision
CROSS JOIN q
WHERE c.tenant_id = q.tenant_id
AND d.deleted_at IS NULL
AND c.acl && q.roles
AND c.search_tsv @@ q.tsq
ORDER BY ts_rank_cd(c.search_tsv, q.tsq) DESC, c.chunk_id
LIMIT 50
),
ranked AS (
SELECT chunk_id, vector_rank, NULL::bigint AS text_rank
FROM vector_hits
UNION ALL
SELECT chunk_id, NULL::bigint AS vector_rank, text_rank
FROM text_hits
),
candidate_scores AS (
SELECT chunk_id,
min(vector_rank) AS vector_rank,
min(text_rank) AS text_rank
FROM ranked
GROUP BY chunk_id
)
SELECT c.chunk_id,
c.document_id,
c.chunk_no,
c.title,
c.content,
d.source_uri,
s.vector_rank,
s.text_rank,
coalesce(1.0 / (60.0 + s.vector_rank), 0.0) +
coalesce(1.0 / (60.0 + s.text_rank), 0.0) AS rrf_score
FROM candidate_scores s
JOIN rag_chunks c ON c.chunk_id = s.chunk_id
JOIN rag_documents d
ON d.tenant_id = c.tenant_id
AND d.document_id = c.document_id
AND d.current_revision = c.revision
WHERE d.deleted_at IS NULL
ORDER BY rrf_score DESC, c.chunk_id
LIMIT 8;
تنشئ طبقة التفويض مصفوفة الأدوار. يعني الشرط acl && roles وجود تداخل في تسمية واحدة على الأقل. إذا كانت السياسة تتطلب كل التسميات أو المالك أو نافذة زمنية، فاستخدم عاملاً آخر أو عمود is_public. اربط نص الاستعلام وembedding كمعاملات. يتسامح websearch_to_tsquery مع صياغة المستخدم، بينما يتطلب to_tsquery عوامل صحيحة ولا ينبغي أن يستقبل نصاً غير موثوق.
أعد ترتيب المرشحين المسموح لهم فقط
يقرأ cross-encoder أو reranker آخر الاستعلام مع كل مرشح في الوقت نفسه، فيستطيع التمييز بين التطابقات المتقاربة أفضل من embedding واحد. لكنه يضيف حساباً ومرحلة متسلسلة. اجلب مجموعة محدودة، وطبق مرشحات tenant وrevision والحذف وACL قبل reranker، وأرسل الحقول اللازمة للترتيب فقط. لا ترسل صفوفاً غير مصرح بها إلى نموذج خارجي حتى لو كانت الإجابة النهائية ستحذفها.
احتفظ بالرتب المتجهية والمعجمية الأصلية للتشخيص. سجل معرّفات المرشحين، ونمط الفهرس، وإعدادات probes أو البحث، وإصدار reranker ومعرّفات النتائج النهائية مع إخفاء النص الحساس أو حمايته. يوضح دليل حقن prompt وأمان MCP أن النص المسترجع بيانات وليس تعليمات. قد يحتوي المستند على حقن، لذلك يجب أن يقول prompt التوليد إن المقاطع أدلة غير موثوقة ولا يمكنها تغيير الأدوات أو الصلاحيات أو قواعد النظام.
يجب أن تكون الاقتباسات بيانات
يجب أن يحيل كل اقتباس معروض إلى document_id وrevision وchunk_no وsource_uri وإزاحة أو عنوان المصدر المسترجع. اطلب من المولد إعادة معرّفات الاقتباس بجانب الادعاءات، ثم تحقق منها مقابل الصفوف نفسها التي أرسلت إلى السياق. اعرض عنوان المصدر وURL من قاعدة البيانات. احذف معرّفاً مجهولاً أو علّم الادعاء بأنه غير مدعوم. لا تسمح للنموذج بإنشاء URL من عنوان المستند وحده.
مرر سياقاً مجاوراً كافياً لشرح النتيجة، مع الحفاظ على معرّف كل مقطع. إذا دمجت مقاطع متجاورة للنموذج، احتفظ بأصل كل مقطع. عند تغير المصدر، يجب ألا يحيل الاقتباس إلى الإصدار القديم في الإجابة الحالية. وفي المجالات الحساسة، اعرض تاريخ الإصدار ونطاق الوصول وحالة صريحة «لا توجد إجابة» عند غياب الدليل.
قِس جودة الاسترجاع والإجابة منفصلتين
أنشئ مجموعة تقييم ذات إصدار من أسئلة حقيقية، ومستندات متوقعة، وحالات مقبولة بلا إجابة، وهويات مستأجرين، وتسميات ACL، ولغات. أدرج عمليات البحث الدقيقة وإعادة الصياغة والأسئلة متعددة الخطوات والأسئلة عن مستندات قديمة والطلبات العدائية. احتفظ بمجموعة اختبار خاصة حتى لا تفرط في ملاءمة أمثلة التطوير.
في الاسترجاع قِس recall@k عند عدة cutoffs، وreciprocal rank أو nDCG لترتيب النتائج، ونسبة النتائج التي تحترم عقد التفويض. وفي التوليد قِس دقة الادعاءات المؤسَّسة، ودقة الاقتباسات وتغطيتها، واكتمال الإجابة، وجودة الرفض، ومعايرة حالة عدم الإجابة. تبقى المراجعة البشرية مفيدة للأسئلة الغامضة. قارن البحث الدقيق مع HNSW أو IVFFlat على snapshot واحد لتحديد فقدان recall بدلاً من تخمينه من latency.
شغّل اختبارات أمن سلبية. يجب ألا يحصل مستخدم على سر معروف لمستأجر آخر، ويجب أن يظهر تغيير ACL في الطلب التالي، ويجب ألا يظهر المستند المحذوف حتى مباشرة بعد الحذف. لا يعوض score إجابة جيد عن تسريب مقطع واحد. سجل مع كل نتيجة تقييم نموذج embedding وإصدار التقسيم وإعدادات الفهرس وإصدار reranker وإصدار prompt وإصدار corpus، حتى يكون سبب التراجع قابلاً لإعادة الإنتاج.
اجعل التحديثات والحذف آمنين وقابلين للملاحظة
استخدم hash للمحتوى لجعل ingestion متكرراً بأمان. حلل المستند وقسمه وأنشئ embeddings على دفعات، ثم اكتب الإصدار الجديد قبل تحريك مؤشر المستند. يمكن أن يكون تبديل المؤشر معاملة قصيرة، فيرى القارئ الإصدار القديم الكامل أو الجديد الكامل. خزّن نموذج embedding في كل صف وجدول backfill عند تغييره. لا تخلط متجهات بأبعاد مختلفة في عمود واحد.
BEGIN;
SELECT set_config('app.tenant_id', $1::text, true);
INSERT INTO rag_chunks (
tenant_id, document_id, revision, chunk_no, title, content,
source_start, source_end, acl, embedding, embedding_model
)
VALUES ($1::uuid, $2::uuid, $3::bigint, $4::integer, $5::text, $6::text,
$7::integer, $8::integer, $9::text[], $10::vector, $11::text)
ON CONFLICT (tenant_id, document_id, revision, chunk_no) DO UPDATE
SET title = EXCLUDED.title,
content = EXCLUDED.content,
source_start = EXCLUDED.source_start,
source_end = EXCLUDED.source_end,
acl = EXCLUDED.acl,
embedding = EXCLUDED.embedding,
embedding_model = EXCLUDED.embedding_model,
updated_at = now();
INSERT INTO rag_documents (
tenant_id, document_id, current_revision, source_uri, deleted_at
)
VALUES ($1::uuid, $2::uuid, $3::bigint, $12::text, NULL)
ON CONFLICT (tenant_id, document_id) DO UPDATE
SET current_revision = EXCLUDED.current_revision,
source_uri = EXCLUDED.source_uri,
deleted_at = NULL;
COMMIT;
هذا مثال لإدخال مقطع واحد. يدرج loader الحقيقي كل مقاطع الإصدار قبل تحديث المؤشر ويتحقق من عدد الصفوف المتوقع. عند الحذف، اجعل المستند غير مرئي للاسترجاع أولاً عبر ضبط deleted_at داخل حد التفويض نفسه. احذف المقاطع فعلياً بعد مدة الاحتفاظ التي يطلبها المنتج وسياسة الامتثال. نظف الإصدارات القديمة على دفعات، وراقب dead tuples، وشغّل VACUUM (ANALYZE) عند الحاجة. بعد تدوير كثير قد يجعل HNSW عملية vacuum مكلفة. قد يقلل reindex المتزامن للفهرس المتأثر قبل vacuum الكلفة، لكن قس ذلك على الجدول الحقيقي.
ضع ميزانية للزمن والكلفة لكل مرحلة
تتبع p50 وp95 وp99 منفصلة لتطبيع الطلب وembedding والبحث المعجمي والبحث المتجهي والدمج وإعادة الترتيب والتوليد والتحقق من الاقتباسات. سجل كذلك عدد المرشحين والصفوف المستبعدة وعدد الرموز وإعادات المحاولة وإصابات cache. قد يخفي timeout من مزود embedding سرعة استعلام متجهي. وقد يصبح retriever الرخيص مكلفاً إذا أرسل مقاطع كثيرة إلى reranker أو المولد.
أنشئ document embeddings على دفعات وأعد المحاولة مع backoff محدود. خزن في cache الآثار المستقرة وغير الحساسة فقط، واجعل مفتاحها يتضمن إصدار النموذج والتطبيع ونطاق المستأجر. يحتاج cache ل embeddings الطلبات إلى مراجعة خصوصية، لأن تكرار الطلب قد يكشف اهتمام مستخدمين مختلفين. اختر HNSW أو IVFFlat حسب recall المقاس والذاكرة ووقت البناء وسلوك الكتابة وtail latency، لا حسب benchmark عام. اجعل حدود المرشحين وميزانية reranker قابلة للضبط لكل مسار أو مستأجر.
يجب أن تعرض لوحة الإنتاج معدل النتائج الفارغة، ومعدل الإجابات بلا اقتباس، وفشل التحقق من الاقتباس، ورفض ACL، وظهور الإصدارات القديمة، وحالة بناء الفهرس، وصحة vacuum، وعينات recall التقريبي مقابل الدقيق. هكذا ترتبط قابلية ملاحظة وكلاء الذكاء الاصطناعي بمجموعة تقييم وكلاء الذكاء الاصطناعي. أنشئ تنبيهات عند تغير هذه المعدلات، لا عند ارتفاع CPU قاعدة البيانات فقط.
تسلسل عملي للإطلاق
ابدأ ببحث متجهي دقيق وبحث نصي كامل في PostgreSQL على مجموعة صغيرة ممثلة. أضف مؤشر الإصدار وRLS قبل إدخال مستأجرين حقيقيين. ثبّت مجموعة تقييم معلّمة، ثم قارن HNSW وIVFFlat بالنتائج الدقيقة. أضف RRF وreranking والاقتباسات مرحلة بعد مرحلة حتى يكون لكل تغيير أثر قابل للقياس. قبل التوسع اختبر التحديثات والحذف وتغييرات ACL وإعادة استخدام connection pool وفشل بناء الفهارس.
تصف وثائق pgvector الرسمية أنواع المتجهات وعوامل المسافة وHNSW وIVFFlat والبحث المصفى وiterative scans والتقسيم والصيانة. وتغطي وثائق PostgreSQL البحث النصي الكامل، وفهارس GIN وGiST للنص، وسياسات أمان الصفوف، وإنشاء الفهارس، والتقسيم، وMVCC. يتبع SQL والمفاضلات أعلاه تلك الواجهات، ولا يدّعي نتيجة عالمية للزمن أو recall أو الكلفة.