基本概念#
Bot#
Bot 是一种虚拟代理,可以在给定领域内与人类进行自然对话。Bot 使用自然语言理解 (NLU) 来理解用户的需求,然后使用对话管理和特定领域的插件引擎来提取相应的信息并呈现给用户,或执行某些操作以满足用户的命令。
在 ACE Agent 中,主要的 Bot 相关配置存储在 <bot_name>_bot_config.yaml
文件中。
聊天控制器#
聊天控制器为基于语音 IO 的 Bot 编排端到端 Bot 管线。它公开了一个 gRPC API,您可以使用它来构建对话式 AI 客户端应用程序。它还支持 Redis 接口,可用于构建应用程序。聊天控制器创建一个由自动语音识别 (ASR)、聊天引擎和文本到语音 (TTS) 组成的管线,并管理这些模块之间的音频或文本数据流。聊天控制器还支持存储传入和传出的音频、文本数据、相关元数据,并且是 NVIDIA Omniverse Audio2Face 和 Omniverse 动画微服务的接口。
聊天引擎#
聊天引擎是 NVIDIA ACE Agent 管线的关键组件,它驱动对话。它与 ACE Agent 生态系统中的其他组件交互,为用户请求制定响应。它负责维护用户上下文和对话历史记录。它根据用例公开不同类型的接口,以便与您的 Bot 进行交互。
聊天引擎基于 NVIDIA NeMo Guardrails。该架构在此处描述。
Colang#
Colang 是一种建模语言,可以为对话系统设计防护栏。
配置对话涉及定义聊天引擎必须遵循的规则才能生成响应。对于建模此对话,可以使用 NVIDIA 的专有语言 Colang。NeMo Guardrails 也使用相同的语言为您的 LLM 应用程序构建可编程轨道。
基于 Colang 的文件具有 .co
扩展名。
上下文#
在自然语言中,对话是一个连续的过程,在许多情况下,单个句子并不能传达用户意图的全部含义,它还取决于过去的句子。对话管理也是如此。
用户在许多情况下会在提问时使用过去的上下文。ACE Agent 需要能够理解它,以便能够提供有效的响应。ACE Agent 支持三种类型的上下文
多轮 - 多轮对话是指对话在同一主题上持续进行多轮或迭代的情况。在技术支持 Bot 中,多轮对话是一种非常常见的场景。在多轮对话中,Bot 要么向用户提出多个问题以了解问题,要么可以要求用户完成多个步骤来解决问题。例如
缺少实体 - 在某些情况下,用户可能未在查询中提供所有必需的实体,而是引用了对话中先前使用的实体。在以下示例中,在第二个查询中,用户引用了实体,即 LA,该实体在第一个查询中已提供。
缺少意图 - 另一种情况是 Bot 无法从用户查询中找到意图,并且需要在较早的查询中查找它。在以下示例中,用户未提及他明天要问什么,只能从第一个查询中理解。
实体#
为了理解用户查询并能够提供答案,Bot 可能需要从查询或响应中提取一些关键字,这些关键字通常是名词。这些称为实体。对于天气 Bot,位置、名称或日期可以是实体,因为您需要该信息才能从任何天气服务 API 查询有关预报的信息。
ACE Agent 使用联合意图分类和槽位识别模型以及命名实体识别器 (NER) 模型来识别实体。模型需要使用显示实体示例的数据进行训练。除了联合意图分类和槽位识别以及 NER 模型之外,还可以使用查找表或 RegEx 标记实体。
意图#
意图表示用户在单个查询中表达的意图。例如,天气 Bot 将具有不同的意图来支持,例如 weather_query
、temperature_query
或 humidity_query
。
要构建 Bot,您需要首先确定覆盖您要覆盖的用例所需的所有可能的意图。当您发出查询时,ACE Agent 会通过特定领域的 Riva 联合意图和槽位分类模型或 LLM 模型来识别意图,并决定下一步要执行的操作。
知识库#
知识库是文档的集合,可以提供给 ACE Agent,以便当用户提出相关查询时,ACE Agent 可以使用信息检索和大型语言模型从知识库中自动找到合适的答案。
NeMo Guardrails#
NeMo Guardrails 是一个开源工具包,用于轻松地向基于 LLM 的对话系统添加可编程防护栏。防护栏(或简称“rails”)是控制大型语言模型输出的特定方式,例如不谈论政治、以特定方式响应特定用户请求、遵循预定义的对话路径、使用特定的语言风格、提取结构化数据等等。
ACE Agent 聊天引擎基于 NVIDIA NeMo Guardrails。该架构在此处描述。
NLP 服务器#
NLP 服务器提供了一个统一的接口,用于在对话管线中集成不同的 NLP 模型。它利用已经过生产测试的模型服务器(如 NVIDIA Triton 推理服务器),同时还允许在管线中轻松集成实验性自定义模型。
插件服务器#
对于某些领域,Bot 可能需要从第三方服务获取信息,以便能够为用户查询提供准确的答案,例如,天气查询或餐厅搜索。
对于某些领域,Bot 可能需要访问本地或远程托管的某些内部数据库,以便为查询提供答案,例如,订单状态查询。
插件服务器是一个基于 FastAPI 的服务器,使 ACE Agent 能够通过 REST 接口与第三方应用程序或 API 进行交互。它公开了一个 Swagger 端点,使开发人员可以在沙盒环境中轻松编写和验证插件服务器。
Prompt#
Prompt 是 LLM 的指令。如果您与像 ChatGPT 这样的 LLM 交互过,那么您就使用过 Prompt。理想情况下,Prompt 会引出一个答案,该答案是正确的、形式和内容都充分的,并且长度合适。
本质上,Prompt 是将您的意图打包成自然语言查询,这将导致模型返回所需的响应。
RAG(检索增强生成)#
检索增强生成 (RAG) 是使用某些指定的文档作为知识库 (KB) 准确回答问题的任务。RAG 通常涉及以下步骤
检索:一个名为
retriever
的组件负责从知识库中提取与用户问题相关的段落或文档。检索到的文本通常称为context
。生成:在此步骤中,我们创建一个 Prompt,其中包含用户的问题、检索到的上下文以及有关如何回答问题的说明。LLM 使用此 Prompt 来制定一个信息丰富且准确的问题答案。
在 ACE Agent 的上下文中,RAG 通常用于回答领域外问题,或 Bot 需要从一组摄取的文档中获取信息的问题。
槽位#
槽位是键值对,ACE Agent 在其内存中存储任何信息。ACE Agent 会在需要时从内存中提取相关的槽位,以有效地理解和回答用户查询。
例如,如果您向天气 Bot 询问巴黎的天气如何?,它会将巴黎存储为其内存中的 location-name
槽位。如果下一个用户查询是明天会下雨吗?,ACE Agent 将从其内存中提取 location-name
槽位并使用它,因为最后一个查询中不存在位置信息。
在许多情况下,从用户查询中检测到的实体由 ACE Agent 存储为槽位,如以上示例所示。但是,也可以从槽位规则或其他来源获取槽位信息,例如,Bot 可以使用您的手机或汽车的 GPS 位置作为槽位。如果您向 Bot 注册您的姓名或地址,这些也可以用作槽位。
ACE Agent 有两种类型的内存:短期内存和长期内存。短期槽位在指定的轮数或指定的时间段后从 ACE Agent 的内存中删除,例如,对于天气查询,location-name 和 date 可以被视为短期内存槽位。在相关的对话结束后,这些槽位将不再有用。但是,长期槽位在整个会话中甚至在 Bot 的生命周期内都保留在内存中,例如,Bot 用户的地址或姓名在一段时间内发生变化的可能性非常低。
ACE Agent 通过名为 slots.yaml
的文件来促进槽位的检测和处理。您可以定义要支持的槽位,以及诸如内存和槽位标记和/或槽位操作规则之类的属性。