Loading [MathJax]/jax/input/TeX/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >LLM辅助的从Postgres到SQLite和DuckDB的翻译

LLM辅助的从Postgres到SQLite和DuckDB的翻译

作者头像
云云众生s
发布于 2024-09-19 05:02:53
发布于 2024-09-19 05:02:53
39800
代码可运行
举报
文章被收录于专栏:云云众生s云云众生s
运行总次数:0
代码可运行

Jon Udell 考虑 SQLite 和 DuckDB 是否可以在 LLM 助理团队的帮助下成为 Postgres 的分析替代方案。

译自 LLM-Assisted Translation From Postgres to SQLite and DuckDB,作者 Jon Udell。

我的 Hacker News 存储库提供了一组 Powerpipe 仪表盘,这些仪表盘使用 Steampipe 插件 从 Hacker News API 获取数据,并提供数据的交互式可视化。最初它只适用于 Postgres,但最近 Powerpipe 获得了将数据从 SQLite 和 DuckDB 传输到其仪表盘的功能。

一旦我让 SQLite 和 DuckDB 的移植正常工作,我发现两者运行仪表盘的几十个查询的速度几乎是 Postgres 的两倍。

这是主页仪表盘:

理论上,这些基于 Postgres 的仪表盘应该与 SQLite 和 DuckDB 完全相同。实际上,有两个层面存在需要解决的差异:HCL 和 SQL。Powerpipe 使用 HCL 定义小组件(包括图表、表格、信息卡和选择列表),并使用 SQL 将数据传输到这些小组件中。我们从 HCL 层开始。以下是 HCL 定义,用于比较 Hacker News 标题中提到的语言的三种不同时间尺度的面板三联画。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 container {

    chart {
      base = chart.languages_base
      width = 4
      type = "donut"
      title = "language mentions: last 24 hours"
      query = query.mentions
      args = [ local.languages, 0, 1440 ]
    }

    chart {
      base = chart.languages_base
      width = 4
      type = "donut"
      title = "language mentions: last 7 days"
      query = query.mentions
      args = [ local.languages, 0, 10080 ]
    }

    chart {
      base = chart.languages_base
      width = 4
      type = "donut"
      title = "language mentions: last 30 days"
      query = query.mentions
      args = [ local.languages, 0, 43200 ]
    }

  }

这些以及类似的公司、数据库等三联画,会重复使用一个通用的 SQL 查询,query.mentions。每个图表实例会将三个参数传递给查询:一个名称列表(语言、公司等),以及一对整数,用于定义 Hacker News 帖子的年龄(以分钟为单位)。以下是当前的语言列表,表示为正则表达式,以便 SQL 查询可以进行模糊匹配。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
  languages = [
    "C#",
    "C\\+\\+",
    "Clojure",
    "CSS",
    "Erlang",
    "golang| go 1.| (in|with|using) go | go (.+)(compiler|template|monorepo|generic|interface|library|framework|garbage|module|range|source)",
    "Haskell",
    "HTML",
    "Java ",
    "JavaScript",
    "JSON",
    "PHP",
    "Python",
    "Rust ",
    "Scala ",
    "SQL",
    "Swift",
    "TypeScript",
    "WebAssembly|WASM",
    "XML"
  ]

以下是接收这些参数的查询。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
query "mentions" {
  sql = <<EOQ
    with names as (
      select
        unnest( $1::text[] ) as name
    ),
    counts as (
      select
        name,
        (
          select
            count(*)
          from
            hn
          where
            title ~* name
            and (extract(epoch from now() - time::timestamptz) / 60)::int between symmetric $2 and $3
        ) as mentions
        from
          names
    )
    select
      replace(name, '\', '') as name,
      mentions
    from
      counts
    where
      mentions > 0
    order by 
      mentions desc
  EOQ
  param "names" {}
  param "min_minutes_ago" {}
  param "max_minutes_ago" {}
}

从 HCL 列表到 SQL 行

第一个 CTE(通用表表达式)将名称列表转换为一组行。Powerpipe 将名称作为字符串数组传递,这是一个本机 Postgres 类型,可以使用其 unnest 函数展开。对于这些名称中的每一个,第二个 CTE 会计算 hn 表中标题与名称匹配且时间戳在所需范围内帖子的数量。

这在 SQLite 或 DuckDB 中均不起作用。两者都不能接受字符串数组作为参数。ChatGPT 和 Claude 独立提出的解决方案是,在 HCL 层将列表转换为逗号分隔的字符串,然后在 SQL 层中以不同的方式展开它。以下是 HCL 部分。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
locals {
  joined_companies = join(",", local.companies)
  joined_languages = join(",", local.languages)
  joined_operating_systems = join(",", local.operating_systems)
  joined_clouds = join(",", local.clouds)
  joined_dbs = join(",", local.dbs)
  joined_editors = join(",", local.editors)
}

由于 DuckDB 的 string_to_arrayunnest 函数,展开非常简单。在 SQLite 中,它出乎意料地复杂。

如果可能,我宁愿避免 SQL 递归。在这种情况下,ChatGPT 和 Claude 都指出了相同的解决方案,所以我勉强接受了。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# duckdb

with names as (
  select
    unnest(string_to_array(?, ',')) as name
),

# sqlite

WITH RECURSIVE names(name, remaining) AS (
  SELECT
    '',
    ? || ','
  UNION ALL
  SELECT
    substr(remaining, 1, instr(remaining, ',') - 1),
    substr(remaining, instr(remaining, ',') + 1)
  FROM
    names
  WHERE
    remaining != ''
),

匹配名称和过滤时间

现在查询必须计算展开列表中每个名称的提及次数。以下是针对三个数据库得出的解决方案。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
-- postgres

where
  title ~* name
  and (extract(epoch from now() - time::timestamptz) / 60)::int between $2 and $3

-- sqlite

where
  title LIKE '%' || name || '%'
  and (julianday('now') - julianday(datetime(substr(time, 1, 19)))) * 24 * 60 BETWEEN ? AND ?

-- duckdb

where
   regexp_matches(title, name, 'i')
   and (extract(epoch from CURRENT_TIMESTAMP::timestamp - time::timestamp) / 60) between ? and ?

这种事情总是很繁琐,虽然 ChatGPT 和 Claude 肯定有帮助,但我必须严格监督它们。两者都渴望编写查询、函数或其他大量代码的完整新版本。这些重写通常会失败,虽然将错误传递回 LLM 有时可以快速解决,但该策略可能会变成死亡螺旋——就像在这种情况下一样。

正确的策略并不是什么高科技:将问题分解成可测试的小块,运行这些测试,以细粒度的方式解决问题,并逐步构建完整的东西。这只是你无论如何都应该做的,如果严格监督,LLM 可能会非常有帮助。但确实需要努力让它们保持专注。

我尝试使用以下说明自定义 ChatGPT 的基本用户级提示。

  • 我需要逐步构建的实用解决方案,并具有明确定义且可测试的中间状态。
  • 除非我明确要求,否则请不要编写代码,我总是想从讨论策略开始。

不过,这似乎并没有抑制其热衷于编写代码的风格。我必须真正地严格要求它以可测试的小增量工作。

进一步翻译

主页仪表盘上的其余查询以不同程度的难度移植到 SQLite 和 DuckDB。正则表达式在三个数据库中工作方式不同,并且 LLM 可以轻松适应。日期时间类型和表达式也工作方式不同,它们提出了 本质上更困难的问题,并且在这些情况下,LLM 的帮助较小。一如既往,我依赖于两个 指导原则永远不要信任,始终验证比较 LLM 的输出。但这仍然有点费力。

回想起来,这种困难本不应该令人惊讶。我主要使用 Postgres,它很流行,搜索引擎很熟悉,因此 LLM 也很熟悉。但虽然 SQLite 多年来一直在发展,而 DuckDB 正在强势崛起,其在线足迹较小。

我们在此讨论的仪表板提供了相对流行度的非正式衡量标准。以下是黑客新闻标题中最近提到的三个数据库的计数。

如果我需要定期使用 SQLite 或 DuckDB,我会使用支持 检索增强生成 (RAG) 的 LLM,例如 Unblocked,以使用文档和讨论丰富 LLM 上下文。同样的原则适用于 Python 和 JavaScript 以外的语言。当您使用最流行的技术时,LLM 会让您更轻松;在长尾中,您必须更加努力才能获得好处。

Powerpipe 和 DuckDB

一旦我让 SQLite 和 DuckDB 端口工作,我发现两者都运行仪表板的几十个查询,速度几乎是 Postgres 的两倍。将 SQLite 和 DuckDB 都视为 Postgres 的分析替代品,DuckDB 很有趣。它感觉几乎和 SQLite 一样轻,Postgres 风格的 SQL 比 SQLite 更容易移植到它,它甚至可以附加 Postgres 表。但 DuckDB 还有另一种个性。它有时被称为“列式 SQLite”,它可以处理 Postgres 或 SQLite 无法处理的大型数据集(通常采用 Parquet 格式)。

到目前为止,我主要构建了连接到 Steampipe 的 Powerpipe 仪表板,Steampipe 是一个 Postgres 实例,它与 插件套件 配合使用,该套件将许多 API 和文件格式转换为 SQL。现在我已经以面向行的形式使用 DuckDB,我还想探索其面向列的个性,并了解在两个世界之间使用 SQL 作为桥梁是什么感觉。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2024-09-182,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
LLM如何助我打造Steampipe的ODBC插件
Jon Udell运用ChatGPT、Cody以及GitHub Copilot来协助他为Steampipe开发ODBC插件,后者是一个可扩展的SQL接口,用以连接云API。
云云众生s
2024/03/28
2650
LLM如何助我打造Steampipe的ODBC插件
SQL的未来:会话式解决问题
借助 JSON 和 CTE 等现代 SQL 功能,大型语言模型可以成为帮助加速学习和工作的“推理伙伴”。
云云众生s
2024/04/25
3550
将人工专业知识与LLM辅助相结合来简化编码
发挥你的智慧、经验和创造力。将枯燥乏味的日常工作委托给受严格监督的 AI 助手,并检查他们的工作。
云云众生s
2024/10/09
1580
将人工专业知识与LLM辅助相结合来简化编码
如何利用 LLM 动态生成文档
某些解释需要由代码作者预先编写。而其他解释或许可以由结合大型语言模型的代码阅读器实时生成。
云云众生s
2024/03/28
3630
快速上手 LiteLLM:打造高效、稳定、面向生产的 LLM 应用程序
LiteLLM 是一个 Python 库,旨在简化多种大型语言模型(LLM)API 的集成。通过支持来自众多提供商的超过 100 种 LLM 服务,它使用户能够使用标准化的 OpenAI API 格式与这些模型进行交互。提供商包括 Azure、AWS Bedrock、Anthropic、HuggingFace、Cohere、OpenAI、Ollama 和 Sagemaker 等主要品牌。
汀丶人工智能
2025/05/21
7490
快速上手 LiteLLM:打造高效、稳定、面向生产的 LLM 应用程序
使用LLM实现自然语言的SQL查询代理
相信大部分研发同学都遇到过这样的场景:业务已经上线了一段时间,产品或运营同学想查看一下实时的业务数据。虽然对于成熟的系统来说,大多有完善的数据分析平台或运营管理后台,可以在各个维度展示业务数据,但是产品和运营同学的查询需求可能是频繁变更的,如“帮我查一下粉丝数>100的用户有哪些?”、“最近1小时内点赞数超过100的视频有多少条?”…。针对这种场景,现有的平台可能无法完全覆盖多样化的查询需求,所以通常需要研发同学手动跑 SQL,这也是很多后端同学经常自嘲为 “SQL Boy” 的原因。这种手动跑 SQL 的流程大致如下:
张申傲
2024/09/06
7010
使用LLM实现自然语言的SQL查询代理
利用LLM改进SQL查询的技术
首先我们修复了一个SQL查询中的bug。然后我们重新思考了查询的设计。这里是使用LLM调整SQL查询的进一步方法。
云云众生s
2024/03/27
3640
学以致用:语言模型在重塑教育中的作用
实现动手自主学习的途径是通过大型语言模型(LLM)。Jon Udell 展示了教育科技行业如何利用人工智能。
云云众生s
2024/03/28
1780
Mistral AI vs. Meta:顶级开源LLM比较
本文将比较Mistral 7B vs Llama 2 7B and Mixtral 8x7B vs Llama 2 70B
deephub
2024/01/29
5030
Mistral AI vs. Meta:顶级开源LLM比较
Shiny for Python:用纯 Python 构建交互式 Web 应用和 AI 助手(知识库应用)
长期跟踪关注统计学、机器学习算法、深度学习、人工智能、大模型技术与行业发展动态,日更精选技术文章。回复机器学习有惊喜资料。
Ai学习的老章
2025/07/13
1310
Shiny for Python:用纯 Python 构建交互式 Web 应用和 AI 助手(知识库应用)
Vanna 离线环境部署
Vanna[1] 是一个 MIT 许可的开源 Python RAG(Retrieval-Augmented Generation)框架,可以用来以对话形式与 SQL 数据库交互。
AlphaHinex
2024/06/11
2.9K2
Vanna 离线环境部署
Pentaho CDE详细开发使用手册
3、添加应用的资源(资源类型有CSS和Javascript,导入内容形式有代码或具体文件)
ZhangXianSheng
2019/05/28
1.8K0
Oracle转换Postgres
首先需要对Oracle和PostgreSQL的SQL都比较熟悉。对其理解的越详细就越具有优势,本文帮助读者迅速理解这两类SQL的区别是什么。
yzsDBA
2020/01/19
6.2K0
Oracle转换Postgres
【干货】找不到适合自己的编程书?我自己动手写了一个热门编程书搜索网站(附PDF书单)
原作者 Vlad Wetzel 编译 CDA 编译团队 本文为 CDA 数据分析师原创作品,转载需授权 选择适合自己的编程书绝非易事,美国的程序员小哥根据国外著名编程技术问答网站Stack Overflow 所推荐的所有编程书,自己动手写了一个搜索热门编程书的网站。 选择适合自己的编程书绝非易事。 作为一名开发者,你的时间是有限的,读一本书需要很多时间。 用这些时间你可以敲代码,你可以休息,可以做很多事。但相反,你用这些宝贵的时间来阅读和提升自己的技能。 那么应该读什么书呢? 我和同事经常讨论这个问题,但是
CDA数据分析师
2018/02/26
1K0
【干货】找不到适合自己的编程书?我自己动手写了一个热门编程书搜索网站(附PDF书单)
使用高级SQL向量查询增强您的 RAG 应用程序
通过使用 MyScale 和 LangChain 创建 AI 助手来克服 RAG 的限制,以提高数据检索过程的准确性和效率。
云云众生s
2024/06/13
2290
使用高级SQL向量查询增强您的 RAG 应用程序
Python数据库操作(SQLAlchemy、SQLite等)面试题集
Python数据库操作是软件开发中不可或缺的一环,尤其在面试环节,候选人需展现出对SQLAlchemy ORM、SQLite等工具的熟练掌握。本文将深入浅出地解析Python数据库操作相关的面试题,揭示常见问题与易错点,并提供实用的代码示例,助您在面试中脱颖而出。
Jimaks
2024/04/18
3160
使用数据库编程在PostgreSQL上构建石头剪刀布游戏
现代数据库 是持久、高效且可编程的数据存储库,使它们成为构建应用程序的超级强大环境。然而,近年来,许多数据库功能,如函数、触发器和物化视图,已经过时。
云云众生s
2024/08/10
2990
干货:Dune Analytics 初学者完全指南
Dune 可能是目前向公众提供的最强大的区块链数据分析工具,而最棒的是:它还是免费的!通过 Dune,你可以通过一个公共数据库近乎实时地访问区块链数据,你可以通过 Dune 的网站使用 SQL 查询。
Tiny熊
2022/11/07
1.7K0
干货:Dune Analytics 初学者完全指南
​Python中的SQL库:SQLite
现在所发布的各种网站,或者客户端应用的程序,绝大多数要跟数据库连接——毋庸置疑,大数据时代就这么来了。使用任何一种当下流行的高级编程语言,都可以通过某个专门的模块连接数据库。能够对数据库进行操作的软件程序,我们称之为“数据库管理系统(database management system,DBMS)。不同的数据库具有不同的DBMS,程序连接了DBMS就能够对数据库实施:
老齐
2020/05/14
9730
【快看】DBA 大佬不会轻易告诉你的 9 大 SQL 优化技巧
无论你使用的是 PostgreSQL、MySQL 还是其他关系型数据库——这份指南揭示了 9 种真实的 SQL 优化技巧,这些技巧是SQL 专家们默默使用的(而我们其他人则在黑暗中调试延迟)。
万能数据的小草
2025/06/17
3310
【快看】DBA 大佬不会轻易告诉你的 9 大 SQL 优化技巧
相关推荐
LLM如何助我打造Steampipe的ODBC插件
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验