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 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 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
}