插件介绍
SQLite作为轻量级数据库,被用在很多小型APP中。之前在开发electron应用时,还到处找SQLite软件,但是没一个满意的,现在AI编程最大的便利,便是让很多人以最小代价去实现软件应用。
顺便用国产模型第一梯队的GLM,对比下经常用的Claude,看看能否平替。
utools 应该很多人都用过,有很多提升开发效率的小工具。这个插件就是在utools上架的,大家可以搜索体验一下,顺便附上插件链接:www.u-tools.cn/plugins/det…
1.表数据预览
2.表结构编辑
3.新建表,支持表单模型/sql模式
4.全局搜索
5.AI辅助功能当然要有
开发工具
个人觉得最适合前端的就是安装vscode插件:Claude Code for VS Code,然后用国内的一些中转厂商。还有很多国内的大模型也支持接入Claude Code插件,开了智谱的GLM套餐,搭配起来使用的话,基本能满足大部分编程需求。这个插件大部分也是用GLM开发的,少量复杂功能用的Claude,接下来会详情说下。
开发过程
技术栈vite+React,然后可以调用一些nodejs能力+utools的api。后面增加的ai对话,使用了langchain。
本来是决定一行代码不写,包括提交记录都是AI完成的,但是中间遇到比较复杂的地方,功能是能实现,但是整体架构就是不能按我的思路来,GLM和Claude换着来都不行,最后这块古法编程实现的。
资料检索
AI编程遇到的第一个问题就是,utools的api它不知道,然后就开始自作主张的使用electron的api,或者编一些不存在的,这是我用glm-4.6时的问题,给它贴了URL也没用,然后直接给它贴的文档。后来glm-4.7增加了网络搜索等mcp功能,对URL内容的读取就好很多了,但是每月100次额度有点少,主要是我使用的Claude Code它会在一轮会话中,多次频繁读取仓库或文章。最后我自己写了个skill还方便点。
代码审核
AI写的代码一定要审核+及时调整!!!因为某次对话,让AI美化组件样式(增加class重写antd样式),后面每次迭代,AI就自作主张的参考之前写法,每个组件都要格外写一些样式。后来人工剔除后,又在CLAUDE.md中强调了这点才没再发生。
技术框架规划
这个真的很重要,早点规划好你的技术框架,而不是让模型去猜。AI很容易写出那种“居然可以实现功能,但是代码一层叠一层,最终人类无法插手”。
我在一开始就规定了各种技术栈,底层调用方式、封装方式。开发到一定阶段后,因为uTools的调试并不好用,我想让让AI去mock底层的一些nodejs及uTools方法,然后居然一次性通过,浏览器顺利打开,并完整模拟了包括表结构、表数据等操作,它们是完全基于localStorage的。
那么也就是说,我后面如果把这个程序移植到浏览器、或者vscode插件等,也是很容易的。
让AI做不擅长的事情
如果用nextjs+React+tailwind+zustand,是ai最擅长的技术栈了。但是我项目的状态使用了valtio,而且使用了面相对象的写法,明明告知了AI尽量不使用React hooks,以及valtio的示例写法,但还是会写偏,表现在:
useSnapshot后的对象React才能感知到变化,经常忘记使用。- 状态混用React hooks,属于屡教不改了
- antd的表单应该有form实例去管理内部值,ai习惯直接将valtio的响应式数据,放到表单Value上
不过随着代码量增多,也可能和CLAUDE.md的约束越来越完善,上面这些情况就比较少了
另外说一下为什么要使用valtio这种proxy机制的状态管理工具
- React的useEffect经常造成逻辑混乱,依赖越加越多,心智负担重
- 很多时候为了拿到最新的值,不得不定义额外的ref来存储临时值
- 性能考虑会又会大量使用memo、useCallback等优化
valtio优点:
- 使用很简单,就一个proxy和一个useSnapshot
- 只有你用到的值变化才会触发组件更新
- 脱离React组件更新值,也不用考虑闭包问题,永远都是最新的值
只是proxy机制可能很多人就会觉得一股vue味,比较排斥,但是如果你真的使用,尤其是复杂UI交互下,完全没有那么多心智负担。而且它的作者,也是写出zustand的大佬。
模型差异
Claude绝对是最强编程模型了,如果有缺点只有一个,就是贵。国产的glm、kimi、minmax能力都还不错,我只深度体验了glm。总体来说,你需要更详细的描述你的方案,减少AI自由发挥的机会,复杂点的功能直接用plan模式。一样可以有比较好的效果。 另外一方面就是多使用Claude的配置文件,如CLAUDE.md、skills、tools去指导AI写出更好的代码。
AI功能
大模型如此强大的今天,当然可以用来辅助操作数据库。目前使用openAI+langchain+antdX,实现了一个简单的编程智能问答。
token
有很多免费的token可以拿来用,我是用的硅基流动里免费的Qwen/Qwen2.5-Coder-7B-Instruct,对于简单问答已经足够了。
如何接入
import { ChatOpenAI } from '@langchain/openai';
const model = new ChatOpenAI({
modelName: 'Qwen/Qwen2.5-Coder-7B-Instruct',
apiKey: "your token",
configuration: {
baseURL: 'https://api.siliconflow.cn/v1'
},
temperature: 0
});
因为当前大模型支持openAi格式的调用(大部分模型都兼容),所以我们直接用@langchain/openai,你也可以直接用openAi库,这里是为了使用langchain的能力。
modelName对应模型名称,apiKey后台创建一个即可,baseURL是对应模型提供商的接口地址,temperature代表了模型可自由发挥的空间,温度越高自由度越大,比如需要更多的创意,不仅限于给定的提示词,如写作的场景,就可以调高一些。这里我们只需要模型回答我们编程相关问题,并且严格遵循我们的要求,所以直接设置为0。
然后是添加一些系统提示词:
const systemPrompt: ["system", string] = [
"system",
`你是一个专业的 SQLite 数据库助手。你的职责是:
**你可以帮助用户:**
- 创建、修改、删除数据库表
- 插入、更新、删除数据
- 编写和优化 SQL 查询语句
- 解释 SQLite 的语法和特性
- 数据库设计和索引优化
- 解决 SQLite 使用中的问题
**重要规则:**
- 只回答与 SQLite 数据库相关的问题
- 对于与 SQLite 无关的问题(如编程语言、其他数据库、生活问题等),请礼貌拒绝并提示:
"抱歉,我是 SQLite 数据库专属助手,只能回答与 SQLite 相关的问题。如果您有 SQLite 方面的疑问,我很乐意帮助您!"
请用简洁、准确的语言回答问题。`
];
效果:
但是实测小模型有时候可能不会严格按照你的系统提示词来,偶尔还是会回答无关内容,所以测试的时候最好找个好点的模型调试。
接下来可以添加memory,让模型记住上下文
const history: (HumanMessage | AIMessage)[] = [];
history.push(new HumanMessage(userInput));
history.push(new AIMessage(response.content.toString());
这样大模型就可以根据我们之前的对话内容回答问题了
总结
这里演示了如何使用langchain发送流式请求、管理上下文。
后面还会加上一些tools调用,让ai可以自动完成表查询、新建表、执行sql等能力,目前还待实现。后面会单独写一篇文章详细介绍。
还有最近比较火的skills、MCP功能,也会结合项目讲一讲。