Iজেনারেটেড SQL-এর বিরুদ্ধে যুক্তি

মডেলের উচিত নয়
SQL লেখা।

Text-to-SQL হলো একটি এজেন্টকে ডেটাবেসে নির্দেশ করার সুস্পষ্ট পদ্ধতি, এবং ডেমো সত্যিই চমকপ্রদ। প্রোডাকশনেই সমস্যা শুরু হয়: একই প্রশ্ন ভিন্ন SQL তৈরি করে, একটি নীরব join ত্রুটি রাজস্ব 15% সরিয়ে দেয়, এবং মডেলের আউটপুট একটি আক্রমণের পৃষ্ঠ হয়ে ওঠে। আরেকটি পথ আছে।

IIআগে স্বীকৃতি

Text-to-SQL তার জায়গায় সঠিক ছিল।

যেখানে এটি সঠিক টুল

  • অস্থায়ী ডেটায় প্রোটোটাইপ
  • অপরিচিত স্কিমা অন্বেষণ, মানুষের নজরদারিতে
  • এককালীন প্রশ্ন যা কেউ যাচাই করবে
  • ডেমো — এটি সত্যিই ডেমোতে ভালো কাজ করে

যেখানে এটি ব্যর্থ হয়

  • যে সংখ্যার উপর ভিত্তি করে সিদ্ধান্ত নেওয়া হবে
  • কনটেক্সটে যেকোনো অবিশ্বস্ত টেক্সট
  • কানেকশনে প্রোডাকশন ক্রেডেনশিয়াল
  • উত্তর যা পুনরুৎপাদনযোগ্য বা নিরীক্ষাযোগ্য হতে হবে
  • এজেন্ট যা তদারকি ছাড়া চলে

প্যাটার্নটি ভুল নয়। ক্ষতির পরিধিটি। এই পাতার প্রতিটি বিপদ একটি ডিজাইন সিদ্ধান্তে ফিরে যায়: মডেলের আউটপুট কোড হিসেবে কার্যকর হয়।

IIIদুটি পথ

একই প্রশ্ন। দুটি আর্কিটেকচার।

একটি প্রশ্নকে দুটি পথে অনুসরণ করুন — বাঁয়ে মুক্ত-ফর্ম SQL স্ট্রিং, ডানে টাইপড পরিকল্পনা। সংখ্যাযুক্ত চিহ্নগুলো নিচের বিপদ খাতায় নির্দেশ করে।

প্রশ্নটি

কোন অঞ্চলে মোট রাজস্ব সর্বোচ্চ?

Path A

মডেল SQL লেখে

  1. মডেল একটি স্ট্রিং তৈরি করে 010304

    মডেল যা পড়েছে — ব্যবহারকারীর বার্তা, একটি রিট্রিভড রো — তা এই স্ট্রিং গঠন করতে পারে।

    রান 1SELECT region, SUM(total) FROM orders GROUP BY region;রান 2 · একই প্রশ্নSELECT o.region, SUM(i.amount) FROM orders o LEFT JOIN order_items i ON i.order_id = o.id GROUP BY 1;
  2. আপনার কানেকশন এটি কার্যকর করে 05

    কানেকশনের পূর্ণ কর্তৃত্বে। পড়া, জয়েন — এবং কেউ ফ্ল্যাগটি মনে না রাখলে, লেখাও।

উত্তর

run 1 → east · 2130.50

run 2 → east · 2450.08+15% — জয়েন ফ্যান-আউট 02

দুটি রান, দুটি সংখ্যা। উভয়ই বিশ্বাসযোগ্য। কোনটি — যদি কোনোটি — সঠিক তার কোনো ইঙ্গিত নেই।

Path B

মডেল একটি টাইপড পরিকল্পনা দাখিল করে

  1. টাইপড অভিপ্রায়

    স্ট্রিং নয় — স্কিমাসহ একটি মান। এটি কেবল চুক্তিতে সংজ্ঞায়িত অপারেশনগুলো উল্লেখ করতে পারে।

    { "kind": "query", "version": "1", "source": "revenue", "op": "sum", "group_by": "region" }
  2. চুক্তি যাচাই

    হ্যাশ-পিন করা। অজানা অপারেশন নিকটতম মিলসহ unsupported_operation ফেরত দেয় — কখনো অনুমান নয়।

  3. নীতি যাচাই

    আপনার কোড-স্তরের অনুমতি তালিকা। একটি অনুরোধ পরিধি সংকুচিত করতে পারে, কখনো প্রসারিত নয়।

  4. নির্ধারণবাদী কার্যকরণ

    float64, একক থ্রেড, পিন করা রানটাইম। একই পরিকল্পনা, একই বাইট, একই উত্তর।

উত্তর

east · 2130.50

plan_hash f87610d8afeb…

decision_path "exact_spec"

একটি উত্তর, পুনরায় চালানোর হ্যাশসহ — আগামী সপ্তাহে, আগামী প্রান্তিকে, যেকোনো ভাষায়।

IVবিপদ খাতা

জেনারেটেড SQL যেভাবে ব্যর্থ হয়

  1. 01

    P2SQLarXiv 2308.01990

    ইনজেকশন আউটপুট চ্যানেলে স্থানান্তরিত

    ইনপুট স্যানিটাইজেশন মডেলে যা প্রবেশ করে তা পরীক্ষা করে। P2SQL আক্রমণ আসে যা বের হয়: ব্যবহারকারীর বার্তা বা রিট্রিভড রোতে লুকানো নির্দেশ থেকে তৈরি সুগঠিত, ক্ষতিকর SQL। কোনো ইনপুট ফিল্টার এটি দেখে না — আক্রমণটিই আউটপুট।

  2. 02

    −15%যে ড্যাশবোর্ড মিথ্যা বলেছিল

    ভুল জয়েন নীরবে ব্যর্থ হয়

    ফ্যান-আউট জয়েন রো দ্বিগুণ গণনা করে, এবং রাজস্ব 15% বিচ্যুত দেখায়। কোনো ব্যতিক্রম নেই, কোনো সতর্কতা নেই — ভুল SQL ক্র্যাশ করে না, রিপোর্ট করে। ফলাফল সবসময় একটি সংখ্যা, এবং বিশ্বাসযোগ্য সংখ্যা বহন করে না যে এটি ভুল।

  3. 03

    1 → nএকটি প্রশ্ন, n কোয়েরি

    একই প্রশ্ন, ভিন্ন SQL

    দুবার জিজ্ঞেস করলে মডেল প্রশ্নটি দুটি ভিন্নভাবে কম্পাইল করতে পারে — কখনো দুটি ভিন্ন উত্তরে। পর্যালোচনা, ক্যাশ বা পুনরায় চালানোর জন্য কোনো ক্যানোনিকাল কোয়েরি নেই। গতকালের সংখ্যা পুনরুৎপাদন করা যায় না, এমনকি শুধু যাচাই করতেও।

  4. 04

    91.2 → 21.3% সঠিক · বেঞ্চমার্ক → এন্টারপ্রাইজ স্কিমা

    নির্ভুলতার খাড়া পতন

    পরিষ্কার বেঞ্চমার্ক স্কিমায় একটি ফ্রন্টিয়ার মডেল 91.2% সময় সঠিক SQL লিখেছিল। বাস্তব এন্টারপ্রাইজ স্কিমায়: 21.3%। একই গবেষণা তরঙ্গে, প্রায় 40% text-to-SQL এজেন্ট রান সম্পূর্ণ ব্যর্থ হয়েছে বা ভুল ফলাফল দিয়েছে। বেঞ্চমার্ক পরিপাটি। আপনার স্কিমা নয়।

  5. 05

    1টি প্রোড DBএকটি এজেন্ট মুছে দিয়েছে — Replit ঘটনা

    রাইট পাথ সবসময়ই ছিল

    Replit-এর কোডিং এজেন্ট স্পষ্ট নির্দেশ থাকা সত্ত্বেও একটি প্রোডাকশন ডেটাবেস মুছে দিয়েছে। শিক্ষাটা এটাই: রিড-অনলি নির্দেশ একটি অনুরোধ মাত্র। কানেকশন যদি লিখতে পারে, রাইট পাথ বিদ্যমান — এবং একসময় একটি ভুল কমপ্লিশন সেটা খুঁজে নেয়। রিড-অনলি হতে হবে টুলের বৈশিষ্ট্য, প্রম্পটের একটি লাইন নয়।

আউটপুট ফিল্টার করবেন না।
জেনারেট করবেন না।

কোনো SQL স্ট্রিং নেই, কোনো ইনজেকশন নেই · কোনো অনুমান নেই, কোনো বিচ্যুতি নেই

Vসার্টিফিকেট

পাঁচটি মাত্রা, পাশাপাশি

LLM-থেকে-SQL জেনারেটর নয়ইঞ্জিন README

পার্থক্যের সার্টিফিকেট

অথরিং সারফেসজেনারেটেড SQLএকটি মুক্ত-ফর্ম SQL স্ট্রিংটাইপড প্ল্যানএকটি টাইপড, ভার্সনড ইন্টেন্ট
এক্সিকিউশন সারফেসজেনারেটেড SQLকানেকশন যা অনুমতি দেয় তার সবকিছুটাইপড প্ল্যান4,574টি রিড-অনলি ক্যাপাবিলিটি
রাইট পাথজেনারেটেড SQLব্লক না করলে বিদ্যমানটাইপড প্ল্যাননির্মাণগতভাবেই অনুপস্থিত
গভর্ন্যান্সজেনারেটেড SQLপ্রম্পট-স্তরে, সর্বোচ্চ প্রচেষ্টায়টাইপড প্ল্যানকোড-স্তরের অ্যালাউ-লিস্ট, মডেল প্রসারিত করতে পারে না
পুনরুৎপাদনযোগ্যতাজেনারেটেড SQLনেইটাইপড প্ল্যানপ্রতিটি ফলাফলে একটি রিপ্লে হ্যাশ

ডান কলাম কন্ট্র্যাক্টে পিন করাsha256:79f1c5a6…924be9a1

সূক্ষ্ম বিবরণ টিকে থাকে: ইঞ্জিনের একমাত্র এস্কেপ হ্যাচ — getUnsafeRuntime — মডেল-মুখী কোনো সারফেসে অনুপস্থিত, তাই মডেল সেটায় পৌঁছাতে পারে না। এবং README মতবাদটি স্পষ্টভাবে বলে: এটি LLM-থেকে-SQL জেনারেটর নয়।

VIপ্রশ্নাবলি

প্রোডাকশনে জিজ্ঞাসিত

LLM-জেনারেটেড SQL-এ DELETE ও DROP কীভাবে ব্লক করব?

SQL ফিল্টার করবেন না — জেনারেট করাই বন্ধ করুন। ডেনিলিস্ট স্ট্রিং পরীক্ষা করে, আর মডেল নতুন স্ট্রিং তৈরিতে অফুরন্ত সৃজনশীল। SQAI পুরো শ্রেণিটাই সরিয়ে দেয়: মডেল 4,574টি রিড-অনলি ক্যাপাবিলিটির বিপরীতে একটি টাইপড প্ল্যান দাখিল করে, এবং কোনো প্ল্যানের নাম নেওয়ার মতো কোনো রাইট ক্যাপাবিলিটি নেই।

P2SQL ইনজেকশন কী?

Prompt-to-SQL ইনজেকশন: ক্ষতিকর SQL যা মডেলের আউটপুটে প্রকাশ পায়, মডেল যা পড়েছে তার মধ্যে লুকানো নির্দেশ থেকে একত্রিত হয়ে — একটি ইউজার মেসেজ, একটি ডকুমেন্ট, একটি রিট্রিভড রো। ইনপুট স্যানিটাইজেশন এটা দেখতে পায় না, কারণ আক্রমণটি আউটপুট চ্যানেলে থাকে। এটি arXiv 2308.01990-এ নথিভুক্ত।

টেক্সট-টু-SQL কি কখনো সঠিক পছন্দ?

হ্যাঁ — প্রোটোটাইপ এবং নন-প্রোডাকশন ডেটায় তত্ত্বাবধানে অন্বেষণের জন্য এটি দ্রুত ও সত্যিকার অর্থে কার্যকর। তবে একবার সংখ্যার উপর ভিত্তি করে সিদ্ধান্ত নেওয়া হলে, প্রসঙ্গে অবিশ্বস্ত টেক্সট থাকলে, বা উত্তর পুনরুৎপাদনযোগ্য হতে হলে এটি ভুল পছন্দ।

একটি AI এজেন্টকে ডেটাবেসে রিড-অনলি অ্যাক্সেস কীভাবে দেব?

রিড-অনলিকে কনফিগারড নয়, কাঠামোগত করুন। কানেকশনে রিড-অনলি ফ্ল্যাগ একটি সেটিং যা কেউ পরিবর্তন করতে পারে। SQAI-এর এক্সিকিউশন সারফেসে কেবল রিড ক্যাপাবিলিটি আছে — রাইট পাথ নির্মাণগতভাবেই অনুপস্থিত, এবং ইঞ্জিনের এস্কেপ হ্যাচও মডেল-মুখী কোনো টুল থেকে অপ্রাপ্য।

টাইপড প্ল্যান জেনারেটেড SQL থেকে কীভাবে আলাদা?

একটি SQL স্ট্রিং গ্রামার যা অনুমতি দেয় তার যেকোনো কিছু বলতে পারে। একটি টাইপড প্ল্যান কেবল তাই বলতে পারে যা কন্ট্র্যাক্ট সংজ্ঞায়িত করে। প্রতিটি প্ল্যান হ্যাশ-পিনড কন্ট্র্যাক্টের বিপরীতে যাচাই করা হয়, আপনার অ্যালাউ-লিস্ট পলিসির বিরুদ্ধে পরীক্ষিত হয়, এবং একটি নির্ধারণবাদী ইঞ্জিনে এক্সিকিউট হয় — প্রতিটি ফলাফলে রিপ্লে হ্যাশসহ।

অন্য পথ নিন।

কোনো অ্যাকাউন্ট নেই। কোনো কী নেই। লোকাল ডেটা লোকালেই থাকে।