很高兴再次见到我的QA朋友们!如果您一直关注我,您就会知道,在我的上一篇文章中,我们探索了构建基于Excel的简单QA指标表的旅程,并将其演变成一个更具扩展性的自动化框架来评估质量。现在,这是第二部分,我们将继续深入研究该主题的核心部分:即如何将我们的QA指标框架转变为AI(人工智能)驱动的自动化QA指标框架。
这篇文章完全专注于我们如何将AI集成到QA指标框架中,同时改变我们解释和处理QA数据的方式。通过整合AI 来构建深层次的洞察力和更准确的决策力,我们借此逐步介绍我们已经实施的框架。
Agenda
在本博客的议程中,我们将特别关注以下内容:
AI集成和成熟的方法
建立和集成OpenAI的AI助手:
- 设置AI助手并定义指令提示
- 使用矢量存储作为上下文的数据源
- 集成OpenAI客户端
- 在HTML报告里面附加AI生成的响应
- 最终报告概述
AI集成
在上一篇博客中,我们经历了构建QA指标框架的所有阶段,这使我们能够自动生成QA指标报告,增加了更多有重大价值的能力和功能。这消除了所有的人工操作,并提供了一个可扩展的解决方案。
然而,截至目前,指标主要集中在问题类型的计数上。现在,我们需要超越数据本身来实现决策指导,这可以通过将报告进行高层次的转化来实现。终极目标是提供更深入的数据解释、摘要和可行动列表来帮助指导决策。
方法
一个可行的常规方法是使用ChatGPT:我们可以把错误根本原因及QA指标中生成的所有信息输入到ChatGPT中,从而获得所需的解释和反馈。当然,这也可以通过openai客户端库的OpenAI API来完成。
然而,可能面临的一个挑战是,ChatGPT在提供解释时仅仅使用给定的信息,而不是完全了解数据的上下文,也没有考虑任何必要的历史或背景信息。不幸的是,这并不完全是我们想要的。
你可以假设这样一个场景:一个班有10名学生在所有的考试中都不及格。如果随便问一位老师他们为什么不及格,
老师就会根据一般事实给出一些理由,例如:“这些学生不及格是因为他们学的知识太少”,“他们经常不上课”或“他们的老师不够好。”然而,如果我们提供了每个学生更多的背景信息,我们可能就会得到更准确的解释。例如,一些学生可能在一年中的大部分时间里都病得很重,或者有一个学生过去一直在为体育比赛做准备。有了这些根本原因信息,整个解释将发生变化,并引导我们进行更深入地理解。这样就引入了第二种方法。
第二种方法是在提交数据作为提示之前,为数据提供特定的信息和上下文,以便 AI可以提供更准确、更可靠的响应。AI助手可以实现这一点,AI 助手功能可以通过用户界面和OpenAI API来访问。AI助手之所以与众不同的一个最大原因是,您能提供清晰具体的指令,还可以为AI提供矢量存储形式的数据源,通过这些您就可以扩展它的知识和调整模型配置的能力,如Top P(核采样)、温度(用来控制随机性)以及响应格式。
创建并集成openAI的 AI助手
创建AI助手和指令提示。 现在我们需要创建一个AI助手,这可以通过用户界面轻松完成。
提示:为了定义一个 AI 助手,我们需要在主任务界面定义名称、清晰简洁的指令以及它应该遵循的结构和角色,如下所示。
此外,我们需要指定响应的形式。在我们的案例中,响应将以HTML格式生成,因此我们可以轻松地将其集成到我们的HTML报告中,而无需任何编码或CSS实现。使用软件开发质量指标和错误根源分析JSON,使用我们“QA战略和QA指标”文档中的见解,并从矢量存储访问信息,以确保上下文感知决策与标准和实践一致。制作如下所述的HTML报告:
- 报告结构:
标题:“质量指标分析”
简介:从QA文档和JSON数据中总结关键指标和根本原因。
趋势分析:分析关键指标的月度趋势(如果有的话)。讨论积极或消极的趋势。根据历史数据预测未来趋势。 团队观察:
- 突出每个团队的性能指标和挑战,包括特定于上下文的因素,如生产环境的测试、遗留代码和第三方集成。
- 参考QA战略文档和矢量存储数据,以进行上下文感知解释。
改进建议和回顾主题:
- 根据每个团队的独特上下文和背景,提供量身定制的改进建议。
- 为下一次回顾会议提出带有可执行见解的主题。
结论:总结关键发现及其对未来项目的潜在影响。
HTML格式要求:结构使用
,标题使用,部分标题使用
。左对齐所有文本。专注于见解,而不是原始数据。排除日期,避免完整的数据集复制。
附加说明:
- 包括对所有团队的分析,同时强调那些没有预发布环境和处理老旧系统的团队。
- 确保分析为QA工程师提供可操作的见解。
- 访问和利用矢量存储信息来做出上下文一致的决策。
- 响应应仅为HTML。
- 目标受众:QA工程师通过做出上下文感知、可操作的决策来增强QA流程。
- 报告结构:
矢量存储: 为了给每个团队提供背景信息,我们可以通过上传相关文档来为每个团队提供概述和上下文,包括他们的技术栈、挑战和限制。所有这些数据都可以上传到矢量存储,然后再链接到人工智能助手,为其提供更详细的信息,以提高其响应的准确性。
在创建 AI助手时会生成一个助手ID。使用此ID和OPENAI_API_KEY,我们就能通过OpenAI客户端与我们的AI助手进行通信。Openai Client: 现在我们可以添加一个新的组件到QA Metrics框架,这个组件负责处理与AI助手的通信。简单来说,我们先使用OpenAI API密钥初始化客户端,然后使用获得的ID创建一个新线程,就可以发送消息了。
最后重要的一点,我们触发了运行,获取了消息内容,并返回了对应的值。
此外,请注意,由于我们使用的是流媒体方法,您需要正确处理所需的事件。
import os
from colorama import Fore
from openai import OpenAI
from openai.lib.streaming import AssistantEventHandler
class EventHandler(AssistantEventHandler):
def on_text_created(self, text) -> None:
pass
def on_text_delta(self, delta, snapshot):
pass
def on_tool_call_created(self, tool_call):
pass
def on_tool_call_delta(self, delta, snapshot):
passdef submit_message(user_message, override_id=None):
qa_metrics_assistant_id = "asst_qxxxx"
client = OpenAI(api_key=os.getenv("OPENAI_API_KEY"))
thread = client.beta.threads.create()
client.beta.threads.messages.create(thread_id=thread.id, role="user", content=user_message)
event_handler = EventHandler()
with client.beta.threads.runs.stream(
thread_id=thread.id,
assistant_id=qa_metrics_assistant_id,
event_handler=event_handler,
) as stream:
print(f"{Fore.YELLOW}Please wait, generating AI summary report...\n")
stream.until_done()
message_obj = event_handler.get_final_messages()[0]
html = message_obj.content[0].text.value
return html
def analyze_data_with_gpt(json_data, override_id=None):
try:
response = submit_message(user_message=f"{json_data}", override_id=override_id)
if response:
return response
else:
return "No response was returned by the model."
except Exception as e:
return f"An error occurred: {e}"
- 将人工智能的响应附加到Html: 可以在共享同一知识库的同时创建具有不同任务的多个AI助手。
就本文而言,我使用了两个AI助手:一个用于QA指标数据解释,另一个用于错误根本原因分析。
所有数据都作为user_message通过JSON格式发送。然后,我们就可以扩展我们的报告功能,以包括AI助手的输出(ai_report,clustered_bugs_summary),并将其解析到HTML模板中。
def save_df_to_html(metrics_table_df, root_cause_df, clustered_bugs_df, clustered_bugs_summary,
ai_report,qa_metrics_trends, file_path):
with open(f"{BASE_DIR}/templates/repo_temp.html", 'r') as file:
report_template = file.read()
svg_data = generate_charts(metrics_table_df, qa_metrics_trends)
html_table = metrics_table_df.to_html(index=False, classes='table table-striped')
root_cause = root_cause_df.to_html(index=False, classes='table table-striped')
clustered_bugs = clustered_bugs_df.to_html(index=False, classes='table table-striped')
filled_html = report_template.format(
selected_role=os.getenv("SELECTED_ROLE"),
date=day_date,
svg_base64=svg_base64,
metrics_table=html_table,
root_cause=root_cause,
clustered_bugs=clustered_bugs,
report_summary_html=ai_report,
clustered_bugs_summary=clustered_bugs_summary,
total_bugs_env_svg=svg_data['total_bugs_env'],
defect_detection_percentage_svg=svg_data['defect_detection_percentage'],
avg_defect_density_svg=svg_data['avg_defect_density'],
qa_metrics_trends_svg=svg_data['qa_metrics_trends_svg']
)
with open(f"{BASE_DIR}{file_path}", "w") as f:
f.write(filled_html)
最终报告概述: 缺陷的根本原因和缺陷聚类分析如下所示,其中列出了所有团队。
此外,还包括了QA指标概述、趋势分析、团队观察以及改进建议和回顾主题。
结论: 最后,您可以看到QA指标框架的最终报告,其中利用了 AI 的能力来启发团队获得深层次的见解和解释。例如,开发经理可以大概了解导致问题的可能原因,并评估我们在质量方面的水平。PO或PM还可以识别需要提前确定优先次序以及提前做计划的关键主题。QA可以发现流程中的弱点,并了解他们的重点应该放在哪里。
到目前为止,利用结合了AI力量的自动QA指标框架带来了更好的结果,使我们能够以上下文方式解释指标,也使我们能够识别被忽视的差距。然而,虽然我们拥有了这些能力,但我们仍然应该要认识到人际沟通的重要性——接触人们,询问他们的痛点,收集他们的反馈、想法和改进建议。
希望你享受我的本次旅程!