فراخوانی تابع، دریافت خروجی داده های ساختاریافته از مدل های تولیدی را برای شما آسان تر می کند. سپس می توانید از این خروجی ها برای فراخوانی API های دیگر و برگرداندن داده های پاسخ مربوطه به مدل استفاده کنید. به عبارت دیگر، فراخوانی تابع به شما کمک می کند تا مدل های تولیدی را به سیستم های خارجی متصل کنید تا محتوای تولید شده شامل به روزترین و دقیق ترین اطلاعات باشد.
می توانید مدل های Gemini را با توضیحاتی در مورد عملکردها ارائه دهید. اینها توابعی هستند که شما به زبان برنامه خود می نویسید (یعنی توابع Google Cloud نیستند). مدل ممکن است از شما بخواهد که یک تابع را فراخوانی کنید و نتیجه را برای کمک به مدل در رسیدگی به درخواست شما ارسال کنید.
اگر قبلاً این کار را نکردهاید، برای کسب اطلاعات بیشتر ، مقدمه فراخوانی تابع را بررسی کنید.
API مثال برای کنترل روشنایی
تصور کنید یک سیستم کنترل روشنایی اولیه با یک رابط برنامه نویسی کاربردی (API) دارید و می خواهید به کاربران اجازه دهید تا از طریق درخواست های متنی ساده، چراغ ها را کنترل کنند. میتوانید از ویژگی فراخوانی تابع برای تفسیر درخواستهای تغییر نور از سوی کاربران و ترجمه آنها به فراخوانهای API برای تنظیم مقادیر نور استفاده کنید. این سیستم کنترل روشنایی فرضی به شما امکان می دهد روشنایی نور و دمای رنگ آن را کنترل کنید که به عنوان دو پارامتر جداگانه تعریف می شود:
پارامتر | تایپ کنید | مورد نیاز | توضیحات |
---|---|---|---|
brightness | شماره | بله | سطح نور از 0 تا 100. صفر خاموش است و 100 روشنایی کامل است. |
colorTemperature | رشته | بله | دمای رنگ دستگاه نور که می تواند daylight ، cool یا warm باشد. |
برای سادگی، این سیستم نورپردازی خیالی تنها یک نور دارد، بنابراین کاربر مجبور نیست اتاق یا مکان را مشخص کند. در اینجا نمونه ای از درخواست JSON است که می توانید برای تغییر سطح نور با استفاده از دمای رنگ نور روز به API کنترل روشنایی ارسال کنید:
{
"brightness": "50",
"colorTemperature": "daylight"
}
این آموزش به شما نشان میدهد که چگونه یک Function Call را برای Gemini API تنظیم کنید تا درخواستهای روشنایی کاربران را تفسیر کند و آنها را به تنظیمات API برای کنترل مقدار روشنایی و دمای رنگ نور تنظیم کنید.
قبل از شروع: پروژه و کلید API خود را تنظیم کنید
قبل از فراخوانی Gemini API، باید پروژه خود را راه اندازی کرده و کلید API خود را پیکربندی کنید.
کلید API خود را دریافت و ایمن کنید
برای فراخوانی Gemini API به یک کلید API نیاز دارید. اگر قبلاً یکی ندارید، یک کلید در Google AI Studio ایجاد کنید.
اکیداً توصیه می شود که یک کلید API را در سیستم کنترل نسخه خود بررسی نکنید .
شما باید کلید API خود را در یک فایل local.properties
واقع در دایرکتوری ریشه پروژه خود ذخیره کنید و این فایل را از کنترل نسخه حذف کنید. برای استقرار تولید، از افزونه Secrets Gradle برای اندروید استفاده کنید تا کلید API خود را به عنوان یک متغیر پیکربندی ساخت بخوانید.
// Access your API key as a Build Configuration variable
val apiKey = BuildConfig.apiKey
تمام قطعه های این آموزش از این بهترین تمرین استفاده می کنند. همچنین اگر میخواهید اجرای پلاگین Secrets Gradle را مشاهده کنید، میتوانید برنامه نمونه این SDK را بررسی کنید یا از آخرین پیشنمایش اندروید استودیو که دارای قالب Gemini API Starter است (که شامل فایل local.properties
برای دریافت شما میشود) استفاده کنید. آغاز شد).
وابستگی SDK را به پروژه خود اضافه کنید
در محیط توسعه برنامه خود، موارد زیر را انجام دهید:
در فایل پیکربندی Gradle ماژول (سطح برنامه) ، وابستگی Google AI SDK for Android را اضافه کنید:
کاتلین
// add to <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.7.0") }
جاوا
// add to <project>/<app-module>/build.gradle dependencies { // ... other androidx dependencies // add the dependency for the Google AI client SDK for Android implementation("com.google.ai.client.generativeai:generativeai:0.7.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") }
پروژه اندروید خود را با فایل های Gradle همگام سازی کنید.
یک تابع API را تعریف کنید
تابعی بسازید که درخواست API می دهد. این تابع باید در کد برنامه شما تعریف شود، اما می تواند خدمات یا API های خارج از برنامه شما را فراخوانی کند. Gemini API این تابع را مستقیماً فراخوانی نمی کند، بنابراین می توانید نحوه و زمان اجرای این تابع را از طریق کد برنامه خود کنترل کنید. برای اهداف نمایشی، این آموزش یک تابع API ساختگی را تعریف می کند که فقط مقادیر روشنایی درخواستی را برمی گرداند:
suspend fun setLightValues(
brightness: Int,
colorTemp: String
): JSONObject {
// This mock API returns the requested lighting values
return JSONObject().apply {
put("brightness", brightness)
put("colorTemperature", colorTemp)
}
}
ایجاد اعلان عملکرد
اعلان تابعی را ایجاد کنید که به مدل مولد منتقل می کنید. هنگامی که یک تابع را برای استفاده توسط مدل اعلام می کنید، باید تا حد امکان جزئیات بیشتری را در توضیحات تابع و پارامتر بگنجانید. مدل مولد از این اطلاعات برای تعیین اینکه کدام تابع را انتخاب کند و چگونه مقادیر پارامترهای فراخوانی تابع را ارائه کند، استفاده می کند. کد زیر نحوه اعلام عملکرد کنترل روشنایی را نشان می دهد:
val lightControlTool = defineFunction(
name = "setLightValues",
description = "Set the brightness and color temperature of a room light.",
Schema.int("brightness", "Light level from 0 to 100. Zero is off and 100" +
" is full brightness."),
Schema.str("colorTemperature", "Color temperature of the light fixture" +
" which can be `daylight`, `cool` or `warm`.")
) { brightness, colorTemp ->
// Call the function you declared above
setLightValues(brightness.toInt(), colorTemp)
}
توابع را در طول اولیه سازی مدل اعلام کنید
هنگامی که می خواهید از فراخوانی تابع با یک مدل استفاده کنید، باید اعلان های تابع خود را هنگام مقداردهی اولیه شی مدل ارائه دهید. شما با تنظیم پارامتر tools
مدل، توابع را اعلام می کنید:
val generativeModel = GenerativeModel(
modelName = "gemini-1.5-flash",
// Access your API key as a Build Configuration variable
apiKey = BuildConfig.apiKey,
// Specify the function declaration.
tools = listOf(Tool(listOf(lightControlTool)))
)
یک فراخوانی تابع ایجاد کنید
هنگامی که مدل را با اعلان های تابع خود مقداردهی اولیه کردید، می توانید مدل را با تابع تعریف شده درخواست کنید. شما باید از فراخوانی تابع با استفاده از درخواست چت ( sendMessage()
) استفاده کنید، زیرا فراخوانی تابع عموماً از داشتن متن درخواست ها و پاسخ های قبلی سود می برد.
val chat = generativeModel.startChat()
val prompt = "Dim the lights so the room feels cozy and warm."
// 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)
}