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


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

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

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

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

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

পূর্বশর্ত

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

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

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

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

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

আপনার এপিআই কী সেট আপ করুন

জেমিনি এপিআই ব্যবহার করতে আপনার একটি এপিআই কী দরকার। আপনার যদি ইতিমধ্যে একটি না থাকে তবে গুগল এআই স্টুডিওতে একটি কী তৈরি করুন।

একটি API কী পান

আপনার এপিআই কীটি সুরক্ষিত করুন

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

কোটলিন

// 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;

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

আপনার প্রকল্পে এসডিকে নির্ভরতা যুক্ত করুন

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

    কোটলিন

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

    জাভা

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

    dependencies {
        // ... other androidx dependencies
    
        // add the dependency for the Google AI client SDK for Android
        implementation("com.google.ai.client.generativeai:generativeai:0.6.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. গ্রেড ফাইলগুলির সাথে আপনার অ্যান্ড্রয়েড প্রকল্পটি সিঙ্ক করুন।

জেনারেটর মডেল আরম্ভ করুন

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

কোটলিন

val generativeModel = GenerativeModel(
    // Use a model that's applicable for your use case (see "Implement basic use cases" below)
    modelName = "MODEL_NAME",
    // 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 (see "Implement basic use cases" below)
GenerativeModel gm = new GenerativeModel(/* modelName */ "MODEL_NAME",
// 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-pro-vision মাল্টিমোডাল ইনপুটটির জন্য)। এই গাইডের মধ্যে, প্রতিটি বাস্তবায়নের জন্য নির্দেশাবলী প্রতিটি ব্যবহারের ক্ষেত্রে প্রস্তাবিত মডেল তালিকাভুক্ত করে।

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

এখন আপনার প্রকল্পটি সেট আপ হয়েছে, আপনি বিভিন্ন ব্যবহারের ক্ষেত্রে বাস্তবায়নের জন্য জেমিনি এপিআই ব্যবহার করে অন্বেষণ করতে পারেন:

কেবল পাঠ্য-ইনপুট থেকে পাঠ্য তৈরি করুন

যখন প্রম্পট ইনপুটটিতে কেবল পাঠ্য অন্তর্ভুক্ত থাকে, তখন পাঠ্য আউটপুট উত্পন্ন করতে generateContent সহ gemini-pro মডেলটি ব্যবহার করুন:

কোটলিন

নোট করুন যে generateContent() একটি স্থগিত ফাংশন এবং এটি একটি করুটাইন স্কোপ থেকে কল করা দরকার। আপনি যদি করুটাইনগুলির সাথে অপরিচিত হন তবে অ্যান্ড্রয়েডে কোটলিন করুটাইনগুলি পড়ুন।

val generativeModel = GenerativeModel(
    // For text-only input, use the gemini-pro model
    modelName = "gemini-pro",
    // 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 দেয়। আপনি যদি এই এপিআইয়ের সাথে অপরিচিত হন তবে ListenableFuture ব্যবহার সম্পর্কে অ্যান্ড্রয়েড ডকুমেন্টেশন দেখুন।

// For text-only input, use the gemini-pro model
GenerativeModel gm = new GenerativeModel(/* modelName */ "gemini-pro",
// 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);

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

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

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

কোটলিন

নোট করুন যে generateContent() একটি স্থগিত ফাংশন এবং এটি একটি করুটাইন স্কোপ থেকে কল করা দরকার। আপনি যদি করুটাইনগুলির সাথে অপরিচিত হন তবে অ্যান্ড্রয়েডে কোটলিন করুটাইনগুলি পড়ুন।

val generativeModel = GenerativeModel(
    // For text-and-images input (multimodal), use the gemini-pro-vision model
    modelName = "gemini-pro-vision",
    // 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 দেয়। আপনি যদি এই এপিআইয়ের সাথে অপরিচিত হন তবে ListenableFuture ব্যবহার সম্পর্কে অ্যান্ড্রয়েড ডকুমেন্টেশন দেখুন।

// For text-and-images input (multimodal), use the gemini-pro-vision model
GenerativeModel gm = new GenerativeModel(/* modelName */ "gemini-pro-vision",
// 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);

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

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

মাল্টি-টার্ন কথোপকথনটি তৈরি করতে (চ্যাটের মতো), gemini-pro মডেলটি ব্যবহার করুন এবং startChat() কল করে চ্যাটটি আরম্ভ করুন। তারপরে একটি নতুন ব্যবহারকারী বার্তা প্রেরণের জন্য sendMessage() ব্যবহার করুন, যা চ্যাটের ইতিহাসের বার্তা এবং প্রতিক্রিয়াও সংযোজন করবে।

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

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

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

কোটলিন

নোট করুন যে generateContent() একটি স্থগিত ফাংশন এবং এটি একটি করুটাইন স্কোপ থেকে কল করা দরকার। আপনি যদি করুটাইনগুলির সাথে অপরিচিত হন তবে অ্যান্ড্রয়েডে কোটলিন করুটাইনগুলি পড়ুন।

val generativeModel = GenerativeModel(
    // For text-only input, use the gemini-pro model
    modelName = "gemini-pro",
    // 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 দেয়। আপনি যদি এই এপিআইয়ের সাথে অপরিচিত হন তবে ListenableFuture ব্যবহার সম্পর্কে অ্যান্ড্রয়েড ডকুমেন্টেশন দেখুন।

// For text-only input, use the gemini-pro model
GenerativeModel gm = new GenerativeModel(/* modelName */ "gemini-pro",
// 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 userMessage = new Content.Builder()
    .setRole("user")
    .addText("How many paws are in my house?")
    .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() একটি স্থগিত ফাংশন এবং এটি একটি করুটাইন স্কোপ থেকে কল করা দরকার। আপনি যদি করুটাইনগুলির সাথে অপরিচিত হন তবে অ্যান্ড্রয়েডে কোটলিন করুটাইনগুলি পড়ুন।

val generativeModel = GenerativeModel(
    // For text-and-image input (multimodal), use the gemini-pro-vision model
    modelName = "gemini-pro-vision",
    // 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
}

জাভা

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

// For text-and-images input (multimodal), use the gemini-pro-vision model
GenerativeModel gm = new GenerativeModel(/* modelName */ "gemini-pro-vision",
// 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);

final String[] fullResponse = {""};

streamingResponse.subscribe(new Subscriber<GenerateContentResponse>() {
    @Override
    public void onNext(GenerateContentResponse generateContentResponse) {
        String chunk = generateContentResponse.getText();
        fullResponse[0] += chunk;
    }

    @Override
    public void onComplete() {
        System.out.println(fullResponse[0]);
    }

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

    @Override
    public void onSubscribe(Subscription s) { }
});

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

কোটলিন

নোট করুন যে generateContentStream() একটি স্থগিত ফাংশন এবং এটি একটি করুটাইন স্কোপ থেকে কল করা দরকার। আপনি যদি করুটাইনগুলির সাথে অপরিচিত হন তবে অ্যান্ড্রয়েডে কোটলিন করুটাইনগুলি পড়ুন।

// 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)
}

জাভা

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

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

final String[] fullResponse = {""};

streamingResponse.subscribe(new Subscriber<GenerateContentResponse>() {
    @Override
    public void onNext(GenerateContentResponse generateContentResponse) {
        String chunk = generateContentResponse.getText();
        fullResponse[0] += chunk;
    }

    @Override
    public void onComplete() {
        System.out.println(fullResponse[0]);
    }

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

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

final String[] fullResponse = {""};

streamingResponse.subscribe(new Subscriber<GenerateContentResponse>() {
    @Override
    public void onNext(GenerateContentResponse generateContentResponse) {
        String chunk = generateContentResponse.getText();
        fullResponse[0] += chunk;
    }

    @Override
    public void onComplete() {
        System.out.println(fullResponse[0]);
    }

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

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

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

ফাংশন কলিং

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

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

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

কোটলিন

নোট করুন যে countTokens() একটি সাসপেন্ড ফাংশন এবং একটি করুটাইন স্কোপ থেকে কল করা দরকার। আপনি যদি করুটাইনগুলির সাথে অপরিচিত হন তবে অ্যান্ড্রয়েডে কোটলিন করুটাইনগুলি পড়ুন।

// 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 দেয়। আপনি যদি এই এপিআইয়ের সাথে অপরিচিত হন তবে ListenableFuture ব্যবহার সম্পর্কে অ্যান্ড্রয়েড ডকুমেন্টেশন দেখুন।

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(
    modelName = "MODEL_NAME",
    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();

GenerativeModel gm = new GenerativeModel(
    "MODEL_NAME",
    BuildConfig.apiKey,
    generationConfig
);

GenerativeModelFutures model = GenerativeModelFutures.from(gm);

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

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

কীভাবে একটি সুরক্ষা সেটিং সেট করবেন তা এখানে:

কোটলিন

val generativeModel = GenerativeModel(
    modelName = "MODEL_NAME",
    apiKey = BuildConfig.apiKey,
    safetySettings = listOf(
        SafetySetting(HarmCategory.HARASSMENT, BlockThreshold.ONLY_HIGH)
    )
)

জাভা

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

GenerativeModel gm = new GenerativeModel(
    "MODEL_NAME",
    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(
    modelName = "MODEL_NAME",
    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);

GenerativeModel gm = new GenerativeModel(
    "MODEL_NAME",
    BuildConfig.apiKey,
    null, // generation config is optional
    Arrays.asList(harassmentSafety, hateSpeechSafety)
);

GenerativeModelFutures model = GenerativeModelFutures.from(gm);

এরপর কি

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

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

  • জেমিনি হারের সীমা বৃদ্ধির জন্য অনুরোধ করার জন্য বিকল্পগুলি সরবরাহ করে। মিথুন প্রো মডেলগুলির জন্য হারের সীমা প্রতি মিনিটে 60 টি অনুরোধ (আরপিএম)।

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