基于Llama 3、Ollama、Milvus、LangChain,快速搭建本地RAG
隨著Llama、Mistral、Gemma等開源大型語(yǔ)言模型(LLMs)的興起,本地運(yùn)行LLMs的實(shí)用性和必要性日益凸顯,尤其是與商業(yè)模型如GPT-3或GPT-4相比時(shí),其成本效益展現(xiàn)出明顯的優(yōu)勢(shì)。
本文指導(dǎo)讀者如何結(jié)合Ollama、Llama 3和Milvus搭建高效的檢索增強(qiáng)生成(RAG)系統(tǒng),創(chuàng)建一個(gè)能解答特定問(wèn)題的Q&A聊天機(jī)器人。
1 RAG概述
RAG,即檢索增強(qiáng)生成,是一種通過(guò)融合額外的數(shù)據(jù)源來(lái)提升大型語(yǔ)言模型(LLMs)性能的技術(shù)。一個(gè)典型的RAG應(yīng)用流程包括:
- 索引:這涉及從數(shù)據(jù)源中提取數(shù)據(jù),并在Milvus中進(jìn)行加載、分割和存儲(chǔ),形成索引。
- 檢索與生成:在應(yīng)用運(yùn)行期間,RAG會(huì)處理用戶的查詢,從Milvus中的索引里檢索出相關(guān)數(shù)據(jù),然后利用這些數(shù)據(jù),LLM生成一個(gè)更加精準(zhǔn)的響應(yīng)。
2 先決條件
請(qǐng)先確認(rèn)系統(tǒng)滿足以下先決條件:
- Docker與Docker-Compose - 請(qǐng)確保系統(tǒng)中已安裝Docker及Docker-Compose工具。
- Milvus獨(dú)立版 - 使用Milvus的獨(dú)立版本,它可以通過(guò)Docker Compose方便地進(jìn)行管理。具體安裝方法,請(qǐng)參考文檔說(shuō)明(https://milvus.io/docs/install_standalone-docker-compose.md)。
- Ollama - 在系統(tǒng)上安裝Ollama;訪問(wèn)其官方網(wǎng)站獲取最新的安裝指南。
3 設(shè)置
安裝完所有前提條件后,就可以設(shè)置 RAG 應(yīng)用程序了:
- 使用命令docker-compose up -d啟動(dòng)Milvus獨(dú)立實(shí)例。 此命令以分離模式啟動(dòng)Milvus實(shí)例,在后臺(tái)安靜運(yùn)行。
- 通過(guò)命令ollama pull <name_of_model>?獲取LLM模型。 通過(guò)模型庫(kù)查看可用模型列表。 例如:ollama pull llama3此命令下載模型的默認(rèn)版本(通常是最新和最小的版本)。
- 使用命令ollama run <name-of-model>直接從命令行與模型聊天。
安裝依賴項(xiàng)
要運(yùn)行此應(yīng)用程序,需要安裝所需的庫(kù)??梢灾苯邮褂胮ip進(jìn)行安裝。
pip install langchain pymilvus ollama pypdf langchainhub langchain-community langchain-experimental
4 構(gòu)建RAG應(yīng)用程序
如前所述,RAG的主要組成部分之一是索引數(shù)據(jù)。
首先使用PyPDFLoader導(dǎo)入PDF中的數(shù)據(jù)
from langchain_community.document_loaders import PyPDFLoader
loader = PyPDFLoader(
"https://d18rn0p25nwr6d.cloudfront.net/CIK-0001813756/975b3e9b-268e-4798-a9e4-2a9a7c92dc10.pdf"
)
data = loader.load()
分割數(shù)據(jù)
使用RecursiveCharacterTextSplitter將加載的數(shù)據(jù)分解為可管理的塊
from langchain.text_splitter import RecursiveCharacterTextSplitter
text_splitter = RecursiveCharacterTextSplitter(chunk_size=500, chunk_overlap=0)
all_splits = text_splitter.split_documents(data)
獲取嵌入并在Milvus中存儲(chǔ)數(shù)據(jù)
接下來(lái),使用Jina AI的Small English嵌入(https://huggingface.co/jinaai/jina-embeddings-v2-small-en)將文本數(shù)據(jù)轉(zhuǎn)換為向量嵌入,并存儲(chǔ)到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極大簡(jiǎn)化了在本地加載和運(yùn)用大型語(yǔ)言模型(LLM)的過(guò)程。在本例中,將應(yīng)用Meta公司開發(fā)的Llama 3模型進(jìn)行操作。以下是如何加載:
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構(gòu)建QA鏈
最后,構(gòu)建QA鏈以處理和響應(yīng)用戶查詢:
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 運(yùn)行應(yīng)用程序
通過(guò)最后一個(gè)單元格中的 result 變量執(zhí)行 RAG 應(yīng)用程序。
問(wèn)答交互示例:
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搭建了一個(gè)功能強(qiáng)大的本地大型語(yǔ)言模型(LLM)。。這一配置不僅讓處理龐大的數(shù)據(jù)集變得輕松可行,同時(shí)也打造了一個(gè)反應(yīng)迅速的本地問(wèn)答系統(tǒng)。
本文轉(zhuǎn)載自?? AI科技論談??,作者: AI科技論談
