টুল কলিং

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

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

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

  • ঘন ঘন তথ্য পরিবর্তন করা, যেমন একটি স্টক মূল্য বা বর্তমান আবহাওয়া।
  • আপনার অ্যাপ ডোমেনের জন্য নির্দিষ্ট তথ্য, যেমন পণ্যের তথ্য বা ব্যবহারকারীর প্রোফাইল।

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

মডেল সমর্থন

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

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

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

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

import (
    "context"
    "log"

    "github.com/firebase/genkit/go/ai"
    "github.com/firebase/genkit/go/genkit"
    "github.com/firebase/genkit/go/plugins/googlegenai"
)

func main() {
    ctx := context.Background()

    g, err := genkit.Init(ctx,
        genkit.WithPlugins(&googlegenai.GoogleAI{}),
        genkit.WithDefaultModel("googleai/gemini-2.0-flash"),
    )
    if err != nil {
      log.Fatal(err)
    }

    getWeatherTool := genkit.DefineTool(
        g, "getWeather", "Gets the current weather in a given location",
        func(ctx *ai.ToolContext, location string) (string, error) {
            // Here, we would typically make an API call or database query. For this
            // example, we just return a fixed value.
            return fmt.Sprintf("The current weather in %s is 63°F and sunny.", location);
        })
}

এখানে সিনট্যাক্স দেখতে genkit.DefineFlow() সিনট্যাক্সের মতই; যাইহোক, আপনি একটি বিবরণ লিখতে হবে. বর্ণনার শব্দ এবং বর্ণনার ক্ষেত্রে বিশেষ যত্ন নিন কারণ এটি যথাযথভাবে ব্যবহার করার সিদ্ধান্ত নেওয়া LLM-এর জন্য অত্যাবশ্যক।

টুল ব্যবহার করে

বিষয়বস্তু তৈরি করতে আপনার প্রম্পটে সংজ্ঞায়িত সরঞ্জামগুলি অন্তর্ভুক্ত করুন।

তৈরি করুন

resp, err := genkit.Generate(ctx, g,
    ai.WithPrompt("What is the weather in San Francisco?"),
    ai.WithTools(getWeatherTool),
)

ডিফাইন প্রম্পট

weatherPrompt, err := genkit.DefinePrompt(g, "weatherPrompt",
    ai.WithPrompt("What is the weather in {{location}}?"),
    ai.WithTools(getWeatherTool),
)
if err != nil {
    log.Fatal(err)
}

resp, err := weatherPrompt.Execute(ctx,
    with.Input(map[string]any{"location": "San Francisco"}),
)

প্রম্পট ফাইল

---
system: "Answer questions using the tools you have."
tools: [getWeather]
input:
  schema:
    location: string
---

What is the weather in {{location}}?

তারপর আপনি নিম্নলিখিত হিসাবে আপনার কোডে প্রম্পট চালাতে পারেন:

// Assuming prompt file named weatherPrompt.prompt exists in ./prompts dir.
weatherPrompt := genkit.LookupPrompt("weatherPrompt")
if weatherPrompt == nil {
    log.Fatal("no prompt named 'weatherPrompt' found")
}

resp, err := weatherPrompt.Execute(ctx,
    ai.WithInput(map[string]any{"location": "San Francisco"}),
)

প্রম্পটের উত্তর দেওয়ার জন্য LLM-কে getWeather টুল ব্যবহার করতে হলে Genkit স্বয়ংক্রিয়ভাবে টুল কলটি পরিচালনা করবে।

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

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

getWeatherTool := genkit.DefineTool(
    g, "getWeather", "Gets the current weather in a given location",
    func(ctx *ai.ToolContext, location string) (string, error) {
        // Tool implementation...
    })

resp, err := genkit.Generate(ctx, g,
    ai.WithPrompt("What is the weather in San Francisco?"),
    ai.WithTools(getWeatherTool),
    ai.WithReturnToolRequests(true),
)
if err != nil {
    log.Fatal(err)
}

parts := []*Part{}
for _, req := range resp.ToolRequests() {
    tool := genkit.LookupTool(g, req.Name)
    if tool == nil {
        log.Fatalf("tool %q not found", req.Name)
    }

    output, err := tool.RunRaw(ctx, req.Input)
    if err != nil {
        log.Fatalf("tool %q execution failed: %v", err)
    }

    parts = append(parts,
        ai.NewToolResponsePart(&ai.ToolResponse{
            Name:   req.Name,
            Ref:    req.Ref,
            Output: output,
        }))
}

resp, err = genkit.Generate(ctx, g,
    ai.WithMessages(resp.History()..., NewMessage(ai.RoleTool, nil, parts...)),
)
if err != nil {
    log.Fatal(err)
}