基于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)。。这一配置不仅让处理庞大的数据集变得轻松可行,同时也打造了一个反应迅速的本地问答系统。

作者:Jeebiz  创建时间:2024-08-08 09:18
最后编辑:Jeebiz  更新时间:2024-08-08 11:59