Android için Yapay Zeka Kenar İşlevi Arama Kılavuzu

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()