用 SQL 快速对百万图片生成图片解读

科技   2024-05-13 19:38   浙江  

随着大模型百万token进入1元时代,在 SQL中调用大模型 很快要进入大众视野了。 对于业务数据库(数仓,数据湖),我们可以用Load加载任意数据库,或者文件系统的数据,然后用 select语句使用大模型UDF函数对每条记录或者聚合后的每条数据做处理,处理完用save语句保存回数据系统。

打开web,三条语句完成一个业务需求。

但是如果是去年,你可能一条SQL语句执行下去,会遇到两个情况:

1. 账单爆了。

2. 跑不出来(执行时间太长。。。)。

Byzer SQL 可以注册任意模型为UDF,使得你可以方便用大模型处理数据,比如加载图片,然后用vl提取图片信心,再保存成一个新字段。

其次 Byzer Notebook 作为交互产品,提供了编写SQL的辅助功能,可以让编写复杂SQL变得原来越简单。

为了证明我不是我吹牛,我我们今天举一个实际比较有价值的例子:如何使用多模态模型批量处理图片。

正常情况,你要编写Python代码来完成这件事。但是你的数据可能在 OSS上甚至在数据库里,所以你要学习:

  1. 如何使用 Python 库调用多模态大模型

  2. 如何使用 Python 的某个库来完成某个数据库或者某个对象存储读取

  3. 你可能还要考虑使用某些库来讲调取的数据写回到某个业务库

  4. 你可能还要考虑怎么并行化处理(Process?Thread?Async?)


如果你不是很熟悉这些东西,尽管我们要做的事情相当简单,你可能还是要花费很多功夫,可能半天,可能一天,甚至两天,你才能解决这个似乎和简单的一个活。

但是如果你使用 SQL, 这件事就变得特别容易。让我们来看看如何用Byzer-SQL 完成这件事情。

部署一个模型

这里我们部署一个 yi_vision 做演示,你也可以部署一个私有的,比如Qwen-VL 等。

执行下面的命令在 Byzer-SQL 所在的服务器上:

byzerllm deploy  --pretrained_model_type saas/openai  \--cpus_per_worker 0.001 \--gpus_per_worker 0 \--num_workers 1 \--worker_concurrency 10 \--infer_params saas.api_key=${MODEL_YI_TOKEN} saas.model=yi-vision saas.base_url=https://api.lingyiwanwu.com/v1 \--model yi_vl_chat


现在,可以打开 Byzer Notebook(Byzer-SQL专有编辑器),在自己的会话里连接下已经部署的模型:

!byzerllm setup single;
run command as LLM.`` where action="infer"and reconnect="true"and pretrainedModelType="saas/*"and udfName="yi_vl_chat";

现在可以加载图片目录了:


load binaryFile.`/tmp/upload/images` as images;!desc images;

可以看到加载的数据集的schema。接着我就可以用函数 yi_vl_chat 处理这些图片了,但是我还不太清楚怎么做base64 编码和把结构转化为 json,所以我打开一个cell问了下:

Byzer-Notebook 秒变对话应用。

现在我们开始SQL处理这些图片:

select yi_vl_chat(llm_param(map(
"query",to_json(array(map(    "image",base64(content), "text","详细描述图片里都有啥" ))) )))
as response from images as table1;
select llm_result(response) as result from table1 as output;

处理的模式很简单,yi_vl_chat 函数要求传递的参数必须用 llm_param/map 进行包裹,然后这个map有个query参数,因为必须都是字符串格式(SQL要求map的里的类型保持一致),所以我们把参数进行json化。

总体而言,这是一个固定格式,大家照着抄,替换掉 image/text就好。

不过当我执行这个代码的时候,报错了,服务器端说 base64 格式不对。所以我自己用 Scala 语言写了个 base64 UDF函数:

Byzer-SQL 支持动态构建UDF函数从Scala/Java/Python源码。推荐使用 Scala。如果Scala你不熟悉,也可以像前面咨询 base64/json化怎么用一样,在 Byzer Notebook 里让大模型帮你写这个函数。

点击运行下,上面的cell, 然后你就可以在后续的 SQL 中使用 my_base64函数了,我们把原来的 base64替换成 my_base64,搞定,可以正常运行了。


运行结果看起来是对的。接着如果你希望把结果保存起来,可以用 save 语法,把 table1 表保存到任何你想保存的地方。

总结

可以看到,我们可以从对象存储加载一堆文件,然后用一条SQL语句,就完成了对图片的解读操作,然后保存到任何你想保存的地方。相比你使用 Python, 不但对环境要求高,可以有效的屏蔽各种库的使用,提升效率。


祝威廉
架构/大数据/机器学习的心得和体会,也会因为爱情和生活写首诗
 最新文章