点击上方蓝字关注我们
背景
在这篇博文中,我们将探讨如何使用检索增强生成(RAG)来构建更有效、更吸引人的对话式人工智能应用程序。我们将介绍 RAG 的基础知识及其优势,并逐步说明如何开发自己的 RAG 机制供本地使用。
什么是 RAG?
RAG(基于强化的生成)结合了自然语言处理(NLP)领域两种著名方法的优势:基于检索的模型和基于生成的模型。在传统的基于生成的方法中,人工智能系统使用预先训练好的模式和规则从头开始生成文本。然而,这种方法往往会导致创造力有限、缺乏特定语境知识以及连贯性差等问题。
相比之下,基于检索的模型则利用预先训练好的语言模型,从大型语料库、定制数据集或数据库中检索相关信息。虽然这些模型擅长根据现有文本提供准确的回复,但它们在处理新颖或模糊的语境时可能会遇到困难。
RAG 与微调 LLM 模型
微调 LLM(大型语言模型)包括针对特定任务调整预训练。最初,LLM 会在海量数据集上进行训练,以学习一般语言模式。之后,再针对特定应用(如客户服务或代码生成)在较少的数据集上进行进一步训练。
相比之下,RAG(基于强化的生成)在需要 LLM 根据大量更新的特定上下文数据生成响应时非常有用。例如,用数据集或归档文件来丰富 LLM 模型的响应。RAG 对资源和技术知识的要求极低,因此是一种经济高效的微调替代方案。只需 10 行 Python 代码,您就可以确保您的模型能够访问最相关的最新数据。
许多网络和桌面客户端应用程序,如 Open WebUI 或 AnythingLLM,都已集成了 RAG 功能。但是,对于私营公司来说,要上传和嵌入数据供其 LLM 模型使用,就必须建立一个定制的 RAG 系统。在这篇博文中,我将逐步介绍如何使用 Llama3 模型在 Python 中实现 RAG。
RAG 机制可概括如下:
要构建本地 RAG 系统,您需要以下组件:
源文件:可以是位于网络上的 .doc、txt 或 pdf 文件
加载:加载器,用于加载文档并将其分割成块
转换:转换文档块以便嵌入。
嵌入模型:嵌入模型将输入作为一个块,并输出作为向量表示的嵌入。
向量数据库:用于存储嵌入的向量数据库
LLM 模型:预先训练的模型,将使用嵌入回答用户查询
首先,让我总结一下接下来要使用的关键组件:
LLM 服务器:Ollama本地服务器
LLM 模型:LLama 3 8b
嵌入模型:all-MiniLM-L6-v2
矢量数据库 SQLiteVSS(sqlite3)
框架:LangChain
操作系统:MacOS
编程语言:Python 3.11.3
我将使用的说明和示例可在资源部分中找到。要运行作者的示例,您必须具备良好的 Python 专业知识。在此,我将指导您完成每个必要步骤,以节省时间和精力。
分步指南
如果您对 Python 非常熟悉,可以跳过第 7 步之前的步骤。
步骤 1:下载并安装 Python
不要使用系统 Python 运行应用程序。使用自制软件安装 Python 3
homebrew install python
步骤 2:安装 pip
python3 -m ensurepip
步骤 3:安装 Jupyter Notebook 和 Lab
python3 -m pip install jupyterlab
python3 -m pip install notebook
步骤 4:运行 Jupyter 实验室或笔记本
python3 -m jupyterlab
上述命令将启动一个基于 Web 的界面,使您能够在指定的 URL http://localhost:8888/lab 上构建、运行和管理 Python 应用程序
步骤 5:安装 SQLite3
brew install sqlite3
安装 SQLite3 数据库后,在 .bashprofile 或 .zshrc 文件中添加以下几行:
export PATH="/usr/local/opt/sqlite/bin:$PATH”
export LDFLAGS="-L/usr/local/opt/sqlite/lib”
export CPPFLAGS="-I/usr/local/opt/sqlite/include”
export PYTHON_CONFIGURE_OPTS="--enable-loadable-sqlite-extensions”
重新打开终端
步骤 6:添加新笔记本
在本地 Jupyter 实验室中添加一个新的启动器或笔记本。用以下代码添加第一个单元格,该单元格将安装所有必要的软件包。
#安装必要的软件包
pip install --upgrade langchain
pip install -U langchain-community
pip install -U langchain-huggingface
pip install sentence-transformers
pip install --upgrade --quiet sqlite-vss
步骤 7 :导入所有必要的软件包
from langchain.embeddings.sentence_transformer import SentenceTransformerEmbeddings
from langchain_huggingface import HuggingFaceEmbeddings
from langchain.text_splitter import CharacterTextSplitter
from langchain.vectorstores import SQLiteVSS
from langchain.document_loaders import TextLoader
从链接中下载文档,并将其放在工作区的某处。
步骤 8:从目录中加载源文件
# 使用 LangChain 文本加载器加载文档
loader = TextLoader(“PATH_TO_THE_FILE/stateoftheunion2023.txt”)
documents = loader.load()
步骤 9:将文档分割成块
# 将文档分割成块
text_splitter = CharacterTextSplitter (chunk_size=1000, chunk_overlap=0)
docs = text_splitter.split_documents(documents)
texts = [doc.page_content for doc in docs] (文档中的文档的页面内容
在这里,你可以将语块打印到控制台,以确保解析了文档。
print (texts)
步骤 10:嵌入语块
# 使用句子转换器软件包和 all-MiniLM-L6-v2 嵌入模型
embedding_function = SentenceTransformerEmbeddings(model_name=“all-MiniLM-L6-v2”)
步骤 11:将嵌入模型加载到 SQLite3 数据库中
# 将文本嵌入加载到 SQLiteVSS 中名为 state_union 的表中
db = SQLiteVSS.from_texts(
texts = texts,
embedding = embedding_function,
table = "state_union",
db_file = "/tmp/vss.db" )
)
步骤 12(可选):查询数据库并研究嵌入情况
使用 DBeaver 或 Visual Studio Code 查询本地 SQLite3 数据库。本地数据库的数据库文件是“/tmp/vss.db”
步骤 13:查询语义(相似性)搜索
# First, we will do a simple retrieval using similarity search
# Query
question = "What did the president say about Nancy Pelosi?"
data = db.similarity_search(question)
# print results
print(data[0].page_content)
结果应该与下面类似:
State of The Union 2023: Biden's Full Speech
Mr. Speaker. Madam Vice President. Our First Lady and Second Gentleman.
Members of Congress and the Cabinet. Leaders of our military.
Mr. Chief Justice, Associate Justices, and retired Justices of the Supreme Court.
And you, my fellow Americans.
I start tonight by congratulating the members of the 118th Congress and the new Speaker of the House, Kevin McCarthy.
Mr. Speaker, I look forward to working together.
I also want to congratulate the new leader of the House Democrats and the first Black House Minority Leader in history, Hakeem Jeffries.
Congratulations to the longest serving Senate Leader in history, Mitch McConnell.
And congratulations to Chuck Schumer for another term as Senate Majority Leader, this time with an even bigger majority.
And I want to give special recognition to someone who I think will be considered the greatest Speaker in the history of this country, Nancy Pelosi.
步骤 14:运行本地 Ollama 服务器
ollama run llama3
步骤 15:导入 LangChain LLM 软件包并连接到本地服务器
# LLM
from langchain.llms import Ollama
from langchain.callbacks.manager import CallbackManager
from langchain.callbacks.streaming_stdout import StreamingStdOutCallbackHandler
llm = Ollama(
model = "llama3",
verbose = True,
callback_manager = CallbackManager([StreamingStdOutCallbackHandler()]),
)
步骤 16:使用 LangChain 提示提问
# QA chain
from langchain.chains import RetrievalQA
from langchain import hub
# LangChain Hub is a repository of LangChain prompts shared by the community
QA_CHAIN_PROMPT = hub.pull("rlm/rag-prompt-llama")
qa_chain = RetrievalQA.from_chain_type(
llm,
# we create a retriever to interact with the db using an augmented context
retriever = db.as_retriever(),
chain_type_kwargs = {"prompt": QA_CHAIN_PROMPT},
)
步骤 17:打印结果
result = qa_chain({"query": question})
这将打印查询结果。查询结果应如下所示:
The president referred to Nancy Pelosi as "someone who I think will be considered the greatest Speaker in the history of this country."
请注意,根据本地计算机资源的情况,可能需要几分钟才能做出响应。
在这种情况下,LLM 会根据嵌入生成一个简明的查询答案。在语义相似性搜索过程中,我们向向量数据库发出查询,该数据库会返回答案的相似性得分。
总结
本文介绍了如何使用检索增强生成(RAG)技术来构建更有效的对话式人工智能应用程序。RAG结合了基于检索和基于生成的模型的优势,通过检索相关信息来增强生成的文本。与微调大型语言模型(LLM)相比,RAG在处理需要大量特定上下文数据的任务时更为有效,且资源和技术知识要求低,是一种经济高效的微调替代方案。本文提供了一个分步指南,如何使用Llama3模型和Python实现RAG。关键组件包括源文件、加载器、转换器、嵌入模型、向量数据库和LLM模型。还介绍了使用的工具和环境,包括Ollama本地服务器、LLama 3 8b模型、all-MiniLM-L6-v2嵌入模型、SQLiteVSS数据库、LangChain框架、MacOS操作系统和Python 3.11.3编程语言。指南详细说明了如何安装Python、Jupyter Notebook、SQLite3,以及如何导入必要的软件包。接着,作者指导读者如何加载源文件、分割文档、嵌入语块,并使用SQLite3数据库存储嵌入的向量。此外,还介绍了如何进行语义搜索查询,以及如何运行本地Ollama服务器和使用LangChain提示提问。
最后,本文展示了如何使用LangChain的RetrievalQA链来生成基于嵌入的查询答案,并打印结果。整个过程需要一定的Python专业知识,提供了详细的步骤来帮助读者节省时间和精力。
点亮在看,你最好看!