手机离线跑大模型ReactNative实战

01 你还在为每次调用 LLM 交"税"吗

去年我做一个健康类 App 的智能问答,第一个月 token 账单就干到了两千多。更难受的是,用户输入的身体状况要绕一圈云服务器,合规评审每次都皱眉。

后来我一直想一件事:现在手机算力这么强,为什么非得把每一个 prompt 都送到云端?

2026 年这件事终于不用纠结了。Meta 的 ExecuTorch 加上 Software Mansion 的 react-native-executorch,让一个 3B 参数的模型能直接在手机上跑,首 token 延迟压到 100ms 以内,每次对话的边际成本等于零。

这篇文章我不讲概念,只带你在 React Native 里把一个能离线对话的 LLM 真正跑起来。

我把自己跑通的全过程、踩的坑、还有模型怎么选,都摊开写在这里,照着做就能在真机上对话。

02 端侧推理到底解决了什么

先说清楚为什么值得做,不然你不会想踩这一堆原生坑。

隐私是第一根稻草。推理在端上,prompt 和回答永远不离开手机。医疗、金融、日记这类应用,这一条直接消掉一整类合规风险,不用再为每个接口写脱敏。

延迟是体感。云端来回至少加 200-800ms 才出第一个字。端侧在骁龙 8 Elite 上首 token 不到 100ms,对话的"跟手感"完全不一样,打字机效果才像真的在聊。

成本最实在。模型下载一次之后,不管多少用户、多少条消息,边际成本都是零。我那个健康 App 如果全走端侧,一年省下的 token 钱够再招半个人。

离线是兜底。工厂车间、医院病房、飞机上,网络不稳的地方端侧 AI 照样干活,不会因为断网变成智障。

代价我也得说清楚:端侧模型小,3B 在复杂推理上确实打不过 GPT-4。但摘要、翻译、快问快答、图片描述、工具增强工作流,质量完全够用,而且量化技术每个月都在进步。

2026 年的实测数据更直白:骁龙 8 Elite 上 1-5GB 的端侧模型已经能做到 GPT-3.5 级别的质量,子 20ms 的推理延迟不再是实验室里的数字,而是真机上的体感。

03 选型:为什么是 react-native-executorch

2026 年 RN 端侧 AI 有三个主流选择,我一个个踩过。

react-native-executorch(Software Mansion,底层 ExecuTorch):模型覆盖最广,LLM、语音识别、图像分类、OCR 一个不落,而且给的是 React Hooks 优先的 API,前端写着最顺手。

react-native-ai(Callstack):兼容 Vercel AI SDK,一行配置就能在云端和本地模型之间切换,适合已经用 Vercel AI SDK 的项目,但模型覆盖没那么全。

llama.rn:GGUF 模型、底层控制最强,但得自己接一大堆胶水代码,不是"装上就用"的路线。

我的目标最快跑通一个聊天:要 Hooks、要覆盖广、要少写胶水。选 react-native-executorch 基本没有悬念。它把模型加载、内存管理、流式输出全包了,我只管写 UI。

如果你做过原生 AI 集成的老路子,会懂少写多少胶水代码意味着什么------那往往是劝退的第一步。

04 环境准备(先避开两个大坑)

硬性前提,少一个都跑不起来,我按踩坑顺序列:

  • Expo SDK 54 及以上
  • 新架构(New Architecture)必须开,这个库不兼容老 bridge
  • 真机,或分配了至少 4GB RAM 的模拟器

安装核心包和资源拉取器:

java 复制代码
npx expo install react-native-executorch @react-native-executorch/expo-resource-fetcher expo-file-system expo-asset

注意:因为包含原生代码,必须用 development build,expo run:iosexpo run:android,Expo Go 不行。

第一个坑就在这------很多人拿 Expo Go 直接跑,白屏报错半天找不到原因。这是原生模块,不是 Web,Expo Go 加载不了原生代码。

确认新架构有没有开,看 Expo 项目里 app.jsonexpo.newArchEnabled 是不是 true。很多从老模板升级的项目这项是漏的,模型 Hook 一调用就报原生模块找不到。

json 复制代码
// app.json
{ "expo": { "newArchEnabled": true } }

第二个坑是 RAM。模拟器默认只给 2GB,模型加载直接 OOM 崩。我第一次就是卡在这,改到 4GB 才稳住。

05 初始化:一次就够

在应用入口调用一次 initExecutorch,它负责注册资源拉取器,把模型二进制下载并缓存到本地存储。

javascript 复制代码
// app/_layout.tsx
import { initExecutorch } from 'react-native-executorch';
import { ExpoResourceFetcher } from '@react-native-executorch/expo-resource-fetcher';

initExecutorch({
  resourceFetcher: ExpoResourceFetcher,
});

就这一行配置,后面所有页面都不用再管模型加载的细节。它会在首次需要模型时自动去拉取并缓存,之后离线也能用。

06 核心:用 useLLM 写一个能离线的聊天

真正的活儿都在 useLLM 这个 Hook 里:模型加载、token 流式输出、对话历史管理、内存清理,它全包了,你不用碰任何 C++。

下面这个 ChatScreen 我精简过,但逻辑完整,复制进 Expo 项目就能跑。

php 复制代码
// app/chat.tsx
import React from 'react';
import { View, Text, TextInput, FlatList, Pressable, ActivityIndicator, StyleSheet } from 'react-native';
import { useLLM, QWEN3_0_6B, type Message } from 'react-native-executorch';

export default function ChatScreen() {
  const [input, setInput] = React.useState('');
  const [history, setHistory] = React.useState([]);

  const llm = useLLM({ model: QWEN3_0_6B });

  React.useEffect(() => {
    llm.configure({
      chatConfig: { systemPrompt: '你是一个简洁、有帮助的手机端助手。' },
      generationConfig: { temperature: 0.7, topp: 0.9 },
    });
  }, [llm]);

  const send = async () => {
    if (!input.trim() || llm.isGenerating) return;
    const next = [...history, { role: 'user', content: input }];
    setHistory(next);
    setInput('');
    const reply = await llm.generate(next); // 自动追加 assistant 消息,流式刷新
    setHistory([...next, reply]);
  };

  return (
    
       String(i)}
        renderItem={({ item }) => (
          {item.content}
        )}
      />
      {llm.isGenerating && }
      
        
        发送
      
    
  );
}

const styles = StyleSheet.create({
  container: { flex: 1, padding: 16, gap: 8 },
  user: { alignSelf: 'flex-end', backgroundColor: '#0a84ff', color: '#fff', padding: 8, borderRadius: 8 },
  bot: { alignSelf: 'flex-start', backgroundColor: '#1c1c1e', color: '#fff', padding: 8, borderRadius: 8 },
  inputBar: { flexDirection: 'row', gap: 8 },
  input: { flex: 1, borderWidth: 1, borderColor: '#333', borderRadius: 8, padding: 8, color: '#fff' },
});

npx expo run:iosrun:android,首次会下载 Qwen 0.6B 模型(几百 MB),装完直接对话,全程不联网、不耗 token。

llm.isGenerating 帮你管住"正在生成时别重复发",llm.configure 里的 generationConfig 控制温度和采样------这些参数和你在云端调 API 时一模一样,迁移成本几乎为零。

如果你的 UI 要打字机效果,流式输出这块和云端没区别:生成期间监听中间状态,把 partial 文本实时写进气泡,配合 llm.isGenerating 的 loading 态,体验上和调用 OpenAI 流式接口一致,差别只是数据根本没出手机。

底层快的关键在 JSI(JavaScript Interface)。老架构每次原生调用都要把数据 JSON 序列化过桥,一帧相机画面要 8-15ms 开销;新架构通过 JSI 直接拿到 C++ 对象引用,单次调用开销降到 1ms 以内。端侧推理能跑流畅,New Architecture 是地基。

07 模型怎么选,以及三个容易翻车的点

模型不是越大越好,手机上三个约束卡着你:RAM、存储空间、推理速度。2026 年中可用的参考:

  • LFM2.5 1.2B:约 900MB,质量/体积比最好,默认推荐
  • Qwen2.5 0.5B:约 400MB,中端机也能跑,首 token 快到 45ms
  • Llama 3.2 3B:约 2GB,质量更高,但首 token 慢一倍

量化选 INT4(GGUF 里常是 Q4_K_M)最划算:质量损失对多数任务只有几个百分点,内存比 FP16 直接降 4 倍。别用 INT3 或 Q2,质量肉眼可见地崩。

第一个翻车点:New Architecture 必须开。RN 0.84(2026 年 3 月)已经把老 bridge 从 iOS 构建里彻底删了,老项目要么迁移,要么换库。

第二个翻车点:首次下载体积。别在发版时让用户现下,最好接入预下载,或在 WiFi 下静默拉取,否则首屏体验会很糟,用户以为 App 坏了。

第三个翻车点:内存峰值。3B 模型推理时峰值 RAM 可能到 3GB,低端机容易后台被杀。用 llm.unload() 在页面卸载时主动释放,别等系统回收。

还有一个容易被忽略的点:端侧模型对 systemPrompt 的指令遵循比云端弱。prompt 要写得短而硬,别堆长指令,否则它容易跑偏。我一般把 systemPrompt 控制在两句话以内,反而更稳。

想更进一步,可以接工具调用做混合架构:简单请求走端侧,复杂推理走云端,UI 一行切换,业务代码不重写。这才是端侧 AI 真正落地的姿势。

08

你手机上现在跑着多大的模型?是已经上了 ExecuTorch,还是在观望?端侧 AI 这波我判断两年内会成 App 标配,尤其隐私敏感的场景。评论区聊聊你踩过的坑,或者你最想先在端侧落地的功能。

相关推荐
Idefav1 小时前
给 OpenClaw 装上真正可控的 Web Search:Camofox Web Search 集成实战
人工智能
海盗12341 小时前
微软技术日报——2026-08-06
人工智能·microsoft·.net
一根数据线1 小时前
从CAD到AI,三维建模的方式越来越多了
人工智能·3d建模·3d模型·倾斜摄影·ai建模·造形家
ChangjunZhao1 小时前
自建 AI 代码沙箱:一台服务器,官方 E2B SDK 零改动接入
人工智能
从零开始学习人工智能1 小时前
PyTorch 踩坑:Input type \(Half\) and bias type \(float\) 类型不匹配终极解决方案
人工智能·pytorch·python
逐米时代2 小时前
工厂数字化规划:BIM与仿真让方案可验证
大数据·网络·人工智能
醉城夜风~2 小时前
querySelector()
人工智能·python·tensorflow
Necis2 小时前
半天,AI 重写了我的五年前的娃娃机
ai编程·three.js
90后小陈老师2 小时前
AI Agent 四文件约束法:从零搭一套能用的 system prompt(附完整提示词)
人工智能·prompt