AI Edge İşlev Çağırma SDK'sı (FC SDK'sı), geliştiricilerin cihaz üzerinde LLM'lerle işlev çağrısı kullanmasına olanak tanıyan bir kitaplıktır. İşlev çağrısı, modelleri harici araçlara ve API'lere bağlamanıza olanak tanır. Böylece modeller, gerçek dünyadaki işlemleri gerçekleştirmek için gerekli parametrelerle belirli işlevleri çağırabilir.
FC SDK'sını kullanan bir LLM, yalnızca metin oluşturmak yerine güncel bilgileri arama, alarm ayarlama veya rezervasyon yapma gibi bir işlemi yürüten bir işleve yönelik yapılandırılmış bir çağrı oluşturabilir.
Bu kılavuzda, FC SDK'sı ile LLM Inference API'yi Android uygulamasına eklemeyle ilgili temel bir hızlı başlangıç kılavuzu sunulmaktadır. Bu kılavuzda, cihaz üzerinde LLM'ye işlev çağırma özellikleri ekleme üzerinde durulur. LLM Inference API'yi kullanma hakkında daha fazla bilgi için Android için LLM Inference kılavuzuna bakın.
Hızlı başlangıç kılavuzu
Android uygulamanızda FC SDK'sını kullanmak için aşağıdaki adımları uygulayın. Bu hızlı başlangıç kılavuzunda, Hammer 2.1 (1,5 milyar) ile LLM Inference API kullanılmaktadır. LLM Inference API, Pixel 8 ve Samsung S23 veya sonraki modeller gibi üst düzey Android cihazlar için optimize edilmiştir ve cihaz emülatörlerini güvenilir bir şekilde desteklemez.
Bağımlılıklar ekleme
FC SDK'sı com.google.ai.edge.localagents:localagents-fc
kitaplığını, LLM Tahmini API'si ise com.google.mediapipe:tasks-genai
kitaplığını kullanır. Her iki bağımlılık dosyasını da Android uygulamanızın build.gradle
dosyasına ekleyin:
dependencies {
implementation 'com.google.mediapipe:tasks-genai:0.10.23'
implementation 'com.google.ai.edge.localagents:localagents-fc:0.1.0'
}
Android 12 (API 31) veya sonraki sürümleri çalıştıran cihazlar için yerel OpenCL kitaplığı bağımlılığını ekleyin. Daha fazla bilgi için uses-native-library
etiketiyle ilgili dokümanları inceleyin.
AndroidManifest.xml
dosyasına aşağıdaki uses-native-library
etiketlerini ekleyin:
<uses-native-library android:name="libOpenCL.so" android:required="false"/>
<uses-native-library android:name="libOpenCL-car.so" android:required="false"/>
<uses-native-library android:name="libOpenCL-pixel.so" android:required="false"/>
Model indirme
Gemma-3 1B'yi HuggingFace'tan 4 bitlik kesirli biçimde indirin. Mevcut modeller hakkında daha fazla bilgi için Modeller dokümanları bölümüne bakın.
gemma3-1b-it-int4.task
klasörünün içeriğini Android cihaza aktarın.
$ adb shell rm -r /data/local/tmp/llm/ # Remove any previously loaded models
$ adb shell mkdir -p /data/local/tmp/llm/
$ adb push gemma3-1b-it-int4.task /data/local/tmp/llm/gemma3-1b-it-int4.task
İşlev tanımlarını bildirme
Modelin kullanabileceği işlevleri tanımlayın. Bu hızlı başlangıç kılavuzunda, süreci açıklamak için sabit kodlanmış yanıtlar döndüren statik yöntemler olarak iki işlev yer alır. Daha pratik bir uygulama, REST API'yi çağıran veya bir veritabanından bilgi alan işlevler tanımlar.
Aşağıda getWeather
ve getTime
işlevleri tanımlanmaktadır:
class ToolsForLlm {
public static String getWeather(String location) {
return "Cloudy, 56°F";
}
public static String getTime(String timezone) {
return "7:00 PM " + timezone;
}
private ToolsForLlm() {}
}
Her işlevi açıklamak için FunctionDeclaration
'ü kullanın. Her işleve bir ad ve açıklama verin ve türleri belirtin. Bu, modele işlevlerin ne yaptığını ve ne zaman işlev çağrısı yapılacağını bildirir.
var getWeather = FunctionDeclaration.newBuilder()
.setName("getWeather")
.setDescription("Returns the weather conditions at a location.")
.setParameters(
Schema.newBuilder()
.setType(Type.OBJECT)
.putProperties(
"location",
Schema.newBuilder()
.setType(Type.STRING)
.setDescription("The location for the weather report.")
.build())
.build())
.build();
var getTime = FunctionDeclaration.newBuilder()
.setName("getTime")
.setDescription("Returns the current time in the given timezone.")
.setParameters(
Schema.newBuilder()
.setType(Type.OBJECT)
.putProperties(
"timezone",
Schema.newBuilder()
.setType(Type.STRING)
.setDescription("The timezone to get the time from.")
.build())
.build())
.build();
İşlev tanımlarını bir Tool
nesnesine ekleyin:
var tool = Tool.newBuilder()
.addFunctionDeclarations(getWeather)
.addFunctionDeclarations(getTime)
.build();
Tahmin arka ucunu oluşturma
LLM çıkarım API'sini kullanarak bir çıkarım arka ucu oluşturun ve modeliniz için bir biçimlendirici nesnesi iletin. FC SDK biçimlendiricisi (ModelFormatter
), hem biçimlendirici hem de ayrıştırıcı görevi görür. Bu hızlı başlangıç kılavuzunda Gemma-3 1B kullanıldığı için GemmaFormatter
'yi kullanacağız:
var llmInferenceOptions = LlmInferenceOptions.builder()
.setModelPath(modelFile.getAbsolutePath())
.build();
var llmInference = LlmInference.createFromOptions(context, llmInferenceOptions);
var llmInferenceBackend = new llmInferenceBackend(llmInference, new GemmaFormatter());
Daha fazla bilgi için LLM çıkarım yapılandırma seçenekleri bölümüne bakın.
Modeli örneklendirme
Tahmin arka ucunu, sistem istemini ve araçları bağlamak için GenerativeModel
nesnesini kullanın. Arka uç çıkarım ve araçlara zaten sahibiz. Dolayısıyla, tek yapmamız gereken sistem istemini oluşturmaktır:
var systemInstruction = Content.newBuilder()
.setRole("system")
.addParts(Part.newBuilder().setText("You are a helpful assistant."))
.build();
Modeli GenerativeModel
ile örneklendirin:
var generativeModel = new GenerativeModel(
llmInferenceBackend,
systemInstruction,
List.of(tool),
)
Sohbet oturumu başlatma
Basitlik açısından bu hızlı başlangıç kılavuzunda tek bir sohbet oturumu başlatılmaktadır. Ayrıca birden fazla bağımsız oturum da oluşturabilirsiniz.
Yeni GenerativeModel
örneğini kullanarak bir sohbet oturumu başlatın:
var chat = generativeModel.startChat();
sendMessage
yöntemini kullanarak sohbet oturumu üzerinden modele istem gönderin:
var response = chat.sendMessage("How's the weather in San Francisco?");
Model yanıtını ayrıştırma
Uygulama, modele bir istem gönderdikten sonra işlev çağrısı yapıp yapmayacağını veya doğal dil metni gösterip göstermeyeceğini belirlemek için yanıtı incelemelidir.
// Extract the model's message from the response.
var message = response.getCandidates(0).getContent().getParts(0);
// If the message contains a function call, execute the function.
if (message.hasFunctionCall()) {
var functionCall = message.getFunctionCall();
var args = functionCall.getArgs().getFieldsMap();
var result = null;
// Call the appropriate function.
switch (functionCall.getName()) {
case "getWeather":
result = ToolsForLlm.getWeather(args.get("location").getStringValue());
break;
case "getTime":
result = ToolsForLlm.getWeather(args.get("timezone").getStringValue());
break;
default:
throw new Exception("Function does not exist:" + functionCall.getName());
}
// Return the result of the function call to the model.
var functionResponse =
FunctionResponse.newBuilder()
.setName(functionCall.getName())
.setResponse(
Struct.newBuilder()
.putFields("result", Value.newBuilder().setStringValue(result).build()))
.build();
var response = chat.sendMessage(functionResponse);
} else if (message.hasText()) {
Log.i(message.getText());
}
Örnek kod, aşırı basitleştirilmiş bir uygulamadır. Bir uygulamanın model yanıtlarını nasıl inceleyebileceği hakkında daha fazla bilgi için Biçimlendirme ve Ayrıştırma bölümüne bakın.
İşleyiş şekli
Bu bölümde, Android için işlev çağırma SDK'sının temel kavramları ve bileşenleri hakkında daha ayrıntılı bilgi verilmektedir.
Modeller
İşlev Çağırma SDK'sı, biçimlendirici ve ayrıştırıcı içeren bir model gerektirir. FC SDK'sı aşağıdaki modeller için yerleşik bir biçimlendirici ve ayrıştırıcı içerir:
- Gemma:
GemmaFormatter
seçeneğini kullanın. - Llama:
LlamaFormatter
simgesini kullanın. - Çekiç:
HammerFormatter
simgesini kullanın.
FC SDK'sı ile farklı bir model kullanmak için LLM Inference API ile uyumlu kendi biçimlendiricinizi ve ayrıştırıcınızı geliştirmeniz gerekir.
Biçimlendirme ve ayrıştırma
İşlev çağrısı desteğinin önemli bir parçası, istemlerin biçimlendirilmesi ve model çıktısının ayrıştırılmasıdır. Bunlar iki ayrı işlem olsa da FC SDK'sı, ModelFormatter
arayüzüyle hem biçimlendirmeyi hem de ayrıştırmayı yönetir.
Düzenleyici, yapılandırılmış işlev beyanlarını metne dönüştürmekten, işlev yanıtlarını biçimlendirmekten ve konuşma sıralarının başlangıç ve bitiş noktalarını, ayrıca bu sıraların rollerini (ör. "kullanıcı", "model") belirtmek için jeton eklemekten sorumludur.
Model yanıtının işlev çağrısı içerip içermediğini belirleme görevi ayrıştırıcıya aittir. Ayrıştırıcı, bir işlev çağrısı algılarsa bu çağrıyı yapılandırılmış veri türüne ayırır. Aksi takdirde metin, doğal dil yanıtı olarak değerlendirilir.
Kısıtlı kod çözme
Kısıtlanmış kod çözme, LLM'lerin çıkış oluşturma işlemine rehberlik ederek JSON nesneleri veya Python işlev çağrıları gibi önceden tanımlanmış bir yapılandırılmış biçime uymasını sağlar. Model, bu kısıtlamaları uygulayarak çıkışlarını önceden tanımlanmış işlevlere ve ilgili parametre türlerine uygun şekilde biçimlendirir.
Kısıtlanmış kod çözmeyi etkinleştirmek için ConstraintOptions
nesnesinde kısıtlamaları tanımlayın ve ChatSession
örneğinin enableConstraint
yöntemini çağırın.
Etkinleştirildiğinde bu kısıtlama, yanıtı yalnızca GenerativeModel
ile ilişkili araçları içerecek şekilde kısıtlar.
Aşağıdaki örnekte, yanıtı araç çağrılarına kısıtlamak için kısıtlanmış kod çözmenin nasıl yapılandırılacağı gösterilmektedir. Araç çağrısını ```tool_code\n
ön ekiyle başlamak ve \n```
son ekiyle sonlandırmak üzere kısıtlar.
ConstraintOptions constraintOptions = ConstraintOptions.newBuilder()
.setToolCallOnly( ConstraintOptions.ToolCallOnly.newBuilder()
.setConstraintPrefix("```tool_code\n")
.setConstraintSuffix("\n```"))
.build(); chatSession.enableConstraint(constraintOptions);
Etkin kısıtlamayı aynı oturum içinde devre dışı bırakmak için disableConstraint
yöntemini kullanın:
chatSession.disableConstraint()