趋近智
传统软件测试是一项成熟的实践。您提供一个已知输入,并预期得到一个已知且确定性的输出。如果您构建一个将两个数字相加的函数,add(2, 2) 必须始终返回 4。这种可预测性是自动化测试框架的基础,它使开发者能够构建持续集成流程,以便在问题上线前发现并解决。
然而,大型语言模型驱动的应用程序对这一基础提出了挑战。大型语言模型本身的特性引入了多变性和不确定性,这可能导致传统测试方法变得不可靠、成本高昂且运行缓慢。
测试大型语言模型应用的首要难题在于其不确定性行为。当您向一个 temperature 设置大于零的模型发送提示时,即使输入相同,也无法保证每次都收到相同的回复。模型可能会重新措辞句子、使用同义词或以不同方式组织其回复。
尽管这种多变性是一个特点,使大型语言模型显得有创造性和自然,但它对于传统的断言式测试来说是一个突出问题。设想一个生成俳句的简单函数:
import unittest
import random
def generate_haiku(topic: str) -> str:
# 这个函数通常会调用一个大型语言模型 API。
# 我们在此模拟其不确定性行为。
if topic == "winter":
return random.choice([
"Winter's cold hold,\nSnowflakes fall on silent ground,\nPeace settles.",
"Silent, soft, and white,\nWinter's blanket on the land,\nNature is at rest."
])
return "No haiku found."
class TestHaikuGenerator(unittest.TestCase):
def test_winter_haiku(self):
expected_output = "Winter's cold,\nSnowflakes fall on silent ground,\nPeace settles the earth."
actual_output = generate_haiku("winter")
# 这个断言大约有 50% 的几率会失败。
self.assertEqual(expected_output, actual_output)
这个测试是“不稳定”的。它这次通过,下次可能就失败,并非因为我们代码中有bug,而是因为大型语言模型返回了一个不同但同样有效的俳句。一个充满不稳定测试的测试集很快会被置之不理,违背了自动化测试的初衷。
另一个难题是评估语义正确性。大型语言模型可能会生成一个事实正确但措辞与您测试的预期输出不同的答案。例如,如果您预期“Paris is the capital of France”,模型可能会返回“The capital of France is Paris”。两者都正确,但简单的字符串比较会失败。
测试大型语言模型输出需要摆脱精确匹配的断言方式,转向评估其含义。这通常涉及更精巧的方法,例如:
在测试集中依赖实时大型语言模型 API 调用会带来一些实际问题:
为应对这些难题,最好为大型语言模型应用采用分层测试策略。与其将应用程序视为一个单一、不可测试的黑盒,不如以不同方式测试其各个组成部分。
分层测试策略可以在大型语言模型应用流程的不同阶段实现有针对性的质量保障。
本章侧重于前两个层次:使用模拟构建可靠的单元测试和执行输出验证。通过职责分离,您可以构建一个全面的测试集,让您对应用程序的可靠性充满信心,同时避免了针对实时大型语言模型进行测试的弊端。
这部分内容有帮助吗?
© 2026 ApX Machine Learning用心打造