在本地 Ollama 上免费、离线地运行 Qwen 模型并构建知识库,核心在于实现 RAG(检索增强生成) 技术。

简单来说,Ollama 本身只负责“跑模型”和“对话”,它不具备直接读取你本地 PDF/Word 文档的能力。你需要一个**中间件(前端工具或框架)**来帮你完成“读取文档 -> 切片 -> 向量化存储 -> 检索 -> 发送给 Qwen”这一整套流程。

以下是三种不同难度的方案,推荐优先选择方案一(零代码图形界面)


🚀 方案一:零代码图形界面(最推荐,适合个人/办公)

工具组合: Ollama + AnythingLLM (或 Cherry Studio)
特点: 一键安装,有漂亮的图形界面,支持拖拽上传文档,完全离线,无需写代码。

1. 准备工作

确保你已经安装好 Ollama 并下载了 Qwen 模型:

ollama run qwen2.5
# 还需要下载一个嵌入模型(用于理解文档),推荐 nomic-embed-text
ollama pull nomic-embed-text
2. 安装 AnythingLLM (桌面版)

AnythingLLM 是一个全功能的桌面应用,内置了向量数据库,专门配合 Ollama 使用。

  • 下载地址:访问 anythingllm.com 下载 Windows 安装包。
  • 安装步骤
    1. 运行安装程序,一路 Next。
    2. 首次启动时,它会询问你大模型提供商,选择 Ollama
    3. 它会自动检测你本地的 Ollama 服务。
    4. 选择模型
      • LLM Model: 选择 qwen2.5
      • Embedding Model: 选择 nomic-embed-text (如果列表里没有,点击刷新或手动在终端 ollama pull nomic-embed-text)。
    5. 设置完成,进入主界面。
3. 上传文档与构建知识库
  1. 在 AnythingLLM 界面左侧点击 “New Workspace” (新建工作区),命名为“我的知识库”。
  2. 进入工作区后,找到 “Upload Documents” 按钮。
  3. 拖拽文件:将你的 PDF、Word、TXT、Markdown 等文档直接拖进去。
  4. 向量化:上传完成后,点击 “Move to Workspace”“Embed” 按钮。
    • 此时,软件会在后台调用 nomic-embed-text 模型,将你的文档切成小块并转化为向量数据,存储在本地数据库中。
  5. 开始对话
    • 在底部输入框提问,例如:“根据上传的文档,总结项目的主要风险点?”
    • 系统会自动检索相关片段,结合 Qwen2.5 生成答案,并标注引用来源。

替代方案:如果你喜欢更现代化的界面,也可以下载 Cherry StudioBig-AGI,它们同样支持连接本地 Ollama 并管理知识库。


🛠️ 方案二:Docker 部署专业 RAG 平台(适合进阶用户/团队)

工具组合: Ollama + RagFlow (或 Dify)
特点: 功能极其强大,支持复杂文档解析(表格、图片 OCR),适合企业级应用,但需要安装 Docker。

1. 安装 Docker Desktop
2. 部署 RagFlow (以 RagFlow 为例,对中文支持极好)

RagFlow 是近年来非常火爆的开源 RAG 引擎,深度优化了文档解析。

在 PowerShell 中运行以下命令(需联网下载镜像,下载后可离线运行):

# 创建目录
mkdir ragflow
cd ragflow

# 拉取并运行 (注意:这会下载较大的镜像,请确保网络通畅)
docker run -d --name ragflow -p 80:80 -v ${PWD}/data:/ragflow/data infiniflow/ragflow:latest

等待几分钟直到容器启动成功。

3. 配置 RagFlow 连接 Ollama
  1. 浏览器打开 http://localhost
  2. 初始化管理员账号。
  3. 模型设置
    • 进入 Settings -> Model Providers
    • 添加 provider,选择 Ollama
    • Base URL 填写:http://host.docker.internal:11434 (Docker 访问宿主机 Ollama 的关键地址)。
    • 测试连接,然后添加模型 qwen2.5 和嵌入模型 nomic-embed-text
  4. 创建知识库
    • 点击 Knowledge Base -> Create
    • 上传你的文档(支持 PDF, Word, Excel, PPT, 图片等)。
    • 点击 Parse 进行解析(RagFlow 的解析能力很强,能保留表格结构)。
  5. 创建助手并对话
    • 进入 Chat Assistant,创建一个新助手。
    • 绑定刚才创建的 Knowledge Base。
    • 选择模型为 qwen2.5
    • 开始提问,享受高质量的文档问答。

💻 方案三:Python 代码自建 RAG(适合开发者)

工具组合: Ollama + LangChain + ChromaDB
特点: 完全可控,可定制逻辑,适合集成到自己的项目中。

如果你需要自己写代码实现,以下是一个最小化的 Python 示例:

1. 安装依赖
pip install langchain langchain-community langchain-ollama chromadb pypdf python-docx
2. Python 代码示例

此脚本会读取本地 PDF,建立向量库,并进行问答。

import os
from langchain_community.document_loaders import PyPDFLoader, DirectoryLoader
from langchain_text_splitters import RecursiveCharacterTextSplitter
from langchain_ollama import OllamaEmbeddings, ChatOllama
from langchain_community.vectorstores import Chroma
from langchain.chains import create_retrieval_chain
from langchain.chains.combine_documents import create_stuff_documents_chain
from langchain_core.prompts import ChatPromptTemplate

# 1. 配置路径和模型
MODEL_NAME = "qwen2.5"
EMBED_MODEL = "nomic-embed-text"
DOC_PATH = "./docs"  # 把你要分析的 PDF 放在这个文件夹下
DB_PATH = "./chroma_db" # 向量数据库存储位置

# 2. 加载文档
print("正在加载文档...")
loader = DirectoryLoader(DOC_PATH, glob="*.pdf", loader_cls=PyPDFLoader)
documents = loader.load()

# 3. 文本切片 (Chunking)
text_splitter = RecursiveCharacterTextSplitter(chunk_size=1000, chunk_overlap=200)
splits = text_splitter.split_documents(documents)
print(f"文档已切分为 {len(splits)} 个片段。")

# 4. 初始化嵌入模型和向量数据库
# 确保先运行过: ollama pull nomic-embed-text
embeddings = OllamaEmbeddings(model=EMBED_MODEL)

# 创建或加载向量库
vectorstore = Chroma.from_documents(
    documents=splits, 
    embedding=embeddings, 
    persist_directory=DB_PATH
)
retriever = vectorstore.as_retriever()

# 5. 设置 LLM 和 Prompt
llm = ChatOllama(model=MODEL_NAME)

system_prompt = (
    "你是一个基于本地文档的智能助手。请使用以下检索到的上下文片段来回答问题。"
    "如果上下文中没有答案,请直接说'文档中未提及',不要编造。"
    "\n\n"
    "{context}"
)

prompt = ChatPromptTemplate.from_messages([
    ("system", system_prompt),
    ("human", "{input}"),
])

# 6. 构建 RAG 链
question_answer_chain = create_stuff_documents_chain(llm, prompt)
rag_chain = create_retrieval_chain(retriever, question_answer_chain)

# 7. 开始问答
print("\n--- 知识库已就绪,请输入问题 (输入 'quit' 退出) ---")
while True:
    query = input("\n问: ")
    if query.lower() in ["quit", "exit"]:
        break
    
    response = rag_chain.invoke({"input": query})
    print(f"答: {response['answer']}")
    
    # 可选:显示参考了哪些文档片段
    # for doc in response['context']:
    #     print(f"[来源]: {doc.metadata.get('source', 'Unknown')}")

💡 核心原理解析:为什么需要这些步骤?

  1. Ollama (Qwen2.5):它是“大脑”,负责理解和生成语言,但它不知道你的私有文档内容。
  2. Embedding Model (nomic-embed-text):它是“翻译官”,把你的文字(如“项目风险”)转化成一串数字(向量)。只有转化成数字,计算机才能计算相似度。
  3. Vector Database (Chroma/RagFlow内置):它是“图书馆索引”,存储这些数字向量。当你提问时,它迅速找出和你问题最相似的文档片段。
  4. RAG 流程
    • 你问:“项目风险是什么?”
    • 系统把问题转成向量 -> 在数据库里找到最相关的几段原文。
    • 系统把 “原文片段” + “你的问题” 一起打包发给 Qwen2.5。
    • Qwen2.5 阅读原文,总结出答案给你。

⚠️ 注意事项

  • 显存要求:同时运行 Qwen2.5 (7B) 和 嵌入模型 需要一定的显存。
    • 如果显存紧张(<8GB),建议使用更小版本的 Qwen,如 ollama run qwen2.5:1.5bqwen2.5:3b
    • 或者在 AnythingLLM/RagFlow 设置中限制并发数。
  • 完全离线:一旦模型 (qwen2.5, nomic-embed-text) 和工具 (AnythingLLM/Docker 镜像) 下载完成,拔掉网线依然可以完美运行,数据绝对安全。
  • 文档格式:尽量提供清晰的 PDF 或 Word。如果是扫描版图片 PDF,需要开启 OCR 功能(RagFlow 支持较好,AnythingLLM 可能需要额外配置)。

推荐直接从 方案一 (AnythingLLM) 开始尝试,5 分钟内即可搭建好属于你的本地知识库!

Logo

欢迎加入 MCP 技术社区!与志同道合者携手前行,一同解锁 MCP 技术的无限可能!

更多推荐