ইউনিট 9 / 11

এআই এজেন্ট এবং টুল ব্যবহার

লাভ:

  • একটি এজেন্টকে 'মডেল + টুলস + লুপ' হিসাবে সংজ্ঞায়িত করা এবং কখন এটি প্রয়োজন তা নির্ধারণ করা
  • নাম, বিবরণ এবং ইনপুট_স্কিমা সহ টুলের সংজ্ঞা লেখা
  • টুল_ব্যবহার এবং টুল_ফলাফল লুপের প্রবাহ এবং ত্রুটি পরিচালনা করা

এখন অবধি, মডেলটি সর্বদা একটি কাজ করেছে: পাঠ্য ইনপুট গ্রহণ করুন, পাঠ্য প্রতিক্রিয়া তৈরি করুন। কিন্তু বাস্তব কাজের জন্য প্রায়ই পাঠ্যের চেয়ে বেশি প্রয়োজন হয়; একটি গণনা সম্পাদন করা, একটি ডাটাবেস অনুসন্ধান করা, একটি API কল করা, একটি বর্তমান বিনিময় হার খুঁজে বের করা। মডেল নিজেই এই জিনিসগুলি করতে পারে না - তবে সে সিদ্ধান্ত নিতে পারে কখন সেগুলি করা দরকার এবং কাউকে সেগুলি করতে বলুন৷ এই টুল ব্যবহার মডেল দেয়, এবং এটি এআই এজেন্টদের ভিত্তি। এই ইউনিটে, আমরা শিখব একটি এজেন্ট কি, টুলটি কিভাবে সংজ্ঞায়িত করা হয় এবং কিভাবে tool_use লুপ কাজ করে।

এজেন্ট কি? মডেল + টুলস + লুপ

একটি AI এজেন্ট তিনটি অংশ নিয়ে গঠিত: মডেল (মস্তিষ্ক যে সিদ্ধান্ত নেয়), টুলস (মডেল যে ফাংশনগুলিকে কল করতে পারে: আবহাওয়া, ডাটাবেস ক্যোয়ারী, ইমেল পাঠাতে পারে), এবং লুপ (লুপ; মডেল টুলটিকে কল করে, ফলাফল পায়, আবার সিদ্ধান্ত নেয় কী করতে হবে, ইত্যাদি)।

সমালোচনামূলক পার্থক্য: একটি একক প্যাটার্ন কল একটি এজেন্ট নয়। এজেন্ট হল এমন একটি প্রক্রিয়া যেখানে মডেলটি ধাপে ধাপে এগিয়ে যায়, প্রতিটি ধাপে টুলের ফলাফলের উপর ভিত্তি করে পরবর্তী পদক্ষেপ বেছে নেয়। "মানুষের মতো চিন্তা করুন, আপনার হাত ব্যবহার করুন, ফলাফল দেখুন, আবার চিন্তা করুন।"

একটি গুরুত্বপূর্ণ তথ্য: মডেল নিজেই গাড়ি চালায় না। মডেলটি শুধু বলে "আমি এই ইনপুটগুলির সাথে এই টুলটিকে কল করতে চাই"। আপনার অ্যাপ্লিকেশনটি (একটি জোতা বলা হয়) টুলটি চালায় এবং ফলাফলটি মডেলে ফেরত দেয়। এটি নিরাপত্তার জন্য অত্যাবশ্যক: মডেলটি সরাসরি আপনার সিস্টেমকে স্পর্শ করে না; প্রতিটি কাজ আপনার নিয়ন্ত্রণে।

পরামর্শ: এজেন্টের সাথে প্রতিটি সমস্যা সমাধান করার চেষ্টা করবেন না। এজেন্ট; বিলম্ব, খরচ এবং ত্রুটির ঝুঁকি বাড়ায়। প্রথমে জিজ্ঞাসা করুন: "এটি কি একটি একক কল বা একটি নির্দিষ্ট ওয়ার্কফ্লো দিয়ে সমাধান করা হবে?" উত্তর যদি হ্যাঁ হয়, তাহলে এজেন্টের প্রয়োজন নেই। এজেন্ট ওপেন-এন্ডেড কাজের জন্য যেখানে পদক্ষেপগুলি আগে থেকে জানা যায় না।

টুলের সংজ্ঞা: নাম, বিবরণ, ইনপুট_স্কিমা

মডেলটিতে একটি টুল প্রবর্তন করতে, আপনি তিনটি জিনিস দেন:

  • নাম: গাড়ির পরিচয়, যেমন get_weather
  • বর্ণনা: টুলটি কী করে এবং কখন এটিকে কল করতে হয়। এটি সবচেয়ে গুরুত্বপূর্ণ ক্ষেত্র যা মডেলটিকে সঠিক সময়ে সঠিক টুল বেছে নিতে দেয়। শুধু "কি করে" লিখুন না বরং "কখন কল করুন।"
  • input_schema (ইনপুট স্কিমা): JSON স্কিমা যা সংজ্ঞায়িত করে যে টুলটি কোন প্যারামিটারগুলি আশা করে, কোন ধরনের।

# যানবাহনের সংজ্ঞা (ধারণাগত — JSON স্কিমা){ "নাম": "get_order_status", "description": "একটি অর্ডারের বর্তমান শিপিং স্ট্যাটাস পুনরুদ্ধার করে। যখন ব্যবহারকারী জিজ্ঞাসা করে যে একটি অর্ডার নম্বর কোথায় বা কখন পৌঁছাবে।", "input_schema": { "type": "object", "properties": "description": "description": "{description": {} "অর্ডার নম্বর, যেমন SP-1024"} }, "প্রয়োজনীয়": ["order_no"] }}

একটি ভাল টুলের বর্ণনার নিয়ম: পরিষ্কার এবং সংক্ষিপ্ত নাম, "কখন ব্যবহার করতে হবে" সহ বর্ণনা, প্রতিটি প্যারামিটারের জন্য বর্ণনা, সত্যিকারের বাধ্যতামূলক বিষয়গুলিকে প্রয়োজনে রাখা। যানবাহনের সংখ্যা ফোকাস রাখুন; কয়েক ডজন অনুরূপ গাড়ির মডেল আশ্চর্যজনক।

এলাকা

এটা কি করে?

ভাল উদাহরণ

খারাপ উদাহরণ

নাম

যানবাহন আইডি

order_status_getir

আনা

বর্ণনা

এটা কি করে + কখন কল করতে হবে

"কার্গো স্ট্যাটাস ফেরত দেয়; যখন ব্যবহারকারী জিজ্ঞাসা করে যে অর্ডার কোথায় আছে"

"ডেটা আনে"

input_schema

পরামিতি প্রকার এবং প্রয়োজনীয়তা

{order_no: স্ট্রিং, টীকা}

কোন ডায়াগ্রাম / কোন বর্ণনা নেই

টুল_ব্যবহার → টুল_ফলাফল লুপ

চক্রটি এভাবে কাজ করে, ধাপে ধাপে:

  1. আপনি মডেলটিতে ব্যবহারকারীর প্রশ্ন + টুলের বিবরণ পাঠান।
  2. মডেলটি হয় সরাসরি সাড়া দেয় বা একটি টুল_ব্যবহার ব্লক তৈরি করে: "order_no=SP-1024 সহ অর্ডার_দুরমু_গেটিরকে কল করুন।"
  3. আপনার অ্যাপ্লিকেশন আসলে টুল চালায় (ডাটাবেস প্রশ্ন)।
  4. আপনি ফলাফলটি টুল_ফলাফল হিসাবে মডেলে ফেরত পাঠান।
  5. এই ফলাফলের সাথে, মডেল হয় চূড়ান্ত উত্তর তৈরি করে বা অন্য টুল কল করে। চক্রটি চলতে থাকে যতক্ষণ না মডেলটি বলে "আমি শেষ করেছি।"

# এজেন্ট লুপ (ধারণাগত) বার্তাগুলি = [ব্যবহারকারী_প্রশ্ন] যখন সত্য: প্রতিক্রিয়া = model.uret(বার্তা, টুলস=টুল_ডেফিনিশন) যদি response.tur == "টুল_ব্যবহার": ফলাফল = harness.run(response.tool_name, response.entries) # আবেদন চালায় (response.tool_name, response.entries) # APPLICATION চালায় বার্তা, # চূড়ান্ত ফলাফল ফেরত += ফলাফল [অন্যথা] ফলাফল ফেরান প্রতিক্রিয়া লুপ শেষ

আধুনিক SDK গুলি টুল রানার অফার করে যা আপনার জন্য এই লুপটি চালায়; আপনি শুধু টুল ফাংশন লিখুন. কিন্তু পর্দার আড়ালে ঠিক সেটাই হচ্ছে।

ত্রুটি ব্যবস্থাপনা

টুল ব্যর্থ হতে পারে: অর্ডার পাওয়া যায়নি, API টাইম শেষ, ইনপুট অবৈধ। আপনি যদি টুলটি চালাতে না পারেন, একটি বর্ণনামূলক টুল_ফলাফল ("ত্রুটি: অর্ডার নম্বর SP-9999 পাওয়া যায়নি") এবং ত্রুটির পতাকা হিসাবে মডেলটিতে ত্রুটিটি ফেরত দিন। মডেলটি এটি দেখতে পারে এবং ব্যবহারকারীকে আলতো করে ব্যাখ্যা করতে পারে বা অন্য উপায়ে চেষ্টা করতে পারে। ত্রুটিটি গ্রাস করবেন না এবং খালি ফলাফল ফিরিয়ে দেবেন না; মডেল কি ভুল হয়েছে জানতে হবে.

দুর্বল/শক্তিশালী যানবাহনের বর্ণনা

দুর্বল (অনির্দিষ্ট বিশেষ্য, "কখন" নয়):

নাম: "ডেটা", বর্ণনা: "ডেটা আনে"# মডেলটি কখন এবং কিভাবে কল করতে হবে তা জানে না; এটি হয় মোটেও কল করে না বা ভুলভাবে কল করে।

শক্তিশালী (নেট নাম + কখন + প্যারামিটার বিবরণ):

নাম: "musteri_bakiyesi_getir" description: "একজন গ্রাহকের বর্তমান অ্যাকাউন্টের ব্যালেন্স ফেরত দেয়। যখন ব্যবহারকারী ডেবিট, ক্রেডিট বা ব্যালেন্সের জন্য জিজ্ঞাসা করে তখন কল করুন। পেমেন্ট করে না।" input_schema: {custeri_id: string ("Customer ID")}# মডেলটি সঠিক সময়ে কল করে, সঠিক প্যারামিটার সহ, জানুন।

তিনটি মিনি কেস

কেস 1 - অপ্রয়োজনীয় এজেন্ট। একটি দল একটি মাল্টি-টুল এজেন্টের সাথে "টেক্সট সারসংক্ষেপ" ব্যবসা তৈরি করেছে; প্রতিটি রিক্যাপে 4টি মডেল কল এবং 9 সেকেন্ড সময় লাগে৷ চাকরিটা আসলে এক কলের কাজ ছিল। যখন আমরা এজেন্টটিকে সরিয়ে দিয়েছি এবং এটি একটি একক কলে কমিয়েছি, সময় কমেছে 1.5 সেকেন্ড এবং খরচ কমেছে এক চতুর্থাংশে। পাঠ: যখন সত্যিই প্রয়োজন তখন এজেন্ট ব্যবহার করুন।

কেস 2 — দুর্বল ব্যাখ্যা, ভুল কল। একটি সাপোর্ট এজেন্টে, ফেচ নামে একটি অস্পষ্ট টুলকে এলোমেলোভাবে মডেলটি ব্যালেন্স প্রশ্ন এবং শিপিং প্রশ্ন উভয় ক্ষেত্রেই কল করেছিল। যখন যানবাহনগুলিকে ব্যালেন্স_গেটির এবং কার্গো_দুরুমু_গেটিরে ভাগ করা হয়েছিল এবং "কল কখন" ব্যাখ্যা যোগ করা হয়েছিল, 50টি উদাহরণের মধ্যে ভুল যানবাহন নির্বাচন 18 থেকে 1-এ নেমে এসেছে।

কেস 3 - ত্রুটি গ্রাস করা হয়েছে। অর্ডার পাওয়া না গেলে একজন এজেন্ট খালি ফলাফল ফিরিয়ে দিচ্ছিলেন; মডেলটি এটিকে "অর্ডারটি বিতরণ করা হয়েছে" হিসাবে ব্যাখ্যা করেছে এবং গ্রাহককে বিভ্রান্ত করেছে। যখন ত্রুটি বার্তাটি tool_result এ স্পষ্টভাবে লেখা হয় ("অর্ডার পাওয়া যায়নি"), মডেলটি সঠিকভাবে বলে "আমি এই নম্বরটি খুঁজে পাইনি, আপনি কি এটি পরীক্ষা করতে পারেন?" তিনি বলতে শুরু করেন।

সাধারণ ভুল

  • সবকিছুকে এজেন্টের দিকে ঘুরিয়ে দেওয়া: একটি কল যথেষ্ট হলেও, এজেন্ট খরচ এবং বিলম্ব যোগ করে।
  • গাড়ির অস্পষ্ট বিবরণ: মডেলটি কখন কল করতে হবে তা জানে না; ভুল নির্বাচন করে।
  • ভাবছেন যে মডেল গাড়ি চালায়: জোতা গাড়ি চালায়; মডেল শুধু চায়.
  • ত্রুটিটি গ্রাস করা: মডেলটি অবশ্যই জানতে হবে কি ভুল হয়েছে; ওপেন টুল_ফলাফল হিসাবে ত্রুটি দিন।
  • অনেকগুলি অনুরূপ যান: মডেল বিভ্রান্ত হয়; টুলসেট ফোকাসড এবং ন্যূনতম রাখুন।
মনোযোগ: শুধুমাত্র মডেলটি বলে "যে গাড়িটিকে কল করুন" এর অর্থ এই নয় যে পদক্ষেপ নেওয়া উচিত৷ ধ্বংসাত্মক সরঞ্জামগুলিতে (মুছুন, চেকআউট, ইমেল) আপনার অ্যাপ্লিকেশনটি অন্ধভাবে কলটি কার্যকর করা উচিত নয় — এটি পরবর্তী ইউনিটে সুরক্ষা বিষয়ের মূল।

সংক্ষেপে

  • এজেন্ট = মডেল (সিদ্ধান্ত) + টুলস (ফাংশন) + লুপ (কল টুল, ফলাফল পান, আবার সিদ্ধান্ত নিন)।
  • একটি একক প্যাটার্ন কল একটি এজেন্ট নয়; এজেন্ট একটি ধাপে ধাপে প্রক্রিয়া।
  • মডেল গাড়ি চালায় না; আপনার অ্যাপ্লিকেশনটি চলে (হার্নেস) এবং ফলাফলটি টুল_ফলাফল হিসাবে প্রদান করে।
  • টুলটি নাম, বর্ণনা (বিশেষভাবে "কল করার সময়"), এবং input_schema দ্বারা চিহ্নিত করা হয়।
  • টুল_ব্যবহার → হারনেস রান হিসাবে লুপ চলতে থাকে → টুল_ফলাফল → মডেলটি চলতে থাকে যতক্ষণ না মডেলটি "হয়েছে" বলে; ত্রুটি স্পষ্টভাবে মডেল রিপোর্ট করা হয়.

আবেদন টাস্ক

আপনার নিজের ব্যবসা থেকে 3টি টুল ডিজাইন করুন যা এজেন্টকে দেওয়া যেতে পারে। (1) প্রতিটির জন্য নাম, "কল কখন" সহ বিবরণ এবং ইনপুট_স্কিমা লিখুন; অন্তত একটি অ-ধ্বংসাত্মক পড়ার হাতিয়ার এবং একটি গণনা হতে দিন। (2) একটি বাস্তবসম্মত ব্যবহারকারীর প্রশ্ন চয়ন করুন এবং ম্যানুয়ালি ধাপে ধাপে লিখুন (একটি লুপে) এই টুলগুলির মধ্যে কোনটি মডেলটি কোন ইনপুটগুলির সাথে কল করবে এবং tool_result আসার পরে এটি কী করবে৷ (3) একটি দৃশ্যকল্প সেট আপ করুন যেখানে একটি টুল ব্যর্থ হয় এবং দেখান কিভাবে ত্রুটি বার্তাটি মডেলে ফিরে আসবে।

চেকলিস্ট

  • [ ] আমি এজেন্টকে "মডেল + টুলস + লুপ" হিসাবে সংজ্ঞায়িত করতে পারি এবং কখন এটি প্রয়োজন তা নির্ধারণ করতে পারি।
  • [ ] আমি জানি যে জোতা গাড়ি চালায়, মডেলটি কেবল এটি চায়।
  • আমি [ ] নাম, বিবরণ ("কল কখন") এবং input_schema সহ একটি কঠিন যানবাহনের বিবরণ লিখতে পারি।
  • আমি ধাপে ধাপে [ ] tool_use → tool_result চক্র অনুসরণ করতে পারি।
  • [ ] আমি ওপেন টুল_ফলাফল হিসেবে মডেলে টুল ত্রুটির রিপোর্ট করি।