在本文中,我将尝试提供 STM 和短期内存的高级概述,这是一种用于维护会话上下文的技术。保持适当的对话环境——记住当前对话的内容——对于所有人类互动都至关重要,因此对于基于计算机的自然语言理解也至关重要。

让我们潜入。

分析用户输入

在分析自然语言理解 (NLU) 的用户输入句时,关键目标之一是检测所有可能的语义实体,即命名实体。让我们考虑几个示例:

  • “What’s the current weather in Tokyo?”• 此句子完全足以用于处理,因为它包含主题 “weather” 以及所有必要的参数,如时间 ( “current” ) 和位置 ( “Tokyo” )。
  • “What about Tokyo?”* 这是一个不清楚的句子,因为它没有问题的主题。
  • “What’s the weather?” * 这也不清楚,因为我们缺少位置和时间的重要参数。

有时,我们可以使用默认值,如当前用户的位置和当前时间(如果缺少)。但是,如果会话具有现有上下文,则这很容易导致错误的解释。

在现实生活中,以及在聊天机器人中,我们总是试图用完全定义的句子开始对话,因为如果没有上下文,就无法获得缺失的信息,也无法解释判刑。

语义实体

让我们从上面的示例中仔细看看命名的实体:

  • “weather”• 这是谈话主题的指示器。请注意,它指示问题的类型,而不是具有多个可能值的实体。
  • “current”* 这是具有 值的类型 Date “now” 实体。
  • “Tokyo”• 这是一个类型 Location 实体,具有两个值 “city”“Tokyo, Japan”

请注意,我们有两个不同的实体类:

  • 没有值且仅充当指示器或类型的实体。实体 “weather” 是用户输入主题的类型指示器。
  • 另外具有一个或多个特定值(如 “current”“Tokyo” 实体)的实体。

不完整的句子

假设之前曾问过有关东京天气的问题(在正在进行的对话中),可以使用较短、不完整的形式提出以下问题:

  • “What about Kyoto?”• 这个问题既缺少主题,也缺少时间。然而,我们可以放心地假设,我们仍在谈论当前的天气。
  • “What about tomorrow?”* 就像上面,我们自动假设天气主题,但 “Kyoto” 用作位置,因为它被提到最后

没有事先的背景(无论是人类还是机器),这种速记是无法解释的,因为它们本身缺少必要的信息。

然而,在谈话中,这些不完整的句子起作用。我们可以简单地提供一个或两个实体,并依靠”侦听器”短期记忆(即a.a)对话上下文中回忆缺失信息的其余部分。

短期记忆

短期记忆就是…一种记忆,只保存少量最近使用的信息,并在短暂的不活动后驱逐其内容。

让我们来看看现实生活中的例子。如果你在几个小时后给你的朋友打电话 “What about a day after?” 询问(仍然谈论京都的天气)——他可能会感到困惑。对话超时,而您的朋友已失去上下文。你必须向你困惑的朋友解释你问的是什么…

上下文切换

显然,按超时重置上下文并非一件难事。更棘手的是检测对话主题何时切换,并且需要忘记以前的上下文,以避免非常混乱的解释错误。

让我们继续我们与天气相关的对话。突然之间,我们问:

  • “How much mocha latter at Starbucks?”
    在这一点上,我们应该忘记所有关于天气的谈话,并假设我们谈论的咖啡在星巴克。
  • What about Peet’s?”
    我们在谈论后一种在佩特的。
  • “…and croissant?”
    询问佩特的新月形新鲜卷。

尽管看似显而易见的逻辑,上下文切换的实现并不是一门精确的科学。有时,您可以有一个”软”上下文切换,其中您不更改对话的主题 100%,但它足以忘记至少以前收集的上下文的某些部分。

覆盖实体

如上所述,一个命名实体可以替换或重写 STM 中较旧的实体,例如, “Peet’s” “Starbucks” 在前面的问题中替换。控制此逻辑的实际算法是 STM 实现中最重要的部分之一。在人类对话中,我们似乎下意识地执行这种逻辑,但计算机算法执行它远非微不足道。

最重要的支持设计决策之一是实体可以属于一个或多个组。您可以将组视为实体的类型或类(在数学上精确,这些是类别)。实体在此类组中的成员身份是驱动重写规则的动力。

让我们看一个具体的例子。

考虑定义 3 个实体的数据模型:

  • “sell”(同义 “sales” 词)
  • “buy”(同义 “purchasing” 词)
  • “best_employee”(同义词如 “best”“best employee” “best colleague”

我们的任务是支持以下对话:

  • “Give me the sales data”
    我们返回销售信息,因为我们 “sell” 通过同义词检测到实体“sales”
  • “OK, give me the purchasing report now.”
    这有点棘手。我们应该返回一般采购数据,而不是最好的采购人员。这感觉有悖常理,但我们不应该从 STM 中获取 “best_employee” 实体,事实上,我们应该将其从 STM 中删除。
  • “…and who’s the best there?”
    现在,我们应该回报最好的采购员工。我们检测到 “best_employee” 实体,我们应该从 “buy” STM 中选取实体。
  • “One more time - show me the general purchasing data again”
    再次,我们应该返回一个一般采购报告,并忽略(和删除) “best_employee” 从STM。
  • 很显然,我们需要一些定义良好的逻辑来说明这种重写应该如何工作:有时实体会覆盖旧的实体,有时它们不会。

    重写规则

    以下是我们在 NLPCraft 上开发的规则,并已成功在各种模型中使用:

    实体将覆盖 STM 中属于同一组集或其超集的其他实体。

    换句话说,具有较小组集(更具体的组集)的实体将覆盖具有相同或更大的组集(更通用的组集)的实体。

    让我们考虑一个属于以下组的实体: {G1, G2, G3} 。此实体将:

    • 覆盖属于 {G1, G2, G3} 组的现有实体(同一集)
    • 覆盖属于 {G1, G2, G3, G4} 组的现有实体(超集)
    • 覆盖属于组的现有实体 {G1, G2}
    • 覆盖属于组的现有实体 {G10, G20}

    让我们回到我们的销售/购买/最好的例子。要解释我们上面概述的问题,我们需要具备以下 4 个目的:

    • “id=sale term={id==’sale’}
    • “id=best_sale_person term={id==’sale’} term={id=='best_employee'}”
    • “id=buy term={id==’buy’}
    • “id=buy_best_person term={id==’buy’} term={id=='best_employee'}”

    我们还需要正确配置实体的组(组的名称是任意的):

    • 实体 “sell” 应属于组A
    • 实体 “buy” 应属于组B
    • 实体 “best_employee” 应属于组AB

    让我们再次使用此配置来运行我们的示例:

    • “Give me the sales data”
      • 我们从组A中检测到实体。• STM 此时为空。* 返回常规销售报表.- “sell” 在 STM 中具有组A的存储实体。
    • “Who was the best?”
      – 我们检测到属于组AB的实体 .- STM 具有属于组A的实体 .- {A, B} 不覆盖 {A} .- 返回最佳销售人员报告.- 存储检测到 “best_employee” 的实体
  • “OK, give me the purchasing report now.”
    – 我们检测到 “buy” 具有组A的实体 . – STM 具有两个具有 {A}{A, B} 组集的实体.- {A} 覆盖这两个和 {A} {A, B} .- 返回常规采购报表.- 在 “buy” STM 中存储组A的实体。
  • 等等…容易吧?事实上,逻辑确实相对简单。它还遵循常识,即此规则产生的逻辑与预期的人类行为相匹配。

    另请注意,我们无需使用笨重的深学习网络和冗长的准备/培训阶段即可获得此结果。

    显式上下文切换

    在某些情况下,您可能需要显式清除会话 STM,而无需依赖算法行为。当对话的当前主题和新主题共享一些相同的实体时,就会发生这种情况。虽然起初这听起来有悖常理,但在日常生活中却有许多例子。

    让我们看一下此示例对话:

    第 1 季度“What the weather in Tokyo?
    A1: 东京当前的天气。

    第 2 季度“Let’s do New York after all then!”
    A2:如果没有明确的对话重置,我们将返回目前的纽约天气。

    然而,第二个问题是关于去纽约(订票等)。在现实生活中,你的对手可能会问”毕竟在纽约做”是什么意思,你必须解释这个话题的突然变化。

    你可以简单地说:”天气已经足够了!让我们来谈谈我的周末计划”——之后,第二个问题变得清晰起来。该句子是一个显式上下文切换。

    总结

    让我们收集所有关于 STM 的想法,并分为几个要点:

    • 可以从 STM 自动调用不完整句子中缺少的实体
    • 新检测到的类型/类别实体可能指示主题的更改
    • STM 的关键属性是其短时间存储和重写规则
    • 显式上下文切换是一种重要的机制

    正确实现STM如何使对话界面感觉像正常的人类对话是不可思议的。它允许最小化寄生对话框和问答驱动接口的数量,而不会不必要地使此类系统的实现复杂化。

    Comments are closed.