当前上限最高的智能BI--super-analysis

600 阅读6分钟

引言

auto-coder.rag的作者祝大佬一直夸说是世界上最好的rag。几个月前我试过之后深以为然,然后在前端团队反复安利,可怜前端团队成员离这个确实有些遥远,估计都没怎么用,否则一个月的token消耗量怎么会不超过100万token(deepseek顶多1块钱,太节俭也是一种罪)。用了auto-coder.rag,百万token那不就是分分钟的事情,洒洒水,小意思啦。也就是上个月我试过pqa,才觉得应该加上之一。虽然夸大宣传只能算小小的瑕疵,不重要,但是要学会抓住重点,祝大佬的llm理念实在是最领先的,堆token才是王道,为了更好的效果,堆token会变慢,成本提升,那是智能的代价。(参见: 在AI大模型时代遨游,你不得不知道的一些事
有个哥们问我,说想做一个chatbi之类的演示,发现效果一般。这玩意我之前也玩过类似的,大体思路是微调一个sql比较强的中小模型,输入的时候手动将表结构信息加进去,然后出数据,甚至出图。之前我也玩过祝大佬的super-analysis。"帮我找到描述包含了安迪玩具的那个电影"那个例子太强悍,居然在数十万电影records中找到英文电影,耗费了我4000万+token,这我就忘不了了。我说chatbi之类的思路已经out了,要紧跟祝大佬的理念,用通用大模型堆token才是王道,肯定比chatbi上限高。
大话说出去了总要付出代价的,下面就是肝了若干个夜晚反复安装,修改配置出来的结果。当然,大部分的时间浪费在byzer-lang接clickhouse上,最后我放弃了,略过不提啦。

动手

参照super-analysis-doc的文档操作,自动手动的都仔细看看,这样就会自动去了解byzer这个项目,这个项目确实挺好的。前置条件:
  1. centos系列不要没事ulimit限制太多,selinux打开之类,否则真的挺烦的。后续启动ray也容易outofmemory。感觉这就和阿里云便宜虚拟机因为io限制老死机类似,都是瞎设置惹的祸。
  2. pip的镜像源搞好。
  3. 代理,github下载之类的,有肯定更方便点。
  4. 镜像加速,其中有一步是拉个mysql镜像,该死的墙,我那个镜像加速叠加代理贼啦慢,后来去掉代理只用镜像加速才解决了。
第3、4项估计容易劝退不少人。

一、allinone安装

安装过程中因为网络代理失败的,不要慌,不用删掉所有的重来。基本干的事是装conda,创建conda env byzerllm-dev,然后安装到software目录,有byzer-lang-xxx,byzer-notebook两个目录,其它基本可以忽略。
  1. 反复安装conda可能会折腾出问题,可以单独再整一次。需要停掉相关python进程,否则重装也会遇到问题。不嫌费事整个byzerllm用户及家目录删掉肯定可以重来。
  2. 中间遇到byzerllm启动的ray的client和server版本号不一致的诡异问题,也不用想太多,删了software再来一次
ROLE=worker ./setup-machine.sh

这个其实比较智能。会判断哪些装好了跳过的。

装好之后,下面两个命令多玩玩:
#byzer-sql启动,建议找到logs目录,反复启停几次看看日志变化。
./bin/byzer.sh [stop start restart]
#byzer-notebook启动,也建议找到logs目录,反复启停几次看看日志变化。
./bin/notebook.sh [stop start restart]
其实对于我们做智能BI演示,byzer-notebook并不需要,对于不太熟悉byzer-sql语法,也不熟悉byzer-notebook的,用这个是负担,忽略这部分可以节省点体力。这样只需要关注9003端口就行了。9002就忽略了。9002的好处在于提供了一个notebook环境,可以比较方便的体验byzer-sql结合大模型。另外一个好处就是,9003的界面很坑爹,9003上写的脚本一不留神就消失了。9002的notebook那就好多了,试验失败的脚本都自动保存,所以9002的notebook就像阑尾,割了不影响大局,使用体验差些。

二、搭建基于mysql数据库的supersql智能查询。

基于super-analysis的文档有四步:

  1. 准备schema文档
  2. 启动 schema 文档rag知识库:
  3. 下载byzer-sql文档并启动byzer-sql的rag知识库
  4. 基于两个rag知识库(schema,byzer-sql),结合之前部署的大模型,启动sql分析服务。
后三步的脚本有点土,我一般是nohup rag_schema的shell脚本原文 > nohup_schema.out &这么启动,可以少开点窗口,另外也能在想要看日志的时候进来看日志。
这样,其实只有第一步是需要动脑筋的。先跑电影那个示例,尤其是"帮我找到描述包含了安迪玩具的那个电影"那个示例,感受一下几千万token的震撼,这个必须不能省略,切实的贯彻祝大佬的llm理念,堆token才是王道。另外一方面可以增强信心,这么屌的智能分析都能做到,其它不过是毛毛雨。还有一个小小的私心,我曾经的美好体验,要传递给大家。
上面说了,其实只有准备schema文档需要费点心思,其实真的应该相信大模型,你只需要根据第4步的日志,看看生成的byzer-sql的日志,在schema文档上加一句劝劝大模型就行了。比如我加的一句是:
注意:
生成byzer-sql的时候,jdbc.`mysql_instance`已经注册为全局变量了,无需再创建。创建缺乏用户信息密码等,所以是无效的。
直接用已有的jdbc.`mysql_instance`,只需关注表加载,后续查询的byzer-sql生成
就这样,byzer-sql就可以比较丝滑的接入mysql数据库做智能查询了。还剩下的两步是、
  1. 在9003窗口注册你的mysql数据库。
  2. 找个客户端接你的sql分析服务。8000端口
当然,如果这时候你想起了割掉的阑尾,byzer-notebook,其实这两步都可以在9002里完成,只是不太方便后续集成而已。(第一步肯定可以,第二步把8000在ray里注册成一个大模型,然后在9002里定义,理论上也可以用)notebook就是这么方便。python要没了它,魅力值起码降低80%?
第一步有个坑,根据byzer文档
> SET user="root"; 
> SET password="root"; 
> SET jdbc_url="jdbc:mysql://127.0.0.1:3306/byzer_demo?characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&tinyInt1isBit=false&useSSL=false"; 
> CONNECT jdbc WHERE 
url="${jdbc_url}"
and driver="com.mysql.jdbc.Driver" 
and user="${user}" 
and password="${password}" 
AS mysql_instance;
这里的password如果有!$之类的特殊符号,需要这么处理
...
and password="#[[xxxx]]#"
...

最后秀一下成果:

image.png

image.png