在AI刷题过程中,我逐渐体会到Marscode是一个很系统的工程,它是由前端搭建好的多个大区域、后端的代码数据、刷题数据、对话数据等处理以及AI交互逻辑与Agent框架构成的。接下来我将稍微说明一下我对这三个部分的理解,顺便也复习一下相关的知识,不从特别技术的角度开展(。
前端设计
前端设计上,其实主要就是几个布局的合理设计,一眼看去,Marscode AI刷题界面分成了几个纵向栏目并列,分别是题目列表、题目栏,代码编辑栏和AI问答烂,这种设计和VSCODE等成熟编辑器是一脉相承的,能够在尽可能地展示各个界面的同时主要将代码输入空间显示出来,以让使用者很好地阅读代码上下文而不需要反复滚动。一些基础的功能如重置代码、格式化代码、语言切换等基本都实装了,解决用户在线编辑代码时的痛点。
而在一些细节上的设计,则比较好地帮助使用者进一步优化使用体验。例如当题目列表和AI问答栏缩窄到一定程度时,就会自动合拢,当然同时也有按钮辅助,这能够最大程度地展开题目编写空间,体验就像leetcode等知名在线代码平台一样,还能够免费调试;而题目编写的不同状态也装配上了,没写过的题目、尝试过但还没提交通过的题目以及通过的题目都用不同的图标显示在侧边栏上,再加上筛选按钮,这也方便了在数百个题目中遴选目标。基本上这一个月以来这些功能都陆续加上了,确实是给人的体验带来飞升。
后端逻辑
如果说前端的体验一个月以来完善了很多,那么后端其实就是稳定的砥柱了。后端根据我的使用应该具有以下功能:
- 最基础的登录鉴权处理
- 代码、对话、题目完成记录存储
- OJ功能如基础编译工具链的调用、报错异常处理的返回、调试过程的插入与返回
- AI练中学的远程Web Shell的连接调用等
根据我浅薄的认识,这些功能其实就涉及到很多方面了,例如第一点就是最经典的后端查表插表、网络安全协议、认证与鉴权等;第二点需要选择合适的数据库并决定缓存策略,建立浏览器本地暂存-服务器内存-服务器持久化存储层级,特别是注意及时的代码存储,保证代码文本的可用性;后续两点则主要借助工具链的调用脚本、远程连接协议以及和前端的合作渲染。
再来对比一些功能区别,如对比AI练中学的Marscode功能,其实二者的一些功能就有区分,例如AI练中学的对话记录就是该代码空间完全共享的,而Marscode AI刷题则是每个问题都不一样,这也说明了刷题时的代码其实就是严格隔离开的,避免互相之间的文件、权限与对话等混杂在一起,影响整体的AI运转。
AI交互
AI交互其实就是结合Langchain学习的内容了。根据我的理解,AI交互功能应该实现了以下几点
- 基础提示模板:需要能够将题面和代码自动插入提示当中,同时还需要一定的提示词进行区分引导;此外,为了实现Agent功能,不能任意时刻都让题面和代码插入进来,而是要让LLM根据设计好的提示词思考并生成是否要插入的标准选择。
- 搜索API、外部数据库的调用:也是类似的方法,设计好提示词引导LLM得出是否需要调用工具,根据工具描述确定需要调用哪种工具,以及如何格式化输入等,这些基本都可以由包装好的复用API完成,并规范LLM输出以确保自动化系统能够从中提取出确切的选择。
- 记录的总结调用:作为一个对话bot,Marscode需要能够调用对应的对话记录,并适当总结提炼以及窗口保留部分原文,以保证既有上下文关联的同时又不至于耗费过多token。
实现了这些功能,一个基础版本的Marscode也才能实现个大概,而它也还需要配合完整的前后端才能正常工作,所以才说这是一个系统工程,也为我们提供了一个生动的AI综合应用案例。