引言
随着项目如llama.cpp、Ollama和llamafile的流行,本地运行大型语言模型(LLM)的重要性日益凸显。本文旨在指导您如何利用Ollama等提供者,在本地搭建一个基于检索增强生成(RAG)的应用程序,充分利用本地嵌入和本地LLM。
主要内容
安装和设置Ollama
首先,您需要设置Ollama。详细步骤可以参考其GitHub仓库上的说明,这里是步骤概述:
- 下载并运行Ollama桌面应用。
- 从命令行获取模型。例如,获取通用模型
llama3.1:8b:ollama pull llama3.1:8b - 获取文本嵌入模型
nomic-embed-text:ollama pull nomic-embed-text - 确保您的硬件支持相应模型。
安装必要的包
执行以下命令安装所需的Python包:
# 文档加载、检索方法和文本分割
%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)
初始化向量存储
使用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和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()
问答系统
构建简单的问答系统:
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()
)
常见问题和解决方案
- 模型下载失败:确保网络连接正常并尝试使用代理。
- 硬件支持问题:根据硬件能力选择合适的模型。
总结和进一步学习资源
本地RAG应用为检索增强生成提供了有效的解决方案。以下资源可以帮助您深入学习:
参考资料
如果这篇文章对你有帮助,欢迎点赞并关注我的博客。您的支持是我持续创作的动力!
---END---