☰
我只丢给 AI 一句话,它把我仓库里 11 个隐藏缺陷全挖出来了
2026/10/1 21:00:51 网站建设 项目流程

FinOS AI 上线实录。一个把「企业经营与风险研判」做成开源 AI 工作台的真实记录,用一句话让 AI 做全库体检,修掉 11 类真实缺陷,再从代码走到一个别人能点开的在线应用。

写在前面,为什么值得记录

现在聊「AI 写代码」的文章,十个里有九个,停在「你看,它给我生成了一个页面」。

生成页面这事,坦率的讲,早就不稀奇了。

真正难的地方在别处。你把这个东西推到线上,要让一堆不认识的人能点开、能用、敢用,问题就全冒出来了。尤其是 FinOS AI 要干的活,是企业财务、授信尽调、风险判断,这种「错一次代价很高」的场景。

写错一行代码、页面丑一点,没人会死。但要是一个风险结论引错了资料,或者一家公司的数据漏给了另一家公司,那是要出事的。

所以这篇我不聊怎么把功能写出来,我想聊聊怎么让它不出错。一个系统从「能跑」走到「值得托付」,中间隔着的最后那一公里,到底长什么样。

具体来说就三件事。被一句话触发的全仓库体检,一轮界面可用性的打磨,还有把它真的发布成一个别人能点开的在线应用。

技术读者能看懂,只想弄明白这玩意能干嘛的普通朋友,也能看懂。我尽量说人话。

一、这次开发是在哪做的,COSMO Code

先说场地,不然后面几章容易看迷糊。

COSMO Code,是卡奥斯 COSMOPlat 开源社区做的一个AI 智能开发平台。COSMOPlat 你可能没听过,它是海尔旗下的工业互联网平台。

一句话,0 代码,5 分钟,AI 帮你搓出能跑的应用。

说实话,我一开始是有点怀疑的。「0 代码 5 分钟」这种话,过去几年被喊烂了,多数最后都是个玩具。但这次我用下来,感受是真不一样。

传统方式是你先在本机把 Node、Python、数据库装一遍,环境折腾半天,再打开编辑器敲代码。COSMO Code 不是这套逻辑,你直接用中文把需求讲清楚,AI 去生成代码、修 bug、迭代功能,你就在对话里一句一句把它盘明白。

开发要用的东西,平台都给你备好了。

独立 VM,本机一个依赖都不用装。Web 终端,构建、启服务、查日志,全在浏览器里。文件管理器,仓库文件直接看直接改,不用另开 IDE。跑起来就自动分你一个公网链接,域名证书都不用操心。

而对我这篇文章影响最大的一点是,后面三章讲的破事,全都发生在这一个平台里。

排错,在它的对话窗口里。发布,在它的控制台里。UI 优化,还是在它的仓库里改完、构建、生效。

从读代码到改代码再到上线,我本地,一个依赖都没装过。

二、FinOS AI 是什么

先把这个项目本身说清楚。

FinOS AI 是一个面向企业经营与风险研判的开源金融服务 Agent,版本 2.2.1,MIT 协议,代码全在 GitHub 上。

用大白话讲,它干的事是,把散在 PDF、Word、Excel、各种制度文件和行业研究里的信息,整理成一条能核验、能追溯的判断链路。

为什么要有这么个东西。

传统的企业尽调或者风险排查,流程大概是这样。人先把资料翻一遍,手动摘出关键事实,再对着制度规则一条条比对,写出一份风险清单,最后交给负责人复核。资料在文档、表格、邮件之间来回搬,搬到最后,结论往往有个说不清的地方,就是「你凭什么这么判断」。

FinOS AI 想改的,就是这个说不清。

它给每个重要结论立了三条规矩。

  1. 这个结论基于什么资料和事实,证据要可回溯;
  2. 命中了哪条规则,为什么这事构成风险,规则要可解释;
  3. 谁核验过,下一步该谁处理,责任要可追踪。

它的完整链路是这样的。

边界也得说清楚。它不是个人记账软件,也不替代授信、投资、法律、审计、合规任何一个负责人。系统提供的是信息分析和决策辅助,不构成任何专业意见。这条底线,产品里每一次交互都在重复声明。

三、产品长什么样

FinOS AI 的工作台,是围绕企业金融这条主线做的。下面四张图都是真实跑起来的截图,不是设计稿。

1. 企业经营与风险决策台

点进去的第一眼就是它。

四个指标摆在那儿,企业项目、研判资料、风险信号、平均完整度,工作区是个什么状态,一眼看清楚。

中间那块 AI Readiness 面板,标题写的是「建立真实研判链路」,其实就是给了条最短的上手路径,创建项目、接入模型、上传资料,三步走完,AI 才有东西可依,才会开始给你干活。

这里有个细节我挺想说的。截图里所有数字都是 0。

这不是我截图截早了,也不是 bug,是刻意做的产品底线。系统不预置任何示例数据。没有企业,没有资料,没有风险,没有结论。一切都得你自己录进去,或者基于真实资料生成。

我第一次看到那个空仪表盘的时候还愣了一下,后来想明白了,一个处理风险的系统,预置一堆假数据给你看,那才是灾难。

2. 使用指引

怕你不会用,产品内置了一份交互式指引。

3. 部署与合规准备

这一页,我第一次点开的时候有点意外。

因为它很诚实。

它明明白白把「开箱单机体验模式」和「企业生产模式」拆开讲了。前者适合本机自己评估,但它不等同于企业身份源,也不做共享设备的隔离。后者才需要接 SSO、五级权限、生产数据库和审计留存。

页面底下还列了个「企业上线控制项」,一句话提醒部署的人,应用层做了组织、权限、审计这些控制,并不自动等于一个通过了监管认证的 SaaS。

这年头,肯把这种话写在自己产品页面上的,不多。

4. 企业金融 Agent 中心

四个职责明确的 Agent 在这儿编排。

资料理解 Agent,把文档读成结构化的事实。规则匹配 Agent,做确定性的规则命中。风险研判 Agent,生成风险清单。流程辅助 Agent,把结论推给下一个处理人。

这一页同样是零数据的诚实。没配置的时候,它显示「研究链路尚未就绪」,然后给你「配置模型 / 创建项目」的引导,而不是伪造几条好看的运行记录糊弄你。

四、排错实录,我给 AI 发了一句话

好,重头戏来了。

这也是我觉得「AI 辅助开发」真正有价值的场景。

4.1 那句提示词

我在 COSMO Code 的对话窗口里,就发了一句话。

看看这个项目是干什么的,有没有 bug

没了。

没指定文件,没给报错,没限定范围。就是最普通的一句大白话,跟随口问同事一样。下面这张是它当时的界面。

4.2 AI 的「全身体检」发现了什么

我以为它大概会泛泛回几句,类似「这是个 Next.js 加 FastAPI 的项目,结构挺清晰」这种场面话。

结果它真把整个仓库读了一遍。

从认证模块一路查到数据库迁移脚本,最后给我摆出了 11 类真实缺陷。

为了照顾两类读者,每一项我都写成两段。一段大白话,不懂技术的也能看明白。一段技术要点,给要动手的人看。

① Refresh Token 轮换缺陷,续期后没真把旧钥匙作废

登录凭证你就当它是一张会过期的门禁卡。到期该系统作废旧卡、发新卡,但原来这版实现,只记了一笔「旧卡被重复刷过」,并没有真的把整串卡作废。卡要是被偷了,小偷能一直刷下去。

技术上,refresh 轮换之后新的 jti 没持久化,重放检测只记了事件,没吊销令牌家族。

② 跨租户数据越权,一个「空值兜底」可能读错公司

不同公司的数据必须彼此隔离,这是底线。但一个不起眼的「取不到就返回空值兜底」逻辑,可能让 A 公司读到 B 公司的快照。这种事出一回,信任就没了。

技术上,企业快照去掉了空串回退,规则创建补上了组织授权校验(require_owned_resource)。

③ IPv6 的 SSRF 校验,既漏放也误伤

系统允许你自己填「自定义模型接口地址」。为了防有人借这个口子去探内网、摸云元数据,必须做安全校验。原来那版 IPv6 判断,既可能被绕过,又会把合法地址误拒。

技术上,base_url-guard 现在完整处理 IPv6,拒绝链路本地和保留地址,同时不再误杀合法字面量。

④ providerName 没做白名单,一个特殊字符串就能让接口 500

供应商类型不做白名单校验,你传进去某些「特殊名字」,程序会读到不该读的属性,直接崩成 500。

技术上,PROVIDER_PRESETS[type] ?? custom 会命中原型链,比如 constructor 这种,已经补了白名单和非字符串输入兜底。

⑤ save_strategies 返回值恒为 null,还没落库就取编号

新增一条记录,你得先拿到它的编号才能接着往下走。但这段代码,在记录还没真正写进数据库的时候就伸手去取编号,拿回来的永远是空。

技术上,改成 flush 之后再取 id,顺手修了 autoflush=False 下的取值时机。

⑥ Alembic 索引表名写错,索引静默地没建

建索引的脚本,把表名写错了。偏偏脚本又写着「发现表不存在就跳过」,于是它不报错、悄悄跳过,关键索引根本没建起来。平时看不出来,数据一多,查询就慢。

技术上,修正了 governance_audit_logs 和 enterprise_rule_revisions 两个表名。

⑦ 分页 limit 没有下界,传个负数就能一次拉全表

列表接口本该是「每页最多 100 条」。但有人传个负数进来,比如 -1,在 SQLite 里就等于「不限制」,一次把整张表拉出来。

技术上,统一了 MAX_LIST_N 下界,避免 LIMIT -1 全表扫描。

⑧ SSE 流式调用没超时、没取消,用户关了页面连接还在

AI 流式回答的时候,用户要是中途把页面关了,后台那个请求还在傻等,连接一个接一个堆着,堆久了能把服务器拖垮。

技术上,给非流式分支补了 AbortSignal.timeout,给流式分支接上 cancel,顺便避免了错误分支二次 send。

⑨ 密钥掩码只遮 1 位,等于半公开

展示 API Key 的时候,本该只露头尾。原来对 9 到 11 位的密钥,只藏了中间 1 位,形同虚设。

技术上,maskApiKey 收缩了可见字符范围。

⑩ 删除项目产生孤儿数据

一个项目删掉了,它底下挂的资料、风险、任务却没跟着删,留下了一堆「没有归属」的记录在库里飘着。

技术上,删除时级联清理子资源。

⑪ README 里的 Windows 安装命令写错

文档里给 Windows 用户的安装命令是错的,照着敲,走不通。

技术上,修正了 README 里的 Windows 虚拟环境命令。

4.3 修复、回归测试与一份「诚实清单」

查出问题,其实只是第一步。

AI 接着就把这些都修了。而且它没只顾着修,还给几个关键缺陷补上了回归测试,比如「令牌重组之后不得再能刷新」「快照不得跨租户泄漏」,确保同类的问题不会再犯。

但真正让我有点意外的,是接下来这一步。

它没有拍着胸脯说「已经完美了」。在同一轮对话里,它主动列了一份清单,标题大概意思是「仍然存在、但我判断不属于阻塞性的加固项」。

它自己招了这么几条。CSRF 的双提交校验当时其实没生效,门控用的 Cookie 从来没签发过,只有 SameSite=Lax 在兜底。限流只取 X-Forwarded-For 最左边的值,这个值可能被伪造的头绕过。生产环境还在跑 init_db 建表补列,没完全交给 Alembic 迁移。生产的 /docs 和 /openapi.json 还敞着。模型配置的读写没加锁,写盘也不是原子的,极端并发下可能丢配置。

我更想说的是后面这件事。这份「没修完的清单」,紧接着就被它自己一条条关掉了。下一轮提交专门做了安全加固,X-Forwarded-For 改成从右往左取第一个非可信代理地址,CSRF 门控改用真实签发的 Cookie,非本地环境关掉接口文档,模型配置按用户串行化读写并原子落盘。

这就是我觉得 AI 辅助开发最该有的样子。不只是能写,而是能查、能认、能闭环。先说清楚哪些修了、哪些没修、为什么,再一条条关掉。

光这一条,就比市面上大部分「AI 帮你写了个 demo」的演示,值钱多了。

五、让它真正跑起来,守护进程和发布申请

代码没问题了,下一步是让它在线可访问。

在 COSMO Code 的控制台里,这一步要两个动作,顺序还不能反。

5.1 创建守护进程

应用需要一个看门人,保证服务一直活着,挂了能自动爬起来。这叫守护进程,在平台的「添加守护进程」里配置。

关键配置就这几项。

配置项取值说明
start.sh 路径workspace 中的启动脚本内置的 start.sh 固定端口、幂等启动、限制堆内存防 OOM
检测端口3000Web 服务端口(后端 API 为 8300)
检查间隔3 分钟周期性探活
失败重试3 次连续失败后重启
启动超时60 秒超时判定为启动失败

顺带一提,项目里新加的 start.sh 和 stop.sh,就是为这一步准备的。幂等启动、生产构建、限制堆内存、用 ss 提取 PID 来停止,省得内存溢出和端口打架。

顺序上有个事得注意,守护进程是发布的前置条件。没有它,服务不稳定在线,发布申请那一步根本走不下去。

5.2 申请应用发布

看门人就位,服务稳定在线了,才能提交发布申请。

表单要填的东西不少。网站名称、分类、URL、封面图、一句话描述、详细描述、核心亮点、使用方法,最后勾上同意《用户协议》。提交完,等管理员审核。

审核通过之后,这个应用就有了一个真实可访问的地址。

在线体验 https://3000-4e7b136bf689da92.code.cosmoplat.cn

到这一步,一个从「本地能跑」到「别人能点开」的闭环,才算真的闭上。

六、最后一公里,深色主题下的下拉框

上线之前,还有一类特别容易被忽视、但特别影响体验的问题。

界面细节。

产品的整体视觉是深色主题,但表单里的下拉框用的是浏览器原生的 select。在深色背景下,原生下拉一展开,选项是浅色底加浅色字,你不把鼠标悬上去,基本看不清。要是数据为空,下拉更是「一片空白」,用户根本分不清是没数据还是页面坏了。

用户的反馈也很直接。

修复分两步走,最后的下拉 UI 跟平台深色风格完全统一了。

先说治标这一步,先保证能看清。在全局样式里给 html、select、option 设 color-scheme: dark,再显式指定选项的背景和文字颜色,杜绝「文字要悬停才看得见」。同时给治理页、风险页的空下拉补上占位项,没数据的时候就禁用,然后提示「暂无项目 / 成员」。

再说治本这一步,统一观感。新写了一个平台自研的下拉组件 Select,基于 Radix 的 DropdownMenu 做的,外观跟表单控件完全一致,弹出层用平台自己的深色令牌。

但这里有个取舍。为了不破坏表单的原生语义,它保留了一个 sr-only 的原生 select,专门承载 name、required 这些表单行为。也就是说,视觉焕然一新,但提交逻辑和必填校验一点没动。然后 7 处原生 select,一次性全换掉。

这体现的是一种挺成熟的工程取舍。既要好看,也不能为了好看把表单的原生行为给牺牲掉。用一个藏起来的原生控件兜住语义,用一个自定义组件承接外观,各干各的活。

七、技术底座与安全边界

撑起上面这一切的,是这么一套技术栈。

层技术
前端Next.js 15、React 19、TypeScript(strict)、Tailwind CSS、Zustand、Framer Motion
前端安全短期 Access Token(仅驻留内存)、HttpOnly Refresh Cookie、AES-256-GCM 凭据存储
后端FastAPI、SQLAlchemy 2、Pydantic v2、Uvicorn
文档处理Word(mammoth)、PDF(pdf-parse)、图片视觉 OCR、Excel/CSV 表格结构、证据行号与坐标
数据SQLite(开发)、PostgreSQL 16(生产)、Redis 7(可选,可降级)
部署Docker Compose、nginx、独立 Next.js 运行产物

安全上有几条控制,我想单独拎出来说。因为它直接关系到,你敢不敢把真实的企业资料喂进去。

密钥不落前端。模型 API Key 在服务端以 AES-256-GCM 加密保存,返回浏览器的时候只给一个掩码。

拒绝弱密钥启动。生产环境如果没配置、配得太短、或者还在用示例占位密钥,直接拒绝启动,而不是「降级运行」。这点我很喜欢,宁可起不来,也不要带着一个假密钥裸奔。

出站访问受控。Webhook、模型 Base URL 这些出站地址,拒绝本机、内网、保留地址和自动重定向,防的是 SSRF。

令牌最小暴露。Access Token 15 分钟,而且只驻留内存,Refresh Token 走 HttpOnly Cookie,支持轮换和吊销。

八、结语,为什么这件事值得记录

FinOS AI 的价值,不在于它是「又一个 AI 应用」。

它有意思的地方在于,把三件现在很难凑到一起的事,放在了同一个东西里。

真实的场景。它不是在演示一个玩具 demo,而是在处理企业财务、授信尽调、风险研判这类严肃业务。

可核验的 AI。每个结论都能回溯到资料、事实、规则和复核人,AI 的输出是可被追问的。

诚实的工程态度。没有预置数据,不编造结论,不夸大能力,连「哪些没修、为什么没修」都明明白白写出来。

而这次开发里最打动我的,反而是那句轻描淡写的提示词,「看看这个项目是干什么的,有没有 bug」。

它没有什么魔法。背后是 AI 把整个仓库从头读到尾,把 11 类真实缺陷一项项摆到台面上,再修掉、再补上回归测试,这样一个笨功夫的过程。

顺带再说一句,这一整套动作,读代码、改代码、构建、发布,全程都在 COSMO Code 这一个云端平台里完成,我本地没装过任何依赖。

代码写出来,只是个起点。

能不能查、敢不敢认、会不会闭环,才决定一个系统值不值得托付。

如果你也想体验一下,欢迎去在线地址逛逛,或者从 GitHub 把源码拉下来自己托管跑一遍。

  • 在线体验 https://3000-4e7b136bf689da92.code.cosmoplat.cn
  • 开源仓库 https://github.com/Leterhong/FinOS-AI

FinOS AI 提供信息分析与决策辅助,不构成投资、授信、法律、审计或合规意见。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询