Пакет AI Edge RAG SDK предоставляет основные компоненты для построения конвейера дополненной генерации (RAG) с API вывода LLM. Конвейер RAG предоставляет LLM-программистам доступ к пользовательским данным, которые могут включать актуальную, конфиденциальную или специфичную для предметной области информацию. Благодаря дополнительным возможностям RAG по поиску информации LLM-программисты могут генерировать более точные и контекстно-зависимые ответы для конкретных сценариев использования.
В этом руководстве описывается базовая реализация примера приложения с использованием API вывода LLM и SDK AI Edge RAG. В руководстве основное внимание уделено построению конвейера RAG. Подробнее об использовании API вывода LLM см. в руководстве LLM Inference for 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
По умолчанию пример приложения настроен на использование встраиваемого модуля 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
Модель встраивания совместима как с центральным процессором, так и с графическим процессором. По умолчанию приложение-пример настроено на извлечение встраиваний с помощью модели Gecko на графическом процессоре.
companion object {
...
private const val USE_GPU_FOR_EMBEDDINGS = true
}
Настройка с помощью Gemini Embedder
Gemini Embedder ( GeminiEmbedder
) создаёт встраиваемые приложения, используя Gemini Cloud API. Для запуска приложения требуется ключ Google Gemini API, который можно получить на странице настройки Google Gemini API.
Получите ключ 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
}