跳转到主要内容

调用OpenAI API的SQL函数

项目描述

datasette-openai

PyPI Changelog Tests License

调用OpenAI API的SQL函数

有关此项目的背景信息,请参阅语义搜索答案:使用GPT3 + OpenAI嵌入对文档进行问答

安装

在此环境中安装此插件,与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函数

openai_davinci(prompt, max_tokens, temperature, api_key)

此函数使用指定的最大标记数和温度值运行对提供的提示的text-davinci-003完成。

Da Vinci当前为每千个标记2美分。

openai_embedding(text, api_key)

此调用OpenAI嵌入端点,并返回表示提供的文本的浮点嵌入的二进制对象。

select openai_embedding(:query, :api_key)

嵌入是一个包含1536个浮点值的数组。此返回值是这些值的blob编码。

主要用于与openai_embedding_similarity()函数一起使用。

嵌入API非常便宜:在撰写本文时,每千个标记0.0004美分,其中标记大致是一个单词。

openai_embedding_similarity(a, b)

此函数不进行任何API调用。它接受两个嵌入blob,并返回两个之间的余弦相似度。

该函数特别有用,如果您已将文档嵌入存储在数据库表中,并且想要找到与查询或另一文档最相似的文档。

一个简单的搜索查询可能如下所示

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

openai_build_prompt(text, prefix, suffix, completion_tokens, token_limit=4000)

此聚合函数有助于以符合GPT-3提示大小限制的方式从多个输入中构建提示。

它接受以下参数

  • text - 这是要聚合的列,因此该函数期望对此列有多个值。所有其他参数将只在第一次传递时读取,因此应在所有函数调用中保持一致。
  • prefix - 用于提示前缀的文本
  • suffix - 用于提示后缀的文本
  • completion_tokens - 预留用于提示响应的标记数 - 这将从标记限制中减去
  • token_limit - 此值是可选的(函数已注册4个参数版本和5个参数版本)。默认为GPT-3 Da Vinci的4,000个标记限制,但如果与提示一起使用的模型具有不同的大小限制,则可以更改。

以下是一个该函数的示例用法,改编自这篇文章

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

在此尝试.

此查询首先检索最近的三个博客条目,然后构建一个带有提供的提示前缀和后缀的提示,以适应1500个标记(总计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?

每个条目的正文已截断到允许所有三个条目的示例包含在生成的提示中的标记数。

openai_strip_tags(text)

有时从文本中删除HTML标签可能很有用,以减少使用的标记数。此函数执行非常简单的标签删除版本 - 只删除任何匹配<...>的内容。

openai_tokenize(text)

返回包含提供文本的标记的JSON数组。

它使用从OpenAI的GPT-2中提取的正则表达式

openai_count_tokens(text)

返回提供的文本中的标记数。

开发

要本地设置此插件,首先检出代码。然后创建一个新的虚拟环境

cd datasette-openai
python3 -m venv venv
source venv/bin/activate

现在安装依赖关系和测试依赖关系

pip install -e '.[test]'

要运行测试

pytest

项目详细信息


下载文件

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

源分发

datasette-openai-0.2.tar.gz (9.5 kB 查看哈希值)

上传时间

构建分发

datasette_openai-0.2-py3-none-any.whl (10.0 kB 查看哈希值)

上传时间 Python 3

支持

AWSAWS云计算和安全赞助商DatadogDatadog监控FastlyFastlyCDNGoogleGoogle下载分析MicrosoftMicrosoftPSF赞助商PingdomPingdom监控SentrySentry错误日志StatusPageStatusPage状态页面