টিউটোরিয়াল: Gemini API এর সাথে ফাংশন কলিং


ai.google.dev-এ দেখুন Google Colab-এ চালান GitHub-এ উৎস দেখুন

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

আপনি যদি ইতিমধ্যে না করে থাকেন, আরও জানতে ফাংশন কলিংয়ের ভূমিকা দেখুন।

সেটআপ

পাইথন SDK ইনস্টল করুন

Gemini API-এর জন্য Python SDK google-generativeai প্যাকেজে রয়েছে। পিপ ব্যবহার করে নির্ভরতা ইনস্টল করুন:

pip install -U -q google-generativeai

প্যাকেজ আমদানি করুন

প্রয়োজনীয় প্যাকেজ আমদানি করুন।

import pathlib
import textwrap
import time

import google.generativeai as genai

from IPython import display
from IPython.display import Markdown

def to_markdown(text):
  text = text.replace('•', '  *')
  return Markdown(textwrap.indent(text, '> ', predicate=lambda _: True))

আপনার API কী সেট আপ করুন

আপনি Gemini API ব্যবহার করার আগে, আপনাকে প্রথমে একটি API কী পেতে হবে। যদি আপনার কাছে ইতিমধ্যে একটি না থাকে তবে Google AI স্টুডিওতে এক ক্লিকে একটি কী তৈরি করুন৷

একটি API কী পান

Colab-এ, বাঁদিকের প্যানেলে "🔑"-এর নিচে সিক্রেট ম্যানেজারের কী যোগ করুন। এটিকে API_KEY নাম দিন।

একবার আপনার কাছে API কী হয়ে গেলে, এটি SDK-এ পাস করুন। আপনি এটি দুটি উপায়ে করতে পারেন:

  • কীটি GOOGLE_API_KEY এনভায়রনমেন্ট ভেরিয়েবলে রাখুন (SDK স্বয়ংক্রিয়ভাবে সেখান থেকে তুলে নেবে)।
  • genai.configure(api_key=...) এ কী পাস করুন
try:
    # Used to securely store your API key
    from google.colab import userdata

    # Or use `os.getenv('API_KEY')` to fetch an environment variable.
    GOOGLE_API_KEY=userdata.get('GOOGLE_API_KEY')
except ImportError:
    import os
    GOOGLE_API_KEY = os.environ['GOOGLE_API_KEY']

genai.configure(api_key=GOOGLE_API_KEY)

ফাংশন কলিং এর বেসিক

ফাংশন কলিং ব্যবহার করতে, একটি GenerativeModel তৈরি করার সময় tools প্যারামিটারে ফাংশনের একটি তালিকা পাস করুন। মডেলটি ফাংশনের নাম, ডকস্ট্রিং, প্যারামিটার এবং প্যারামিটার টাইপ টীকা ব্যবহার করে সিদ্ধান্ত নেয় যে এটি একটি প্রম্পটের সর্বোত্তম উত্তর দেওয়ার জন্য ফাংশনের প্রয়োজন কিনা।

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

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

model
genai.GenerativeModel(
    model_name='models/gemini-1.0-pro',
    generation_config={},
    safety_settings={},
    tools=<google.generativeai.types.content_types.FunctionLibrary object at 0x10e73fe90>,
)

চ্যাট ইন্টারফেসের মাধ্যমে ফাংশন কল ব্যবহার করার পরামর্শ দেওয়া হয়। এর কারণ হল ফাংশন কলগুলি স্বাভাবিকভাবেই মাল্টি-টার্ন চ্যাটের সাথে মানানসই কারণ তারা ব্যবহারকারী এবং মডেলের মধ্যে পিছনে-আগামী মিথস্ক্রিয়া ক্যাপচার করে। পাইথন SDK-এর ChatSession চ্যাটের জন্য একটি দুর্দান্ত ইন্টারফেস কারণ এটি আপনার জন্য কথোপকথনের ইতিহাস পরিচালনা করে এবং enable_automatic_function_calling প্যারামিটার ব্যবহার করে ফাংশন কলিং আরও সহজ করে:

chat = model.start_chat(enable_automatic_function_calling=True)

স্বয়ংক্রিয় ফাংশন কলিং সক্ষম সহ chat.send_message স্বয়ংক্রিয়ভাবে আপনার ফাংশনকে কল করে যদি মডেল এটি করতে বলে।

এটি সঠিক উত্তর সহ একটি পাঠ্য প্রতিক্রিয়া প্রদান করে বলে মনে হচ্ছে:

response = chat.send_message('I have 57 cats, each owns 44 mittens, how many mittens is that in total?')
response.text
'The total number of mittens is 2508.'
l10n
57*44
2508

কথোপকথনের প্রবাহ এবং কীভাবে ফাংশন কলগুলি এর মধ্যে একত্রিত হয় তা দেখতে চ্যাটের ইতিহাস পরীক্ষা করুন৷

ChatSession.history প্রপার্টি ব্যবহারকারী এবং জেমিনি মডেলের মধ্যে কথোপকথনের একটি কালানুক্রমিক রেকর্ড সংরক্ষণ করে। কথোপকথনের প্রতিটি মোড় একটি glm.Content অবজেক্ট দ্বারা প্রতিনিধিত্ব করা হয়, যাতে নিম্নলিখিত তথ্য রয়েছে:

  • ভূমিকা : বিষয়বস্তু "ব্যবহারকারী" বা "মডেল" থেকে উদ্ভূত কিনা তা সনাক্ত করে।
  • অংশ : glm.Part অবজেক্টের একটি তালিকা যা বার্তার পৃথক উপাদানগুলিকে প্রতিনিধিত্ব করে। শুধুমাত্র পাঠ্য মডেলের সাথে, এই অংশগুলি হতে পারে:
    • পাঠ্য : সরল পাঠ্য বার্তা।
    • ফাংশন কল ( glm.FunctionCall ): প্রদত্ত আর্গুমেন্ট সহ একটি নির্দিষ্ট ফাংশন চালানোর জন্য মডেল থেকে একটি অনুরোধ।
    • ফাংশন রেসপন্স ( glm.FunctionResponse ): অনুরোধ করা ফাংশনটি চালানোর পরে ব্যবহারকারীর দ্বারা ফলাফলটি ফিরে আসে।

মিটেন গণনার সাথে আগের উদাহরণে, ইতিহাস নিম্নলিখিত ক্রম দেখায়:

  1. ব্যবহারকারী : মিটেনের মোট সংখ্যা সম্পর্কে প্রশ্ন জিজ্ঞাসা করুন।
  2. মডেল : নির্ধারণ করে যে গুন ফাংশন সহায়ক এবং ব্যবহারকারীকে একটি ফাংশনকল অনুরোধ পাঠায়।
  3. ব্যবহারকারী : ChatSession স্বয়ংক্রিয়ভাবে ফাংশনটি চালায় ( enable_automatic_function_calling সেট হওয়ার কারণে) এবং গণনা করা ফলাফলের সাথে একটি FunctionResponse ফেরত পাঠায়।
  4. মডেল : চূড়ান্ত উত্তর তৈরি করতে ফাংশনের আউটপুট ব্যবহার করে এবং এটিকে পাঠ্য প্রতিক্রিয়া হিসাবে উপস্থাপন করে।
for content in chat.history:
    part = content.parts[0]
    print(content.role, "->", type(part).to_dict(part))
    print('-'*80)
user -> {'text': 'I have 57 cats, each owns 44 mittens, how many mittens is that in total?'}
--------------------------------------------------------------------------------
model -> {'function_call': {'name': 'multiply', 'args': {'a': 57.0, 'b': 44.0} } }
--------------------------------------------------------------------------------
user -> {'function_response': {'name': 'multiply', 'response': {'result': 2508.0} } }
--------------------------------------------------------------------------------
model -> {'text': 'The total number of mittens is 2508.'}
--------------------------------------------------------------------------------

সাধারণভাবে রাষ্ট্র চিত্র হল:

মডেল সর্বদা টেক্সট, বা একটি ফাংশন কল দিয়ে উত্তর দিতে পারে। যদি মডেলটি একটি ফাংশনকল পাঠায় তবে ব্যবহারকারীকে অবশ্যই একটি ফাংশন প্রতিক্রিয়া সহ উত্তর দিতে হবে

মডেলটি একটি পাঠ্য প্রতিক্রিয়া ফেরত দেওয়ার আগে একাধিক ফাংশন কলের সাথে প্রতিক্রিয়া জানাতে পারে এবং পাঠ্য প্রতিক্রিয়ার আগে ফাংশন কল আসে।

যদিও এটি সমস্ত স্বয়ংক্রিয়ভাবে পরিচালনা করা হয়েছিল, আপনার যদি আরও নিয়ন্ত্রণের প্রয়োজন হয়, আপনি করতে পারেন:

  • ডিফল্ট enable_automatic_function_calling=False ত্যাগ করুন এবং glm.FunctionCall প্রতিক্রিয়াগুলি নিজেই প্রক্রিয়া করুন।
  • অথবা GenerativeModel.generate_content ব্যবহার করুন, যেখানে আপনাকে চ্যাটের ইতিহাসও পরিচালনা করতে হবে।

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

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

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

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-pro-latest", 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 = [
    glm.Part(function_response=glm.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 ক্লায়েন্ট লাইব্রেরি আপনাকে সম্পূর্ণ নিয়ন্ত্রণ প্রদান করে নিম্ন স্তরের প্রকারগুলিতে অ্যাক্সেস প্রদান করে৷

import google.ai.generativelanguage as glm

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

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

model = genai.GenerativeModel(model_name='gemini-1.0-pro',
                             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"
   }
 }]

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

এখানে glm ক্লাস ব্যবহার করে লেখা একই গুন ফাংশনের জন্য একটি ঘোষণা রয়েছে।

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

calculator = glm.Tool(
    function_declarations=[
      glm.FunctionDeclaration(
        name='multiply',
        description="Returns the product of two numbers.",
        parameters=glm.Schema(
            type=glm.Type.OBJECT,
            properties={
                'a':glm.Schema(type=glm.Type.NUMBER),
                'b':glm.Schema(type=glm.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']} }]}
glm.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"
  }
}

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

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

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

মডেলটি একটি glm.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(
    glm.Content(
    parts=[glm.Part(
        function_response = glm.FunctionResponse(
          name='multiply',
          response={'result': result}))]))

সারসংক্ষেপ

বেসিক ফাংশন কলিং SDK-তে সমর্থিত। মনে রাখবেন যে চ্যাট-মোড ব্যবহার করে পরিচালনা করা সহজ, কারণ সামনে এবং পিছনে প্রাকৃতিক কাঠামো। আপনি আসলে ফাংশনগুলিকে কল করার এবং মডেলটিতে ফলাফলগুলি পাঠানোর দায়িত্বে আছেন যাতে এটি একটি পাঠ্য-প্রতিক্রিয়া তৈরি করতে পারে।