嵌入式方向实践实验四

实践四_评估LLM对约束表达式的匹配能力 实验报告

实验要求

在实践二中,大家已经将约束表达式交由大语言模型去生成相应的测试用例输入,而在现实的工程环境 下,并没有所谓的正确代码,只有需求文本(即功能说明注释)与待测试的代码,这时我们可以将待测 试代码的约束表达式交由大语言模型,让其辅助判断是否与功能说明相符,是否有错误或遗漏。

本次实践的主要任务是模拟在没有标准代码的情况下,通过将待测试代码的约束表达式与功能说明注释 交给大语言模型,让其判断是否相符,以评估大语言模型对约束表达式的理解能力与匹配能力,从而探 索待测代码的约束表达式能否直接交给大语言模型判断对错,使得测试代码更加方便,准确。

本次实践的原材料依旧为上交实践一成果后分发到的约束,要求大家将每份代码的约束表达式与对应的 功能说明注释交给大语言模型,设计提示语,让其判断是否相符,是否有遗漏等匹配情况,记录下大语 言模型的判断结果(正确/错误/遗漏/……)并计算其判断正确率。

为了防止大语言模型的惯性回答,要求将分发得到的约束表达式进行一定的变异(比如故意改成错 的),来测试其判断正确率。也可以将功能说明进行一定的改动,使其与约束表达式不相符。对于一份 正确的约束,要求至少变异为一份错误的/遗漏的约束。 同时由于大语言模型的不稳定性,在评估判断正确率时,应用相同的提示语多次向大语言模型提问(无 上下文,开新的对话框提问才算为多次),取平均值,本次实践要求每份正确/错误的约束至少重复提 问 3 次,方可评估其判断正确率。

本次实践的成果要求为一份实验报告,包含你所设计的提示语(prompt)、每条约束表达式及判断结 果(文本形式记录)与大语言模型对话的截图(两三张即可),并记录下大语言模型对于约束表达式判 断正确率(请按照上述要求重复生成后再计算正确率)。

实验过程

使用的大预言模型为chatgpt3.5

一共有五个程序,分别为:121_solution、122_add_elements、123_get_odd_collatz、124_valid_date、125_split_words。

对于每个程序,提供了五份对应的正确约束,以及一个错误约束和一个遗漏的约束,并且每份约束重复向大模型提问三次(无上下文,开新的对话框提问)。

以下是与大模型对话的prompt的示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
我将为你提供一个程序的功能说明注释和七个约束表达式,请你帮我检验这些约束表达式是否符合该程序的功能说明,对于每个约束,请回答符合/错误/遗漏之一。
以下是功能说明注释:
/*Given a non-empty list of integers, return the sum of all of the odd elements that are in even positions.
Examples
solution([5, 8, 7, 1]) ==> 12
solution([3, 3, 3, 3, 3]) ==> 9
solution([30, 13, 24, 321]) ==>0
*/
以下是具体的约束,不同的约束使用分隔符隔开:
Constraints:
(Eq false
(Sle 0
(ReadLSB w32 0 size)))
----------------
Constraints:
(Sle 0
(ReadLSB w32 0 size))
(Eq false
(Slt 0
(ReadLSB w32 0 size)))
----------------
Constraints:
(Sle 0
(ReadLSB w32 0 size))
(Slt 0
(ReadLSB w32 0 size))
(Eq false
(Sle 0
(ReadLSB w32 0 x0)))
(Eq false
(Slt 1
(ReadLSB w32 0 size)))
----------------
Constraints:
(Sle 0
(ReadLSB w32 0 size))
(Slt 0
(ReadLSB w32 0 size))
(Sle 0
(ReadLSB w32 0 x0))
(Sle (ReadLSB w32 0 x0)
3)
(Eq false
(Slt 1
(ReadLSB w32 0 size)))
(Eq false
(Eq 1
(SRem w32 (ReadLSB w32 0 x0)
2)))
----------------
Constraints:
(Sle 0
(ReadLSB w32 0 size))
(Slt 0
(ReadLSB w32 0 size))
(Sle 0
(ReadLSB w32 0 x0))
(Sle (ReadLSB w32 0 x0)
3)
(Eq false
(Slt 1
(ReadLSB w32 0 size)))
(Eq 1
(SRem w32 (ReadLSB w32 0 x0)
2))
----------------
Constraints:
(Sle 0
(ReadLSB w32 0 size))
(Eq false
(Slt 0
(ReadLSB w32 0 size)))
(Sle 0
(ReadLSB w32 0 x0))
(Sle (ReadLSB w32 0 x0)
3)
(Eq false
(Slt 1
(ReadLSB w32 0 size)))
(Eq false
(Eq 1
(SRem w32 (ReadLSB w32 0 x0)
2)))
----------------
Constraints:
(Sle 0
(ReadLSB w32 0 size))
(Slt 0
(ReadLSB w32 0 size))
(Sle 0
(ReadLSB w32 0 x0))
(Sle (ReadLSB w32 0 x0)
3)
(Eq 1
(SRem w32 (ReadLSB w32 0 x0)
2))

最后的结果如下,其中标粗表示大模型的回答与正确答案不符:

程序1:

121_solution 第一次 第二次 第三次
约束1 错误 符合 符合
约束2 符合 错误 符合
约束3 符合 错误 符合
约束4 符合 符合 符合
约束5 符合 符合 符合
约束4(错误) 错误 错误 错误
约束5(遗漏) 符合 符合 符合

总体的正确率为 15/21 = 71.42%;

程序2:

122_add_elements 第一次 第二次 第三次
约束1 符合 符合 错误
约束2 符合 符合 错误
约束3 符合 符合 错误
约束4 错误 符合 符合
约束5 遗漏 符合 符合
约束4(错误) 错误 符合 错误
约束5(遗漏) 遗漏 符合 错误

总体的正确率为 13/21 = 61.90%;

程序3:

123_get_odd_collatz 第一次 第二次 第三次
约束1 符合 符合 符合
约束2 错误 符合 符合
约束3 符合 符合 符合
约束4 错误 符合 符合
约束5 符合 符合 符合
约束4(错误) 错误 错误 错误
约束5(遗漏) 符合 符合 符合

总体的正确率为 16/21 = 76.19%;

程序4:

124_valid_date 第一次 第二次 第三次
约束1 符合 符合 遗漏
约束2 符合 符合 遗漏
约束3 符合 符合 符合
约束4 错误 符合 符合
约束5 错误 符合 符合
约束4(错误) 错误 错误 错误
约束5(遗漏) 错误 遗漏 遗漏

总体的正确率为 16/21 = 76.19%;

程序5:

125_split_words 第一次 第二次 第三次
约束1 符合 符合 错误
约束2 符合 符合 错误
约束3 符合 符合 符合
约束4 符合 符合 符合
约束5 符合 符合 符合
约束4(错误) 符合 错误 符合
约束5(遗漏) 符合 符合 遗漏

总体的正确率为 15/21 = 71.42%;

以下是与大模型对话的部分截图:

image-20231228165550999

image-20231228165600400