使用 IBM Conversation Service 创建 intents/entities 的最佳实践
Best practices for creating intents/entities with IBM Conversation Service
我目前正在使用 IBM Conversation Service。除了官方文档中的信息或此处记录的信息之外,是否存在任何创建意图的最佳实践:https://github.com/watson-developer-cloud/text-bot#best-practices?
还有其他我可以看的演示吗?我看过汽车仪表盘和 IBM 的天气机器人。
此致,
谢蒂尔
意图
意图是对话的机器学习组件。
当您使用最终用户的代表性语言训练系统时,它们的效果最好。代表不仅可以指最终用户的语言,还可以指用于捕捉该问题的媒介。
重要的是要了解问题驱动 answers/intents 而不是相反。
人们通常认为您需要先定义意图。首先收集问题可以让您了解用户会问什么,并专注于您的意图所采取的行动。
Pre-defined 意图更容易产生人为的问题,而且您会发现并不是每个人都会问您认为他们会问的意图。所以你把时间浪费在了你不需要的地方。
人为制造的问题
人为制造的问题并不总是坏事。它们可以方便地 bootstrap 您的系统捕获更多问题。但是在创建它们时必须注意。
首先,您可能认为是常见的术语或短语可能并不普遍 public。他们没有领域经验。因此,避免使用只有阅读 material 后才会说的领域术语或短语。
其次,您会发现即使您不遗余力地尝试改变事物,您仍然会重复模式。
举个例子:
how do I get a credit card?
Where do I get a credit card?
I want to get a credit card, how do I go about it?
When can I have a credit card?
这里的核心术语credit card
没有变化。他们可以说 visa
、master card
、gold card
、plastic
甚至只是 card
。话虽如此,意图在这方面可能非常聪明。但是在处理大量问题时,最好是变化多端。
聚类
对于训练有素的集群,您至少需要 5 个问题。最佳值为 10。如果您收集问题而不是制造问题,您会发现集群没有足够的资源来训练。只要您的尾巴长且具有类似这样的模式,就可以了:
(水平 = 问题数量,垂直 = 按大小排序的集群 ID)
如果您发现有太多独特的问题(图表 = 扁平线),那么意图组件不是解决这个问题的最佳选择。
集群时要寻找的另一件事是彼此非常接近的集群。如果您的 "intent" 给出了答案,您可以通过为两者调整答案并合并集群来提高性能。这可能是加强弱集群的好方法。
测试
一旦你把所有的东西都聚集在一起,随机删除 10%-20%(取决于问题的数量)。不要看这些问题。你用这些作为你的盲测。测试这些将使您对它在现实世界中的表现有一个合理的预期(假设问题不是制造出来的)。
在早期版本的 WEA 中,我们进行了所谓的实验(k-fold 验证)。系统会从训练中删除一个问题,然后再问回来。它会为所有问题这样做。目的是测试每个集群,看看哪些集群正在影响其他集群。
NLC/Conversation 不会这样做。这样做需要永远。您可以改用 monte-carlo 交叉折叠。为此,您从训练集中随机抽取 10%,对 90% 进行训练,然后对移除的 10% 进行测试。你应该这样做几次并取平均结果(至少 3 次)。
结合您的盲测,它们应该彼此相对接近。如果他们说彼此超出了 5% 的范围,那么你的训练就有问题了。使用 monte-carlo 结果来检查原因(不是你的盲组)。
此测试的另一个因素是信心。如果您不打算在某个置信水平下采取行动,那么也可以在您的测试中使用它来查看最终用户体验如何。
实体
目前实体还很基础,但很可能会发生变化。您将在您试图捕获的内容的明确范围狭窄的地方使用实体。目前它没有机器学习组件,所以它只能检测你告诉它的内容。
它还允许您传回您的系统可以采取行动的关键字。例如有人可能会说 "cats and dogs" 但你想 return @Weather:rain
正则表达式
确定用户意图的最后一种形式是条件部分。这也非常强大,因为您可以创建嵌套的正则表达式。例如:
input.text.matches('fish|.*?\b[0-9]{4,6}\b.*?')
如果他们在问题中只说 "fish" 或一个 4-6 位数字,就会触发此示例。
我目前正在使用 IBM Conversation Service。除了官方文档中的信息或此处记录的信息之外,是否存在任何创建意图的最佳实践:https://github.com/watson-developer-cloud/text-bot#best-practices?
还有其他我可以看的演示吗?我看过汽车仪表盘和 IBM 的天气机器人。
此致,
谢蒂尔
意图
意图是对话的机器学习组件。
当您使用最终用户的代表性语言训练系统时,它们的效果最好。代表不仅可以指最终用户的语言,还可以指用于捕捉该问题的媒介。
重要的是要了解问题驱动 answers/intents 而不是相反。
人们通常认为您需要先定义意图。首先收集问题可以让您了解用户会问什么,并专注于您的意图所采取的行动。
Pre-defined 意图更容易产生人为的问题,而且您会发现并不是每个人都会问您认为他们会问的意图。所以你把时间浪费在了你不需要的地方。
人为制造的问题
人为制造的问题并不总是坏事。它们可以方便地 bootstrap 您的系统捕获更多问题。但是在创建它们时必须注意。
首先,您可能认为是常见的术语或短语可能并不普遍 public。他们没有领域经验。因此,避免使用只有阅读 material 后才会说的领域术语或短语。
其次,您会发现即使您不遗余力地尝试改变事物,您仍然会重复模式。
举个例子:
how do I get a credit card?
Where do I get a credit card?
I want to get a credit card, how do I go about it?
When can I have a credit card?
这里的核心术语credit card
没有变化。他们可以说 visa
、master card
、gold card
、plastic
甚至只是 card
。话虽如此,意图在这方面可能非常聪明。但是在处理大量问题时,最好是变化多端。
聚类
对于训练有素的集群,您至少需要 5 个问题。最佳值为 10。如果您收集问题而不是制造问题,您会发现集群没有足够的资源来训练。只要您的尾巴长且具有类似这样的模式,就可以了:
(水平 = 问题数量,垂直 = 按大小排序的集群 ID)
如果您发现有太多独特的问题(图表 = 扁平线),那么意图组件不是解决这个问题的最佳选择。
集群时要寻找的另一件事是彼此非常接近的集群。如果您的 "intent" 给出了答案,您可以通过为两者调整答案并合并集群来提高性能。这可能是加强弱集群的好方法。
测试
一旦你把所有的东西都聚集在一起,随机删除 10%-20%(取决于问题的数量)。不要看这些问题。你用这些作为你的盲测。测试这些将使您对它在现实世界中的表现有一个合理的预期(假设问题不是制造出来的)。
在早期版本的 WEA 中,我们进行了所谓的实验(k-fold 验证)。系统会从训练中删除一个问题,然后再问回来。它会为所有问题这样做。目的是测试每个集群,看看哪些集群正在影响其他集群。
NLC/Conversation 不会这样做。这样做需要永远。您可以改用 monte-carlo 交叉折叠。为此,您从训练集中随机抽取 10%,对 90% 进行训练,然后对移除的 10% 进行测试。你应该这样做几次并取平均结果(至少 3 次)。
结合您的盲测,它们应该彼此相对接近。如果他们说彼此超出了 5% 的范围,那么你的训练就有问题了。使用 monte-carlo 结果来检查原因(不是你的盲组)。
此测试的另一个因素是信心。如果您不打算在某个置信水平下采取行动,那么也可以在您的测试中使用它来查看最终用户体验如何。
实体
目前实体还很基础,但很可能会发生变化。您将在您试图捕获的内容的明确范围狭窄的地方使用实体。目前它没有机器学习组件,所以它只能检测你告诉它的内容。
它还允许您传回您的系统可以采取行动的关键字。例如有人可能会说 "cats and dogs" 但你想 return @Weather:rain
正则表达式
确定用户意图的最后一种形式是条件部分。这也非常强大,因为您可以创建嵌套的正则表达式。例如:
input.text.matches('fish|.*?\b[0-9]{4,6}\b.*?')
如果他们在问题中只说 "fish" 或一个 4-6 位数字,就会触发此示例。