智能问数 · 项目概览
项目背景
智能问数是一项内部独立预研。用户在对话页登录、选一个数据源,用中文提问;服务端把问题拆成若干查询和计算任务,在只读、隔离的执行层里跑完,再根据查到的结果组织回答。模型生成的 SQL 不碰生产库,模型生成的 Python 不碰宿主机。不使用公司数据。
要解决的问题
- 一个问题里有几件事:「华东和华北的销售额分别多少,相差几倍」要查两次再算一次。一次生成一条 SQL 再执行,看不出哪一项没覆盖、哪一步失败。
- 口径没定就查:时间范围、指标定义、统计粒度或过滤条件不清时继续执行,会得到另一套数。需要先停下来问用户。
- 回答对不上结果:回复里的数字如果不能指回某次查询或计算,就无法核对;缺的数据也不能用模型猜测补齐。
- 执行本身要收住:SQL 只能读,不能写库,也不能把网关进程拖垮;Python 不能读写宿主机、出网或调用危险模块;没有隔离环境时宁可拒绝,不退回进程内执行。
- 失败要有出口:完成、部分完成、失败、取消和等待过期需要汇到同一种结算,用户才能看到停在哪、已经有什么、接下来能做什么。
项目范围
- 问数主链:绑定身份和数据源,把原问拆成 query / compute 任务并校验计划;需要用户决定时先停;通过后按依赖分波执行,整理成可核对的素材,只根据素材组织回复,再进入结算、留痕和展示。流程见架构设计。
- 执行层:SQL 在独立子进程里用只读连接执行;PostgreSQL 走独立 worker 的只读事务;模型生成的 Python 进固定摘要的 Docker 容器;闭集计算留在进程内,只对已接受的结果做允许的运算。
- 护栏:授权、静态校验和审计做成一个只依赖 Pydantic 的 Python 包,接收调用方身份,自己不解析令牌,可以嵌进别的服务。
- 链路回看:独立的评估台按拆解、等待、任务、素材、回答五段查看每一轮证据,并承接黄金集夜间回归的结果。
主要交付
- 前端展示层:Vue 对话页,含登录、对话、数据集、Skills 和本域账号;回答按表格、图表和净化后的 Markdown 展示。
- 后端 AI 应用层:FastAPI 网关,内含问数编排、模型调用、只读执行、Docker 沙盒和护栏包。
- 链路评估台:离线审阅工程,按链路版本查看证据和标注;页面不调用模型、不执行 SQL。
当前结果
- 一句多问能拆开查、再算:要分别取值再比较的问题,会拆成带依赖的查询和计算任务,按波次执行,互不依赖的子问最多 4 路并行。每一步有自己的结果,失败能看到停在哪一项。
- 回答里的数字对得上查到的结果:回复只根据已整理的查询和计算结果来写。对不上来源的数字不当作已验证结果,缺的数不会由模型补上。
- 模型不直接把 SQL 送去执行:查询先变成可校验的意图,由服务端编译后再跑。写库、越权、注入和认不出的语句在执行前拦住;导出这类副作用要等用户确认。
- 代码执行出不了隔离边界:SQL 在独立进程里用只读连接执行,避免拖垮网关。Python 放进无网络、只读文件系统的容器;出网和写宿主机的尝试会被拒绝。没有可用容器时直接拒绝,不改到网关进程里跑。
- 口径不清时先问再查:时间范围、指标、粒度或过滤条件会改变结果时,相关任务不启动,等用户选定后再继续。
- 有独立的链路评估台:一轮问数可以按拆解、执行、素材和回答回看,用来核对停在哪一段。