我为sqlite-utils CLI 工具构建了一个新插件,可让您直接向计算机上的 SQLite 数据库和 CSV/JSON 文件提出人类语言问题。
它称为sqlite-utils-ask 。安装方法如下:
sqlite-utils 安装 sqlite-utils-ask
它从OPENAI_API_KEY
环境变量中获取 API 密钥,或者您可以安装 LLM并使用llm keys set openai将密钥存储在配置文件中。
然后你可以像这样使用它:
卷曲-O https://datasette.io/content.db sqlite-utils 问 content.db “ 2024 年有多少 sqlite-utils pypi 下载量? ”
此命令将提取所提供的数据库文件的 SQL 模式,将其与您的问题一起通过 LLM 发送,返回 SQL 查询并尝试运行它以得出结果。
如果一切顺利,它会给出如下答案:
SELECT SUM(downloads) FROM stats WHERE package = 'sqlite-utils' AND date >= '2024-01-01' AND date < '2025-01-01'; [ { "SUM(downloads)": 4300221 } ]
如果 SQL 查询无法执行(由于某种语法错误),它会将该错误传递回模型进行更正,并在放弃之前重试最多 3 次。
添加-v/--verbose
以查看其使用的确切提示:
System prompt: You will be given a SQLite schema followed by a question. Generate a single SQL query to answer that question. Return that query in a ```sql ... ``` fenced code block. Example: How many repos are there? Answer: ```sql select count(*) from repos ``` Prompt: ... CREATE TABLE [stats] ( [package] TEXT, [date] TEXT, [downloads] INTEGER, PRIMARY KEY ([package], [date]) ); ... how many sqlite-utils pypi downloads in 2024?
我已将上面的内容截断为仅相关表 – 它实际上包含该数据库中每个表的完整架构。
默认情况下,该工具仅将该数据库架构和您的问题发送给法学硕士。如果添加-e/--examples
选项,它还将包含该架构中每个文本列的五个常用值,平均长度小于 32 个字符。这有时可以帮助获得更好的结果,例如,为state
列发送值“CA”、“FL”和“TX”可以提示模型应该在查询中使用状态缩写而不是全名。
询问 CSV 和 JSON 数据的问题
核心sqlite-utils
CLI 通常直接针对 SQLite 文件运行,但三年前我添加了直接使用sqlite-utils 内存命令针对 CSV 和 JSON 文件运行 SQL 查询的功能。这是通过在执行 SQL 查询之前将该数据加载到内存 SQLite 数据库中来实现的。
我决定重用该机制来直接针对 CSV 和 JSON 数据启用 LLM 提示。
sqlite-utils ask-files
命令如下所示:
sqlite-utils Ask-files transactions.csv “按年份列出的总销售额”
此命令接受一个或多个文件,您可以提供 CSV、TSV 和 JSON 的组合。每个提供的文件都将导入到不同的表中,从而允许模型在必要时构建连接查询。
实施说明
该插件的核心由大约250 行 Python 代码实现,使用sqlite-utils
register_commands()插件挂钩来添加ask
和ask-files
命令。
它将LLM添加为依赖项,并利用 LLM 的Python API来抽象与模型对话的细节。这意味着sqlite-utils-ask
可以使用 LLM 或其插件支持的任何模型 – 如果您想通过 Claude 3.5 Sonnet 运行提示,您可以这样做:
sqlite-utils 安装 llm-claude-3 sqlite-utils 询问 content.db “统计新闻表中的行数” -m claude-3.5-sonnet
该插件最初默认为gpt-4o-mini,以利用该模型的自动提示缓存:如果您针对同一模式运行多个问题,您最终将多次发送相同的冗长提示前缀,并且 OpenAI 的提示缓存应自动启动并为这些输入代币提供 50% 的折扣。
然后我运行了实际数字,发现gpt-4o-mini
足够便宜,即使不缓存 4,000 个令牌提示(这是一个相当大的 SQL 模式),成本也应该不到十分之一美分。所以这些节省下来的缓存根本没有任何价值!
标签:插件、项目、 sqlite 、 ai 、 sqlite-utils 、生成式 ai 、 llms 、 ai 辅助编程、 llm
原文: https://simonwillison.net/2024/Nov/25/ask-questions-of-sqlite/#atom-everything