اليوم، أصبح دمج الميزات المدعومة بالذكاء الاصطناعي، وخاصة الاستفادة من نماذج اللغات الكبيرة (LLMs)، منتشرًا بشكل متزايد عبر مهام مختلفة مثل إنشاء النص، والتصنيف، والتحويل من صورة إلى نص، وتحويلات من صورة إلى صورة، وما إلى ذلك.

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

ماذا لو كان بإمكانك الحصول على رؤى رائعة من مجموعة البيانات الخاصة بك دون التعمق في البرمجة؟ للحصول على معلومات قيمة، سيحتاج المرء إلى صياغة متخصصة SELECT البيان، مع الأخذ في الاعتبار الأعمدة التي سيتم عرضها، والجدول المصدر، وشروط التصفية للصفوف المحددة، وطرق التجميع، وتفضيلات الفرز. يتضمن هذا النهج التقليدي سلسلة من الأوامر: SELECT, FROM, WHERE, GROUP، و ORDER.

ولكن ماذا لو لم تكن مطورًا متمرسًا وما زلت ترغب في الاستفادة من قوة بياناتك؟ في مثل هذه الحالات، يصبح طلب المساعدة من متخصصي SQL أمرًا ضروريًا، مما يسلط الضوء على الفجوة في إمكانية الوصول وسهولة الاستخدام.

هذا هو المكان الذي تتدخل فيه التطورات الرائدة في مجال الذكاء الاصطناعي وتكنولوجيا LLM لسد الفجوة. تخيل أنك تتحدث مع بياناتك دون عناء، وذلك ببساطة من خلال تحديد احتياجاتك من المعلومات بلغة واضحة وجعل النموذج يترجم طلبك إلى استعلام.

وفي الأشهر الأخيرة، تم تحقيق خطوات كبيرة في هذا المجال. كشفت MotherDuck وNumbers Station عن أحدث ابتكاراتهما: DuckDB-NSQL-7B، وهو برنامج LLM متطور مصمم خصيصًا لـ DuckDB SQL. ما هي مهمة هذا النموذج؟ لتمكين المستخدمين من الحصول على الرؤى من بياناتهم دون عناء.

في البداية تم ضبط DuckDB-NSQL-7B من نموذج Llama-2–7b الأصلي الخاص بـ Meta باستخدام مجموعة بيانات واسعة تغطي استعلامات SQL العامة، وخضع لمزيد من التحسين باستخدام أزواج DuckDB لتحويل النص إلى SQL. والجدير بالذكر أن قدراتها تمتد إلى ما هو أبعد من الصياغة SELECT تصريحات؛ يمكنه إنشاء مجموعة واسعة من عبارات DuckDB SQL الصالحة، بما في ذلك الوثائق والامتدادات الرسمية، مما يجعله أداة متعددة الاستخدامات لاستكشاف البيانات وتحليلها.

في هذه المقالة، سوف نتعلم كيفية التعامل مع مهام text2sql باستخدام نموذج DuckDB-NSQL-7B، وواجهة برمجة تطبيقات Hugging Face dataset viewer لملفات الباركيه، وDuckdb لاسترجاع البيانات.


تدفق النص2sql

كيفية استخدام النموذج

  • استخدام معانقة الوجه transformers خط أنابيب
from transformers import pipeline

pipe = pipeline("text-generation", model="motherduckdb/DuckDB-NSQL-7B-v0.1")
  • استخدام رمزية المحولات والنموذج
from transformers import AutoTokenizer, AutoModelForCausalLM

tokenizer = AutoTokenizer.from_pretrained("motherduckdb/DuckDB-NSQL-7B-v0.1")
model = AutoModelForCausalLM.from_pretrained("motherduckdb/DuckDB-NSQL-7B-v0.1")
  • استخدام llama.cpp لتحميل النموذج فيه GGUF
from llama_cpp import Llama

llama = Llama(
       model_path="DuckDB-NSQL-7B-v0.1-q8_0.gguf", 
       n_gpu_layers=-1,
)

الهدف الرئيسي من llama.cpp هو تمكين استدلال LLM مع الحد الأدنى من الإعداد والأداء المتطور على مجموعة واسعة من الأجهزة – محليًا وفي السحابة. سوف نستخدم هذا النهج.

Hugging Face Dataset Viewer API لأكثر من 120 ألف مجموعة بيانات

تعد البيانات عنصرًا حاسمًا في أي مسعى للتعلم الآلي. يعد Hugging Face موردًا قيمًا، حيث يتيح الوصول إلى أكثر من 120.000 مجموعة بيانات مجانية ومفتوحة تغطي تنسيقات مختلفة، بما في ذلك ملفات CSV وParquet وJSON وملفات الصوت والصور.

تأتي كل مجموعة بيانات يستضيفها Hugging Face مجهزة بعارض بيانات شامل. يوفر هذا العارض للمستخدمين الوظائف الأساسية مثل الرؤى الإحصائية وتقييم حجم البيانات وإمكانيات البحث عن النص الكامل وخيارات التصفية الفعالة. تعمل هذه الواجهة الغنية بالميزات على تمكين المستخدمين من استكشاف مجموعات البيانات وتقييمها بسهولة، مما يسهل اتخاذ القرارات المستنيرة خلال سير عمل التعلم الآلي.

في هذا العرض التوضيحي، سنستخدم مجموعة البيانات الجغرافية للمدن العالمية.

عارض مجموعة البيانات
عارض مجموعة البيانات لمجموعة البيانات الجغرافية للمدن العالمية

خلف الكواليس، تتم معالجة كل مجموعة بيانات في Hub بواسطة واجهة برمجة تطبيقات Hugging Face dataset viewer، والتي تحصل على معلومات مفيدة وتقدم وظائف مثل:

  • قائمة مجموعة البيانات الانقسامات وأسماء الأعمدة وأنواع البيانات
  • احصل على مجموعة البيانات مقاس (في عدد الصفوف أو البايتات)
  • تحميل وعرض الصفوف في أي فهرس في مجموعة البيانات
  • يبحث كلمة في مجموعة البيانات
  • فلتر الصفوف بناءً على سلسلة استعلام
  • كن ثاقبًا إحصائيات حول البيانات
  • الوصول إلى مجموعة البيانات باسم ملفات الباركيه لاستخدامها في إطار المعالجة أو التحليلات المفضل لديك

في هذا العرض التوضيحي، سوف نستخدم الوظيفة الأخيرة، وهي ملفات الباركيه المحولة تلقائيًا.

إنشاء استعلامات SQL من التعليمات النصية

أولاً، قم بتنزيل إصدار النماذج الكمية من DuckDB-NSQL-7B-v0.1

نموذج التحميل
تحميل النموذج

بدلا من ذلك، يمكنك تنفيذ التعليمات البرمجية التالية:

huggingface-cli download motherduckdb/DuckDB-NSQL-7B-v0.1-GGUF DuckDB-NSQL-7B-v0.1-q8_0.gguf --local-dir . --local-dir-use-symlinks False

الآن، لنقم بتثبيت التبعيات المطلوبة:

pip install llama-cpp-python
pip install duckdb

بالنسبة لنموذج تحويل النص إلى SQL، سنستخدم موجهًا بالبنية التالية:

   ### Instruction:
   Your task is to generate valid duckdb SQL to answer the following question.
   ### Input:
   Here is the database schema that the SQL query will run on:
   {ddl_create}
  
   ### Question:
   {query_input}
   ### Response (use duckdb shorthand if possible):
  • ddl_create سيكون مخطط مجموعة البيانات باعتباره SQL CREATE يأمر
  • query_input ستكون تعليمات المستخدم معبر عنها باللغة الطبيعية

لذلك، نحتاج إلى إخبار النموذج بمخطط مجموعة بيانات Hugging Face. من أجل ذلك، سنحصل على أول ملف باركيه لمجموعة بيانات jamescalam/world-cities-geo:

GET https://huggingface.co/api/datasets/jamescalam/world-cities-geo/parquet
{
   "default":{
      "train":[
         "https://huggingface.co/api/datasets/jamescalam/world-cities-geo/parquet/default/train/0.parquet"
      ]
   }
}

يتم استضافة ملف الباركيه في Hugging Face viewer ضمن refs/convert/parquet المراجعة:

ملف الباركيه
ملف الباركيه

  • قم بمحاكاة إنشاء جدول DuckDB من الصف الأول من ملف الباركيه
import duckdb
con = duckdb.connect()
con.execute(f"CREATE TABLE data as SELECT * FROM '{first_parquet_url}' LIMIT 1;")

result = con.sql("SELECT sql FROM duckdb_tables() where table_name="data";").df()
ddl_create = result.iloc[0,0]
con.close()

ال CREATE مخطط DDL هو:

CREATE TABLE "data"(
    city VARCHAR, 
    country VARCHAR, 
    region VARCHAR,
    continent VARCHAR, 
    latitude DOUBLE, 
    longitude DOUBLE, 
    x DOUBLE, 
    y DOUBLE, 
    z DOUBLE
);

وكما ترى، فهو يطابق الأعمدة الموجودة في عارض مجموعة البيانات:

أعمدة مجموعة البيانات
أعمدة مجموعة البيانات

  • الآن، يمكننا بناء الموجه باستخدام ddl_create و استفسار مدخل
prompt = """### Instruction:
   Your task is to generate valid duckdb SQL to answer the following question.
   ### Input:
   Here is the database schema that the SQL query will run on:
   {ddl_create}
  
   ### Question:
   {query_input}
   ### Response (use duckdb shorthand if possible):
   """

إذا كان المستخدم يريد معرفة مدن من دولة ألبانيا، سيبدو الموجه كما يلي:

query = "Cities from Albania country"
prompt = prompt.format(ddl_create=ddl_create, query_input=query)

وبالتالي فإن المطالبة الموسعة التي سيتم إرسالها إلى LLM تبدو كما يلي:

### Instruction:
Your task is to generate valid duckdb SQL to answer the following question.

### Input:
Here is the database schema that the SQL query will run on:
CREATE TABLE "data"(city VARCHAR, country VARCHAR, region VARCHAR, continent VARCHAR, latitude DOUBLE, longitude DOUBLE, x DOUBLE, y DOUBLE, z DOUBLE);
  
### Question:
Cities from Albania country

### Response (use duckdb shorthand if possible):
  • لقد حان الوقت لإرسال المطالبة إلى النموذج
from llama_cpp import Llama

llm = Llama(
       model_path="DuckDB-NSQL-7B-v0.1-q8_0.gguf",
       n_ctx=2048,
       n_gpu_layers=50
   )
pred = llm(prompt, temperature=0.1, max_tokens=1000)
sql_output = pred["choices"][0]["text"]

سيشير أمر SQL الناتج إلى أ data الجدول، ولكن بما أنه ليس لدينا طاولة حقيقية ولكن مجرد إشارة إلى ملف الباركيه، فإننا سوف نستبدل كل شيء data الأحداث من قبل first_parquet_url:

sql_output = sql_output.replace("FROM data", f"FROM '{first_parquet_url}'")

وسيكون الناتج النهائي:

SELECT city FROM 'https://huggingface.co/api/datasets/jamescalam/world-cities-geo/parquet/default/train/0.parquet' WHERE country = 'Albania'
  • الآن، حان الوقت أخيرًا لتنفيذ SQL التي تم إنشاؤها مباشرة في مجموعة البيانات، لذلك، دعونا نستخدم صلاحيات DuckDB مرة أخرى:
con = duckdb.connect()
try:
   query_result = con.sql(sql_output).df()
except Exception as error:
   print(f"❌ Could not execute SQL query {error=}")
finally:
   con.close()

وهنا لدينا النتائج (100 صف):

نتيجة أمر SQL
نتيجة التنفيذ (100 صف)

دعونا نقارن هذه النتيجة مع عارض مجموعة البيانات باستخدام “وظيفة البحث” لـ ألبانيا البلد، ينبغي أن يكون هو نفسه:

نتيجة البحث
نتائج البحث عن دولة ألبانيا

يمكنك أيضًا الحصول على نفس النتيجة التي تتصل مباشرة بواجهة برمجة تطبيقات البحث أو التصفية:

import requests
API_URL = "https://datasets-server.huggingface.co/search?dataset=jamescalam/world-cities-geo&config=default&split=train&query=Albania"
def query():
    response = requests.get(API_URL)
    return response.json()
data = query()
import requests
API_URL = "https://datasets-server.huggingface.co/filter?dataset=jamescalam/world-cities-geo&config=default&split=train&where=country='Albania'"
def query():
    response = requests.get(API_URL)
    return response.json()
data = query()

سيكون العرض التوضيحي النهائي الخاص بنا عبارة عن مساحة Hugging Face التي تبدو كما يلي:


يمكنك رؤية دفتر الملاحظات الذي يحتوي على الرمز هنا.

ومساحة الوجه المعانقة هنا

شاركها.
اترك تعليقاً