বর্তমান যুগে বড় ভাষা মডেল (LLM) কেবল কথোপকথনের উত্তরই তৈরি করে না, বরং নির্দিষ্ট কাজ সম্পাদনের জন্য বাইরের ফাংশন বা API-ও কল করতে পারে। এই কৌশলটি ফাংশন কলিং নামে পরিচিত। LLM যখন কোনো প্রশ্নের উত্তর নিজে দিতে পারে না বা ডাটাবেস, ক্যালকুলেটর বা আবহাওয়া API-র মতো বাস্তব সিস্টেমের সাথে ইন্টারঅ্যাক্ট করতে হয়, তখন সে একটি ফাংশন কলের অনুরোধ তৈরি করে এবং প্রোগ্রামটি তা চালিয়ে ফলাফল ফেরত পায়। এই লেখায় আমরা দেখব ফাংশন কলিং কী, কেন এটি প্রয়োজন, এর অভ্যন্তরীণ প্রক্রিয়া এবং ব্যবহারিক প্রয়োগের সেরা কৌশল।
ফাংশন কলিং কী?
ফাংশন কলিং হলো এমন একটি পদ্ধতি যেখানে LLM পূর্বনির্ধারিত ফাংশনের তালিকা থেকে উপযুক্ত ফাংশন বেছে নেয়, প্রয়োজনীয় প্যারামিটার তৈরি করে এবং কলিং অ্যাপ্লিকেশনকে তা কার্যকর করার নির্দেশ দেয়। মডেল কোনো কোড লিখে না, বরং একটি স্ট্রাকচারড JSON অবজেক্ট আউটপুট দেয় যেখানে ফাংশনের নাম ও আর্গুমেন্ট উল্লেখ থাকে।
প্রচলিত চ্যাট সম্পূর্ণকরণের পরিবর্তে এখানে মডেল “ফাংশন কল” টাইপের একটি টোকেন তৈরি করে। উদাহরণ হিসেবে, ব্যবহারকারী জিজ্ঞেস করল “ঢাকার আবহাওয়া কেমন?” – মডেল সরাসরি বলে দেবে না, বরং get_weather(city="ঢাকা") নামের ফাংশন কল করার অনুরোধ জানাবে। অ্যাপ্লিকেশন সেই ফাংশন চালিয়ে প্রকৃত তাপমাত্রা পায় এবং সেটি মডেলের পরবর্তী প্রম্পটে যুক্ত করে ব্যবহারকারীকে সঠিক উত্তর দেয়।
এটি মডেলের ভাষাগত বোধশক্তি ও বাহ্যিক সিস্টেমের মধ্যে একটি সেতুবন্ধন তৈরি করে। মূলত LLM একটি অর্কেস্ট্রেটরে পরিণত হয়, যা বাস্তব তথ্য সংগ্রহ করে পরিপূর্ণ উত্তর প্রদান করে।
কেন ফাংশন কলিং প্রয়োজন?
একটি ভাষা মডেল তার প্রশিক্ষণ ডেটায় সীমাবদ্ধ। ট্রেনিং কাটঅফের পরের তথ্য বা রিয়েল-টাইম ডেটা সে জানে না। ফাংশন কলিং ছাড়া এই সীমাবদ্ধতার সমাধান অসম্ভব। নিচে এর প্রয়োজনীয় বিষয়গুলো দেওয়া হলো:
- রিয়েল-টাইম ডেটা অ্যাক্সেস: আবহাওয়া, স্টক প্রাইস, খেলার স্কোর – এ ধরনের সর্বদা পরিবর্তনশীল তথ্য পেতে মডেলের বাইরের API ডাকা জরুরি।
- গাণিতিক নির্ভুলতা: বড় সংখ্যা বা জটিল হিসাবের ক্ষেত্রে LLM প্রায়ই ভুল করে। ফাংশন কলিং-এর মাধ্যমে ক্যালকুলেটর ফাংশন অথবা নির্ভরযোগ্য গণিত লাইব্রেরি ব্যবহার করা যায়।
- ডেটাবেস ও অভ্যন্তরীণ সিস্টেম: প্রতিষ্ঠানের অভ্যন্তরীণ ডাটাবেস, CRM বা ইনভেন্টরি সিস্টেম থেকে তথ্য আনতে চাইলে মডেল সরাসরি প্রশ্ন করতে পারে না; ফাংশন কলিং নিরাপদ উপায়ে সংযোগ স্থাপন করে।
- জটিল ওয়ার্কফ্লো: একটি মাত্র প্রশ্নের উত্তরে একাধিক ফাংশন কল (যেমন প্রথমে ইউজার ভেরিফিকেশন, পরে অর্ডার স্ট্যাটাস) করে ধাপে ধাপে ফলাফল আনা সম্ভব।
- হ্যালুসিনেশন হ্রাস: নির্ভরযোগ্য ফাংশনের মাধ্যমে প্রাপ্ত ডেটা সরাসরি উত্তর তৈরিতে ব্যবহৃত হয়, ফলে মডেলের অনুমাননির্ভর ভুল তথ্য দেওয়ার সম্ভাবনা অনেক কমে যায়।
ফাংশন কলিং কীভাবে কাজ করে?
ফাংশন কলিং মূলত তিনটি ধাপে সম্পন্ন হয়: সংজ্ঞায়ন, অনুরোধ ও কার্যকরীকরণ, এবং উত্তর পুনর্প্রক্রিয়াকরণ।
-
ফাংশনের ঘোষণা: ডেভেলপার প্রথমে মডেলকে জানায় কী কী ফাংশন ব্যবহার করা যাবে। প্রতিটি ফাংশনের নাম, বিবরণ, এবং JSON Schema আকারে প্যারামিটার নির্দিষ্ট করে দেওয়া হয়। উদাহরণস্বরূপ, নিচে একটি পাইথন স্যুডো উদাহরণ দেওয়া হলো যেখানে ফাংশনের সংজ্ঞা ও LLM রেসপন্স দেখা যাচ্ছে:
# ফাংশনের JSON Schema ভিত্তিক সংজ্ঞা (সাধারণত ডিকশনারি হিসেবে পাঠানো হয়) functions = [ { "name": "get_weather", "description": "নির্দিষ্ট শহরের বর্তমান আবহাওয়া প্রদান করে", "parameters": { "type": "object", "properties": { "city": { "type": "string", "description": "শহরের নাম, যেমন ঢাকা, চট্টগ্রাম" } }, "required": ["city"] } } ] # LLM থেকে আসা একটি সম্ভাব্য রেসপন্স (সরলীকৃত) llm_response = { "function_call": { "name": "get_weather", "arguments": '{"city": "ঢাকা"}' } } # ডেভেলপার অ্যাপ্লিকেশনে ফাংশন এক্সিকিউশন import json func_name = llm_response["function_call"]["name"] args = json.loads(llm_response["function_call"]["arguments"]) def get_weather(city: str): # ডেমো লুকআপ; বাস্তবে API কল data = {"ঢাকা": "২৯°C, আর্দ্রতা ৭০%", "চট্টগ্রাম": "৩১°C, পরিষ্কার"} return json.dumps({"city": city, "weather": data.get(city, "তথ্য নেই")}) result = get_weather(**args) print(result) # মডেলের পরবর্তী প্রম্পটে এই JSON যাবেউপরের কোডে ফাংশন ডেফিনিশন, মডেলের JSON আউটপুট, এবং পরবর্তী ধাপে প্রকৃত ফাংশন কল দেখানো হয়েছে। LLM কোনো কোড চালায় না; বরং ডেভেলপার অ্যাপ্লিকেশনটি ফাংশন কল করে ও প্রাপ্ত ফলাফল আবার মডেলের কনটেক্সটে পাঠায়।
-
অনুরোধ তৈরি ও সাড়া: ইউজারের মেসেজ পাঠানোর সময়
functionsপ্যারামিটার সহ API কল করা হয় (OpenAI-র ক্ষেত্রে/v1/chat/completions)। মডেল যদি সিদ্ধান্ত নেয় যে ফাংশন কল প্রয়োজন, তাহলেfinish_reasonহয়function_callএবং রেসপন্সেfunction_callঅবজেক্ট থাকে। অন্যথায় স্বাভাবিক টেক্সট আউটপুট দেয়। -
পরবর্তী চক্র: ফাংশনের ফলাফল (সাধারণত JSON) একটি নতুন ইউজার বা সিস্টেম মেসেজ হিসেবে আবার মডেলে পাঠানো হয়। মডেল সে তথ্য ব্যবহার করে চূড়ান্ত, মানুষের উপযোগী উত্তর তৈরি করে। অনেক ক্ষেত্রে এটি একটি
assistantমেসেজ যে বলে “আপনার জন্য তথ্যটি এনেছি: …”।
এই পুরো চক্রটি একটি স্টেটফুল লুপের মতো কাজ করে, একে “ReAct” বা “Tool use” প্যাটার্নও বলা হয়। নিরাপদ ও নির্ভুল এজেন্টিক ওয়ার্কফ্লো নির্মাণে এই পদ্ধতি অপরিহার্য।
সেরা অনুশীলন ও নিরাপত্তা
ফাংশন কলিং বাস্তবায়নের সময় কিছু গুরুত্বপূর্ণ দিক মেনে চলতে হবে, যাতে সিস্টেম নিরাপদ ও নির্ভরযোগ্য থাকে।
- ফাংশনের ক্ষেত্র সংকীর্ণ রাখুন: প্রতিটি ফাংশন যেন মাত্র একটি কাজ করে, যেমন শুধুমাত্র আবহাওয়া আনা বা শুধু ডাটাবেস সার্চ। এতে মডেল সহজেই সঠিক ফাংশন বেছে নেয় এবং ভুল কলের সম্ভাবনা কমে।
- প্যারামিটারে কড়াকড়ি: JSON Schema-তে প্রতিটি প্রপার্টির টাইপ, প্রয়োজনীয়তা ও গ্রহণযোগ্য মানের তালিকা (
enum) সংজ্ঞায়িত করুন। যেমনcityপ্যারামিটারে কেবল পরিচিত শহরের নাম গ্রহণের অনুমতি দিন, অজানা মানের জন্য ডিফল্ট বা প্রত্যাখ্যান বার্তা দিন। - সার্ভার-সাইড ভ্যালিডেশন: LLM থেকে পাওয়া আর্গুমেন্টগুলো কখনোই সরাসরি API বা ডাটাবেস কুয়েরিতে ব্যবহার করবেন না। প্রথমে তা যাচাই (validate) ও স্যানিটাইজ করুন। ইনজেকশন বা অনাকাঙ্ক্ষিত কমান্ড কার্যকর হওয়ার ঝুঁকি এড়ানো জরুরি।
- অথেনটিকেশন ও অনুমতি: ফাংশন কলের আগে ইউজারের পরিচয় ও অনুমতি নিশ্চিত করুন। কোনো ইউজার যেন অপরের তথ্য অ্যাক্সেস করতে না পারে, বা সংবেদনশীল ফাংশন ব্যবহার করতে না পারে তা পরীক্ষা করা উচিত।
- এরর হ্যান্ডলিং: ফাংশন কল ব্যর্থ হলে (নেটওয়ার্ক ত্রুটি, অবৈধ ইনপুট) একটি পরিষ্কার এরর বার্তা মডেলে ফেরত পাঠান, যাতে মডেল ইউজারকে যথাযথভাবে জানাতে পারে অথবা বিকল্প পদক্ষেপ নিতে পারে।
- অডিট লগ: প্রতিটি ফাংশন কল ও তার আর্গুমেন্ট লগ করে রাখুন। পরে সমস্যা বিশ্লেষণ, ব্যবহার ট্র্যাকিং এবং মডেলের আচরণ উন্নত করতে এটি সহায়ক।
উপরোক্ত বিষয়গুলো মেনে চললে ফাংশন কলিং একটি শক্তিশালী ও নিরাপদ কর্মপদ্ধতি হিসেবে কাজ করবে, যা LLM-কে বাস্তব বিশ্বে কার্যকরী এজেন্টে রূপান্তরিত করে।
সারসংক্ষেপ
ফাংশন কলিং আধুনিক LLM ব্যবহারিক ক্ষেত্রে বিপ্লব এনেছে। এটি মডেলের ভাষাগত দক্ষতাকে বাস্তব সিস্টেমের সাথে যুক্ত করে, যার ফলে গতিশীল তথ্য পুনরুদ্ধার, সঠিক গণনা এবং নিরাপদ অটোমেশন সম্ভব হয়। JSON ফরম্যাটে ফাংশন ঘোষণা, মডেলের সিদ্ধান্তগ্রাহী শক্তি এবং ডেভেলপার-স্তরের কার্যকরীকরণের সমন্বয়ে তৈরি হয় একটি শক্তিশালী পাইপলাইন। সঠিক ভ্যালিডেশন, সংক্ষিপ্ত ফাংশন পরিধি এবং নিরাপত্তা চর্চা অবলম্বন করলে এই প্রযুক্তি চ্যাটবট থেকে শুরু করে জটিল অটোনোমাস এজেন্ট পর্যন্ত যেকোনো জায়গায় নিরাপদে ব্যবহার করা যায়।