পাইথন প্রজেক্টস ও লাইব্রেরি

Agent 9: Database Manager Agent (Text to SQL)

১. এই এজেন্ট কী কাজ করবে?

ডেটাবেস থেকে ডেটা বের করার জন্য আমাদের SQL কোয়েরি (Query) লিখতে হয়। কিন্তু যারা SQL জানেন না, বা বারবার বড় কোয়েরি লিখতে বিরক্ত হন, তাদের জন্য এই এজেন্ট! আপনি শুধু তাকে মানুষের ভাষায় বলবেন (যেমন: "গত সপ্তাহের সব কাস্টমারের নাম দাও"), আর সে নিজেই SQL কোয়েরি লিখে ডেটাবেস থেকে ডেটা এনে দেবে। একে বলা হয় Text-to-SQL এজেন্ট।

২. কী কী টুলস এবং লাইব্রেরি লাগবে?

  • sqlite3: ডেমো ডেটাবেসের জন্য (পাইথনের সাথেই থাকে)।
  • google-generativeai (Gemini API) বা openai: মানুষের ভাষাকে SQL এ রূপান্তর করার জন্য।

৩. এ টু জেড কোড (A to Z Code)

প্রথমে pip install google-generativeai দিয়ে লাইব্রেরিটি ইনস্টল করে নিন। এরপর নিচের কোডটি agent_db_manager.py নামে সেভ করুন।

import sqlite3
import google.generativeai as genai

class DatabaseManagerAgent:
    def __init__(self, api_key, db_name="demo.db"):
        genai.configure(api_key=api_key)
        self.model = genai.GenerativeModel('gemini-1.5-flash')
        self.conn = sqlite3.connect(db_name)
        self.cursor = self.conn.cursor()
        self.setup_dummy_database() # ডেমো ডেটাবেস তৈরি

    def setup_dummy_database(self):
        # একটি ডেমো টেবিল তৈরি
        self.cursor.execute('''CREATE TABLE IF NOT EXISTS users (id INTEGER PRIMARY KEY, name TEXT, age INTEGER, city TEXT)''')
        # কিছু ডেমো ডেটা ইনসার্ট করা
        self.cursor.execute("INSERT OR IGNORE INTO users (id, name, age, city) VALUES (1, 'Rahim', 25, 'Dhaka')")
        self.cursor.execute("INSERT OR IGNORE INTO users (id, name, age, city) VALUES (2, 'Karim', 30, 'Sylhet')")
        self.cursor.execute("INSERT OR IGNORE INTO users (id, name, age, city) VALUES (3, 'Jamal', 22, 'Dhaka')")
        self.conn.commit()

    def translate_to_sql(self, user_question):
        prompt = f"""
        You are an expert SQL Developer. I have a SQLite table named 'users' with columns: id, name, age, city.
        Convert the following user request into a raw SQL query.
        DO NOT explain anything, just output the raw SQL string (no formatting or markdown).
        
        User Request: "{user_question}"
        """
        response = self.model.generate_content(prompt)
        # Markdown থেকে পরিষ্কার SQL বের করা
        sql_query = response.text.replace('```sql', '').replace('```', '').strip()
        return sql_query

    def execute_request(self, user_question):
        print(f"\n[Agent] আপনার প্রশ্ন: '{user_question}'")
        
        # ১. মানুষের ভাষাকে SQL এ রূপান্তর
        sql_query = self.translate_to_sql(user_question)
        print(f"[Agent] জেনারেট করা SQL: {sql_query}")
        
        # ২. SQL এক্সিকিউট করা
        try:
            self.cursor.execute(sql_query)
            results = self.cursor.fetchall()
            print("[Agent] রেজাল্ট:")
            for row in results:
                print(" ->", row)
        except Exception as e:
            print(f"[Agent] SQL রান করতে এরর হয়েছে: {e}")

if __name__ == "__main__":
    API_KEY = "YOUR_GEMINI_API_KEY_HERE"
    agent = DatabaseManagerAgent(API_KEY)
    
    # এজেন্টকে বাংলায় বা ইংরেজিতে কমান্ড দিন
    agent.execute_request("Show me the names of all people who live in Dhaka")
    agent.execute_request("Who is the oldest person in the database?")

৪. কীভাবে এটি আরও অ্যাডভান্সড করবেন?

  • এটি শুধুমাত্র SQLite এর সাথে যুক্ত। আপনি চাইলে SQLAlchemy ব্যবহার করে এটিকে MySQL বা PostgreSQL এর সাথে যুক্ত করতে পারেন।
  • এটিতে LangChain SQL Agent ব্যবহার করতে পারেন, যা নিজে নিজেই আপনার ডেটাবেসের সবগুলো টেবিলের নাম ও কলাম পড়ে বুঝতে পারবে (আপনাকে ম্যানুয়ালি লিখে দিতে হবে না)।