开源工具简化将 OpenAI API 结果存储到 SQLite 的流程,是集成 AI 应用时的实用工具
该工具提供了与 OpenAI API 交互并将结果存储到 SQLite 数据库的实用程序。
有关该项目的背景,请参阅语义搜索答案:使用 GPT3 + OpenAI embeddings 对文档进行问答。
有关使用此工具处理相关内容的教程,请参阅使用 openai-to-sqlite 和 embeddings 存储和提供相关文档。
使用 pip 安装该工具:
pip install openai-to-sqlite
使用该工具需要一个 OpenAI API 密钥。
你可以在 https://beta.openai.com/account/api-keys 创建一个。
然后你可以将 API 密钥设置为环境变量:
export OPENAI_API_KEY=sk-...
或者使用 --token sk-... 选项将其传递给每个命令。
openai-to-sqlite query 命令可用于执行调用 OpenAI API 的 SQL 查询。
可用的函数有:
chatgpt(prompt) - 使用指定的 prompt 调用 OpenAI Chat API 的 gpt-3.5-turbo 模型。
chatgpt(prompt, system) - 使用 prompt 和指定的 system prompt 调用该 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 列,并使用指定 prompt 的响应填充它。
该命令会显示一个进度条,指示正在处理多少行。
你可以使用 sqlite-utils 添加一个空的 sentiment 列到表中,如下所示:
sqlite-utils add-column database.db messages sentiment
embeddings 命令可用于计算和存储字符串文本的 OpenAI embeddings。
每个 embedding 都需要付费,所以请确保熟悉 embedding 模型的定价。
该命令可以通过四种不同的方式接受数据:
作为包含对象列表的 JSON 文件
通过针对 SQLite 数据库运行查询
对于所有这些格式,应该有一个 id 列,后面跟一个或多个文本列。
ID 将被存储为内容 ID。任何其他列将被连接在一起并用作要嵌入的文本。
API 返回的 embeddings 将被保存为指定 SQLite 数据库的 embeddings 表中的二进制 blob —— 或另一个表(如果你传递 -t/--table 选项)。
给定一个如下的 CSV 文件:
id,content
1,This is a test
2,This is another test
可以像这样存储 embeddings:
openai-to-sqlite embeddings embeddings.db data.csv
生成的 schema 如下所示:
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 选项可用于从附加的 SQLite 数据库读取要嵌入的数据。查询必须返回一个 id 列和一个或多个要嵌入的文本列。
openai-to-sqlite embeddings content.db \
--sql "select id, title from documents"
这将在 content.db 数据库中创建一个 embeddings 表,并使用从该查询中的 title 列计算的 embeddings 填充它。
你也可以将 embeddings 存储在一个数据库中,同时从另一个数据库读取数据,使用 --attach alias filename.db 选项:
openai-to-sqlite embeddings embeddings.db \
--attach documents documents.db \
--sql "select id, title from documents.documents"
使用 --sql 时会显示一个进度条,指示计算 embeddings 可能需要的时间。
CSV/TSV/JSON 选项不会正确显示进度条。你可以通过首先将数据导入 SQLite(例如使用 sqlite-utils),然后使用 --sql 运行 embeddings 来解决这个问题。
Embeddings 将分批 100 个发送到 OpenAI embeddings API。如果你知道你的数据是短字符串,你可以使用 --batch-size 选项增加批大小,最多 2048:
openai-to-sqlite embeddings embeddings.db data.csv --batch-size 2048
embedding 列是一个 SQLite blob,包含 1536 个编码为 4 字节值序列的浮点数。
你可以在 Python 中将它们提取回浮点值数组,如下所示:
import struct
vector = struct.unpack(
"f" * 1536, binary_embedding
)
保存了内容的 embeddings 后,你可以使用 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
如果你的 embeddings 存储在不同的表中,添加 -t/--table 选项:
openai-to-sqlite search content.db 'this is my search term' -t documents
使用 --count 20 来检索 20 个结果(默认是 10)。
保存了内容的 embeddings 后,你可以使用 similar 命令搜索相似内容:
openai-to-sqlite similar embeddings.db ''
输出将是余弦相似度分数和内容 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
要保存到名称不同的数据库表,使用 --table:
openai-to-sqlite similar embeddings-bjcp-2021.db \
--all --save --table my_similarities
为数据库中的每一行重新计算相似度可能是一个相当冗长的操作。
如果你知道哪些行刚刚被添加,你可以使用 --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