将OpenAI API结果保存到SQLite数据库
项目描述
openai-to-sqlite
此工具提供与OpenAI API交互并将结果存储在SQLite数据库中的实用程序。
有关此项目的背景信息,请参阅语义搜索答案:使用GPT3 + OpenAI嵌入对文档进行问答。
有关使用此工具的相关内容教程,请参阅使用openai-to-sqlite和嵌入存储和提供相关文档。
安装
使用pip
安装此工具
pip install openai-to-sqlite
配置
您需要OpenAI API密钥才能使用此工具。
您可以在https://beta.openai.com/account/api-keys创建一个。
然后,您可以将API密钥设置为环境变量
export OPENAI_API_KEY=sk-...
或者使用--token sk-...
选项将API密钥传递给每个命令。
使用SQL函数调用OpenAI API
可以使用openai-to-sqlite query
命令执行调用OpenAI API的SQL查询。
可用的函数有
ChatGPT(prompt)
- 使用模型gpt-3.5-turbo
调用OpenAI Chat API,并使用指定的提示。ChatGPT(prompt, system)
- 使用提示和指定的系统提示调用该API。
未来计划添加更多函数。
以下是如何使用此命令对表中的内容执行基本情感分析的方法
openai-to-sqlite query database.db "
update messages set sentiment = chatgpt(
'Sentiment analysis for this message: ' || message ||
' - ONLY return a lowercase string from: positive, negative, neutral, unknown'
)
where sentiment not in ('positive', 'negative', 'neutral', 'unknown')
or sentiment is null
"
这将更新名为messages
的表中的sentiment
列。它使用指定的提示填充它。
命令将显示一个进度条,指示正在处理的行数。
您可以使用sqlite-utils添加一个空的sentiment
列到表,如下所示
sqlite-utils add-column database.db messages sentiment
嵌入
可以使用 embeddings
命令来计算和存储文本字符串的 OpenAI 嵌入。
每个嵌入都有一个成本,所以请务必熟悉嵌入模型的 定价。
该命令可以以四种不同的方式接受数据
- 作为包含对象列表的 JSON 文件
- 作为 CSV 文件
- 作为 TSV 文件
- 通过运行针对 SQLite 数据库的查询
对于所有这些格式,都应该有一个 id
列,后跟一个或多个文本列。
ID 将作为内容 ID 存储。任何其他列将连接在一起,用作嵌入的文本。
然后,API 的嵌入将被保存为指定 SQLite 数据库中 embeddings
表的二进制块 - 或者如果你传递了 -t/--table
选项,则为另一个表。
JSON、CSV 和 TSV
给定如下 CSV 文件
id,content
1,This is a test
2,This is another test
嵌入可以存储如下
openai-to-sqlite embeddings embeddings.db data.csv
生成的模式看起来像这样
CREATE TABLE [embeddings] (
[id] TEXT PRIMARY KEY,
[embedding] BLOB
);
相同的数据可以作为 TSV 数据提供
id content
1 This is a test
2 This is another test
然后这样导入
openai-to-sqlite embeddings embeddings.db data.tsv
或者作为 JSON 数据
[
{"id": 1, "content": "This is a test"},
{"id": 2, "content": "This is another test"}
]
这样导入
openai-to-sqlite embeddings embeddings.db data.json
在这些情况下,工具会自动检测数据的格式。它是通过检查数据本身来完成的 - 它不考虑文件扩展名。
如果自动检测不起作用,您可以传递 --format json
、csv
或 tsv
来显式指定一个格式
openai-to-sqlite embeddings embeddings.db data.tsv --format tsv
从标准输入导入数据
您可以使用 -
作为文件名将数据管道到标准输入
cat data.tsv | openai-to-sqlite embeddings embeddings.db -
SQL 查询中的数据
可以使用 --sql
选项从附加的 SQLite 数据库中读取要嵌入的数据。查询必须返回一个 id
列和一个或多个要嵌入的文本列。
openai-to-sqlite embeddings content.db \
--sql "select id, title from documents"
这将创建一个位于 content.db
数据库中的 embeddings
表,并用查询中 title
列计算出的嵌入来填充。
您还可以使用 --attach alias filename.db
选项在读取数据的同时存储嵌入到一个数据库中
openai-to-sqlite embeddings embeddings.db \
--attach documents documents.db \
--sql "select id, title from documents.documents"
使用 --sql
时会显示一个进度条,指示嵌入计算可能需要多长时间。
CSV/TSV/JSON 选项无法正确显示进度条。您可以通过首先将数据导入 SQLite(例如,使用 sqlite-utils)然后使用 --sql
运行嵌入来解决这个问题。
分批处理
嵌入将以 100 个批次的形式发送到 OpenAI 嵌入 API。如果您知道您的数据是短字符串,您可以使用 --batch-size
选项增加批大小,最多可达 2048。
openai-to-sqlite embeddings embeddings.db data.csv --batch-size 2048
处理存储的嵌入
embedding
列是一个包含 1536 个浮点数、编码为 4 字节值的序列的 SQLite 块。
您可以在 Python 中这样将它们提取回浮点数数组
import struct
vector = struct.unpack(
"f" * 1536, binary_embedding
)
使用搜索命令搜索嵌入
保存了内容嵌入后,您可以使用 search
命令进行搜索
openai-to-sqlite search embeddings.db 'this is my search term'
输出将是一个余弦相似度分数和内容 ID 的列表
openai-to-sqlite search blog.db 'cool datasette demo'
0.843 7849
0.830 8036
0.828 8195
0.826 8098
0.818 8086
0.817 8171
0.816 8121
0.815 7860
0.815 7872
0.814 8169
如果您的嵌入存储在不同的表中,请添加 -t/--table
选项
openai-to-sqlite search content.db 'this is my search term' -t documents
Add `--count 20` to retrieve 20 results (the default is 10).
使用类似命令搜索相似内容
保存了内容嵌入后,您可以使用 similar
命令搜索相似内容
oopenai-to-sqlite similar embeddings.db '<content identifier>'
输出将是一个余弦相似度分数和内容 ID 的列表
openai-to-sqlite similar embeddings-bjcp-2021.db '23G Gose'
23G Gose
1.000 23G Gose
0.929 24A Witbier
0.921 23A Berliner Weisse
0.909 05B Kölsch
0.907 01D American Wheat Beer
0.906 27 Historical Beer: Lichtenhainer
0.905 23D Lambic
0.905 10A Weissbier
0.904 04B Festbier
0.904 01B American Lager
您可以传递多个 ID 以查看为每个 ID 计算的相似度
openai-to-sqlite similar embeddings-bjcp-2021.db \
'23G Gose' '01A American Light Lager'
或者传递 --all
以运行数据库中每个项目的相似度。这将对项目数量的平方进行相似度计算,因此这可能是一个耗时很长的操作
openai-to-sqlite similar embeddings-bjcp-2021.db --all
将相似度计算保存到数据库
要将在数据库中保存这些计算到 similarities
表,请使用 --save
选项
openai-to-sqlite similar embeddings-bjcp-2021.db --all --save
--save
选项禁用了输出。您可以使用 --print
重新启用输出
openai-to-sqlite similar embeddings-bjcp-2021.db --all --save --print
要将数据保存到除 similarities
之外的数据表,请使用 --table
openai-to-sqlite similar embeddings-bjcp-2021.db \
--all --save --table my_similarities
--recalculate-for-matches
重新计算数据库中每行的相似度可能是一项相当耗时的操作。
如果您知道哪些行刚刚被添加,可以使用 --recalculate-for-matches
来加快速度。
这告诉 openai-to-sqlite similar
只为与指定行相似的行重新计算相似度。
这意味着您可以为一条或两条额外的记录添加,然后触发仅针对这些新记录以及这些新记录的二十个最近似记录的保存相似度分数的更新,如下所示
openai-to-sqlite similar embeddings-bjcp-2021.db \
--save '23G Gose' '01A American Light Lager' \
--recalculate-for-matches \
--count 20 \
--print
开发
要为此工具做出贡献,首先检出代码。然后创建一个新的虚拟环境
cd openai-to-sqlite
python -m venv venv
source venv/bin/activate
现在安装依赖项并测试依赖项
pip install -e '.[test]'
要运行测试
pytest
项目详情
下载文件
下载适合您平台的文件。如果您不确定选择哪个,请了解更多关于 安装包 的信息。