自动化质量保证 (QA)高级自动化QA工程师

创建一个验证架构,自动检测大型语言模型的幻想,通过从生成的输出中提取结构化声明并在确定性的CI/CD管道中将其与真实知识图进行验证。

用 Hintsage AI 助手通过面试

问题的回答

问题的历史

2023-2024年期间,大型语言模型在生产系统中的广泛应用暴露了传统测试自动化范式中的关键漏洞。早期采用者尝试对LLM输出应用精确的字符串匹配或基于Selenium的断言,但由于模型固有的变异性和转述能力,这些方法惨遭失败。这导致了一个范式转变,质量保证团队认识到语义正确性比语法等价性更为重要。这个问题源于在确定性CI/CD管道中验证非确定性生成系统的需求,特别是在医疗保健和金融等法律要求准确性的受监管行业。

问题

大型语言模型生成概率输出,这意味着相同的提示可能产生语义等价但文本上不同的响应。这种非确定性打破了依赖可预测输出的传统断言基础测试框架。此外,幻想——以真相呈现的实际上不正确的陈述——提出了独特的检测挑战,因为它们通常在语法上是连贯的,并在上下文中看似合理。标准的像素完美或精确匹配验证策略无法区分可接受的转述和危险的虚构。因此,自动化必须理解语义含义,从非结构化文本中提取结构化声明,并在保持所需的幂等性、可重复执行的情况下与真实知识库进行验证,以用于部署闸门。

解决方案

架构一个混合验证框架,结合符号提取与神经评估。首先,通过Redis实现温度=0的强制执行和语义缓存,以确保测试运行间的确定性执行。其次,使用spaCy或BERT模型进行命名实体识别从LLM输出中提取事实三元组。第三,将提取的声明与包含真实信息的结构化知识图(例如,Neo4j)进行验证,对于数值使用容差比较,对于分类数据则使用精确匹配。第四,实现一个LLM作为法官的后备,使用JSON架构约束进行主观质量评估。最后,将此管道包装在pytest固定装置中,带有重试逻辑和详细的遥测,以隔离模型漂移与代码回归。

import pytest import spacy from knowledge_graph import verify_claim # 假设的KG客户端 nlp = spacy.load("en_core_web_sm") def extract_claims(text): doc = nlp(text) claims = [] for ent in doc.ents: if ent.label_ in ["MONEY", "PERCENT"]: claims.append({"type": ent.label_, "value": ent.text, "context": ent.sent.text}) return claims def test_llm_hallucination(): prompt = "Premium Savings的APY是多少?" response = llm_client.generate(prompt, temperature=0.0) claims = extract_claims(response) for claim in claims: if claim["type"] == "PERCENT": is_valid = verify_claim( product="Premium Savings", attribute="APY", value=claim["value"], tolerance=0.1 ) assert is_valid, f"检测到幻想: {claim['value']}"

生活中的情况

一家中型金融科技公司部署了一个基于RAG的客户支持聊天机器人,以回答有关贷款产品和利率的问题。在测试阶段,LLM在一次实例中正确回答了“Gold Loan的APR是多少?”为“5.5%”,但在另一实例中幻想出“4.9%无信用检查”,尽管知识库明确说明了700+的信用评分要求。传统的API合约测试验证了端点的可用性,但没有验证生成财务建议的语义准确性的机制。团队需要一个自动化门控,如果模型生成了不在官方产品数据库中的利率或条款,则不得部署。

解决方案1: 基于关键字的验证与正则表达式

团队最初实施了Python正则表达式模式,以提取美元金额和百分比,然后检查这些值是否在产品目录中存在。

优点: 使用re模块实现简单,在100毫秒内快速执行,且具有确定性行为。

缺点: 该方法遭受高假阳性率——它标记了提到“0%介绍APR”的有效响应,因为该特定字符串并不存在于标准利率表中。它还未能捕捉使用批准数字于错误上下文的幻想(例如,为信用卡产品陈述抵押贷款利率)。

解决方案2: 针对批准文档的嵌入相似性

他们计算LLM响应与官方产品文档的向量化版本之间的余弦相似性。如果相似性超过0.85则测试通过。

优点: 对转述和同义词的抗干扰能力,维护开销低,与字符串匹配相比更好地捕捉语义细微差别。

缺点: 数值幻想仍未被检测,因为“5.5% APR”和“4.9% APR”尽管表示实质上不同的财务条款,但具有几乎相同的嵌入。嵌入计算的非确定性特性还导致CI/CD中的波动测试。

解决方案3: 结构化声明提取与知识图验证(选择的方案)

团队实现了一个spaCy管道来提取实体和关系,然后查询一个Neo4j知识图以验证每个声明是否与真实信息一致。数值断言使用容差范围(±0.01%),而分类数据则需要精确匹配。

优点: 精确检测字段级别的事实错误,免受语言变异的影响,并适合用于部署闸门的确定性执行。该系统能够区分“2.5% APY”(正确)和“2.4% APY”(幻想),而嵌入相似性则无法做到。

缺点: 较高的初始设置成本,要求维护NER模型和知识图架构,此外还需要不断进行真实数据的策划。

团队选择了解决方案3,因为金融法规要求在宣传的利率中绝对精确。所选架构使用温度=0,并辅以Redis缓存以消除不稳定性,而LLM作为法官仅用于处理模棱两可的定性评估。

结果是94%的幻想逃脱生产,CI/CD管道能够自动阻止引入事实错误的部署。假阳性率从35%(使用关键字匹配时)降至2%,而每次对话回合的测试执行时间通过对知识图查询的激进缓存保持在3秒以内。

候选人常常遗漏的内容

当温度设置为零时,如何处理LLM输出中的非确定性,但不同GPU架构之间的硬件级浮点差异仍导致令牌概率分布出现偏差?

即使温度为0,CUDA优化和GPU驱动程序的差异也会在softmax计算中引入微小变化,偶尔会导致在低概率决策边界上选择不同的令牌。为确保确定性CI/CD执行,使用Redis实现基于SHA-256哈希的语义缓存。第一次执行调用模型并缓存响应;随后的相同提示返回缓存值。或者,使用响应规范化,通过词形还原输出并在比较之前用规范ID替换实体。对于高风险测试,采用自一致性投票:执行五次提示,按语义相似性将响应聚类,并将多数聚类视为该测试会话的规范真相。

为何使用一个次级LLM来评估主LLM的输出(LLM作为法官)对自动测试来说是有问题的,如何减轻评估者不一致的风险?

使用LLM作为评估者引入了元波动性,测试因评估者的幻想而失败,而非产品缺陷。评估者可能在运行之间不一致地应用标准或幻想评估标准,形成循环依赖,其中两个系统可能一起幻想。为了减轻这种情况,限制评估者使用结构化输出,使用JSON架构或函数调用,强制布尔或分类响应,而非开放式推理。基础评估应基于明确的版本控制标准。锁定评估模型的版本,以防当提供者更新权重时发生漂移,并保持“金数据集”,以便持续监控评估者的准确性。

如何区分幻想(LLM编造事实)和过时的上下文(RAG系统检索旧文档),这种区分对测试自动化来说重要吗?

候选人常常将生成验证与检索验证混为一谈。如果RAG管道检索一份2022年的文档,表明“APR是5%”,而2024年的真实信息是“6%”,那么LLM正确引用的“5%”并不是幻想——它是在准确使用错误数据。自动化必须测试管道边界,首先验证检索的文档是否与真实依据一致,然后验证LLM对提供上下文的遵守。实施分配测试,通过提示LLM引用每个声明的源文档ID,然后验证这些ID是否存在于检索集中并包含所声称的事实。这能够隔离故障是源于检索衰退还是生成幻想,从而实现精确纠正。