elastic/elasticsearch-ChatGPT-php

Elasticsearch ChatGPT for PHP

0.1.0 2023-05-16 05:45 UTC

This package is auto-updated.

Last update: 2024-09-09 06:41:38 UTC


README

这是一个用于在 ChatGPT 中进行搜索的 实验性库,适用于 Elasticsearch

该库公开了一个 search(string $index, string $prompt) 函数,用于使用自然语言在 Elasticsearch 中进行搜索。参数为:$index,其中指定要搜索的索引名称,以及 $prompt,即用自然语言指定的查询。

例如,提示可以是 给我所有前10个文档返回字段名的所有不同值

该库的工作原理

该库使用 ChatGPT 将用自然语言表达的查询翻译成 Elasticsearch DSL 查询。

然后,使用 elasticsearch-php 库在 Elasticsearch 中执行翻译后的查询。

使用 ChatGPT

要使用 ChatGPT,您需要从 OpenAI 获取一个 API 密钥。此 API 密钥仅对付费用户可用。您可以在此处了解如何激活 ChatGPT Plus 账户的更多信息

使用 Elasticsearch

您需要运行一个 Elasticsearch 服务器或使用 Elastic Cloud

您可以在以下链接中了解如何使用 Docker 或使用 Elastic Cloud 环境启动服务器:这里

库的使用示例

以下是一个示例,您也可以在 examples/test.php 脚本中找到。

要执行 test.php 脚本,您需要使用以下命令使用 composer 安装依赖项

composer install

然后,您需要设置用于使用 OpenAI 和 Elasticsearch 的环境变量。以下示例中使用了以下环境变量

  • OPENAI_API_KEY,用于 OpenAI API 密钥;
  • ELASTIC_CLOUD_ENDPOINT,包含 Elastic Cloud 的 URL 端点;
  • ELASTIC_CLOUD_API_KEY,包含 Elastic Cloud 的 API 密钥。

如果您想连接到不同的 Elasticsearch 服务器,可以阅读 elasticsearch-php 文档中的 连接部分

test.php 脚本包含以下代码

use Elastic\Elasticsearch\ChatGPT\ChatGPT;
use Elastic\Elasticsearch\ClientBuilder;

// Openai-php/client library 
$openAI = OpenAI::client(getenv("OPENAI_API_KEY"));

// Connecting to Elasticsearch using Elastic Cloud
$elasticsearch = ClientBuilder::create()
    ->setHosts([getenv("ELASTIC_CLOUD_ENDPOINT")])
    ->setApiKey(getenv("ELASTIC_CLOUD_API_KEY"))
    ->build();

$chatGPT = new ChatGPT($elasticsearch, $openAI);
$result = $chatGPT->search('stocks', 'Return the first 10 documents of 2017');

// Print the Elasticsearch result
print_r($result->asArray());

// Print the Elasticsearch DSL used for the query
print($chatGPT->getLastQuery());

搜索函数是此代码的关键点。在此示例中,我们使用了一个包含 500 家福布斯公司 5 年股价数据的 股票价格数据集,从 2013 年 2 月开始。

数据集具有以下映射

{
    "stocks": {
        "mappings": {
            "properties": {
                "close": {"type":"float"},
                "date" : {"type":"date"},
                "high" : {"type":"float"},
                "low"  : {"type":"float"},
                "name" : {
                    "type": "text",
                    "fields": {
                        "keyword":{"type":"keyword", "ignore_above":256}
                    }
                },
                "open"  : {"type":"float"},
                "volume": {"type":"long"}
            }
        }
    }
}

使用缓存

默认情况下,该库使用一个基于存储在 cache 文件夹中的文件的缓存系统。每次库请求将映射发送到 Elasticsearch 或将提示发送到 ChatGPT 时,它都会将结果存储在文件中。对于映射,库使用索引的名称。对于 ChatGPT 生成的 Elasticsearch DSL,我们使用提示请求的 MD5 值作为文件名。

如果您想禁用缓存,例如您更改了索引映射,您可以在search()函数的第三个可选参数中传递$cache = false

多语言支持

ChatGPT的一个非常棒的特性是能够使用不同的语言指定问题。这意味着,您可以使用这个库并指定不同自然语言的问题,比如意大利语、西班牙语、法语、德语等。

以下是一个示例

# English
$result = $chatGPT->search('stocks', 'Return the first 10 documents of 2017');
# Italian
$result = $chatGPT->search('stocks', 'Restituisci i primi 10 documenti del 2017');
# Spanish
$result = $chatGPT->search('stocks', 'Devuelve los 10 primeros documentos de 2017');
# French
$result = $chatGPT->search('stocks', 'Retourner les 10 premiers documents de 2017');
# German
$result = $chatGPT->search('stocks', 'Senden Sie die ersten 10 Dokumente des Jahres 2017 zurück');

所有之前的搜索都产生以下类似(或多或少)的Elasticsearch查询结果

{"size":10,"query":{"range":{"date":{"gte":"2017-01-01","lt":"2018-01-01"}}}}

有关更多信息,请参阅examples/multilanguage.php脚本。

注意:重要的是要知道,ChatGPT是一个针对英语进行了优化的LLM。这意味着,使用英语输入的查询可以获得最佳结果。

限制

由于ChatGPT是一个LLM模型,它**不保证**从语义角度的回答是正确的。这意味着您可能会使用这个库得到无效的结果,这意味着在Elasticsearch DSL查询中可能没有有效的翻译。您应该始终使用getLastQuery()函数检查ChatGPT翻译的DSL查询。因此,我们建议**不要在生产环境中使用这个库**。

免责声明

请参见此Elastic博客文章中的完整文档。elastic/elasticsearch-chatgt-php是Elastic Labs项目。Elastic Labs项目仅用于说明和实验目的。此Elastic Labs项目不属于任何产品或服务提供或支持的商业许可或订阅。该项目根据与此项目关联的许可证提供。任何描述中的功能或功能的发布和时机由Elastic自行决定。可能无法及时或根本不提供目前尚不可用的功能或功能。

许可证

elasticsearch-ChatGPT-php在Apache 2.0许可证下可用。有关更多详细信息,请参阅LICENSE