ollama安装在指定位置,并开发RAG

要在本机E 盘 “大模型测试” 文件夹下完整部署大模型 RAG 测试环境,需按目录规划→环境配置→Ollama 部署(指定 E 盘存储)→向量库 / 数据库配置→RAG 应用开发的步骤进行,全程将所有组件的安装、存储路径指向 E 盘指定目录。以下是 Windows 系统下的详细实操指南,严格遵循你的路径要求。


一、前期准备:E 盘目录规划

首先在 E 盘创建统一的工作目录,后续所有组件(Ollama、模型、向量库、代码、数据库)均部署在该目录下,目录结构清晰化便于管理:

plaintext

E:\大模型测试\
├─ ollama/                # Ollama主程序配置及模型存储目录
│  └─ models/             # 大模型权重文件(如通义千问、bge嵌入模型)
├─ chroma_db/             # Chroma向量库数据存储目录(RAG核心)
├─ mysql/                 # MySQL数据库数据目录(可选,存储业务日志)
├─ docs/                  # RAG测试用的文档目录(PDF/Word/文本文档)
├─ rag_app/               # Streamlit RAG应用代码目录(核心业务代码)
└─ env/                   # Python虚拟环境目录(隔离依赖,避免污染系统环境)

创建目录命令(打开 Windows 终端 / CMD,执行以下命令一键创建):

bash

运行

# 切换到E盘
E:
# 创建根目录及子目录
mkdir "大模型测试"
mkdir "大模型测试\ollama"
mkdir "大模型测试\ollama\models"
mkdir "大模型测试\chroma_db"
mkdir "大模型测试\mysql"
mkdir "大模型测试\docs"
mkdir "大模型测试\rag_app"
mkdir "大模型测试\env"

二、步骤 1:安装 Python 并创建 E 盘虚拟环境

Python 是 RAG 应用的开发基础,需先安装 Python 并在 E 盘创建独立虚拟环境,避免依赖冲突。

1. 下载并安装 Python

  • Python 官网下载Python 3.10+(推荐 3.10/3.11,兼容性最好);
  • 安装时勾选Add Python to PATH(添加到系统环境变量),安装路径可默认(也可手动指定为E:\大模型测试\python)。

2. 创建 E 盘的 Python 虚拟环境

打开Windows 终端(管理员),执行以下命令:

bash

运行

# 切换到E盘大模型测试目录
E:
cd "大模型测试"
# 创建虚拟环境(存储到E:\大模型测试\env)
python -m venv env
# 激活虚拟环境(激活后终端前缀会显示(env))
env\Scripts\activate.bat

3. 安装 RAG 核心依赖包

在激活的虚拟环境中,安装所有 RAG 所需的 Python 包(依赖会保存在E:\大模型测试\env中):

bash

运行

# 升级pip(避免安装失败)
python -m pip install --upgrade pip
# 安装RAG核心包(Streamlit+LangChain+ChromaDB+文档解析)
pip install streamlit langchain langchain-community langchain-core pypdf python-docx chromadb ollama
# 可选:安装MySQL驱动(如需存储RAG调用日志)
pip install pymysql cryptography
# 可选:安装Docker相关包(如需部署MySQL)
pip install docker

三、步骤 2:部署 Ollama(强制指定 E 盘存储模型)

Ollama 是本地运行大模型的核心工具,默认会将模型存到 C 盘,需通过环境变量强制指定模型和配置存储到 E 盘目录。

1. 下载并安装 Ollama

  • Ollama 官网下载 Windows 版本的 Ollama 安装包;
  • 安装时路径默认即可(仅程序安装,模型后续会存到 E 盘)。

2. 配置 Ollama 环境变量(关键:指定 E 盘存储)

通过系统环境变量,让 Ollama 将模型和配置文件存到E:\大模型测试\ollama

  1. 右键此电脑属性高级系统设置环境变量
  2. 系统变量中点击新建,添加以下两个变量:
    变量名变量值说明
    OLLAMA_MODELSE:\大模型测试\ollama\models大模型权重存储目录
    OLLAMA_HOMEE:\大模型测试\ollamaOllama 配置文件存储目录
  3. 点击确定保存,重启所有终端(cmd、powershell)使环境变量生效(必须重启,否则配置不生效)。

        如果不生效, 使用cmd命令指定安装目录 : OllamaSetup(1).exe /DIR="E:\大模型测试\ollama"

3. 启动 Ollama 并拉取大模型

  1. 启动 Ollama 服务:打开新的终端,执行以下命令(此终端需保持打开,关闭则服务停止):

    bash

    运行

    ollama serve
    
  2. 拉取测试用模型:再打开一个新终端,执行以下命令拉取大模型和嵌入模型(模型会自动存到E:\大模型测试\ollama\models):

    bash

    运行

    # 拉取通义千问14B 4bit量化版(轻量,适合本地测试)
    ollama pull qwen:14b-q4_0
    # 拉取轻量嵌入模型(用于文档向量化,RAG必备)
    ollama pull mxbai-embed-large
    
    拉取完成后,可在E:\大模型测试\ollama\models目录下看到模型文件。

4. 测试 Ollama 是否正常运行

执行以下命令,测试模型调用是否成功:

bash

运行

ollama run qwen:14b-q4_0

输入测试问题(如 “什么是 RAG 技术?”),若模型能正常回答,说明 Ollama 部署成功。


四、步骤 3:配置向量库(ChromaDB)和数据库(可选)

1. ChromaDB 配置(指定 E 盘存储路径)

ChromaDB 是轻量级向量库,无需单独部署服务,只需在 RAG 代码中指定数据存储目录E:\大模型测试\chroma_db即可(后续在代码中配置)。

2. MySQL 数据库部署(可选,存储 RAG 日志)

若需存储 RAG 调用日志、用户问题等数据,推荐用Docker在 E 盘部署 MySQL(数据存到E:\大模型测试\mysql):

  1. 安装Docker Desktop,启动后在终端执行:

    bash

    运行

    # 拉取MySQL8.0镜像并运行,数据映射到E盘
    docker run -d \
      --name rag-mysql \
      -p 3306:3306 \
      -e MYSQL_ROOT_PASSWORD=123456 \  # 数据库密码,可自定义
      -v "E:\大模型测试\mysql\data:/var/lib/mysql" \  # 数据存储目录
      -v "E:\大模型测试\mysql\conf:/etc/mysql/conf.d" \  # 配置目录
      mysql:8.0
    
  2. 测试连接:用 Navicat/DBeaver 连接localhost:3306,用户名root,密码123456,能连接则部署成功。

五、步骤 4:开发 RAG 应用(代码存到 E 盘)

E:\大模型测试\rag_app目录下创建 Streamlit RAG 应用代码,核心是指定向量库存储路径文档目录为 E 盘,以下是完整代码。

1. 创建 RAG 应用代码

E:\大模型测试\rag_app目录下新建文件enterprise_rag_app.py,复制以下代码(已指定 E 盘路径):

python

运行

import streamlit as st
import os
import tempfile
from datetime import datetime
# 文档解析库
from pypdf import PdfReader
from docx import Document
# LangChain相关库
from langchain.text_splitter import RecursiveCharacterTextSplitter
from langchain.embeddings import OllamaEmbeddings
from langchain.vectorstores import Chroma
from langchain.chains import RetrievalQA
from langchain.llms import Ollama

# ---------------------- 核心路径配置(强制指定E盘) ----------------------
BASE_DIR = "E:\\大模型测试"
CHROMA_DB_DIR = os.path.join(BASE_DIR, "chroma_db")  # 向量库存储路径
DOCS_DIR = os.path.join(BASE_DIR, "docs")            # 测试文档存储路径
# 确保目录存在
os.makedirs(DOCS_DIR, exist_ok=True)

# ---------------------- 页面基础配置 ----------------------
st.set_page_config(
    page_title="企业RAG测试平台",
    page_icon="📚",
    layout="wide",
    initial_sidebar_state="expanded"
)

# 初始化会话状态
if "vector_db" not in st.session_state:
    st.session_state.vector_db = None
if "chat_logs" not in st.session_state:
    st.session_state.chat_logs = []
if "model_loaded" not in st.session_state:
    st.session_state.model_loaded = False

# ---------------------- 侧边栏配置 ----------------------
with st.sidebar:
    st.title("⚙️ 配置中心")
    # Ollama模型选择
    model_name = st.selectbox(
        "选择本地大模型",
        options=["qwen:14b-q4_0", "llama2:7b-q4_0", "gemma:7b-q4_0"],
        index=0
    )
    # 检索参数
    top_k = st.slider("检索文档片段数", min_value=1, max_value=10, value=3)
    chunk_size = st.slider("文本分片大小", min_value=200, max_value=2000, value=500)
    chunk_overlap = st.slider("分片重叠长度", min_value=0, max_value=200, value=50)
    
    # 清空日志/知识库
    st.divider()
    if st.button("🗑️ 清空聊天日志", type="secondary"):
        st.session_state.chat_logs = []
        st.success("日志已清空!")
    if st.button("🧹 清空知识库", type="primary", danger=True):
        st.session_state.vector_db = None
        if os.path.exists(CHROMA_DB_DIR):
            import shutil
            shutil.rmtree(CHROMA_DB_DIR)
        st.success("知识库已清空!")

# ---------------------- 核心函数 ----------------------
def parse_document(file):
    """解析PDF/Word文档"""
    text = ""
    file_ext = os.path.splitext(file.name)[1].lower()
    # 保存文件到E盘docs目录
    file_path = os.path.join(DOCS_DIR, file.name)
    with open(file_path, "wb") as f:
        f.write(file.getvalue())
    
    if file_ext == ".pdf":
        pdf_reader = PdfReader(file)
        for page in pdf_reader.pages:
            page_text = page.extract_text()
            if page_text:
                text += page_text
    elif file_ext == ".docx":
        doc = Document(file)
        for para in doc.paragraphs:
            if para.text:
                text += para.text + "\n"
    else:
        st.error(f"不支持的格式:{file_ext},仅支持PDF/Word")
        return None, None
    # 构建元数据
    metadata = {
        "file_name": file.name,
        "file_path": file_path,
        "doc_type": file_ext.lstrip("."),
        "upload_time": datetime.now().strftime("%Y-%m-%d %H:%M:%S")
    }
    return text, metadata

def build_vector_db(text, chunk_size=500, chunk_overlap=50):
    """构建Chroma向量库(存储到E盘)"""
    text_splitter = RecursiveCharacterTextSplitter(
        chunk_size=chunk_size, chunk_overlap=chunk_overlap,
        separators=["\n\n", "\n", "。", "!", "?", ","]
    )
    chunks = text_splitter.split_text(text)
    st.info(f"文档解析完成,分割为 {len(chunks)} 个片段")
    
    # 加载嵌入模型
    embeddings = OllamaEmbeddings(model="bge:small", base_url="http://localhost:11434")
    # 构建向量库(指定E盘存储路径)
    vector_db = Chroma.from_texts(
        texts=chunks,
        embedding=embeddings,
        persist_directory=CHROMA_DB_DIR
    )
    vector_db.persist()
    return vector_db

def call_rag_chain(question, vector_db, model_name, top_k=3):
    """调用RAG链生成回答"""
    llm = Ollama(
        model=model_name,
        base_url="http://localhost:11434",
        temperature=0.1
    )
    qa_chain = RetrievalQA.from_chain_type(
        llm=llm,
        chain_type="stuff",
        retriever=vector_db.as_retriever(search_kwargs={"k": top_k}),
        return_source_documents=True
    )
    result = qa_chain({"query": question})
    return result["result"], result["source_documents"]

# ---------------------- 主页面 ----------------------
st.title("📚 E盘本地RAG测试平台")
st.caption("基于Ollama+ChromaDB构建,数据全程存储在E盘")

col1, col2 = st.columns([2, 1])
with col1:
    # 文档上传
    st.subheader("📤 上传测试文档")
    uploaded_files = st.file_uploader(
        "上传PDF/Word文档",
        accept_multiple_files=True,
        type=["pdf", "docx"],
        help="文档会保存到E:\大模型测试\docs"
    )
    if uploaded_files and st.button("🚀 解析并构建知识库", type="primary"):
        with st.spinner("解析文档中..."):
            all_text = ""
            for file in uploaded_files:
                text, metadata = parse_document(file)
                if text:
                    all_text += text + "\n\n"
            if all_text:
                st.session_state.vector_db = build_vector_db(
                    all_text, chunk_size=chunk_size, chunk_overlap=chunk_overlap
                )
                st.session_state.model_loaded = True
                st.success(f"知识库构建成功!共解析 {len(uploaded_files)} 个文档")
    
    # 智能问答
    st.divider()
    st.subheader("❓ RAG智能问答")
    question = st.text_input("输入测试问题", placeholder="例如:文档中提到的产品售后政策是什么?")
    if st.button("🔍 获取回答") and question:
        if not st.session_state.model_loaded:
            st.warning("请先上传文档构建知识库!")
        else:
            with st.spinner("检索并生成回答..."):
                answer, sources = call_rag_chain(
                    question, st.session_state.vector_db, model_name, top_k=top_k
                )
                # 记录日志
                st.session_state.chat_logs.append({
                    "time": datetime.now().strftime("%Y-%m-%d %H:%M:%S"),
                    "question": question,
                    "answer": answer,
                    "sources": len(sources)
                })
                # 展示结果
                st.markdown("### 📝 回答结果")
                st.write(answer)
                st.markdown("### 📖 参考文档片段")
                for i, doc in enumerate(sources):
                    st.caption(f"参考片段 {i+1}")
                    st.write(doc.page_content[:200] + "..." if len(doc.page_content) > 200 else doc.page_content)

with col2:
    # 调用日志
    st.subheader("📜 调用日志")
    if st.session_state.chat_logs:
        for log in reversed(st.session_state.chat_logs):
            with st.card():
                st.markdown(f"**时间**:{log['time']}")
                st.markdown(f"**问题**:{log['question']}")
                st.markdown(f"**回答**:{log['answer'][:100]}..." if len(log['answer']) > 100 else log['answer'])
    else:
        st.info("暂无调用日志,开始提问吧!")

2. 运行 RAG 应用

  1. 打开终端,切换到 E 盘并激活虚拟环境:

    bash

    运行

    E:
    cd "大模型测试"
    env\Scripts\activate.bat
    
  2. 进入 rag_app 目录并启动 Streamlit 应用:

    bash

    运行

    cd rag_app
    streamlit run enterprise_rag_app.py
    
  3. 启动后会自动打开浏览器,地址为http://localhost:8501,即可开始 RAG 测试。(如果是第一次启动Streamlit会出现下面内容)

直接留空邮箱(不填写任何内容),按回车键跳过


六、步骤 5:RAG 测试流程

  1. 上传文档:在应用中上传 PDF/Word 测试文档(文档会保存到E:\大模型测试\docs);
  2. 构建知识库:点击 “解析并构建知识库”,文档会被转为向量存储到E:\大模型测试\chroma_db
  3. 智能问答:输入与文档相关的问题,模型会结合知识库生成回答,实现 RAG 效果;
  4. 管理数据:可通过侧边栏 “清空知识库” 或代码中的删除逻辑,清理不需要的向量数据。

七、关键注意事项

  1. 路径分隔符:Windows 系统中路径用\,代码中需用\\或原始字符串r"E:\大模型测试"避免转义;
  2. Ollama 服务:运行 RAG 应用前,需确保ollama serve终端处于打开状态,否则模型无法调用;
  3. 权限问题:若创建目录 / 写入文件失败,需以管理员身份运行终端;
  4. 模型拉取:若模型拉取缓慢,可配置 Ollama 国内镜像(修改OLLAMA_BASE_URL环境变量为国内镜像地址)。

至此,你已在 E 盘 “大模型测试” 目录下完成了全套 RAG 环境的部署,所有组件均存储在指定路径,可直接进行本地 RAG 测试!

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值