মিথুনে ফাংশন কলিং ব্যবহার করে API-এর সাথে কীভাবে ইন্টারঅ্যাক্ট করবেন

১. সংক্ষিপ্ত বিবরণ

জেমিনিতে ফাংশন কলিং কী?

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

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

ফাংশন কলিং কীভাবে কাজ করে

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

এপিআই ইন্টারফেস

আপনি যা তৈরি করবেন

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

আপনি যা শিখবেন

  • পাইথন ক্লায়েন্ট লাইব্রেরি ব্যবহার করে জেমিনি মডেলের সাথে কীভাবে যোগাযোগ করবেন
  • কীভাবে একটি ফাংশন ডিক্লারেশন সংজ্ঞায়িত করতে হয় এবং এটিকে একটি টুল হিসাবে রেজিস্টার করতে হয়
  • কীভাবে জেমিনিকে কল করবেন এবং ফাংশন কল প্রতিক্রিয়া পাবেন
  • ফাংশনের প্রতিক্রিয়াটি কীভাবে জেমিনিতে ফেরত পাঠাবেন এবং ব্যবহারকারীকে উত্তর দেবেন

আপনার যা যা লাগবে

২. সেটআপ এবং প্রয়োজনীয়তা

জেমিনিতে ফাংশন কলিং ব্যবহার শুরু করার আগে, আপনাকে ভার্টেক্স এআই এপিআই (Vertex AI API) সক্রিয় করতে হবে এবং ভার্টেক্স এআই পাইথন ক্লায়েন্ট লাইব্রেরির সর্বশেষ সংস্করণটি ইনস্টল করতে হবে।

ভার্টেক্স এআই এপিআই সক্রিয় করুন

Vertex AI API সক্রিয় করতে, এই ধাপগুলো অনুসরণ করুন:

  1. আপনার ব্রাউজারে Vertex AI API Service Details পেজটিতে যান।
  2. আপনার গুগল ক্লাউড প্রজেক্টে ভার্টেক্স এআই এপিআই (Vertex AI API) সক্রিয় করতে এনাবল (Enable) বোতামটি ক্লিক করুন।

Vertex AI-এর জন্য পাইথন ক্লায়েন্ট লাইব্রেরি ইনস্টল করুন

Vertex AI-এর জন্য পাইথন ক্লায়েন্ট লাইব্রেরি ইনস্টল করতে, এই ধাপগুলো অনুসরণ করুন:

  1. আপনার ডেভেলপমেন্ট এনভায়রনমেন্টে একটি টার্মিনাল খুলুন।
  2. আপনার একটি বৈধ পাইথন ডেভেলপমেন্ট এনভায়রনমেন্ট আছে কিনা তা যাচাই করুন, এবং প্রয়োজনে এই নির্দেশিকাগুলো দেখুন।
  3. Vertex AI-এর জন্য পাইথন ক্লায়েন্ট লাইব্রেরি ইনস্টল করতে নিম্নলিখিত কমান্ডটি চালান:
    pip install --upgrade google-cloud-aiplatform
    
  4. আপনি যদি নোটবুক পরিবেশে কাজ করেন, তাহলে নতুন ইনস্টল করা প্যাকেজগুলো ব্যবহার করার জন্য আপনার রানটাইম/কার্নেল রিস্টার্ট করার প্রয়োজন হতে পারে।

এখন আপনি ভার্টেক্স এআই এপিআই ব্যবহার করার জন্য প্রস্তুত!

৩. সমস্যাটি বুঝুন

আপনি কি কখনো কোনো বৃহৎ ল্যাঙ্গুয়েজ মডেল বা জেনারেটিভ এআই মডেলের সাথে যোগাযোগ করে রিয়েল-টাইম বা সাম্প্রতিক তথ্য জানতে চেয়েছেন, এবং তার উত্তরে পুরোনো বা ভুল তথ্য পেয়েছেন?

চলুন এখন চেষ্টা করা যাক! প্রথমে, আমরা প্রাসঙ্গিক পাইথন প্যাকেজগুলো ইম্পোর্ট করব এবং জেমিনি মডেলটি ইনিশিয়ালাইজ করব। আপনি কোলাব বা কোলাব এন্টারপ্রাইজের মতো একটি পাইথন ডেভেলপমেন্ট এনভায়রনমেন্টে এবং পাইথনের জন্য ভার্টেক্স এআই এসডিকে- র সর্বশেষ সংস্করণ ইনস্টল করে নিম্নলিখিত কোডটি চালাতে পারেন:

import vertexai
from vertexai.generative_models import GenerativeModel
model = GenerativeModel("gemini-1.5-pro-001")

এখন, আসুন আজকের বিভিন্ন মুদ্রার বিনিময় হার সম্পর্কে একটি প্রশ্ন করি:

response = model.generate_content(
    "What's the exchange rate for euros to dollars today?"
)
print(response.text)

মডেলটি আপনার জন্য নিম্নলিখিতের অনুরূপ একটি সীমিত বা পুরোনো প্রতিক্রিয়া তৈরি করবে:

As an AI language model, I don't have access to real-time currency exchange
rates. However, as of my last update in September 2021, the approximate exchange
rate between euros (EUR) and US dollars (USD) was:

1 EUR ≈ 1.18 USD

Please note that currency exchange rates constantly fluctuate and can vary
depending on various factors such as economic conditions, supply and demand,
political events, and more. To obtain the most up-to-date and accurate exchange
rate, I recommend using a reliable currency converter or financial website that
provides live rates.

[...]

যদি কোনো ব্যবহারকারী এই ধরনের প্রতিক্রিয়া পেতেন, তাহলে তাদের পছন্দের মুদ্রাগুলো খুঁজে বের করতে, সর্বশেষ বিনিময় হার জানতে এবং নিজেদের মতো করে যেকোনো রূপান্তর সম্পন্ন করতে প্রসঙ্গ পরিবর্তন করতে হতো।

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

৪. প্রচলিত বিকল্প উপায়গুলো চেষ্টা করুন

জেনারেটিভ মডেল নিয়ে কাজ করার সময়, যখন আপনার বাহ্যিক উৎস থেকে হালনাগাদ তথ্য বা ডেটার প্রয়োজন হয়, তখন আপনি একটি বাহ্যিক API কল করে তার ফলাফলগুলো জেনারেটিভ মডেলে ফিরিয়ে দিতে পারেন, যাতে মডেলটি তার প্রতিক্রিয়ায় সেগুলো ব্যবহার করতে পারে।

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

চলুন, আগের অংশে করা প্রশ্নটিতে আবার ফিরে যাই এবং মডেলটির জন্য কিছু অতিরিক্ত নির্দেশনা যোগ করি। জেমিনি মডেলে নিম্নলিখিত অনুরোধটি পাঠানোর চেষ্টা করুন:

user_prompt = "What's the exchange rate from euros to US dollars today?"

response = model.generate_content("""
Your task is to extract parameters from the user's input and return it as a
structured JSON payload. The user will ask about the exchange rate and which
currency they are converting from and converting to.

User input: {user_prompt}

Please extract the currencies as parameters and put them in a JSON object.
""".format(user_prompt=user_prompt))
print(response.text)

এর ফলে নিম্নলিখিত টেক্সট প্রতিক্রিয়াটি পাওয়া যায়, যা বৈধ JSON নয় এবং এটি নিয়ে আমাদের কাজ করা কঠিন হবে:

```json
{
  "currency_from": "euros",
  "currency_to": "US dollars"
}
```

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

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

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

৫. ফাংশন কলিং কীভাবে কাজ করে

প্যারামিটার এক্সট্র্যাকশন এবং ফাংশন কলিং শুরু করার আগে, চলুন ফাংশন কলিং-এর ধাপগুলো এবং রানটাইমে কোন উপাদানগুলো ব্যবহৃত হয় তা জেনে নিই।

জেমিনিতে ফাংশন কলিং-এর সংক্ষিপ্ত বিবরণ

জেমিনি এপিআই-তে ব্যবহারকারীর ইনপুট

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

জেমিনি এপিআই একটি ফাংশন কল ফেরত দেয়।

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

একটি এপিআই অনুরোধ করুন

এরপর, আপনি কোনো বাহ্যিক সিস্টেম বা এপিআই থেকে তথ্য আনার জন্য ফাংশনের নাম এবং প্যারামিটার ব্যবহার করে একটি এপিআই রিকোয়েস্ট করবেন। এই এপিআই রিকোয়েস্ট এবং রেসপন্স ডেভেলপার অ্যাপ্লিকেশন কোডে বাস্তবায়ন করেন এবং এটি জেমিনি এপিআই ও এসডিকে-এর আওতার বাইরে ঘটে। উদাহরণস্বরূপ, আপনি পাইথনের requests লাইব্রেরি ব্যবহার করে একটি রেস্ট এপিআই কল করতে এবং একটি JSON রেসপন্স পেতে পারেন। অথবা আপনি আপনার পছন্দের পদ্ধতি এবং ক্লায়েন্ট লাইব্রেরি ব্যবহার করে ফাংশনটি কল করতে পারেন।

এপিআই প্রতিক্রিয়াটি জেমিনিতে ফেরত পাঠান

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

৬. আপনার এপিআই বেছে নিন

এখন যেহেতু আপনি ফাংশন কলিংয়ের সামগ্রিক প্রবাহ এবং নির্দিষ্ট ধাপগুলো বুঝতে পেরেছেন, আপনি সর্বশেষ মুদ্রা বিনিময় হার আনার জন্য একটি জেনারেটিভ এআই পাইপলাইন তৈরি করবেন। প্রথমে, আমাদের বেছে নিতে হবে যে আমরা তথ্যের উৎস হিসেবে কোন এপিআই (API) ব্যবহার করতে চাই।

আমাদের মুদ্রা বিনিময় অ্যাপের জন্য, আমরা বৈশ্বিক বিনিময় হারের সর্বশেষ তথ্য সংগ্রহ করতে https://www.frankfurter.app/ -এ অবস্থিত REST API ব্যবহার করব।

এই REST API-এর সাথে ইন্টারঅ্যাক্ট করার জন্য, আমরা পাইথনে requests ব্যবহার করে নিম্নরূপে একটি REST API কল করতে পারি:

import requests
url = "https://api.frankfurter.app/latest"
response = requests.get(url)
response.text

অথবা একটি cURL অনুরোধ যেমন:

curl https://api.frankfurter.app/latest

যা অনুরূপ একটি প্রতিক্রিয়া প্রদান করে:

{
  "amount": 1,
  "base": "EUR",
  "date": "2023-12-20",
  "rates": {
    "AUD": 1.6186, "BGN": 1.9558, "BRL": 5.3287,
    "CAD": 1.4609, "CHF": 0.946, "CNY": 7.8121,
    "CZK": 24.538, "DKK": 7.4565, "GBP": 0.86555,
    "HKD": 8.5439, "HUF": 385.23, "IDR": 16994,
    "ILS": 3.9983, "INR": 91.06, "ISK": 150.3,
    "JPY": 157.12, "KRW": 1425.62, "MXN": 18.6867,
    "MYR": 5.0977, "NOK": 11.2895, "NZD": 1.7421,
    "PHP": 60.991, "PLN": 4.3413, "RON": 4.9699,
    "SEK": 11.129, "SGD": 1.4562, "THB": 38.252,
    "TRY": 31.883, "USD": 1.0944, "ZAR": 20.111
  }
}

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

৭. একটি ফাংশন এবং টুল সংজ্ঞায়িত করুন

এখন যেহেতু আপনি ব্যবহারের জন্য একটি REST API নির্বাচন করেছেন, আমরা এখন একটি API স্পেসিফিকেশন নির্ধারণ করতে এবং একটি টুলে ফাংশনটি নিবন্ধন করতে পারি।

নিশ্চিত করুন যে আপনি পাইথনের জন্য ভার্টেক্স এআই এসডিকে -এর সর্বশেষ সংস্করণটি ইনস্টল করেছেন।

তারপর, পাইথন এসডিকে থেকে প্রয়োজনীয় মডিউলগুলো ইম্পোর্ট করুন এবং জেমিনি মডেলটি ইনিশিয়ালাইজ করুন:

from vertexai.generative_models import (
    Content,
    FunctionDeclaration,
    GenerativeModel,
    Part,
    Tool,
)

model = GenerativeModel("gemini-1.5-pro-001")

https://api.frankfurter.app/ -এ অবস্থিত REST API-টির দিকে পুনরায় তাকালে আমরা দেখতে পাই যে, এটি নিম্নলিখিত ইনপুট প্যারামিটারগুলো গ্রহণ করে:

প্যারামিটার

প্রকার

বর্ণনা

from

স্ট্রিং

মুদ্রা রূপান্তর করতে

to

স্ট্রিং

মুদ্রা রূপান্তর করতে

date

স্ট্রিং

বিনিময় হার আনার তারিখ

এই প্যারামিটারগুলো ব্যবহার করে, এই REST API-এর একটি আংশিক OpenAPI স্পেসিফিকেশন YAML ফরম্যাটে দেখতে এইরকম হয়:

openapi: 3.0.0
info:
  title: Frankfurter Exchange Rate API
  description: This API provides current and historical exchange rates
  version: 1.0.0
servers:
  - url: https://api.frankfurter.app
paths:
  /{date}:
    get:
      summary: Get the latest currency exchange rates.
      parameters:
        - name: date
          in: path
          description: Get currency rates for a specific date or 'latest' if a date is not specified
          required: true
          schema:
            type: string
        - name: from
          in: query
          description: The currency to convert from.
          required: true
          schema:
            type: string
        - name: to
          in: query
          description: The currency to convert to.
          schema:
            type: string

এখন, জেমিনির জন্য পাইথন এসডিকে ব্যবহার করে এটিকে একটি FunctionDeclaration হিসেবে রেজিস্টার করা যাক:

get_exchange_rate_func = FunctionDeclaration(
    name="get_exchange_rate",
    description="Get the exchange rate for currencies between countries",
    parameters={
    "type": "object",
    "properties": {
        "currency_date": {
            "type": "string",
            "description": "A date that must always be in YYYY-MM-DD format or the value 'latest' if a time period is not specified"
        },
        "currency_from": {
            "type": "string",
            "description": "The currency to convert from in ISO 4217 format"
        },
        "currency_to": {
            "type": "string",
            "description": "The currency to convert to in ISO 4217 format"
        }
    },
         "required": [
            "currency_from",
            "currency_date",
      ]
  },
)

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

অবশেষে, আপনি একটি Tool সংজ্ঞায়িত করবেন যাতে ফাংশন ঘোষণাটি অন্তর্ভুক্ত থাকবে:

exchange_rate_tool = Tool(
    function_declarations=[get_exchange_rate_func],
)

এখানে, আপনি একটি টুলের মধ্যে একটি ফাংশন ডিক্লারেশন ব্যবহার করছেন, কিন্তু মনে রাখবেন যে আপনি একটি টুলে এক বা একাধিক ফাংশন ডিক্লারেশন রেজিস্টার করতে পারেন, এবং মডেলটি রানটাইমে ব্যবহারের জন্য উপযুক্ত ফাংশনটি নির্বাচন করবে। Gemini SDK for Python-এর FunctionDeclaration , Tool এবং সম্পর্কিত ক্লাসগুলো সম্পর্কে আরও বিস্তারিত জানতে Gemini API-এর ফাংশন কলিং সংক্রান্ত ডকুমেন্টেশন দেখুন।

আপনি আপনার ফাংশন এবং টুল ডেফিনিশনের কনফিগারেশন সম্পন্ন করেছেন। পরবর্তী অংশে, আমরা এই টুলটি দিয়ে জেনারেটিভ মডেলটিকে কল করব এবং একটি ফাংশন কল ফেরত পাব যা আমরা REST API কল করার জন্য ব্যবহার করতে পারব।

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

এখন আপনি জেনারেটিভ মডেলটি চালু করতে পারেন এবং আপনার সংজ্ঞায়িত tool অন্তর্ভুক্ত করতে পারেন:

prompt = """What is the exchange rate from Australian dollars to Swedish krona?
How much is 500 Australian dollars worth in Swedish krona?"""

response = model.generate_content(
    prompt,
    tools=[exchange_rate_tool],
)

চলুন রেসপন্স অবজেক্টটি দেখে নেওয়া যাক:

print(response.candidates[0].content)

role: "model"
parts {
  function_call {
    name: "get_exchange_rate"
    args {
      fields {
        key: "currency_to"
        value {
          string_value: "SEK"
        }
      }
      fields {
        key: "currency_from"
        value {
          string_value: "AUD"
        }
      }
      fields {
        key: "currency_date"
        value {
          string_value: "latest"
        }
      }
    }
  }
}

মনে হচ্ছে মডেলটি উপলব্ধ একমাত্র ফাংশনটি নির্বাচন করেছে এবং প্যারামিটারসহ get_exchange_rate ফাংশনটির জন্য একটি ফাংশন কল ফেরত দিয়েছে। আর প্যারামিটারগুলো আমাদের কাঙ্ক্ষিত সঠিক ফরম্যাটেই আছে। জেনারেটিভ মডেল থেকে স্ট্রাকচার্ড রেসপন্স পাওয়ার জন্য সাধুবাদ!

পরবর্তী অংশে, আপনি রেসপন্সের তথ্য ব্যবহার করে একটি এপিআই রিকোয়েস্ট করবেন।

৯. একটি এপিআই অনুরোধ করুন

মনে রাখবেন যে, জেমিনিতে ফাংশন কলিং আসলে আপনার হয়ে এক্সটার্নাল এপিআই কলটি করে না। বরং, আপনি আপনার পছন্দমতো যেকোনো ল্যাঙ্গুয়েজ, লাইব্রেরি বা ফ্রেমওয়ার্ক ব্যবহার করতে পারেন!

এখানে আপনি পাইথনের requests লাইব্রেরি ব্যবহার করে এক্সচেঞ্জ রেট REST API-কে কল করবেন।

চলুন প্রতিক্রিয়াটিকে একটি পাইথন ডিকশনারিতে আনপ্যাক করি:

params = {}
for key, value in response.candidates[0].content.parts[0].function_call.args.items():
    params[key[9:]] = value
params

এখন আমরা requests বা অন্য যেকোনো মেথড কল করতে পারি:

import requests
url = f"https://api.frankfurter.app/{params['date']}"
api_response = requests.get(url, params=params)
api_response.text

যার ফলে নিম্নলিখিত প্রতিক্রিয়া দেখা যায়:

'{"amount":1.0,"base":"AUD","date":"2024-01-16","rates":{"SEK":6.8682}}'

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

১০. একটি প্রতিক্রিয়া তৈরি করুন

অবশেষে, পরবর্তী কথোপকথনের পালায় ফাংশনের রেসপন্সটি মডেলে ফেরত পাঠিয়ে ব্যবহারকারীর জন্য একটি প্রতিক্রিয়া তৈরি করা যাক:

response = model.generate_content(
    [
    Content(role="user", parts=[
        Part.from_text(prompt + """Give your answer in steps with lots of detail
            and context, including the exchange rate and date."""),
    ]),
    Content(role="function", parts=[
        Part.from_dict({
            "function_call": {
                "name": "get_exchange_rate",
            }
        })
    ]),
    Content(role="function", parts=[
        Part.from_function_response(
            name="get_exchange_rate",
            response={
                "content": api_response.text,
            }
        )
    ]),
    ],
    tools=[exchange_rate_tool],
)


response.candidates[0].content.parts[0].text

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

The exchange rate from Australian dollars to Swedish krona on January 16, 2024,
is 1 Australian dollar is equal to 6.8663 Swedish krona.

So, 500 Australian dollars would be worth 500 * 6.8663 = 3,433.15 Swedish krona.

১১. সম্পূর্ণ কোড উদাহরণটি দেখুন

এই পর্যায়ে, আপনি ক্লাউড রান সার্ভিস, ক্লাউড ফাংশন বা অন্য কোনো ক্লাউড সার্ভিস ব্যবহার করে আপনার পাইথন কোড একটি ব্যাকএন্ড এপিআই-তে রাখতে পারেন এবং এমন একটি ফ্রন্টএন্ড অ্যাপ ডেপ্লয় করতে পারেন যা মডেল কোয়েরি ও এপিআই কল করার জন্য এই ব্যাকএন্ড এপিআই ব্যবহার করে।

আমাদের চূড়ান্ত সমাধানের সম্পূর্ণ কোড উদাহরণটি এখানে দেওয়া হলো:

import requests
from vertexai.generative_models import (
    Content,
    FunctionDeclaration,
    GenerativeModel,
    Part,
    Tool,
)

model = GenerativeModel("gemini-1.5-pro-001")

get_exchange_rate_func = FunctionDeclaration(
    name="get_exchange_rate",
    description="Get the exchange rate for currencies between countries",
    parameters={
    "type": "object",
    "properties": {
        "currency_date": {
            "type": "string",
            "description": "A date that must always be in YYYY-MM-DD format or the value 'latest' if a time period is not specified"
        },
        "currency_from": {
            "type": "string",
            "description": "The currency to convert from in ISO 4217 format"
        },
        "currency_to": {
            "type": "string",
            "description": "The currency to convert to in ISO 4217 format"
        }
    },
         "required": [
            "currency_from",
            "currency_date",
      ]
  },
)

exchange_rate_tool = Tool(
    function_declarations=[get_exchange_rate_func],
)

prompt = """What is the exchange rate from Australian dollars to Swedish krona?
How much is 500 Australian dollars worth in Swedish krona?"""

response = model.generate_content(
    prompt,
    tools=[exchange_rate_tool],
)

response.candidates[0].content

params = {}
for key, value in response.candidates[0].content.parts[0].function_call.args.items():
    params[key[9:]] = value
params

import requests
url = f"https://api.frankfurter.app/{params['date']}"
api_response = requests.get(url, params=params)
api_response.text

response = model.generate_content(
    [
    Content(role="user", parts=[
        Part.from_text(prompt + """Give your answer in steps with lots of detail
            and context, including the exchange rate and date."""),
    ]),
    Content(role="function", parts=[
        Part.from_dict({
            "function_call": {
                "name": "get_exchange_rate",
            }
        })
    ]),
    Content(role="function", parts=[
        Part.from_function_response(
            name="get_exchange_rate",
            response={
                "content": api_response.text,
            }
        )
    ]),
    ],
    tools=[exchange_rate_tool],
)


response.candidates[0].content.parts[0].text

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

অতিরিক্ত কোড নমুনার জন্য, জেমিনিতে ফাংশন কলিং-এর নমুনা নোটবুকটি দেখুন।

১২. অভিনন্দন

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

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

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

এপিআই ইন্টারফেস

পরিষ্কার করা

এই কোডল্যাবে ব্যবহৃত রিসোর্সগুলির জন্য আপনার গুগল ক্লাউড অ্যাকাউন্টে চার্জ হওয়া এড়াতে, আপনি নিম্নলিখিত পরিষ্করণটি সম্পাদন করতে পারেন:

  • অপ্রয়োজনীয় গুগল ক্লাউড চার্জ এড়াতে, আপনার প্রজেক্টটি প্রয়োজন না হলে গুগল ক্লাউড কনসোল ব্যবহার করে তা ডিলিট করে দিন।
  • আপনি যদি Vertex AI-এর API-গুলো নিষ্ক্রিয় করতে চান, তাহলে Vertex AI API Service Details পৃষ্ঠায় যান এবং Disable API-তে ক্লিক করে নিশ্চিত করুন।

আরও জানুন

এই গাইড ও রিসোর্সগুলোর মাধ্যমে কনভারসেশনাল এআই এবং জেনারেটিভ এআই সম্পর্কে আরও জানুন:

লাইসেন্স

এই কাজটি ক্রিয়েটিভ কমন্স অ্যাট্রিবিউশন ২.০ জেনেরিক লাইসেন্সের অধীনে রয়েছে।