共计 3364 个字符,预计需要花费 9 分钟才能阅读完成。
关于ChatX的开发总结
今年五一待在宿舍花了三天时间使用Flutter开发了一款基于ChatGPT大语言模型对话的App - ChatX。三天里从项目规划和构建到最终的APK文件打包运行至真机上均由我一人完成。
在这之后又花了两天时间分别完成了AI绘图和角色扮演的扩展功能,并对项目代码进行优化和Bug修复。如今APP也完成得差不多了,在此做个总结。
为什么开发ChatX?
2022年11月OpenAI发布ChatGPT的一个星期内,我就通过一些渠道注册了OpenAI账号并在官网使用了ChatGPT,当时正值疫情且学校提前放我们回家要求在家准备和进行期末考试。在家那段时间首次接触到了ChatGPT,当时我就被深深地震撼到了,它帮助我解决了很多课程上的、代码上的问题,极大的提高了我的复习效率。直到现在,我仍然每天用ChatGPT作为自己的工具解决我学习上的难题。
但当时使用ChatGPT的方式大多数都是网页访问,一些开源项目如:ChatBox、ChatGPT-Next-Web也都是应用在PC端或Web端上的。而我正热衷于玩转ChatGPT,于是我就有了“在移动端上使用ChatGPT”的需求(值得吐槽的一点,老师要求上课不让玩电脑),但是,我在GitHub上没有发现任何适合移动端使用ChatGPT的项目(印象中下载过一个几百个star的安卓项目,但是APP的体验很差,下载没几分钟就卸了)。那时起我就打算在我能力足够的情况下,一定一定要开发一个能使用ChatGPT的移动端APP。而我在没有找到合适的移动端项目后,一直是通过手机访问ChatGPT-Next-Web网页版使用。
时隔一年,在机缘巧合下学了Dart和Flutter后,选择在五一期间一鼓作气完成这个APP。
ChatX的功能有哪些?
- 流式输出响应,体验极佳;
- 支持 Markdown 渲染、代码高亮、Latex 渲染;
- 100+中文提示词,玩转 GPT 角色扮演;
- 支持一键复制代码;
- 支持对话模型微调;
- 国际化,支持中英文;
- 主题切换
ChatX的技术实现
ChatX使用的是由谷歌于2017年推出的Flutter框架开发,Flutter是解决跨平台APP开发的一种方案,一次编写,到处运行。移动端使用当然应该支持Android和IOS两种平台,因此我当时的技术选择就是跨平台开发。
至于核心依赖库如下:
- 状态管理、依赖注入、路由和国际化:get
- 主题管理:adaptive_theme
- 本地持久化:hive
- OpenAI SDK:dart_openai
- markdown渲染组件:markdown_widget
- 数学公式渲染:flutter_math_fork
- 代码高亮:flutter_highlight
- emoji表情渲染:animated_emoji
整个APP只有四个页面,非常简单:
- 对话页面
- 设置页面
- 角色选择页面
- 对话历史页面
开发过程中遇到的问题
问题描述
整个APP的开发过程并不难,回顾我的整个开发过程,只有一个问题给我留下了深刻的印象:
在使用dart_openai
库,调用流式对话接口时,异步回调结果的函数出现了重复调用的情况,因为这个情况,我接收到的回复内容都是重复的,这个问题当时困扰了我一天,我个人认为是该库内部处理返回数据时不合理造成的,并及时提交了issues。
如何解决
说出来可能不信,当天晚上睡觉时,我在梦中通过一个判断回调结果是否为空解决了这个问题。梦醒时脑中有一个非常清晰的解决策略:
- 判断回调结果是否为空:当为空时说明已经拿到了所有的返回结果,后续收到的所有结果都是重复的;
- 拿到所有的返回结果后,停止监听回调函数;
第二天我尝试性地前往OpenAI官网查看流式对话的返回结果格式:
惊讶地发现停止返回的标识之一就是delta
为{}
,而delta
这个数据正好是回调函数返回的对象。当delta
为{}
时,说明delta
为null
,这也就意味着对话结束,之后接收到的内容均可视为重复的内容。
这里的回调函数并不是
dart_openai
中流式输出的回调函数,是我基于dart_openai
进一步实现了一个openai_service内部的一个回调,回调的是delta
数据,因此我需要对delta
进行判空,而dart_openai
的回调数据要更大些,包含了delta
。现在回想过来,其实还可以通过finish_reason
字段来判断结果是否输出完。不过dart_openai
项目里流式对话接口的回调函数会重复调用是真的,虽然可以通过上面的方式来判断是否对话完成,但重复的调用肯定会造成性能上的浪费。
之后我又通过ChatGPT了解到在Dart中如何通过变量控制异步函数的执行,于是非常顺利地解决了这个难题。
关于做梦梦到解决方案这件事,我不觉得很荒唐。OpenAI的API文档在过去很长一段时间,我都经常查阅,因此脑海中可能对一些返回数据的格式有一些印象,只是在当时面对这个问题进行解决时并未想起来罢了。
如何使用ChatX
目前ChatX仅发布了安卓版,因为缺少苹果手机对IOS版进行测试,因此IOS暂时未发布。
ChatX的使用需要对大语言模型有一定的了解,至少知道API和Key。
- API可以理解为AI的对话入口:通过对该入口进行网络请求就能得到AI的回复。
- Key可以理解为你的通行证:并不是所有人都可以通过网络请求与AI进行交互的,只有手上有通行证的人才可以与AI进行交互。
目前,除了通过OpenAI官网直接免费使用ChatGPT外,所有渠道都需要money,包括Key的获取。但是因为GFW的存在,没有特殊手段的话,中国内陆人都是无法访问OpenAI官网的。因此使用ChatGPT的主要渠道有两种:
- 通过特殊手段访问OpenAI官网免费使用,其中特殊手段也是需要money的;
- 使用api和key,其中api和key也都是需要money的;
无论怎么样,使用ChatGPT都是需要花钱,这不只对于ChatGPT而言,包括国内大语言模型文心一言、通义等也都是要花钱的,毕竟AI回复的每一句话都需要大量的GPU算力支持。
我在我的个人博客里每月都会分享一定量的Key供开发者或想使用ChatGPT的人使用。
可通过这篇博客文章获取:为开发者提供的免费ChatGPT中转Key
拿到API和Key在APP的设置页面里填入就行了。
如何下载?
讲完如何使用,再讲如何下载。
- 最新版本及历史版本下载链接:https://github.com/NingNing0111/chat_all/releases
考虑到GitHub被墙,也可通过下面的链接下载(这个链接下载的APP可能不是最新的):
- https://gh.ddlc.top/https://github.com/NingNing0111/chat_all/releases/download/0.7.1/app-release.apk
ChatX的未来
目前ChatX只是一个简单的能够和ChatGPT对话的APP,没有接入任何后端业务。而在我将APP的命名正式取为ChatX
时,我就知道ChatX不应该只局限于OpenAI的ChatGPT这个AI模型,它应该还可以对接Gemini、Claude、文心一言、通义等等各种大语言模型;并且我还在考虑将ChatX接入一个后端业务,该业务统一管理所有的大语言模型的对话接口,ChatX只需对接这个后端接口即可;同时,我应该实现更高级的大语言模型应用,例如文件分析和总结等,想到这些我就有跃跃欲试的冲动。
但现实是,上面的功能可能还需要很久才能完成,毕竟Flutter目前不是我以后吃饭的技术,将自己空闲时间挤出来是十分考验时间管理能力的。
其它
软件在使用过程中,出现问题或需要提供帮助的,可以直接通过评论或我的邮箱进行留言。
- email:zdncode@gmail.com
- QQ: 2043393364