当前位置: 首页 > news >正文

数据质量转型:自动化 SQL 测试以实现更快速、更智能的分析

原文:towardsdatascience.com/transforming-data-quality-automating-sql-testing-for-faster-smarter-analytics-6da431493570?source=collection_archive---------0-----------------------#2024-10-26

如何测试 SQL 和结果数据集的质量,以回答业务问题并增加客户信任

https://medium.com/@hello.akashm?source=post_page---byline--6da431493570--------------------------------https://towardsdatascience.com/?source=post_page---byline--6da431493570-------------------------------- Akash Mukherjee

·发表于Towards Data Science ·阅读时长 11 分钟·2024 年 10 月 26 日

https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/4436d79ec654db529fca075e12919af5.png

图片由Caspar Camille Rubin提供,来自Unsplash

在软件开发中,有许多自动化测试工具和框架可以依赖。但是对于分析团队来说,手动测试和数据质量保证(QA)仍然是常态。许多时候,是客户或业务团队首先发现数据质量或完整性的问题,而不是分析团队。

这就是自动化能够产生巨大影响的地方。通过建立一个自动化系统,使用脚本在大规模上运行数据质量测试,你可以保持工作高效而不牺牲数据的准确性或完整性。

当然,当业务问题模糊或开放性时,情况会变得更加复杂。在这种情况下,规则基础逻辑与大语言模型(LLM)的结合可以提供极大帮助——让你生成场景并运行自动化检查。在本教程中,我们将展示如何构建一个自动化测试系统,用来评估和评分数据和 SQL 查询的质量,即使业务问题是以简单的英文表达的。

在我们开始之前,你需要具备的知识

要跟随本教程,请确保你具备以下内容:

设计系统架构

为了构建一个自动化 QA 系统来评估 SQL 查询,架构必须集成基于规则的逻辑、LLM 验证和自动评分。这个设置非常适合处理那些开放式的业务问题,帮助您将测试从手动过程扩展到自动化。

关键组件包括:

该架构包括一个反馈回路,记录问题类型——例如缺失数据、错误粒度或性能缓慢等。这些信息将存储在一个集中式数据库中,以便您可以随时间持续优化系统。我们将使用 Python 进行脚本编写,使用 SQL 跟踪后端问题,使用 OpenAI 的 LLM 解读自然语言输入。通过定期安排这些测试的运行,您将保持一致的数据质量和可扩展性,同时微调查询性能,以与商业目标对齐。

下图展示了数据如何流经系统——从 SQL 摄取到自动化测试、评分和问题跟踪——以便在大规模下保持高数据质量。

最终,这个系统不仅仅是发现错误——它推动持续改进,并使您的技术执行与业务目标保持一致。

https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/64922a96612de5060deab240c1c68a64.png

作者提供的图像:用来说明技术架构的图示

教程

第 1 步:准备测试问题与答案数据集

要开始,收集内部团队或客户经常向分析团队提出的真实业务问题。许多问题可能是临时的数据请求,因此通过准备多种问题,您可以确保测试具有相关性。以下是一些例子,帮助您入手:

第 2 步:构建您的评估与评分标准

2a:定义您的评分员

为了进行彻底的测试,从不同角度设置评分员,以确保覆盖所有方面:

2b:定义评分标准

每个评分员应根据特定因素来评估查询:

2c:跟踪和记录问题类型

为了涵盖所有方面,记录查询执行过程中常见的问题非常重要。这样可以更容易地标记并运行自动化评估。

importopenaiimportjson# Set your OpenAI API key hereopenai.api_key='your-openai-api-key'defevaluate_sql_query(question,query,results):# Define the prompt with placeholders for question, query, and resultsprompt=f""" As an external observer, evaluate the SQL query and results against the client's question. Provide an assessment from three perspectives: 1\. End User 2\. Data Scientist 3\. Business Leader For each role, provide: 1\. **Overall Score** (0-10) 2\. **Criteria Scores** (0-10): - Accuracy: How well does it meet the question? - Relevance: Is all needed data included, and is irrelevant data excluded? - Logic: Does the query make sense? - Efficiency: Is it concise and free of unnecessary complexity? 3\. **Issue Tags** (2D array: ['tag', 'details']): - Examples: Wrong Granularity, Excessive Columns, Missing Data, Incorrect Values, Wrong Filters, Performance Issues. 4\. **Other Observations** (2D array: ['tag', 'details']) Client Question:{question}SQL Query:{query}SQL Results:{results}Respond ONLY in this format: ```json {{ "endUser": {{"overallScore": "", "criteriaScores": {{"accuracy": "", "relevance": "", "logic": "", "efficiency": ""}}, "issueTags": [], "otherObservations": []}}, "dataScientist": {{"overallScore": "", "criteriaScores": {{"accuracy": "", "relevance": "", "logic": "", "efficiency": ""}}, "issueTags": [], "otherObservations": []}}, "businessLeader": {{"overallScore": "", "criteriaScores": {{"accuracy": "", "relevance": "", "logic": "", "efficiency": ""}}, "issueTags": [], "otherObservations": []}} }} ```py """# Call the OpenAI API with the promptresponse=openai.Completion.create(engine="gpt-4",# or whichever model you're usingprompt=prompt,max_tokens=500,# Adjust token size based on expected response lengthtemperature=0# Set temperature to 0 for more deterministic results)# Parse and return the resultreturnjson.loads(response['choices'][0]['text'])# Example usagequestion="How many Pro Plan users converted from trial?"query="SELECT COUNT(*) FROM users WHERE plan = 'Pro' AND status = 'Converted' AND source = 'Trial';"results="250"evaluation=evaluate_sql_query(question,query,results)print(json.dumps(evaluation,indent=4))

第 3 步:自动化测试

3a:遍历问题

一旦收集了业务问题,设置一个循环,将每个问题、相关的 SQL 查询以及结果传递到评估函数中。这让你能够自动化整个评估过程,确保每个查询都得到一致的评分。

3b:安排定期运行

通过定期调度脚本运行来自动化测试过程——理想情况下,在每次数据刷新或查询更新后运行。这保持测试与数据同步,能够在问题出现时及时捕捉。

3c:在数据库中记录得分、标签和观察结果

对于每次测试运行,在结构化数据库中记录所有得分、问题标签和观察结果。使用 Python 脚本将相关数据填充到表格(例如,issue_catalog)中。这为你提供了评估历史记录,以便跟踪趋势、找出常见问题,并优化未来的测试。

第 4 步:报告测试结果

4a:按得分进行透视和分组

利用 SQL 查询或 BI 工具创建透视表,根据总体得分和具体标准(如准确性、相关性、逻辑性和效率)对结果进行分组。这有助于你发现性能趋势,找出哪些方面需要更多关注。

为了计算每个查询在所有评分员中的总体得分,可以使用加权公式:

总得分 = w1​×准确性 + w2​×相关性 + w3​×逻辑性 + w4​×效率

其中 w1​、w2​、w3​、w4​ 是分配给每个评分标准的权重。这些权重的总和应为 1,以便进行归一化。

例如,你可以根据数据科学家的优先级赋予准确性更高的权重,而根据业务领导的优先级赋予相关性更高的权重。

4b: 突出显示主要问题

确定最频繁和最关键的问题——比如缺失数据错误的粒度性能低效。提供一份详细报告,列出这些问题发生的频率以及哪些类型的查询最受影响。

专注于如果不加以解决可能会导致更大错误的模式。例如,突出显示可能因为数据质量问题而扭曲决策或减缓业务流程的情况。

优先处理需要立即采取行动的问题,例如那些影响查询性能或关键数据集准确性的问题,并列出明确的后续步骤以解决它们。

https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/b2484b2780ed989ca27648b77d518b00.png

作者提供的图像:使用示例测试数据创建的图表

4c: 分析评分者的方差

仔细查看不同评分者(终端用户、数据科学家、业务领导)评分之间的差异。较大的差异可能揭示出技术执行和业务目标之间的潜在错位。

例如,如果某个查询在技术准确性上得分较高,但在与业务问题的相关性上得分较低,这表明在将数据洞察转化为可操作结果时存在差距。类似地,如果终端用户认为结果难以理解,而数据科学家认为它们在技术上是正确的,这可能指向沟通或呈现方面的问题。

通过追踪这些差异,你可以更好地将分析过程与技术精度和商业价值对齐,从而保持所有利益相关者的满意。

为了量化这种差异,你可以计算评分者评分的方差。首先,定义各个评分为:

三个评分者的平均分μ可以按如下公式计算:

μ = (S-EndUser​ + S-DataScientist​ + S-BusinessLeader​​) / 3

接下来,计算方差σ²,这是每个评分者的评分与平均评分之间的平方差的平均值。方差的公式是:

σ²= (S-EndUser − μ)²+ (S-DataScientist − μ)**² + (S-BusinessLeader − μ)**² / 3

通过计算这种方差,你可以客观地衡量评分者的评分差异。

大的差异表明一个或多个评分者对查询质量或相关性的看法不同,这可能意味着技术输出与业务需求之间需要更好的对齐。

步骤 5:创建反馈循环

5a: 确定关键问题

在整个测试过程中,你很可能会发现一些问题反复出现。它们可能包括缺失的数据错误的值错误的粒度性能低效等问题。重要的是不仅要记录这些问题,还要对它们进行分类和优先级排序。

例如,如果缺少关键数据,应该立即解决,而性能优化可以视为长期的优化任务。通过专注于最有影响力和重复出现的问题,你将能够有效改善数据质量并更好地解决根本原因。

5b:优化你的 SQL 查询

现在,你已经识别出重复出现的问题,是时候更新 SQL 查询来解决它们了。这涉及到优化查询逻辑,以实现准确的连接、筛选和聚合。例如:

目标是在此过程中,将你记录的反馈转化为 SQL 代码的实际改进,使你未来的查询更加精准、相关且高效。

5c:重新测试以验证结果

一旦你的查询得到优化,重新运行测试以验证改进效果。自动化这个步骤确保你更新后的查询始终与新的数据或业务问题进行评估。再次运行测试可以确认你的修改已解决问题并提高了整体数据质量。它还可以帮助确认你的 SQL 查询完全符合业务需求,从而能够更快速和准确地获得洞察。如果出现新的问题,只需将其反馈到循环中,持续改进。

自动化反馈循环的示例代码

为了自动化这个反馈循环,这里有一个 Python 脚本,可以处理多个测试用例(包括业务问题、SQL 查询和结果),通过 OpenAI 的 API 评估这些用例,并将结果存储到数据库中:

forquestion,query,resultsintest_cases:# Call the OpenAI API to evaluate the SQL query and resultsresponse=openai.Completion.create(engine="text-davinci-003",# Replace with GPT-4 or relevant engineprompt=prompt.format(question=question,query=query,results=results),max_tokens=1000)# Process and store the responseprocess_response(response)defstore_results_in_db(test_run_id,question,role,scores,issue_tags,observations):# SQL insert query to store evaluation results in the issue cataloginsert_query=""" INSERT INTO issue_catalog (test_run_id, question, role, overall_score, accuracy_score, relevance_score, logic_score, efficiency_score, issue_tags, other_observations) VALUES (%s, %s, %s, %s, %s, %s, %s, %s, %s, %s); """db_cursor.execute(insert_query,(test_run_id,question,role,scores['overall'],scores['accuracy'],scores['relevance'],scores['logic'],scores['efficiency'],json.dumps(issue_tags),json.dumps(observations)))db_conn.commit()

设置问题目录表

issue_catalog表作为存储详细测试结果的主要库,帮助你清晰地跟踪查询性能并标记长期存在的问题。通过使用 JSONB 格式存储问题标签和观察结果,你可以获得更大的灵活性,允许你记录复杂信息,而无需频繁更新数据库架构。以下是设置的 SQL 代码:

CREATE TABLE issue_catalog(idSERIAL PRIMARY KEY,test_run_id INT NOT NULL,question TEXT NOT NULL,role TEXT NOT NULL,--e.g.,endUser,dataScientist,businessLeader overall_score INT NOT NULL,accuracy_score INT NOT NULL,relevance_score INT NOT NULL,logic_score INT NOT NULL,efficiency_score INT NOT NULL,issue_tags JSONB,--Storing issue tagsasJSONforflexibility other_observations JSONB,--Storing other observationsasJSON created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP);

这个反馈循环的目的

  1. 持续改进:通过跟踪问题,随着时间的推移,你将能够细化 SQL 查询,并稳步提高其质量。每次测试运行都会提供可操作的洞察,通过针对最常见的问题,你的系统会随着每次运行变得更高效和更具弹性。

  2. 数据质量保证:定期对更新的 SQL 查询进行测试,帮助你验证它们是否正确处理新数据和测试用例。这个持续的过程展示了你的调整是否真正提高了数据质量,并保持与业务需求的一致性,从而降低未来问题的风险。

  3. 与业务需求的一致性:根据提出问题的人进行排序——无论是终端用户、数据科学家还是业务领导者——都能让你专注于对技术准确性和业务相关性都有重要意义的改进。随着时间的推移,这将建立一个技术努力直接支持有意义的业务洞察的系统。

  4. 可扩展的测试和优化:这种方法在增加更多测试用例时能够平滑扩展。随着问题目录的扩展,模式逐渐显现,使得微调影响广泛业务问题的查询变得更加容易。随着每次迭代,你的测试框架变得更强大,推动数据质量在大规模上的持续改善。

总结

自动化 SQL 测试是分析团队的游戏规则改变者,它帮助他们早期发现数据问题并精确地解决它们。通过建立一个结合规则逻辑和大语言模型(LLM)的结构化反馈循环,你可以扩展测试,处理即使是最复杂的业务问题。

这种方法不仅提高了数据的准确性,而且使你的洞察与业务目标保持一致。分析的未来依赖于自动化与洞察之间的平衡——你准备好迈出这一步吗?

http://www.jsqmd.com/news/946817/

相关文章:

  • 有序Logistic回归实战:用SPSSAU分析‘幸福度’影响因素,附完整数据与代码(可下载)
  • Python做数据预测:你的数据到底是不是时序数据?
  • 避开这些坑!三菱FX3U软元件实战配置中的5个常见误区与解决方案
  • 从“撒豆子”到“绑架营救”:用生活例子彻底搞懂AMCL粒子滤波
  • 别再只盯着Transformer了!聊聊被低估的CNN:BiTCN如何用‘膨胀卷积’搞定时间序列预测?
  • 实测对比:Houdini、QEMU、原生,谁才是Android跨架构运行效率之王?附p7zip详细跑分数据
  • 告别驱动烦恼:深入理解EZ-USB FX3 SDK安装目录结构与驱动加载原理
  • 保姆级教程:给Nginx 1.25.4装上VTS模块,再用Prometheus和Grafana实现监控大屏
  • 从正则表达式到状态机:构建健壮的Recognizer类实现数据识别与解析
  • MATLAB版头脑风暴算法求解带时间窗的取送货一体化车辆路径问题
  • 信号与系统期末救急:单边拉普拉斯变换这6个性质,背会就能拿分
  • 别再复制粘贴了!用ROS2 xacro宏定义,5分钟搞定差速机器人建模(附完整代码)
  • STM32CubeMX配置SDIO读写SD卡,我踩过的那些坑(F407+轮询/中断/DMA全解析)
  • 【2027最新】基于SpringBoot+Vue的乐享田园系统管理系统源码+MyBatis+MySQL
  • 移动系统演进:边缘智能、云网融合与移动感知的未来趋势
  • 微软SWAN:软件定义广域网如何重塑全球云网络流量调度
  • SpikGPT:单细胞注释的Transformer与脉冲神经网络融合框架
  • 微软研究院博士暑期学校:学术交流与职业发展的精英集训模式解析
  • GPT-5.5 Ultra工程化落地:从芯片编译到电力协同的端到端部署指南
  • 别再瞎调时序了!手把手教你用DC NXT TOPO模式搞定物理综合,从floorplan到compile_ultra全流程避坑
  • AI与BI系统割裂之痛,深度解构3层融合架构与实时决策闭环构建法
  • 深入I3C核心:动态地址分配中的48位临时ID与仲裁机制全解析
  • Android工控设备以太网配置实战:用反射调用EthernetManager搞定静态/动态IP(附完整工具类)
  • 3分钟搭建你的专属待办系统:跨平台桌面待办事项管理工具终极指南
  • Grok在AI女友应用中的真实技术定位与工程实践
  • ASP.NET Core 中的重定向(Redirect)深度解析
  • FPGA图像处理第一步:避开BMP文件读写的那些坑(Verilog/SystemVerilog实战)
  • 用TM1637四位数码管做个桌面小时钟:Arduino和STM32代码对比与选型建议
  • 告别pip install失败!手把手教你搞定Python Click的离线安装(附国内镜像源清单)
  • 别再傻傻分不清!手把手教你用示波器实测开关电源纹波与噪声(附实战波形分析)