使用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- httpimage: cr.weaviate.io/semitechnologies/weaviate:1.24.10ports:- 8081:8081- 50051:50051volumes:- weaviate_data:/var/lib/weaviaterestart: on-failure:0environment:QUERY_DEFAULTS_LIMIT: 25AUTHENTICATION_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 weaviateclient = 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_envclass 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, InferenceClientexcept ImportError:msg = ("Could not import huggingface_hub python package. ""Please install it with `pip install huggingface_hub`.")raise ImportError(msg)  # noqa: B904huggingfacehub_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 ElevenLabsELEVENLABS_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 parametersresponse = client.text_to_speech.convert(voice_id="pNInz6obpgDQGcFmaJgB", # Adam pre-made voiceoptimize_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 filewith 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_fileload_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 = queryresponse = 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

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

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

相关文章

Spring 事务源码分析

前言: 我们知道 Spring 声明式事务是通过 AOP 来实现的,日常项目开发中我们只需要使用 Transactional 注解就可以实现声明式事务,那你知道通过 Transactional 注解怎样实现事务的吗?本篇我们将从源码来分析 Spring 声明式事务的执…

【测评】OrangePi AIPro环境配置与基础应用

1.介绍 官网:http://www.orangepi.cn/ 社区:http://forum.orangepi.cn/ 昇腾社区:https://www.hiascend.com/ OrangePi AIPro 是一款基于昇腾AI技术的开发板,它采用华为昇腾910E AI芯片,集成4核64位CPU和AI处理器&am…

【Unity之FGUI】黑神章Fairy GUI控件详解

👨‍💻个人主页:元宇宙-秩沅 👨‍💻 hallo 欢迎 点赞👍 收藏⭐ 留言📝 加关注✅! 👨‍💻 本文由 秩沅 原创 👨‍💻 收录于专栏:就业…

宝塔下新增站点 No Input File Specified.错误修复

今天明月收到了一个购买【站长必备在线工具源码含上百款工具-博客优化修复版】用户的求助,在宝塔里新增网站部署好工具源码后,访问出现“No input file specified.”的提示。其实出现这个提示一般都是 PHP 文件无法被解析造成的。 简单排查了一下宝塔相关…

python技巧梳理

背景 在开发中,经常会遇到,同时存在多个值,依次判断上述值,选择第一个非空、True的值作为整个表达式的值进行返回,这个时候会用到or这个关键词,下面讲一下用法。 方法 value1 None value2 0 value3 H…

教师专属的成绩发布小程序

还在为成绩发布而烦恼?还在担心家长无法及时获得孩子的学习反馈?是否想要一个既安全又高效的工具来简化你的教学工作?那么,易查分小程序可能是你一直在寻找的答案。 现在的老师们有了超多的工具来帮助我们减轻负担,提高…

快速搭建 WordPress 外贸电商网站指南

本指南全面解析了在 Hostinger 平台上部署 WordPress 外贸电商网站的详细步骤,涵盖托管方案选择、WordPress 一键安装、主题挑选与演示数据导入、主题个性化定制、SEO插件插件 AIOSEO 安装、通过 GTranslate 实现多语言自动翻译、地区访问控制插件,助力用…

【C++练级之路】【Lv.21】C++11——列表初始化和声明

快乐的流畅:个人主页 个人专栏:《算法神殿》《数据结构世界》《进击的C》 远方有一堆篝火,在为久候之人燃烧! 文章目录 引言一、列表初始化1.1 内置类型1.2 结构体或类1.3 容器 二、声明2.1 auto2.2 decltype2.3 nullptr 三、STL的…

最新dofm飞行棋高阶版,分享情侣版飞行棋高级版和终极版

阿星今天要给大家带来一款甜蜜蜜的小游戏——情侣飞行棋。这不是普通的飞行棋,而是专为情侣设计的,让你们的感情在游戏中升温,擦出更多爱的火花。 准备好了吗?跟着阿星一起,咱们来看看这款软件的魅力所在!…

2024最新机器人相关基础技术总结(1)

机器人分类 功能分类:工业机器人,服务机器人,移动机器人(AGV) 机器人系统组成 组成部分:机器人本体、伺服电机、减速机、伺服驱动器、IO板、控制系统、其他电子元器件。 逐一分析: 本体 机…

抖音小店出单之后怎么发货?抖店详细发货流程来了

大家好,我是喷火龙。 抖音小店发货是有规则的,如果出现超时发货或者虚假发货都会被平台处罚的,会影响我们店铺的评分和正常运营,还有些小伙伴们在发货的时候会遇到平台的违规提醒等问题。 今天我就给大家讲一下抖音小店的发货流…

深度神经网络——什么是决策树?

决策树 决策树是一种强大的机器学习算法,它通过模拟人类决策过程来解决分类和回归问题。这种算法的核心在于它如何将数据集细分,直至每个子集足够“纯净”,即包含的实例都属于同一类别或具有相似的数值范围。 开始于根节点:决策…

推荐3款好用的AI智能写作工具

AI智能写作如今已经很成熟了,不仅有很多AI综合大模型可以实现AI写作,还有很多专门针对AI写作场景专门研发的垂直领域工具。 如果你在工作学习中也想提高写作效率,不妨试试下面3个国内可直接登录使用的AI写作工具,其中不乏有简单易…

【openlayers系统学习】3.1-3.2彩色GeoTIFF图像渲染

一、彩色GeoTIFF图像渲染 Sentinel-2 卫星任务收集并传播覆盖地球陆地表面的图像,重访频率为 2 至 5 天。传感器收集多波段图像,其中每个波段都是电磁频谱的一部分。 2A 级 (L2A) 产品提供以下频段的表面反射率测量: BandDescriptionCentra…

SQLI-labs-第二十五关和第二十五a关

目录 第二十五关 1、判断注入点 2、判断数据库 3、判断表名 4、判断字段名 5、获取数据库的数据 第二十五a关 1、判断注入点 2、判断数据库 第二十五关 知识点:绕过and、or过滤 思路: 通过分析源码和页面,我们可以知道对and和or 进…

集智书童 | YOLOv10开源|清华用端到端YOLOv10在速度精度上都生吃YOLOv8和YOLOv9

本文来源公众号“集智书童”,仅用于学术分享,侵权删,干货满满。 原文链接:YOLOv10开源|清华用端到端YOLOv10在速度精度上都生吃YOLOv8和YOLOv9 在过去几年中,YOLO系列模型已成为实时目标检测领域的主导范式…

小程序内使用路由

一:使用组件 1)创建组件 2)在需要的页面的json/app.json可实现局部使用和全局使用 在局部的话,对象内第一层,window配置也是第一层,而在全局配置也是在第一层,window在window对象内.第二层.内部执行遍历不一样. 3)页面使用 上述所写可实现在页面内使用组件.效果是页面内可以将…

面试被问到不懂的东西,是直接说不懂还是坚持狡辩一下?

大家好,我是瑶琴呀。 面试被问到不懂的东西,是直接说不懂还是坚持狡辩一下?这个问题可以转变一下,如果你顺利拿到 offer,公司安排的工作跟你之前的技术和经验不匹配,你还愿意干下去吗? 转变一…

HC32F103BCB使用SPI获取AS5040编码器数据

1.AS5040介绍 2.硬件电路 硬件上使用SSI通信方式连接。 3.配置硬件SPI 查看手册,AS5040时序 可以看到在空闲阶段不发生数据传输的时候时钟(CLK)和数据(DO)都保持高电位(tCLKFE阶段),在第一个脉冲的下降沿触发编码器载入发送数据,然后每一个…

什么是线程安全?如何保证线程安全?

目录 一、引入线程安全 👇 二、 线程安全👇 1、线程安全概念 🔍 2、线程不安全的原因 🔍 抢占式执行(罪魁祸首,万恶之源)导致了线程之间的调度是“随机的” 多个线程修改同一个变量 修改…