1
00:00:00,280 --> 00:00:04,360
现在我们回到光标，进入第四个实验。

2
00:00:04,880 --> 00:00:07,520
因为这一天我们一天要做两个实验。

3
00:00:07,680 --> 00:00:12,160
第四周第四天为明天的大项目做准备，这个项目被称为“Sidekick”。

4
00:00:12,640 --> 00:00:16,240
现在是引入结构化输出和多代理流程的时候了。

5
00:00:16,400 --> 00:00:23,440
所以我们有一堆导入，我们将像往常一样设置我们的点环境。

6
00:00:23,720 --> 00:00:26,240
现在我们将使用结构化输出。

7
00:00:26,240 --> 00:00:30,200
您会记得结构化输出的第一步是定义模式。

8
00:00:30,400 --> 00:00:35,400
我们用什么来描述 NLM 必须返回的结果。

9
00:00:35,680 --> 00:00:40,400
特别是，我们要开发的是一个评估器，它是

10
00:00:40,400 --> 00:00:45,000
将决定法学硕士的答案是否良好。

11
00:00:45,240 --> 00:00:50,480
因此，我们的评估器将在评估器输出中使用该对象进行响应。

12
00:00:50,520 --> 00:00:52,160
或者实际上它会使用 JSON 进行响应。

13
00:00:52,160 --> 00:00:54,280
JSON 必须符合这一点。

14
00:00:54,760 --> 00:00:56,760
所以我们只是描述这意味着什么。

15
00:00:56,760 --> 00:01:01,400
将会有一个现场反馈，这将是对工人反应的反馈。

16
00:01:01,800 --> 00:01:03,720
呃成功标准。

17
00:01:03,760 --> 00:01:08,440
实际上，让我们将其更改为援助响应，因为这将需要更多的文字。

18
00:01:08,440 --> 00:01:09,040
会明白的。

19
00:01:09,040 --> 00:01:14,600
我们在此协助响应中将其称为“Worker”。

20
00:01:14,600 --> 00:01:15,360
我们开始吧。

21
00:01:15,880 --> 00:01:17,920
现在你可以看到我打字了。

22
00:01:18,400 --> 00:01:23,880
所以援助响应成功标准的反馈就是是否已经满足成功标准

23
00:01:24,240 --> 00:01:26,920
以及需要的用户输入。

24
00:01:26,960 --> 00:01:27,440
真的。

25
00:01:27,480 --> 00:01:33,200
如果需要用户提供更多输入或澄清，或者助理遇到困难。

26
00:01:33,640 --> 00:01:39,040
因此，这将使我们能够有一个评估员来评估我们的结果

27
00:01:39,040 --> 00:01:42,120
用他们的术语来说，就是“工人”，“助理”。

28
00:01:42,320 --> 00:01:47,400
它将决定是否可以将其转发回用户，或者是否需要

29
00:01:47,440 --> 00:01:49,360
返回助理进行更多工作。

30
00:01:49,560 --> 00:01:54,560
一种情况是，如果满足成功标准并且它完成了它的工作。

31
00:01:54,720 --> 00:01:59,880
但另一种情况是，如果工作人员似乎陷入困境或需要澄清，在这种情况下

32
00:01:59,880 --> 00:02:00,880
应该返回。

33
00:02:01,080 --> 00:02:02,320
我们就这样吧。

34
00:02:02,800 --> 00:02:04,040
嗯，好吧。

35
00:02:04,530 --> 00:02:07,090
现在来管理状态。

36
00:02:07,130 --> 00:02:09,490
你还记得状态吗，它实际上可以是任何 Python 对象。

37
00:02:09,490 --> 00:02:11,130
它可以是 Pydantic 对象。

38
00:02:11,130 --> 00:02:12,610
但我们经常使用类型字典。

39
00:02:12,610 --> 00:02:13,890
这就是我们在这里所做的。

40
00:02:14,050 --> 00:02:18,650
现在，我们第一次有一些真正的重要信息可以存储在该州。

41
00:02:18,650 --> 00:02:23,810
以前我们总是有消息，但现在我们有一个真实的状态，我们有很多东西。

42
00:02:23,810 --> 00:02:29,490
我们仍然有消息，它代表用户和助手之间的讨论，

43
00:02:29,490 --> 00:02:35,450
但我们还有其他东西来代表从评估器传递的信息。

44
00:02:35,610 --> 00:02:37,090
回到正题。

45
00:02:37,090 --> 00:02:38,890
我要打电话给工人，助理。

46
00:02:39,170 --> 00:02:41,010
嗯，所以我们还会有更多的东西。

47
00:02:41,010 --> 00:02:46,170
我们将制定成功标准，该标准将被预先设定以定义其含义

48
00:02:46,170 --> 00:02:52,450
为了取得成功，员工将对工作进行反馈。

49
00:02:52,450 --> 00:02:54,490
顺便说一句，你可以像这样使用可选。

50
00:02:54,530 --> 00:02:57,690
如果可以为空，则可以为无，也可以为字符串。

51
00:02:58,170 --> 00:03:07,690
满足的成功标准是布尔值是真还是假，并且如果成功，则为真

52
00:03:07,690 --> 00:03:12,890
满足标准的结果，并且不需要返回给工作人员以获取更多信息。

53
00:03:13,330 --> 00:03:19,090
如果我们需要返回用户以获取更多信息，则需要用户输入。

54
00:03:19,090 --> 00:03:20,890
这就是我们的状态。

55
00:03:20,890 --> 00:03:22,290
所以这是一个更丰富的状态。

56
00:03:22,290 --> 00:03:24,650
这表明你可以在这个州拥有任何你想要的东西。

57
00:03:24,650 --> 00:03:27,210
状态实际上取决于你和你的逻辑流程。

58
00:03:27,210 --> 00:03:31,810
这种状态就像是在图表中移动的东西，每个人都得到了他们的机会。

59
00:03:31,810 --> 00:03:36,530
每个节点都会获取状态并有机会返回新状态。

60
00:03:36,530 --> 00:03:38,490
这是对该状态的一些改变。

61
00:03:38,690 --> 00:03:45,930
我们只指定一个减速器广告消息，这意味着如果这些节点之一返回

62
00:03:45,930 --> 00:03:48,010
有些消息，它们会累积起来。

63
00:03:48,010 --> 00:03:50,970
它们将与现有消息连接起来。

64
00:03:50,970 --> 00:03:57,730
但是，如果这些节点之一返回所需的用户输入，这将覆盖旧状态中的任何内容。

65
00:03:57,730 --> 00:04:04,010
因此，当您返回新状态时，如果您在此处更改这些值之一，它将成为新设置

66
00:04:04,050 --> 00:04:07,580
对于图表中位于您下游的任何内容。

67
00:04:07,820 --> 00:04:08,260
好的。

68
00:04:08,300 --> 00:04:11,420
接下来我们设置剧作家工具。

69
00:04:11,420 --> 00:04:16,980
这与之前使用异步浏览器、剧作家浏览器和剧作家的代码相同

70
00:04:17,020 --> 00:04:18,020
浏览器工具包。

71
00:04:18,020 --> 00:04:19,020
所以我们就运行它。

72
00:04:19,020 --> 00:04:20,020
这很简单。

73
00:04:20,260 --> 00:04:23,260
现在我们将有两个要初始化的 llms。

74
00:04:23,260 --> 00:04:24,860
其中之一称为工人。

75
00:04:24,900 --> 00:04:27,340
LLM扮演的是助理的角色。

76
00:04:27,580 --> 00:04:29,660
这将是 GPT 4 mini。

77
00:04:29,660 --> 00:04:35,900
它将绑定到这些工具，以便它会自动包含 JSON gutpf。

78
00:04:36,260 --> 00:04:39,260
然后我们将分别拥有一名法学硕士评估员。

79
00:04:39,380 --> 00:04:41,100
这是一个单独的法学硕士。

80
00:04:41,340 --> 00:04:44,300
我们正在设置它。

81
00:04:44,340 --> 00:04:46,980
而之前我们说过绑定工具。

82
00:04:47,020 --> 00:04:52,540
现在我们说结构化输出并传入 Pydantic 对象。

83
00:04:52,540 --> 00:04:57,260
这意味着响应将符合此输出。

84
00:04:57,300 --> 00:05:00,860
现在并非所有模型都设置为支持结构化输出。

85
00:05:00,860 --> 00:05:04,700
因此，如果您要尝试不同的模型，您可能会发现某些模型无法做到这一点

86
00:05:04,700 --> 00:05:05,180
模型。

87
00:05:05,460 --> 00:05:09,540
当然，如果是这种情况，替代方法就是采用老式方法，即

88
00:05:09,540 --> 00:05:15,340
意味着不要使用像这样的结构化输出并传递迂腐的对象，而是询问模型

89
00:05:15,340 --> 00:05:17,820
在提示中以 JSON 进行响应。

90
00:05:17,860 --> 00:05:19,060
你给它架构。

91
00:05:19,060 --> 00:05:21,860
您给出并列出它应该以哪种 JSON 进行响应。

92
00:05:21,900 --> 00:05:26,380
你也许可以举几个例子来确保做得好确实是有偏见的，然后你就有了

93
00:05:26,380 --> 00:05:28,620
解析响应中的 JSON。

94
00:05:28,620 --> 00:05:33,380
这就是当我们进行这样的结构化输出时幕后发生的所有事情。

95
00:05:33,660 --> 00:05:35,900
所以这意味着恭喜你。

96
00:05:35,900 --> 00:05:38,060
您现在学习如何使用图形进行结构化输出。

97
00:05:38,060 --> 00:05:38,940
就是这么简单。

98
00:05:39,420 --> 00:05:39,940
好的。

99
00:05:40,180 --> 00:05:43,820
所以这个函数看起来有点长。

100
00:05:43,820 --> 00:05:48,740
这个节点，聋哑工人，代表我们的工人节点，我们的助手。

101
00:05:48,740 --> 00:05:51,220
但这只是很长，因为我们这里有很多提示。

102
00:05:51,660 --> 00:05:53,300
所以它是一个节点。

103
00:05:53,340 --> 00:05:57,780
因此，像往常一样，它需要一个状态并返回一个状态。

104
00:05:57,780 --> 00:06:00,540
您可以看到它正在返回带有消息的内容。

105
00:06:00,540 --> 00:06:03,700
我们知道消息会累积，因为我们有减速器。

106
00:06:03,700 --> 00:06:05,700
因此，这将添加更多消息。

107
00:06:05,900 --> 00:06:06,260
好的。

108
00:06:06,300 --> 00:06:08,380
所以我们收到了一条很长的系统消息。

109
00:06:08,420 --> 00:06:09,620
让我来给你讲讲吧。

110
00:06:09,660 --> 00:06:13,950
我们说，看起来你是一个有用的助手，可以使用工具来完成任务。

111
00:06:14,110 --> 00:06:19,750
您继续执行一项任务，直到您向用户提出问题或澄清，或者成功为止

112
00:06:19,750 --> 00:06:21,150
已满足标准。

113
00:06:21,150 --> 00:06:25,030
这就是成功的标准，我们从国家那里得到它。

114
00:06:25,070 --> 00:06:27,030
这是应该在国家举行的事情。

115
00:06:27,470 --> 00:06:34,190
您应该回复用户有关作业的问题或您的最终答复。

116
00:06:34,470 --> 00:06:38,830
如果您对用户有疑问，您需要通过清楚地说明您的问题来回复。

117
00:06:38,870 --> 00:06:40,150
一个例子可能是这样的。

118
00:06:40,390 --> 00:06:45,070
对我来说，这样做并不是非常必要，但我想明确表示，它会

119
00:06:45,070 --> 00:06:48,670
说当它有一个问题和某种力量时，强行表达观点。

120
00:06:49,030 --> 00:06:54,990
如果您回复了最终答案并且没有提出问题，只需回复答案即可。

121
00:06:54,990 --> 00:06:59,830
我这么说是因为这些模特喜欢回答诸如“我可以帮助你做其他事情吗？”之类的问题。

122
00:06:59,950 --> 00:07:03,830
这可能会让我们的评估人员感到困惑，因为他们正在寻找是否需要帮助。

123
00:07:03,830 --> 00:07:06,270
所以我希望在这方面非常清楚。

124
00:07:06,790 --> 00:07:07,350
好的。

125
00:07:07,550 --> 00:07:10,070
当然，所有这些事情都有待实验。

126
00:07:10,070 --> 00:07:11,350
没有硬性规定。

127
00:07:11,350 --> 00:07:13,830
这并不是一个规则，你必须把它放在提示中。

128
00:07:13,830 --> 00:07:15,150
我希望你现在知道这一点。

129
00:07:15,270 --> 00:07:20,830
这实际上是人工智能工程的一部分，即关于实验、研发。

130
00:07:20,950 --> 00:07:25,390
你可以想象我在过去的几个小时里一直在制作这个提示。

131
00:07:25,390 --> 00:07:29,270
因此，显然你需要磨练一些效果良好的东西。

132
00:07:29,310 --> 00:07:32,790
您可能会发现，特别是对于不同的模型或者您有不同的任务，这是

133
00:07:32,790 --> 00:07:36,950
无论如何，你必须进行调整才能获得你想要的性能。

134
00:07:37,190 --> 00:07:46,430
呃，如果，如果我们在这个领域得到了一些关于工作的反馈，那么这意味着

135
00:07:46,430 --> 00:07:48,910
评估已经进行但进展不顺利。

136
00:07:48,910 --> 00:07:51,590
已经有了反馈，并且又回来寻求更多反馈。

137
00:07:51,750 --> 00:07:53,790
那么接下来我们就添加到系统消息中。

138
00:07:53,830 --> 00:07:59,150
之前你以为你完成了作业，但你的回复被拒绝了，因为成功

139
00:07:59,150 --> 00:08:00,950
不符合标准。

140
00:08:01,310 --> 00:08:04,590
这是关于为什么被拒绝的反馈。

141
00:08:04,590 --> 00:08:05,870
然后我们给出反馈。

142
00:08:06,190 --> 00:08:11,790
然后，根据此反馈，请继续完成作业，确保您满足成功标准。

143
00:08:12,070 --> 00:08:16,520
呃，这里已经写得很详细了。

144
00:08:16,880 --> 00:08:18,240
嗯，好吧。

145
00:08:18,640 --> 00:08:25,040
然后我这里有一些有点做作的代码，它们看起来是否已经存在

146
00:08:25,040 --> 00:08:27,200
里面有一条系统消息。

147
00:08:27,200 --> 00:08:34,040
如果已经存在，那么它只是用该系统消息替换现有的任何系统消息。

148
00:08:34,120 --> 00:08:40,800
如果它没有找到系统消息，那么，呃，它，呃，它会创建一条新消息并将其放在

149
00:08:40,800 --> 00:08:41,360
正面。

150
00:08:41,560 --> 00:08:45,600
所以这只是为了确保我们处理这些不同的场景。

151
00:08:45,640 --> 00:08:50,920
现在，这有点做作，因为，呃，Landgraf 可能已经建立了一个系统

152
00:08:50,920 --> 00:08:51,320
信息。

153
00:08:51,320 --> 00:08:55,240
所以，我们必须对此小心一些，并且可能值得做一些测试以确保

154
00:08:55,240 --> 00:08:56,560
它适用于不同的型号。

155
00:08:56,600 --> 00:08:57,120
好的。

156
00:08:57,360 --> 00:09:03,640
因此，最后我们使用工具调用工作人员 LM 并调用消息。

157
00:09:03,640 --> 00:09:07,680
我们收到响应，这就是我们随后返回的内容。

158
00:09:07,960 --> 00:09:09,320
所以我们就有了。

159
00:09:09,920 --> 00:09:10,880
呃，好吧。

160
00:09:12,040 --> 00:09:16,200
现在我们有了一个非常有趣的东西，称为工作路由器。