关于ChatX的开发总结

508次阅读
没有评论

共计 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的技术实现

 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{}时,说明deltanull,这也就意味着对话结束,之后接收到的内容均可视为重复的内容。

关于ChatX的开发总结

这里的回调函数并不是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的设置页面里填入就行了。

如何下载?

 讲完如何使用,再讲如何下载。

 考虑到GitHub被墙,也可通过下面的链接下载(这个链接下载的APP可能不是最新的):

ChatX的未来

 目前ChatX只是一个简单的能够和ChatGPT对话的APP,没有接入任何后端业务。而在我将APP的命名正式取为ChatX时,我就知道ChatX不应该只局限于OpenAI的ChatGPT这个AI模型,它应该还可以对接Gemini、Claude、文心一言、通义等等各种大语言模型;并且我还在考虑将ChatX接入一个后端业务,该业务统一管理所有的大语言模型的对话接口,ChatX只需对接这个后端接口即可;同时,我应该实现更高级的大语言模型应用,例如文件分析和总结等,想到这些我就有跃跃欲试的冲动。

 但现实是,上面的功能可能还需要很久才能完成,毕竟Flutter目前不是我以后吃饭的技术,将自己空闲时间挤出来是十分考验时间管理能力的。

其它

 软件在使用过程中,出现问题或需要提供帮助的,可以直接通过评论或我的邮箱进行留言。

  • email:zdncode@gmail.com
  • QQ: 2043393364
正文完
 
PG Thinker
版权声明:本站原创文章,由 PG Thinker 2024-05-07发表,共计3364字。
转载说明:除特殊说明外本站文章皆由CC-4.0协议发布,转载请注明出处。
评论(没有评论)
热评文章
Rust中所有权与借用规则概述

Rust中所有权与借用规则概述

在GC与手动管理内存之间,Rust选择了第三种:所有权机制...