先说结论:我不确定我做的东西,到底算一个"能用的工具",还是只是一堆"看起来很唬人的垃圾"。
所以我把它完整开源了,想请真正写过生产代码的人帮我看看。如果你愿意花十分钟翻一下代码、再在评论区骂我两句,那就是今天我最大的收获。
我为什么做这个
我是一个学生。最开始只是想搞懂一件事:现在大家都在说"AI Agent",那一个 Agent 到底是怎么被造出来的?不是调一下 ChatGPT 接口那种,而是它真的能"记住你说过的话""自己学着把对话聊得更好""能读你丢给它的文件然后回答问题"。
我让 AI 工具帮我一起写,但尽量逼自己搞懂每一块在干什么------毕竟如果连自己写的都不懂,那就真成玩具了。这个项目,就是从"想看懂"一路堆到"想做出来"的结果。
它能干什么
它已经不是聊天 demo,而是一套有骨架的系统:
- 强化学习对话闭环:用"这次对话质量怎么样"当奖励信号去训练 Agent,让它越聊越懂你的偏好;还配了个训练仪表盘,能看 loss 曲线、回合奖励、训练历史(历史存数据库,重启不丢)。
- 向量语义记忆:Agent 记得住你之前说过什么,靠 embedding 召回,不是僵硬的关键词匹配,所以你隔很久再提旧话题它还能接上。
- RAG 知识库:你上传文档 → 自动分块 → 混合检索(BM25 + 向量,用 RRF 融合)→ 它回答时带着原文引用,点一下角标能跳回原文那一段。
- 仿真自测:能自动造一堆对话场景让 Agent 自己跑,专门用来抓"它什么时候会开始胡说八道"。
- 质量护栏:我写了脚本拦三类垃圾------假向量、僵尸依赖、假测试,CI 跑的时候自动挡下来。
技术栈:后端 TypeScript + Express,前端 React,数据库 MongoDB,测试用 Jest。
一个让我自己有点自豪的小细节:文档收发
这块我花了最多时间,也觉得最实用。
收(读进来)
除了常见的 PDF / Word / PPT,它还能读:
- LibreOffice 全家桶:.odt / .ods / .odp
- 电子书:.epub
- 一大票纯文本和标记语言:Markdown、CSV、JSON、YAML、XML、LaTeX、Org、reST、HTML、RTF、vCard、iCalendar、日志、ini、toml......
- 你用手机拍的文档照片(带 EXIF 方向校正、中文断行重连,还会给个质量评分提醒你"这张太糊了该重拍")
发(导出)
反过来,AI 的任何一段回答,你能一键导出成 10 种格式 ------ md / txt / html / json / csv / xml / tex / org / rst / rtf。
我做这么偏门,想法很简单:你永远不知道用户手里那份文件是什么格式,少支持一种,就是多一次"打不开,算了"。
踩过的坑(这部分可能最值得你喷)
- 分块差点把进程搞死:当 chunkOverlap 大于等于 chunkSize 时,我的分块循环会同步死循环、直接卡死进程。后来加了收敛和"下标必须前进"的兜底才稳住。
- 依赖被误删:项目用 npm workspace,有次清理把 backend 的依赖提走,结果 RAG 直接炸穿主流程。现在 guard 会拦这种事。
- 假测试:早期写过"看起来过了但其实没断言"的测试,所以专门写了护栏去识别并挡掉。
我现在最困惑的三件事
这才是我发这篇文章的真正原因。
第一,这东西对别人有用吗? 我承认它功能很多,但"功能多"不等于"有人需要"。是不是已经有一堆现成产品比我做得好得多?如果是,我就该换个方向,而不是继续往里堆功能。
第二,从工程角度看,最大的短板在哪? 我自己看自己的代码,是看不出问题的。我能想到的可能是:部署太麻烦?鉴权太简陋?代码里 AI 写的痕迹太重、结构乱?测试虽然 453 个全过,但会不会都是"假测试"?哪一个最该先补?
第三,一个学生想继续往下走,下一步该学什么? 是先把一个功能做到生产级,还是继续拓宽技术面?是先学系统设计,还是先把代码质量练出来?
代码在这里
GitHub(主):github.com/51-ai/test-... Gitee(国内镜像):gitee.com/Abc51/test-...
代码里有些地方确实比较乱,很多是 AI 辅助写的,我自己也知道不漂亮。
我接下来想做的
- 把登录和鉴权做扎实(现在太简陋)
- 让它真正能一键部署,而不是只在本地跑得起来
- 把测试从"单元"补到"端到端",覆盖真实用户的操作链路
求拍砖
欢迎拍砖,越具体越好。哪怕只回一句"你这块应该这么写",或者"这个功能根本没人需要",对我来说都是真的有用。
谢谢各位。