LLM之RAG实战(十)| 如何构建一个RAG支持的聊天机器人,包括聊天、嵌入和重排序

       在人工智能和机器学习不断发展的环境中,聊天机器人变得越来越复杂,从简单的基于规则的回复转变为基于上下文的对话。在这篇博客文章中,我们将深入研究创建一个RAG支持的聊天机器人,该聊天机器人利用先进的NLP模型进行聊天、嵌入和重新排序,并使用hnswlib进行高效的文档检索。

设置环境

      在深入研究代码之前,请确保安装了必要的库。这包括cohere、hnswlib和非结构化。可以使用pip安装它们:

pip install cohere hnswlib unstructured

       此外,请确保正确设置了环境变量,尤其是COHERE_API_KEY,因为它对于访问Cohere的API至关重要。

步骤1:准备文档集合

     我们的聊天机器人需要一个知识库来提取信息。为此,需要创建一个Documents类:

  • 从URLs收集源文档;
  • 使用HTML分区和基于标题的分块将这些文档划分为块;
  • 使用Cohere的嵌入模型嵌入这些块,以便后续进行检索。
class Documents:    def __init__(self, sources):        # Initialization and methods to load, embed, and index documents        # ...    def load(self):        # Load and partition documents        # ...    def embed(self):        # Embed documents using Cohere        # ...    def index(self):        # Create hnswlib index        # ...

步骤2:使用hnswlib对文档建立索引

      一旦文档准备好并表示为嵌入,就可以使用hnswlib创建一个高效的索引,聊天机器人根据查询嵌入快速检索最相关的文档。

# Indexing snippet from the Documents classdef index(self):    print("Indexing documents...")    self.idx = hnswlib.Index(space="ip", dim=1024)    self.idx.init_index(max_elements=self.docs_len, ef_construction=512, M=64)    self.idx.add_items(self.docs_embs, list(range(self.docs_len)))    print(f"Indexing complete with {self.idx.get_current_count()} documents.")

步骤3:建立聊天机器人

      Chatbot类可以利用Cohere的聊天和重排序API生成响应并细化搜索结果。

  • generate_response方法处理用户消息、生成搜索查询并检索相关文档;
  • 然后,使用这些文档生成上下文相关的响应。
class Chatbot:    def __init__(self, docs):        self.docs = docs        self.conversation_id = str(uuid.uuid4())    def generate_response(self, message):        # Generate and process responses        # ...    def retrieve_docs(self, response):        # Retrieve documents based on queries        # ...

步骤4:与Streamlight集成

       要使聊天机器人具有互动性,可以使用Streamlit创建用户友好的web界面。Streamlit支持输入文本,并可以展示聊天机器人的响应。

import streamlit as stdef main():    st.title("AI Chatbot")    user_message = st.text_input("Enter your message:")    if st.button("Send"):        with st.spinner('Generating response...'):            response = chatbot.generate_response(user_message)            for event in response:                st.write(event.text)if __name__ == "__main__":    main()

         运行聊天机器人

streamlit run app.py

结论

       构建RAG支持的聊天机器人是创建能够以有意义的方式理解和响应人类查询的人工智能应用程序的重要一步。通过将Cohere的NLP模型和高效的文档检索相结合,您可以创建一个聊天机器人,它不仅能理解上下文,还能提供知情和准确的回复。

       该项目不仅展示了Generative AI的实际应用,而且对于那些希望深入研究AI和ML领域的人来说,它也是一个极好的学习工具。

       这是一个基本流程,可以更好地理解此应用程序的基本原理。

完整的代码,如下所示:

import streamlit as stimport cohereimport osimport hnswlibfrom your_existing_code import Documents, Chatbot# Initialize the Cohere clientco = cohere.Client(os.environ["COHERE_API_KEY"])# Define your sources here (or load them from an external source)sources = [    {        "title": "Similarity Between Words and Sentences",         "url": "https://docs.cohere.com/docs/similarity-between-words-and-sentences"},    {        "title": "The Attention Mechanism",         "url": "https://docs.cohere.com/docs/the-attention-mechanism"},    {        "title": "Transformer Models",         "url": "https://docs.cohere.com/docs/transformer-models"}   ]# Create instances of your classesdocuments = Documents(sources)chatbot = Chatbot(documents)# Streamlit appdef main():    st.title("AI Chatbot")    # User message input    user_message = st.text_input("Enter your message:", key="user_message")    # Chatbot response    if st.button("Send"):        with st.spinner('Generating response...'):            response = chatbot.generate_response(user_message)            for event in response:                st.write(event.text)  # Display the chatbot's response# Run the appif __name__ == "__main__":    main()

参考文献:

[1] https://medium.com/@fbanespo/how-to-build-a-rag-powered-chatbot-with-chat-embed-and-rerank-a6d8236d7be7

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/305350.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

组件间的值传递:改进若依框架中的BarChart.vue组件

改进前的BarChart 如下是若依(Ruoyi)框架中的BarChart.vue文件&#xff0c;该BarChart.vue无法实现组件间的值传递。到这里您不妨可以试试该如何去传值。如果您不想思考&#xff0c;请看改进后的BarChart。直接拿走使用&#xff01; <template><div :class"cla…

Python新手上路:“用Python和Pygame创造你的流星雨”

文章目录 一、前言二、下载安装过程1.官网下载安装包2.安装python过程第一步第二步第三步第四步第五步安装完成 3.简单测试Python3.1 检查 Python 版本号3.2 打开 Python 解释器3.3 输入你的第一个代码3.4 运行 Python 脚本 4.安装Pygame4.1 cmd命令安装Pygame4.2 pip升级4.3 安…

GPT分区格式

GPT分区格式 [rootlocalhost ~]# gdisk /dev/sdb -bash: gdisk: 未找到命令 [rootlocalhost ~]# yum -y install gdisk- gdisk命令用于查看磁盘使用情况和磁盘分区&#xff08;GPT分区格式&#xff09; - 命令格式&#xff1a;gdisk [选项...] [设备路径] - 常用选项&…

python学习14

前言&#xff1a;相信看到这篇文章的小伙伴都或多或少有一些编程基础&#xff0c;懂得一些linux的基本命令了吧&#xff0c;本篇文章将带领大家服务器如何部署一个使用django框架开发的一个网站进行云服务器端的部署。 文章使用到的的工具 Python&#xff1a;一种编程语言&…

redis的搭建及应用(二)-redis的持久化策略

Redis的持久化策略 RDB RDB持久化是指在指定的时间间隔内将redis内存中的数据集快照写入磁盘&#xff0c;实现原理是redis服务在指定的时间间隔内先fork一个子进程&#xff0c;由子进程将数据集写入临时文件&#xff0c;写入成功后&#xff0c;再替换之前的文件&#xff0c;用二…

pyDAL一个python的ORM(2)pyDAL的安装与初始化

一、pyDAL库的安装 通过PIP方式就能迅速安装 pyDAL pip install pydal 二、PIP安装的常见问题 1、PIP命令无效的排查处理办法 &#xff08;1&#xff09;检查是否 启用pip python -m ensurepip --default-pip &#xff08;2&#xff09;升级 pip版本 python -m pip inst…

web3方向产品调研

每次互联网形态的改变&#xff0c;都会对世界产生很大的影响&#xff0c;上一次对社会产生重大影响的互联网形态&#xff08;Web2.0&#xff09;催生了一批改变人类生活和信息交互方式的企业。 目录 概述DAO是什么&#xff1f;为什么我们需要DAO? 金融服务金融桥接及周边服务D…

Linux下MQTT环境的简单应用及搭建——之Mosquitto

文章目录 前言一、ubuntu搭建mqtt服务器 | 概要二、整体架构流程 | 技术实现细节1、下载源码2、安装Mosquitto3、解压并修改配置文件4、关于Mosquitto常见的一些操作指令5、启动mosquitto6、测试mosquitto测试1&#xff1a;Linux多终端交互测试测试2&#xff1a;Linux与Windows…

一款降压型开关模式转换器解决方案

一、基本概述 TX4145 是一款降压型开关模式转换器。TX4145 在 6-60V 宽输入电源范围内实现不同峰值输出电流&#xff0c;并且具有出色的线电压和负载调整率。 TX4145 采用 PWM 电流模工作模式&#xff0c;环路易于稳定并提供快速的瞬态响应。 TX4145 外部提供 FS 脚&#xf…

Flink Kafka[输入/输出] Connector

本章重点介绍生产环境中最常用到的Flink kafka connector。使用Flink的同学&#xff0c;一定会很熟悉kafka&#xff0c;它是一个分布式的、分区的、多副本的、 支持高吞吐的、发布订阅消息系统。生产环境环境中也经常会跟kafka进行一些数据的交换&#xff0c;比如利用kafka con…

如何在Mac中设置三指拖移,这里有详细步骤

三指拖移手势允许你选择文本&#xff0c;或通过在触控板上用三指拖动窗口或任何其他元素来移动它。它可以用于快速移动或调整窗口、文件或图像在屏幕上的位置。 然而&#xff0c;这个手势在默认情况下是禁用的&#xff0c;因此在本教程中&#xff0c;我们将向你展示如何在你的…

算法导论复习(七) 动态规划

动态规划一般用来求解最优化问题 设计一个动态规划算法一般有以下四步&#xff1a; 描述一个最优解的结构特征。递归地定义最优解的值。计算最优解的值&#xff0c;通常采用自底向上的方法。利用计算出的信息构造出一个最优解。 钢条切割问题 体现了动态规划的一个重要性质&a…