零成本搭建本地AI知识库:Ollama+Dify全栈部署指南

🚀 30+款热门AI模型一站整合,DeepSeek/GLM/Qwen 随心用,限时 5 折。 👉 点击领海量免费额度

如果你正在寻找一种简单、免费、且能完全在本地运行的大模型应用方案,那么这篇文章就是为你准备的。过去几个月,我见过太多开发者被复杂的云服务配置、高昂的API调用成本和数据隐私问题劝退。他们只是想快速搭建一个能问答、能总结文档的智能助手,却不得不在各种框架和云服务商之间疲于奔命。

今天要介绍的核心方案是:Ollama + Dify。这可能是目前个人开发者和小团队搭建私有化AI应用门槛最低、成本最可控的路径。Ollama负责在本地轻松运行各种开源大模型,而Dify则提供了一个直观的图形化界面,让你像搭积木一样,无需编码就能构建基于这些模型的AI应用,比如我们最关心的本地知识库。

这篇文章不会只告诉你“点击这里,输入那里”。我会带你理解为什么这个组合在当前时间点(2026年)依然有效,它解决了从模型部署到应用构建的哪些核心痛点,以及在实际操作中,有哪些“坑”是教程里很少提及的。读完本文,你将能独立完成从零部署一个功能完整的本地知识库,并理解其背后的工作流,以便未来进行自定义扩展。

1. 为什么是 Ollama + Dify?重新定义“零成本”部署

在讨论具体步骤前,我们需要先达成一个共识:这里的“零成本”指的是什么?它并非指绝对的零硬件投入,而是指零持续的云服务订阅费用、零按Token计费的API调用成本,以及零数据出域带来的隐私风险。你只需要准备一台性能尚可的电脑(甚至是一台闲置的旧笔记本或小型服务器),就能获得一个完全受控的AI能力底座。

Ollama的核心价值在于“简化”。它将模型下载、环境配置、服务启动等复杂过程封装成几条简单的命令行指令。你不再需要手动处理CUDA版本、Python依赖冲突或是复杂的模型格式转换。无论是 Llama 3、Qwen 还是 Mistral,一句ollama run就能让模型在本地跑起来,并以标准的API接口提供服务。这极大地降低了个人接触和试验前沿开源模型的门槛。

Dify的核心价值在于“可视化编排”。它把大模型应用开发中常见的功能——如提示词工程、上下文管理、知识库检索(RAG)、工作流编排——做成了拖拽式的图形界面。你可以把Dify理解为一个本地的、功能更聚焦的“AI版低代码平台”。它通过连接Ollama提供的模型API,让你能快速构建一个具备文件上传、智能问答、内容总结等能力的知识库应用,而无需从零开始写后端、设计数据库和前端界面。

这个组合的巧妙之处在于:Ollama解决了“模型怎么来、怎么跑”的问题,Dify解决了“模型能干什么、怎么用起来”的问题。两者都支持Docker部署,环境隔离性好,且社区活跃,问题容易找到解决方案。对于绝大多数非AI算法出身的开发者或技术爱好者来说,这是将大模型能力“产品化”的最短路径。

2. 核心概念与组件拆解

在动手之前,花几分钟理解这几个关键概念,能让你在后续配置时知其所以然,遇到问题也能快速定位。

2.1 Ollama:你的本地模型引擎

  • 是什么:一个用于在本地运行、管理和服务大型语言模型(LLM)的开源框架。
  • 核心功能
    1. 模型拉取:从官方或社区仓库一键下载预量化好的模型文件(如llama3:8b,qwen2.5:7b)。
    2. 模型运行:内置运行时,自动处理模型加载、GPU/CPU资源分配。
    3. API服务:启动后,会在本地(默认http://localhost:11434)提供一个兼容 OpenAI API 格式的接口,方便其他应用调用。
  • 关键特点:操作极其简单,几乎无需配置。它是你本地大模型能力的“电源开关”。

2.2 Dify:你的AI应用工厂

  • 是什么:一个开源的LLM应用开发平台,提供可视化编排工具。
  • 核心功能
    1. 应用创建:通过界面创建“对话型”或“文本生成型”应用。
    2. 提示词编排:可视化配置系统提示词、用户输入模板和上下文变量。
    3. 知识库(核心):支持上传TXT、PDF、Word、PPT等文件,自动进行文本分割、向量化(Embedding)并存入向量数据库,实现基于文档内容的检索增强生成(RAG)。
    4. 工作流:通过拖拽节点构建复杂的多步骤AI处理流程。
  • 关键特点:将AI应用开发从“写代码”变为“配流程”,大幅降低开发门槛。

2.3 本地知识库(RAG)的工作流程

这是本教程构建的核心。其流程并非Dify或Ollama独有,但理解它至关重要:

  1. 文档处理:你上传一份产品手册PDF。Dify会将其转换为纯文本,并按一定策略(如按段落、按字数)切割成多个文本片段(Chunks)。
  2. 向量化:Dify调用一个Embedding模型(如bge-large-zh-v1.5),将每个文本片段转换为一个高维度的数值向量。这个向量可以理解为这段文本的“数学指纹”。
  3. 存储:这些向量被存储到向量数据库(如Dify内置的ChromaDB)中,并与原始文本片段建立映射。
  4. 检索:当你提问“这款产品如何保修?”时,Dify会用同样的Embedding模型将你的问题也转换为向量,然后在向量数据库中查找与之“最相似”(即向量距离最近)的文本片段。
  5. 增强生成:检索到的相关文本片段,会作为“上下文”和你的问题一起,提交给Ollama运行的LLM。LLM基于这些提供的上下文来生成答案,从而确保答案来源于你的文档,减少“胡言乱语”。

3. 环境准备与前置条件

成功的部署始于清晰的环境准备。请确保你的系统满足以下要求。

3.1 硬件与操作系统要求

  • 操作系统:Linux (Ubuntu 20.04+ / CentOS 7+), macOS, Windows 10/11 (通过WSL2获得最佳体验)。本教程以Ubuntu 22.04为例,其他系统原理相通。
  • 内存至少16GB RAM。这是硬性要求,因为需要同时运行Ollama(加载模型)、Dify服务、向量数据库等。若要运行更大的模型(如13B、70B),需要32GB或更多内存。
  • 存储:预留50GB以上可用空间。模型文件体积庞大(一个7B模型约4-5GB,一个70B模型约40GB)。
  • GPU(可选但强烈推荐):拥有NVIDIA GPU(显存6GB以上)将极大提升模型推理速度。Ollama能自动检测并使用CUDA。如果没有GPU,模型将在CPU上运行,速度会慢很多,但功能完整。

3.2 软件依赖安装

我们需要安装两个核心工具:Docker 和 Docker Compose。它们用于容器化部署,保证环境一致性。

  1. 更新系统包索引

    sudo apt-get update
  2. 安装 Docker

    # 卸载旧版本(如有) sudo apt-get remove docker docker-engine docker.io containerd runc # 安装依赖 sudo apt-get install -y ca-certificates curl gnupg lsb-release # 添加Docker官方GPG密钥 sudo mkdir -p /etc/apt/keyrings curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg # 设置稳定版仓库 echo \ "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu \ $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null # 安装Docker引擎 sudo apt-get update sudo apt-get install -y docker-ce docker-ce-cli containerd.io docker-compose-plugin
  3. 验证 Docker 安装

    sudo docker --version # 输出类似:Docker version 24.0.7, build afdd53b
  4. (可选但推荐)将当前用户加入docker组,避免每次命令都加sudo

    sudo groupadd docker sudo usermod -aG docker $USER # 退出当前终端并重新登录,使组更改生效

    重新登录后,运行docker ps测试是否无需sudo即可执行。

3.3 目录规划

建议创建一个清晰的项目目录,便于管理。

mkdir -p ~/ai-stack/{ollama, dify} cd ~/ai-stack
  • ollama目录:用于存放Ollama的配置和模型数据(通过Docker卷映射)。
  • dify目录:用于存放Dify的Docker Compose配置文件。

4. 部署 Ollama:启动本地模型服务

我们将使用Docker运行Ollama,这是最干净、最易于管理的方式。

  1. 创建Ollama数据目录(用于持久化模型):

    mkdir -p ~/ai-stack/ollama/models
  2. 使用Docker运行Ollama容器

    docker run -d \ --name ollama \ --restart unless-stopped \ -v ~/ai-stack/ollama/models:/root/.ollama \ -p 11434:11434 \ ollama/ollama:latest

    参数解释

    • -d: 后台运行。
    • --name ollama: 容器命名为ollama
    • --restart unless-stopped: 容器意外退出时自动重启。
    • -v ...: 将主机目录挂载到容器内,确保下载的模型不会随容器删除而丢失。
    • -p 11434:11434: 将容器的11434端口映射到主机,这是Ollama的API端口。
  3. 验证Ollama服务

    curl http://localhost:11434/api/tags

    如果返回{"models":[]}或类似的JSON,说明服务已启动成功。目前模型列表为空,因为我们还没拉取任何模型。

  4. 拉取一个合适的模型: 模型选择是关键。对于中文场景和有限资源,推荐从中小尺寸开始。例如,拉取一个优秀的7B参数中文模型:

    docker exec -it ollama ollama pull qwen2.5:7b

    命令解释:在运行的ollama容器内执行ollama pull命令。

    • qwen2.5:7b:通义千问2.5的7B参数版本,中英文能力均衡,对硬件要求相对友好。
    • 拉取过程需要时间,取决于你的网络速度,模型文件约4-5GB。
    • 你也可以选择其他模型,如llama3.2:3b(更小更快,英文优先)、llama3.2:1b(极速体验)或deepseek-coder:6.7b(编程专用)。
  5. 测试模型运行: 拉取完成后,测试模型是否能正常响应。

    docker exec -it ollama ollama run qwen2.5:7b "你好,请用中文简单介绍一下你自己。"

    你应该能看到模型生成的自我介绍文本。按Ctrl+D可以退出本次交互。

至此,你的本地大模型引擎已经就绪,它正在http://localhost:11434提供API服务。

5. 部署 Dify:搭建可视化应用平台

Dify官方提供了基于Docker Compose的一键部署方案,极大简化了部署流程。

  1. 进入Dify工作目录并下载配置文件

    cd ~/ai-stack/dify # 下载最新的docker-compose.yaml配置文件 curl -o docker-compose.yaml https://raw.githubusercontent.com/langgenius/dify/main/docker/docker-compose.yaml # 下载环境变量配置文件 curl -o .env https://raw.githubusercontent.com/langgenius/dify/main/docker/.env.example
  2. 关键配置修改: 我们需要编辑.env文件,告诉Dify如何连接我们刚刚部署的Ollama服务。

    nano .env

    找到并修改以下关键配置项:

    # 设置Dify的访问地址,改为你服务器的IP或域名(本地访问可暂时不改) APP_URL=http://localhost # 数据库配置(使用默认的PostgreSQL和Redis即可) DB_PASSWORD=difyai123456 # 建议修改为一个强密码 # ========== 关键配置:连接 Ollama ========== # 指定默认的文本生成模型提供商为“OpenAI兼容接口” TEXT_GENERATION_MODEL_PROVIDER=openai # 将OpenAI兼容接口的端点指向本地Ollama服务 OPENAI_API_BASE_URL=http://host.docker.internal:11434/v1 # 注意:`host.docker.internal` 是Docker容器内访问宿主机服务的特殊域名。 # 如果你的Docker环境不支持(如某些Linux原生Docker),可能需要改为宿主机的实际IP,如 `http://192.168.1.100:11434/v1` # 设置一个虚拟的API密钥(Ollama不需要,但Dify表单要求填写) OPENAI_API_KEY=ollama-dummy-key # 设置默认使用的模型名称,必须与Ollama中拉取的模型名称匹配 DEFAULT_MODEL=qwen2.5:7b # ========== 关键配置:Embedding模型 ========== # Dify需要Embedding模型来处理知识库文档。我们可以使用一个轻量级的本地模型。 EMBEDDING_MODEL_PROVIDER=openai EMBEDDING_MODEL_NAME=text-embedding-ada-002 # 这是一个模型名称标识,实际会由我们指定的本地模型服务提供 # 同样,将Embedding模型的接口指向一个本地服务。我们可以使用另一个轻量模型,如 `nomic-embed-text`,也通过Ollama运行。 OPENAI_EMBEDDING_API_BASE_URL=http://host.docker.internal:11434/v1 OPENAI_EMBEDDING_API_KEY=ollama-dummy-key

    保存并退出编辑器

  3. 为Embedding模型准备一个轻量级文本嵌入模型: 回到终端,为Dify拉取一个适合的Embedding模型。我们使用nomic-embed-text,它体积小且效果不错。

    docker exec -it ollama ollama pull nomic-embed-text

    拉取完成后,Ollama会自动加载它,Dify即可通过同一个API地址调用。

  4. 启动Dify服务: 在~/ai-stack/dify目录下,运行:

    docker-compose up -d

    这个命令会拉取Dify相关的多个镜像(Web前端、后端API、Worker等)并启动容器。首次运行需要下载镜像,请耐心等待几分钟。

  5. 查看服务状态

    docker-compose ps

    等待所有服务的状态(State)都变为Up。你可以通过docker-compose logs -f来跟踪启动日志。

  6. 访问Dify控制台: 在浏览器中打开http://localhost(如果你在本地部署)。如果部署在远程服务器,则打开http://<你的服务器IP>

    • 首次访问会进入初始化页面,创建管理员账户。
    • 输入邮箱和密码,点击“初始化”即可。

6. 构建你的第一个本地知识库应用

现在,激动人心的部分来了。我们将使用Dify的图形界面,创建一个基于本地文档的智能问答应用。

6.1 创建应用并配置模型

  1. 登录Dify控制台,点击“创建应用”。
  2. 选择“对话型应用”,输入应用名称,如“我的产品手册助手”。
  3. 进入应用配置界面后,找到“模型供应商”设置。
    • 模型类型:选择“文本生成”。
    • 供应商:这里应该已经自动识别为“OpenAI”,因为我们配置了OPENAI_API_BASE_URL
    • 模型:选择qwen2.5:7b(与.envDEFAULT_MODEL一致)。
    • API密钥:填写ollama-dummy-key
    • API地址:显示为我们配置的http://host.docker.internal:11434/v1
  4. 点击“测试”按钮,如果提示“连接成功”,说明Dify已经成功连上了本地的Ollama服务。

6.2 创建并配置知识库

  1. 在左侧导航栏点击“知识库”,然后点击“创建知识库”。
  2. 填写知识库名称,如“产品手册V1.0”。
  3. 关键步骤:选择嵌入模型
    • 在知识库设置中,找到“嵌入模型”。
    • 供应商选择“OpenAI”。
    • 模型选择text-embedding-ada-002(这是我们之前在.env中配置的标识,实际由nomic-embed-text提供服务)。
    • 确保API地址和密钥正确。
    • 点击“测试”,确保嵌入模型连接成功。这是知识库能否正常工作的前提。
  4. 上传文档
    • 进入创建好的知识库,点击“上传文件”。
    • 支持格式:TXT、PDF、Word、PPT、Excel、Markdown等。
    • 上传你的产品手册、公司文档、个人笔记等。例如,你可以准备一个product_guide.pdf文件。
    • Dify会自动进行文本提取、分割和向量化处理。处理状态会显示为“索引中”,完成后变为“已索引”。

6.3 在应用中使用知识库

  1. 回到你创建的“我的产品手册助手”应用。
  2. 在“提示词编排”页面,找到“上下文”区域。
  3. 开启“知识库”开关,并选择你刚刚创建的“产品手册V1.0”知识库。
  4. 配置检索策略(非常重要):
    • 检索模式:通常选择“向量化检索”。对于精度要求高、文档量不大的场景,可以勾选“多路召回”或“全文检索”进行组合。
    • 相似度阈值:建议设置在0.6-0.8之间。值越高,检索到的片段与问题相关性要求越高,但可能漏掉相关信息;值越低,检索范围越广,但可能引入噪声。可以从0.7开始调整。
    • 返回数量:控制每次检索返回几个文本片段。一般3-5个足够。
  5. 保存配置。

6.4 测试与优化

  1. 点击右上角的“发布”按钮,将应用发布。
  2. 在应用概览页,点击“访问地址”即可打开一个独立的Web对话界面。
  3. 进行测试
    • 问一个文档中明确存在答案的问题,如“产品的保修期是多久?”
    • 观察回答是否准确,并可以点击回答下方的“查看引用”来确认答案来源于你上传的文档。
  4. 优化提示词
    • 在“提示词编排”中,优化“系统提示词”。例如,可以加入:“你是一个专业的客服助手,请严格根据提供的知识库内容回答问题。如果知识库中没有相关信息,请直接回答‘根据现有资料,我无法回答这个问题。’不要编造信息。”
    • 这能有效控制模型的“幻觉”行为,让答案更精准。

7. 核心配置详解与高级调优

基础流程跑通后,你可能需要对一些核心参数进行调优,以提升知识库的问答质量。

7.1 文本分割策略

文档上传时,Dify会进行文本分割。合理的分割对检索精度影响巨大。

  • 进入知识库设置-> “处理方式”。
  • 分割方法
    • 按分隔符:适用于结构清晰的文档(如Markdown)。
    • 按字符数:最常用的方法。需要平衡“片段长度”和“重叠长度”。
      • 片段长度:通常设置在300-800字符之间。太短可能丢失完整语义,太长可能包含无关信息干扰检索。
      • 重叠长度:设置在50-150字符。确保一个完整的概念被分割到两个片段时,通过重叠部分能保持上下文连贯。
  • 建议:对于技术文档,可以尝试500字符长度,100字符重叠进行初调。

7.2 检索与生成参数

在应用的“提示词编排” -> “上下文” -> “知识库”设置中:

  • 相似度阈值:这是最重要的参数之一。如果发现模型经常回答“未找到相关信息”,可以适当降低阈值(如从0.7调到0.65)。如果发现答案中混入了不相关的内容,则提高阈值。
  • Top K:即返回数量。增加此值可以提供更多上下文,但也会增加模型处理负担和引入噪声的风险。非复杂文档,3通常足够。
  • 在回答中显示引用:务必开启。这不仅是可解释性的要求,更是你验证知识库是否生效、答案是否靠谱的直接依据。

7.3 模型参数调优

在“模型供应商”设置下方,可以展开“高级参数”:

  • 温度(Temperature):控制生成文本的随机性。对于知识库问答,追求准确性和一致性,建议设置为较低值,如0.10.2
  • 最大生成长度:根据你的回答长度预期设置。一般5121024足够。
  • 停止序列:可以设置如“\n\n”来防止模型生成过多无关内容。

8. 常见问题与排查思路

部署和使用过程中,你大概率会遇到以下问题。别慌,按此清单排查。

问题现象可能原因排查方式解决方案
Ollama 拉取模型失败或极慢1. 网络连接问题。
2. 磁盘空间不足。
1. 运行docker logs ollama查看拉取日志。
2. 检查df -h确认磁盘空间。
1. 考虑配置网络代理或使用国内镜像源(非本文讨论范围,请谨慎合法操作)。
2. 清理磁盘或指定更大容量的挂载目录。
Dify 无法连接 Ollama1. Ollama服务未启动。
2..envOPENAI_API_BASE_URL配置错误。
3. Docker网络问题。
1.docker ps查看ollama容器是否运行。
2. 在Dify容器内执行curl http://host.docker.internal:11434/api/tags
3. 将host.docker.internal改为宿主机实际IP。
1. 重启Ollama容器:docker restart ollama
2. 修正.env文件,并docker-compose down && docker-compose up -d重启Dify。
知识库文件上传后一直“索引中”1. Embedding模型未正确连接或加载慢。
2. 文件格式解析失败。
3. 向量数据库写入异常。
1. 在知识库设置中测试Embedding模型连接。
2. 查看Dify Worker日志:docker-compose logs worker
3. 尝试上传一个简单的.txt文件测试。
1. 确保nomic-embed-text模型已通过Ollama拉取并运行。
2. 将复杂格式(如扫描PDF)转换为纯文本或可编辑PDF再上传。
3. 重启Dify服务。
问答时返回“未找到相关信息”1. 相似度阈值设置过高。
2. 文档分割不合理,导致检索不到。
3. 问题表述与文档内容差异过大。
1. 逐步调低相似度阈值测试。
2. 在知识库中查看文档的文本分割预览,检查关键信息是否被完整保留在某个片段中。
3. 尝试用文档中的原句提问。
1. 将阈值调整至0.6左右。
2. 调整分割长度和重叠长度,或手动优化文档结构。
3. 考虑在系统提示词中引导用户“根据文档内容提问”。
答案与文档内容无关(幻觉)1. 检索到的上下文不相关。
2. 模型温度参数过高。
3. 系统提示词约束力不够。
1. 检查回答的“引用”来源,看检索到的片段是否真的相关。
2. 检查模型高级参数。
1. 提高相似度阈值,或优化检索模式(尝试开启“多路召回”)。
2. 将温度调至0.1
3. 强化系统提示词,明确要求“严格依据引用内容回答”。
回答速度非常慢1. 模型在CPU上运行。
2. 同时检索的片段过多(Top K太大)。
3. 硬件资源(内存/CPU)不足。
1. 运行ollama ps(在容器内) 查看模型是否使用了GPU。
2. 检查应用中的Top K设置。
3. 使用htopnvidia-smi监控资源。
1. 确保已安装NVIDIA驱动和容器工具包,Ollama会自动使用GPU。
2. 将Top K减少到23
3. 考虑换用更小的模型(如llama3.2:3b)或升级硬件。

9. 生产环境最佳实践与安全建议

如果你计划将此方案用于团队或轻度生产环境,以下几点至关重要。

  1. 数据持久化与备份

    • 确保docker-compose.yaml.env中配置的卷映射(volumes)指向的是宿主机的持久化目录,而不是临时目录。
    • 定期备份~/ai-stack/ollama/models(模型文件)和Dify使用的数据库(PostgreSQL数据卷)。模型可以重新下载,但向量化的知识库数据需要从数据库备份。
  2. 安全加固

    • 修改默认密码:务必修改.env文件中的DB_PASSWORDREDIS_PASSWORD以及Dify初始化时的管理员密码。
    • 网络隔离:不要将Dify的80端口或Ollama的11434端口直接暴露在公网。应通过Nginx反向代理,并配置SSL证书(HTTPS)。
    • 访问控制:在Dify中合理设置团队成员的角色和权限,避免非授权人员修改核心应用或知识库。
  3. 性能监控与优化

    • 资源监控:使用docker stats监控各容器的CPU、内存占用。
    • 日志收集:配置Docker的日志驱动,或将日志输出到外部系统(如ELK),便于排查问题。
    • 模型选择:在效果和速度间权衡。对于实时性要求高的场景,可测试llama3.2:1b/3b等超小模型。对于质量要求高的场景,可考虑qwen2.5:14bllama3.1:8b(需要更大显存)。
  4. 知识库维护

    • 版本化管理:当文档更新时,建议创建新的知识库版本,而不是直接覆盖旧文件。这便于进行A/B测试和回滚。
    • 质量评估:定期用一组标准问题测试知识库应用,评估其回答的准确率和相关性,根据结果调整分割策略和检索参数。

通过以上步骤,你不仅完成了一个本地知识库的部署,更掌握了一套可扩展的私有化AI应用构建方法。这个由 Ollama 和 Dify 组成的栈,其优势在于清晰的边界和极低的接入成本。当你有新的需求时,可以在这个基础上继续探索:例如,用更强大的向量数据库(如Weaviate)替换Dify内置的;或者,利用Dify的工作流功能,串联多个模型调用和外部API,构建更复杂的自动化AI智能体。

🚀 30+款热门AI模型一站整合,DeepSeek/GLM/Qwen 随心用,限时 5 折。 👉 点击领海量免费额度