Android APP 集成本地大模型 LLM

news/2024/12/28 20:44:50/

3cc1baea8c8b21fdd29aff2a4ed2c785.jpeg

这篇文章介绍如何在Android项目中集成大模型LLM,并展示大模型 text-to-text 结果。主要依赖如下2项:

  • MediaPipe

  • Gemma 2B

    6b071faf3f0cfe31b8014e3cff761081.gif

    MediaPipe

Google 在2017年发布了 TensorFlow Lite, 它是一个用于在Mobile和IoT上进行 ML 推断的轻量级框架。主要用于将 TensorFlow 模型转换为适用于移动设备(Android、IOS)的轻量级模型格式。

在2019年,Google 又发布了MediaPipe。使得Android项目集成TensorFlow Lite变得更加容易。MediaPipe主要提供了一系列开源库、工具,用来快速在上层 Android App 中集成 AI 和ML 能力。

目前 Mediapipe 能集成调用的大模型有:Gemma 2B, Phi-2, Falcon-RW-1B, 和 StableLM-3B。本篇文章将使用 Gemma 2B 做实例。

74d9d7dd1780e5cf0256638a346266d4.gif

Gemma 2B

Gemma 2B 是谷歌开发的一款轻量级AI模型,提供两种规模:2B和7B参数。Gemma 2B 提供 text-to-text 的功能,但是目前只能处理英语语言任务。可以通过如下链接下载模型:

https://www.kaggle.com/models/google/gemma/tfLite/

注意:需要下载 TFLit 版本,如下图

38ba6843aa41bb84b7e823bd96505d2a.png

 
下载完之后,需要先将解压后的模型文件保存到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

ac484af70d9c32841432ee82e72d59a5.gif

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大奇迹的结果。最终打印结果如下:

c211c85da3fa7e971f69e7227c98382b.png

如果你喜欢本文
长按二维码关注

http://www.ppmy.cn/news/1558877.html

相关文章

【每日学点鸿蒙知识】hap安装报错、APP转移账号、import本地文件、远程包构建问题、访问前端页面方法

1、HarmonyOS 打包生产的hap,安装报错,如何解决? 通过build打包的hap文件,通过hdc进行安装,提示错误,证书信息确认是release。如何解决? release证书无法用于安装。 2、HarmonyOS 普通账户下…

深入解析Android Framework中的android.location包:架构设计、设计模式与系统定制

深入解析Android Framework中的android.location包:架构设计、设计模式与系统定制 目录 引言android.location包概述核心类解析 LocationManagerLocationProviderLocationCriteriaGpsStatusGpsStatus.ListenerLocationListener位置服务的工作原理位置信息的获取与处理GPS状态…

Linux零基础速成篇一(理论+实操)

前言:本教程适合Linux零基础学习,也适合Linux期末考试的小伙伴,从头到尾理论与实操相结合,让你快速对Linux进行了解和掌握。 一、Linux概述 为什么要学习Linux操作系统? 完全免费-开源 任何用户均可下载使用 安全…

STM32 高级 谈一下IPV4/默认网关/子网掩码/DNS服务器/MAC

首先可以通过 winr->输入cmd->输入ipconfig 命令可以查看计算机的各种地址 IPV4:是互联网协议第 4 版(Internet Protocol version 4)所使用的地址。它是一个 32 位的二进制数字,通常被分为 4 个 8 位的部分&#xff…

Python的`turtle`库来模拟满屏烟花效果

以下是使用Python的turtle库来模拟满屏烟花效果的代码示例,运行代码后会在一个图形窗口中呈现出不断绽放的烟花场景,希望你能喜欢哦。 import turtle import random import time# 初始化屏幕 screen = turtle.Screen() screen.bgcolor("black") screen.title(&quo…

USB免驱全协议IC卡读写器 QT程序开发

15693卡片,通常指的是符合ISO/IEC 15693标准的非接触式智能卡或RFID卡。以下是对15693卡片的详细介绍: 一、基本概述 15693卡片是基于ISO/IEC 15693国际标准设计的非接触式智能卡,该标准定义了用于非接触式集成电路卡(即RFID卡&…

STM32-笔记12-实现SysTick模拟多线程流水灯

1、前言 正常STM32实现多线程,需要移植一个操作系统FreeRTOS。但是在这里不移植FreeRTOS怎么实现多线程呢?使用SysTick,那么怎么使用SysTick来模拟多线程呢?前面我们知道SysTick就是一个定时器,它不是在主函数的while循…

ARM异常处理 M33

1. ARMv8-M异常类型及其详细解释 ARMv8-M Exception分为两类:预定义系统异常(015)和外部中断(1616N)。 各种异常的状态可以通过Status bit查看,获取更信息的异常原因: CFSR是由UFSR、BFSR和MMFSR组成: 下面列举HFSR、MMFSR、…