بناء استعلامات SQL باستخدام الذكاء الاصطناعي | أصلي، ترجم بواسطة AI
مخطط قاعدة البيانات (PostgreSQL):
CREATE TABLE users (
id SERIAL PRIMARY KEY,
username VARCHAR(50) UNIQUE NOT NULL,
email VARCHAR(255) UNIQUE NOT NULL,
password_hash VARCHAR(255) NOT NULL,
first_name VARCHAR(100),
last_name VARCHAR(100),
date_of_birth DATE,
gender VARCHAR(10),
phone_number VARCHAR(20),
address TEXT,
city VARCHAR(100),
state VARCHAR(100),
country VARCHAR(100),
zip_code VARCHAR(20),
created_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP WITH TIME ZONE,
last_login TIMESTAMP WITH TIME ZONE,
is_active BOOLEAN DEFAULT TRUE,
role VARCHAR(50),
profile_picture_url VARCHAR(255),
bio TEXT,
failed_login_attempts INTEGER DEFAULT 0,
account_balance NUMERIC(10, 2) DEFAULT 0.00
);
الجدول أعلاه هو قاعدة بيانات PostgreSQL، والجدول أدناه هو تعريف الجدول. إليك تعليمات استعلام اللغة الطبيعية.
أريد الحصول على بعض المستخدمين الذين اسمهم الأول هو “أندي”، تم إنشاؤهم في اليوم الماضي من الشهر الماضي، والذين يبلغون من العمر 20 عامًا في عام 2025، والذين تم تسجيل دخولهم الأخير في الأسبوع الماضي، أعطني الاستعلام SQL للحصول على مثل هذه المستخدمين.
استعلام SQL المولد:
SELECT *
FROM users
WHERE first_name ILIKE 'andy'
AND CAST(created_at AS DATE) BETWEEN
(CURRENT_DATE - INTERVAL '1 MONTH' - INTERVAL '1 DAY')
AND
(CURRENT_DATE - INTERVAL '1 MONTH' + INTERVAL '1 DAY')
AND EXTRACT(YEAR FROM AGE(date_of_birth)) = 20
AND last_login >= CURRENT_TIMESTAMP - INTERVAL '7 DAYS';
أدناه هو تعريف جدول PostgreSQL لجدول conversations
يمكن استخدامه لتتبع تفاعلات المستخدمين مع نظام ذكاء اصطناعي مثل Grok. تم تصميم الجدول لتتبع المحادثات، بما في ذلك المستخدمين المعنيين، محتوى المحادثة، التوقيتات، والمعلومات ذات الصلة.
CREATE TABLE conversations (
id SERIAL PRIMARY KEY,
user_id INTEGER NOT NULL,
title VARCHAR(255),
conversation_type VARCHAR(50) DEFAULT 'chat',
started_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP,
ended_at TIMESTAMP WITH TIME ZONE,
status VARCHAR(50) DEFAULT 'active',
message_count INTEGER DEFAULT 0,
last_message_at TIMESTAMP WITH TIME ZONE,
is_archived BOOLEAN DEFAULT FALSE,
ai_model_version VARCHAR(100),
total_tokens_used INTEGER DEFAULT 0,
created_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP WITH TIME ZONE,
FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE
);
الشرح:
- id: معرف فريد لكل محادثة.
- user_id: يربط الجدول
users
للمحادثة بمستخدم معين. - title: عنوان اختياري للمحادثة (مثلًا، ملخص محدد من قبل المستخدم أو مولد تلقائيًا).
- conversation_type: يشير إلى نوع المحادثة (مثلًا، ‘chat’، ‘query’، ‘voice’).
- started_at: التوقيت الذي بدأت فيه المحادثة.
- ended_at: التوقيت الذي انتهت فيه المحادثة (قابل للعدم إذا كانت مستمرة).
- status: تتبع حالة المحادثة (مثلًا، ‘active’، ‘completed’، ‘paused’).
- message_count: تتبع عدد الرسائل التي تم تبادلها في المحادثة.
- last_message_at: التوقيت للرسالة الأخيرة.
- is_archived: مؤشر منطقي يشير إلى ما إذا كانت المحادثة محفوظة.
- ai_model_version: تخزين نسخة نموذج الذكاء الاصطناعي المستخدمة (مثلًا، ‘Grok 3’).
- total_tokens_used: تتبع استخدام الرموز للمحادثة (مفيد للتصفية أو التحليل).
- created_at و updated_at: التوقيت الذي تم فيه إنشاء سجل المحادثة وتحديثه.
- FOREIGN KEY: يضمن سلامة الارتباط مع جدول
users
، معON DELETE CASCADE
لحذف المحادثات إذا تم حذف المستخدم المرتبط.
تم تصميم هذا الجدول ليكون مرنًا ويمكن توسيعه حسب الحاجة، مثل تخزين الرسائل الفردية في جدول منفصل messages
أو إضافة حقول لتحليل المشاعر أو Tags للمحادثة. أخبرني إذا كنت بحاجة إلى جدول مرتبط (مثلًا، للرسائل) أو استعلام للتفاعل مع هذا الجدول!
لتمكين واجهة المستخدم التي يمكن للمستخدمين من خلالها استعلام محادثاتهم باستخدام اللغة الطبيعية (مثلًا، “أعطني آخر 5 محادثات” أو “المحادثات التي تحتوي عنوانها على كلمة عن جافا”)، يجب التأكد من أن استعلام SQL يقيد النتائج للمحادثات الخاصة بالمستخدم المصرح له. وهذا يتضمن دمج هوية المستخدم (مثلًا، user_id
) في الاستعلام وتحويل اللغة الطبيعية إلى شروط SQL. أدناه تعليمات واستعلامات SQL المقابلة للجدول conversations
، مع التأكد من أن المستخدمين يمكنهم الوصول فقط إلى بياناتهم الخاصة.
الاعتبارات الرئيسية
- المصادقة: يجب أن يرسل الواجهة الأمامية معرف المستخدم المصرح له (e.g.,
user_id
) إلى الخلفية لتصفية المحادثات. - تحويل اللغة الطبيعية: يتم تحليل الإدخال الطبيعي لتحديد الشروط الرئيسية (مثلًا، “الأحدث 5” أو “العنوان يحتوي على كلمة جافا”).
- الأمان: دائمًا تصفية حسب
user_id
لمنع المستخدمين من الوصول إلى محادثات الآخرين. - المرجع الجدول: باستخدام الجدول
conversations
المحدد أعلاه.
تعليمات اللغة الطبيعية واستعلامات SQL
تعليمات 1: “أعطني آخر 5 محادثات”
المتطلبات المحللة:
- تصفية المحادثات حسب معرف المستخدم المصرح له
user_id
. - ترتيب حسب
started_at
(أوlast_message_at
للحداثة) تنازليًا. - حد النتائج إلى 5 نتائج.
استعلام SQL:
SELECT *
FROM conversations
WHERE user_id = :authenticated_user_id
ORDER BY started_at DESC
LIMIT 5;
:authenticated_user_id
هو محلل لمعرف المستخدم المسجل، المرسل بأمان من الواجهة الأمامية/الخلفية.started_at DESC
يضمن أن المحادثات الأحدث يتم إرجاعها.LIMIT 5
يقيد الإخراج إلى 5 محادثات.
تعليمات 2: “المحادثات التي تحتوي عنوانها على كلمة عن جافا”
المتطلبات المحللة:
- تصفية المحادثات حسب معرف المستخدم المصرح له
user_id
. - البحث عن المحادثات التي تحتوي عنوانها على “جافا” (غير حساس للحروف الكبيرة).
- استخدام
ILIKE
للمطابقة الجزئية وغير الحساسة للحروف الكبيرة في PostgreSQL.
استعلام SQL:
SELECT *
FROM conversations
WHERE user_id = :authenticated_user_id
AND title ILIKE '%java%';
:authenticated_user_id
يضمن أن يتم استعلام محادثات المستخدم فقط.ILIKE '%java%'
تطابق العناوين التي تحتوي على “جافا” (مثلًا، “نصائح جافا”، “حول برمجة جافا”).
ملاحظات التنفيذ للواجهة الأمامية
- المصادقة:
- يجب أن يرسل الواجهة الأمامية معرف المستخدم المسجل (مثلًا، من رمز JWT أو جلسة) إلى واجهة برمجة التطبيقات الخلفية.
- يجب أن يتحقق الخلفية من
user_id
ويستخدمها في شرطWHERE
لتصفية النتائج.
- معالجة اللغة الطبيعية:
- استخدام محلل بسيط قائم على القواعد أو نموذج ذكاء اصطناعي (مثل Grok) لفهم استعلام اللغة الطبيعية واستخراج:
- النية: قائمة المحادثات.
- المرشحات: الكلمات الرئيسية (مثلًا، “جافا”)، الترتيب (مثلًا، “الأحدث”)، أو الحدود (مثلًا، “5”).
- على سبيل المثال، تحويل “الأحدث 5” إلى
ORDER BY started_at DESC LIMIT 5
و”العنوان يحتوي على كلمة جافا” إلىtitle ILIKE '%java%'
.
- استخدام محلل بسيط قائم على القواعد أو نموذج ذكاء اصطناعي (مثل Grok) لفهم استعلام اللغة الطبيعية واستخراج:
- تصميم واجهة برمجة التطبيقات:
- إنشاء نقطة نهاية (مثلًا،
/api/conversations
) التي تقبل:user_id
: من الجلسة المصادقة.query
: الإدخال الطبيعي أو المعلمات المهيأة (مثلًا،{ filter: "title contains java" }
).
- يتحول الخلفية الاستعلام إلى SQL، مع التأكد من أن
user_id
يتم تضمينه دائمًا في شرطWHERE
.
- إنشاء نقطة نهاية (مثلًا،
- الأمان:
- لا تتيح أبدًا للمستخدمين إدخال SQL مباشرة أو تعديل مرشح
user_id
. - استخدام استعلامات معلمة (مثلًا،
:authenticated_user_id
) لمنع حقن SQL. - التحقق من المدخلات لتجنب الأنماط الخبيثة في عمليات البحث
ILIKE
.
- لا تتيح أبدًا للمستخدمين إدخال SQL مباشرة أو تعديل مرشح
- عرض الواجهة الأمامية:
- إرجاع الحقول مثل
id
،title
،started_at
،last_message_at
، وstatus
لعرض قائمة المحادثات. - السماح بالخيارات الترتيب أو التصفية في واجهة المستخدم (مثلًا، قوائم منسدلة لـ “الأحدث” أو إدخال نصي للبحث في العنوان).
- إرجاع الحقول مثل
مثال سير العمل
- يتسجل المستخدم، ويسترجع الواجهة الأمامية معرفه
user_id
(مثلًا،123
). - يكتب المستخدم “أعطني آخر 5 محادثات” في شريط البحث.
- يرسل الواجهة الأمامية طلبًا إلى الخلفية:
/api/conversations?user_id=123&query=latest 5
. - يحلل الخلفية الاستعلام، ويولد SQL:
SELECT * FROM conversations WHERE user_id = 123 ORDER BY started_at DESC LIMIT 5;
- يرسل الخلفية النتائج كJSON، ويظهر الواجهة الأمامية المحادثات.
ملاحظات إضافية
- إذا كان
title
قابلًا للعدم، أضفAND title IS NOT NULL
إلى الاستعلام الثاني لتجنب مطابقة العناوين القابلة للعدم. - للمستعلامات الأكثر تعقيدًا (مثلًا، “المحادثات عن جافا من الأسبوع الماضي”)، قم بدمج الشروط:
SELECT * FROM conversations WHERE user_id = :authenticated_user_id AND title ILIKE '%java%' AND started_at >= CURRENT_TIMESTAMP - INTERVAL '7 DAYS';
- إذا كنت بحاجة إلى محلل لغة طبيعية أكثر تقدمًا، فكر في دمج نموذج ذكاء اصطناعي (مثل Grok عبر واجهة برمجة التطبيقات لـ xAI) لتحويل الاستعلامات المعقدة إلى SQL. للحصول على تفاصيل واجهة برمجة التطبيقات، زور xAI API.
أخبرني إذا كنت بحاجة إلى مساعدة في كود الواجهة الأمامية، أو إعداد واجهة برمجة التطبيقات الخلفية، أو أمثلة استعلامات إضافية!