npbreland / sqlator
使用人工智能将人类语言翻译成SQL
Requires
- phpmyadmin/sql-parser: ^5.7
- psr/http-client: ^1.0.2
- tectalic/openai: ^1.4
Requires (Dev)
- fakerphp/faker: ^1.22
- gabordemooij/redbean: ^5.7
- guzzlehttp/guzzle: ^7.7
- php-http/mock-client: ^1.6
- phpunit/phpunit: ^10.1
- vlucas/phpdotenv: ^5.5
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客户端,如Guzzle或Symfony的HTTP客户端。 这里是一份在Packagist上的列表。注意:如果您使用Laravel,它的HTTP客户端是围绕Guzzle的一个包装器,因此它将正常工作。
有两种方法可以使用SQLator。
- 带有执行。SQLator将从给定的查询中生成SQL并在您的数据库上运行。 注意:默认情况下,只允许读取访问(即SELECT查询),我强烈建议在生产环境中保持此设置。只有在您了解自己在做什么,并且您的最终用户也了解自己在做什么的情况下,才允许写访问。
$result = $SQLator->commandToResult('给我所有学生。');
这应该返回学生数组。
- 无执行。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以了解我目前考虑的内容,但如果您有其他想法,我当然欢迎!