PRODمنصة BaaS الأوروبية السياديةافتح لوحة المعلومات →

الذكاء الاصطناعي الأصلي · 8 دقيقة للقراءة

البرنامج التعليمي: إنشاء نقطة نهاية NL2SQL على Postgres

Affane Daylami · Fondateur · 28 أغسطس 2026

العودة إلى بلوق

يوضح هذا البرنامج التعليمي كيفية تلقي سؤال باللغة الفرنسية، وتحويله إلى استعلام SQL محدد ومتحقق من صحته، ثم إرجاع النتيجة - دون تنفيذ SQL غير محدد على الإطلاق. يتم عرض SQL الذي تم إنشاؤه بالفعل في كل خطوة، وليس فقط النتيجة النهائية.

تم إنشاء هذا النص الإنجليزي تلقائيًا من النص الأصلي الفرنسي ولم تتم مراجعته بعد.
تمت ترجمة هذه الصفحة تلقائيًا. النسخة الإنجليزية موثوقة.

يعد محرك NL2SQL الخاص بـ Aurabase جزءًا من الذكاء الاصطناعي الأصليالمدمج في الواجهة الخلفية: وليس خدمة خارجية يتم تجميعها معًا. المتطلبات الأساسية لاتباع هذا الدليل: مشروع Aurabase موجود، ومخطط قاعدة بيانات بسيط للمثال، ومفتاح واجهة برمجة تطبيقات المشروع.

#
الهدف

ماذا ستبني

نقطة نهاية تتلقى سؤالاً باللغة الطبيعية، وتحوله إلى استعلام SQL محدد ومتحقق من صحته، ثم تقوم بإرجاع النتيجة. لا يقوم المحرك أبدًا بتنفيذ SQL الذي تم إنشاؤه بدون تحكم: كل استعلام يمر عبر التحقق النحوي قبل الوصول إلى قاعدة البيانات.

معلومات

يستخدم هذا البرنامج التعليمي @aurabase/aurabase-js JavaScript SDK ومكالمة HTTP الأولية المكافئة، حتى تتمكن من المتابعة من أي لغة.

#
تحت غطاء محرك السيارة

كيف يعمل محرك NL2SQL

يمر السؤال من خلال LLM مهيأ - OpenAI، أو Anthropic (Claude) أو Gemini، المزودين الأصليين الثلاثة - والذي يقوم بإنشاء SQL مرشح. لا يتم تنفيذ SQL هذا أبدًا كما هو: فهو يمر عبر أداة التحقق التي توزع شجرة بناء الجملة الخاصة بها (sqlparser)، وتسمح فقط باستعلامات SELECT البسيطة، وتضيف LIMIT محدودة إذا كان أحدها مفقودًا.

يرفض المدقق صراحةً CTE/WITH والاستعلامات الفرعية والاتحادات وعبارات القفل (FOR UPDATE) وأي وظيفة خارج القائمة البيضاء (count, sum, avg, min, max, lower, upper, coalesce، date_trunc، now). يتم دعم عمليات الانضمام للجداول المتعددة.

سؤال ← LLM (OpenAI/Claude/Gemini) ← التحقق من صحة AST (sqlparser) ← Bounded LIMIT ← تنفيذ SELECT

لا يتم توفير المخطط الذي تم الاستعلام عنه أبدًا من خلال طلبك: فهو يتم استبطانه من القاعدة الحقيقية للمشروع. يتم رفض الحقل schemaأو allowed_schema أو schema_context المرسل في نص الطلب بشكل صريح (خطأ 400) بدلاً من تجاهله بصمت - الخادم وحده هو الذي يقرر ما هو موجود بالفعل.

#
الخطوة 1

قم بتكوين نقطة نهاية NL2SQL

باستخدام JavaScript SDK، يكشف عميل Aurabase عن aura.ai.nl2sql(). التوقيع هو nl2sql(question, options): المخطط ليس جزءًا منه، بل يتم استبطانه من جانب الخادم.

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.nl2sql(
    question,
    { limit: 50 }
  )

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

في HTTP الخام، نقطة النهاية هي POST /v1/ai/{project_id}/nl2sql، والتي تمت مصادقتها بواسطة مفتاح واجهة برمجة تطبيقات المشروع.

terminalbash
curl -X POST https://<votre-gateway>/v1/ai/<project_id>/nl2sql \
  -H "apikey: <votre-cle-api>" \
  -H "Content-Type: application/json" \
  -d '{
    "question": "Combien de commandes ont été passées ce mois-ci par des clients premium ?",
    "limit": 50
  }'
الحقول التي رفضها الخادم

لا ترسل schemaأو allowed_schemaأو schema_context في نص الطلب: يتم تحديد المخطط الذي تم الاستعلام عنه بواسطة الخادم، ويتم رفض هذه الحقول صراحةً (400) بدلاً من الكتابة فوقها بصمت.

#
الخطوة 2

اختبار مع سؤال حقيقي باللغة الفرنسية

تم إرسال السؤال: "كم عدد الطلبات التي تم تقديمها هذا الشهر من قبل العملاء المميزين؟". فيما يلي نموذج SQL الذي تم تقديمه بالفعل (تعتمد أسماء الجداول والأعمدة على مخططك):

الرد (مقتطف)json
{
  "data": {
    "sql": "SELECT count(*) FROM orders WHERE customer_plan = 'premium' AND created_at >= date_trunc('month', now()) LIMIT 50",
    "explanation": "Compte les commandes de ce mois pour les clients premium.",
    "confidence": 0.85,
    "tables": ["orders"],
    "columns": ["customer_plan", "created_at"],
    "limit": 50,
    "limit_injected": false
  },
  "meta": null
}

يشير limit_injected إلى ما إذا كان LIMIT يأتي من القالب أو تمت إضافته بواسطة الخادم. confidence هو إرشادي لشكل الاستجابة (كتلة SQL جيدة التكوين أم لا) - وليس مقياسًا للصحة الدلالية لـ SQL التي تم إنشاؤها. يُرجع السؤال ذو الصياغة السيئة خطأً صريحًا بدلاً من SQL المهووس: على سبيل المثال، إذا كان SQL الذي تم إنشاؤه يستعلم عن جدول غير موجود في المخطط الخاص بك، فستقوم الرسالة بتسمية الجداول المتوفرة بالفعل.

#
الخطوة 3

تأمين الإنتاج

ثلاث عمليات تحقق قبل النشر: هل سقف الصف (LIMIT) متكيف مع وحدة التخزين الخاصة بك، وهل يظل دور Postgres الذي يستخدمه المحرك مقيدًا بمخطط المشروع، وهل تحتوي الجداول الحساسة على سياسة RLS نشطة - يستعلم NL2SQL عن نفس قاعدة البيانات مثل بقية التطبيق الخاص بك، وليس لديه حقوق وصول موسعة بشكل افتراضي.

  • الحد الأقصى للخط الافتراضي قابل للتكوين من جانب الخادم؛ يتم رفض القيمة المطلوبة أعلى من الحد الأقصى للخادم بشكل صريح بدلاً من تقليلها بصمت.
  • تم حظر الوصول إلى كتالوج النظام (pg_catalog, information_schema) والمخططات غير المتعلقة بالمشروع بواسطة أداة التحقق، بغض النظر عن سياسات RLS الخاصة بك.
  • يظل RLS هو خط دفاعك الأخير في الجداول الحساسة: يقوم المدقق بتحديد شكل SQL، وليس حقوق العمل على البيانات.
#
الصدق

الحدود الحالية التي يجب أن تكون على علم بها

المحرك قابل للقراءة بدقة: يتم قبول طلبات SELECT فقط. يتم رفض أي محاولة لإنشاءINSERTأو UPDATEأو DELETEأو DROPأو CREATE أو ALTER بواسطة القالب قبل التنفيذ - هذه ليست اصطلاحًا سريعًا، إنها قاعدة مفروضة على مستوى شجرة بناء الجملة.

الحدود الهيكلية الأخرى: لا توجد استعلامات فرعية، ولا CTE/WITH، ولا UNION، وقائمة بيضاء مغلقة مكونة من عشر وظائف SQL. السؤال الذي يستدعي بشكل طبيعي استعلامًا فرعيًا ("العملاء الذين لم يطلبوا مطلقًا") يجب إعادة صياغته ليتناسب مع SELECTالبسيط، أو التعامل معه بشكل مختلف من جانب التطبيق.

#
اذهب أبعد من ذلك

RAG والوكلاء

يغطي NL2SQL الأسئلة المنظمة حول بياناتك العلائقية. بالنسبة للأسئلة حول المحتوى غير المنظم (المستندات والملاحظات والتذاكر)، يعتمد RAG الأصلي لـ Aurabase على pgvector وبحث HNSW. تم تفصيل كلتا الإمكانيتين – وكيفية دمجهما في وكيل – في Native AI على صفحة Postgres.

#
الأسئلة المتداولة

الأسئلة الشائعة

هل يعمل NL2SQL مع مخطط معقد (صلات متعددة)؟+
يتم دعم عمليات ربط الجداول المتعددة بواسطة أداة التحقق من الصحة. من ناحية أخرى، يتم رفض الاستعلامات الفرعية وCTE/WITH بشكل صريح: يجب إعادة صياغة السؤال الذي يستدعي بشكل طبيعي استعلامًا فرعيًا ليتناسب مع تحديد بسيط مع الصلات، أو التعامل معه بطريقة أخرى على جانب التطبيق.
ما هو مزود LLM الذي يجب اختياره لـ NL2SQL؟+
يتم التعامل مع مقدمي الخدمة الأصليين الثلاثة (OpenAI، وAnthropic/Claude، وGemini) على قدم المساواة من قبل المدقق: لا يتمتع أي منهم بميزة هيكلية في التحقق من صحة SQL التي تم إنشاؤها. تعتمد التكلفة ووقت الاستجابة على النموذج المحدد الذي تم تكوينه لمشروعك - قارنهما حسب الحجم الخاص بك بدلاً من اتباع توصية عامة.

هل أنت جاهز للنشر؟

الواجهة الخلفية الخاصة بك في خمس دقائق.

لا حاجة لبطاقة ائتمان · 500 ميجابايت مجانًا · 50000 MAU