赞
踩
大家都听说过 OpenAI 和 Google 的最新消息,多模态系统是未来。
拥有人类般的声音,语音助手将扩展任何对话任务,无论是入站销售、客户支持还是数据收集和验证。
这就是为什么 OpenAI 和 Google 在 GPT 和 Gemini 系列模型中引入了多模态功能,以适应文本、音频、图像和视频输入,以获取各种用例的企业采用的早期份额。
例如,GPT-4o 的性能与 GPT-4 相匹配并超越,而且
还有许多社交媒体上的帖子展示了代码解释器有多么好,而且在数据分析和可视化方面做得更好。
这对应用程序开发人员来说是巨大的好处,我们知道开源将在 2024 年完全赶上闭源模型。
这就是为什么在本教程中,我想带你走进使用当今最先进的开源模型创建一个复杂的语音助手的过程。
我们将使用以下内容:
Whisper:由 OpenAI 开发,Whisper 在将口语转录为文本方面表现出色。它理解和处理多种语言的能力使其成为任何基于语音的应用程序的必备工具。
LLaMA 3:LLaMA 系列中的最新型号,LLaMA 3 在其尺寸上提供了出色的性能。
LangChain 用于协调组件以处理与模型和数据库的复杂用户交互。
向量数据库(Qdrant):Qdrant 旨在高效处理高维数据,使其成为依赖机器学习和大规模数据检索的应用程序的理想选择。
检索增强生成(RAG):RAG 结合了检索和生成模型的优点,使我们的语音助手能够利用大量的信息数据库生成明智和上下文相关的回答。
让我们构建一个由 Llama 3 提供动力的语音助手,它不仅响应迅速,而且智能且能够高效扩展。
多模态语音助手可以通过智能音箱、智能手机、可穿戴设备和智能家居系统与用户进行交互。
它们能够与其他技术集成,例如增强现实(AR)和虚拟现实(VR),以提供沉浸式体验。
例如,用户可以向语音助手询问方向,它不仅可以提供口头指示,还可以在连接的 VR/AR 头显上显示路线,如 Apple Vision Pro。
这种模态的融合允许更丰富和更互动的参与,满足更广泛的用户需求和偏好。
行业向客户提供产品和服务的方式也将发生变化:
金融:语音助手将通过个性化服务和实时欺诈警报来简化银行流程。它们将促进交易,提供余额更新,并帮助用户通过设置预算和跟踪支出来管理财务。
医疗保健:语音助手将通过无需使用手部操作、用药提醒和预约安排来增强患者管理和老年护理。它们还可以为患者提供医生日程的即时更新,并协助打印检测结果。此外,它们可以提供健康提示,通过连接的设备监测生命体征,并提供紧急警报。对于医疗保健专业人员来说,语音助手可以转录医疗笔记,访问患者记录,并简化行政任务,从而提高效率和患者护理质量。如果考虑到全球医疗工作者短缺和最近关于医生倦怠的报道,这一点尤为重要。
零售:语音助手将优化客户服务和库存管理,提高购物体验和运营效率。它们帮助客户找到产品,回答问题,并根据购物历史提供个性化推荐。对于零售商来说,语音助手可以自动补货,跟踪库存水平,并促进订单处理。它们还通过发送促销优惠和收集客户反馈来支持营销工作。
你已经有了这个想法 - 通过将这些系统整合到我们的日常运营中,我们可以提高生产力、客户体验和满意度。
让我们开始制作一个工具,它可以重新定义我们与数字环境的互动方式。
在开始教程之前,请确保您准备好以下资源:
GPU: 如果您使用的是 Google Colab,请确保您有 A100 GPU 访问权限;如果您在本地运行此代码,则需要一个 VRAM 大于 24GB 的 GPU 来满足我们的 AI 模型的高计算需求,特别是对于训练和复杂计算。我正在使用具有 24GB 内存的 RTX 4090 运行代码示例。
访问 LLaMA 3: 确保您可以访问 Hugging Face 上的 LLaMA 3 模型。https://huggingface.co/meta-llama/Meta-Llama-3-8B
对于 Google Colab 用户,我们首先需要在 Colab 环境中挂载 Google Drive,以便访问和利用我们的数据进行计算。
# 指定不同的挂载点
mountpoint = "/content/my_drive"
# 挂载 Google Drive
from google.colab import drive
drive.mount(mountpoint)
否则,我将在本地运行所有示例。
现在,我们需要安装以下库:
transformers (4.33.0):提供了各种预构建的语言模型,用于文本翻译和摘要等语言任务,是语言项目的关键工具。
accelerate (0.22.0):帮助在不同类型的计算机硬件上运行机器学习模型,如 CPU 或 GPU,而无需更改太多代码。
einops (0.6.1):简化了在机器学习中使用的数据结构的形状操作和更改,对于构建复杂模型非常有帮助。
langchain (0.0.300):用于将不同的语言技术组合到一个应用程序中,特别适用于需要多个处理步骤的项目。
xformers (0.0.21):提供了在学习和使用阶段都能高效处理数据的模型部分。
bitsandbytes (0.41.1):帮助更快地训练深度学习模型,并且占用更少的内存,非常适用于处理大型数据集。
sentence_transformers (2.2.2):在 transformers 库的基础上构建了详细的句子特征,对于需要理解文本之间相似性的任务非常重要。
让我们首先设置一个虚拟环境并安装库。打开您的命令行界面(可以是命令提示符、终端或您熟悉的任何其他命令行工具),然后运行以下命令:
# 创建虚拟环境 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
最后,为了准备环境以从 PDF 文件中提取数据、执行 OCR 并创建嵌入以进行高级数据处理和检索,我们还需要安装一些其他库:
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 并打开我们的 IDE:
# 登录到 Huggingface Hub
huggingface-cli login
# 可选地,启动 VSCode 或您喜欢的 IDE,然后让我们开始吧!
code .
太棒了!要继续,您可以创建 .py
文件或 .ipynb
文件(笔记本)。我将继续使用 Jupyter 笔记本,以便按块运行代码并交互式地检查结果。
是时候构建语音助手了!
我们导入所有必要的库,支持此设置的各个方面,包括模型交互、文档处理和嵌入管理。
import os import sys import arxiv from torch import cuda, bfloat16 import torch import transformers from transformers import AutoTokenizer, AutoModelForCausalLM from time import time from langchain.llms import HuggingFacePipeline from langchain.document_loaders import PyPDFLoader,DirectoryLoader,WebBaseLoader from langchain.text_splitter import RecursiveCharacterTextSplitter,CharacterTextSplitter from langchain.embeddings import HuggingFaceEmbeddings from langchain.chains import RetrievalQA from langchain.vectorstores import Qdrant from pathlib import Path from openai import OpenAI from IPython.display import Audio, display from whisperspeech.pipeline import Pipeline
在继续之前,我想停下来详细介绍一下为AI应用构建数据管道的问题。
数据管道对于高效管理和处理现代应用中的数据至关重要,特别是在开发由RAG启用的LLM驱动的复杂应用程序时。
这些管道通常涉及五个关键阶段:
收集:在这个阶段,数据从各种来源收集,包括数据存储、数据流和应用程序。对于语音助手来说,这意味着收集来自用户交互、音频输入以及内部和外部数据库的数据。数据可以来自语音助手需要与之交互的远程设备、应用程序或业务系统。常用的工具有Apache Nifi、Apache Flume、Talend和自定义API。
摄取:在摄取过程中,收集到的数据被加载到系统中,并在事件队列中组织。对于语音助手来说,这涉及捕获音频输入,将其转录为文本,并将其排队进行进一步处理。摄取过程确保所有传入的数据都准备好进行实时或批处理。常用的工具有Apache Kafka、AWS Kinesis、Google Cloud Pub/Sub、Apache Airflow。
存储:在摄取后,组织好的数据存储在各种存储解决方案中,如数据仓库、数据湖和数据湖仓库。在语音助手的上下文中,这包括存储转录、用户查询和从RAG系统检索的文档。存储系统确保数据可供将来的处理和分析使用。常用的工具有Amazon S3、Google Cloud Storage、Azure Data Lake、Snowflake、Apache Hudi、Delta Lake。
处理:在这个阶段,数据经过转换任务,如聚合、清洗和操作,以确保其符合所需的标准。对于语音助手来说,这意味着将文本数据转换为向量、压缩并进行分区以实现高效检索。批处理(一次处理大量数据集)和流处理(实时处理数据)技术都被用于确保数据始终是最新和准确的。常用的工具有Apache Spark、Apache Flink、Databricks、AWS Glue、Google Cloud Dataflow。
使用:最后一个阶段涉及使经过处理的数据可供使用。在语音助手的上下文中,这意味着使系统能够准确理解和回应用户查询。它还可以支持决策引擎和面向用户的应用程序,使语音助手能够提供与用户请求相关且及时的响应。常用的工具有Tableau、Power BI、Looker、Elasticsearch、Kibana、Apache Superset、自定义仪表板。
然而,构建数据管道可能非常复杂,超出了本教程的范围。如果您想看到它的实际应用,请留下评论。
为了简化本教程,我们将使用Arxiv的研究论文。
让我们创建一个目录,搜索并下载“LLM”搜索词的论文:
dirpath = "arxiv_papers"
if not os.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
)
搜索完成,下载论文:
for result in search.results(): while True: try: result.download_pdf(dirpath=dirpath) print(f"-> Paper id {result.get_short_id()} with title '{result.title}' is downloaded.") break except FileNotFoundError: print("File not found") break except HTTPError: print("Forbidden") break except ConnectionResetError as e: print("Connection reset by peer") time.sleep(5) -> Paper id 2405.10311v1 with title 'UniRAG: Universal Retrieval Augmentation for Multi-Modal Large Language Models' is downloaded. -> Paper id 2405.10288v1 with title 'Timeline-based Sentence Decomposition with In-Context Learning for Temporal Fact Extraction' is downloaded. -> Paper id 2405.07703v4 with title 'OpenLLM-Ro -- Technical Report on Open-source Romanian LLMs' is downloaded. -> Paper id 2405.10276v1 with title 'Revisiting OPRO: The Limitations of Small-Scale LLMs as Optimizers' is downloaded. -> Paper id 2405.10255v1 with title 'When LLMs step into the 3D World: A Survey and Meta-Analysis of 3D Tasks via Multi-modal Large Language Models' is downloaded. -> Paper id 2405.10251v1 with title 'A Systematic Evaluation of Large Language Models for Natural Language Generation Tasks' is downloaded. -> Paper id 2405.10250v1 with title 'IntelliExplain: Enhancing Interactive Code Generation through Natural Language Explanations for Non-Professional Programmers' is downloaded. -> Paper id 2405.08997v2 with title 'LLM-Assisted Rule Based Machine Translation for Low/No-Resource Languages' is downloaded. -> Paper id 2308.04662v2 with title 'VulLibGen: Identifying Vulnerable Third-Party Libraries via Generative Pre-Trained Model' is downloaded. -> Paper id 2405.10212v1 with title 'CPsyExam: A Chinese Benchmark for Evaluating Psychology using Examinations' is downloaded.
太棒了,我们现在将这些论文分成有意义的部分。
RAG工作流帮助我们管理和利用来自各种来源的数据,以提供准确和相关的结果。
以下是一个简要概述:
1. 数据加载: 从不同的来源收集数据,如文本文件、PDF、网站、数据库或API。例如,Llama Hub提供了许多连接器,使这一步骤更容易。
2. 索引: 在索引阶段,系统将原始数据转换为向量嵌入并组织它们。
向量化: 使用句子转换模型将每个文档或数据片段转换为捕捉语义含义的高维向量。
结构化: 然后将这些向量组织成高效的数据结构,通常是n维树或哈希映射,以实现快速的相似性搜索。
3. 存储: 保存索引数据和标签,以便以后无需再次组织。
4. 查询: 在查询阶段,系统根据查询向量检索最相关的文档:
向量匹配: 将查询转换为向量,并使用余弦相似度或其他距离度量与索引向量进行比较。
检索: 系统检索与查询向量最接近的文档,确保响应与用户的请求在语境上相关。
5. 评估: 由于LLM的随机性质,评估可能非常具有挑战性。然而,有有效的度量标准和工具可用于进行客观评估。
一些示例指标可能包括:忠实度、答案相关性、上下文精度、召回率、相关性和实体召回率、答案语义相似性、答案正确性。
如果您希望我详细介绍LLM和RAG评估以及最新的库和框架,请留言。
让我们继续。
为了做到这一点,我们将使用text_splitter
将大型文本文档分割成较小的可管理的块:
1. 递归字符文本分割器将文本递归地分割成较小的片段,适用于非常大的文本。
它有两个主要参数:
chunk_size
:每个块的最大字符数(例如,1000个字符)。
chunk_overlap
:块之间的重叠以保持上下文(例如,100个字符)。
这通常适用于没有自然分割点的非常大的文本,并通过保持块之间的重叠来防止上下文丢失,确保后续处理具有连续性。
2. 字符文本分割器根据指定的字符分隔符分割文本,适用于具有自然断点的文本。
它有三个主要参数:
separator
:用于分割的字符(例如,\n
表示换行)。
chunk_size
和chunk_overlap
:与递归分割器类似,定义块的大小和重叠。
适用于具有明确分界点的文本,例如脚本或具有明确定义的部分的文档,并通过在自然断点处分割文本来确保数据完整性,这有助于保持含义和上下文,无需重叠。
这些工具对于为NLP模型准备文本至关重要,我们希望数据的大小可管理,同时保留必要的上下文。
谜题的另一部分是文档加载器,它对于处理NLP工作流中的不同数据源至关重要。
每种类型的加载器都针对特定的来源进行了定制:
DirectoryLoader:从指定目录加载所有文件,通常用于处理多个文本或PDF文件。
WebBaseLoader:从指定URL检索文本,用于处理网络内容。
PyPDFLoader:专注于从单个PDF文件中提取文本以进行进一步分析。
TextLoader:专门设计用于加载纯文本文件,直接读取文本数据以供立即使用。
所有加载器的主要功能是收集数据,然后对其进行处理,可能用于生成嵌入。
在此设置中,我们将使用DirectoryLoader和RecursiveCharacterTextSplitter来高效地分块和管理多个文件,但您可以选择适合您数据源需求的任何加载器。
让我们看看分割器和文档加载器如何在实践中结合起来。
papers = []
loader = DirectoryLoader(dirpath, glob="./*.pdf", loader_cls=PyPDFLoader)
papers = loader.load()
print("加载的总页数:", len(papers)) # 加载的总页数:410
# 这将所有论文的所有页面合并为单个文本块以进行分块
full_text = ''
for paper in papers:
full_text = full_text + paper.page_content
full_text = " ".join(l for l in full_text.splitlines() if l)
print(len(full_text))
text_splitter = RecursiveCharacterTextSplitter(
paper_chunks = text_splitter.create_documents([full_text])
Total number of pages loaded: 157
643128
此代码配置了一个用于语言生成任务的 Meta LLaMA 3 模型:
torch.bfloat16
以优化内存和计算速度。2. 初始化:
AutoModelForCausalLM.from_pretrained
初始化模型,配置为因果语言建模,其中模型根据先前文本预测下一个词。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
用于文本生成,旨在简化预训练模型和分词器的使用:
**model**
:指定预训练语言模型。**tokenizer**
:将输入文本转换为标记。**torch_dtype**
:使用 torch.float16
进行高效计算。**max_length**
:将输出限制在 1024 个标记。**device_map**
:自动优化将模型层分配给可用硬件。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 的 sentence transformers: https://huggingface.co/api/models/sentence-transformers/all-mpnet-base-v2
try:
embeddings = HuggingFaceEmbeddings(model_name=model_name, model_kwargs=model_kwargs)
except Exception as ex:
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,并从 LangChain 的向量存储中导入它,如我们的代码中所示:from langchain.vectorstores import Qdrant
我们现在可以将 Qdrant 的向量数据库能力整合到我们的应用程序中来管理和检索嵌入,让我们开始吧!
Qdrant.from_documents
方法通过将文档及其对应的嵌入作为输入来促进该过程。
vectordb = Qdrant.from_documents(
paper_chunks,
embeddings,
path="Qdrant_Persist",
collection_name="voice_assistant_documents",
)
这里是所使用的参数的详细说明:
**documents**
:生成嵌入的原始文档。**embeddings**
:从文档中派生出的嵌入,准备好被索引和存储。**path**
:指定 Qdrant 数据库将持久存储数据的 Google Drive 本地目录,确保嵌入被安全存储且未来可轻松访问。**collection_name**
:Qdrant 中数据集的标签,这里是"voice_assistant_documents",有助于组织和检索特定组的嵌入。如果您想使用现有的持久向量数据库,您可以设置一个 QdrantClient
来连接到特定的存储位置:
QdrantClient
实例,指向我们的数据库文件存储位置,使得能够访问持久存储的数据。Qdrant
对象,并将其连接到 my_documents
集合。这个设置允许对存储的嵌入进行高效管理和检索。这样的配置使您能够重新连接并利用现有的数据库。
from qdrant_client import QdrantClient
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
)
vectordb
对象转换为一个检索器,使用 vectordb.as_retriever()
。这个检索器配置为根据向量相似性查询向量数据库中的相关文档,这对于有效的信息检索至关重要。RetrievalQA
实例,它是我们的 AI 链的一部分。该实例使用检索器来根据查询获取相关信息。这里,llm
表示我们的语言模型,chain_type
设置为 “stuff”,表示此链将处理的任务或操作类型,verbose=True
在操作过程中提供详细的输出,提供有关检索过程的见解。我们实现了一些函数来测试和可视化检索增强生成(RAG)系统:
qa
) 和一个查询字符串。它测量响应时间,检索答案,并以 Markdown 格式显示格式化的结果,突出显示关键元素以便于阅读。from IPython.display import display, Markdown
def colorize_text(text):
for word, color in zip(["Reasoning", "Question", "Answer", "Total time"], ["blue", "red", "green", "magenta"]):
text = text.replace(f"{word}:", f"\n\n**<font color='{color}'>{word}:</font>**")
return text
def test_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}\nTotal time: {total_time}"
display(Markdown(colorize_text(full_response)))
return response
让我们看看这里发生了什么:
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}")
whisper
模型和声音,我们将文本响应转换为音频并保存为speech.mp3
。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)等技术,构建响应迅速、智能的语音助手,实时处理人类语言。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。