1
00:00:00,100 --> 00:00:06,432
本内容改编自小山学堂《学 AI 产品，从入门到精通》，为二次演绎配音版。

2
00:00:06,382 --> 00:00:09,122
这一集讲两件很具体的事。

3
00:00:09,122 --> 00:00:18,641
前半段讲 AI 生图，为什么同一个角色每次画出来都不一样，以及调通接口之后，到用户真能用之间还差些什么。

4
00:00:18,641 --> 00:00:28,822
后半段讲 Agent 循环，为什么教科书上的三步，到了生产环境会变成几十步，以及它卡死的时候，用户到底看到了什么。

5
00:00:28,822 --> 00:00:31,153
为什么产品经理要关心。

6
00:00:31,153 --> 00:00:37,163
因为这两块是 AI 产品里最容易在演示时惊艳、上线后翻车的地方。

7
00:00:37,163 --> 00:00:44,014
演示里跑通一次，和每天几万次都稳定跑通，中间隔着的是产品化，不是技术。

8
00:00:44,014 --> 00:00:50,396
前半段的生图部分，会给你一条很实用的分界线，什么时候必须上参考图。

9
00:00:50,396 --> 00:00:58,100
后半段的 Agent 部分，会给你一套防护清单，以及一个判断标准，怎么知道它已经卡死了。

10
00:00:58,252 --> 00:01:00,617
先说生图的第一个决策。

11
00:01:00,567 --> 00:01:07,322
同样是一句生成一个角色在书房的图，有没有参考图，产出的质量天差地别。

12
00:01:07,322 --> 00:01:09,870
文生图，输入只有文字。

13
00:01:09,870 --> 00:01:16,192
比如，某个角色在书房看书，温暖灯光，书架背景，蓝裙白围裙。

14
00:01:16,192 --> 00:01:18,404
模型凭想象力生成。

15
00:01:18,404 --> 00:01:22,563
问题是，每次这个角色长什么样，全靠运气。

16
00:01:22,563 --> 00:01:25,712
垫图，输入是参考图加文字。

17
00:01:25,712 --> 00:01:31,481
参考图加上一句，这个角色在书房办公，笔记本电脑，暖色调。

18
00:01:31,481 --> 00:01:35,856
模型以参考图为锚点生成，角色每次都长一样。

19
00:01:35,856 --> 00:01:41,950
核心区别是，文生图是从无到有，模型每次对这个角色的想象都不同。

20
00:01:41,950 --> 00:01:48,861
垫图是以图为锚，参考图锁定了外貌，模型只在这个约束下变换场景和动作。

21
00:01:48,861 --> 00:01:50,664
什么时候用哪种。

22
00:01:50,664 --> 00:01:55,195
纯背景或者环境图，用文生图，不涉及角色。

23
00:01:55,195 --> 00:02:00,231
食物、物品特写，用文生图，不需要人物一致性。

24
00:02:00,231 --> 00:02:04,546
角色出镜，必须垫图，要保证还是同一个角色。

25
00:02:04,546 --> 00:02:09,666
角色换装，必须垫图，脸不变衣服变，必须有脸部参考。

26
00:02:09,666 --> 00:02:14,726
多场景系列图，垫图，一组图里角色外貌要一致。

27
00:02:14,726 --> 00:02:21,926
只有创意发散、概念探索的时候，才用文生图，不需要锁定形象，越多变越好。

28
00:02:21,926 --> 00:02:27,527
一句话，在有固定形象的产品里，绝大多数出图都走垫图。

29
00:02:27,527 --> 00:02:30,904
因为用户不能接受每次角色长得不一样。

30
00:02:30,904 --> 00:02:34,810
说完有没有参考图，再说一个更隐蔽的问题。

31
00:02:34,810 --> 00:02:38,200
用户说的是，这个角色在阳台发呆。

32
00:02:38,200 --> 00:02:42,490
而生图模型需要的是一长段精确的视觉描述。

33
00:02:42,490 --> 00:02:44,858
光这一句话远远不够。

34
00:02:44,858 --> 00:02:47,166
中间需要一个翻译步骤。

35
00:02:47,166 --> 00:02:51,289
用一个语言模型，把人话翻译成生图语言。

36
00:02:51,289 --> 00:02:54,582
比如用户说，这个角色在阳台发呆。

37
00:02:54,582 --> 00:02:58,091
翻译之后，模型拿到的是一大段描述。

38
00:02:58,091 --> 00:03:05,063
一位年轻女性站在洒满阳光的阳台上，靠着栏杆，望着远方，表情有些出神。

39
00:03:05,063 --> 00:03:10,603
她有着齐肩的深色头发，穿着白衬衫，戴着一条小星星项链。

40
00:03:10,603 --> 00:03:16,108
柔和的午后光线，阳台上有盆栽，背景是虚化的城市天际线。

41
00:03:16,108 --> 00:03:21,264
插画风格，暖色调，安静的氛围，构图从半身到全身。

42
00:03:21,264 --> 00:03:23,224
为什么需要这一层。

43
00:03:23,224 --> 00:03:29,546
第一，用户不会写生图提示词，他不知道要指定午后光线还是插画风格。

44
00:03:29,546 --> 00:03:35,700
第二，生图模型无法理解模糊意图，发呆对它来说不是一个视觉描述。

45
00:03:35,700 --> 00:03:42,034
第三，每个生图模型的偏好都不一样，不同产品偏好的写法各不相同。

46
00:03:42,034 --> 00:03:52,695
所以在一个成熟的产品里，每一次出图背后都有一个语言模型在做翻译，把用户的一句话扩展成几百个词元的详细视觉描述。

47
00:03:52,695 --> 00:03:56,216
这不是锦上添花，这是必要架构。

48
00:03:56,356 --> 00:04:00,632
第三个问题，是 AI 生图产品最难的一个。

49
00:04:00,582 --> 00:04:08,131
同一个描述，同一个角色在不同场景，没有参考图的时候，每次生出来的都长得不一样。

50
00:04:08,131 --> 00:04:09,981
严重到什么程度。

51
00:04:09,981 --> 00:04:13,623
用同一句文字描述，连续生成四次。

52
00:04:13,623 --> 00:04:20,174
脸型每次都不同，发型和长度在变，体态比例不一致，连画风也有偏差。

53
00:04:20,174 --> 00:04:25,234
结论很直接，纯靠文字无法锁定一个角色的视觉身份。

54
00:04:25,234 --> 00:04:38,239
有了参考图，同样的角色在四个不同场景里，书房、厨房、阳台、办公，脸型始终一致，发型和颜色稳定，身材比例不变，只有场景和动作在变。

55
00:04:38,239 --> 00:04:41,027
关键武器是角色参考表。

56
00:04:41,027 --> 00:04:49,729
它是一张标准化的角色参考图，每次生图的时候，这张图会作为参考一起发给模型，让模型看着画。

57
00:04:49,729 --> 00:04:51,724
它锚定了三样东西。

58
00:04:51,724 --> 00:04:58,287
脸型和体型，标准化参考图锁定五官比例、身材轮廓、发型长度。

59
00:04:58,287 --> 00:05:03,587
表情风格，多种表情变体让模型理解这个角色的表情范围。

60
00:05:03,587 --> 00:05:08,780
穿搭风格，标志性服装，换装的时候只换衣服不换脸。

61
00:05:08,780 --> 00:05:11,099
这里有个判断值得记住。

62
00:05:11,099 --> 00:05:15,871
角色一致性是产品设计问题，调参数解决不了。

63
00:05:15,871 --> 00:05:18,768
换装的演示也很说明问题。

64
00:05:18,768 --> 00:05:24,645
同一个角色，夏日清凉装、居家睡衣，脸没变，只是衣服变了。

65
00:05:24,645 --> 00:05:27,506
这就是参考图锚定的价值。

66
00:05:27,506 --> 00:05:33,659
解决方案是一套参考图锚定策略，而不是把提示词写得更好。

67
00:05:33,796 --> 00:05:36,654
第四个问题，多模型降级链。

68
00:05:36,604 --> 00:05:45,342
在真实产品里，用户说帮我画一张图，背后可能是主力模型超时了，备选模型限流了，第三备选也出错了。

69
00:05:45,342 --> 00:05:50,438
用户不关心哪个模型挂了，他只关心图到底能不能出来。

70
00:05:50,438 --> 00:05:52,662
降级链是这样工作的。

71
00:05:52,662 --> 00:05:57,722
主力模型超时十五秒，触发超时熔断，自动降级。

72
00:05:57,722 --> 00:06:01,784
切换到第一个备选，接管任务，用户无感知。

73
00:06:01,784 --> 00:06:04,585
它返回限流错误，继续降级。

74
00:06:04,585 --> 00:06:06,833
切换到第二备选顶上。

75
00:06:06,833 --> 00:06:11,352
它成功出图，用户拿到图片，全程感知不到切换。

76
00:06:11,352 --> 00:06:13,287
如果全部失败呢。

77
00:06:13,287 --> 00:06:18,335
友好降级，一句抱歉服务繁忙，已加入队列稍后通知您。

78
00:06:18,335 --> 00:06:25,655
用户最差也只是多等几秒，或者收到一句友好提示，永远不会撞上冷冰冰的错误页面。

79
00:06:25,655 --> 00:06:27,433
三个产品思路。

80
00:06:27,433 --> 00:06:30,342
第一，优先级排序加白名单。

81
00:06:30,342 --> 00:06:39,561
预设模型优先级，不同场景指定不同的模型组合，比如角色出镜优先用效果最好的，纯背景可以用便宜快速的。

82
00:06:39,561 --> 00:06:41,748
第二，探活机制。

83
00:06:41,748 --> 00:06:52,349
定时检测每个模型的健康状态，已确认宕机的直接跳过，恢复后自动上线，不把用户的等待时间浪费在已经死掉的模型上。

84
00:06:52,349 --> 00:06:54,405
第三，垫图降级。

85
00:06:54,405 --> 00:07:04,164
有些模型不支持垫图，降级的时候如果备选模型不支持，就退化为纯文生图，质量降低但至少能出图。

86
00:07:04,324 --> 00:07:07,447
第五站讲一个被严重低估的成本。

87
00:07:07,397 --> 00:07:10,377
调通生图接口只花了一天。

88
00:07:10,377 --> 00:07:15,954
但从那一天到用户真正能用之间，还做了三个月的产品化工作。

89
00:07:15,954 --> 00:07:19,632
这张清单展示的就是那百分之九十。

90
00:07:19,632 --> 00:07:20,870
体验层。

91
00:07:20,870 --> 00:07:28,226
生成进度反馈，出图的时候展示正在画的状态动画，用户不会面对空白屏幕干等。

92
00:07:28,226 --> 00:07:33,959
失败重试机制，模型失败后一键重试，不用重新描述需求。

93
00:07:33,959 --> 00:07:39,067
结果预览与选择，一次出多张供选择，支持放大预览。

94
00:07:39,067 --> 00:07:43,106
历史记录，之前的图能回看、重用、对比。

95
00:07:43,106 --> 00:07:44,296
质量层。

96
00:07:44,296 --> 00:07:48,214
参考图加提示词优化，等于稳定高质量。

97
00:07:48,214 --> 00:07:55,594
角色参考图保证一致性，翻译优化保证每次提示词都是生图模型最理解的格式。

98
00:07:55,594 --> 00:08:01,543
尺寸适配，头像、聊天配图、宽图，自动适配不同尺寸。

99
00:08:01,543 --> 00:08:07,036
质量兜底，检测并过滤明显质量差的结果，比如模糊、变形。

100
00:08:07,036 --> 00:08:08,310
工程层。

101
00:08:08,310 --> 00:08:14,296
降级链保证可用性，超时策略保证体验，成本控制保证不亏钱。

102
00:08:14,296 --> 00:08:16,627
这三件事缺一不可。

103
00:08:16,627 --> 00:08:23,262
再加上结果持久化，图片存到对象存储，不丢失、能溯源、支持回看。

104
00:08:23,262 --> 00:08:24,536
安全层。

105
00:08:24,536 --> 00:08:27,673
输入内容审核，过滤违规描述。

106
00:08:27,673 --> 00:08:32,445
输出内容审核，即使输入没问题，生成结果也要过审。

107
00:08:32,445 --> 00:08:37,553
版权风险控制，避免生成与已有作品高度相似的图片。

108
00:08:37,553 --> 00:08:43,094
隐私保护，用户参考图不泄露、不训练，存储策略透明。

109
00:08:43,094 --> 00:08:45,870
这张清单不只适用于生图。

110
00:08:45,870 --> 00:08:53,586
任何 AI 功能从演示走向生产，都需要在体验、质量、工程、安全四个维度做到位。

111
00:08:53,740 --> 00:08:56,165
后半段讲 Agent 循环。

112
00:08:56,115 --> 00:09:00,418
教科书说 Agent 循环是想、做、看三步。

113
00:09:00,418 --> 00:09:07,522
思考下一步该做什么，调用一个工具，拿到结果决定下一步，循环直到任务完成。

114
00:09:07,522 --> 00:09:12,666
但真正推上生产环境，每转一圈要做的事比这多得多。

115
00:09:12,666 --> 00:09:18,423
教科书省略的部分，恰恰是让 Agent 稳定、安全、可用的关键。

116
00:09:18,423 --> 00:09:23,351
上下文压缩，对话越来越长，不裁剪就会超出窗口。

117
00:09:23,351 --> 00:09:28,760
权限校验，这个工具用户有没有权限调，参数合不合法。

118
00:09:28,760 --> 00:09:33,159
并发调度，多个工具能不能同时跑，怎么协调。

119
00:09:33,159 --> 00:09:37,966
错误处理，工具超时了怎么办，返回格式错了怎么办。

120
00:09:37,966 --> 00:09:43,615
结果回写，执行结果要写回上下文、更新状态、触发通知。

121
00:09:43,615 --> 00:09:47,846
安全审计，记录每一步操作，出问题时可追溯。

122
00:09:47,846 --> 00:09:52,498
真实的 Agent 每转一圈，要做的事比你想的多五倍。

123
00:09:52,498 --> 00:10:03,495
教科书的骨架只是骨架，生产环境每一轮循环里藏着权限、压缩、容错、审计这些隐藏逻辑，它们才是 Agent 工程的核心工作量。

124
00:10:03,495 --> 00:10:07,894
而当你把这些隐藏逻辑漏掉的时候，它就会卡死。

125
00:10:07,894 --> 00:10:12,486
实验室里的死循环很好发现，控制台一刷就看到了。

126
00:10:12,486 --> 00:10:15,214
但生产环境的卡死更隐蔽。

127
00:10:15,214 --> 00:10:21,957
用户不会说你的 Agent 死循环了，他只会说你的 AI 怎么这么慢，或者它是不是傻了。

128
00:10:21,957 --> 00:10:24,277
四种典型的卡死模式。

129
00:10:24,277 --> 00:10:27,101
第一种，同参数死循环。

130
00:10:27,101 --> 00:10:31,825
Agent 连续三次用完全相同的参数调用同一个工具。

131
00:10:31,825 --> 00:10:40,022
模型忘了上次已经做过，或者认为上次没成功所以要重试，但参数一模一样，结果也一模一样。

132
00:10:40,022 --> 00:10:45,130
用户看到的是，它转了好久都没反应，怎么一直在加载。

133
00:10:45,130 --> 00:10:47,245
第二种，收益递减。

134
00:10:47,245 --> 00:10:51,488
跑了五十轮循环，但几乎没产出有价值的内容。

135
00:10:51,488 --> 00:10:58,231
Agent 在忙，但每一轮只做边缘操作，整理格式、反复确认、做无关搜索。

136
00:10:58,231 --> 00:11:01,789
看起来在工作，实际没有推进核心目标。

137
00:11:01,789 --> 00:11:06,019
用户看到的是，等了两分钟，结果就给我这个。

138
00:11:06,019 --> 00:11:08,399
第三种，文本复读。

139
00:11:08,399 --> 00:11:11,103
模型开始重复自己说过的话。

140
00:11:11,103 --> 00:11:16,452
当上下文过长或者模型困惑时，它会退化为复读模式。

141
00:11:16,452 --> 00:11:19,553
模型并没有卡住，它已经迷路了。

142
00:11:19,553 --> 00:11:22,702
用户看到的是，它在说车轱辘话。

143
00:11:22,702 --> 00:11:25,767
第四种，工具连续失败雪崩。

144
00:11:25,767 --> 00:11:30,442
一个工具挂了，Agent 疯狂重试，拖垮整条链路。

145
00:11:30,442 --> 00:11:40,106
工具超时，重试，还是超时，换个方式调，还是不行，试另一个工具来绕过，结果那个工具依赖前一个的结果也挂了。

146
00:11:40,106 --> 00:11:45,166
用户看到的是，它好像卡住了，等了好久突然说失败了。

147
00:11:45,166 --> 00:11:48,760
识别这些模式，是做防护的前提。

148
00:11:48,892 --> 00:11:51,450
第八站讲怎么设计防护。

149
00:11:51,400 --> 00:11:56,748
好的防呆是三层网，让系统既不会失控，又不会轻易放弃。

150
00:11:56,748 --> 00:12:00,138
第一层，硬限制，无条件的刹车。

151
00:12:00,138 --> 00:12:06,340
迭代上限，设定最大循环次数，比如五十轮，到了就强制停止。

152
00:12:06,340 --> 00:12:13,467
总超时，设定任务最大执行时间，比如三分钟，不管跑了多少轮，超时就中断。

153
00:12:13,467 --> 00:12:20,150
单工具次数上限，同一个工具最多调用若干次，防止 Agent 对一个工具上瘾。

154
00:12:20,150 --> 00:12:25,486
第二层，检测类，监控运行状态，发现异常模式时预警。

155
00:12:25,486 --> 00:12:31,460
同参数检测，连续几次是否用完全相同的参数调用同一工具。

156
00:12:31,460 --> 00:12:37,734
同工具名检测，最近几轮是否只在调同一个工具，可能陷入了执念。

157
00:12:37,734 --> 00:12:46,340
收益递减检测，对比最近几轮的产出增量，如果跑了十轮但新内容不到五十字，判定为低效空转。

158
00:12:46,340 --> 00:12:51,856
第三层，降级类，带伤继续或者优雅退出，先不直接停。

159
00:12:51,856 --> 00:13:00,414
注入纠错提示，在上下文里加一条系统消息，你已经重复了三次，请换一种方法，让模型自己调整。

160
00:13:00,414 --> 00:13:07,265
禁用故障工具，某工具连续失败时，从可用列表里暂时移除，逼它走别的路。

161
00:13:07,265 --> 00:13:16,159
强制总结当前进度，触发条件时，强制它总结已做的事和已得到的结果，带着残缺的进度返回用户。

162
00:13:16,159 --> 00:13:22,998
层次关系是，先让降级尝试自救，自救失败由检测上报，最终由硬限制兜底。

163
00:13:22,998 --> 00:13:28,419
大多数情况下，Agent 应该被温柔地纠正，粗暴杀死是下策。

164
00:13:28,419 --> 00:13:33,371
对用户来说，带着半成品回来，比空手而归好得多。

165
00:13:33,532 --> 00:13:36,751
最后一站讲一个很朴素的体验问题。

166
00:13:36,701 --> 00:13:41,569
Agent 在后台跑了三十秒，用户屏幕上应该看到什么。

167
00:13:41,569 --> 00:13:45,956
同样是等三十秒，有没有进度感，体验天差地别。

168
00:13:45,956 --> 00:13:48,251
进度感设计有三个原则。

169
00:13:48,251 --> 00:13:53,323
让用户看见过程，别只给一个转圈，要展示正在做什么。

170
00:13:53,323 --> 00:14:00,944
让进度可感知，找到三条结果、已分析五分之二个文件，有数字、有变化、有推进感。

171
00:14:00,944 --> 00:14:07,097
让输出渐进出现，文字逐字流出，流式输出本身就是最好的进度条。

172
00:14:07,097 --> 00:14:09,297
常见的手段有五种。

173
00:14:09,297 --> 00:14:15,138
状态文案，从正在搜索相关信息，到找到五条结果正在分析。

174
00:14:15,138 --> 00:14:19,754
工具展示，把正在调用的工具名和参数展示出来。

175
00:14:19,754 --> 00:14:22,867
流式输出，让等待变成阅读。

176
00:14:22,867 --> 00:14:28,768
阶段标记，第一步共三步，即使无法精确预估，分阶段也比不分好。

177
00:14:28,768 --> 00:14:35,463
中间产物，先给一个粗略结果，再逐步精化，比如先给大纲，再填充细节。

178
00:14:35,463 --> 00:14:39,982
用户能忍受等待，但不能忍受不知道在等什么。

179
00:14:39,982 --> 00:14:45,956
进度感不等于进度条，它的核心是让用户觉得 AI 在认真干活。

180
00:14:46,108 --> 00:14:49,339
最后给你六条今天就能用的判断。

181
00:14:49,289 --> 00:14:52,546
第一条，先分清文生图和垫图。

182
00:14:52,546 --> 00:14:57,282
涉及角色出镜、换装、系列图，一律用垫图。

183
00:14:57,282 --> 00:15:01,164
只有纯背景和创意发散，才用文生图。

184
00:15:01,164 --> 00:15:05,791
第二条，用户的话和生图模型需要的是两种语言。

185
00:15:05,791 --> 00:15:09,529
中间那层翻译不是优化项，是必要架构。

186
00:15:09,529 --> 00:15:14,830
第三条，角色一致性是产品设计问题，不是参数问题。

187
00:15:14,830 --> 00:15:19,217
靠的是参考图锚定策略，不是把提示词写得更长。

188
00:15:19,217 --> 00:15:22,185
第四条，把降级链当成标配。

189
00:15:22,185 --> 00:15:30,130
优先级加白名单、探活、垫图降级，这三件事决定你的功能在多模型时代能不能稳。

190
00:15:30,130 --> 00:15:33,676
第五条，调通接口只是百分之十。

191
00:15:33,676 --> 00:15:41,440
体验、质量、工程、安全四个维度各列一张清单，任何 AI 功能上线前都过一遍。

192
00:15:41,440 --> 00:15:45,743
第六条，Agent 的防护是三层网，不是一道墙。

193
00:15:45,743 --> 00:15:49,493
硬限制兜底，检测预警，降级续命。

194
00:15:49,493 --> 00:15:54,157
对用户来说，带着半成品回来，比空手而归好得多。

195
00:15:54,157 --> 00:16:03,399
把这六条记住，你会发现 AI 产品的分水岭，从来不在演示那一刻，而在它第几万次运行的时候还能不能稳住。

196
00:16:03,399 --> 00:16:05,791
还有一个更根本的判断。

197
00:16:05,791 --> 00:16:10,310
用户能忍受等待，但不能忍受不知道在等什么。

198
00:16:10,310 --> 00:16:15,839
这句话不只适用于 Agent 循环，适用于你做的每一个 AI 功能。

