共计 2538 个字符,预计需要花费 7 分钟才能阅读完成。
背景与痛点
在移动端集成 AI 服务时,开发者常面临几个核心挑战。首先是网络延迟问题,由于 AI 模型通常部署在云端,移动设备的不稳定网络连接可能导致响应时间过长。其次是 API 调用限制,OpenAI 对免费 tier 有严格的每分钟请求数限制(3 RPM)。此外,移动端还需要考虑电量消耗、数据隐私和多线程管理等实际问题。

技术选型
开发者通常有两种主要集成方式:
-
直接调用 API:灵活度高,可以自定义所有请求参数和响应处理,适合需要精细控制的项目。但需要手动处理认证、错误重试等基础功能。
-
使用 SDK:OpenAI 官方暂未提供 Android SDK,但社区有第三方封装(如 openai-kotlin)。SDK 简化了基础操作,但可能缺乏某些高级功能,且依赖第三方维护。
对于大多数应用场景,我们推荐直接使用 API,因为目前 ChatGPT 的 API 设计已经足够简洁。
实现步骤
1. 获取和管理 API 密钥
- 登录 OpenAI 平台创建 API key
- 建议将密钥存储在 Android Keystore 中
- 通过 BuildConfig 注入到正式环境
// 安全存储示例
val securityPrefs = EncryptedSharedPreferences.create(
"api_keys",
MasterKey.Builder(applicationContext).build().keyAlias,
applicationContext,
EncryptedSharedPreferences.PrefKeyEncryptionScheme.AES256_SIV,
EncryptedSharedPreferences.PrefValueEncryptionScheme.AES256_GCM
)
2. 使用 Retrofit 构建网络层
创建标准的 Retrofit 实例,注意设置合理的超时时间(建议 30s):
private fun createRetrofit(): Retrofit {return Retrofit.Builder()
.baseUrl("https://api.openai.com/v1/")
.client(OkHttpClient.Builder()
.addInterceptor(HttpLoggingInterceptor().apply {level = if (BuildConfig.DEBUG) BODY else NONE
})
.addInterceptor { chain ->
val request = chain.request().newBuilder()
.addHeader("Authorization", "Bearer ${getApiKey()}")
.build()
chain.proceed(request)
}
.readTimeout(30, TimeUnit.SECONDS)
.build())
.addConverterFactory(GsonConverterFactory.create())
.build()}
3. 定义 API Service 接口
精确建模请求 / 响应体很重要,以下是带完整注释的示例:
interface ChatGptService {@POST("chat/completions")
suspend fun createCompletion(@Body request: ChatRequest): Response<ChatResponse>
}
data class ChatRequest(
val model: String = "gpt-3.5-turbo",
val messages: List<Message>,
val temperature: Float = 0.7f
)
data class Message(
val role: String, // "system", "user" or "assistant"
val content: String
)
4. 实现 ViewModel 逻辑
ViewModel 应该管理对话状态和处理错误:
class ChatViewModel : ViewModel() {private val _messages = mutableStateListOf<Message>()
val messages: List<Message> get() = _messages
suspend fun sendMessage(text: String) {_messages.add(Message(role = "user", content = text))
try {val response = withContext(Dispatchers.IO) {
chatService.createCompletion(ChatRequest(messages = _messages.toList())
)
}
if (response.isSuccessful) {response.body()?.choices?.firstOrNull()?.message?.let {_messages.add(it)
}
} else {// 处理错误}
} catch (e: Exception) {// 网络错误处理}
}
}
性能优化建议
- 请求节流 :使用
debounce操作符避免快速连续发送请求 - 本地缓存 :使用 Room 存储最近的对话记录
- 离线模式 :当检测到网络不可用时显示缓存内容
- 图片压缩 :如果涉及多模态,使用 Glide 的图片压缩
// 节流示例
searchEditText.textChanges()
.debounce(300)
.onEach { query ->
viewModel.search(query)
}
.launchIn(viewModelScope)
常见问题解决方案
- 429 Too Many Requests:实现指数退避重试机制
- 内容过滤 :前端和后端都需检查敏感词
- 隐私保护 :确保不存储原始 API 响应到本地数据库
高级功能探索
当基础功能实现后,可以考虑:
- 使用
message中的role字段实现多轮对话记忆 - 集成 TTS 实现语音交互
- 使用 TensorFlow Lite 在本地运行轻量化模型
完整的示例项目可以在 GitHub 找到。集成 AI 功能能为应用带来质的飞跃,但也要注意平衡用户体验和技术成本。通过合理的架构设计,完全可以在 Android 设备上打造流畅的智能对话体验。
正文完
发表至: 未分类
近两天内
