فراخوانی تابع، دریافت خروجی داده های ساختاریافته از مدل های تولیدی را برای شما آسان تر می کند. سپس می توانید از این خروجی ها برای فراخوانی API های دیگر و برگرداندن داده های پاسخ مربوطه به مدل استفاده کنید. به عبارت دیگر، فراخوانی تابع به شما کمک می کند تا مدل های تولیدی را به سیستم های خارجی متصل کنید تا محتوای تولید شده شامل به روزترین و دقیق ترین اطلاعات باشد.
می توانید مدل های Gemini را با توضیحاتی در مورد عملکردها ارائه دهید. اینها توابعی هستند که شما به زبان برنامه خود می نویسید (یعنی توابع Google Cloud نیستند). مدل ممکن است از شما بخواهد که یک تابع را فراخوانی کنید و نتیجه را برای کمک به مدل در رسیدگی به درخواست شما ارسال کنید.
اگر قبلاً این کار را نکردهاید، برای کسب اطلاعات بیشتر ، مقدمه فراخوانی تابع را بررسی کنید.
پروژه خود را تنظیم کنید
قبل از فراخوانی Gemini API، باید پروژه اندروید خود را راهاندازی کنید، که شامل تنظیم کلید API، افزودن وابستگیهای SDK به پروژه اندروید و مقداردهی اولیه مدل است.
برای استفاده از Gemini API، به یک کلید API نیاز دارید. اگر قبلاً یکی ندارید، یک کلید در Google AI Studio ایجاد کنید.
کلید API خود را ایمن کنید
اکیداً توصیه می شود که یک کلید API را در سیستم کنترل نسخه خود بررسی نکنید . در عوض، باید آن را در یک فایل local.properties
(که در فهرست اصلی پروژه شما قرار دارد، اما از کنترل نسخه حذف شده است) ذخیره کنید و سپس از افزونه Secrets Gradle برای اندروید برای خواندن کلید API خود به عنوان یک متغیر Build Configuration استفاده کنید.
// Access your API key as a Build Configuration variable
val apiKey = BuildConfig.apiKey
تمام قطعه های این آموزش از این بهترین تمرین استفاده می کنند. همچنین اگر میخواهید اجرای پلاگین Secrets Gradle را مشاهده کنید، میتوانید برنامه نمونه این SDK را بررسی کنید یا از آخرین پیشنمایش Android Studio Iguana استفاده کنید که دارای قالب Gemini API Starter است (که شامل فایل local.properties
برای دریافت است. تو شروع کردی).
در فایل پیکربندی Gradle ماژول (سطح برنامه) خود (مانند
<project>/<app-module>/build.gradle.kts
)، وابستگی را برای Google AI SDK برای Android اضافه کنید: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") }
پروژه اندروید خود را با فایل های Gradle همگام سازی کنید.
قبل از اینکه بتوانید هر گونه تماس API را برقرار کنید، باید شی GenerativeModel
مقداردهی اولیه کنید. این مقدار اولیه اولیه است. بعداً در این آموزش، آن را برای فراخوانی تابع به روز خواهید کرد.
val generativeModel = GenerativeModel(
// Use a model that supports function calling, like Gemini 1.0 Pro.
// See "Supported models" in the "Introduction to function calling" page.
modelName = "MODEL_NAME",
// Access your API key as a Build Configuration variable (see "Set up your API key" above).
apiKey = BuildConfig.apiKey
)
یک تماس تابع تنظیم کنید
برای این آموزش، مدل را با یک API مبادله ارز فرضی که از پارامترهای زیر پشتیبانی میکند تعامل خواهید داشت:
پارامتر | تایپ کنید | ضروری | شرح |
---|---|---|---|
currencyFrom | رشته | آره | ارز برای تبدیل |
currencyTo | رشته | آره | ارز برای تبدیل |
نمونه درخواست API
{
"currencyFrom": "USD",
"currencyTo": "SEK"
}
نمونه پاسخ API
{
"base": "USD",
"rates": {"SEK": 0.091}
}
مرحله 1 : تابعی را ایجاد کنید که درخواست API را ایجاد می کند
اگر قبلاً این کار را نکردهاید، با ایجاد تابعی که درخواست API را ایجاد میکند، شروع کنید.
برای اهداف نمایشی در این آموزش، به جای ارسال یک درخواست API واقعی، مقادیر کدگذاری شده را با همان قالبی که یک API واقعی برمی گرداند، برمی گردانید.
suspend fun makeApiRequest(
currencyFrom: String,
currencyTo: String
): JSONObject {
// This hypothetical API returns a JSON such as:
// {"base":"USD","rates":{"SEK": 0.091}}
return JSONObject().apply {
put("base", currencyFrom)
put("rates", hashMapOf(currencyTo to 0.091))
}
}
مرحله 2 : یک اعلان تابع ایجاد کنید
اعلان تابعی را ایجاد کنید که به مدل مولد منتقل می کنید (مرحله بعدی این آموزش).
تا جایی که ممکن است جزئیات را در توضیحات تابع و پارامتر بگنجانید. مدل مولد از این اطلاعات برای تعیین اینکه کدام تابع را انتخاب کند و چگونه مقادیر پارامترهای فراخوانی تابع را ارائه کند، استفاده می کند.
val getExchangeRate = defineFunction(
name = "getExchangeRate",
description = "Get the exchange rate for currencies between countries",
Schema.str("currencyFrom", "The currency to convert from."),
Schema.str("currencyTo", "The currency to convert to.")
) { from, to ->
// Call the function that you declared above
makeApiRequest(from, to)
}
مرحله 3 : اعلان تابع را در طول اولیه سازی مدل مشخص کنید
اعلان تابع را هنگام مقداردهی اولیه مدل مولد با ارسال آن به پارامتر tools
مدل مشخص کنید:
val generativeModel = GenerativeModel(
// Use a model that supports function calling, like Gemini 1.0 Pro
// (see "Supported models" in the "Introduction to function calling" page)
modelName = "gemini-1.0-pro",
// Access your API key as a Build Configuration variable (see "Set up your API key" above)
apiKey = BuildConfig.apiKey,
// Specify the function declaration.
tools = listOf(Tool(listOf(getExchangeRate)))
)
مرحله 4 : یک فراخوانی تابع ایجاد کنید
اکنون می توانید مدل را با تابع تعریف شده درخواست کنید.
روش پیشنهادی برای استفاده از فراخوانی تابع از طریق رابط چت است، زیرا فراخوانی های تابع به خوبی در ساختار چند نوبتی چت قرار می گیرند.
val chat = generativeModel.startChat()
val prompt = "How much is 50 US dollars worth in Swedish krona?"
// Send the message to the generative model
var response = chat.sendMessage(prompt)
// Check if the model responded with a function call
response.functionCall?.let { functionCall ->
// Try to retrieve the stored lambda from the model's tools and
// throw an exception if the returned function was not declared
val matchedFunction = generativeModel.tools?.flatMap { it.functionDeclarations }
?.first { it.name == functionCall.name }
?: throw InvalidStateException("Function not found: ${functionCall.name}")
// Call the lambda retrieved above
val apiResponse: JSONObject = matchedFunction.execute(functionCall)
// Send the API response back to the generative model
// so that it generates a text response that can be displayed to the user
response = chat.sendMessage(
content(role = "function") {
part(FunctionResponsePart(functionCall.name, apiResponse))
}
)
}
// Whenever the model responds with text, show it in the UI
response.text?.let { modelResponse ->
println(modelResponse)
}