链载Ai

标题: 基于Llama 3 构建RAG语音助手:将本地 RAG 与 Qdrant、Whisper 和 LangChain 集成 [打印本页]

作者: 链载Ai    时间: 2025-12-2 09:52
标题: 基于Llama 3 构建RAG语音助手:将本地 RAG 与 Qdrant、Whisper 和 LangChain 集成

ingFang SC", "Hiragino Sans GB", "Microsoft YaHei UI", "Microsoft YaHei", Arial, sans-serif;font-size: 1.2em;font-weight: bold;display: table;margin: 2em auto 1em;padding-right: 1em;padding-left: 1em;border-bottom: 2px solid rgb(0, 152, 116);color: rgb(63, 63, 63);">基于Llama 3 构建RAG语音助手:将本地 RAG 与 Qdrant、Whisper 和 LangChain 集成

ingFang SC";font-size: 14px;text-wrap: wrap;text-align: left;line-height: 1.75;margin: 1.5em 8px;letter-spacing: 0.1em;color: rgb(63, 63, 63);">语音启用的人工智能应用将永远改变我们与技术的互动方式。

ingFang SC", "Hiragino Sans GB", "Microsoft YaHei UI", "Microsoft YaHei", Arial, sans-serif;margin: 1.5em 8px;letter-spacing: 0.1em;color: rgb(63, 63, 63);">大家都听说过 OpenAI 和 Google 的最新消息,多模态系统是未来。

ingFang SC", "Hiragino Sans GB", "Microsoft YaHei UI", "Microsoft YaHei", Arial, sans-serif;margin: 1.5em 8px;letter-spacing: 0.1em;color: rgb(63, 63, 63);">拥有人类般的声音,语音助手将扩展任何对话任务,无论是入站销售、客户支持还是数据收集和验证。

ingFang SC", "Hiragino Sans GB", "Microsoft YaHei UI", "Microsoft YaHei", Arial, sans-serif;margin: 1.5em 8px;letter-spacing: 0.1em;color: rgb(63, 63, 63);">这就是为什么 OpenAI 和 Google 在 GPT 和 Gemini 系列模型中引入了多模态功能,以适应文本、音频、图像和视频输入,以获取各种用例的企业采用的早期份额。

ingFang SC", "Hiragino Sans GB", "Microsoft YaHei UI", "Microsoft YaHei", Arial, sans-serif;margin: 1.5em 8px;letter-spacing: 0.1em;color: rgb(63, 63, 63);">例如,GPT-4o 的性能与 GPT-4 相匹配并超越,而且

ingFang SC", "Hiragino Sans GB", "Microsoft YaHei UI", "Microsoft YaHei", Arial, sans-serif;margin: 1.5em 8px;letter-spacing: 0.1em;color: rgb(63, 63, 63);">还有许多社交媒体上的帖子展示了代码解释器有多么好,而且在数据分析和可视化方面做得更好。

ingFang SC", "Hiragino Sans GB", "Microsoft YaHei UI", "Microsoft YaHei", Arial, sans-serif;margin: 1.5em 8px;letter-spacing: 0.1em;color: rgb(63, 63, 63);">这对应用程序开发人员来说是巨大的好处,我们知道开源将在 2024 年完全赶上闭源模型。

ingFang SC", "Hiragino Sans GB", "Microsoft YaHei UI", "Microsoft YaHei", Arial, sans-serif;margin: 1.5em 8px;letter-spacing: 0.1em;color: rgb(63, 63, 63);">这就是为什么在本教程中,我想带你走进使用当今最先进的开源模型创建一个复杂的语音助手的过程。

我们将使用以下内容:

让我们构建一个由 Llama 3 提供动力的语音助手,它不仅响应迅速,而且智能且能够高效扩展。

不同行业的语音助手

多模态语音助手可以通过智能音箱、智能手机、可穿戴设备和智能家居系统与用户进行交互。

它们能够与其他技术集成,例如增强现实(AR)和虚拟现实(VR),以提供沉浸式体验。

例如,用户可以向语音助手询问方向,它不仅可以提供口头指示,还可以在连接的 VR/AR 头显上显示路线,如 Apple Vision Pro。

这种模态的融合允许更丰富和更互动的参与,满足更广泛的用户需求和偏好。

行业向客户提供产品和服务的方式也将发生变化:

  1. 1. 金融:语音助手将通过个性化服务和实时欺诈警报来简化银行流程。它们将促进交易,提供余额更新,并帮助用户通过设置预算和跟踪支出来管理财务。

  2. 2. 医疗保健:语音助手将通过无需使用手部操作、用药提醒和预约安排来增强患者管理和老年护理。它们还可以为患者提供医生日程的即时更新,并协助打印检测结果。此外,它们可以提供健康提示,通过连接的设备监测生命体征,并提供紧急警报。对于医疗保健专业人员来说,语音助手可以转录医疗笔记,访问患者记录,并简化行政任务,从而提高效率和患者护理质量。如果考虑到全球医疗工作者短缺和最近关于医生倦怠的报道,这一点尤为重要。

  3. 3. 零售:语音助手将优化客户服务和库存管理,提高购物体验和运营效率。它们帮助客户找到产品,回答问题,并根据购物历史提供个性化推荐。对于零售商来说,语音助手可以自动补货,跟踪库存水平,并促进订单处理。它们还通过发送促销优惠和收集客户反馈来支持营销工作。

你已经有了这个想法 - 通过将这些系统整合到我们的日常运营中,我们可以提高生产力、客户体验和满意度。让我们开始制作一个工具,它可以重新定义我们与数字环境的互动方式。

开发 Llama 3 动力语音助手

在开始教程之前,请确保您准备好以下资源:

对于 Google Colab 用户,我们首先需要在 Colab 环境中挂载 Google Drive,以便访问和利用我们的数据进行计算。

#指定不同的挂载点
mountpoint="/content/my_drive"
#挂载GoogleDrive
fromgoogle.colabimportdrive
drive.mount(mountpoint)

否则,我将在本地运行所有示例。

现在,我们需要安装以下库:

让我们首先设置一个虚拟环境并安装库。打开您的命令行界面(可以是命令提示符、终端或您熟悉的任何其他命令行工具),然后运行以下命令:

#创建虚拟环境
mkdirllama3-whisper&&cdllama3-whisper
python3-mvenvllama3-whisper-env
sourcellama3-whisper-env/bin/activate
#安装依赖库
pip3install--no-depstorch==2.0.0torchvision==0.15.1torchaudio==2.0.1
pip3installopenai
pip3install-qtransformers==4.33.0
pip3install-qaccelerate==0.22.0
pip3install-qeinops==0.6.1
pip3install-qlangchain==0.0.300
pip3install-qxformers==0.0.21
pip3install-qbitsandbytes==0.41.1
pip3install-qsentence_transformers==2.2.2
pip3installarxiv
pip3install-qipykerneljupyter
pip3install-q--upgradehuggingface_hub

最后,为了准备环境以从 PDF 文件中提取数据、执行 OCR 并创建嵌入以进行高级数据处理和检索,我们还需要安装一些其他库:

pip3installunstructured
pip3install"unstructured[pdf]"
apt-getinstall-ypoppler-utils
pip3installpytesseract
apt-getinstall-ytesseract-ocr
pip3install--upgradeqdrant-client
pip3installWhisperSpeech

作为最后一步,让我们登录到 Hugging Face Hub 并打开我们的 IDE:

#登录到HuggingfaceHub
huggingface-clilogin
#可选地,启动 VSCode 或您喜欢的 IDE,然后让我们开始吧!
code.

太棒了!要继续,您可以创建.py文件或.ipynb文件(笔记本)。我将继续使用 Jupyter 笔记本,以便按块运行代码并交互式地检查结果。

是时候构建语音助手了!

导入库

我们导入所有必要的库,支持此设置的各个方面,包括模型交互、文档处理和嵌入管理。

importos
importsys
importarxiv
fromtorchimportcuda,bfloat16
importtorch
importtransformers
fromtransformersimportAutoTokenizer,AutoModelForCausalLM
fromtimeimporttime
fromlangchain.llmsimportHuggingFacePipeline
fromlangchain.document_loadersimportPyPDFLoader,DirectoryLoader,WebBaseLoader
fromlangchain.text_splitterimportRecursiveCharacterTextSplitter,CharacterTextSplitter
fromlangchain.embeddingsimportHuggingFaceEmbeddings
fromlangchain.chainsimportRetrievalQA
fromlangchain.vectorstoresimportQdrant
frompathlibimportPath
fromopenaiimportOpenAI
fromIPython.displayimportAudio,display
fromwhisperspeech.pipelineimportPipeline

处理语音助手的数据

在继续之前,我想停下来详细介绍一下为AI应用构建数据管道的问题。

数据管道对于高效管理和处理现代应用中的数据至关重要,特别是在开发由RAG启用的LLM驱动的复杂应用程序时。

这些管道通常涉及五个关键阶段:

  1. 1.收集:在这个阶段,数据从各种来源收集,包括数据存储、数据流和应用程序。对于语音助手来说,这意味着收集来自用户交互、音频输入以及内部和外部数据库的数据。数据可以来自语音助手需要与之交互的远程设备、应用程序或业务系统。常用的工具有Apache Nifi、Apache Flume、Talend和自定义API。

  2. 2.摄取:在摄取过程中,收集到的数据被加载到系统中,并在事件队列中组织。对于语音助手来说,这涉及捕获音频输入,将其转录为文本,并将其排队进行进一步处理。摄取过程确保所有传入的数据都准备好进行实时或批处理。常用的工具有Apache Kafka、AWS Kinesis、Google Cloud Pub/Sub、Apache Airflow。

  3. 3.存储:在摄取后,组织好的数据存储在各种存储解决方案中,如数据仓库、数据湖和数据湖仓库。在语音助手的上下文中,这包括存储转录、用户查询和从RAG系统检索的文档。存储系统确保数据可供将来的处理和分析使用。常用的工具有Amazon S3、Google Cloud Storage、Azure Data Lake、Snowflake、Apache Hudi、Delta Lake。

  4. 4.处理:在这个阶段,数据经过转换任务,如聚合、清洗和操作,以确保其符合所需的标准。对于语音助手来说,这意味着将文本数据转换为向量、压缩并进行分区以实现高效检索。批处理(一次处理大量数据集)和流处理(实时处理数据)技术都被用于确保数据始终是最新和准确的。常用的工具有Apache Spark、Apache Flink、Databricks、AWS Glue、Google Cloud Dataflow。

  5. 5.使用:最后一个阶段涉及使经过处理的数据可供使用。在语音助手的上下文中,这意味着使系统能够准确理解和回应用户查询。它还可以支持决策引擎和面向用户的应用程序,使语音助手能够提供与用户请求相关且及时的响应。常用的工具有Tableau、Power BI、Looker、Elasticsearch、Kibana、Apache Superset、自定义仪表板。

然而,构建数据管道可能非常复杂,超出了本教程的范围。如果您想看到它的实际应用,请留下评论。

为了简化本教程,我们将使用Arxiv的研究论文。

让我们创建一个目录,搜索并下载“LLM”搜索词的论文:

dirpath="arxiv_papers"
ifnotos.path.exists(dirpath):
os.makedirs(dirpath)
search=arxiv.Search(
query="LLM",#您的查询长度受ARXIV_MAX_QUERY_LENGTH的限制,该限制为300个字符
max_results=10,
sort_by=arxiv.SortCriterion.LastUpdatedDate,#您还可以使用SubmittedDate或Relevance
sort_order=arxiv.SortOrder.Descending
)

搜索完成,下载论文:

forresultinsearch.results():
whileTrue:
try:
result.download_pdf(dirpath=dirpath)
print(f"->Paperid{result.get_short_id()}withtitle'{result.title}'isdownloaded.")
break
exceptFileNotFoundError:
print("Filenotfound")
break
exceptHTTPError:
print("Forbidden")
break
exceptConnectionResetErrorase:
print("Connectionresetbypeer")
time.sleep(5)
->Paperid2405.10311v1withtitle'UniRAG:UniversalRetrievalAugmentationforMulti-ModalLargeLanguageModels'isdownloaded.
->Paperid2405.10288v1withtitle'Timeline-basedSentenceDecompositionwithIn-ContextLearningforTemporalFactExtraction'isdownloaded.
->Paperid2405.07703v4withtitle'OpenLLM-Ro--TechnicalReportonOpen-sourceRomanianLLMs'isdownloaded.
->Paperid2405.10276v1withtitle'RevisitingOPRO:TheLimitationsofSmall-ScaleLLMsasOptimizers'isdownloaded.
->Paperid2405.10255v1withtitle'WhenLLMsstepintothe3DWorld:ASurveyandMeta-Analysisof3DTasksviaMulti-modalLargeLanguageModels'isdownloaded.
->Paperid2405.10251v1withtitle'ASystematicEvaluationofLargeLanguageModelsforNaturalLanguageGenerationTasks'isdownloaded.
->Paperid2405.10250v1withtitle'IntelliExplain:EnhancingInteractiveCodeGenerationthroughNaturalLanguageExplanationsforNon-ProfessionalProgrammers'isdownloaded.
->Paperid2405.08997v2withtitle'LLM-AssistedRuleBasedMachineTranslationforLow/No-ResourceLanguages'isdownloaded.
->Paperid2308.04662v2withtitle'VulLibGen:IdentifyingVulnerableThird-PartyLibrariesviaGenerativePre-TrainedModel'isdownloaded.
->Paperid2405.10212v1withtitle'CPsyExam:AChineseBenchmarkforEvaluatingPsychologyusingExaminations'isdownloaded.

太棒了,我们现在将这些论文分成有意义的部分。

检索增强生成的简要概述

RAG工作流帮助我们管理和利用来自各种来源的数据,以提供准确和相关的结果。

以下是一个简要概述:

1. 数据加载:从不同的来源收集数据,如文本文件、PDF、网站、数据库或API。例如,Llama Hub提供了许多连接器,使这一步骤更容易。

2. 索引:在索引阶段,系统将原始数据转换为向量嵌入并组织它们。

3. 存储:保存索引数据和标签,以便以后无需再次组织。

4. 查询:在查询阶段,系统根据查询向量检索最相关的文档:

5. 评估:由于LLM的随机性质,评估可能非常具有挑战性。然而,有有效的度量标准和工具可用于进行客观评估。

一些示例指标可能包括:忠实度、答案相关性、上下文精度、召回率、相关性和实体召回率、答案语义相似性、答案正确性。


文本分割器

为了做到这一点,我们将使用text_splitter将大型文本文档分割成较小的可管理的块:

1. 递归字符文本分割器将文本递归地分割成较小的片段,适用于非常大的文本。

它有两个主要参数:

这通常适用于没有自然分割点的非常大的文本,并通过保持块之间的重叠来防止上下文丢失,确保后续处理具有连续性。

2. 字符文本分割器根据指定的字符分隔符分割文本,适用于具有自然断点的文本。

它有三个主要参数:

适用于具有明确分界点的文本,例如脚本或具有明确定义的部分的文档,并通过在自然断点处分割文本来确保数据完整性,这有助于保持含义和上下文,无需重叠。

这些工具对于为NLP模型准备文本至关重要,我们希望数据的大小可管理,同时保留必要的上下文。

文档加载器

谜题的另一部分是文档加载器,它对于处理NLP工作流中的不同数据源至关重要。

每种类型的加载器都针对特定的来源进行了定制:

所有加载器的主要功能是收集数据,然后对其进行处理,可能用于生成嵌入。

在此设置中,我们将使用DirectoryLoader和RecursiveCharacterTextSplitter来高效地分块和管理多个文件,但您可以选择适合您数据源需求的任何加载器。

让我们看看分割器和文档加载器如何在实践中结合起来。

papers=[]
loader=DirectoryLoader(dirpath,glob="./*.pdf",loader_cls=PyPDFLoader)
papers=loader.load()
print("加载的总页数:",len(papers))#加载的总页数:410
#这将所有论文的所有页面合并为单个文本块以进行分块
full_text=''
forpaperinpapers:
full_text=full_text+paper.page_content
full_text="".join(lforlinfull_text.splitlines()ifl)
print(len(full_text))
text_splitter=RecursiveCharacterTextSplitter(
paper_chunks=text_splitter.create_documents([full_text])
Totalnumberofpagesloaded:157
643128

模型配置

此代码配置了一个用于语言生成任务的 Meta LLaMA 3 模型:

  1. 1.配置

2. 初始化

model_id="meta-llama/Meta-Llama-3-8B-Instruct"
device="cuda"
dtype=torch.bfloat16
tokenizer=AutoTokenizer.from_pretrained(model_id)
model=AutoModelForCausalLM.from_pretrained(model_id,torch_dtype=dtype,device_map=device)

设置查询管道

现在我们将使用 Hugging Face 的transformers库设置一个query_pipeline用于文本生成,旨在简化预训练模型和分词器的使用:

query_pipeline=transformers.pipeline(
"text-generation",
model=model,
tokenizer=tokenizer,
torch_dtype=torch.float16,
max_length=1024,
device_map="auto",)

初始化管道

该代码使用我们配置的query_pipeline初始化了一个HuggingFacePipeline对象,用于简化文本生成。

llm=HuggingFacePipeline(pipeline=query_pipeline)

处理模型加载并回退到本地资源

我们将从 Hugging Face 的仓库中加载sentence-transformers/all-mpnet-base-v2嵌入模型,配置为在 CUDA 设备上运行。

如果此过程遇到任何问题,如连接问题或访问限制,您还可以添加异常来返回到使用本地存储的嵌入模型。

通过这种方法,我们的应用程序可以在主要来源不可用时继续使用替代模型进行处理,这有助于我们在不同的运行环境中保持稳健性。

model_name="sentence-transformers/all-mpnet-base-v2"
model_kwargs={"device":"cuda"}
#尝试访问HuggingFace的sentencetransformers:https://huggingface.co/api/models/sentence-transformers/all-mpnet-base-v2
try:
embeddings=HuggingFaceEmbeddings(model_name=model_name,model_kwargs=model_kwargs)
exceptExceptionasex:
print("异常:",ex)
##或者,我们将从本地访问嵌入模型
#local_model_path="/kaggle/input/sentence-transformers/minilm-l6-v2/all-MiniLM-L6-v2"
#print(f"使用替代(本地)模型:{local_model_path}\n")
#embeddings=HuggingFaceEmbeddings(model_name=local_model_path,model_kwargs=model_kwargs)

集成 Qdrant 用于嵌入存储和检索

我们将使用 Qdrant 作为我们的向量数据库,因为它在处理向量相似性搜索、可伸缩性和灵活的向量数据管理方面具有出色的能力。

此外,Qdrant 支持本地和云存储选项,因此您可以适应各种本地和云环境。

我们已经安装了 Qdrant,并从 LangChain 的向量存储中导入它,如我们的代码中所示:from langchain.vectorstores import Qdrant

我们现在可以将 Qdrant 的向量数据库能力整合到我们的应用程序中来管理和检索嵌入,让我们开始吧!

在 Qdrant 向量数据库中存储文档嵌入

Qdrant.from_documents方法通过将文档及其对应的嵌入作为输入来促进该过程。

vectordb=Qdrant.from_documents(
paper_chunks,
embeddings,
path="Qdrant_Persist",
collection_name="voice_assistant_documents",
)

这里是所使用的参数的详细说明:

重复使用在 Qdrant 向量数据库中持久存储的数据

如果您想使用现有的持久向量数据库,您可以设置一个QdrantClient来连接到特定的存储位置:

  1. 1.初始化 Qdrant 客户端

  1. 1.访问向量数据库

这样的配置使您能够重新连接并利用现有的数据库。

fromqdrant_clientimportQdrantClient
client=QdrantClient(path="Qdrant_Persist")
vectordb=Qdrant(
client=client,
collection_name="voice_assistant_documents",
embeddings=embeddings,
)

设置检索器

现在我们需要设置一个基于检索的问答(QA)系统,利用我们在 Qdrant 向量数据库中存储的嵌入向量:

retriever=vectordb.as_retriever()
qa=RetrievalQA.from_chain_type(
llm=llm,
chain_type="stuff",
retriever=retriever,
verbose=True
)

测试和可视化 RAG 系统

我们实现了一些函数来测试和可视化检索增强生成(RAG)系统:

  1. 1.colorize_text函数

  1. 1.test_rag函数

fromIPython.displayimportdisplay,Markdown
defcolorize_text(text):
forword,colorinzip(["Reasoning","Question","Answer","Totaltime"],["blue","red","green","magenta"]):
text=text.replace(f"{word}:",f"\n\n**<fontcolor='{color}'>{word}:</font>**")
returntext
deftest_rag(qa,query):
time_start=time()
response=qa.run(query)
time_end=time()
total_time=f"{round(time_end-time_start,3)}sec."
full_response=f"Question:{query}\nAnswer:{response}\nTotaltime:{total_time}"
display(Markdown(colorize_text(full_response)))
returnresponse

集成 Llama 3 和 Whisper 进行文本转语音处理

让我们看看这里发生了什么:

  1. 1.知识库到向量数据库:首先,从知识库中的文档通过嵌入模型进行处理。该模型将文本数据转换为数值向量,然后将这些向量存储在像 Qdrant 这样的向量数据库中。这样的设置通过将文档的语义含义表示为高维空间中的点,实现了高效的检索。

  2. 2.用户查询处理:当用户提交查询时,它首先与嵌入模型交互,将查询转换为其向量表示。

  3. 3.检索:然后使用查询向量从向量数据库中获取与之最相似的前K个向量(上下文)。这个过程被称为“检索”,有助于识别与用户查询相关的最相关的文档或数据片段。

  4. 4.阅读和响应生成:然后将检索到的上下文输入到Meta Llama 3 LLM中,它会阅读和理解这些上下文中与用户查询相关的信息。然后生成一个响应,旨在提供最准确和相关的信息。然后Whisper将文本转换为音频响应。让我们首先定义Whisper流程。

pipe=Pipeline(s2a_ref='collabora/whisperspeech:s2a-q4-tiny-en+pl.model')

然后我们使用Llama 3进行文本生成,通过传递我们的查询,接下来我们可以使用Whisper进行音频生成。

query="如何使用LLMs来理解和与复杂的3D世界互动"
aud=test_rag(qa,query)
pipe.generate_to_notebook(f"{aud}")
  1. 1.查询处理:我们从查询“如何使用LLMs来理解和与复杂的3D世界互动”开始,通过使用一个模型(qa)的检索增强生成(RAG)系统进行处理。该系统的响应被准备用于语音合成。

  2. 2.语音合成:使用whisper模型和声音,我们将文本响应转换为音频并保存为speech.mp3

  3. 3.语音转文本:使用whisper-1模型将音频文件转录回文本,以验证语音合成的准确性。

回答:通过利用LLMs的固有优势,包括世界知识和推理能力,可以使用LLMs来理解和与复杂的3D世界互动。这可以通过将LLMs与3D数据(如3D模型、点云或网格)集成在一起来实现,以实现空间理解、导航和在3D环境中的互动等任务。LLMs还可以用于生成3D数据,如3D模型或纹理,并推理对象之间的关系及其空间布局。此外,LLMs还可以用于规划和预测3D环境中的行动结果,实现更复杂的互动和操作形式。总体而言,将LLMs与3D数据集成在一起为计算模型对物理世界的理解和互动提供了独特的机会,从而在各个领域推动创新。[11,12]和机器人操作[13,14,15]。最近的研究已经展示了将LLMs与3D数据集成以解释、推理或计划复杂的3D环境的潜力,利用了LLMs的固有优势。

很好,现在你可以继续尝试从下载的论文中提出一些问题,以了解其优势,并开始思考如何克服其弱点。

通常,为了提高性能,可以优化几个关键参数和策略。例如:

有很多需要关注的事情,但不要被你可以做的所有事情所压倒,只需专注于创建第一个原型,因为我们在这里使用的组件已经具有高质量。

随着时间的推移,您可以对系统进行迭代,使其更准确、高效和用户友好。

结语

多模态应用是未来。

我想通过集成Whisper、LLaMA 3、LangChain和向量数据库(如Qdrant)等技术,构建响应迅速、智能的语音助手,实时处理人类语言。







欢迎光临 链载Ai (https://www.lianzai.com/) Powered by Discuz! X3.5