项目展示
首页 / Our Projects /Imperva 利用 Amazon Bedrock 优化自然语言的 SQL 生成 机器学习博客Imperva 利用 Amazon Bedrock 优化自然语言的 SQL 生成 机器学习博客
Imperva 利用 Amazon Bedrock 优化自然语言 SQL 生成
作者 Ori Nakar Eitan Sela Elad Eizner 2024年6月20日
在 Amazon Bedrock、客户解决方案、生成式 AI、技术如何做。
评论 分享
这是一篇与 Imperva 的 Ori Nakar 共同撰写的客座文章。
Imperva 的云 WAF 每天保护数十万网站免受网络攻击,阻止数十亿次安全事件。基于安全事件的计数和洞察数据每天都会被计算,并供来自多个部门的用户使用。每天增加数百万个计数,并且更新 2000 万个洞察数据,以识别威胁模式。
我们的目标是改善现有应用程序的用户体验,使其能够更好地探索计数和洞察数据。这些数据存储在数据湖中,并通过 SQL 使用 Amazon Athena 来检索。

作为我们解决方案的一部分,我们用一个自由文本字段替代了多个搜索字段。我们使用一个大型语言模型LLM结合查询示例,使得搜索功能能够使用 Imperva 内部用户业务分析师使用的语言进行。
以下图展示了一个被翻译为 SQL 并执行的搜索查询。结果随后由应用程序格式化为图表。我们有许多类型的洞察数据全球、行业和客户级洞察,供多个部门如市场、支持和研究使用。通过一个由 LLM 提供动力的简化用户体验,数据变得易于用户访问。
关键要点
背景 Imperva 面临用户探索数据时的便利性挑战,传统 SQL 查询方式不够灵活。解决方案 使用 LLM 和自然语言处理简化 SQL 查询生成,提高用户体验。结果 实现了高质量的 SQL 查询生成,并提升了数据访问的灵活性和可靠性。问题
通过应用程序使数据可被用户访问一直是个挑战。数据通常存储在数据库中,使用最常见的查询语言 SQL 查询。应用程序使用不同的 UI 组件让用户能够过滤和查询数据。一些应用程序具有数十种过滤器和其他选项,所有这些都是为了提高数据的可获取性。
通过应用程序查询数据库的灵活性无法与在已知模式上直接运行 SQL 查询相比。赋予用户更多权力通常意味着简单的用户体验UX要被牺牲。自然语言可以解决这个问题可以支持复杂但可读的自然语言查询,而不需要 SQL 知识。对于模式的变化,应用程序的 UX 和代码可以保持不变或仅需微小调整,这不仅节省了开发时间,还保持了应用程序用户界面的稳定性。
从自然语言构造 SQL 查询并非易事。SQL 查询在语法和逻辑上都必须准确。使用具有正确示例的 LLM 可以简化这项任务。
挑战
LLM 能够基于自然语言构建 SQL 查询,但保证质量是一大挑战。用户可以输入任意文本,而应用程序则基于此构建查询。与传统应用程序不同,没有选项可以涵盖所有可能性,确保应用程序的正确运行。将 LLM 添加到应用程序中增加了额外的复杂性。LLM 的响应不是确定性的。发送给 LLM 的示例基于数据库的数据,这使得控制发送给 LLM 的请求并确保质量变得更加困难。
解决方案:数据科学方法
在数据科学中,常开辟出一个模型并利用实验进行微调。该方法涉及使用指标在开发过程中比较实验。实验的不同之处在于多种因素,例如传送给模型的输入、模型类型和其他参数。能够比较不同的实验使得我们能够不断进步,了解每一项更改对模型的贡献。
测试集是一个静态记录集,包含每条记录的预测结果。在测试集记录上运行预测,将产生比较实验所需的指标。一常见的指标是准确率,即正确结果的百分比。
在我们的情况下,LLM 生成的结果为 SQL 语句。这些 SQL 语句并不是确定性的且难以测量,但在静态测试数据库上运行 SQL 语句是确定性的,并且可以进行测量。我们使用一个测试数据库及一组已知答案的问题作为测试集,这使得我们能够进行实验并微调基于 LLM 的应用。
使用 LLM 访问数据库:问题到答案的流程
给定一个问题,我们定义了以下流程。问题通过一个检索增强生成RAG进程发送,查找类似的文档。每个文档持有一个示例问题和相关信息。将相关文档构建为提示并发送给 LLM,后者构建一个 SQL 语句。该流程用于开发和应用程序运行时:
举个例子,考虑一个包含订单和商品两个表的数据库模式。下面的图展示了问题到 SQL 的示例流程:
使用 LLM 访问数据库:开发流程
为了开发和微调应用程序,我们创建了以下数据集:
静态测试数据库:包含相关表和数据的样本副本。测试集:包含问题及其在测试数据库上的答案。问题到 SQL 示例:一套示例问题及相应的 SQL 翻译。有些示例返回数据,以便可以提问关于数据的内容,而不仅限于模式。应用程序的开发通过添加新问题和更新不同的数据集来进行,如下图所示。
数据集和其他参数的更新会在新增问题和微调应用程序的过程中被记录。我们使用跟踪工具追踪实验信息,包括:
参数:如问题总数、示例数量、LLM 类型、RAG 搜索方法指标:如准确率和 SQL 错误率产物:如错误结果列表,包括生成的 SQL、返回的数据等借助跟踪工具,我们能够通过比较实验来取得进展。下面的图展示了不同实验的准确率和错误率指标:
当出现错误时,通过分析错误结果和实验细节,以了解错误的根源并进行修正。
使用 Amazon Bedrock 实验与部署
Amazon Bedrock 是一个托管服务,提供多种高性能基础模型供选择。您可以根据用例实验和评估顶级模型,并用您的数据进行自定义。
通过使用 Amazon Bedrock,我们能够轻松切换模型和嵌入选项。以下是使用 LangChain Python 库的示例代码,该库允许使用不同的模型和嵌入:
pythonimport boto3from langchaincommunityllmsbedrock import Bedrockfrom langchaincommunityembeddings import BedrockEmbeddings
def getllm(modelid str args dict) return Bedrock(modelid=modelid modelkwargs=args client=boto3client(bedrockruntime))
def getembeddings(modelid str) return BedrockEmbeddings(modelid=modelid client=boto3client(bedrockruntime))
我们使用了多个模型和嵌入,调试了不同的超参数,以提高准确性,并确定哪些模型最适合我们。我们还尝试在较小的模型上进行实验,以确定是否可以实现相似的质量,同时提升性能,降低成本。我们首先使用了 Anthropic Claude 21 并尝试了 Anthropic Claude 快速模型。准确性下降了 20,但经过添加几个额外示例后,我们实现了与 Claude 21 相同的准确性,同时降低了成本和响应时间。
结论
我们使用与数据科学项目相同的方法从自然语言构建 SQL 查询。该解决方案可应用于其他基于 LLM 的应用,并不仅限于构建 SQL。例如,它还可以用于 API 访问、生成 JSON 数据等。关键在于创建测试集以及利用实验来获得可度量的结果和进展。
飞兔加速器Amazon Bedrock 允许您使用不同模型并在它们之间切换,以找到适合您用例的模型。您可以比较不同的模型,包括较小的模型,以便优化性能和降低成本。由于 Amazon Bedrock 是无服务器的,您无需管理任何基础架构。我们能够迅速测试多个模型,最终将生成式 AI 功能集成并部署到我们的应用程序中。
您可以通过在 此 GitHub 存储库 中运行示例代码来开始实验自然语言到 SQL 的转换。该工作坊分为多个模块,每个模块都基于前面的模块并介绍解决该问题的新技术。许多方法都基于社区的现有工作,并进行了相应的引用。
关于作者
Ori Nakar 是 Imperva 威胁研究组的首席网络安全研究员、数据工程师和数据科学家。
Eitan Sela 是 AWS 的生成式 AI 和机器学习专业技术架构师。他与 AWS 客户合作,提供指导和技术支持,帮助他们在 AWS 上构建和运营生成式 AI 和机器学习解决方案。闲暇时,Eitan 喜欢慢跑和阅读最新的机器学习文章。
Elad Eizner 是 Amazon 网络服务的解决方案架构师。他与 AWS 企业客户合作,帮助他们在云中架构和构建解决方案,实现他们的目标。
搜索
最新内容
释放神经多样性人才的潜力 培训与认证博客
超过11000人受到Datavant泄露事件的影响 媒体
涉及Illumina iSeq 100 DNA测序仪缺陷的恶意软件注入的可能性 媒体
提升数据库性能,使用 Amazon RDS 专用日志卷 数据库博客
将 Db2 数据迁移到 Amazon RDS 的数据迁移策略 数据库博客
如何Indeed在Amazon SageMaker上构建和部署微调的LLM 机器学习博客