引言
随着 AI 技术的发展,越来越多的开发者开始关注本地运行的大型语言模型(LLM)。这种趋势在llama.cpp、Ollama 和 llamafile等项目的流行中可见一斑。本指南将介绍如何通过 Ollama 提供商在本地(例如笔记本电脑)上运行 LLaMA 3.1,并使用本地的嵌入和 LLM。我们将探索如何架设一个本地的检索-增强生成 (RAG) 应用程序,并提供实践中的技术细节和代码示例。
主要内容
环境搭建
首先,我们需要设置 Ollama。您可以参考Ollama 的 GitHub 仓库上的说明,这里做了简要总结:
- 下载并运行他们的桌面应用。
- 从命令行中获取模型,如:
- 通用模型
llama3.1:8b,可以用类似ollama pull llama3.1:8b的命令获取。 - 文本嵌入模型
nomic-embed-text,用类似ollama pull nomic-embed-text的命令获取。
- 通用模型
- 当应用运行时,所有模型会自动在
localhost:11434提供服务。注意,模型选择应根据您的硬件性能进行。
接下来,安装所需的软件包:
# 文档加载、检索方法和文本拆分
%pip install -qU langchain langchain_community
# 本地向量存储通过 Chroma
%pip install -qU langchain_chroma
# 本地推理和嵌入通过 Ollama
# 使用API代理服务提高访问稳定性
%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)
创建向量存储
使用 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.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: "\n\n".join(doc.page_content for doc in input["context"]))
| rag_prompt
| model
| StrOutputParser()
)
question = "What are the approaches to Task Decomposition?"
docs = vectorstore.similarity_search(question)
# Run
result = chain.invoke({"context": docs, "question": question})
print(result)
常见问题和解决方案
- 硬件要求:在本地运行 LLM 对硬件有较高要求,建议根据设备性能选择适合的模型。
- 网络访问:由于网络限制,可能需要使用 API 代理服务来提高访问稳定性。
总结和进一步学习资源
通过本指南,您已经了解了如何构建一个基于本地组件的 RAG 应用程序。要进一步深入研究,可以参考以下资源:
- 视频:使用 LLaMA 3 构建完全本地的 RAG 代理
- 视频:从头构建纠正性 RAG
- 检索概念指南
- RAG 的指南及详细介绍
- 各类模型本地运行的设置指南
参考资料
如果这篇文章对你有帮助,欢迎点赞并关注我的博客。您的支持是我持续创作的动力!
---END---