npbreland/sqlator

使用人工智能将人类语言翻译成SQL

v1.0.0 2023-06-05 12:00 UTC

This package is not auto-updated.

Last update: 2024-09-24 16:36:37 UTC


README

一个将人类语言翻译成SQL查询的人工智能工具。将您的业务用户提升为高级用户!

安装

composer require npbreland/sqlator

概述

SQLator将用户命令或问题转换为SQL查询。以下是一个简单的示例

Question: Give me the first names of all students.
SQL: SELECT first_name FROM students

这可以使不了解SQL的业务用户能够直接查询他们所需的信息。或者,程序员可以使用SQLator来帮助他们快速确定他们需要在代码中编写的查询,或者提供一个可以修改的查询,从而提高他们的生产力。

工作原理

SQLator通过将查询发送到语言模型(包括数据库的表结构)来实现。目前,它仅支持OpenAI的聊天模型和MySQL。但我希望在将来支持其他模型和数据库。您需要从OpenAI获取API密钥。如果您还没有,您可以在他们的网站上注册API访问。

使用方法

首先,以下是如何实例化SQLator类的示例。

$SQLator = new SQLator(
    client: $client,
    open_AI_key: 'your-api-key',
    model: 'gpt-3.5-turbo', // Try GPT-4 if you can get access!
    DB_host: 'localhost',
    DB_name: 'my_db'
    DB_user: 'walter_white',
    DB_pass: 'example',
);

请参阅构造函数以获取完整的选项列表,包括启用写访问。

$client必须是一个PSR-18合规的HTTP客户端,如GuzzleSymfony的HTTP客户端这里是一份在Packagist上的列表。注意:如果您使用Laravel,它的HTTP客户端是围绕Guzzle的一个包装器,因此它将正常工作。

有两种方法可以使用SQLator。

  1. 带有执行。SQLator将从给定的查询中生成SQL并在您的数据库上运行。 注意:默认情况下,只允许读取访问(即SELECT查询),我强烈建议在生产环境中保持此设置。只有在您了解自己在做什么,并且您的最终用户也了解自己在做什么的情况下,才允许写访问。

$result = $SQLator->commandToResult('给我所有学生。');

这应该返回学生数组。

  1. 无执行。SQLator将仅返回它生成的SQL。这主要用于开发人员和数据库管理员。

$result = $SQLator->commandToSQL('给我所有学生。');

这应该返回类似以下SQL的查询

SELECT * FROM students

限制和推荐的解决方案/备用方案

模式

人工智能不是魔法,所以如果您的模式没有设置好,它的解析技能将会受到限制。为了获得最佳结果,我建议在适用的情况下设置外键,并在列上添加注释,特别是当它们的意义不直接时。这两个步骤应该有助于人工智能,就像它们会帮助人类一样。

令牌最大值

语言模型有一个最大令牌数,可以提供。GPT-3.5-turbo最多接受4,096个令牌。这意味着对于大型模式聚合,您可能会在提示中耗尽令牌。GPT-4可以处理得更多,所以如果您可以访问,请务必尝试。我计划改进这个工具来减少这个问题,可能通过缩短模式读出到只包含语言模型绝对需要的信息,以及/或者允许用户指定他们想要包含在SQLator作用域内的表。

复杂查询

SQLator即便只使用GPT-3.5-turbo也表现出惊人的强大。然而,我注意到随着查询的复杂度增加,它的可靠性会降低。您可以通过在SQLator构造函数中的$additional_prompt参数中传递有关您数据的一些额外信息来提高其解析能力。如果您有权访问GPT-4,您可能会看到它在能力上的巨大提升。

错误处理

目前,我已经定义了三种不同的异常,您可以捕获并按需处理。

OnlySelectException: 当AI将命令解析为非SELECT查询且SQLator处于只读模式时抛出。异常将包含原始用户命令和AI的响应。

NotSingleSelectStatement: 当AI将命令解析为不是单个SELECT语句且SQLator处于只读模式时抛出。这可能发生在用户查询以某种方式解析为多个查询。异常将包含原始用户命令和AI的响应。

AI_APIException: 当请求AI端点时出现ClientException时抛出。异常将包含HTTP错误代码和以JSON编码的HTTP响应体。

测试

PHPUnit作为开发依赖项包含在内,因此您可以使用它运行我编写的一套测试。要启动测试环境,请使用docker-compose up。有关详细信息,请参阅docker-compose.yml。如果您已经在默认端口上运行了某些内容,可能需要更改端口。要运行测试,您可以执行以下命令

docker exec sqlator_www ./vendor/bin/phpunit tests

这将运行sqlator_www容器中的命令,这是您需要执行的,以确保Docker网络DNS解析正常工作。

请注意,由于我们正在处理语言模型的输出,测试有时可能会失败。我已经通过降低模型设置中的“温度”来减少变量响应的可能性,但仍然可能会发生。如果您在短时间内运行测试太多,也可能收到429“请求过多”错误。我已经在测试之间添加了一个短暂的sleep来减少这种情况。

如果您愿意,可以自由地贡献更多测试。我正在使用ORM RedBeanPHP 来初始化测试数据库。

贡献

请随意贡献!您可以查看TODO.md以了解我目前考虑的内容,但如果您有其他想法,我当然欢迎!