用于调用 OpenAI API 的 SQL 函数
请参阅 语义搜索问答:使用 GPT3 + OpenAI embedding 对文档进行问答,了解有关此项目的背景信息。
在与 Datasette 相同的环境中安装此插件。
datasette install datasette-openai
此插件允许您使用 SQL 查询调用商业收费 API。
请谨慎使用!您可能会不小心花费很多钱。
例如,以下查询
select
openai_davinci(
'Summarize this text: ' || content, 200, 1, :api_key
) as summary
from documents
将对 documents
数据库中的每个条目执行一次付费 API 调用。这可能会变得非常昂贵。
请务必熟悉 OpenAI 定价。您将需要获取一个 API 密钥。
此扩展提供了三个新的 SQL 函数
此函数对提供的 prompt 运行 text-davinci-003
完成,并使用指定的 max tokens 和 temperature 值。
Da Vinci 目前每千个 token 收费 2 美分。
这将调用 OpenAI embedding 端点,并返回一个二进制对象,表示所提供文本的浮点 embedding。
select openai_embedding(:query, :api_key)
embedding 是一个包含 1536 个浮点值的数组。此函数返回的值是这些值的 blob
编码。
它主要用于与 openai_embedding_similarity()
函数一起使用。
embedding API 非常便宜:撰写本文时,每千个 token 收费 0.0004 美分,其中 token 大致相当于一个单词。
此函数不进行任何 API 调用。它接受两个 embedding blob,并返回两者之间的余弦相似度。
如果您在数据库表中存储了文档的 embedding,并且想要查找与某个查询或另一个文档最相似的文档,此函数特别有用。
一个简单的搜索查询可能如下所示
with query as (
select
openai_embedding(:query, :token) as q
)
select
id,
title,
openai_embedding_similarity(query.q, embedding) as score
from
content, query
order by
score desc
limit 10
此聚合函数有助于从多个输入构建一个符合 GPT-3 prompt 大小限制的 prompt。
它接受以下参数
text
- 这是被聚合的列,因此函数期望为此有多个值。所有其他参数只会在首次传递时读取,因此在对函数的所有调用中应保持一致。prefix
- 用作 prompt 前缀的文本suffix
- 用作 prompt 后缀的文本completion_tokens
- 为 prompt 响应保留的 token 数量 - 这将从 token 限制中减去token_limit
- 此值为可选(该函数注册了 4 参数和 5 参数版本)。它默认为 GPT-3 Da Vinci 的大小限制 4,000 个 token,但如果使用的模型具有不同的限制,则可以更改此值。
以下是此函数的一个示例用法,改编自 这篇文章
with top_n as (
select body from blog_entry order by id desc limit 3
)
select openai_build_prompt(body, 'Context:
------------
', '
------------
Given the above context, answer the following question: ' || :question,
500,
2000
) from top_n
此查询首先检索最近的三篇博客文章,然后使用提供的 prefix 和 suffix 构建一个 prompt,该 prompt 设计为适合 1500 个 token(总共 2000 个,减去为响应保留的 500 个)。
输出如下所示(为节省空间已截断)
Context:
------------
< p > If you 've spent any time with GPT - 3 or ChatGPT , you 've likely thought about how ...
I release Datasette 0 . 64 this morning . This release is mainly a response to the realization that it 's not safe to run Datasette with the SpatiaLite extension loaded if that Datasette instance is configured to enable arbitrary SQL queries from untrusted users ...
In lieu of my regular weeknotes ( I took two weeks off for the holidays ) here 's a look back at 2022 , mainly in terms of projects and things I 've written about ...
------------
Given the above context, answer the following question: Examples of a language model?
每篇文章的正文都被截断,以使其 token 数允许将所有三篇文章的示例包含在生成的 prompt 中。
有时从文本中去除 HTML 标签以减少使用的 token 数量可能很有用。此函数执行非常简单的标签去除操作 - 只删除任何匹配 <...>
的内容。
返回所提供文本的 JSON 数组形式的 token。
这使用了从 OpenAI GPT-2 中提取的正则表达式。
返回所提供文本中的 token 数量计数。
要在本地设置此插件,请先检出代码。然后创建一个新的虚拟环境
cd datasette-openai
python3 -m venv venv
source venv/bin/activate
现在安装依赖项和测试依赖项
pip install -e '.[test]'
运行测试
pytest