跳转到主要内容

将OpenAI API结果保存到SQLite数据库

项目描述

openai-to-sqlite

PyPI Changelog Tests License

此工具提供与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 jsoncsvtsv 来显式指定一个格式

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

项目详情


下载文件

下载适合您平台的文件。如果您不确定选择哪个,请了解更多关于 安装包 的信息。

源分布

openai_to_sqlite-0.4.2.tar.gz (19.3 kB 查看哈希)

上传时间

构建分布

openai_to_sqlite-0.4.2-py3-none-any.whl (14.3 kB 查看哈希)

上传时间 Python 3

支持者

AWS AWS 云计算和安全赞助商 Datadog Datadog 监控 Fastly Fastly CDN Google Google 下载分析 Microsoft Microsoft PSF 赞助商 Pingdom Pingdom 监控 Sentry Sentry 错误日志 StatusPage StatusPage 状态页面