综合介绍
SQLite-Utils-Ask 是一个强大的工具,旨在通过LLM(大语言模型)的辅助,帮助用户对SQLite数据库和CSV/JSON文件进行问答式数据查询。该工具能够根据用户的问题自动生成适当的SQL查询,并执行查询以返回结果,极大地简化了数据分析和处理的过程。
功能列表
- 自然语言提问:通过自然语言提问数据库中的数据,工具会自动生成相应的SQL查询。
- 数据库兼容:支持SQLite数据库,方便用户进行数据管理和查询。
- 处理CSV/JSON文件:支持直接对CSV、TSV或JSON文件进行查询。
- 多文件查询:支持对多个文件进行联合查询。
- 命令行工具:提供简单易用的命令行界面,用户可以快速执行查询。
- 插件支持:可以与sqlite-utils等工具集成,扩展功能和应用场景。
在终端中询问有关 SQLite 数据库和 CSV/JSON 文件的问题
我为我的sqlite-utils CLI 工具构建了一个新插件,让您可以直接向计算机上的 SQLite 数据库和 CSV/JSON 文件询问人类语言问题。
它的名字是sqlite-utils-ask。安装方法如下:
sqlite-utils 安装 sqlite-utils-ask
它从环境变量中获取 API 密钥OPENAI_API_KEY
,或者您可以安装 LLM并使用llm keys set openai将密钥存储在配置文件中。
然后你可以像这样使用它:
curl -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 查询执行失败(由于某种语法错误),它会将该错误传回模型进行更正,并在放弃之前重试最多三次。
添加-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?
我已将上述内容截断为仅包含相关表 - 它实际上包含了该数据库中每个表的完整模式。
默认情况下,该工具只会将该数据库架构和您的问题发送给 LLM。如果您添加该`-e/--examples`选项,它还将为该架构中的每个文本列包含五个公共值,平均长度小于 32 个字符。这有时可以帮助获得更好的结果,例如,为`state`列发送值“CA”和“FL”和“TX”可以提示模型应该在查询中使用州缩写而不是全名。
#### 询问 CSV 和 JSON 数据的问题
核心`sqlite-utils`CLI 通常直接针对 SQLite 文件运行,但三年前我添加了使用[sqlite-utils memory](https://simonwillison.net/2021/Jun/19/sqlite-utils-memory/)命令直接针对 CSV 和 JSON 文件运行 SQL 查询的功能。其工作原理是在执行 SQL 查询之前将数据加载到内存 SQLite 数据库中。
我决定重用该机制来直接针对 CSV 和 JSON 数据启用 LLM 提示。
该`sqlite-utils ask-files`命令如下所示:
```shell
sqlite-utils ask-files transaction.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 架构),成本也应该不到十分之一美分。所以这些缓存节省根本就不值一提!