Ollama+Langchain搭建基础本地RAG模型(基于Ubuntu24.04)

一. 环境准备

1. 安装Ollama

Linux终端运行:

curl -fsSL https://ollama.com/install.sh | sh

2. 下载模型

Ollama支持多种模型:
7B基础模型:

ollama pull llama2 

轻量级高效模型:

ollama pull mistral

作者选择了后者,读者可根据本机配置自由选择。

3. 验证Ollama运行

测试文本生成:

ollama run mistral "Hello world" 

二. Python环境配置

1. 创建并开启虚拟环境

python -m venv ollama-env
source ollama-env/bin/activate

2. 安装依赖库

在Ollama虚拟环境下安装Langchain依赖库:

pip install langchain langchain-community langchain-core langchain-ollama langchain-text-splitters python-dotenv

安装后可以通过如下指令查看已经安装的包:

pip list | grep "需要查找的包"

image

三. 基础代码(在线模型)

1. 文本生成脚本(basic_generation.py)

from langchain_community.llms import Ollama

llm = Ollama(model="mistral", temperature=0.9)

response = llm.invoke("解释量子计算的基本原理")
print("模型回复:", response)

2. 对话式AI(chat_bot.py)

# from langchain_community.chat_models import ChatOllama 已过时
from langchain_core.messages import HumanMessage
from langchain_ollama import ChatOllama

chat = ChatOllama(model="mistral", temperature=0.9)

messages = [HumanMessage(content="写一颗线段树")]
response = chat.invoke(messages)

print("AI回复:", response.content)

3. 文档问答系统(document_qa.py)

from langchain_community.document_loaders import TextLoader
from langchain_text_splitters import RecursiveCharacterTextSplitter
from langchain_community.vectorstores import FAISS
from langchain_ollama import OllamaEmbeddings, OllamaLLM
# from langchain_community.llms import Ollama 已过时
from langchain.chains import RetrievalQA

# 加载文档
loader = TextLoader("/media/ab/RAG_TEST/report.txt")
docs = loader.load()

# 分割文本
text_splitter = RecursiveCharacterTextSplitter(
    chunk_size=1000, chunk_overlap=200)
splits = text_splitter.split_documents(docs)

# 创建向量数据库
embeddings = OllamaEmbeddings(model="mistral")
vectorstore = FAISS.from_documents(splits, embeddings)

# 构建问答链
qa_chain = RetrievalQA.from_chain_type(
    llm=OllamaLLM(model="mistral"),
    retriever=vectorstore.as_retriever(),
    return_source_documents=True
)

# 提问
query = "莱特兄弟的“飞行者一号”成功升空是什么时候"
result = qa_chain.invoke({"query": query})

print("答案:", result["result"])
print("来源文档:", result["source_documents"][0].page_content[:200])

四. 基础功能测试

1. 文本生成脚本

将待分析的文档保存为report.txt

2. 启动服务

ollama serve &  # 后台启动Ollama服务
python document_qa.py所在路径

3. 交互测试

根据提示输入问题进行测试

五. 基础RAG代码及测试

from langchain_community.document_loaders import TextLoader
from langchain_text_splitters import RecursiveCharacterTextSplitter
from langchain_community.vectorstores import FAISS
from langchain_ollama import OllamaEmbeddings, OllamaLLM
from langchain.chains import RetrievalQA
import os

class SimpleRAG:
    def __init__(self, model_name="mistral"):
        self.model_name = model_name
        self.embeddings = OllamaEmbeddings(model=model_name)
        self.llm = OllamaLLM(model=model_name)
        self.vectorstore = None
        self.qa_chain = None

    def load_documents(self, file_path):
        """加载并预处理文档"""
        if not os.path.exists(file_path):
            raise FileNotFoundError(f"文件 {file_path} 不存在")
            
        loader = TextLoader(file_path)
        docs = loader.load()
        
        text_splitter = RecursiveCharacterTextSplitter(
            chunk_size=1000,
            chunk_overlap=200,
            separators=["\n\n", "\n", "。", "!", "?", ";"]
        )
        return text_splitter.split_documents(docs)

    def build_vectorstore(self, splits, persist_dir=None):
        """构建/加载向量存储"""
        if persist_dir and os.path.exists(persist_dir):
            print(f"加载已有向量存储: {persist_dir}")
            self.vectorstore = FAISS.load_local(persist_dir, self.embeddings)
        else:
            print("创建新向量存储...")
            self.vectorstore = FAISS.from_documents(splits, self.embeddings)
            if persist_dir:
                self.vectorstore.save_local(persist_dir)
                print(f"向量存储已保存到: {persist_dir}")

    def initialize_qa(self):
        """初始化问答链"""
        if not self.vectorstore:
            raise ValueError("请先构建向量存储")
            
        self.qa_chain = RetrievalQA.from_chain_type(
            llm=self.llm,
            retriever=self.vectorstore.as_retriever(search_kwargs={"k": 3}),
            return_source_documents=True
        )

    def query(self, question):
        """执行查询"""
        if not self.qa_chain:
            raise ValueError("请先初始化QA链")
            
        result = self.qa_chain.invoke({"query": question})
        
        print(f"\n问题: {question}")
        print(f"\n答案: {result['result']}")
        self._show_sources(result['source_documents'])

    def _show_sources(self, documents):
        """显示来源文档"""
        print("\n相关文档片段:")
        for i, doc in enumerate(documents[:3], 1):
            content = doc.page_content.replace("\n", " ").strip()
            print(f"{i}. {content[:250]}...")
            print("-" * 50)

if __name__ == "__main__":
    # 配置参数
    DOC_PATH = "/media/ab/RAG_TEST/report.txt"
    VECTORSTORE_DIR = "./vectorstore"

    # 初始化系统
    rag = SimpleRAG()
    
    try:
        # 文档处理
        splits = rag.load_documents(DOC_PATH)
        
        # 构建向量存储(自动复用已有存储)
        rag.build_vectorstore(splits, persist_dir=VECTORSTORE_DIR)
        
        # 初始化QA链
        rag.initialize_qa()
        
        # 交互式问答
        print("输入问题开始查询(输入'exit'退出)")
        while True:
            question = input("\n你的问题: ")
            if question.lower() in ['exit', 'quit']:
                break
            if len(question.strip()) < 3:
                print("问题太短,请重新输入")
                continue
                
            rag.query(question)
            
    except Exception as e:
        print(f"系统错误: {str(e)}")

六. 模型的卸载与环境清理

1. 删除环境内组件

首先在ollama环境下使用pip list列出相应的安装包,使用如下命令删除:

pip uninstall + “package-name”

2. 删除python-ollama环境

首先退出ollama-env:

deactivate

然后运行

rm -rf ollama-env

运行结束后可再次输入

source ollama-env/bin/activate

查看环境是否已经被删除。

3. 卸载ollama及其组件

首先需要停止正在运行的Ollama服务。可以通过以下命令来实现:

sudo systemctl stop ollama.service

这一步确保了在继续下一步之前,Ollama服务已经完全停止。
接下来,需要从系统的bin目录中删除Ollama的可执行文件。

sudo rm $(which ollama)

这一步将移除所有与Ollama相关的可执行文件。
如果有下载并安装了Ollama的模型,还需要删除这些模型以及相关的用户和组。具体操作如下:

sudo rm -r /usr/share/ollama/
sudo userdel ollama
sudo groupdel ollama

这样可以确保所有的数据和配置都被彻底清除。
为了防止未来再次自动启动,可以禁用Ollama的服务单元文件。编辑/etc/systemd/system/ollama.service 文件,将其设置为非自动启动状态:

sudo systemctl disable ollama.service

通过以上步骤,可以完全卸载Ollama及其相关组件,确保系统干净整洁。

posted @ 2025-03-28 01:20  Unalome  阅读(459)  评论(0)    收藏  举报