基于 Llama 3 构建 RAG 语音助手
本教程介绍如何使用 Llama 3、Whisper、LangChain 和 Qdrant 构建一个本地 RAG 语音助手。我们将使用以下技术栈:
- Whisper:由 OpenAI 开发,在将口语转录为文本方面表现出色。
- LLaMA 3:提供出色的性能。
- LangChain:用于协调组件以处理复杂用户交互。
- Qdrant:向量数据库,高效处理高维数据检索。
- RAG:结合检索和生成模型,利用信息数据库生成上下文相关的回答。
环境准备
在开始之前,请确保准备好以下资源:
- GPU:建议使用 VRAM 大于 24GB 的 GPU(如 RTX 4090)或 Google Colab A100。
- 访问 LLaMA 3:确保可访问 Hugging Face 上的 LLaMA 3 模型。
安装依赖库
打开命令行界面,创建虚拟环境并安装依赖:
mkdir llama3-whisper && cd llama3-whisper
python3 -m venv llama3-whisper-env
source llama3-whisper-env/bin/activate
安装核心库:
pip3 install --no-deps torch==2.0.0 torchvision==0.15.1 torchaudio==2.0.1
pip3 install openai
pip3 install -q transformers==4.33.0
pip3 install -q accelerate==0.22.0
pip3 install -q einops==0.6.1
pip3 install -q langchain==0.0.300
pip3 install -q xformers==0.0.21
pip3 install -q bitsandbytes==0.41.1
pip3 install -q sentence_transformers==2.2.2
pip3 install arxiv
pip3 install -q ipykernel jupyter
pip3 install -q --upgrade huggingface_hub
安装数据处理相关库:
pip3 install unstructured
pip3 install "unstructured[pdf]"
apt-get install -y poppler-utils
pip3 install pytesseract
apt-get install -y tesseract-ocr
pip3 install --upgrade qdrant-client
pip3 install WhisperSpeech
登录 Hugging Face Hub:
huggingface-cli login
导入库
导入所有必要的库,支持模型交互、文档处理和嵌入管理。
from transformers import AutoModelForCausalLM, AutoTokenizer, pipeline
from langchain.llms import HuggingFacePipeline
from langchain.vectorstores import Qdrant
from langchain.embeddings import HuggingFaceEmbeddings
from langchain.document_loaders import DirectoryLoader
from langchain.text_splitter import RecursiveCharacterTextSplitter
import torch
处理语音助手的数据
数据管道通常涉及收集、摄取、存储、处理和使用五个阶段。在本教程中,为了简化流程,我们将直接使用 Arxiv 的研究论文作为数据源。
创建目录并下载'LLM'搜索词的论文:
# 伪代码示例:实际需根据 arxiv 库实现
# from arxiv import Search, Result
# results = Search(query="LLM", max_results=10).results()
将论文分成有意义的部分:
loader = DirectoryLoader('./papers', glob="**/*.pdf")
documents = loader.load()
splitter = RecursiveCharacterTextSplitter(chunk_size=1000, chunk_overlap=100)
chunks = splitter.split_documents(documents)
检索增强生成 (RAG) 概述
RAG 工作流帮助管理和利用来自各种来源的数据:
- 数据加载:从文本文件、PDF、网站等收集数据。
- 索引:将原始数据转换为向量嵌入并组织它们。
- 向量化:使用句子转换模型将文档转换为高维向量。
- 结构化:组织成 n 维树或哈希映射以实现快速相似性搜索。
- 存储:保存索引数据和标签。
- 查询:根据查询向量检索最相关的文档。
- 评估:使用忠实度、答案相关性等指标进行评估。
模型配置
配置 Meta LLaMA 3 模型用于语言生成任务:
model_id = "meta-llama/Meta-Llama-3-8B"
device = "cuda"
dtype = torch.bfloat16
tokenizer = AutoTokenizer.from_pretrained(model_id)
model = AutoModelForCausalLM.from_pretrained(
model_id,
device_map=device,
torch_dtype=dtype
)
设置查询管道
使用 transformers 库设置 query_pipeline:
query_pipeline = pipeline(
"text-generation",
model=model,
tokenizer=tokenizer,
torch_dtype=torch.float16,
max_length=1024,
device_map="auto"
)
初始化 HuggingFacePipeline 对象:
llm = HuggingFacePipeline(pipeline=query_pipeline)
初始化嵌入模型
加载 sentence-transformers/all-mpnet-base-v2 嵌入模型:
embeddings = HuggingFaceEmbeddings(
model_name="sentence-transformers/all-mpnet-base-v2",
model_kwargs={'device': 'cuda'}
)
如果连接问题,可添加异常处理回退到本地存储的模型。
集成 Qdrant 用于嵌入存储和检索
使用 Qdrant 作为向量数据库:
from qdrant_client import QdrantClient
client = QdrantClient(path="./qdrant_db")
将文档嵌入存储到 Qdrant:
db = Qdrant.from_documents(
documents=chunks,
embeddings=embeddings,
path="./qdrant_db",
collection_name="voice_assistant_documents"
)
重复使用持久存储的数据:
client = QdrantClient(path="./qdrant_db")
db = Qdrant(client=client, collection_name="my_documents", embeddings=embeddings)
设置检索器
设置基于检索的问答系统:
retriever = db.as_retriever()
qa = RetrievalQA.from_chain_type(
llm=llm,
chain_type="stuff",
retriever=retriever,
verbose=True
)
测试和可视化 RAG 系统
定义辅助函数来测试系统:
def test_rag(qa, query):
result = qa({"query": query})
return result["result"]
集成 Llama 3 和 Whisper 进行文本转语音
定义 Whisper 流程:
from whisperspeech.pipeline import Pipeline as S2APipeline
pipe = S2APipeline(s2a_ref='collabora/whisperspeech:s2a-q4-tiny-en+pl.model')
执行查询并生成音频:
query = "如何使用 LLMs 来理解和与复杂的 3D 世界互动"
aud = test_rag(qa, query)
pipe.generate_to_notebook(f"{aud}")
验证语音合成准确性:
# 使用 whisper-1 模型将音频文件转录回文本
优化建议
为提高性能,可以优化以下关键参数和策略:
- 使用领域特定数据对预训练语言模型进行微调。
- 使用高质量、多样化的训练数据。
- 优化超参数,如学习率和批量大小。
- 调整块大小和检索文档数量。
- 提高检索模型参数、嵌入质量和向量维度。
- 通过查询扩展和更好的上下文理解处理用户查询。
- 优化系统基础设施以减少延迟。
- 实施健壮的错误处理和回退机制。
通过迭代优化,可以使系统更准确、高效和用户友好。


