在本文中,我将尝试提供 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”
应属于组A和B
让我们再次使用此配置来运行我们的示例:
“Give me the sales data”
• 我们从组A中检测到实体。• STM 此时为空。* 返回常规销售报表.-“sell”
在 STM 中具有组A的存储实体。“Who was the best?”
– 我们检测到属于组A和B的实体 .- 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如何使对话界面感觉像正常的人类对话是不可思议的。它允许最小化寄生对话框和问答驱动接口的数量,而不会不必要地使此类系统的实现复杂化。