所以下一部分是最重要的部分。
它也可能是最复杂的。
现在您对我们将把这个 JSON 发送给 LLM 并给予
它可以选择在生成响应时进行回复。
它可以选择说它想要运行这些工具之一。
它想要运行这个工具或者它想要运行这个工具。
所以我们接下来要做的就是编写一个函数来处理当
法学硕士回复说，是的，我确实想运行这个工具。
请运行它并向我提供输出。
这就是我在这里编写的称为“处理工具调用”的函数的目的。
它是一个接受工具调用列表的函数。
它会运行它们。
它会将响应添加到返回的结果中。
所以它有一个循环。
它循环执行这些工具调用。
通常，模型一次只会调用一个工具。
但实际上该构造支持运行多个工具。
所以我们想在这里支持这一点。
所以我们就这么做。
所以我们循环所有的工具调用。
我们看看这个。
这个工具调用返回了什么。
我应该说这实际上是一个结构化的输出。
它是从 LM 返回的 JSON，已放入对象中。
这就是我说它与结构化输出非常相似的原因之一。
这个 JSON 对象以对象工具调用的形式回来了。
我们将查看它在该响应中提供的函数名称。
我们将称之为工具名称。
这就是它要调用的函数的名称。
它还为我们提供了参数，即应该放入该函数中的参数。
我们可以像这样把它们去掉。
然后我将打印我们称之为这个工具的内容。
接下来是 if 语句。
就像我向你承诺的那样。
我们说工具名称是否是记录用户详细信息。
如果它想调用这个工具，那么我们调用名为记录用户详细信息的函数。
我们传递论据。
但相反，如果该工具是该工具，则将未知问题记录在 JSON 中。
然后我们调用名为 record 的函数。
未知的问题。
我们传入参数。
然后我们将从该函数调用返回的任何内容添加到消息列表中。
这就是我们返回的。
这就是句柄工具调用函数的范围。
正如我告诉你的，它有这个 if 语句。
希望这对您来说更具体。
你看到了这一点。
如果没有，请过来看看并接受它。
好的。
接下来我要做的事情有点偷偷摸摸。
当你看到这个时，你可能会想，这有点愚蠢。
我们有这个东西，它查找字符串，然后调用具有相同名称的函数并查找
对于不同的字符串，并调用具有相同名称的函数。
现在我们知道 Python 充满了神奇的东西。
Python 中是否有一种方法可以进行某种反射，然后使用
与该字符串同名吗？
答案是肯定的，当然有。
这是在这种特殊情况下有效的一种方法。
有一个叫做全局的东西，它给你一个字典，你可以用它来查找任何函数
这是在全球范围内。
所以我可以用它来查找一个名为 record 的函数。
未知的问题。
这将为我提供实际的功能记录。
未知的问题。
然后我就可以这样称呼它。
这是一个非常难的问题。
因此，如果我运行它，它应该向我的手机发送推送通知。
让我们来看看。
是的，这似乎有效。
我发现记录这是一个非常困难的问题。
这样就可以了。
让我们再做一次。
啊，这值得。
当我收到电子邮件时进行 ping 操作。
所以，呃。
是的。
在那里你会看到这个诡计是有效的。
当然，这意味着我可以重写句柄工具调用函数并这样做，以便
现在基本上不再有 if 语句了。
我在那里有一个狡猾的逻辑，可以提取出正确的函数，然后动态地
像这样调用该函数。
我认为这样做肯定会更好。
所以，嗯，是的，这显然为我们提供了一种解决方法，可以让我们拥有 if 语句
前。
但我不想让你想一分钟这意味着这不仅仅是一个美化的 if 语句，
因为仅此而已。
当然，我们有一些技巧可以使用字典来查找，从而不必列出一些东西
出去。
但归根结底，事情还是一样。
我们只是获取一些文本，然后使用它来映射到函数名称，然后我们调用它
功能。
这是一个美化的 if 语句，仅此而已。
这就是它的工作原理。
我希望现在这能让您对正在发生的事情有一些了解。
好消息是，第一周之后你就再也不用这样做了，因为所有其他的
框架会为你处理这类事情。
您无需费力地取出 JSON 并将其转换为函数调用。
这正是这些框架所做的。
人们写了这样的东西，然后想，你知道吗？
只需将其放入一个漂亮的小框架中就很容易，这样人们就不必担心
不再这样了。
所以以后你就不用再担心这个问题了。
但我希望这能让你真正了解它是如何运作的，发生了什么，这样你就可以
这个基础，当你真正开始使用这些框架时，你就知道它实际上是什么
正在做。