1. 为什么建议从Android入手学大模型,先想清楚这件事
很多想学大模型的朋友,第一步就栽在了心理门槛上:觉得要懂Transformer、要会炼丹、要有一张看得过去的GPU,否则碰都不配碰。这个想法把一大部分人拦在了门外。实际情况是,大模型并不是只能在大厂服务器上跑,现代移动端设备,尤其是Android手机,已经完全具备承载小规模语言模型推理的能力。把一个几GB的量化模型丢进手机,跟它聊几句,这件事现在真不难。
我自己在带新人时经常发现一个规律:凡是先通过手机App把大模型"跑通、聊上"的人,后面再回头学模型原理、学部署,吸收速度明显快很多。原因是,你脑子里先有了一条完整的链路——输入怎么进去、模型怎么处理、结果怎么返回,之后学任何环节都有地方安放。反过来,一上来就对着"注意力机制"硬啃,往往一个星期就放弃了。
这篇指南面向的是零基础小白,目标是让你在一周内完成三件事:
第一,搭好Android开发环境,能创建和运行一个安卓工程;第二,理解大模型部署的基本概念,学会用Ollama这类工具在本地拉起一个可对话的模型服务;第三,在Android App里访问这个服务,做一个最简单但能用的AI对话界面。走完这三步,你就已经站在"Android + AI应用开发"的起跑线上了,后续无论是深入模型微调,还是转向多模态应用,都只是在此基础上做加法。
这套学习路径我不止用过一次,可以负责任地说,是符合大多数人的认知习惯的:先看到东西在跑,再理解为什么能跑,最后才有动力去研究还能怎么改。
2. Android开发环境的搭建细节,别在第一步就卡死
2.1 Android Studio到底装哪个版本
Android开发绕不开Android Studio,很多人第一步就卡在下载和安装上。我的建议是直接到官方开发者网站下载当前正式版,注意不是预览版。新手没必要追新,稳定版就够了。如果你用的是Windows电脑,安装时直接选择默认路径,遇到提示下载SDK组件时也全部同意,不要手动选这个选那个。
下载完成后,第一次启动会有几分钟的初始化时间,它会自动拉取Gradle和部分构建工具。这里有个非常常见的问题:国内网络环境下,初始化可能特别慢,甚至卡在某个百分比半天不动。这不是电脑坏了,是网络波动导致的。处理办法很简单——保持耐心,或者换一个网络环境再试。千万不要在初始化过程中反复杀进程重启,那样容易把未完成的缓存文件搞坏。
2.2 创建自己的第一个Android工程
初始化完成后,新建项目的界面会让你选择模板,新手一律选"Empty Views Activity",不要选那些带Compose的模板。不是说Compose不好,而是刚开始学,需要先明白Activity和XML布局这两个最基础的概念。后面熟悉了再迁到Compose,成本很低,但一上来就用Compose,很多东西会被封装掉,不利于理解。
项目创建后你会看到一堆文件和目录,不用怕,大多数文件你现在不需要动。只需要知道三个地方:MainActivity.kt是代码入口,activity_main.xml是界面布局,AndroidManifest.xml是App的配置文件。这就像你刚搬进一间新房子,只需要认识门、窗户和电闸的位置就够了。
创建完工程后,用USB连上手机,开启开发者选项里的USB调试,点击运行就能把App装到手机上。第一次跑通一个"Hello World",这个基础能力直接决定你后面能不能顺畅调试。
2.3 SDK和模拟器,到底哪个更省心
不少教程会让你用模拟器调试,但我个人建议,只要手头有真机,就优先用真机。模拟器虽然方便,但会额外占用大量内存,而且它本身无法完全模拟真实手机的网络和性能状况。
如果你的手机是华为、小米、OPPO这类品牌,首先要确认已经解锁了开发者选项,不同品牌的开启方式略有差异,但套路一致:在"关于手机"里连续点版本号七次,就能激活开发者选项。激活后USB调试开关打开,插上数据线,Android Studio一般会自动识别设备。
调试时有两个小细节容易被忽略:
- 手机连接电脑后,手机上会弹出"是否允许USB调试"的对话框,一定要点允许。
- 每次修改代码后点击运行,App会在手机上重新安装,这个过程要几秒到十几秒,别以为卡住了。
3. 模型到底怎么选,别一上来就啃Llama 3
3.1 手机能跑的模型不是看名气,是看体积
很多新手第一次接触大模型,开口就是ChatGPT、Llama 3这种级别的名字。但它们要么不开放,要么对硬件要求极高。真正适合Android端学习的,是那些经过量化和剪枝的小参数模型。
这里先说一个关键概念:模型体积、参数量和精度之间的关系。一个70亿参数(7B)的模型,如果按照FP32精度完整存储,大约需要28GB空间;如果降到8位整数存储,大约8GB;再降到4位,大概4GB左右。手机内存动不动12GB、16GB,但那是整机内存,App能申请到的部分有限,所以挂着4GB的模型在内存里跑,还是会有压力。适合入门练习的,一般推荐1.5B到3B的量化模型,也就是体积在1GB到2GB之间的那种。
不要觉得模型小就"低级",处理对话、问答、基础文本生成,小模型够用。等你把链路跑通了,再去试更大的模型,那时候你已经知道怎么排查问题了。
3.2 量化是什么,用生活类比讲清楚
量化这个词听着吓人,其实类比一下就懂了。想象你拍了一张4K超清照片,占内存很大,打开也慢;现在你把它压缩成720P的照片,看起来还是一样的场景,细节稍微少一点,但体积小了很多。量化干的就是这件事——把模型的浮点数参数,比如3.14159265,压缩成近似整数3或者31415,换来体积和速度的大幅优化,代价是精度略微降低。
在实际操作中,常见的有q2_k、q3_k、q4_k、q5_k、q8_0这些量化格式。q4_k是最多人推荐的,体积和效果均衡,在手机上跑流畅度也够。新手选模型时看到带"Q4"字样的文件,优先选它就对了。
3.3 适合新手试水的三个模型
目前生态里面对新手比较友好的模型主要有这几类:
- Qwen2.5系列(通义千问):中文能力强,文档友好,阿里开源,社区活跃。特别推荐Qwen2.5-1.5B和Qwen2.5-3B,量化后体积很小,手机上跑没压力。
- Phi系列(微软):参数少但逻辑能力意外地强,适合英文场景,中文稍弱。
- TinyLlama:体积小,适合做实验,但对话质量一般,更偏向学习用途。
我在带新人时首选Qwen2.5-1.5B。原因是中文回答自然,遇到问题时容易判断是模型能力问题还是你代码问题,排错体验好很多。
4. 用Ollama把"部署"这个概念彻底搞明白
4.1 Ollama到底解决什么问题
很多教程直接讲"大模型部署",但没说清楚部署是什么意思。部署,说白了就是把一个训练好的模型文件,放到一个能提供服务的运行环境里,让别人通过网络接口来调用它。你可以把Ollama理解成一个"装模型的服务员"——你告诉它我要跑哪个模型,它负责把模型文件拉下来、起一个服务、监听端口,然后你就通过HTTP接口跟这个模型对话。
为什么推荐用Ollama入门?因为它把很多技术细节都封装好了,不需要你手动处理CUDA、内存分配、模型加载等等。你先用Ollama跑通一次"部署-调用"的完整流程,心里有了一张全景图,之后不管是切到vLLM、TensorRT-LLM还是其他部署框架,都能迅速适应。
4.2 在电脑上从零拉起一个模型
Ollama支持Windows、macOS和Linux。以Windows为例,去官网下载安装包,装完后打开终端(CMD或PowerShell),执行一行命令:
ollama run qwen2.5:1.5b第一次执行会自动下载模型,这个过程取决于你的网络,通常要几分钟到十几分钟。下载完成后会自动进入对话界面,你直接输入文字就能跟模型聊天。退出对话用/bye。
看到模型在终端里正常回复,恭喜,你就完成了一次真正的大模型本地部署。虽然界面简陋,但背后涉及的模型加载、推理、会话管理,全都真实地跑了一遍。
4.3 搞清楚模型服务的接口地址
Ollama启动后会监听本机的11434端口。你在终端跟模型聊天的时候,其实背后的每一次问答都在走HTTP接口。在终端里再开一个窗口,执行:
curl http://localhost:11434/api/generate -d "{\"model\":\"qwen2.5:1.5b\",\"prompt\":\"你好\"}"你会看到一个JSON格式的返回,里面包含了模型生成的回答。这个接口就是后面Android端要对接的东西。一个部署好的模型服务,本质上就是一个HTTP接口,这个认知非常重要——它让"部署"从抽象概念变成了你能摸到的东西。
4.4 端侧部署 vs 服务端部署,两种形态都要了解
把模型跑在电脑上。然后手机通过局域网访问电脑的服务,这叫服务端部署。还有个思路是把模型文件直接放到手机上,在App内完成推理,这叫端侧部署。两者的区别用一句话概括:服务端部署吃的“力气”是电脑的,手机只是个遥控器;端侧部署是手机自己搬砖,好处是没网也能用,坏处是手机性能和内存有限。
对初学者来说,我强烈建议先从服务端部署入手,也就是让电脑当模型服务器,手机App当客户端。因为这种模式下,代码逻辑更简单,排查问题也容易。
5. Android端调用大模型的三种主流方式
5.1 直接调云端API,最快但要注意成本
这是最简单的方式:注册一个提供大模型API的平台,拿到一个API Key,然后在App的代码里通过HTTP请求调用。市面上主流的云厂商几乎都有大模型API服务,有的还提供免费额度。优点是简单、无需部署、模型能力强;缺点是要联网,而且免费额度用完后要付费。
对于新手验证代码逻辑,这种方式可以,但我个人不推荐把它作为第一条学习路径。因为你一旦习惯了调API,就永远搞不清楚底层发生了什么,出了问题也不知道该从哪里查。
5.2 局域网内调自己的Ollama服务,强烈推荐入门
这是我认为最适合入门的方式。电脑装好Ollama并把模型跑起来,手机和电脑连着同一个Wi-Fi,然后手机App通过http://电脑的局域网IP:11434访问模型接口。整个过程不花钱,代码逻辑跟调云端API一样简单。
这里有一个关键细节:Ollama默认只监听127.0.0.1,意思是它只接受本机访问。要让局域网内其他设备访问,需要配置环境变量让Ollama监听0.0.0.0。具体改法在Windows上是设置系统环境变量OLLAMA_HOST=0.0.0.0,然后重启Ollama服务。很多人卡在这一步,明明App代码没问题,就是连不上,其实就是Ollama没开局域网监听。
还要注意,手机通过局域网访问电脑时,防火墙可能会拦截11434端口。Windows第一次运行Ollama时通常会弹防火墙提示,一定要勾选"专用网络"并允许访问,不然手机照样连不上。
5.3 端侧推理,进阶的玩法可以先了解一下
如果你的手机配置够高,比如运行内存12GB以上,芯片是骁龙8系或者天玑9000系,可以尝试在手机本地做推理。Android生态里目前比较常见的是通过MNN、ncnn这类推理框架来加载量化后的模型文件,比如Qwen2.5-1.5B的GGUF量化版。好处是不依赖网络,数据完全本地处理,响应速度也快;代价是要引入原生层代码,对JNI和C++有一定要求,不适合零基础起步。
建议把端侧推理放在第二个月再学。先把服务端部署的链路吃透,再来看端侧推理,你会觉得很多概念似曾相识。
6. 手写一个最简AI对话App,走完整链路
6.1 新建项目和依赖配置
打开Android Studio,新建一个Empty Views Activity工程。在build.gradle.kts(Module级别)里添加网络请求库的依赖:
dependencies { implementation("com.squareup.okhttp3:okhttp:4.12.0") implementation("org.jetbrains.kotlinx:kotlinx-coroutines-android:1.7.3") }同步一下Gradle,等依赖下载完成。这里注意,Android Studio会提示你Gradle同步失败的话,多半是网络原因,多试几次,或者检查一下代理配置是否正常。
6.2 在AndroidManifest里开权限和明文流量
打开AndroidManifest.xml,在<manifest>标签下加上网络权限:
<uses-permission android:name="android.permission.INTERNET" />然后在<application>标签里加上允许明文流量的属性,因为http://192.168.x.x:11434是明文HTTP协议,Android默认禁止App访问:
<application android:usesCleartextTraffic="true" ... >很多新手App一跑就报错,显示"Cleartext HTTP traffic to 192.168.x.x not permitted",就是因为漏了这一步。
6.3 写一个简单的对话界面
修改activity_main.xml,简单放一个输入框、一个发送按钮、一个文本框用来显示对话内容:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" android:padding="16dp"> <TextView android:id="@+id/tvContent" android:layout_width="match_parent" android:layout_height="0dp" android:layout_weight="1" android:text="对话内容显示区" /> <EditText android:id="@+id/etInput" android:layout_width="match_parent" android:layout_height="wrap_content" android:hint="请输入内容" /> <Button android:id="@+id/btnSend" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="发送" /> </LinearLayout>6.4 在MainActivity里写调用逻辑
在MainActivity.kt里,核心逻辑是点击按钮后,把输入框的内容通过OkHttp POST到Ollama的生成接口,然后解析返回的JSON:
class MainActivity : AppCompatActivity() { private lateinit var tvContent: TextView private lateinit var etInput: EditText // 改成你电脑在局域网中的实际IP private val baseUrl = "http://192.168.1.100:11434" override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) tvContent = findViewById(R.id.tvContent) etInput = findViewById(R.id.etInput) val btnSend = findViewById<Button>(R.id.btnSend) btnSend.setOnClickListener { val input = etInput.text.toString() if (input.isNotEmpty()) { requestModel(input) } } } private fun requestModel(prompt: String) { Thread { try { val client = OkHttpClient.Builder() .connectTimeout(10, TimeUnit.SECONDS) .readTimeout(60, TimeUnit.SECONDS) .build() val json = """ { "model": "qwen2.5:1.5b", "prompt": "$prompt", "stream": false } """.trimIndent() val body = json.toRequestBody("application/json".toMediaType()) val request = Request.Builder() .url("$baseUrl/api/generate") .post(body) .build() client.newCall(request).execute().use { response -> val result = response.body?.string() ?: return@use val jsonObject = JSONObject(result) val answer = jsonObject.getString("response") runOnUiThread { tvContent.text = "你:$prompt\n\nAI:$answer" } } } catch (e: Exception) { runOnUiThread { tvContent.text = "请求失败:${e.message}" } } }.start() } }这段代码为了保持简洁,直接用了一个子线程做网络请求,没有引入太复杂的架构。这个App虽然简陋,但它确确实实跑通了一个完整的AI对话链路:用户在手机上输入文字,文字通过HTTP发送到电脑上的本地模型服务,模型推理完把结果返回,手机上显示出来。
这里有几个点值得展开说一下:
- 超时时间为什么要设到60秒:大模型推理不是瞬间完成的,1.5B的模型在CPU上跑,一句话可能要几秒到十几秒。如果你把超时设成10秒,大概率会经常超时报错。
stream: false是关闭流式输出:接口会等模型全部生成完一次性返回结果。对新手来说,这样解析起来简单。等你熟练了,可以改成"stream": true做流式输出,让文字一个一个蹦出来,体验会好很多。- 为什么用Thread而不是协程:这段代码为了减少概念负担,直接用Java的Thread。实际上工业生产会用协程加ViewModel,但新手先把链路跑通最重要。
6.5 在真机上调试的两个常见问题
第一个问题:App装到手机上打不开,或者打开就闪退。先看Logcat里有没有报错,一般会是权限问题或者布局问题。权限问题检查Manifest,布局问题检查id引用是否正确。
第二个问题:代码没问题,但请求一直失败。这时候要分三步走:
在电脑上确认curl http://localhost:11434/api/generate能正常返回;确认Ollama监听了0.0.0.0;在手机上用浏览器直接访问http://电脑IP:11434试试,如果能打开说明网络通了,打不开就说明IP或防火墙有问题。
7. 小白最容易被卡住的几个坑和排查思路
7.1 Gradle下载慢导致项目一直构建失败
这是所有Android新手遇到的第一个坎。Android Studio创建项目后会去拉Gradle发行版,文件几百MB,网络不好时能卡一整天。我的经验是不要盲目相信"改镜像源"这类操作,先检查你自己网络环境是否稳定。
如果你确实想改,可以去gradle-wrapper.properties里把distributionUrl替换成国内可访问的镜像地址。这是个通用做法,网上有很多现成镜像,自己按需取用即可。但需要注意,不同镜像的更新速度不一致,有时候用公共镜像反而会带来版本不匹配的新问题。
7.2 Ollama模型下载到一半失败
ollama run的时候模型下载中断,重新执行命令通常会断点续传,不用担心。但如果反复失败,建议看看是不是磁盘空间不足——模型文件本身就几个GB,加上临时文件可能更多。下载过程中不要频繁Ctrl+C,给它一点耐心。
7.3 手机访问电脑IP超时
首先要确保手机和电脑在同一个局域网下,手机连的Wi-Fi和电脑插的网线是同一条路由器的,而不是手机走流量。然后在电脑上执行ipconfig查看本机IP,以192.168.x.x开头的那串一般就是局域网IP。
其次检查防火墙。Windows防火墙默认对新进程弹窗,如果你当时手快点了"取消",端口就被拦住了。可以在防火墙的高级设置里手动添加入站规则,放行TCP 11434端口。
最后,有些路由器开启了AP隔离功能,导致同一Wi-Fi下的设备之间无法互访。如果真的遇到这个问题,登录路由器后台关掉AP隔离就好。
7.4 模型回复乱码或者答非所问
中文场景下选了英文为主的模型,或者模型量化程度太高导致效果崩坏。1.5B的模型本来能力就有限,千万别拿它跟GPT-4比。问它"1+1等于几"这种问题大概率能答对,但让它写一篇完整的文章,效果就一言难尽了。这是模型能力边界问题,不是代码问题。
7.5 想学得更深,该按什么顺序走
走完上面这些步骤,你已经有了一条完整的"端到端"链路。接下来要往深走,我建议按这个顺序:
先学Python基础,因为大模型生态里的工具和框架大多是Python写的;再学大模型基础理论,比如Token、上下文窗口、微调这些概念;然后学LangChain这类编排框架,学会把多个模型能力组合起来;最后再研究模型微调和部署优化,这时候你已经有足够多的经验来支撑你理解那些抽象的概念了。
很多人在第一步就放弃了,不是因为他们笨,而是因为他们跳过了"先跑通再理解"的过程。直接啃理论书,就像没摸过方向盘的人先学发动机原理,学得再多也开不了车。反过来,先开起来,再回去学原理,每个知识点都有了鲜活的画面感。
我现在带人的时候,都是让他先做今天这篇指南里的内容,做完再去看理论,效果立竿见影。一个人如果连一次完整的模型调用都没做过,跟他讲"上下文窗口"、"推理优化"都是空对空。而一旦你亲手调通过一次AI对话App,后面所有这些概念,都是顺水推舟的事。
说到底,Android和AI大模型的组合,是一个极佳的学习入口。它逼着你同时掌握客户端开发、网络通信、模型部署这三块能力,但又不像纯后端开发那样要求你一开始就精通Linux和容器。把这条链路玩熟了,你在整个AI应用开发领域,就已经有了非常扎实的立足点。