ভয়েস এখন এমন একটি ফিচার হয়ে দাঁড়িয়েছে যা প্রতিটি AI এজেন্ট প্ল্যাটফর্ম দ্রুত রিলিজ করার জন্য মরিয়া হয়ে ওঠে। এর সহজ সমাধান হলো এটিকে একটি স্বতন্ত্র চ্যানেল (standalone channel) হিসেবে তৈরি করা, যা আপনার ওয়েব অ্যাপ, CLI টুল বা টেলিগ্রাম বটের পাশে অবস্থান করবে। এটি শুনতে সহজ মনে হয়। আপনি ভয়েস দেখছেন, তাই আপনি একটি ভয়েস ইন্টারফেস তৈরি করছেন। কিন্তু এই সহজাত প্রবৃত্তি একটি ভঙ্গুর আর্কিটেকচার (brittle architecture) তৈরি করে। এটি একই কাজ বারবার করতে বাধ্য করে, আপনার লগগুলোকে নষ্ট করে দেয় এবং ধীরে ধীরে আপনার প্রজেক্ট কনটেক্সটকে এলোমেলো করে ফেলে।
APC এবং APX-এ আমরা একটি ভিন্ন পথ বেছে নিয়েছি। ভয়েস কোনো চ্যানেল নয়। এটি একটি মোড (mode)। এটি কোনো সারফেসকে প্রতিস্থাপন করার পরিবর্তে তার উপরে অবস্থান করে। এই পার্থক্যটি সঠিকভাবে বজায় রাখাই সিস্টেমটিকে বিচ্ছিন্ন হওয়া থেকে রক্ষা করে।
ভুল অ্যাবস্ট্রাকশন (The Wrong Abstraction)
যখন আপনি ভয়েসকে একটি স্বতন্ত্র চ্যানেল হিসেবে বিবেচনা করেন, তখন আপনি পরোক্ষভাবে ধরে নেন যে এজেন্টের সাথে কথা বলা এবং টাইপ করা সম্পূর্ণ ভিন্ন ধরনের কথোপকথন। ইঞ্জিনিয়ারিং টিমগুলো এর প্রতিক্রিয়ায় কোডবেসকে বিভক্ত করে ফেলে। হঠাৎ করেই একটি CLI চ্যানেল এবং একটি আলাদা voice-CLI চ্যানেল তৈরি হয়ে যায়। একটি ওয়েব চ্যানেল এবং একটি সমান্তরাল voice-web চ্যানেল তৈরি হয়। প্রতিটি চ্যানেলের জন্য আলাদা প্রম্পট ভেরিয়েশন, ফরম্যাটিং নিয়ম এবং কনটেক্সট হ্যান্ডলিং লজিকের প্রয়োজন হয়।
এখান থেকেই বিশৃঙ্খলা শুরু হয়। এজেন্টের আচরণে সামান্য পরিবর্তন করতে হলেও এখন সেটি একাধিক প্রম্পট ট্রি (prompt tree)-তে কপি করতে হয়। যদি টিম কোনো একটি সারফেসে তা করতে ভুলে যায়, তবে ব্যবহারকারীর অভিজ্ঞতা খণ্ডিত হয়ে যায়। ব্যবহারকারীরা টেক্সটের ক্ষেত্রে এক ধরনের টোন পায় এবং কথা বলার সময় কিছুটা ভিন্ন ব্যক্তিত্বের সম্মুখীন হয়। সময়ের সাথে সাথে, এই ছোটখাটো অসামঞ্জস্যতাগুলো সিস্টেম ড্রিপ্ট (system drift)-এ পরিণত হয়। পোর্টেবল কনটেক্সট লেয়ারটি আর পোর্টেবল থাকে না, কারণ একে একদিকে কণ্ঠস্বরের ডেলিভারি এবং অন্যদিকে নীরব টেক্সটের বিষয়টি সামলাতে হয়। এর ফলে অ্যাবস্ট্রাকশন লিক (abstraction leak) হয় এবং আপনার একসময় ঐক্যবদ্ধ প্রজেক্ট ডেফিনিশনটি চ্যানেল-নির্দিষ্ট হ্যাকসের একটি সংগ্রহে পরিণত হয়।
কনটেক্সট এবং রানটাইমকে আলাদা করা
এটি প্রতিরোধ করতে, আমরা দায়িত্বগুলোকে দুটি লেয়ারের মধ্যে ভাগ করে দিয়েছি যা কঠোরভাবে আলাদা থাকে।
APC প্রজেক্ট কনটেক্সট ধারণ করে। এটি এজেন্ট, নিয়ম এবং স্কিলগুলোকে সংজ্ঞায়িত করে যা একটি প্রজেক্ট গঠন করে। এটিকে সিস্টেমের স্থিতিশীল অর্থ হিসেবে ভাবুন। এটি কাঠামোগত প্রশ্নগুলোর উত্তর দেয়। এই এজেন্ট কী জানে? এটি কী করতে পারে? এটি কোন টুলগুলো কল করতে পারে? একটি উত্তর স্ক্রিনে দেখানো হচ্ছে, চ্যাট API-এর মাধ্যমে পাঠানো হচ্ছে, নাকি স্পিকারের মাধ্যমে বাজানো হচ্ছে, সে বিষয়ে APC সম্পূর্ণ নিরপেক্ষ থাকা উচিত।
APX রানটাইম লেয়ার পরিচালনা করে। এটি সেই সারফেসগুলো পরিচালনা করে যা আপনি আসলে ব্যবহার করেন: CLI, ওয়েব অ্যাপ্লিকেশন, ডেস্কটপ ইন্টারফেস, টেলিগ্রাম বট। যখন একজন ব্যবহারকারী একটি রিকোয়েস্ট পাঠান, APX সিদ্ধান্ত নেয় কোথায় এবং কীভাবে রেসপন্সটি উপস্থাপন করা হবে। একটি উত্তর পড়ার জন্য ফরম্যাট করা হবে নাকি কথা বলার জন্য অপ্টিমাইজ করা হবে—এটি একটি রানটাইম সংক্রান্ত বিষয়। এটি APX-এর অন্তর্ভুক্ত, APC-এর নয়।
এই বিভাজনের মানে হলো, APC-তে সংজ্ঞায়িত একটি প্রজেক্ট APX যতগুলো সারফেসই প্রকাশ করুক না কেন, তা অক্ষত থাকে। কন্ট্রাক্ট পরিবর্তিত হয় না; শুধুমাত্র প্রেজেন্টেশন লেয়ার পরিবর্তিত হয়।
মোডগুলো আসলে কীভাবে কাজ করে
আমাদের ইমপ্লিমেন্টেশনে, টেলিগ্রাম, CLI এবং ওয়েব অ্যাপের মতো সারফেসগুলো হলো চ্যানেল। একটি চ্যানেল আপনাকে জানায় যে ইন্টারঅ্যাকশনটি কোথায় ঘটেছে। ভয়েসকে চ্যানেল মেটাডেটার মাধ্যমে একটি মোড হিসেবে লেয়ার করা হয়। একটি মোড আপনাকে জানায় যে একটি রেসপন্স কীভাবে আচরণ করবে।
প্রম্পট বিল্ডার এই সীমানা মেনে চলে। এটি প্রথমে APC-এর প্রজেক্ট কনটেক্সট থেকে তথ্য নেয়, তারপর চ্যানেল মেটাডেটা পরীক্ষা করে। যদি ডেস্কটপ সারফেসটি ভয়েস মোডে চলে, তবে বিল্ডার শুধুমাত্র সেই মুহূর্তের জন্য নির্দিষ্ট নির্দেশনা যুক্ত করে। হতে পারে এটি মডেলকে ছোট বাক্য ব্যবহার করতে, সিন্থেসিসের জন্য স্পষ্ট বিরামচিহ্ন ব্যবহার করতে বা কথা বলার সময় সংখ্যার প্রচলিত নিয়ম অনুসরণ করতে নির্দেশ দেয়। যদি একই ডেস্কটপ সারফেসটি টেক্সট মোডে চলে, তবে সেই ভয়েস সংক্রান্ত নির্দেশনাগুলো প্রম্পটে কখনোই প্রবেশ করে না।
এর ফলে প্রতিটি সারফেসের জন্য একটি মাত্র প্রম্পট ট্রি থাকে। কোনো আলাদা voice-desktop ব্রাঞ্চ নেই। কোনো whisper-web ভেরিয়েন্ট নেই। মডিফায়ারটি কেবল তখনই প্রয়োগ হয় যখন রানটাইম এটি চায়, এবং তাও একদম শেষ প্রয়োজনীয় মুহূর্তে। মূল প্রম্পটটি অপরিবর্তিত থাকে।
আপনি কী লাভ করবেন
এই আর্কিটেকচার তিনটি সুনির্দিষ্ট উপায়ে সুফল দেয়।
কম রক্ষণাবেক্ষণ খরচ (Lower maintenance costs)। যদি ভয়েস একটি স্বতন্ত্র চ্যানেল হতো, তবে প্রতিটি সারফেসের একটি যমজ সংস্করণ প্রয়োজন হতো। আপনাকে একটি CLI চ্যানেল এবং একটি voice-CLI চ্যানেল, একটি টেলিগ্রাম চ্যানেল এবং একটি voice-Telegram চ্যানেল—এভাবে সবকিছু বজায় রাখতে হতো। প্রতিবার যখন আপনি একটি সিস্টেম প্রম্পট পরিবর্তন করবেন, ফরম্যাটিং বাগ ঠিক করবেন বা কোনো স্কিল ডেসক্রিপশন উন্নত করবেন, তখন আপনাকে সেই পরিবর্তনটি উভয় ট্রি-তে প্রয়োগ করতে হতো। একটিতেও ভুল করলে ব্যবহারকারীরা সেই পার্থক্যটি বুঝতে পারবে। একটি মোড ব্যবহার করার মাধ্যমে, আপনি প্রতিটি সারফেসের জন্য একটি মাত্র প্রম্পট ট্রি বজায় রাখেন। ভয়েস এখানে কোনো পথের বিভাজন নয়, বরং একটি কন্ডিশনাল ওভারলে (conditional overlay) হিসেবে কাজ করে, ফলে নতুন ইন্টারঅ্যাকশন পদ্ধতি যুক্ত করার সাথে সাথে আপনার কাজের চাপ রৈখিক (linear) থাকে।
সঠিক লগিং। চ্যানেলগুলো রেকর্ড করে যে ইন্টারঅ্যাকশনটি কোথায় ঘটেছে। মোডগুলো রেকর্ড করে যে উত্তরটি কীভাবে প্রদান করা হয়েছে। একটি ডেস্কটপ ইন্টারঅ্যাকশন ডেস্কটপ হিসেবেই থাকে, ব্যবহারকারী সেটি পড়ুক বা শুনুক না কেন। যখন আপনার টিম কোনো বাগ ট্রেস করে বা অ্যানালিটিক্স রিভিউ করে, তখন তাদের 'desktop-voice' এবং 'desktop-text'-কে আলাদা প্রোডাক্ট সারফেস হিসেবে বিবেচনা করে সামঞ্জস্য করতে হয় না। চ্যানেল আইডেন্টিফায়ারটি পরিষ্কার থাকে এবং মোড ফ্ল্যাগটি মেটাডেটাতে তার পাশেই সুন্দরভাবে বসে। আপনার লগগুলো নির্ভুল থাকে এবং ডিবাগিং সহজসাধ্য হয় কারণ লোকেশন এবং বিহেভিয়ার একে অপরের সাথে মিশে যায় না।
পরিচ্ছন্ন প্রজেক্ট কনটেক্সট। APC কন্ট্রাক্টটি সংজ্ঞায়িত করে। উত্তরটি মুখে বলা হচ্ছে, ফিসফিস করে বলা হচ্ছে নাকি মনোস্পেস ফন্টে দেখানো হচ্ছে, তা নিয়ে এর কোনো মাথাব্যথা থাকা উচিত নয়। এগুলো রানটাইম সংক্রান্ত বিষয়। ভয়েস ফরম্যাটিং APX-এর ভেতরে রাখার মাধ্যমে আমরা APC-এর পোর্টেবিলিটি বজায় রাখি। আপনি একটি APC প্রজেক্ট ডেফিনিশন নিয়ে সম্পূর্ণ নতুন একটি রানটাইম এনভায়রনমেন্টে ব্যবহার করতে পারেন, সাথে কোনো ভয়েস-নির্দিষ্ট ফরম্যাটিং ধারণা বা স্পিচ-অপ্টিমাইজেশন সংক্রান্ত অপ্রয়োজনীয় জটিলতা টেনে আনার প্রয়োজন হয় না। সীমানাটি অটুট থাকে এবং প্রজেক্টের অর্থ স্থিতিশীল থাকে।
ডেস্কটপে এর প্রমাণ
আমাদের নিজস্ব ডেস্কটপ পাথ দৈনন্দিন ব্যবহারে এটি প্রদর্শন করে। ডেস্কটপ হলো সারফেস। যখন একজন ব্যবহারকারী স্পিচ সক্ষম করেন, সিস্টেমটি সেই একই ডেস্কটপ সারফেসকে ভয়েস মোডে চালায়। যেহেতু ভয়েস মোড লেয়ারে থাকে, তাই ডেস্কটপ চ্যানেল তার সম্পূর্ণ কনটেক্সট এবং আচরণ বজায় রাখে। এটি ভিন্ন নিয়মের কোনো আলাদা প্রোডাক্টে পরিণত হয় না। প্রম্পট বিল্ডার কেবল ফ্ল্যাগটি লক্ষ্য করে এবং শুধুমাত্র প্রয়োজনের সময় ভয়েস ইনস্ট্রাকশন যোগ করে। যখন ব্যবহারকারী আবার টেক্সটে ফিরে যান, তখন সেই ইনস্ট্রাকশনগুলো সম্পূর্ণ অদৃশ্য হয়ে যায়। অন্তর্নিহিত প্রজেক্ট কনটেক্সট কখনোই পরিবর্তিত হয় না। ডেস্কটপ সবসময় ডেস্কটপই থাকে।
মূল সারমর্ম
মূল ধারণাটি সহজ। APC স্থিতিশীল প্রজেক্ট অর্থ বর্ণনা করে। APX রানটাইম এক্সিকিউশন বর্ণনা করে। ভয়েস হলো একটি সারফেসের মডিফায়ার, কোনো সারফেসের বিকল্প নয়। এটিকে সেভাবেই বিবেচনা করুন, তাহলে আপনার প্রম্পটগুলো ছোট থাকবে। আপনার লগগুলো পরিষ্কার থাকবে। আপনার
