টুল কলিং

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

টুল কলিং ব্যবহারের ক্ষেত্রে সাধারণত কয়েকটি থিমের মধ্যে পড়ে:

একটি LLM-কে তথ্যের অ্যাক্সেস দেওয়া যা এটির সাথে প্রশিক্ষিত ছিল না

  • ঘন ঘন তথ্য পরিবর্তন করা, যেমন রেস্তোরাঁর দৈনিক মেনু বা দোকানের ইনভেন্টরি স্ট্যাটাস।
  • আপনার অ্যাপ ডোমেনের জন্য নির্দিষ্ট তথ্য, যেমন পণ্যের তথ্য।

পুনরুদ্ধার অগমেন্টেড জেনারেশন (RAG) এর সাথে ওভারল্যাপটি নোট করুন, যা একটি এলএলএমকে তার প্রজন্মের মধ্যে বাস্তব তথ্য সংহত করার একটি উপায়। RAG হল একটি ভারী সমাধান যা সবচেয়ে উপযোগী হয় যখন আপনার কাছে প্রচুর পরিমাণে তথ্য থাকে বা প্রম্পটের সাথে সবচেয়ে প্রাসঙ্গিক তথ্য অস্পষ্ট হয়। অন্যদিকে, এলএলএম-এর প্রয়োজনীয় তথ্য পুনরুদ্ধার করা যদি একটি সাধারণ ফাংশন কল বা ডাটাবেস লুকআপ হয়, তাহলে টুল কলিং আরও উপযুক্ত।

একটি LLM কর্মপ্রবাহের মধ্যে একটি ডিটারমিনিজমের পরিচয়

  • LLM নির্ভরযোগ্যভাবে নিজেকে সম্পূর্ণ করতে পারে না এমন গণনা সম্পাদন করা।
  • একটি LLM-কে কিছু নির্দিষ্ট পরিস্থিতিতে মৌখিক পাঠ্য তৈরি করতে বাধ্য করা, যেমন একটি অ্যাপের পরিষেবার শর্তাবলী সম্পর্কে একটি প্রশ্নের উত্তর দেওয়ার সময়।

LLM দ্বারা সূচনা করার সময় একটি কর্ম সম্পাদন করা

  • এলএলএম-চালিত হোম অ্যাসিস্ট্যান্টে লাইট অন এবং অফ করা
  • এলএলএম-চালিত রেস্তোরাঁর এজেন্টে টেবিল রিজার্ভেশন

আপনি শুরু করার আগে

আপনি যদি এই পৃষ্ঠায় কোডের উদাহরণগুলি চালাতে চান, তাহলে প্রথমে শুরু করা গাইডের ধাপগুলি সম্পূর্ণ করুন৷ সমস্ত উদাহরণ অনুমান করে যে আপনি ইতিমধ্যে Genkit নির্ভরতা ইনস্টল সহ একটি প্রকল্প সেট আপ করেছেন।

এই পৃষ্ঠাটি জেনকিট মডেলের বিমূর্ততা এবং জেনারেট() ফাংশনের উন্নত বৈশিষ্ট্যগুলির একটি নিয়ে আলোচনা করে, তাই আপনি খুব গভীরভাবে ডুব দেওয়ার আগে, আপনার এআই মডেলগুলির সাথে তৈরি সামগ্রীর পৃষ্ঠার বিষয়বস্তুর সাথে পরিচিত হওয়া উচিত। ইনপুট এবং আউটপুট স্কিমাগুলি সংজ্ঞায়িত করার জন্য আপনার জেনকিটের সিস্টেমের সাথেও পরিচিত হওয়া উচিত, যা ফ্লোস পৃষ্ঠায় আলোচনা করা হয়েছে।

টুল কলিং এর ওভারভিউ

একটি উচ্চ স্তরে, একটি LLM-এর সাথে একটি সাধারণ টুল-কলিং মিথস্ক্রিয়া এইরকম দেখায়:

  1. কলিং অ্যাপ্লিকেশনটি একটি অনুরোধের সাথে LLM-কে অনুরোধ করে এবং প্রম্পটে এমন সরঞ্জামগুলির একটি তালিকা অন্তর্ভুক্ত করে যা LLM একটি প্রতিক্রিয়া তৈরি করতে ব্যবহার করতে পারে।
  2. এলএলএম হয় একটি সম্পূর্ণ প্রতিক্রিয়া তৈরি করে বা একটি নির্দিষ্ট বিন্যাসে একটি টুল কল অনুরোধ তৈরি করে।
  3. যদি কলকারী একটি সম্পূর্ণ প্রতিক্রিয়া পায়, অনুরোধটি পূর্ণ হয় এবং মিথস্ক্রিয়া শেষ হয়; কিন্তু যদি কলকারী একটি টুল কল গ্রহণ করে, তবে এটি যুক্তিযুক্ত যাই হোক না কেন তা সঞ্চালন করে এবং LLM-কে একটি নতুন অনুরোধ পাঠায় যাতে মূল প্রম্পট বা এর কিছু ভিন্নতা এবং সেইসাথে টুল কলের ফলাফল থাকে।
  4. LLM ধাপ 2-এর মতো নতুন প্রম্পট পরিচালনা করে।

এটি কাজ করার জন্য, বেশ কয়েকটি প্রয়োজনীয়তা পূরণ করতে হবে:

  • মডেলটিকে অবশ্যই প্রম্পট সম্পূর্ণ করার প্রয়োজন হলে টুল অনুরোধ করার জন্য প্রশিক্ষিত হতে হবে। জেমিনি এবং ক্লডের মতো ওয়েব API-এর মাধ্যমে সরবরাহ করা বেশিরভাগ বড় মডেলগুলি এটি করতে পারে, তবে ছোট এবং আরও বিশেষায়িত মডেলগুলি প্রায়শই করতে পারে না। Genkit একটি ত্রুটি নিক্ষেপ করবে যদি আপনি এমন একটি মডেলকে সরঞ্জাম সরবরাহ করার চেষ্টা করেন যা এটি সমর্থন করে না।
  • কলিং অ্যাপ্লিকেশানটিকে অবশ্যই মডেলটিকে টুলের সংজ্ঞা প্রদান করতে হবে যা এটি প্রত্যাশা করে৷
  • কলিং অ্যাপ্লিকেশানটি অবশ্যই মডেলটিকে অনুরোধ করবে যে ফর্ম্যাটে অ্যাপ্লিকেশনটি প্রত্যাশা করে টুল কলিং অনুরোধগুলি তৈরি করতে৷

Genkit সঙ্গে টুল কলিং

Genkit এটি সমর্থন করে এমন মডেলগুলির সাথে টুল কল করার জন্য একটি একক ইন্টারফেস প্রদান করে। প্রতিটি মডেল প্লাগইন নিশ্চিত করে যে উপরের মানদণ্ডের শেষ দুটি পূরণ হয়েছে এবং generate() ফাংশনটি স্বয়ংক্রিয়ভাবে পূর্বে বর্ণিত টুল কলিং লুপটি বহন করে।

মডেল সমর্থন

টুল কলিং সমর্থন মডেল, মডেল API, এবং Genkit প্লাগইনের উপর নির্ভর করে। টুল কলিং সমর্থিত হতে পারে কিনা তা নির্ধারণ করতে প্রাসঙ্গিক ডকুমেন্টেশনের সাথে পরামর্শ করুন। উপরন্তু:

  • Genkit একটি ত্রুটি নিক্ষেপ করবে যদি আপনি এমন একটি মডেলকে সরঞ্জাম সরবরাহ করার চেষ্টা করেন যা এটি সমর্থন করে না।
  • যদি প্লাগইন মডেলের রেফারেন্স রপ্তানি করে, তাহলে info.supports.tools প্রপার্টি নির্দেশ করবে যে এটি টুল কলিং সমর্থন করে কিনা।

সংজ্ঞায়িত সরঞ্জাম

টুল সংজ্ঞা লিখতে defineTool() ফাংশন ব্যবহার করুন:

const specialToolInputSchema = z.object({ meal: z.enum(["breakfast", "lunch", "dinner"]) });
const specialTool = defineTool(
  {
    name: "specialTool",
    description: "Retrieves today's special for the given meal",
    inputSchema: specialToolInputSchema,
    outputSchema: z.string(),
  },
  async ({ meal }): Promise<string> => {
    // Retrieve up-to-date information and return it. Here, we just return a
    // fixed value.
    return "Baked beans on toast";
  }
);

এখানে সিনট্যাক্স দেখতে ঠিক defineFlow() সিনট্যাক্সের মতো; যাইহোক, name , description , inputSchema , এবং outputSchema পরামিতিগুলির চারটিই প্রয়োজন৷ একটি টুলের সংজ্ঞা লেখার সময়, এই পরামিতিগুলির শব্দ এবং বর্ণনার সাথে বিশেষ যত্ন নিন, কারণ এগুলি এলএলএম-এর জন্য উপলব্ধ সরঞ্জামগুলি কার্যকরভাবে ব্যবহার করার জন্য অত্যাবশ্যক।

আপনার প্রম্পট সহ সরঞ্জাম সহ

আপনি আপনার সরঞ্জামগুলি সংজ্ঞায়িত করার পরে, generate() এর টুল প্যারামিটারে সেগুলি নির্দিষ্ট করুন:

const llmResponse = await generate({
  model: gemini15Flash,
  prompt,
  tools: [specialTool],
});

আপনি একাধিক টুল উপলব্ধ করতে পারেন; LLM প্রম্পটটি সম্পূর্ণ করার জন্য প্রয়োজনীয় সরঞ্জামগুলিকে কল করবে।

স্পষ্টভাবে টুল কল পরিচালনা

ডিফল্টরূপে, প্রতিটি টুল কলের সমাধান না হওয়া পর্যন্ত Genkit বারবার LLM-কে কল করে। আপনি যদি এই টুল কলিং লুপের উপর আরও নিয়ন্ত্রণ চান, উদাহরণস্বরূপ আরও জটিল যুক্তি প্রয়োগ করতে, returnToolRequests প্যারামিটারটিকে true সেট করুন। এখন সমস্ত টুল অনুরোধ পূর্ণ হয়েছে তা নিশ্চিত করার দায়িত্ব আপনার:

let generateOptions: GenerateOptions = {
  model: gemini15Flash,
  prompt,
  tools: [specialTool],
  returnToolRequests: true,
};
let llmResponse;
while (true) {
  llmResponse = await generate(generateOptions);
  const toolRequests = llmResponse.toolRequests();
  if (toolRequests.length < 1) {
    break;
  }
  const toolResponses: ToolResponsePart[] = await Promise.all(
    toolRequests.map(async (part) => {
      switch (part.toolRequest.name) {
        case "specialTool":
          return {
            toolResponse: {
              name: part.toolRequest.name,
              ref: part.toolRequest.ref,
              output: await specialTool(specialToolInputSchema.parse(part.toolRequest?.input)),
            },
          };
        default:
          throw Error('Tool not found');
        }
      }));
    generateOptions.history = llmResponse.toHistory();
    generateOptions.prompt = toolResponses;
}