SmolChat 是一个专为安卓手机设计的应用程序,允许用户在本地设备上与小型语言模型(SLM)进行交互。该应用程序旨在提供一个简单、易用且功能丰富的界面,支持用户加载、管理和使用各种GGUF格式的语言模型,如Llama等。通过SmolChat,用户可以在没有互联网连接的情况下,利用设备的计算能力生成高质量的文本响应。
项目目标
- 提供可用的用户界面:用户可以通过直观的界面与本地SLM进行交互,发送消息并接收模型生成的响应。界面设计简洁,易于操作,适合各种技术水平的用户。
- 管理SLM模型:用户可以轻松添加、删除或更新GGUF格式的小型语言模型,并根据需要调整模型的系统提示和推理参数(如温度、最小p值)。这使得用户可以根据不同的应用场景灵活配置模型。
- 快速创建下游任务:SmolChat 支持用户快速创建特定的下游任务(如问答、翻译、代码生成等),并使用SLM生成相应的响应。这些任务可以根据用户的需要进行定制,而无需将数据上传到云端。
- 简单、可扩展的代码库:项目的代码结构清晰,遵循模块化设计原则,便于维护和扩展。开发者可以轻松地添加新功能或优化现有功能,确保应用程序能够持续改进。
工作原理
技术栈
- C/C++ (llama.cpp):用于加载和执行GGUF模型的核心推理引擎。由于
llama.cpp
是用纯C/C++编写的,因此可以通过Android NDK编译并在安卓设备上高效运行。 - JNI (Java Native Interface):用于在Kotlin和C++之间建立通信桥梁。
smollm.cpp
文件中实现了JNI绑定,允许Kotlin代码调用C++中的推理函数。 - Kotlin:用于构建应用程序的UI和业务逻辑。
SmolLM
类封装了与C++端的交互逻辑,提供了简单的API供UI层调用。 - ObjectBox:轻量级的NoSQL数据库,用于存储聊天记录、模型信息和其他应用数据。它提供了高效的查询和持久化功能,确保数据的安全性和性能。
模块划分
1、smollm模块
- llm_inference.cpp:核心推理类,负责加载和执行GGUF模型。它通过
llama.cpp
的C风格API与模型进行交互,处理文本输入并生成响应。 - smollm.cpp:JNI绑定文件,定义了Kotlin与C++之间的接口,允许Kotlin代码调用C++中的推理函数。
- SmolLM.kt:Kotlin端的封装类,提供了与JNI绑定交互的方法,简化了模型加载和推理的过程。
2、app模块
- ChatActivity:主聊天界面,用户可以在这里与SLM进行交互。每当打开新聊天时,应用程序会实例化
SmolLM
类,并为其提供模型文件路径。聊天记录从ObjectBox
数据库中检索,并通过LLMInference::add_chat_message
方法添加到聊天中。 - Task模式:对于一次性任务(如问答、翻译等),消息不会持久化。通过将
store_chats=false
传递给LLMInference::load_model
,应用程序可以在任务完成后自动清理聊天记录。
未来计划
为了进一步提升用户体验和功能,SmolChat 计划在未来版本中实现以下功能:
- 支持非ASCII字符:当前版本仅支持ASCII字符的生成。未来将改进C++端的缓冲区处理逻辑,允许SLM生成包含非ASCII字符的响应,并通过JNI正确传递给Kotlin端。
- 自动为聊天分配名称:类似于ChatGPT和Claude,SmolChat 将自动为每个聊天会话生成一个有意义的名称,方便用户管理和查找历史记录。
- 添加搜索功能:在导航抽屉中添加搜索栏,用户可以通过关键词快速查找历史聊天记录。利用
ObjectBox
的查询功能,搜索操作将高效且响应迅速。 - 跨设备通信:添加后台服务,支持通过蓝牙、HTTP 或 WiFi 与桌面应用程序通信。用户可以从桌面发送查询请求,SmolChat 将在移动设备上进行推理并返回结果。这将极大地扩展应用程序的使用场景。
- 部分响应时自动滚动:在
ChatActivity
中生成部分响应时,自动滚动到底部,确保用户始终能看到最新的消息。 - 性能监控:实现令牌生成速度(令牌/秒)和RAM消耗的实时测量,帮助用户了解模型的性能表现,并根据需要调整推理参数。
- 应用程序快捷方式:为常用任务(如问答、翻译等)添加应用程序快捷方式,用户可以直接从主屏幕启动特定任务,提高操作效率。
- 集成Android-Doc-QA:集成基于RAG(Retrieval-Augmented Generation)的设备内问答系统,允许用户从本地文档中提取信息并生成答案。这将使SmolChat 成为一个强大的工具,适用于需要从文档中获取信息的场景。
- Vulkan加速推理:探索是否可以将
llama.cpp
编译为使用Vulkan API在Android设备上进行推理,从而利用移动GPU的强大计算能力,进一步提升模型的推理速度和能效。
评论