Tokkio LLM-RAG#

简介#

Tokkio LLM-RAG 示例应用程序旨在促进使用流行的大型语言模型 (LLM) 和检索增强生成 (RAG) 解决方案与虚拟化身进行实时互动。

例如,您可以将 Tokkio 与来自常见平台(如 Nvidia NIM、OpenAI、Nvidia Generative AI Examples 和 Nvidia Enterprise RAG)的 LLM 和 RAG 连接。用户也可以连接第三方 LLM 或 RAG。这种灵活性在 RAG 端点自定义 部分中详细介绍。

如果您已按照快速入门指南部署了最简单的 Tokkio 版本,则您部署的 Tokkio LLM-RAG 利用了 LLM。

使用默认 RAG 管线#

在快速入门指南中部署的默认版本的 Tokkio LLM-RAG 利用 LLM 生成用户响应。

要将 Tokkio LLM-RAG 参考应用程序与 RAG 管线一起使用,用户必须

  1. 部署 RAG 服务器

  2. 在 RAG 中摄取所需的文档

  3. 配置 Tokkio 以使用 RAG 端点

在这里,我们将介绍如何从 NVIDIA 示例存储库设置和部署 RAG 服务器。

重要的是要注意,Tokkio LLM-RAG 需要来自 RAG 端点的特定响应模式。

对外部 RAG 服务器的默认支持遵循来自 Nvidia Generative AI 示例的模式

来自 NVIDIA Generation AI 示例的 RAG 指的是一个 RAG 服务器,该服务器使用 NVIDIA 托管的嵌入 + 重新排序 + llm 端点来响应用户,并提供来自摄取文档的增强上下文。

请参阅 Nvidia Generative AI 示例 并按照 README 中的说明部署 RAG 服务器并摄取相关文档。

现在,请按照 自定义参考工作流程 中的 RAG 端点自定义部分,在 Tokkio 中使用 RAG 服务器而不是 LLM。

了解 Tokkio 中的插件服务器资源#

既然您已经了解了 LLM-RAG 参考工作流程是什么以及如何设置默认 RAG,我们将引导您完成插件服务器资源的更高级修改。

Tokkio 包含许多微服务,其中之一是插件服务器微服务。此微服务利用插件服务器资源。请参阅 微服务 中的图表,以了解插件服务器如何融入更广泛的 Tokkio 架构。

插件服务器资源通过提供可配置的端点来与外部 RAG 或 LLM 管线交互,并使用 Colang 编码语言定义多模态流来处理复杂查询,从而无缝集成到更大的 ACE 架构中。

插件服务器微服务利用这些配置和流来动态处理请求,通过适当的管线路由它们,并解析响应。

插件服务器资源包含与外部 LLM 或 RAG 服务器通信并将输出合并到 Tokkio 虚拟化身中的必要代码。

插件资源源代码#

Tokkio LLM-RAG 特定插件服务器资源的源代码可以在 NGC 此处找到

文件分解#

下载材料后,请注意以下资源

  • actions.py - 这包含 Colang 代码可以调用的自定义动作,例如插件服务器。

  • asr_words_to_boost_conformer.txt - 用于 asr 单词增强的默认单词列表。

  • cmudict_ipa.txt - 此文件允许您自定义某些特定单词的发音。

  • /colang - colang 文件夹中的所有文件都定义了使用多模态处理 LLM 机器人中各种查询的流程。

  • model_config.yaml - 要使用的模型的定义。

  • plugin/rag.py - 此文件包含外部 RAG 或 LLM 的 Python 客户端的定义。/chat 端点在此文件中实现。

  • plugin/schemas.py - 此文件包含 /chat 端点预期的请求/响应模式的模式定义。

  • plugin_config.yaml - 此文件包含 ACE 插件服务器配置的定义。

  • speech_config.yaml - 此文件包含应用程序的语音配置参数。

  • tokkio_rag_bot_config - 此文件包含 ACE 机器人定义。

插件服务器资源自定义#

可以编辑 LLM-RAG 插件服务器资源源代码以自定义参考应用程序。

请按照以下步骤进行自定义
  1. 选择下面的自定义

  2. 实施自定义

  3. 请参阅 插件资源自定义 以在 Tokkio 部署中反映自定义。

以下自定义可用

  1. 使用自定义 RAG 管线

  2. 向 Bot 响应添加填充句

  3. 更改 Avatar 名称和问候语

  4. 更新 Bot 手势

  5. 中断

  6. 闲聊

  7. 主动 Bot

使用自定义 RAG 管线#

/plugin 目录中的 rag.py 文件定义了一个 FastAPI 应用程序,该应用程序具有一个 API 路由器,用于管理配置 RAG 服务器、查询语言模型和流式传输聊天响应的端点。

/chat 端点处理用户驱动的聊天请求,并根据配置通过 RAG 或 LLM 服务动态路由它们。

要与自定义 RAG 服务器集成,需要在 rag.py 的 /chat API 中进行修改。具体来说,/chat 端点接收 RAG 请求并通过 stream() 函数与 RAG 管线通信,应根据自定义 RAG 服务器的模式解析响应。

对 RAG 端点的请求是在私有 stream() 函数中构建的。在示例应用程序中,请求填充了特定字段;您应该根据需要更新这些请求和响应模式,以符合自定义 RAG 管线的需求

request_json = {
        "messages": chat_history + [{"role": "user", "content": question}],
        "use_knowledge_base": True,
        "temperature": 0.2,
        "top_p": 0.7,
        "max_tokens": num_tokens,
        "seed": 42,
        "stop": STOP_WORDS,
        "stream": True,
    }

向 Bot 响应添加填充句#

可以在机器人工作流程中添加填充词/句子,以掩盖获取响应的延迟。这可以通过更新 colang 文件以添加如下所示的流程来完成。这将使机器人在回复来自 API (RAG/LLM 管线) 的响应之前说出填充句之一。如果 RAG 响应的时间长于填充句,则仍然会有一些沉默。如果 RAG 响应延迟小于填充句的长度,则仅在填充句之后才会说出来。以下代码段可以作为 colang/main.co 或单独的 colang 文件(例如:filler_words.co)的一部分添加。但需要激活该流程才能生效。有关更多信息,请参阅机器人的 main.co 中的活动流程。

# Call this flow before fetching a response expected to have high latency
start bot say filler sentence as $filler
# <RAG or LLM call that is expected to be of high latency>
match $filler.Finished()

# Sample implementation of filler sentence
flow bot say filler sentence
bot say "Let me think about it"
    or bot say "That's a great question! Let me find the data for you"
    or bot say "Hmmm"

更改 Avatar 名称和问候语#

机器人的名称和问候语在插件 sourcecolang/events.co 中配置。可以为选择的问候语或名称自定义这些流程。请注意,在默认实现中,当用户进入/离开摄像头视图时,会触发这些流程。

@meta(bot_intent=True)
flow bot express greeting
  (bot express "Hi, I am Taylor. How can I help you?"
    or bot express "Welcome! My name is Taylor. Ask away!"
    or bot express "Hello! How can I help you today?")
    and bot gesture "Wave with one hand"

@meta(bot_intent=True)
flow bot express goodbye
  (bot say "Bye" or bot say "Goodbye" or bot say "Until next time!") and bot gesture "wave"

更新 Bot 手势#

可以生成与机器人所说响应相匹配的手势。用于启用该功能的 colang 流程已在 colang/main.co 中提供,但默认情况下未激活。同样,可以将任何其他生成手势的流程添加到 colang 文件中。

@loop("generate_gestures")

flow attempt to infer gesture $question $response

中断#

机器人支持被用户中断。这在 RAG 上下文中尤其有用,在 RAG 上下文中,某些查询的响应时间较长。机器人支持两种类型的中断

  • 用户可以通过说“停止”、“停止说话”或“取消”来中断虚拟化身的响应。这将停止 RAG 响应并确认用户的请求。请注意,这些简短请求的识别是基于正则表达式处理的,您可以在 colang/main.co 文件中更新该正则表达式。

  • 也可以通过提出新问题来停止虚拟化身。在这种情况下,当前的 RAG 响应将停止,并且将使用新的用户请求查询 RAG。

闲聊#

可以将一些闲聊问答对添加到 Colang 脚本中。用户可以在专用的 Colang 文件中添加他们的闲聊示例。您可以在 Colang 语言参考中找到有关如何处理用户意图的更多详细信息。

主动 Bot#

默认情况下,如果用户在一定时间内没有响应,则机器人配置为主动。在这种情况下,将查询 RAG 以向用户提供鼓励性响应,以使用户重新参与交互。可以在 colang/main.co 文件中自定义此行为

orwhen user didnt respond 20.0 #Change what happens if the user does not respond

TTS 发音#

有关自定义 TTS 发音的更多信息,请参阅 使用 IPA 自定义 TTS 发音

Tokkio LLM-RAG 的局限性#

默认情况下,RAG 管线旨在专门回答有关上传文档的问题。这确保了虚拟化身始终专注于预期的讨论主题。虽然此行为可能有利于保持相关性,但也意味着虚拟化身不会进行闲聊或一般性讨论。

但是,可以自定义此行为以适应不同的用例。您可以更新用于查询 RAG 或 LLM 的提示以实现所需的输出。

API 参考#

有关更多详细信息,请参阅 LLM RAG 插件服务器 API

Tokkio 渲染选项#

参考 helm chart 可用于 LLM RAG 机器人的各种渲染选项。