SDK AI Edge RAG предоставляет основные компоненты для построения конвейера генерации дополненной информации (RAG) с использованием API вывода LLM. Конвейер RAG предоставляет LLM доступ к предоставленным пользователем данным, которые могут включать обновленную, конфиденциальную или специфичную для предметной области информацию. Благодаря дополнительным возможностям поиска информации в RAG, LLM могут генерировать более точные и контекстно-ориентированные ответы для конкретных сценариев использования.
В этом руководстве описана базовая реализация примера приложения с использованием API LLM Inference и SDK AI Edge RAG. Основное внимание уделяется построению конвейера RAG. Более подробную информацию об использовании API LLM Inference см. в руководстве по LLM Inference для Android .
Полный пример приложения можно найти на GitHub . Для начала соберите приложение, прочтите предоставленные пользователем данные ( sample_context.txt ) и задайте LLM вопросы, касающиеся информации в текстовом файле.
Запустите пример приложения
В этом руководстве представлен пример базового приложения для генерации текста с помощью RAG для Android. Вы можете использовать этот пример в качестве отправной точки для своего собственного приложения для Android или обратиться к нему при модификации существующего приложения.
Приложение оптимизировано для высокопроизводительных устройств, таких как Pixel 8, Pixel 9, S23 и S24. Подключите устройство Android к вашей рабочей станции и убедитесь, что у вас установлена актуальная версия Android Studio. Для получения дополнительной информации см. руководство по настройке Android .
Скачайте код приложения
Следующие инструкции показывают, как создать локальную копию примера кода с помощью инструмента командной строки git.
Клонируйте репозиторий Git, используя следующую команду:
git clone https://github.com/google-ai-edge/ai-edge-apis
После создания локальной версии примера кода вы можете импортировать проект в Android Studio и запустить приложение.
Скачать модель
Пример приложения настроен на использование Gemma-3 1B . Gemma-3 1B является частью семейства облегченных, современных открытых моделей Gemma, созданных на основе тех же исследований и технологий, что и модели Gemini. Модель содержит 1B параметров и открытые веса.
После загрузки модели Gemma-3 1B с сайта Hugging Face, загрузите её на своё устройство:
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
В демонстрационном приложении можно использовать и другие модели, но это может потребовать дополнительных шагов по настройке.
Настройте встраиваемый модуль.
Встраиватель берет фрагменты текста из предоставленных пользователем данных и преобразует их в векторизованные числовые представления, отражающие их семантическое значение. LLM использует эти встраивания для идентификации релевантных векторов и включает наиболее семантически релевантные фрагменты в сгенерированный результат.
Данное демонстрационное приложение разработано для работы с двумя векторными представлениями: Gemini и Gecko.
Настройка с помощью Gecko embedder
По умолчанию демонстрационное приложение настроено на использование встраивателя Gecko ( GeckoEmbeddingModel ) и запускает модель полностью на устройстве.
Модель Gecko embedder доступна в виде чисел с плавающей запятой и квантованных моделей, с несколькими версиями для разных длин последовательностей. Для получения дополнительной информации см. карточку модели Gecko .
Технические характеристики модели можно найти в имени файла модели. Например:
-
Gecko_256_f32.tflite: Модель чисел с плавающей запятой, поддерживающая последовательности до 256 токенов. -
Gecko_1024_quant.tflite: Квантованная модель, поддерживающая последовательности до 1024 токенов.
Длина последовательности — это максимальный размер фрагмента, который может встроить модель. Например, если модели Gecko_256_f32.tflite передается фрагмент, превышающий длину последовательности, модель встроит первые 256 токенов и обрежет оставшуюся часть фрагмента.
Загрузите модель токенизатора ( sentencepiece.model ) и встраиватель Gecko на ваше устройство:
adb push sentencepiece.model /data/local/tmp/sentencepiece.model
adb push Gecko_256_f32.tflite /data/local/tmp/gecko.tflite
Модель встраивания совместима как с центральным процессором (CPU), так и с графическим процессором (GPU). По умолчанию демонстрационное приложение настроено на извлечение встраиваний с помощью модели Gecko на графическом процессоре.
companion object {
...
private const val USE_GPU_FOR_EMBEDDINGS = true
}
Настройка с помощью Gemini Embedder
Gemini Embedder ( GeminiEmbedder ) создает встраивания с использованием API Gemini Cloud. Для запуска приложения требуется ключ API Google Gemini, который можно получить на странице настройки API Google Gemini.
Получите ключ API Gemini в Google AI Studio.
Добавьте свой API-ключ Gemini и установите COMPUTE_EMBEDDINGS_LOCALLY в значение false в файле RagPipeline.kt :
companion object {
...
private const val COMPUTE_EMBEDDINGS_LOCALLY = false
private const val GEMINI_API_KEY = "<API_KEY>"
}
Как это работает
В этом разделе представлена более подробная информация о компонентах конвейера RAG приложения. Большую часть кода можно посмотреть на сайте RagPipeline.kt .
Зависимости
RAG SDK использует библиотеку com.google.ai.edge.localagents:localagents-rag . Добавьте эту зависимость в файл build.gradle вашего Android-приложения:
dependencies {
...
implementation("com.google.ai.edge.localagents:localagents-rag:0.1.0")
implementation("com.google.mediapipe:tasks-genai:0.10.22")
}
Данные, предоставленные пользователем
Пользовательские данные в приложении представляют собой текстовый файл с именем sample_context.txt , который хранится в каталоге assets . Приложение берет фрагменты текстового файла, создает векторные представления этих фрагментов и использует эти представления при генерации выходного текста.
Следующий фрагмент кода можно найти в файле MainActivity.kt :
class MainActivity : ComponentActivity() {
lateinit var chatViewModel: ChatViewModel
...
chatViewModel.memorizeChunks("sample_context.txt")
...
}
Пошаговое изложение
Для простоты файл sample_context.txt содержит теги <chunk_splitter> , которые используются в демонстрационном приложении для создания фрагментов. Затем для каждого фрагмента создаются эмбеддинги. В производственных приложениях размер фрагментов является ключевым фактором. Если фрагмент слишком большой, вектор не содержит достаточной специфичности, чтобы быть полезным; а если он слишком маленький, он не содержит достаточного контекста.
В примере приложения обработка фрагментов данных осуществляется с помощью функции memorizeChunks в файле RagPipeline.kt .
Встраивание
Приложение предлагает два способа встраивания текста:
- Gecko embedder : Извлечение локальных (на устройстве) текстовых вложений с помощью модели Gecko.
- Gemini Embedder : Облачное извлечение текстовых встраиваний с использованием API Generative Language Cloud.
В примере приложения выбор эмбеддера зависит от того, планирует ли пользователь вычислять эмбеддинги локально или через Google Cloud. Следующий фрагмент кода можно найти в файле RagPipeline.kt :
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
)
}
База данных
В демонстрационном приложении для хранения текстовых векторных представлений используется SQLite ( SqliteVectorStore ). Для непостоянного хранения векторных данных можно также использовать базу данных DefaultVectorStore .
Следующий фрагмент кода можно найти в файле RagPipeline.kt :
private val config = ChainConfig.create(
mediaPipeLanguageModel, PromptBuilder(QA_PROMPT_TEMPLATE1),
DefaultSemanticTextMemory(
SqliteVectorStore(768), embedder
)
)
В тестовом приложении размерность встраивания установлена равной 768, что соответствует длине каждого вектора в базе данных векторов.
Цепь
RAG SDK предоставляет цепочки, которые объединяют несколько компонентов RAG в единый конвейер. Вы можете использовать цепочки для организации моделей получения и обработки данных. API основан на интерфейсе Chain .
В примере приложения используется цепочка извлечения и вывода . Следующий фрагмент кода можно найти в файле RagPipeline.kt :
private val retrievalAndInferenceChain = RetrievalAndInferenceChain(config)
Эта цепочка запускается, когда модель генерирует ответы:
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
}