ফাংশন কলিং টিউটোরিয়াল

ফাংশন কলিং আপনার জন্য জেনারেটিভ মডেল থেকে স্ট্রাকচার্ড ডেটা আউটপুট পেতে সহজ করে তোলে। তারপরে আপনি এই আউটপুটগুলি ব্যবহার করে অন্যান্য API কল করতে এবং মডেলে প্রাসঙ্গিক প্রতিক্রিয়া ডেটা ফেরত দিতে পারেন। অন্য কথায়, ফাংশন কলিং আপনাকে জেনারেটিভ মডেলগুলিকে বাহ্যিক সিস্টেমের সাথে সংযুক্ত করতে সাহায্য করে যাতে তৈরি করা সামগ্রীতে সর্বাধিক আপ-টু-ডেট এবং সঠিক তথ্য অন্তর্ভুক্ত থাকে।

আপনি ফাংশন বর্ণনা সহ মিথুন মডেল প্রদান করতে পারেন. এগুলি এমন ফাংশন যা আপনি আপনার অ্যাপের ভাষায় লেখেন (অর্থাৎ, এগুলি Google ক্লাউড ফাংশন নয়)৷ মডেলটি আপনাকে একটি ফাংশন কল করতে এবং মডেলটিকে আপনার প্রশ্ন পরিচালনা করতে সহায়তা করার জন্য ফলাফলটি ফেরত পাঠাতে বলতে পারে।

আপনি যদি ইতিমধ্যে না করে থাকেন, আরও জানতে ফাংশন কলিংয়ের ভূমিকা দেখুন। এছাড়াও আপনি Google Colab- এ এই বৈশিষ্ট্যটি ব্যবহার করে দেখতে পারেন বা Gemini API কুকবুক সংগ্রহস্থলে উদাহরণ কোডটি দেখতে পারেন।

আলো নিয়ন্ত্রণের জন্য উদাহরণ API

কল্পনা করুন যে আপনার কাছে একটি অ্যাপ্লিকেশন প্রোগ্রামিং ইন্টারফেস (API) সহ একটি মৌলিক আলো নিয়ন্ত্রণ ব্যবস্থা রয়েছে এবং আপনি ব্যবহারকারীদের সাধারণ পাঠ্য অনুরোধের মাধ্যমে আলো নিয়ন্ত্রণ করার অনুমতি দিতে চান। আপনি ব্যবহারকারীদের কাছ থেকে আলো পরিবর্তনের অনুরোধগুলি ব্যাখ্যা করতে এবং আলোর মান সেট করতে API কলগুলিতে অনুবাদ করতে ফাংশন কলিং বৈশিষ্ট্যটি ব্যবহার করতে পারেন। এই কাল্পনিক আলো নিয়ন্ত্রণ ব্যবস্থা আপনাকে আলোর উজ্জ্বলতা নিয়ন্ত্রণ করতে দেয় এবং এর রঙের তাপমাত্রা, দুটি পৃথক পরামিতি হিসাবে সংজ্ঞায়িত করা হয়:

প্যারামিটার টাইপ প্রয়োজন বর্ণনা
brightness সংখ্যা হ্যাঁ 0 থেকে 100 পর্যন্ত আলোর স্তর। শূন্য বন্ধ এবং 100 হল সম্পূর্ণ উজ্জ্বলতা।
colorTemperature স্ট্রিং হ্যাঁ আলোর ফিক্সচারের রঙের তাপমাত্রা যা daylight , cool বা warm হতে পারে।

সরলতার জন্য, এই কাল্পনিক আলো ব্যবস্থায় শুধুমাত্র একটি আলো রয়েছে, তাই ব্যবহারকারীকে একটি ঘর বা অবস্থান নির্দিষ্ট করতে হবে না। দিনের আলোর রঙের তাপমাত্রা ব্যবহার করে আলোর মাত্রা 50% এ পরিবর্তন করতে আপনি আলোক নিয়ন্ত্রণ API এ পাঠাতে পারেন এমন JSON অনুরোধের উদাহরণ এখানে রয়েছে:

{
  "brightness": "50",
  "colorTemperature": "daylight"
}

এই টিউটোরিয়ালটি আপনাকে দেখায় কিভাবে Gemini API-এর জন্য একটি ফাংশন কল সেট আপ করতে হয় যাতে ব্যবহারকারীদের আলোর অনুরোধগুলি ব্যাখ্যা করতে হয় এবং আলোর উজ্জ্বলতা এবং রঙের তাপমাত্রার মান নিয়ন্ত্রণ করতে API সেটিংসে তাদের ম্যাপ করতে হয়।

আপনি শুরু করার আগে: আপনার প্রকল্প এবং API কী সেট আপ করুন

Gemini API কল করার আগে, আপনাকে আপনার প্রকল্প সেট আপ করতে হবে এবং আপনার API কী কনফিগার করতে হবে।

একটি API ফাংশন সংজ্ঞায়িত করুন

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

def set_light_values(brightness, color_temp):
    """Set the brightness and color temperature of a room light. (mock API).

    Args:
        brightness: Light level from 0 to 100. Zero is off and 100 is full brightness
        color_temp: Color temperature of the light fixture, which can be `daylight`, `cool` or `warm`.

    Returns:
        A dictionary containing the set brightness and color temperature.
    """
    return {
        "brightness": brightness,
        "colorTemperature": color_temp
    }

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

মডেল ইনিশিয়ালাইজেশনের সময় ফাংশন ঘোষণা করুন

আপনি যখন একটি মডেলের সাথে ফাংশন কলিং ব্যবহার করতে চান, আপনি মডেল অবজেক্ট শুরু করার সময় আপনাকে অবশ্যই আপনার ফাংশনগুলি ঘোষণা করতে হবে। আপনি মডেলের tools প্যারামিটার সেট করে ফাংশন ঘোষণা করেন:

model = genai.GenerativeModel(model_name='gemini-1.5-flash',
                              tools=[set_light_values])

একটি ফাংশন কল তৈরি করুন

একবার আপনি আপনার ফাংশন ঘোষণার সাথে মডেলটি শুরু করলে, আপনি সংজ্ঞায়িত ফাংশন সহ মডেলটিকে অনুরোধ করতে পারেন। আপনার চ্যাট প্রম্পটিং ( sendMessage() ) ব্যবহার করে ফাংশন কলিং ব্যবহার করা উচিত, যেহেতু ফাংশন কলিং সাধারণত পূর্ববর্তী প্রম্পট এবং প্রতিক্রিয়াগুলির প্রসঙ্গ থাকার ফলে উপকৃত হয়।

chat = model.start_chat()
response = chat.send_message('Dim the lights so the room feels cozy and warm.')
response.text

পাইথন SDK-এর ChatSession অবজেক্ট আপনার জন্য কথোপকথনের ইতিহাস পরিচালনা করে চ্যাট সেশন পরিচালনা করা সহজ করে। SDK স্বয়ংক্রিয়ভাবে ফাংশনটি কল করার জন্য আপনি enable_automatic_function_calling ব্যবহার করতে পারেন।

# Create a chat session that automatically makes suggested function calls
chat = model.start_chat(enable_automatic_function_calling=True)

সমান্তরাল ফাংশন কলিং

উপরে বর্ণিত মৌলিক ফাংশন কলিং ছাড়াও, আপনি একটি একক পালা একাধিক ফাংশন কল করতে পারেন। এই বিভাগে আপনি কিভাবে সমান্তরাল ফাংশন কলিং ব্যবহার করতে পারেন তার একটি উদাহরণ দেখায়।

টুল সংজ্ঞায়িত করুন।

def power_disco_ball(power: bool) -> bool:
    """Powers the spinning disco ball."""
    print(f"Disco ball is {'spinning!' if power else 'stopped.'}")
    return True


def start_music(energetic: bool, loud: bool, bpm: int) -> str:
    """Play some music matching the specified parameters.

    Args:
      energetic: Whether the music is energetic or not.
      loud: Whether the music is loud or not.
      bpm: The beats per minute of the music.

    Returns: The name of the song being played.
    """
    print(f"Starting music! {energetic=} {loud=}, {bpm=}")
    return "Never gonna give you up."


def dim_lights(brightness: float) -> bool:
    """Dim the lights.

    Args:
      brightness: The brightness of the lights, 0.0 is off, 1.0 is full.
    """
    print(f"Lights are now set to {brightness:.0%}")
    return True

এখন মডেলটিকে একটি নির্দেশ সহ কল ​​করুন যা নির্দিষ্ট সমস্ত সরঞ্জাম ব্যবহার করতে পারে।

# Set the model up with tools.
house_fns = [power_disco_ball, start_music, dim_lights]

model = genai.GenerativeModel(model_name="gemini-1.5-flash", tools=house_fns)

# Call the API.
chat = model.start_chat()
response = chat.send_message("Turn this place into a party!")

# Print out each of the function calls requested from this single call.
for part in response.parts:
    if fn := part.function_call:
        args = ", ".join(f"{key}={val}" for key, val in fn.args.items())
        print(f"{fn.name}({args})")
power_disco_ball(power=True)
start_music(energetic=True, loud=True, bpm=120.0)
dim_lights(brightness=0.3)

প্রতিটি মুদ্রিত ফলাফল একটি একক ফাংশন কল প্রতিফলিত করে যা মডেল অনুরোধ করেছে। ফলাফলগুলি ফেরত পাঠাতে, তাদের অনুরোধ করা হয়েছিল একই ক্রমে প্রতিক্রিয়াগুলি অন্তর্ভুক্ত করুন৷

# Simulate the responses from the specified tools.
responses = {
    "power_disco_ball": True,
    "start_music": "Never gonna give you up.",
    "dim_lights": True,
}

# Build the response parts.
response_parts = [
    genai.protos.Part(function_response=genai.protos.FunctionResponse(name=fn, response={"result": val}))
    for fn, val in responses.items()
]

response = chat.send_message(response_parts)
print(response.text)
Let's get this party started! I've turned on the disco ball, started playing some upbeat music, and dimmed the lights. 🎶✨  Get ready to dance! 🕺💃

ফাংশন কল ডেটা টাইপ ম্যাপিং

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

AllowedType = (int | float | bool | str | list['AllowedType'] | dict[str, AllowedType])

google.ai.generativelanguage ক্লায়েন্ট লাইব্রেরি আপনাকে সম্পূর্ণ নিয়ন্ত্রণ প্রদান করে নিম্ন স্তরের প্রকারগুলিতে অ্যাক্সেস প্রদান করে৷

মডেলের _tools অ্যাট্রিবিউটের ভিতরে প্রথমে উঁকি দিয়ে দেখুন, আপনি দেখতে পাবেন যে এটি কীভাবে মডেলটিতে পাস করা ফাংশন(গুলি) বর্ণনা করে:

def multiply(a:float, b:float):
    """returns a * b."""
    return a*b

model = genai.GenerativeModel(model_name='gemini-1.5-flash',
                             tools=[multiply])

model._tools.to_proto()
[function_declarations {
   name: "multiply"
   description: "returns a * b."
   parameters {
     type_: OBJECT
     properties {
       key: "b"
       value {
         type_: NUMBER
       }
     }
     properties {
       key: "a"
       value {
         type_: NUMBER
       }
     }
     required: "a"
     required: "b"
   }
 }]

এটি genai.protos.Tool অবজেক্টের তালিকা প্রদান করে যা API এ পাঠানো হবে। যদি মুদ্রিত বিন্যাসটি পরিচিত না হয় তবে এর কারণ হল এইগুলি হল গুগল প্রোটোবাফ ক্লাস। প্রতিটি genai.protos.Tool (এই ক্ষেত্রে 1) genai.protos.FunctionDeclarations এর একটি তালিকা রয়েছে, যা একটি ফাংশন এবং এর আর্গুমেন্ট বর্ণনা করে।

এখানে genai.protos ক্লাস ব্যবহার করে লেখা একই গুন ফাংশনের জন্য একটি ঘোষণা রয়েছে। মনে রাখবেন যে এই ক্লাসগুলি শুধুমাত্র API এর জন্য ফাংশন বর্ণনা করে, তারা এটির বাস্তবায়ন অন্তর্ভুক্ত করে না। সুতরাং এটি ব্যবহার করে স্বয়ংক্রিয় ফাংশন কলিংয়ের সাথে কাজ করে না, তবে ফাংশনগুলির সর্বদা একটি বাস্তবায়নের প্রয়োজন হয় না।

calculator = genai.protos.Tool(
    function_declarations=[
      genai.protos.FunctionDeclaration(
        name='multiply',
        description="Returns the product of two numbers.",
        parameters=genai.protos.Schema(
            type=genai.protos.Type.OBJECT,
            properties={
                'a':genai.protos.Schema(type=genai.protos.Type.NUMBER),
                'b':genai.protos.Schema(type=genai.protos.Type.NUMBER)
            },
            required=['a','b']
        )
      )
    ])

সমানভাবে, আপনি এটিকে একটি JSON- সামঞ্জস্যপূর্ণ বস্তু হিসাবে বর্ণনা করতে পারেন:

calculator = {'function_declarations': [
      {'name': 'multiply',
       'description': 'Returns the product of two numbers.',
       'parameters': {'type_': 'OBJECT',
       'properties': {
         'a': {'type_': 'NUMBER'},
         'b': {'type_': 'NUMBER'} },
       'required': ['a', 'b']} }]}
genai.protos.Tool(calculator)
function_declarations {
  name: "multiply"
  description: "Returns the product of two numbers."
  parameters {
    type_: OBJECT
    properties {
      key: "b"
      value {
        type_: NUMBER
      }
    }
    properties {
      key: "a"
      value {
        type_: NUMBER
      }
    }
    required: "a"
    required: "b"
  }
}

যেভাবেই হোক, আপনি একটি genai.protos.Tool বা টুলের তালিকার উপস্থাপনা পাস করুন

model = genai.GenerativeModel('gemini-1.5-flash', tools=calculator)
chat = model.start_chat()

response = chat.send_message(
    f"What's 234551 X 325552 ?",
)

মডেলটি একটি genai.protos.FunctionCall ফেরত দেওয়ার আগে যেমন ক্যালকুলেটরের multiply ফাংশনকে আহ্বান করে:

response.candidates
[index: 0
content {
  parts {
    function_call {
      name: "multiply"
      args {
        fields {
          key: "b"
          value {
            number_value: 325552
          }
        }
        fields {
          key: "a"
          value {
            number_value: 234551
          }
        }
      }
    }
  }
  role: "model"
}
finish_reason: STOP
]

ফাংশনটি নিজেই চালান:

fc = response.candidates[0].content.parts[0].function_call
assert fc.name == 'multiply'

result = fc.args['a'] * fc.args['b']
result
76358547152.0

কথোপকথন চালিয়ে যেতে মডেলে ফলাফল পাঠান:

response = chat.send_message(
    genai.protos.Content(
    parts=[genai.protos.Part(
        function_response = genai.protos.FunctionResponse(
          name='multiply',
          response={'result': result}))]))