每个聊天机器人的核心都有一个意图识别组件,负责将用户话语与可用的聊天机器人意图之一相匹配。这是Xatkit自己的 NLU 服务器。注意:
- 遵循 Xatkit 的聊天机器人编排平台理念,您可以使用任何可用的意图识别引擎来构建您的 Xatkit 机器人。
- 由于其公共 REST API,此 NLU 引擎可以集成到其他 NLP 解决方案中,而不仅仅是在 Xatkit 中。
请注意,此 NLU 引擎仍处于 alpha 阶段。所以,非常适合学习和玩耍。尚未准备好用于任何类型的生产用途。还请记住,该项目正在快速发展,这包括其公共 API。在第一个稳定版本出现之前,任何时候都可能发生重大变化。
是什么让这个意图匹配项目与众不同?
如果说我们学到了什么,那就是当涉及到聊天机器人项目的自然语言处理要求时,没有_一种放之四海而皆准的解决方案。_
我们希望提供一种易于适应任何聊天机器人要求并提供一系列意图匹配选项的解决方案,主要采用相当务实的方法,而不是为整个机器人构建大型神经网络的典型解决方案**。**
Xatkit 的一些 NLU 特定特征:
我们将机器人视为具有不同的对话上下文(例如,作为机器人状态机的一部分)。在给定的上下文中,在考虑可能的匹配时,只应评估在该上下文中有意义的意图。
Xatkit 机器人由上下文组成,其中每个上下文可能包含多个意图(请参阅dsl
包)。在训练阶段,NLP 模型根据这些意图的训练语句进行训练,并附加到上下文以进行未来预测)。
如果用户输入的文本中充满了 NN 从未见过的单词怎么办?可以安全地假设我们可以直接确定没有匹配并触发机器人移动到默认回退状态。
或者,如果输入文本与其中一个训练句子完全匹配怎么办?我们不应该假设这是以最大的信心返回的意图吗?
这种务实的决策是 Xatkit 的核心,使其成为一个非常有用的特定于聊天机器人的意图匹配项目。
有关如何构建 Xatkit 的 NLU 以及如何使用它的更多详细信息,另请参阅此博客文章
特征
目前,该引擎专注于意图匹配和 NER(命名实体识别)。
自定义神经网络
我们允许您使用各自的值和同义词定义您自己的一组实体。
示例实体可以是“CityEntity”,其值为“Barcelona”(同义词:“BCN”、“Barna”)和“Madrid”。
基础神经网络
我们开发了可以在任何意图中使用的预定义实体类型:
- 数字(例如“3”、“3.5”、“-3.5”、“负三点五”等)
- 日期时间(例如“2022 年 12 月 1 日 15:00”、“12 月”、“下午 4 点”、“今天”、“3 个月内”等)
请参阅base_entities.py检查所有基本实体类型。
另请检查该tests
文件夹以获取有关如何使用引擎及其配置选项的一些示例(如下所述)。
安装 Xatkit NLU
Xatkit NLU 引擎已通过 Python 3.9 测试。
其他关键要求是:
- numpy~=1.22.2
- fastapi~=0.74.0
- 张量流~=2.8.0
- 狂妄的~=1.9.0
- matplotlib~=3.5.1
- 节~=1.3.0
- PyStemmer~=2.0.1
- text2num~=2.5.0
- 日期解析器~=1.1.3
- python-dateutil~=2.8.2
FastAPI是我们用来将 NLU 引擎公开为 REST API 的 Web 框架。您可能会认出大多数其他依赖项 :-)
我们使用 Stanza 的语言依赖分词器。在运行服务器之前,您需要下载将在机器人中使用的语言模型
运行 Xatkit NLU
FastAPI 依赖uvicorn作为 ASGI web 服务器实现。
要将 Xatkit 公开为 Web API,请编写:
python -m uvicorn main:app --log-level trace
其中 main 是 FastAPI 应用所在的模块。
配置选项
配置选项和默认值列表(参见nlp_configuration.py
)
钥匙 | 价值观 | 描述 | 约束 |
country |
细绳 | 机器人使用的国家语言 | 可选(默认en ) |
region |
细绳 | 机器人使用的区域代码 | 可选(默认US ) |
timezone |
细绳 | 机器人使用的时区 | 可选(默认Europe/Madrid ) |
num_words |
整数 | 单词索引中要跟踪的最大单词数 | 可选(默认1000 ) |
lower |
布尔值 | 是否所有字符串都应转换为小写 | 可选(默认true ) |
oov_token |
细绳 | 在预测期间表示词汇表外单词的标记 | 可选(默认<OOV> ) |
num_epochs |
整数 | 训练期间要运行的时期数 | 可选(默认300 ) |
embedding_dim |
整数 | 嵌入单词标记期间要起诉的维度数 | 可选(默认128 ) |
input_max_num_tokens |
整数 | 为所有句子保留的最大长度(根据标记数) | 可选(默认30 ) |
stemmer |
布尔值 | 是否使用词干分析器作为训练句子(和用户话语)处理的一部分 | 可选(默认True ) |
discard_oov_sentences |
布尔值 | 当用户话语都是 OOV 标记时,自动为所有意图分配零概率 | 可选(默认True ) |
check_exact_prediction_match |
布尔值 | 是否检查要预测的句子与其中一个训练句子之间的精确匹配 | 可选(默认True ) |
use_ner_in_prediction |
布尔值 | 是否应该在预测期间使用实体匹配? | 可选(默认True ) |
activation_last_layer |
细绳 | 最后一层的激活函数 | 可选(默认sigmoid ) |
activation_hidden_layers |
细绳 | 隐藏层的激活函数 | 可选(默认tanh ) |
贡献
你想为 Xatkit 做贡献吗?我们很想听到您的声音。请记住,除了提交代码之外,还有很多方法可以支持开源项目!谈论 Xatkit、编写文档、贡献示例……所有这些都是帮助我们的好方法。
贡献代码时,请先与我们讨论您希望进行的更改。首先打开一个描述性问题,以便我们可以就继续您的错误修复或新功能想法的最佳方式提出建议。
感谢阅读到最后!如果您喜欢您所看到的内容,请不要忘记加注星标/观看此存储库,您会让我们非常高兴!