elastic / elasticsearch-ChatGPT-php
Elasticsearch ChatGPT for PHP
Requires
- php: ^8.0
- elasticsearch/elasticsearch: ^8.7
- openai-php/client: ^0.4.2
Requires (Dev)
- dg/bypass-finals: ^1.4
- phpstan/phpstan: ^1.10
- phpunit/phpunit: ^10.1
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。