تبدیل متن به 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 یا ابزاری مشابه برای آزمایش نتیجه استفاده کنید.
غذای آماده
این کد یک بستر آزمایشی برای آزمایش مفاهیم است. برای تولید SQL کار باید چندین تغییر در اسناد ایجاد شود:
- این سند شامل نام پایگاه داده به همراه نام جدول بود. نام پایگاه داده حذف شد زیرا نام جدول برای پرس و جوها کافی است.
- جداول بدون رابطه باید حذف شوند، یا LLM از آنها برای تولید SQL استفاده می کند. این مورد برای
us_states
جدولی که کلید ثانویه برای اتصال نداشت. - Qwen2.5-Coder نام مستعار جدول ایجاد می کند و گاهی اوقات آنها را به ستون های اشتباه اختصاص می دهد.
فرمول بندی یک پرس و جو نیاز به ویژگی دارد. استفاده از نام های جدول و اصطلاحات مشابه با نام ستون ها نتایج بهتری را ایجاد می کند. تا کنون، LLM می تواند توابع استاندارد SQL مانند COUNT، DISTINCT، GROUP BY، ORDER BY و OUTER JOINS را تولید کند.
نتایج امیدوارکننده است. پست زیر نحوه ساخت یک عامل برای اجرای SQL را نشان می دهد.