paint-brush
让我们使用 RAG 和您公司在 OpenWebUI 中的文档构建一个客户支持聊天机器人经过@hostkey
1,648 讀數
1,648 讀數

让我们使用 RAG 和您公司在 OpenWebUI 中的文档构建一个客户支持聊天机器人

经过 Hostkey.com8m2024/07/09
Read on Terminal Reader

太長; 讀書

OpenWebUI 提供了一个独特的机会,即使没有丰富的编码经验,也可以构建引人入胜且实用的聊天机器人。在本文中,我们将分享我们创建技术支持聊天机器人的历程,该聊天机器人旨在通过回答用户问题来协助我们的一线团队。以下是其操作的分步摘要。
featured image - 让我们使用 RAG 和您公司在 OpenWebUI 中的文档构建一个客户支持聊天机器人
Hostkey.com HackerNoon profile picture
0-item

OpenWebUI 是一个综合媒体平台,具有一套 AI 工具:OpenAI、Ollama、Automatic1111、ComfyUI、Whisper API、自定义模型训练、基于 Langchain 的 RAG 和 ChromaDB、混合 BM25/web 搜索等。


虽然所有这些都已经存在一段时间了,并且有文档记录,并且可以通过 Python 编程知识实现,但 OpenWebUI 提供了一个独特的机会,即使没有丰富的编码经验也可以构建迷人而有用的聊天机器人。


在本文中,我们将分享创建技术支持聊天机器人的历程,该聊天机器人旨在通过回答用户问题来协助我们的一线团队(并最终成为我们团队的一部分)。


租用具有即时部署功能的 GPU 服务器或具有专业级 NVIDIA Tesla A100 / H100 80Gb或 A5000 / A4000 卡的自定义配置的服务器。还提供带有游戏 RTX4090 卡的 GPU 服务器。


初始点

我们使用 Material for MkDocs 构建了用户文档。这将产生一个包含 Markdown 格式的 .md 文件的目录结构。我们还部署了 OpenWebUI 和 Ollama 设置,并加载了 llama3-8b-instruct 模型。


项目目标:


  1. 开发自定义聊天机器人:该聊天机器人将与用户互动并根据我们的文档提供信息。
  2. 把文档转换成适合 LLM 的格式:我们需要把 Markdown 文档转换成 LLM 能够有效处理检索增强生成 (RAG) 的格式。
  3. 启用数据更新和添加:系统应允许对包含我们文档的矢量数据库进行持续更新和添加。
  4. 专注于问答:聊天机器人应主要作为问答系统发挥作用,避免参与与 IT 无关的对话。
  5. 提供源链接:只要有可能,聊天机器人就应该链接回所提供信息的原始文档来源。
  6. 实现问题过滤:我们需要为聊天机器人配置问题限制。例如,我们可能希望阻止它根据地理位置回答问题。

简单的实现

我们最初的尝试是简单地以原始 Markdown 格式加载现有文档,并使用 llama3 模型而不进行任何修改。结果,说实话,令人失望:


首先:我们的 Markdown 文件包含各种元素,例如图像标签、脚注、代码块、粗体和斜体格式、内部和外部链接、图标,甚至按钮的“ ** ”结构。所有这些额外的“噪音”在将文档分成块进行处理时都会产生问题。


第二:OpenWebUI 默认使用 sentence-transformers/all-MiniLM-L6-v2 模型来表示 384 维向量空间中的句子和段落(这对于聚类和语义搜索等 RAG 任务至关重要),该模型主要针对英语进行训练。我们希望我们的机器人最终也能支持其他语言。


第三:虽然 llama3 是一个指导模型,但它仍然可以被引导到非主题讨论中,而不是专注于回答用户查询。70b 模型可能更合适,但它需要具有 40GB 视频内存的 GPU,而 llama3-8b 可以在只有 8GB 的 GPU 上运行。

虽然第三个问题可以通过创建自定义模型(OpenAI 术语中的代理)来解决,但前两个问题需要更重要的解决方法。以下是我们目前想到的方法。

一步步:在 OpenWebUI 中设置技术支持聊天机器人

首先,我们将文档转换为适合加载到我们的 RAG(检索增强生成)系统的格式。我们创建了一个名为 ai_text_generator 的强大 bash 脚本来自动执行此过程。


该脚本遍历所有文档目录,并使用 sed、awk 和 perl 中的正则表达式删除和替换 RAG 不需要的 Markdown 标记。最后,它在每个文档末尾添加指向https://hostkey.com/documentation上托管的原始文档的链接。



此脚本精心准备了您的文档,以便与 OpenWebUI 中的 RAG 系统一起使用。以下是其操作的分步摘要:


  • URL 生成:为每个文档文件生成一个完整的 URL。
  • 图像标记删除:删除所有与图像相关的 Markdown 标记。
  • 注释删除:从文本中删除所有注释。按钮格式化:将 Markdown 的** 和 **语法转换为 [ ],有效地将它们格式化为按钮。
  • 标题删除:删除以“>”开头的行,这些行可能用于创建大纲或目录。
  • 图标删除:删除任何代表图标的 Markdown 标记或代码。
  • 粗体文本格式:删除 Markdown 的粗体文本格式。
  • 链接修改:删除内部链接,保留外部链接。
  • 电子邮件链接格式:重新格式化链接为电子邮件地址。
  • 空格规范化:删除每行开头直到第一个字符的多余空格。
  • 行尾转换:将 CRLF(Windows 行尾)转换为 UNIX 格式(LF)。
  • 减少空行:消除超过一个的连续空行。
  • URL 附加:将生成的 URL 附加到每个处理的文件的末尾。


运行脚本后, ai_data目录将包含一组可加载到 OpenWebUI 的 RAG 系统的文件。



接下来,我们需要向 OpenWebUI 添加一个新模型,以便使用我们的文档向量数据库和 Ollama LLM。此模型应支持更随意的“你”(ты)语气,而不仅仅是英语。我们计划在未来增加对土耳其语等其他语言的支持。


  1. 首先,我们转到管理面板 - 设置 - 文档。在嵌入模型字段中,我们将选择sentence-transformers/all-MiniLM-L12-v2 。我们已经测试了此列表(https://www.sbert.net/docs/sentence_transformer/pretrained_models.html)中推荐的所有模型,发现这个模型最适合。

  2. 我们将点击嵌入模型字段旁边的下载图标来下载并安装它。

  3. 我们将立即设置 RAG 参数:

    • Top K = 10:这意味着系统在生成响应时将考虑最相关的前 10 个文档。

    • 块大小 = 1024:文档将被分解为 1024 个标记的块进行处理。

    • 块重叠 = 100:连续块之间将有 100 个令牌重叠。



之后,您可以前往工作区 - 文档部分并上传我们的文档。最好给它一个特定的集合标签(在我们的例子中是 hostkey_en),以便以后更轻松地连接到模型或 API 请求。



接下来,我们将为聊天机器人创建一个自定义模型。为此,我们将返回工作区 - 模型并单击加号图标。


我们将为我们的聊天机器人命名并选择基础模型(在我们的例子中是 llama3-latest)。


然后,我们将定义系统提示。这将告诉聊天机器人如何看待自己和如何表现。它概述了它的角色、局限性以及我们期望的结果。


这是我们为技术支持聊天机器人设计的系统提示:


You are HOSTKEY an IT Support Assistant Bot, focused on providing users with IT support based on the content from knowledge base. Stay in character and maintain your focus on IT support, avoiding unrelated activities such as creative writing or engaging in non-IT discussions.


If you cannot find relevant information in the knowledge base or if the user asks non-related questions that are not part of the knowledge base, do not attempt to answer and inform the user that you are unable to assist and print text "Visit https://hostkey.com/documentation for more information" at the end.


Provide short step-by-step instructions and external links


Provide a link to relevant doc page about user question started with 'See more information here:'Add text "Visit https://hostkey.com/documentation for more information" at the end.


Example of answer: " User: How can I cancel my server?


Bot:


You can cancel your server at any time. To do this, you need to access the Invapi control panel and follow these steps:

- Go to the "Billing" tab in the specific server management menu.

- Click the [Cancel service] button.

- Describe the reason for the cancellation and select its type.

- Click the [Confirm termination] button.


Please note that for immediate cancellation, we will not refund the hours of actual server usage, including the time to provision the server itself, order software, and process the cancellation request (up to 12 hours). The unused balance will be returned to your credit balance. Withdrawal of funds from the credit balance will be made in accordance with our refund policy.


You can cancel the service cancellation request in the Billing tab using the [Revoke] button.

Additionally, if you need to cancel a service that includes an OS/software license or has a customized/non-standard configuration, please contact us via a ticketing system for manual refund processing.


See more information here: https://hostkey.com/documentation/billing/services_cancellation/ "


接下来,我们将连接必要的文档集合。在知识部分,我们将单击选择文档按钮并根据其标签选择所需的集合。


租用具有即时部署功能的 GPU 服务器或具有专业级 NVIDIA Tesla A100 / H100 80Gb或 A5000 / A4000 卡的自定义配置的服务器。还提供带有游戏 RTX4090 卡的 GPU 服务器。



我们还需要配置“高级参数”选项卡下隐藏的一些其他参数。单击“显示”将显示这些设置。我们将“温度”设置为 0.3,将“上下文长度”设置为 4089。



最后,我们单击“保存并更新”来创建我们的自定义技术支持聊天机器人模型。


就这样!我们的聊天机器人已准备好工作并处理用户请求。它礼貌、耐心,并且全天候可用。

在 OpenWebUI 中使用 RAG 的技巧

以下是一些需要牢记的重要提示:

  1. 如果您在 RAG 中处理大量文档,强烈建议安装支持 GPU 的 OpenWebUI(分支 open-webui:cuda)。
  2. 对嵌入模型的任何修改(切换、加载等)都需要您将文档重新索引到矢量数据库中。更改 RAG 参数不需要这样做。
  3. 添加或删除文档时,请务必进入自定义模型,删除这些文档的集合,然后重新添加。否则,您的搜索可能无法正常工作或效率会大大降低。如果您的机器人提供了错误的答案,但包含必要信息的文档出现在底部的列表中,则很可能是这个问题。
  4. 虽然 OpenWebUI 可以识别用于创建 RAG 的各种格式(pdf、csv、rst、xml、md、epub、doc、docx、xls、xlsx、ppt、ppt、txt),但最佳做法是将文档上传为纯文本以获得最佳性能。
  5. 虽然混合搜索可以改善结果,但它会占用大量资源,即使在强大的 GPU 上也会显著增加响应时间(20-30-40 秒或更长)。这是一个已知问题,开发人员正在努力寻找解决方案。



现在我们已经测试了聊天机器人,下一步就是将其集成到我们公司现有的聊天系统中。OpenWebUI 提供了一个 API,可以作为 Ollama 的代理,添加其自己的独特功能。但是,文档仍然缺乏,这使得集成有点困难。


通过检查代码和提交历史,我们获得了一些关于如何构建 API 请求的见解,但它还没有完全按预期工作。我们设法调用了自定义模型,但没有 RAG 功能。

我们热切期待开发人员在即将发布的版本中承诺的功能,包括 RAG、网络搜索以及详细的示例和说明。


测试过程还揭示了我们的文档中存在一些不一致和冗余。这为我们提供了一个机会,让我们既能提高聊天机器人的性能,又能提高我们文档的整体清晰度和准确性。


租用具有即时部署功能的 GPU 服务器或具有专业级 NVIDIA Tesla A100 / H100 80Gb或 A5000 / A4000 卡的自定义配置的服务器。还提供带有游戏 RTX4090 卡的 GPU 服务器。