使用RAG和文本转语音功能,我构建了一个 QA 问答机器人

节前,我们星球组织了一场算法岗技术&面试讨论会,邀请了一些互联网大厂朋友、参加社招和校招面试的同学.

针对算法岗技术趋势、大模型落地项目经验分享、新手如何入门算法岗、该如何准备、面试常考点分享等热门话题进行了深入的讨论。

汇总合集:《大模型实战宝典》(2024版)正式发布!


我们已经进入了一个大规模使用大型语言模型(LLM)的年代。无论是简单的搜索引擎还是功能广泛的聊天机器人,LLM都在满足各类业务需求方面发挥了重要作用。

企业经常需要的一种工具是问答(QA)机器人。这是一种由AI驱动的工具,能够快速回答用户输入的问题。

在本文中,我们将开发一种结合RAG和文本转语音(TTS)功能的QA-LLM机器人。

我们该如何实现呢?让我们一探究竟。

项目结构

在这个项目中,我们将遵循以下结构。

项目将遵循以下步骤:

  1. 使用 Docker 部署开源的 Weaviate 向量数据库。
  2. 阅读《保险手册》PDF 文件,并使用 HuggingFace 公共托管的嵌入模型对数据进行嵌入。
  3. 将嵌入存储到 Weaviate 向量存储(知识库)中。
  4. 使用 HuggingFace 公共托管的嵌入模型和生成模型开发 RAG 系统。
  5. 使用 ElevenLabs 的文本转语音模型将 RAG 输出转换为音频。
  6. 使用 Streamlit 创建前端。

总体来说,我们将遵循这 6 个步骤来创建带有 RAG 和 TTS 的问答工具。

现在开始吧。

准备工作

在开始之前,我们需要准备一些包含所有需求的 Python 文件,以确保我们的应用程序能够正常运行。

首先,我们需要 HuggingFace API 访问令牌,因为我们将使用托管在那里的模型。如果你已经在 HuggingFace 注册,可以在令牌页面获取它们。

此外,我们将使用 ElevenLabs 的文本转语音模型。因此,请注册他们的免费帐户并获取 API 密钥。

拿到这两个 API 密钥后,你需要创建一个 .env 文件来存储这些密钥。将以下代码填入该文件:

ELEVENLABS_API_KEY= 'Your-ElevenLabs-API'
HUGGINGFACEHUB_API_TOKEN = 'Your-HuggingFace-API'

接下来,我们将通过安装所有必要的包来设置环境:

pip install langchain langchain-community langchain-core weaviate-client elevenlabs streamlit python-dotenv huggingface_hub sentence-transformers

准备工作完成后,让我们开始创建应用程序。

部署 Weaviate 向量数据库
对于本教程,你需要安装 Docker Desktop。如果还没有安装,可以在 Docker 网站上下载安装程序。

为了轻松部署 Weaviate 向量数据库,我们将遵循 Weaviate 的设置建议。在部署过程中,我们将使用 docker-compose 进行部署,你可以在下面的代码中看到:

version: '3.4'
services:
  weaviate:
    command:
    - --host
    - 0.0.0.0
    - --port
    - '8081'
    - --scheme
    - http
    image: cr.weaviate.io/semitechnologies/weaviate:1.24.10
    ports:
    - 8081:8081
    - 50051:50051
    volumes:
    - weaviate_data:/var/lib/weaviate
    restart: on-failure:0
    environment:
      QUERY_DEFAULTS_LIMIT: 25
      AUTHENTICATION_ANONYMOUS_ACCESS_ENABLED: 'true'
      PERSISTENCE_DATA_PATH: '/var/lib/weaviate'
      DEFAULT_VECTORIZER_MODULE: 'none'
      ENABLE_MODULES: 'text2vec-cohere,text2vec-huggingface,text2vec-palm,text2vec-openai,generative-openai,generative-cohere,generative-palm,ref2vec-centroid,reranker-cohere,qna-openai'
      CLUSTER_HOSTNAME: 'node1'
volumes:
  weaviate_data:

在你选择的环境中,创建一个名为 docker-compose.yml 的文件,并复制上述代码。上述代码将从 Weaviate 拉取镜像,并包含所有相关模块。这段代码还将通过 PERSISTENCE_DATA_PATH 提供数据持久化。Weaviate 向量存储也会暴露在端口 8081。

一切准备就绪后,在终端中运行以下代码:

docker-compose up


在 Docker Desktop 中,你应该会看到类似上面的容器。这样,我们已经设置好了开源向量数据库。

构建保险手册知识库

项目的下一部分是使用 LangChain、HuggingFace 和 Weaviate 构建知识库。此部分的目标是构建一个向量数据库,该数据库包含来自《保险手册》的嵌入结果,可以从应用程序中访问。

首先,我们将设置 Weaviate 客户端和嵌入模型。可以使用以下代码进行设置:

from langchain.text_splitter import RecursiveCharacterTextSplitter
from langchain_community.document_loaders import PyPDFLoader
from langchain_community.embeddings import HuggingFaceEmbeddings
from langchain_community.vectorstores import Weaviate
import weaviate

client = weaviate.Client(
    url="http://localhost:8081", 
)

model_name = "sentence-transformers/all-mpnet-base-v2"
model_kwargs = {'device': 'cpu'}
encode_kwargs = {'normalize_embeddings': False}

hf = HuggingFaceEmbeddings(
    model_name=model_name,
    model_kwargs=model_kwargs,
    encode_kwargs=encode_kwargs
)

在上面的代码中,我们通过连接到 localhost:8081 来设置 Weaviate 客户端,并使用简单的 mpnet 句子转换模型设置 HuggingFace 嵌入模型。

接下来,我们将使用 LangChain 读取《保险手册》PDF 并将文本数据分割成一定的块。

loader = PyPDFLoader("Insurance_Handbook_20103.pdf")
pages = loader.load_and_split()

text_splitter = RecursiveCharacterTextSplitter(
    chunk_size=1000,
    chunk_overlap=50,
    length_function=len,
    is_separator_regex=False,
)

texts = text_splitter.split_documents(pages)
full_texts = [i.page_content for i in texts]

分割文本数据非常重要,因为它有助于处理模型的文本大小限制,并确保每个文本段都是有意义且上下文完整的。如果觉得结果不好,可以尝试调整 chunk_size 和 chunk_overlap 参数。

最后,我们将嵌入的文本数据存储在 Weaviate 向量数据库中,使用以下代码:

vector_db = Weaviate.from_texts(
    full_texts, hf, client=client, by_text=False, 
    index_name='BookOfInsurance', text_key='intro'
)

这样,我们已经构建好了知识库。如果你想测试数据库,可以使用以下代码进行相似性搜索:

print(vector_db.similarity_search("What is expense ratio?", k=3))

最后,记得关闭 Weaviate 客户端:

client.close()

开发基于 RAG 和文本转语音 (TTS) 的 QA-LLM 工具

在创建工具之前,我们需要设置一些实用文件。

实用文件设置

首先,我们将设置 LLM 生成模型与 LangChain 和 HuggingFace 的连接。写这篇文章时,连接过程中存在一个 bug,因此我们需要开发一个惰性连接以避免使用 HuggingFace 令牌登录。
我们会将以下代码保存到 utils 文件夹中的 hf_lazyclass.py 文件中:

from langchain_community.llms.huggingface_endpoint import HuggingFaceEndpoint
from langchain_core.pydantic_v1 import root_validator
from langchain_core.utils import get_from_dict_or_env

class LazyHuggingFaceEndpoint(HuggingFaceEndpoint):
    """LazyHuggingFaceEndpoint"""

    @root_validator()
    def validate_environment(cls, values):
        """Validate that package is installed; SKIP API token validation."""
        try:
            from huggingface_hub import AsyncInferenceClient, InferenceClient
        except ImportError:
            msg = (
                "Could not import huggingface_hub python package. "
                "Please install it with `pip install huggingface_hub`."
            )
            raise ImportError(msg)  # noqa: B904

        huggingfacehub_api_token = get_from_dict_or_env(
                values, "huggingfacehub_api_token", "HUGGINGFACEHUB_API_TOKEN"
            )

        values["client"] = InferenceClient(
            model=values["model"],
            timeout=values["timeout"],
            token=huggingfacehub_api_token,
            **values["server_kwargs"],
        )
        values["async_client"] = AsyncInferenceClient(
            model=values["model"],
            timeout=values["timeout"],
            token=huggingfacehub_api_token,
            **values["server_kwargs"],
        )

        return values

接下来,我们将创建文本转语音类文件,命名为 tts_speech.py,内容如下:

import os
import uuid
from elevenlabs import VoiceSettings
from elevenlabs.client import ElevenLabs

ELEVENLABS_API_KEY = os.getenv("ELEVENLABS_API_KEY")
client = ElevenLabs(
    api_key=ELEVENLABS_API_KEY,
)

def text_to_speech_file(text: str) -> str:
    # Calling the text_to_speech conversion API with detailed parameters
    response = client.text_to_speech.convert(
        voice_id="pNInz6obpgDQGcFmaJgB", # Adam pre-made voice
        optimize_streaming_latency="0",
        output_format="mp3_22050_32",
        text=text,
        model_id="eleven_turbo_v2", # use the turbo model for low latency, for other languages use the `eleven_multilingual_v2`
        voice_settings=VoiceSettings(
            stability=0.0,
            similarity_boost=1.0,
            style=0.0,
            use_speaker_boost=True,
        ),
    )

    save_file_path = f"{uuid.uuid4()}.mp3"

    # Writing the audio to a file
    with open(save_file_path, "wb") as f:
        for chunk in response:
            if chunk:
                f.write(chunk)

    print(f"{save_file_path}: A new audio file was saved successfully!")

    return save_file_path

以上代码中,我们使用了预设的声音,你可以在 ElevenLabs 的 Voice Lab 中找到适合工具的声音。

开发工具

这一部分将结合所有内容,通过 Streamlit 前端展示 RAG 和 TTS 模型。

首先,设置生成模型和 Weaviate 向量数据库连接:

import streamlit as st
import weaviate
from langchain_community.vectorstores import Weaviate
from langchain_community.embeddings import HuggingFaceEmbeddings
from langchain.chains import RetrievalQA
from dotenv import load_dotenv
import os
from utils.hf_lazyclass import LazyHuggingFaceEndpoint
from utils.tts_speech import text_to_speech_file

load_dotenv()
hf_token = os.getenv("HUGGINGFACEHUB_API_TOKEN")

client = weaviate.Client(
    url="http://localhost:8081",  
)
repo_id = "mistralai/Mistral-7B-Instruct-v0.2"

llm = LazyHuggingFaceEndpoint(
    repo_id=repo_id, max_new_tokens=128, temperature=0.5, huggingfacehub_api_token=hf_token 
)

model_name = "sentence-transformers/all-mpnet-base-v2"
model_kwargs = {'device': 'cpu'}
encode_kwargs = {'normalize_embeddings': False}

hf = HuggingFaceEmbeddings(
    model_name=model_name,
    model_kwargs=model_kwargs,
    encode_kwargs=encode_kwargs
)

以上代码中,我们初始化了 Weaviate 客户端、生成 LLM 模型和 HuggingFace 嵌入模型。在这个例子中,我使用 Mistral Instruct LLM 模型作为生成 LLM 模型。

接下来,使用以下代码设置 RAG 系统:

response = client.schema.get()

weaviate_vectorstore = Weaviate(client=client, 
    index_name=response['classes'][0]['class'], 
    text_key="intro", by_text=False, embedding=hf)
retriever = weaviate_vectorstore.as_retriever()

qa_chain = RetrievalQA.from_chain_type(
    llm=llm, chain_type="stuff", retriever=retriever
)

最后,我们使用以下代码设置了 Streamlit 文件,使其能够接受文本输入并提供音频输出。

st.title('Insurance Handbook QA with Voice')

st.write("""
这是一个简单的应用程序,我们利用 RAG 和文本转语音来回答您关于保险的所有问题。

在这个应用程序中,我们使用以下技术栈:

1. Weaviate 向量数据库与 Docker 主机
2. LangChain LLM 框架
3. HuggingFace 嵌入模型 all-mpnet-base-v2
4. HuggingFace 生成模型 Mistral-7B-Instruct-v0.2
5. Elevenlabs 文本转语音模型
6. Streamlit 用于前端           
""")

if 'prompt' not in st.session_state:
    st.session_state.prompt = ''
  
if 'audiofile' not in st.session_state:
    st.session_state.audiofile = ''  

query  = st.text_input("请输入您的保险问题👇", "")
if st.button("回答我的问题"):
    st.session_state.prompt = query
    response = qa_chain.invoke(query)

    st.session_state.audiofile = text_to_speech_file(response['result'])
    st.audio(st.session_state.audiofile, format="audio/mpeg", loop = False)

如果一切顺利,让我们运行这个 Streamlit 文件。您应该会看到页面和下面的图像类似。

好的,请把音频文件上传,我会帮你处理翻译。如果需要,我也可以提供文字翻译。请告诉我你的具体需求。

这就是全部。你可以调整模型、语音和前端页面,使其更加有趣。你还可以为你所需的领域构建自己的知识库。

结论

我们已经探索了如何使用RAG(检索增强生成)和文本转语音技术来构建我们的问答工具。通过结合开源工具和模型,我们可以构建一个企业所需要的高级工具。

技术交流群

前沿技术资讯、算法交流、求职内推、算法竞赛、面试交流(校招、社招、实习)等、与 10000+来自港科大、北大、清华、中科院、CMU、腾讯、百度等名校名企开发者互动交流~

我们建了算法岗技术与面试交流群, 想要获取最新面试题、了解最新面试动态的、需要源码&资料、提升技术的同学,可以直接加微信号:mlc2040。加的时候备注一下:研究方向 +学校/公司+CSDN,即可。然后就可以拉你进群了。

方式①、微信搜索公众号:机器学习社区,后台回复:加群
方式②、添加微信号:mlc2040,备注:技术交流

用通俗易懂方式讲解系列

  • 《大模型面试宝典》(2024版) 正式发布!

  • 《大模型实战宝典》(2024版)正式发布!

  • 用通俗易懂的方式讲解:自然语言处理初学者指南(附1000页的PPT讲解)

  • 用通俗易懂的方式讲解:1.6万字全面掌握 BERT

  • 用通俗易懂的方式讲解:NLP 这样学习才是正确路线

  • 用通俗易懂的方式讲解:28张图全解深度学习知识!

  • 用通俗易懂的方式讲解:不用再找了,这就是 NLP 方向最全面试题库

  • 用通俗易懂的方式讲解:实体关系抽取入门教程

  • 用通俗易懂的方式讲解:灵魂 20 问帮你彻底搞定Transformer

  • 用通俗易懂的方式讲解:图解 Transformer 架构

  • 用通俗易懂的方式讲解:大模型算法面经指南(附答案)

  • 用通俗易懂的方式讲解:十分钟部署清华 ChatGLM-6B,实测效果超预期

  • 用通俗易懂的方式讲解:内容讲解+代码案例,轻松掌握大模型应用框架 LangChain

  • 用通俗易懂的方式讲解:如何用大语言模型构建一个知识问答系统

  • 用通俗易懂的方式讲解:最全的大模型 RAG 技术概览

  • 用通俗易懂的方式讲解:利用 LangChain 和 Neo4j 向量索引,构建一个RAG应用程序

  • 用通俗易懂的方式讲解:使用 Neo4j 和 LangChain 集成非结构化知识图增强 QA

  • 用通俗易懂的方式讲解:面了 5 家知名企业的NLP算法岗(大模型方向),被考倒了。。。。。

  • 用通俗易懂的方式讲解:NLP 算法实习岗,对我后续找工作太重要了!。

  • 用通俗易懂的方式讲解:理想汽车大模型算法工程师面试,被问的瑟瑟发抖。。。。

  • 用通俗易懂的方式讲解:基于 Langchain-Chatchat,我搭建了一个本地知识库问答系统

  • 用通俗易懂的方式讲解:面试字节大模型算法岗(实习)

  • 用通俗易懂的方式讲解:大模型算法岗(含实习)最走心的总结

  • 用通俗易懂的方式讲解:大模型微调方法汇总

参考链接:https://pub.towardsai.net/crafting-qa-tool-with-reading-abilities-using-rag-and-text-to-speech-d4208330a1e4

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

S1C17M02/M03专为数字万用表设计

在电子及自动化领域,精确的测量数据是至关重要的环节。无论是在生产线的质量控制实验室的研究测试还是复杂电子系统的故障诊断,数字万用表都是一种不可或缺的工具,随着技术的进步,对测量参数、精度的要求越来越高,同时对设备的体积…

精准安全运维,统信UOS服务器版V20(1070)漏洞修复指南丨年度更新

随着信息安全威胁的不断升级,操作系统的安全性已成为企业运维的关键要素。 为了确保业务运行环境的安全无忧,统信软件持续致力于技术创新和优化,并于日前重磅推出了统信UOS服务器版V20(1070)。该系统提供了高频补丁更…

0407放大电路的频率响应

放大电路的频率响应 单时间常数RC电路的频率响应中频响应高频响应低频响应全频域响应 放大电路频率响应概述1. 直接耦合放大电路频域响应阻容耦合放大电路频域响应 4.7.1 单时间常数RC电路的频率响应 4.7.2 放大电路频率响应概述 4.7.3 单级共射极放大电路的频率响应 4.7.4 单级…

机器学习圣经PRML作者Bishop推出重磅教材

图1 书籍《Pattern Recognition and Machine Learning》 只要学人工智能的人,必然学机器学习。 只要学机器学习的人,必然看PRML。 PRML为何物? PRML全名《Pattern Recognition and Machine Learning》,一部机器学习领域的内功…

Git总结超全版

最近想系统的回顾一下Git的使用,如果只想快速的集成git到idea,可以参考另一篇我的博客中的git部分 目录 版本管理工具简介Git安装与配置Git远程仓库配置 Git常用命令为常用命令配置别名(可选)Git忽略文件.gitignore一些概念*本地仓库操作删除仓库内容 *远…

RabbitMQ的基本组件有哪些?

RabbitMQ的基本组件有哪些? RabbitMQ介绍、解耦、提速、削峰、分发 详解、RabbitMQ安装 可视化界面讲解 RabbitMQ 不生产消息,他是消息的搬运工。 1. Producer: 消息的发布者。 2. Connection:producer/comsumer 和 Message Broker 之间的 TCP 连接。 3…

Vue3:封装Table 表格组件

组件官网 elementPlus : 点击跳转 封装组件 创建新的组件文件: Table.vue <!-- PropTableS &#xff1a; 父组件传递过来的数据 (对象)PropTableS.tables : 父组件传递的对象中 存放表格每行显示的数据PropTableS.keyS &#xff1a; 父组件传递过来的对象&#xff0c;里…

Navicat 连接 OceanBase 快速入门 | 社区版

Navicat Premium&#xff08;16.1.9或更高版本&#xff09;正式支持 OceanBase全线数据库产品。OceanBase为现代数据架构打造的开源分布式数据库。兼容 MySQL 的单机分布式一体化国产开源数据库&#xff0c;具有原生分布式架构&#xff0c;支持金融级高可用、透明水平扩展、分布…

MySQL索引和视图

MySQL索引和视图是关系型数据库MySQL中的两个重要概念。索引用于优化数据库的查询性能&#xff0c;而视图用于提供一个逻辑上的表结构&#xff0c;方便用户查询和操作数据。 索引是一种数据结构&#xff0c;可以加速对数据库表中的数据进行查询的速度。通过创建索引&#xff0…

安卓绕过限制直接使用Android/data无需授权,支持安卓14(部分)

大家都知道&#xff0c;安卓每次更新都会给权限划分的更细、收的更紧。   早在安卓11的时候还可以直接通过授权Android/data来实现操作其他软件的目录&#xff0c;没有之前安卓11授权的图了&#xff0c;反正都长一个样&#xff0c;就直接贴新图了。   后面到了安卓12~13的…

软件测试人必看,定位问题小技巧

当你在上班期间&#xff0c;听到不远处传来这样的声音“你会不会提BUG&#xff0c;责任人都指派错了&#xff0c;这也太菜了吧”。 作为一名测试人员&#xff0c;提BUG&#xff0c;要有一定的专业性、严谨性。 一 定位bug的重要性 1、找到bug原因后&#xff0c;可以明确地指…

Docker-Android安卓模拟器本地部署并实现远程开发测试

文章目录 1. 虚拟化环境检查2. Android 模拟器部署3. Ubuntu安装Cpolar4. 配置公网地址5. 远程访问小结 6. 固定Cpolar公网地址7. 固定地址访问 本文主要介绍如何在Ubuntu系统使用Docker部署docker-android安卓模拟器&#xff0c;并结合cpolar内网穿透工具实现公网远程访问本地…

技术前沿 |【自回归视觉模型ImageGPT】

自回归视觉模型ImageGPT 引言一、ImageGPT的基本原理与创新之处二、ImageGPT在图像生成、理解等视觉任务上的应用三、ImageGPT对后续视觉Transformer模型发展的影响四、ImageGPT的深入应用 引言 在人工智能的飞速发展中&#xff0c;视觉模型作为其中一个重要的分支&#xff0c…

xlrd.biffh.XLRDError: Excel xlsx file; not supported报错原因

xlrd库读取xlsx文件时报错 xlrd.biffh.XLRDError: Excel xlsx file; not supported报错原因&#xff1a; xlrd版本为2.1版本&#xff0c;需要读取xlsx文件需要安装xlrd低一些版本1.2.0版本&#xff0c;重新安装重试即可 更换xlrd版本 重新运行

微软开发者大会,Copilot Agents发布,掀起新一轮生产力革命!

把AI融入生产力工具的未来会是什么样&#xff1f;微软今天给出了蓝图。 今天凌晨&#xff0c;微软召开了Microsoft Build 2024 开发者大会&#xff0c;同前两天的Google I/O开发者大会一样&#xff0c;本次大会的核心词还是“AI”&#xff0c;其中最主要的内容是最新的Copilot…

shell 脚本笔记2

3.env与set区别 env用于查看系统环境变量 set用于查看系统环境变量自定义变量函数 4.常用环境变量 变量名称含义PATH命令搜索的目录路径, 与windows的环境变量PATH功能一样LANG查询系统的字符集HISTFILE查询当前用户执行命令的历史列表 Shell变量&#xff1a;自定义变量 目标…

37. 解数独 - 力扣(LeetCode)

基础知识要求&#xff1a; Java&#xff1a; 方法、for循环、if else语句、数组 Python&#xff1a; 方法、for循环、if else语句、列表 题目&#xff1a; 编写一个程序&#xff0c;通过填充空格来解决数独问题。 数独的解法需 遵循如下规则&#xff1a; 数字 1-9 在每一行…

Ubuntu 20/22 安装 Jenkins

1. 使用 apt 命令安装 Java Jenkins 作为一个 Java 应用程序&#xff0c;要求 Java 8 及更高版本&#xff0c;检查系统上是否安装了 Java。 sudo apt install -y openjdk-17-jre-headless安装完成后&#xff0c;再次验证 Java 是否已安装 java --version2. 通过官方存储库安…

Linux多线程系列2: 模拟封装简易语言级线程库,线程互斥和锁,线程同步和条件变量,线程其他知识点

Linux多线程系列2: 模拟封装简易语言级线程库,线程互斥和互斥锁,线程同步和条件变量,线程其他知识点 1.前言 一.模拟C11线程库自己封装简易语言级线程库1.实现框架2.迅速把构造等等函数写完3.start和work1.尝试一2.尝试二3.最终版本4.给出代码 二.模拟实现多线程(为编写线程池做…

Llama 3超级课堂作业笔记

文章目录 基础作业完成 Llama 3 Web Demo 部署环境配置下载模型Web Demo 部署对话截图 使用 XTuner 完成小助手认知微调Web Demo 部署自我认知训练数据集准备训练模型推理验证 使用 LMDeploy 成功部署 Llama 3 模型环境&#xff0c;模型准备LMDeploy CLI chatLMDeploy模型量化(…