如何在Ollama上免费、离线地运行Qwen 模型,以及如何上传文档分析、构建知识库
在本地 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 安装包。
- 安装步骤:
- 运行安装程序,一路 Next。
- 首次启动时,它会询问你大模型提供商,选择 Ollama。
- 它会自动检测你本地的 Ollama 服务。
- 选择模型:
- LLM Model: 选择
qwen2.5 - Embedding Model: 选择
nomic-embed-text(如果列表里没有,点击刷新或手动在终端ollama pull nomic-embed-text)。
- LLM Model: 选择
- 设置完成,进入主界面。
3. 上传文档与构建知识库
- 在 AnythingLLM 界面左侧点击 “New Workspace” (新建工作区),命名为“我的知识库”。
- 进入工作区后,找到 “Upload Documents” 按钮。
- 拖拽文件:将你的 PDF、Word、TXT、Markdown 等文档直接拖进去。
- 向量化:上传完成后,点击 “Move to Workspace” 或 “Embed” 按钮。
- 此时,软件会在后台调用
nomic-embed-text模型,将你的文档切成小块并转化为向量数据,存储在本地数据库中。
- 此时,软件会在后台调用
- 开始对话:
- 在底部输入框提问,例如:“根据上传的文档,总结项目的主要风险点?”
- 系统会自动检索相关片段,结合 Qwen2.5 生成答案,并标注引用来源。
替代方案:如果你喜欢更现代化的界面,也可以下载 Cherry Studio 或 Big-AGI,它们同样支持连接本地 Ollama 并管理知识库。
🛠️ 方案二:Docker 部署专业 RAG 平台(适合进阶用户/团队)
工具组合: Ollama + RagFlow (或 Dify)
特点: 功能极其强大,支持复杂文档解析(表格、图片 OCR),适合企业级应用,但需要安装 Docker。
1. 安装 Docker Desktop
- 下载并安装 Docker Desktop for Windows。
- 确保 WSL 2 后端已启用(安装时通常会提示)。
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
- 浏览器打开
http://localhost。 - 初始化管理员账号。
- 模型设置:
- 进入
Settings->Model Providers。 - 添加 provider,选择
Ollama。 - Base URL 填写:
http://host.docker.internal:11434(Docker 访问宿主机 Ollama 的关键地址)。 - 测试连接,然后添加模型
qwen2.5和嵌入模型nomic-embed-text。
- 进入
- 创建知识库:
- 点击
Knowledge Base->Create。 - 上传你的文档(支持 PDF, Word, Excel, PPT, 图片等)。
- 点击
Parse进行解析(RagFlow 的解析能力很强,能保留表格结构)。
- 点击
- 创建助手并对话:
- 进入
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')}")
💡 核心原理解析:为什么需要这些步骤?
- Ollama (Qwen2.5):它是“大脑”,负责理解和生成语言,但它不知道你的私有文档内容。
- Embedding Model (nomic-embed-text):它是“翻译官”,把你的文字(如“项目风险”)转化成一串数字(向量)。只有转化成数字,计算机才能计算相似度。
- Vector Database (Chroma/RagFlow内置):它是“图书馆索引”,存储这些数字向量。当你提问时,它迅速找出和你问题最相似的文档片段。
- RAG 流程:
- 你问:“项目风险是什么?”
- 系统把问题转成向量 -> 在数据库里找到最相关的几段原文。
- 系统把 “原文片段” + “你的问题” 一起打包发给 Qwen2.5。
- Qwen2.5 阅读原文,总结出答案给你。
⚠️ 注意事项
- 显存要求:同时运行 Qwen2.5 (7B) 和 嵌入模型 需要一定的显存。
- 如果显存紧张(<8GB),建议使用更小版本的 Qwen,如
ollama run qwen2.5:1.5b或qwen2.5:3b。 - 或者在 AnythingLLM/RagFlow 设置中限制并发数。
- 如果显存紧张(<8GB),建议使用更小版本的 Qwen,如
- 完全离线:一旦模型 (
qwen2.5,nomic-embed-text) 和工具 (AnythingLLM/Docker 镜像) 下载完成,拔掉网线依然可以完美运行,数据绝对安全。 - 文档格式:尽量提供清晰的 PDF 或 Word。如果是扫描版图片 PDF,需要开启 OCR 功能(RagFlow 支持较好,AnythingLLM 可能需要额外配置)。
推荐直接从 方案一 (AnythingLLM) 开始尝试,5 分钟内即可搭建好属于你的本地知识库!
更多推荐


所有评论(0)