برنامه نویسی

تبدیل متن به SQL: تولید SQL با Nebius AI Studio (قسمت 2)

Summarize this content to 400 words in Persian Lang
در پست قبل اسنادی را بر اساس جداول پایگاه داده Northwind Trader ایجاد کردیم. ما از مدل تعبیه‌سازی Nebius AI Studio برای بردار کردن اسناد و درج آنها در Postgres با پسوند برداری استفاده کردیم. این پست نحوه پرس و جو از پایگاه داده و استفاده از نتایج را در یک اعلان نشان می دهد. بیایید وارد کد شویم.

یک مشتری ساده

اسکریپت با نمونه سازی یک کلاینت Nebius و پارامترهای اتصال پایگاه داده شروع می شود.

API_KEY = os.environ.get(‘NEBIUS_API_KEY’)

conn = psycopg.connect(dbname=’rag’,user=”postgres”, autocommit=True)

client = OpenAI(
base_url=”https://api.studio.nebius.ai/v1/”,
api_key=API_KEY,
)

وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

را query تابع تعبیه‌ها را از پایگاه داده بازیابی می‌کند. برای تشکیل پرس و جو، دوباره از آن استفاده می کنیم create_vector تابع پرس و جو از شباهت کسینوس استفاده می کند. Pgvector روش های جستجوی برداری دیگری را ارائه می دهد.

def query(query_string):
vector = create_vector(query_string)
embedding_query = “[” + “,”.join(map(str, vector)) + “]”

# cosine similarity
query_sql = f”””
SELECT chunk, embedding <=>'{embedding_query}’ AS similarity
FROM items
ORDER BY embedding <=> ‘{embedding_query}’
LIMIT 20;
“””
data = conn.execute(query_sql).fetchall()
result=[] for row in data:
result.append(row[0])

return result

def create_vector(text):
embedding = client.embeddings.create(
model=”intfloat/e5-mistral-7b-instruct”,
input=text,
dimensions=1024,
encoding_format=”float”,
).data[0].embedding

return embedding

وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

نتیجه پایگاه داده هنگامی که به متن اضافه می شود، دستور OpenAI-style را افزایش می دهد. این اعلان به مدل Nebius Qwen2.5-Coder-7B-Instruct ارسال می شود که با SQL و سایر زبان های برنامه نویسی آموزش داده شده است.

def create_prompt(llm_query, database_results):
content_start = (
“Write a SQL statement using the database information provided.\n\n”+
“Context:\n”
)

content_end = (
f”\n\nQuestion: {llm_query}\nAnswer:”
)

content = (
content_start + “\n\n—\n\n”.join(database_results) +
content_end
)

prompt = [{‘role’: ‘user’, ‘content’: content }]

return prompt

def create_completion(prompt):

completion = client.chat.completions.create(
model = “Qwen/Qwen2.5-Coder-7B-Instruct”,
messages = prompt,
temperature=0.6
)

return completion.to_json()

وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

در مرحله بعد، یک پرس و جو به زبان انگلیسی می نویسیم: “تعداد تامین کنندگان را به ترتیب حروف الفبا بر اساس کشور فهرست کنید.” پرس و جو به پایگاه داده ارسال می شود تا جاسازی های قابل اجرا را بازیابی کند.

client_query = “List number of suppliers alphabetically by country.”
rag_results = query(client_query)
prompt = create_prompt(rag_query, rag_results)
response = json.loads(create_completion(prompt))

print(response[“choices”][0][“message”][“content”])

وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

جاسازی ها به دستور اضافه می شوند و مشتری موارد زیر را برمی گرداند.

To list the number of suppliers alphabetically by country, you can use the following SQL statement:

SELECT country, COUNT(*) AS number_of_suppliers
FROM suppliers
GROUP BY country
ORDER BY country;

This query performs the following actions:
– `SELECT country, COUNT(*) AS number_of_suppliers`: Selects the `country` column and counts the number of rows for each country.
– `FROM suppliers`: Specifies the table from which to retrieve the data.
– `GROUP BY country`: Groups the results by the `country` column.
– `ORDER BY country`: Orders the results alphabetically by the `country` column.

وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

برای راحتی، از pgAdmin یا ابزاری مشابه برای آزمایش نتیجه استفاده کنید.

غذای آماده

این کد یک بستر آزمایشی برای آزمایش مفاهیم است. برای تولید SQL کار باید چندین تغییر در اسناد ایجاد شود:

این سند شامل نام پایگاه داده به همراه نام جدول بود. نام پایگاه داده حذف شد زیرا نام جدول برای پرس و جوها کافی است.
جداول بدون رابطه باید حذف شوند، یا LLM از آنها برای تولید SQL استفاده می کند. این مورد برای us_states جدولی که کلید ثانویه برای اتصال نداشت.
Qwen2.5-Coder نام مستعار جدول ایجاد می کند و گاهی اوقات آنها را به ستون های اشتباه اختصاص می دهد.

فرمول بندی یک پرس و جو نیاز به ویژگی دارد. استفاده از نام های جدول و اصطلاحات مشابه با نام ستون ها نتایج بهتری را ایجاد می کند. تا کنون، LLM می تواند توابع استاندارد SQL مانند COUNT، DISTINCT، GROUP BY، ORDER BY و OUTER JOINS را تولید کند.

نتایج امیدوارکننده است. پست زیر نحوه ساخت یک عامل برای اجرای SQL را نشان می دهد.

در پست قبل اسنادی را بر اساس جداول پایگاه داده Northwind Trader ایجاد کردیم. ما از مدل تعبیه‌سازی Nebius AI Studio برای بردار کردن اسناد و درج آنها در Postgres با پسوند برداری استفاده کردیم. این پست نحوه پرس و جو از پایگاه داده و استفاده از نتایج را در یک اعلان نشان می دهد. بیایید وارد کد شویم.

یک مشتری ساده

اسکریپت با نمونه سازی یک کلاینت Nebius و پارامترهای اتصال پایگاه داده شروع می شود.

API_KEY = os.environ.get('NEBIUS_API_KEY')

conn = psycopg.connect(dbname='rag',user="postgres", autocommit=True)

client = OpenAI(
    base_url="https://api.studio.nebius.ai/v1/",
    api_key=API_KEY,
)
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

را query تابع تعبیه‌ها را از پایگاه داده بازیابی می‌کند. برای تشکیل پرس و جو، دوباره از آن استفاده می کنیم create_vector تابع پرس و جو از شباهت کسینوس استفاده می کند. Pgvector روش های جستجوی برداری دیگری را ارائه می دهد.

def query(query_string):
    vector = create_vector(query_string)
    embedding_query = "[" + ",".join(map(str, vector)) + "]"

    # cosine similarity
    query_sql = f"""
    SELECT chunk, embedding <=>'{embedding_query}' AS similarity
    FROM items
    ORDER BY embedding <=> '{embedding_query}'
    LIMIT 20;
    """
    data = conn.execute(query_sql).fetchall()
    result=[]
    for row in data:
        result.append(row[0])

    return result     

def create_vector(text):
     embedding = client.embeddings.create(
           model="intfloat/e5-mistral-7b-instruct",
           input=text,
           dimensions=1024,
           encoding_format="float",
           ).data[0].embedding    

     return embedding

وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

نتیجه پایگاه داده هنگامی که به متن اضافه می شود، دستور OpenAI-style را افزایش می دهد. این اعلان به مدل Nebius Qwen2.5-Coder-7B-Instruct ارسال می شود که با SQL و سایر زبان های برنامه نویسی آموزش داده شده است.

def create_prompt(llm_query, database_results):
    content_start = (
        "Write a SQL statement using the database information provided.\n\n"+
        "Context:\n"
    )

    content_end = (
        f"\n\nQuestion: {llm_query}\nAnswer:"
    )

    content = (
        content_start + "\n\n---\n\n".join(database_results) + 
        content_end
    )

    prompt = [{'role': 'user', 'content': content }]

    return prompt

def create_completion(prompt):

    completion = client.chat.completions.create(
        model = "Qwen/Qwen2.5-Coder-7B-Instruct",
        messages = prompt,
        temperature=0.6
    )

    return completion.to_json()
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

در مرحله بعد، یک پرس و جو به زبان انگلیسی می نویسیم: “تعداد تامین کنندگان را به ترتیب حروف الفبا بر اساس کشور فهرست کنید.” پرس و جو به پایگاه داده ارسال می شود تا جاسازی های قابل اجرا را بازیابی کند.

client_query = "List number of suppliers alphabetically by country."
rag_results = query(client_query)
prompt = create_prompt(rag_query, rag_results)
response = json.loads(create_completion(prompt))

print(response["choices"][0]["message"]["content"])
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

جاسازی ها به دستور اضافه می شوند و مشتری موارد زیر را برمی گرداند.

To list the number of suppliers alphabetically by country, you can use the following SQL statement:

SELECT country, COUNT(*) AS number_of_suppliers
FROM suppliers
GROUP BY country
ORDER BY country;

This query performs the following actions:
- `SELECT country, COUNT(*) AS number_of_suppliers`: Selects the `country` column and counts the number of rows for each country.
- `FROM suppliers`: Specifies the table from which to retrieve the data.
- `GROUP BY country`: Groups the results by the `country` column.
- `ORDER BY country`: Orders the results alphabetically by the `country` column.
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

برای راحتی، از pgAdmin یا ابزاری مشابه برای آزمایش نتیجه استفاده کنید.

نتیجه LLM تولید SQL

غذای آماده

این کد یک بستر آزمایشی برای آزمایش مفاهیم است. برای تولید SQL کار باید چندین تغییر در اسناد ایجاد شود:

  • این سند شامل نام پایگاه داده به همراه نام جدول بود. نام پایگاه داده حذف شد زیرا نام جدول برای پرس و جوها کافی است.
  • جداول بدون رابطه باید حذف شوند، یا LLM از آنها برای تولید SQL استفاده می کند. این مورد برای us_states جدولی که کلید ثانویه برای اتصال نداشت.
  • Qwen2.5-Coder نام مستعار جدول ایجاد می کند و گاهی اوقات آنها را به ستون های اشتباه اختصاص می دهد.

فرمول بندی یک پرس و جو نیاز به ویژگی دارد. استفاده از نام های جدول و اصطلاحات مشابه با نام ستون ها نتایج بهتری را ایجاد می کند. تا کنون، LLM می تواند توابع استاندارد SQL مانند COUNT، DISTINCT، GROUP BY، ORDER BY و OUTER JOINS را تولید کند.

نتایج امیدوارکننده است. پست زیر نحوه ساخت یک عامل برای اجرای SQL را نشان می دهد.

نوشته های مشابه

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

دکمه بازگشت به بالا