Android APP 集成本地大模型 LLM
这篇文章介绍如何在Android项目中集成大模型LLM,并展示大模型 text-to-text 结果。主要依赖如下2项:
MediaPipe
Gemma 2B
MediaPipe
在2019年,Google 又发布了MediaPipe。使得Android项目集成TensorFlow Lite变得更加容易。MediaPipe主要提供了一系列开源库、工具,用来快速在上层 Android App 中集成 AI 和ML 能力。
目前 Mediapipe 能集成调用的大模型有:Gemma 2B, Phi-2, Falcon-RW-1B, 和 StableLM-3B。本篇文章将使用 Gemma 2B 做实例。
Gemma 2B
Gemma 2B 是谷歌开发的一款轻量级AI模型,提供两种规模:2B和7B参数。Gemma 2B 提供 text-to-text 的功能,但是目前只能处理英语语言任务。可以通过如下链接下载模型:
https://www.kaggle.com/models/google/gemma/tfLite/
注意:需要下载 TFLit 版本,如下图
下载完之后,需要先将解压后的模型文件保存到Android设备存储中。 可以使用如下 ADB 命令:
adb shell rm -r /data/local/tmp/llm/adb shell mkdir -p /data/local/tmp/llm/ adb push gemma-2b-it-gpu-int4.bin /data/local/tmp/llm/gemma2b.bin
Andorid 代码
添加 MediaPipe依赖
在 app module 的 build.gradle 中添加如下依赖:
implementation("com.google.mediapipe:tasks-genai:0.10.14")
实现 LocalLLMTask 类
实现Class LocalLLMTask类,用来完成本地模型的加载和推理。代码如下:
public class LocalLLMTask { private static final String TAG = LocalLLMTask.class.getSimpleName(); private static final String MODEL_PATH = "/data/local/tmp/llm/gemma2b-gpu.bin"; private static LocalLLMTask mLLMTask; private final LlmInference mLlmInference;
public LocalLLMTask(Context context) { LlmInference.LlmInferenceOptions options = LlmInference.LlmInferenceOptions.builder() .setModelPath(MODEL_PATH) .setMaxTokens(2048) .setTopK(50) .setTemperature(0.7f) .setRandomSeed(1) .setResultListener((partialResult, done) -> Log.i(TAG, "LocalLLMTask, partialResult: " + partialResult)).build();
mLlmInference = LlmInference.createFromOptions(context, options); }
public static LocalLLMTask getInstance(Context context) { if (mLLMTask == null) { mLLMTask = new LocalLLMTask(context); } return mLLMTask; }
public void generateResponse(String prompt) { if (mLlmInference != null) { Log.i(TAG, "generateResponse, prompt: " + prompt); String result = mLlmInference.generateResponse(prompt); Log.i(TAG, "generateResponse, result: " + result); } }}
调用本地模型获取结果
在 MainActivity 中直接执行 LlmInference的 generateResponse 方法,如下:
LocalLLMTask.getInstance(MainActivity.this).generateResponse("tell me 7 wonders of the world");
传入的 prompt 是 "tell me 7 wonders of the world",来看一下本地大模型是否能够给出世界7大奇迹的结果。最终打印结果如下:
如果你喜欢本文
长按二维码关注