基于Llama 3、Ollama、Milvus、LangChain,快速搭建本地RAG
随着Llama、Mistral、Gemma等开源大型语言模型(LLMs)的兴起,本地运行LLMs的实用性和必要性日益凸显,尤其是与商业模型如GPT-3或GPT-4相比时,其成本效益展现出明显的优势。
本文指导读者如何结合Ollama、Llama 3和Milvus搭建高效的检索增强生成(RAG)系统,创建一个能解答特定问题的Q&A聊天机器人。
1 RAG概述
RAG,即检索增强生成,是一种通过融合额外的数据源来提升大型语言模型(LLMs)性能的技术。一个典型的RAG应用流程包括:
- 索引:这涉及从数据源中提取数据,并在Milvus中进行加载、分割和存储,形成索引。
- 检索与生成:在应用运行期间,RAG会处理用户的查询,从Milvus中的索引里检索出相关数据,然后利用这些数据,LLM生成一个更加精准的响应。
2 先决条件
请先确认系统满足以下先决条件:
- Docker与Docker-Compose - 请确保系统中已安装Docker及Docker-Compose工具。
- Milvus独立版 - 使用Milvus的独立版本,它可以通过Docker Compose方便地进行管理。具体安装方法,请参考文档说明(https://milvus.io/docs/install_standalone-docker-compose.md)。
- Ollama - 在系统上安装Ollama;访问其官方网站获取最新的安装指南。
3 设置
安装完所有前提条件后,就可以设置 RAG 应用程序了:
- 使用命令docker-compose up -d启动Milvus独立实例。 此命令以分离模式启动Milvus实例,在后台安静运行。
- 通过命令ollama pull <name_of_model>获取LLM模型。 通过模型库查看可用模型列表。 例如:ollama pull llama3此命令下载模型的默认版本(通常是最新和最小的版本)。
- 使用命令ollama run <name-of-model>直接从命令行与模型聊天。
安装依赖项
要运行此应用程序,需要安装所需的库。可以直接使用pip进行安装。
pip install langchain pymilvus ollama pypdf langchainhub langchain-community langchain-experimental
4 构建RAG应用程序
如前所述,RAG的主要组成部分之一是索引数据。
首先使用PyPDFLoader导入PDF中的数据
from langchain_community.document_loaders import PyPDFLoader
loader = PyPDFLoader(
"https://d18rn0p25nwr6d.cloudfront.net/CIK-0001813756/975b3e9b-268e-4798-a9e4-2a9a7c92dc10.pdf"
)
data = loader.load()
分割数据
使用RecursiveCharacterTextSplitter将加载的数据分解为可管理的块
from langchain.text_splitter import RecursiveCharacterTextSplitter
text_splitter = RecursiveCharacterTextSplitter(chunk_size=500, chunk_overlap=0)
all_splits = text_splitter.split_documents(data)
获取嵌入并在Milvus中存储数据
接下来,使用Jina AI的Small English嵌入(https://huggingface.co/jinaai/jina-embeddings-v2-small-en)将文本数据转换为向量嵌入,并存储到Milvus中。
from langchain_community.embeddings.jina import JinaEmbeddings
from langchain.vectorstores.milvus import Milvus
embeddings = JinaEmbeddings(
jina_api_key=JINA_AI_API_KEY, model_name="jina-embeddings-v2-small-en"
)
vector_store = Milvus.from_documents(documents=all_splits, embedding=embeddings)
加载LLM
Ollama极大简化了在本地加载和运用大型语言模型(LLM)的过程。在本例中,将应用Meta公司开发的Llama 3模型进行操作。以下是如何加载:
from langchain_community.llms import Ollama
from langchain.callbacks.manager import CallbackManager
from langchain.callbacks.streaming_stdout import StreamingStdOutCallbackHandler
llm = Ollama(
model="llama3",
callback_manager=CallbackManager(
[StreamingStdOutCallbackHandler()]
),
stop=["<|eot_id|>"],
)
使用Langchain构建QA链
最后,构建QA链以处理和响应用户查询:
from langchain import hub
from langchain.chains import RetrievalQA
query = input("\nQuery: ")
prompt = hub.pull("rlm/rag-prompt")
qa_chain = RetrievalQA.from_chain_type(llm, retriever=vectorstore.as_retriever(), chain_type_kwargs={"prompt": prompt})
result = qa_chain({"query": query})
print(result)
5 运行应用程序
通过最后一个单元格中的 result 变量执行 RAG 应用程序。
问答交互示例:
Query: What is this document about?
The document appears to be a 104 Cover Page Interactive Data File for an SEC filing. It contains information about the company's financial statements and certifications.{'query': 'What is this document about?', 'result': "The document appears to be a 104 Cover Page Interactive Data File for an SEC filing. It contains information about the company's financial statements and certifications."}
这样就成功使用Ollama、Llama 3、Langchain和Milvus搭建了一个功能强大的本地大型语言模型(LLM)。。这一配置不仅让处理庞大的数据集变得轻松可行,同时也打造了一个反应迅速的本地问答系统。
本文转载自 AI科技论谈,作者: AI科技论谈