টিউটোরিয়াল: Gemini API দিয়ে শুরু করুন


এই টিউটোরিয়ালটি দেখায় কিভাবে Android এর জন্য Google AI ক্লায়েন্ট SDK ব্যবহার করে আপনার Android অ্যাপ থেকে সরাসরি Gemini API অ্যাক্সেস করতে হয়। আপনি যদি আপনার Android অ্যাপে জেমিনি মডেলগুলি অ্যাক্সেস করার জন্য REST API বা সার্ভার-সাইড কোড (যেমন পাইথন) এর সাথে সরাসরি কাজ করতে না চান তবে আপনি এই ক্লায়েন্ট SDK ব্যবহার করতে পারেন।

এই টিউটোরিয়ালে, আপনি নিম্নলিখিতগুলি কীভাবে করবেন তা শিখবেন:

এছাড়াও, এই টিউটোরিয়ালটিতে উন্নত ব্যবহারের ক্ষেত্রে (যেমন টোকেন গণনা করা ) এবং সামগ্রী তৈরি নিয়ন্ত্রণের বিকল্পগুলি সম্পর্কে বিভাগ রয়েছে৷

ডিভাইসে মিথুন অ্যাক্সেস করার কথা বিবেচনা করুন

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

পূর্বশর্ত

এই টিউটোরিয়ালটি অনুমান করে যে আপনি অ্যান্ড্রয়েড অ্যাপ্লিকেশানগুলি বিকাশ করতে অ্যান্ড্রয়েড স্টুডিও ব্যবহার করার সাথে পরিচিত৷

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

  • অ্যান্ড্রয়েড স্টুডিও (সর্বশেষ সংস্করণ)
  • আপনার অ্যান্ড্রয়েড অ্যাপকে অবশ্যই API লেভেল 21 বা উচ্চতর টার্গেট করতে হবে।

আপনার প্রকল্প সেট আপ করুন

Gemini API কল করার আগে, আপনাকে আপনার Android প্রকল্প সেট আপ করতে হবে, যার মধ্যে আপনার API কী সেট আপ করা, আপনার Android প্রকল্পে SDK নির্ভরতা যোগ করা এবং মডেলটি শুরু করা অন্তর্ভুক্ত।

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

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

একটি API কী পান

আপনার API কী সুরক্ষিত করুন

এটি দৃঢ়ভাবে সুপারিশ করা হয় যে আপনি আপনার সংস্করণ নিয়ন্ত্রণ সিস্টেমে একটি API কী পরীক্ষা করবেন না ৷ পরিবর্তে, আপনার এটি একটি local.properties ফাইলে সংরক্ষণ করা উচিত (যা আপনার প্রকল্পের রুট ডিরেক্টরিতে অবস্থিত, কিন্তু সংস্করণ নিয়ন্ত্রণ থেকে বাদ দেওয়া হয়েছে), এবং তারপরে একটি বিল্ড কনফিগারেশন ভেরিয়েবল হিসাবে আপনার API কী পড়তে Android এর জন্য সিক্রেটস গ্রেডল প্লাগইন ব্যবহার করুন৷

কোটলিন

// Access your API key as a Build Configuration variable
val apiKey = BuildConfig.apiKey

জাভা

// Access your API key as a Build Configuration variable
String apiKey = BuildConfig.apiKey;

এই টিউটোরিয়ালের সমস্ত স্নিপেট এই সেরা অনুশীলনটি ব্যবহার করে। এছাড়াও, আপনি যদি সিক্রেটস গ্রেডল প্লাগইনটির বাস্তবায়ন দেখতে চান, তাহলে আপনি এই SDK-এর জন্য নমুনা অ্যাপটি পর্যালোচনা করতে পারেন বা Android Studio Iguana-এর সর্বশেষ প্রিভিউ ব্যবহার করতে পারেন যার একটি Gemini API স্টার্টার টেমপ্লেট রয়েছে (যার জন্য local.properties ফাইল রয়েছে তুমি শুরু করেছিলে)।

আপনার প্রকল্পে SDK নির্ভরতা যোগ করুন

  1. আপনার মডিউলে (অ্যাপ-লেভেল) গ্রেডল কনফিগারেশন ফাইলে (যেমন <project>/<app-module>/build.gradle.kts ), Android এর জন্য Google AI SDK-এর নির্ভরতা যোগ করুন:

    কোটলিন

    dependencies {
      // ... other androidx dependencies
    
      // add the dependency for the Google AI client SDK for Android
      implementation("com.google.ai.client.generativeai:generativeai:0.9.0")
    }
    

    জাভা

    জাভার জন্য, আপনাকে দুটি অতিরিক্ত লাইব্রেরি যোগ করতে হবে।

    dependencies {
        // ... other androidx dependencies
    
        // add the dependency for the Google AI client SDK for Android
        implementation("com.google.ai.client.generativeai:generativeai:0.9.0")
    
        // Required for one-shot operations (to use `ListenableFuture` from Guava Android)
        implementation("com.google.guava:guava:31.0.1-android")
    
        // Required for streaming operations (to use `Publisher` from Reactive Streams)
        implementation("org.reactivestreams:reactive-streams:1.0.4")
    }
    
  2. Gradle ফাইলগুলির সাথে আপনার Android প্রকল্প সিঙ্ক করুন।

জেনারেটিভ মডেল শুরু করুন

আপনি যেকোনো API কল করার আগে, আপনাকে জেনারেটিভ মডেলটি আরম্ভ করতে হবে:

কোটলিন

val generativeModel = GenerativeModel(
    // The Gemini 1.5 models are versatile and work with most use cases
    modelName = "gemini-1.5-flash",
    // Access your API key as a Build Configuration variable (see "Set up your API key" above)
    apiKey = BuildConfig.apiKey
)

জাভা

জাভার জন্য, আপনাকে GenerativeModelFutures অবজেক্ট শুরু করতে হবে।

// Use a model that's applicable for your use case
// The Gemini 1.5 models are versatile and work with most use cases
GenerativeModel gm = new GenerativeModel(/* modelName */ "gemini-1.5-flash",
// Access your API key as a Build Configuration variable (see "Set up your API key" above)
    /* apiKey */ BuildConfig.apiKey);

// Use the GenerativeModelFutures Java compatibility layer which offers
// support for ListenableFuture and Publisher APIs
GenerativeModelFutures model = GenerativeModelFutures.from(gm);

একটি মডেল নির্দিষ্ট করার সময়, নিম্নলিখিত নোট করুন:

  • আপনার ব্যবহারের ক্ষেত্রে নির্দিষ্ট একটি মডেল ব্যবহার করুন (উদাহরণস্বরূপ, gemini-1.5-flash মাল্টিমোডাল ইনপুটের জন্য)। এই গাইডের মধ্যে, প্রতিটি বাস্তবায়নের নির্দেশাবলী প্রতিটি ব্যবহারের ক্ষেত্রে প্রস্তাবিত মডেলের তালিকা করে।

সাধারণ ব্যবহারের ক্ষেত্রে প্রয়োগ করুন

এখন আপনার প্রকল্প সেট আপ করা হয়েছে, আপনি বিভিন্ন ব্যবহারের ক্ষেত্রে প্রয়োগ করতে Gemini API ব্যবহার করে অন্বেষণ করতে পারেন:

শুধুমাত্র পাঠ্য ইনপুট থেকে পাঠ্য তৈরি করুন

যখন প্রম্পট ইনপুটে শুধুমাত্র টেক্সট অন্তর্ভুক্ত থাকে, তখন টেক্সট আউটপুট জেনারেট generateContent Gemini 1.5 মডেল বা Gemini 1.0 Pro মডেল ব্যবহার করুন:

কোটলিন

মনে রাখবেন যে generateContent() একটি সাসপেন্ড ফাংশন এবং এটি একটি Coroutine স্কোপ থেকে কল করা প্রয়োজন। আপনি যদি Coroutines এর সাথে অপরিচিত হন, তাহলে Android-এ Kotlin Coroutines পড়ুন।

val generativeModel = GenerativeModel(
    // The Gemini 1.5 models are versatile and work with both text-only and multimodal prompts
    modelName = "gemini-1.5-flash",
    // Access your API key as a Build Configuration variable (see "Set up your API key" above)
    apiKey = BuildConfig.apiKey
)

val prompt = "Write a story about a magic backpack."
val response = generativeModel.generateContent(prompt)
print(response.text)

জাভা

মনে রাখবেন যে generateContent() একটি ListenableFuture প্রদান করে। আপনি যদি এই API এর সাথে অপরিচিত হন তবে একটি ListenableFuture ব্যবহার করার বিষয়ে Android ডকুমেন্টেশন দেখুন।

// The Gemini 1.5 models are versatile and work with both text-only and multimodal prompts
GenerativeModel gm = new GenerativeModel(/* modelName */ "gemini-1.5-flash",
// Access your API key as a Build Configuration variable (see "Set up your API key" above)
    /* apiKey */ BuildConfig.apiKey);
GenerativeModelFutures model = GenerativeModelFutures.from(gm);

Content content = new Content.Builder()
    .addText("Write a story about a magic backpack.")
    .build();

Executor executor = // ...

ListenableFuture<GenerateContentResponse> response = model.generateContent(content);
Futures.addCallback(response, new FutureCallback<GenerateContentResponse>() {
    @Override
    public void onSuccess(GenerateContentResponse result) {
        String resultText = result.getText();
        System.out.println(resultText);
    }

    @Override
    public void onFailure(Throwable t) {
        t.printStackTrace();
    }
}, executor);

টেক্সট-এবং-ইমেজ ইনপুট (মাল্টিমোডাল) থেকে পাঠ্য তৈরি করুন

জেমিনি বিভিন্ন মডেল সরবরাহ করে যা মাল্টিমোডাল ইনপুট (জেমিনি 1.5 মডেল) পরিচালনা করতে পারে যাতে আপনি পাঠ্য এবং চিত্র উভয়ই ইনপুট করতে পারেন। প্রম্পটের জন্য চিত্রের প্রয়োজনীয়তাগুলি পর্যালোচনা করতে ভুলবেন না।

যখন প্রম্পট ইনপুটে পাঠ্য এবং চিত্র উভয়ই অন্তর্ভুক্ত থাকে, তখন পাঠ্য আউটপুট তৈরি করতে generateContent সহ একটি Gemini 1.5 মডেল ব্যবহার করুন:

কোটলিন

মনে রাখবেন যে generateContent() একটি সাসপেন্ড ফাংশন এবং এটি একটি Coroutine স্কোপ থেকে কল করা প্রয়োজন। আপনি যদি Coroutines এর সাথে অপরিচিত হন, তাহলে Android-এ Kotlin Coroutines পড়ুন।

val generativeModel = GenerativeModel(
    // The Gemini 1.5 models are versatile and work with both text-only and multimodal prompts
    modelName = "gemini-1.5-flash",
    // Access your API key as a Build Configuration variable (see "Set up your API key" above)
    apiKey = BuildConfig.apiKey
)

val image1: Bitmap = // ...
val image2: Bitmap = // ...

val inputContent = content {
    image(image1)
    image(image2)
    text("What's different between these pictures?")
}

val response = generativeModel.generateContent(inputContent)
print(response.text)

জাভা

মনে রাখবেন যে generateContent() একটি ListenableFuture প্রদান করে। আপনি যদি এই API এর সাথে অপরিচিত হন তবে একটি ListenableFuture ব্যবহার করার বিষয়ে Android ডকুমেন্টেশন দেখুন।

// The Gemini 1.5 models are versatile and work with both text-only and multimodal prompts
GenerativeModel gm = new GenerativeModel(/* modelName */ "gemini-1.5-flash",
// Access your API key as a Build Configuration variable (see "Set up your API key" above)
    /* apiKey */ BuildConfig.apiKey);
GenerativeModelFutures model = GenerativeModelFutures.from(gm);

Bitmap image1 = // ...
Bitmap image2 = // ...

Content content = new Content.Builder()
    .addText("What's different between these pictures?")
    .addImage(image1)
    .addImage(image2)
    .build();

Executor executor = // ...

ListenableFuture<GenerateContentResponse> response = model.generateContent(content);
Futures.addCallback(response, new FutureCallback<GenerateContentResponse>() {
    @Override
    public void onSuccess(GenerateContentResponse result) {
        String resultText = result.getText();
        System.out.println(resultText);
    }

    @Override
    public void onFailure(Throwable t) {
        t.printStackTrace();
    }
}, executor);

মাল্টি-টার্ন কথোপকথন তৈরি করুন (চ্যাট)

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

একটি মাল্টি-টার্ন কথোপকথন তৈরি করতে (যেমন চ্যাট), একটি Gemini 1.5 মডেল বা Gemini 1.0 Pro মডেল ব্যবহার করুন এবং startChat() কল করে চ্যাট শুরু করুন৷ তারপর একটি নতুন ব্যবহারকারীর বার্তা পাঠাতে sendMessage() ব্যবহার করুন, যা চ্যাট ইতিহাসে বার্তা এবং প্রতিক্রিয়াও যুক্ত করবে।

কথোপকথনে বিষয়বস্তুর সাথে যুক্ত role জন্য দুটি সম্ভাব্য বিকল্প রয়েছে:

  • user : ভূমিকা যা প্রম্পট প্রদান করে। এই মানটি sendMessage কলের জন্য ডিফল্ট।

  • model : ভূমিকা যা প্রতিক্রিয়া প্রদান করে। বিদ্যমান history সহ startChat() কল করার সময় এই ভূমিকাটি ব্যবহার করা যেতে পারে।

কোটলিন

মনে রাখবেন যে generateContent() একটি সাসপেন্ড ফাংশন এবং এটি একটি Coroutine স্কোপ থেকে কল করা প্রয়োজন। আপনি যদি Coroutines এর সাথে অপরিচিত হন, তাহলে Android-এ Kotlin Coroutines পড়ুন।

val generativeModel = GenerativeModel(
    // The Gemini 1.5 models are versatile and work with multi-turn conversations (like chat)
    modelName = "gemini-1.5-flash",
    // Access your API key as a Build Configuration variable (see "Set up your API key" above)
    apiKey = BuildConfig.apiKey
)

val chat = generativeModel.startChat(
    history = listOf(
        content(role = "user") { text("Hello, I have 2 dogs in my house.") },
        content(role = "model") { text("Great to meet you. What would you like to know?") }
    )
)

chat.sendMessage("How many paws are in my house?")

জাভা

মনে রাখবেন যে generateContent() একটি ListenableFuture প্রদান করে। আপনি যদি এই API এর সাথে অপরিচিত হন তবে একটি ListenableFuture ব্যবহার করার বিষয়ে Android ডকুমেন্টেশন দেখুন।

// The Gemini 1.5 models are versatile and work with multi-turn conversations (like chat)
GenerativeModel gm = new GenerativeModel(/* modelName */ "gemini-1.5-flash",
// Access your API key as a Build Configuration variable (see "Set up your API key" above)
    /* apiKey */ BuildConfig.apiKey);
GenerativeModelFutures model = GenerativeModelFutures.from(gm);

// (optional) Create previous chat history for context
Content.Builder userContentBuilder = new Content.Builder();
userContentBuilder.setRole("user");
userContentBuilder.addText("Hello, I have 2 dogs in my house.");
Content userContent = userContentBuilder.build();

Content.Builder modelContentBuilder = new Content.Builder();
modelContentBuilder.setRole("model");
modelContentBuilder.addText("Great to meet you. What would you like to know?");
Content modelContent = userContentBuilder.build();

List<Content> history = Arrays.asList(userContent, modelContent);

// Initialize the chat
ChatFutures chat = model.startChat(history);

// Create a new user message
Content.Builder userMessageBuilder = new Content.Builder();
userMessageBuilder.setRole("user");
userMessageBuilder.addText("How many paws are in my house?");
Content userMessage = userMessageBuilder.build();

Executor executor = // ...

// Send the message
ListenableFuture<GenerateContentResponse> response = chat.sendMessage(userMessage);

Futures.addCallback(response, new FutureCallback<GenerateContentResponse>() {
    @Override
    public void onSuccess(GenerateContentResponse result) {
        String resultText = result.getText();
        System.out.println(resultText);
    }

    @Override
    public void onFailure(Throwable t) {
        t.printStackTrace();
    }
}, executor);

দ্রুত মিথস্ক্রিয়া জন্য স্ট্রিমিং ব্যবহার করুন

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

নিচের উদাহরণে দেখানো হয়েছে কিভাবে generateContentStream দিয়ে স্ট্রিমিং বাস্তবায়ন করতে হয় একটি টেক্সট-এবং-ইমেজ ইনপুট প্রম্পট থেকে টেক্সট তৈরি করতে।

কোটলিন

মনে রাখবেন যে generateContentStream() একটি সাসপেন্ড ফাংশন এবং এটি একটি Coroutine স্কোপ থেকে কল করা প্রয়োজন। আপনি যদি Coroutines এর সাথে অপরিচিত হন, তাহলে Android-এ Kotlin Coroutines পড়ুন।

val generativeModel = GenerativeModel(
    // The Gemini 1.5 models are versatile and work with both text-only and multimodal prompts
    modelName = "gemini-1.5-flash",
    // Access your API key as a Build Configuration variable (see "Set up your API key" above)
    apiKey = BuildConfig.apiKey
)

val image1: Bitmap = // ...
val image2: Bitmap = // ...

val inputContent = content {
    image(image1)
    image(image2)
    text("What's the difference between these pictures?")
}

var fullResponse = ""
generativeModel.generateContentStream(inputContent).collect { chunk ->
    print(chunk.text)
    fullResponse += chunk.text
}

জাভা

এই SDK-এর জাভা স্ট্রিমিং পদ্ধতিগুলি প্রতিক্রিয়াশীল স্ট্রীমস লাইব্রেরি থেকে একটি Publisher টাইপ ফেরত দেয়।

// The Gemini 1.5 models are versatile and work with both text-only and multimodal prompts
GenerativeModel gm = new GenerativeModel(/* modelName */ "gemini-1.5-flash",
// Access your API key as a Build Configuration variable (see "Set up your API key" above)
    /* apiKey */ BuildConfig.apiKey);
GenerativeModelFutures model = GenerativeModelFutures.from(gm);

Bitmap image1 = // ...
Bitmap image2 = // ...

Content content = new Content.Builder()
    .addText("What's different between these pictures?")
    .addImage(image1)
    .addImage(image2)
    .build();

Publisher<GenerateContentResponse> streamingResponse =
    model.generateContentStream(content);

StringBuilder outputContent = new StringBuilder();

streamingResponse.subscribe(new Subscriber<GenerateContentResponse>() {
    @Override
    public void onNext(GenerateContentResponse generateContentResponse) {
        String chunk = generateContentResponse.getText();
        outputContent.append(chunk);
    }

    @Override
    public void onComplete() {
        System.out.println(outputContent);
    }

    @Override
    public void onError(Throwable t) {
        t.printStackTrace();
    }

    @Override
    public void onSubscribe(Subscription s) {
      s.request(Long.MAX_VALUE);
    }
});

আপনি শুধুমাত্র পাঠ্য ইনপুট এবং চ্যাট ব্যবহারের ক্ষেত্রে একটি অনুরূপ পদ্ধতি ব্যবহার করতে পারেন:

কোটলিন

মনে রাখবেন যে generateContentStream() একটি সাসপেন্ড ফাংশন এবং এটি একটি Coroutine স্কোপ থেকে কল করা প্রয়োজন। আপনি যদি Coroutines এর সাথে অপরিচিত হন, তাহলে Android-এ Kotlin Coroutines পড়ুন।

// Use streaming with text-only input
generativeModel.generateContentStream(inputContent).collect { chunk ->
    print(chunk.text)
}
// Use streaming with multi-turn conversations (like chat)
val chat = generativeModel.startChat()
chat.sendMessageStream(inputContent).collect { chunk ->
    print(chunk.text)
}

জাভা

এই SDK-এর জাভা স্ট্রিমিং পদ্ধতিগুলি প্রতিক্রিয়াশীল স্ট্রীমস লাইব্রেরি থেকে একটি Publisher টাইপ প্রদান করে।

// Use streaming with text-only input
Publisher<GenerateContentResponse> streamingResponse =
    model.generateContentStream(inputContent);

StringBuilder outputContent = new StringBuilder();

streamingResponse.subscribe(new Subscriber<GenerateContentResponse>() {
    @Override
    public void onNext(GenerateContentResponse generateContentResponse) {
        String chunk = generateContentResponse.getText();
        outputContent.append(chunk);
    }

    @Override
    public void onComplete() {
        System.out.println(outputContent);
    }

    @Override
    public void onSubscribe(Subscription s) {
      s.request(Long.MAX_VALUE);
    }

    // ... other methods omitted for brevity
});
// Use streaming with multi-turn conversations (like chat)
ChatFutures chat = model.startChat(history);

Publisher<GenerateContentResponse> streamingResponse =
    chat.sendMessageStream(inputContent);

StringBuilder outputContent = new StringBuilder();

streamingResponse.subscribe(new Subscriber<GenerateContentResponse>() {
    @Override
    public void onNext(GenerateContentResponse generateContentResponse) {
        String chunk = generateContentResponse.getText();
        outputContent.append(chunk);
    }

    @Override
    public void onComplete() {
        System.out.println(outputContent);
    }

    @Override
    public void onSubscribe(Subscription s) {
      s.request(Long.MAX_VALUE);
    }

    // ... other methods omitted for brevity
});

উন্নত ব্যবহারের ক্ষেত্রে প্রয়োগ করুন

এই টিউটোরিয়ালের পূর্ববর্তী বিভাগে বর্ণিত সাধারণ ব্যবহারের ক্ষেত্রে আপনাকে Gemini API ব্যবহারে স্বাচ্ছন্দ্য বোধ করতে সাহায্য করে। এই বিভাগে কিছু ব্যবহারের ক্ষেত্রে বর্ণনা করা হয়েছে যেগুলি আরও উন্নত বলে বিবেচিত হতে পারে।

ফাংশন কলিং

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

টোকেন গণনা করুন

দীর্ঘ প্রম্পট ব্যবহার করার সময়, মডেলে কোনো সামগ্রী পাঠানোর আগে টোকেন গণনা করা কার্যকর হতে পারে। নিম্নলিখিত উদাহরণগুলি বিভিন্ন ব্যবহারের ক্ষেত্রে countTokens() কীভাবে ব্যবহার করতে হয় তা দেখায়:

কোটলিন

উল্লেখ্য যে countTokens() হল একটি সাসপেন্ড ফাংশন এবং এটি একটি Coroutine স্কোপ থেকে কল করা প্রয়োজন। আপনি যদি Coroutines এর সাথে অপরিচিত হন, তাহলে Android-এ Kotlin Coroutines পড়ুন।

// For text-only input
val (totalTokens) = generativeModel.countTokens("Write a story about a magic backpack.")

// For text-and-image input (multi-modal)
val multiModalContent = content {
    image(image1)
    image(image2)
    text("What's the difference between these pictures?")
}

val (totalTokens) = generativeModel.countTokens(multiModalContent)

// For multi-turn conversations (like chat)
val history = chat.history
val messageContent = content { text("This is the message I intend to send")}
val (totalTokens) = generativeModel.countTokens(*history.toTypedArray(), messageContent)

জাভা

লক্ষ্য করুন যে countTokens() একটি ListenableFuture প্রদান করে। আপনি যদি এই API এর সাথে অপরিচিত হন তবে একটি ListenableFuture ব্যবহার করার বিষয়ে Android ডকুমেন্টেশন দেখুন।

Content text = new Content.Builder()
    .addText("Write a story about a magic backpack.")
    .build();

Executor executor = // ...

// For text-only input
ListenableFuture<CountTokensResponse> countTokensResponse = model.countTokens(text);

Futures.addCallback(countTokensResponse, new FutureCallback<CountTokensResponse>() {
    @Override
    public void onSuccess(CountTokensResponse result) {
        int totalTokens = result.getTotalTokens();
        System.out.println("TotalTokens = " + totalTokens);
    }

    @Override
    public void onFailure(Throwable t) {
        t.printStackTrace();
    }
}, executor);

// For text-and-image input
Bitmap image1 = // ...
Bitmap image2 = // ...

Content multiModalContent = new Content.Builder()
    .addImage(image1)
    .addImage(image2)
    .addText("What's different between these pictures?")
    .build();

ListenableFuture<CountTokensResponse> countTokensResponse = model.countTokens(multiModalContent);

// For multi-turn conversations (like chat)
List<Content> history = chat.getChat().getHistory();

Content messageContent = new Content.Builder()
    .addText("This is the message I intend to send")
    .build();

Collections.addAll(history, messageContent);

ListenableFuture<CountTokensResponse> countTokensResponse = model.countTokens(history.toArray(new Content[0]));

বিষয়বস্তু তৈরি নিয়ন্ত্রণ করার বিকল্প

আপনি মডেল প্যারামিটার কনফিগার করে এবং নিরাপত্তা সেটিংস ব্যবহার করে সামগ্রী তৈরি নিয়ন্ত্রণ করতে পারেন।

মডেল প্যারামিটার কনফিগার করুন

আপনি মডেলে পাঠানো প্রতিটি প্রম্পটে প্যারামিটার মান অন্তর্ভুক্ত করে যা নিয়ন্ত্রণ করে কিভাবে মডেলটি একটি প্রতিক্রিয়া তৈরি করে। মডেল বিভিন্ন পরামিতি মান জন্য বিভিন্ন ফলাফল তৈরি করতে পারে. মডেল প্যারামিটার সম্পর্কে আরও জানুন।

কোটলিন

val config = generationConfig {
    temperature = 0.9f
    topK = 16
    topP = 0.1f
    maxOutputTokens = 200
    stopSequences = listOf("red")
}

val generativeModel = GenerativeModel(
    // The Gemini 1.5 models are versatile and work with most use cases
    modelName = "gemini-1.5-flash",
    apiKey = BuildConfig.apiKey,
    generationConfig = config
)

জাভা

GenerationConfig.Builder configBuilder = new GenerationConfig.Builder();
configBuilder.temperature = 0.9f;
configBuilder.topK = 16;
configBuilder.topP = 0.1f;
configBuilder.maxOutputTokens = 200;
configBuilder.stopSequences = Arrays.asList("red");

GenerationConfig generationConfig = configBuilder.build();

// The Gemini 1.5 models are versatile and work with most use cases
GenerativeModel gm = new GenerativeModel(
    "gemini-1.5-flash",
    BuildConfig.apiKey,
    generationConfig
);

GenerativeModelFutures model = GenerativeModelFutures.from(gm);

নিরাপত্তা সেটিংস ব্যবহার করুন

ক্ষতিকারক বলে বিবেচিত প্রতিক্রিয়া পাওয়ার সম্ভাবনা সামঞ্জস্য করতে আপনি নিরাপত্তা সেটিংস ব্যবহার করতে পারেন। ডিফল্টরূপে, নিরাপত্তা সেটিংস মাঝারি এবং/অথবা সমস্ত মাত্রা জুড়ে অনিরাপদ বিষয়বস্তু হওয়ার উচ্চ সম্ভাবনা সহ সামগ্রীকে ব্লক করে। নিরাপত্তা সেটিংস সম্পর্কে আরও জানুন।

এখানে কিভাবে একটি নিরাপত্তা সেটিং সেট করতে হয়:

কোটলিন

val generativeModel = GenerativeModel(
    // The Gemini 1.5 models are versatile and work with most use cases
    modelName = "gemini-1.5-flash",
    apiKey = BuildConfig.apiKey,
    safetySettings = listOf(
        SafetySetting(HarmCategory.HARASSMENT, BlockThreshold.ONLY_HIGH)
    )
)

জাভা

SafetySetting harassmentSafety = new SafetySetting(HarmCategory.HARASSMENT,
    BlockThreshold.ONLY_HIGH);

// The Gemini 1.5 models are versatile and work with most use cases
GenerativeModel gm = new GenerativeModel(
    "gemini-1.5-flash",
    BuildConfig.apiKey,
    null, // generation config is optional
    Collections.singletonList(harassmentSafety)
);

GenerativeModelFutures model = GenerativeModelFutures.from(gm);

এছাড়াও আপনি একাধিক নিরাপত্তা সেটিং সেট করতে পারেন:

কোটলিন

val harassmentSafety = SafetySetting(HarmCategory.HARASSMENT, BlockThreshold.ONLY_HIGH)

val hateSpeechSafety = SafetySetting(HarmCategory.HATE_SPEECH, BlockThreshold.MEDIUM_AND_ABOVE)

val generativeModel = GenerativeModel(
    // The Gemini 1.5 models are versatile and work with most use cases
    modelName = "gemini-1.5-flash",
    apiKey = BuildConfig.apiKey,
    safetySettings = listOf(harassmentSafety, hateSpeechSafety)
)

জাভা

SafetySetting harassmentSafety = new SafetySetting(HarmCategory.HARASSMENT,
    BlockThreshold.ONLY_HIGH);

SafetySetting hateSpeechSafety = new SafetySetting(HarmCategory.HATE_SPEECH,
    BlockThreshold.MEDIUM_AND_ABOVE);

// The Gemini 1.5 models are versatile and work with most use cases
GenerativeModel gm = new GenerativeModel(
    "gemini-1.5-flash",
    BuildConfig.apiKey,
    null, // generation config is optional
    Arrays.asList(harassmentSafety, hateSpeechSafety)
);

GenerativeModelFutures model = GenerativeModelFutures.from(gm);

এরপর কি

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

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

  • এই টিউটোরিয়ালে বর্ণিত Android এর জন্য ক্লায়েন্ট SDK আপনাকে Gemini Pro মডেলগুলি অ্যাক্সেস করতে দেয় যা Google এর সার্ভারে চলে । ব্যবহারের ক্ষেত্রে সংবেদনশীল ডেটা প্রক্রিয়াকরণ, অফলাইন উপলব্ধতা, বা প্রায়শই ব্যবহৃত ব্যবহারকারী প্রবাহের জন্য খরচ সাশ্রয়ের জন্য, আপনি ডিভাইসে চালিত জেমিনি ন্যানো অ্যাক্সেস করার কথা বিবেচনা করতে পারেন৷ আরো বিস্তারিত জানার জন্য, Android (অন-ডিভাইস) টিউটোরিয়াল পড়ুন।