使用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.pswp.cn/diannao/13922.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/13922.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/13922.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

代碼隨想錄算法訓練營第36期DAY37

DAY37 先二刷昨天的3道題目,每種方法都寫:是否已完成:是。 報告:134加油站的樸素法沒寫對。原因是:在if中缺少了store>0的判斷,只給出了indexi的判斷。前進法沒寫出來。因為忘記了總油量的判斷。Sum。…

基于springboot圖書個性化推薦系統源碼數據庫

基于springboot圖書個性化推薦系統源碼數據庫 本論文主要論述了如何使用JAVA語言開發一個圖書個性化推薦系統,本系統將嚴格按照軟件開發流程進行各個階段的工作,采用B/S架構,面向對象編程思想進行項目開發。在引言中,作者將論述圖…

K8s 運維架構師實戰課程

阿良課程收益 掌握Kubernetes企業運維管理 掌握部署、運維、存儲、網絡、監控、日志、CICD、服務網格等實戰全面搞定! 獨立將公司任何項目容器化遷移到K8s平臺 生產環境真實案例 大廠企業實戰經驗 學習最新版、最佳實踐 K8s 運維架構師實戰【初中級】:ht…

docker 方式gost代理搭建以及代理鏈實施

一、項目地址:https://github.com/ginuerzh/gost 二、實施 環境信息 主機名公網IP地址內網IP地址角色beijing101.200.xxx.xxx192.168.0.160單層代理serverbeijing101.200.xxx.xxx192.168.0.160鏈式代理下游serverhk47.238.xxx.xxx172.31.94.207鏈式代理上游serve…

linux誤刪crontab定時任務后的補救措施(隨手記)

起因 想看一眼定時任務的時候,手誤打成了-r,接著我的定時任務就全沒了…… 補救措施 我們都知道,crontab的幾個關鍵目錄中有一個是/var/log/cron,這個目錄記錄了crontab執行的日志。 如果平時沒有備份crontab的習慣的話&#x…

【MySQL精通之路】InnoDB-內存結構-自適應哈希索引

1.作用 自適應哈希索引使InnoDB能夠在具有適當的工作負載組合和足夠的緩沖池內存的系統上執行更像內存中的數據庫,而不會犧牲事務特性或可靠性。 2.設置 自適應哈希索引由innodb_adaptive_hash_index變量啟用 或在服務器啟動時由--skip-innodb-adaptive-has…

VMware 安裝Windows Server 2008 R2

1.下載鏡像 迅雷:ed2k://|file|cn_windows_server_2008_r2_standard_enterprise_datacenter_and_web_with_sp1_x64_dvd_617598.iso|3368839168|D282F613A80C2F45FF23B79212A3CF67|/ 2.安裝過程 自定義名字,點擊【瀏覽】選擇安裝路徑 點擊【瀏覽】選擇前…

鴻蒙應用開發系列 篇三:ArkTS語言

文章目錄 系列文章概述基本語法基本結構概念釋疑聲明式UI描述高級特性自定義組件頁面和自定義組件生命周期狀態管理渲染控制ArkTS語言基礎類庫系列文章 鴻蒙應用開發系列 篇一:鴻蒙系統概述 鴻蒙應用開發系列 篇二:鴻蒙系統開發工具與環境

(Oracle)SQL優化基礎(三):看懂執行計劃順序

往期內容: (Oracle)SQL優化基礎(一):獲取執行計劃 (Oracle)SQL優化基礎(二):統計信息 獲取到執行計劃后,對于新手朋友來講可能不知道…

Qt筆記:動態處理多個按鈕點擊事件以更新UI

問題描述 在開發Qt應用程序時,經常需要處理多個按鈕的點擊事件,并根據點擊的按鈕來更新用戶界面(UI),如下圖。例如,你可能有一個包含多個按鈕的界面,每個按鈕都與一個文本框和一個復選框相關聯…

基于springboot+vue+Mysql的逍遙大藥房管理系統

開發語言:Java框架:springbootJDK版本:JDK1.8服務器:tomcat7數據庫:mysql 5.7(一定要5.7版本)數據庫工具:Navicat11開發軟件:eclipse/myeclipse/ideaMaven包:…

Flutter 中的 FormField 小部件:全面指南

Flutter 中的 FormField 小部件:全面指南 在Flutter的世界里,表單是用戶輸入數據的基本方式之一。FormField是一個強大的小部件,它將表單字段的創建、驗證和管理集成到了一個易于使用的抽象中。本文將為您提供一個全面的指南,幫助…

AWS安全性身份和合規性之AWS Firewall Manager

AWS Firewall Manager是一項安全管理服務,可讓您在AWS Organizations中跨賬戶和應用程序集中配置和管理防火墻規則。在創建新應用程序時,您可以借助Firewall Manager實施一套通用的安全規則,更輕松地讓新應用程序和資源從一開始就達到合規要求…

【flutter】 Running Gradle task ‘assembleDebug‘...超時問題

關聯搜索:flutter下載gradle失敗、AndroidStudio下載gradle失敗 構建Flutter項目時遇到控制臺一直卡在 Running Gradle task ‘assembleDebug’… 解決方案 1. 修改gradle-wrapper.properties 文件 如果找不到就直接搜索: 把https\://services.gradl…

vscode更改語言,記錄一下

首先打開安裝好的Vscode軟件,可以看到頁面上顯示的是英文效果。 同時按鍵ctrlshiftp,接著在輸入框中輸入 configure Display language如圖: 選擇中文簡體就ok了,如果沒有則安裝 chinese Language pack

大模型日報2024-05-23

大模型日報 2024-05-23 大模型資訊 減少生成型AI和大型語言模型中的幻覺現象 摘要: Phocuswright即將發布全面報告《從流行詞到實際效益:跟上旅游業中生成型AI的步伐》。該報告預覽指出,降低生成型人工智能及大型語言模型在生成內容時出現的幻覺現象是行…

git二次上傳文件夾、文件

主要記錄自己遇到的問題。 一、報錯error:failed to push somes ref to..... 報錯:error the following untracked working tree files would be overwritten bt merge... 把報錯的(重復的文件刪除) git init git add -f 文件夾/文件名…

vue 使用iView組件中的Table實現定時自動滾動

封裝Table 要在css中設置table的高度&#xff0c;使數據過多時出現滾動條&#xff0c;將縱向設置為overflow-y: auto;橫向設置隱藏 overflow-x: hidden; <template><div class"table_container"><Table :loading"tableLoading" :columns&qu…

vue3 ElementUI 日期禁選當日前, 當日后,幾天后,幾天前(例如3天后)

今日之前禁用 代碼: ( 主要是 :disabledDate“disabledDateFun” ) <el-date-picker v-model"queryForm.selectedDate"type"date"range-separator"-"placeholder"選擇日期":disabledDate"disabledDateFun" clearable /&…

前端面試:項目細節重難點問題分享

面試官提問&#xff1a;我現在給你出一個項目實際遇到的問題&#xff1a;由于后端比較忙&#xff0c;所以我們這邊的列表數據排序需要前端最近實現&#xff0c;那你會怎么實現排序呢&#xff1f; 答&#xff1a;我的回答&#xff1a;確實&#xff0c;數據都是由后端實現的&…