Android için AI Edge RAG kılavuzu

AI Edge RAG SDK, LLM Inference API ile almayla artırılmış üretim (RAG) işlem hattı oluşturmak için temel bileşenleri sağlar. Bir RAG işlem hattı, LLM'lerin kullanıcı tarafından sağlanan verilere erişmesini sağlar. Bu veriler arasında güncellenmiş, hassas veya alana özgü bilgiler yer alabilir. RAG'nin eklediği bilgi alma özellikleri sayesinde LLM'ler, belirli kullanım alanları için daha doğru ve bağlama duyarlı yanıtlar üretebilir.

Bu kılavuz, AI Edge RAG SDK ile LLM Inference API'yi kullanarak örnek bir uygulamanın temel uygulamasında size yol gösterir. Bu kılavuz, RAG işlem hattı oluşturmaya odaklanır. LLM Inference API'yi kullanma hakkında daha fazla bilgi için Android için LLM Inference Kılavuzu'na bakın.

Örnek uygulamanın tamamını GitHub'da bulabilirsiniz. Başlamak için uygulamayı oluşturun, kullanıcı tarafından sağlanan verileri (sample_context.txt) okuyun ve LLM'ye metin dosyasındaki bilgilerle ilgili sorular sorun.

Örnek uygulamayı çalıştırma

Bu kılavuzda, Android için RAG ile temel metin oluşturma uygulaması örneği verilmektedir. Örnek uygulamayı kendi Android uygulamanız için başlangıç noktası olarak kullanabilir veya mevcut bir uygulamayı değiştirirken bu uygulamaya başvurabilirsiniz.

Uygulama, Pixel 8, Pixel 9, S23 ve S24 gibi üst düzey cihazlar için optimize edilmiştir. Bir Android cihazı iş istasyonunuza bağlayın ve Android Studio'nun güncel bir sürümünü kullandığınızdan emin olun. Daha fazla bilgi için Android kurulum kılavuzuna bakın.

Uygulama kodunu indirme

Aşağıdaki talimatlarda, git komut satırı aracını kullanarak örnek kodun yerel bir kopyasını nasıl oluşturacağınız gösterilmektedir.

Aşağıdaki komutu kullanarak Git deposunu klonlayın:

git clone https://github.com/google-ai-edge/ai-edge-apis

Örnek kodun yerel bir sürümünü oluşturduktan sonra projeyi Android Studio'ya aktarıp uygulamayı çalıştırabilirsiniz.

Model indirme

Örnek uygulama, Gemma-3 1B'yi kullanacak şekilde yapılandırılmıştır. Gemma-3 1B, Gemini modellerini oluşturmak için kullanılan araştırma ve teknolojilerle geliştirilmiş, hafif ve son teknoloji ürünü açık modellerden oluşan Gemma ailesinin bir üyesidir. Model, 1 milyar parametre ve açık ağırlıklar içerir.

Gemma-3 1B'yi indirin

Gemma-3 1B'yi Hugging Face'ten indirdikten sonra modeli cihazınıza aktarın:

cd ~/Downloads
tar -xvzf gemma3-1b-it-int4.tar.gz
$ adb shell rm -r /data/local/tmp/llm/ # Remove any previously loaded models
$ adb shell mkdir -p /data/local/tmp/llm/
$ adb push output_path /data/local/tmp/llm/model_version.task

Örnek uygulamayla diğer modelleri de kullanabilirsiniz ancak bu durumda ek yapılandırma adımları gerekebilir.

Yerleştirici ayarlama

Yerleştirme aracı, kullanıcı tarafından sağlanan verilerden metin parçaları alır ve bunları, semantik anlamını yakalayan vektörel sayısal gösterimlere dönüştürür. LLM, alakalı vektörleri belirlemek için bu yerleştirmelere başvurur ve oluşturulan çıktıda anlamsal olarak en alakalı parçaları kullanır.

Örnek uygulama, iki yerleştiriciyle (Gemini yerleştirici ve Gecko yerleştirici) çalışacak şekilde tasarlanmıştır.

Gecko yerleştirici ile kurulum

Örnek uygulama, varsayılan olarak Gecko yerleştiricisini (GeckoEmbeddingModel) kullanacak şekilde yapılandırılır ve modeli tamamen cihaz üzerinde çalıştırır.

Gecko 110m-en'i indirin

Gecko yerleştiricisi, farklı dizi uzunlukları için birden fazla sürümle birlikte kayan ve nicelenmiş modeller olarak kullanılabilir. Daha fazla bilgi için Gecko model kartına bakın.

Model spesifikasyonlarını model dosya adında bulabilirsiniz. Örneğin:

  • Gecko_256_f32.tflite: 256 jetona kadar dizileri destekleyen kayan nokta modeli.
  • Gecko_1024_quant.tflite: 1.024 jetona kadar dizileri destekleyen nicelenmiş model.

Dizi uzunluğu, modelin yerleştirebileceği maksimum parça boyutudur. Örneğin, Gecko_256_f32.tflite modeline, sıra uzunluğunu aşan bir parça iletilirse model, ilk 256 jetonu yerleştirir ve parçanın geri kalanını keser.

Tokenizer modelini (sentencepiece.model) ve Gecko yerleştiricisini cihazınıza aktarın:

adb push sentencepiece.model /data/local/tmp/sentencepiece.model
adb push Gecko_256_f32.tflite /data/local/tmp/gecko.tflite

Yerleştirme modeli hem CPU hem de GPU ile uyumludur. Örnek uygulama, varsayılan olarak GPU'da Gecko modeliyle yerleştirmeleri çıkaracak şekilde yapılandırılır.

companion object {
  ...
  private const val USE_GPU_FOR_EMBEDDINGS = true
}

Gemini Embedder ile ayarlama

Gemini Embedder (GeminiEmbedder), Gemini Cloud API'yi kullanarak yerleştirmeler oluşturur. Uygulamayı çalıştırmak için Google Gemini API kurulum sayfasından edinebileceğiniz bir Google Gemini API anahtarı gerekir.

Google AI Studio'da Gemini API anahtarı edinme

Gemini API anahtarınızı ekleyin ve RagPipeline.kt dosyasında COMPUTE_EMBEDDINGS_LOCALLY değerini false olarak ayarlayın:

companion object {
  ...
  private const val COMPUTE_EMBEDDINGS_LOCALLY = false
  private const val GEMINI_API_KEY = "<API_KEY>"
}

İşleyiş şekli

Bu bölümde, uygulamanın RAG işlem hattı bileşenleri hakkında daha ayrıntılı bilgiler verilmektedir. Kodun büyük bir kısmını RagPipeline.kt adresinde görüntüleyebilirsiniz.

Bağımlılıklar

RAG SDK'sı com.google.ai.edge.localagents:localagents-rag kitaplığını kullanır. Bu bağımlılığı Android uygulamanızın build.gradle dosyasına ekleyin:

dependencies {
    ...
    implementation("com.google.ai.edge.localagents:localagents-rag:0.1.0")
    implementation("com.google.mediapipe:tasks-genai:0.10.22")
}

Kullanıcı tarafından sağlanan veriler

Uygulamada kullanıcı tarafından sağlanan veriler, assets dizininde depolanan sample_context.txt adlı bir metin dosyasıdır. Uygulama, metin dosyasının parçalarını alır, bu parçaların gömmelerini oluşturur ve çıkış metni oluştururken gömmelere başvurur.

Aşağıdaki kod snippet'i MainActivity.kt dosyasında bulunabilir:

class MainActivity : ComponentActivity() {
  lateinit var chatViewModel: ChatViewModel
...
    chatViewModel.memorizeChunks("sample_context.txt")
...
}

Chunking

Basitlik açısından, sample_context.txt dosyası, örnek uygulamanın parçalar oluşturmak için kullandığı <chunk_splitter> etiketlerini içerir. Ardından, her bir parça için yerleştirmeler oluşturulur. Üretim uygulamalarında, parçaların boyutu önemli bir husustur. Bir parça çok büyük olduğunda vektör, yararlı olacak kadar spesifik bilgi içermez. Çok küçük olduğunda ise yeterli bağlam bilgisi içermez.

Örnek uygulama, memorizeChunks içindeki RagPipeline.kt işlevi aracılığıyla parçalama işlemini gerçekleştirir.

Yerleştirme

Uygulama, metin yerleştirme için iki yol sunar:

  • Gecko embedder: Gecko modeliyle yerel (cihaz üzerinde) metin yerleştirme çıkarma.
  • Gemini Embedder: Generative Language Cloud API ile bulut tabanlı metin yerleştirme çıkarma.

Örnek uygulama, kullanıcının yerel olarak mı yoksa Google Cloud üzerinden mi yerleştirme hesaplamak istediğine göre yerleştirme oluşturucuyu seçer. Aşağıdaki kod snippet'i RagPipeline.kt dosyasında bulunabilir:

private val embedder: Embedder<String> = if (COMPUTE_EMBEDDINGS_LOCALLY) {
  GeckoEmbeddingModel(
    GECKO_MODEL_PATH,
    Optional.of(TOKENIZER_MODEL_PATH),
    USE_GPU_FOR_EMBEDDINGS,
    )
  } else {
    GeminiEmbedder(
      GEMINI_EMBEDDING_MODEL,
      GEMINI_API_KEY
      )
  }

Veritabanı

Örnek uygulama, metin yerleştirmelerini depolamak için SQLite'ı (SqliteVectorStore) kullanır. Ayrıca, kalıcı olmayan vektör depolama için DefaultVectorStore veritabanını da kullanabilirsiniz.

Aşağıdaki kod snippet'i RagPipeline.kt dosyasında bulunabilir:

private val config = ChainConfig.create(
    mediaPipeLanguageModel, PromptBuilder(QA_PROMPT_TEMPLATE1),
    DefaultSemanticTextMemory(
        SqliteVectorStore(768), embedder
    )
)

Örnek uygulama, yerleştirme boyutunu 768 olarak ayarlar. Bu değer, vektör veritabanındaki her vektörün uzunluğunu ifade eder.

Chain

RAG SDK, çeşitli RAG bileşenlerini tek bir işlem hattında birleştiren zincirler sağlar. Alma ve sorgu modellerini düzenlemek için zincirleri kullanabilirsiniz. API, Chain arayüzünü temel alır.

Örnek uygulamada Retrieval and Inference chain (Alma ve Çıkarım zinciri) kullanılır. Aşağıdaki kod snippet'i RagPipeline.kt dosyasında bulunabilir:

private val retrievalAndInferenceChain = RetrievalAndInferenceChain(config)

Model yanıt oluşturduğunda zincir çağrılır:

suspend fun generateResponse(
    prompt: String,
    callback: AsyncProgressListener<LanguageModelResponse>?
): String =
    coroutineScope {
        val retrievalRequest =
            RetrievalRequest.create(
                prompt,
                RetrievalConfig.create(2, 0.0f, TaskType.QUESTION_ANSWERING)
            )
        retrievalAndInferenceChain.invoke(retrievalRequest, callback).await().text
    }