我再次来到莱迪史密斯只是为了向您展示。
我想我从错误的地方读到 GPT 的最终输出就在这里。
我已向您发送了包含当前美元 GP 汇率的推送通知。
这就是您在底部看到整个迹线的末端的地方。
好的，我们回到本次聊天。
现在让我向您展示一些东西。
尽管这次对话具有令人难以置信的智慧，但我们现在可以说的是，呃，我的名字
埃德。
呃，很高兴认识你，艾德。
今天我能为您提供什么帮助？
我可以说，我叫什么名字？
它说我无权访问您的个人信息。
呃，所以我用这个来向你展示，呃，尽管我们拥有所有这些状态
管理，尽管事实上我们已经建立了这个，这个，嗯，这些减速器和这个聪明的
结构，它没有任何记忆。
它没有能力记住不同的对话。
你可能会想，好吧，我猜你没有在想，因为我已经解释过了，但是
但如果我没有解释的话，你可能会想。
但是，坚持住。
呃，为什么？
呃，我们有所有这些减速器。
我们已经拥有所有这些东西来处理状态并添加状态。
那为什么，为什么不是，为什么它不能自然地记住正在发生的事情呢？
是的，这一切都取决于超级步骤。
关键是每次调用，每次我们调用这个图，它就像一个单独的新鲜调用
并且状态是在任何一次调用中管理和维护的。
这就是它存在的目的。
它的作用是让多个节点并行运行。
你可能会发生各种各样的事情，并且状态将通过整个图表进行管理
以一种可重复的方式。
这就是状态管理部分的权力。
但这对您在单独的超级步骤之间没有帮助。
每个超级步骤都是对图的不同调用。
执行此操作的方法是使用检查点。
这就是添加内存的方法。
好吧，我必须告诉你，我有时对兰德格拉夫有些疑虑。
有时我们必须学习的一些东西是多么重要。
但这确实是一个让我印象非常深刻的案例，当我明白这一点时，这对我来说是一个时刻。
我明白为什么人们如此喜欢这个，我真的很欣赏它的力量。
检查点非常优雅、非常简单，并且可以带来稳健、可重复的流程。
你也会看到这一点。
我想你最终会像我一样印象深刻。
因此，我们首先创建一个名为内存保护程序的新对象。
内存保护程序并不意味着保存内存。
它谈论的是保存到内存中的存储，保存到内存中，而不是保存到磁盘或保存到
数据库。
这有点令人困惑。
这就是 Memory Saver 的含义。
这与我们之前的代码相同。
完全相同的代码。
我放入了打印语句，以便我们可以看到它在做什么以及其他情况。
唯一的变化是当我们编译图时，我们传入检查指针等于内存。
我们正在传递该内存对象。
但这是我们的图表。
它看起来一模一样，一模一样。
现在这是我们实际运行代码的地方。
这里有一些东西有点老套，有点做作，但你的想法是
创建这个名为 config 的对象。
它是一本字典，其中一个字段是可配置的，然后您必须在该字段中放入线程 ID 并
线程 ID 并不意味着像技术线程，它意味着像对话线程，例如
它指的是这一点，这条需要连接在一起的记忆线。
这就是您指定的方式，这是内存中的特定分组。
然后，当您调用图表时，您必须传入该配置。
这就是如何确保当您调用图表时，它与正确的关联
内存中的某种插槽。
这就是全部内容。
那么，让我们提出这个问题并打个招呼。
你好。
今天我能为您提供什么帮助？
我的名字是艾德。
很高兴认识你，艾德。
我怎么帮你？
我叫什么名字？
我想它会得到它。
你的名字是艾德。
我该如何进一步帮助您？
哈，哈。
毫不奇怪，您可以在这里看到我提到的打印语句正在打印，
呃，输入。
我们每次都会获得完整的历史记录，这就是全部。
这就是实际的检查点，在每个调用、每个超级步骤之间维护内存。
现在，我知道你在想什么。
你在想，好吧，有什么大不了的？
为什么你对此印象如此深刻？
我的意思是，就像您也可以通过存储该磁盘列表来到达那里一样。
或者我们可以从此处的 Gradio UI 中获取它并将其放入全局链接中并继续播放。
好吧，看看，看看其中的一些东西。
所以你可以将graph称为编译图段。
获取状态。
考虑到配置，我们得到了一个称为状态快照的东西，其中包含
消息，然后是迄今为止对话的完整历史记录。
是的。
好的。
所以它就像一个全局变量，里面有这个。
但您还可以获取更多配置的状态历史记录。
我们现在得到的是时间上的每一步，每一个超级步骤，每次我们调用图表时，完整的，
呃，那一刻的快照，从顶部最近的开始，然后回到过去。
这就是它变得很酷的地方。
它并不是超级复杂，但它绝对是一个很酷的结构。
狼山可以让你回到过去的任何时刻。
当您传递该配置时，您可以传递检查点 ID 来配置可配置的线程 ID
快退到前一时刻，然后通过图表重播该时刻。
呃，这，这给了你基本上做他们所谓的时间旅行的能力。
这是Landgraf的官方名称，真正的意思是能够向后移动，获取快照
在任何时间点并能够从那里重新运行它。
这真的很棒，因为它允许您构建可重复且稳健的系统。
如果出现故障，您可以从任何快照、任何时间点重新启动它。
并且您可以对所发生的一切进行全面跟踪。
是的，它很简单，但很优雅。
这是一个对我来说真正有意义的抽象案例。
呃，而且绝对是我认为非常有价值的东西。
我只是想告诉你，这与 gradio 和 kind 无关
变量。
我可以回来，我可以，我可以在这里重新启动我的 Gradio UI，我可以说，你好。
它又打招呼了，我正想说，我叫什么名字？
但我不需要。
你可以立即看到它有记忆。
它仍然保留着那段记忆。
这与我们一直以来保存在电台聊天 UI 中的信息无关
过去与 gradio 一起使用，而是内存，正在发生的检查点
在这个，呃，这个内存对象里面。
然后我实际上可以回来，如果我重新创建，我可以我可以创建一个全新的内存保护程序
对象并进来，然后我必须用那里的新内存重新重建我的图表
然后重新调出我的聊天界面。
现在如果我在那里打个招呼。
我叫什么名字。
显然它不会知道。
所以这只是解释了通过重新创建一个新的内存对象我们重置了一切。
也就是说，这可以让您很好地了解正在发生的事情。
我叫艾德。
很高兴见到你。
今天我能为您提供什么帮助？
呃，我叫什么名字？
为了证明这一点，你的名字叫艾德。
然后让我在这里再展示一件事。
我们还可以将线程ID更改为2。
让我们重新运行一下，呃，看看这里。
在那里打个招呼。
你好。
我该如何帮助您？
我叫什么名字？
它说它不知道，因为线程是两个。
如果我们现在回到线程就是其中之一。
我知道你明白这一点，但值得一说。
现在。
你好呀。
又好。
哈哈。
就这样。
你看到了吗？
这是一个很好的，优雅的。
它相对轻量且简单，但功能非常强大。
这是一个很好的组合，我可以支持。
当然，您可以进来查看线程一或线程的不同检查点
第二个线程。
呃，使用同样的这个，同样的结构。