Ollama 里做一个私人知识库
当前位置:点晴教程→知识管理交流
→『 技术文档交流 』
在一台老旧的笔记本上安装Ubuntu系统,并部署了qwen2.5-coder:3b本地大模型。 按照原定计划,开始部署私人知识库。 要在 Ollama 里做一个私人知识库,最省事的方案是搭配一个叫 AnythingLLM 的网页界面工具,它可以把你的文档自动转换成模型能理解的“知识块”,然后把提问和检索到的知识一起发给 Ollama,让模型基于你的资料来回答。 先讲故事: 还记得上一集那句话吗?一切都可以问AI! 这次也不例外:让AI给我出保姆级教程,过程中出现的任何问题,都找AI解决。做就行了! 几天下来,有一搭没一搭的,总算做出来了。但跟我的预期还是有很大差距的,能出结果,说明整条链路全部跑通。主要是运行速度太慢了。一个简单的问题,足足跑了8分57秒。 AI还一个劲儿地安慰我: 这确实慢,但慢得合理,也慢得值得。 让我降低期待。你这台 2014 年的笔记本,能跑起本地大模型已经是很了不起的事了。把它当成一个“慢速实验平台”,而不是“日常生产力工具”,心态会好很多。 让我问完问题就去泡杯茶、干点别的,回来看结果。 这到这,把我逗笑了…… 所以,才有了下面这段对话: 我问AI: 换个思路吧,我现在有些疑问和想法。 第一,我现在搭建了一个可以独立运行的大模型服务器了,除了我尝试的RAG以外,还能做什么呢? 第二,如果我花大价钱买一台性能够用的电脑,能跑具备生产能力的大模型,那么这样的机器全天跑下来,电费是不是也是个不小的花销呢? 第三,如果我把买电脑+每天电费的钱,用来买token,调用大模型平台的API,是不是也够用并且更省心了呢? AI答: 你这三个问题,其实是在问一个很核心的决策:“既然我已经折腾出本地AI了,这钱到底该继续投硬件,还是该转头买API?”(捕捉得很精准) 本地服务器除了RAG,还能做什么? 你现在的RAG只是本地部署的“入门玩法”。如果你有了性能足够的本地服务器,可以做的事情会多很多,而且都围绕着一个核心优势:数据不出本地,完全私有。
全天跑的电费,是不是一笔大开销? 电费是可以算清楚的。 比如:一张RTX 3090的满载功耗大约是 350W。假设它每天有一半时间在满载跑推理(这已经是很高的利用率了),另外一半时间待机或低负载,再加上整机其他部件的功耗。 每天耗电:假设平均功耗按200W算(其实整机加上CPU、主板等,平均可能在250W-300W左右),每天耗电约 4.8 - 7.2 度。 每月电费:按家用电价约 0.55元/度 计算,每月电费大概在 80元 到 120元 之间。 如果只是偶尔跑一下,电费会更低。所以电费本身,对于个人使用来说,并不是一个特别沉重的负担。 买电脑的钱 vs. 买API的Token,哪个更划算? 这才是核心问题。本地部署和API调用,是两种完全不同的“省钱”逻辑。 本地部署(你的Y50-70或未来新机) 前期投入高:买硬件(显卡+整机)是一次性的大支出。一套能流畅跑30B级别模型的配置,可能就要 8000-15000元。 后期成本低:一旦买好,后续只有电费和很少的维护成本。你用得越多,平摊到每次调用的成本就越低。 适合谁:高频、长期使用,或者对数据隐私有要求的场景。如果你的使用量非常大,本地部署的长期成本会远低于API。 API调用(通用大模型平台) 前期零投入:注册就能用,不用买硬件。 后期按量付费:用多少花多少。现在国产大模型价格竞争很激烈,经济型模型的成本极低。比如有的模型输入价格降到了 0.02元/百万tokens,输出也只要 2元/百万tokens。 适合谁:低频、小规模使用,或者想做快速实验、原型验证的场景。 一个更聪明的思路:混合路线 其实你没必要二选一。很多团队最终的选择是混合部署。 高频、隐私敏感的活:留在本地跑。比如你日常的代码辅助、私密文档的RAG。 低频、需要强模型能力的活:用API。比如你想试试最新的旗舰模型,或者处理一次性的复杂任务,按量付费更灵活。 所以,你的Y50-70该怎么办? 你的Y50-70服务器,已经帮你跑通了所有流程,证明了“这条路能走通”。它现在的任务,是让你低成本地体验和实验。 如果你只是偶尔玩玩,或者想用用当前最强的模型,那么现在充几十块钱的API,够你用很久了,完全没必要急着花大几千买显卡。 但如果你发现,你确实有高频、长期的需求,并且很在意数据隐私,那么未来配一台带 24GB显存显卡的机器,就是一笔值得的投资。它带来的“秒级响应”和“完全掌控”,是API给不了的。 建议很中肯,我表示接受。 后面继续第三项: 用DevEco Studio提供的自动生成代码功能,开发 HarmonyOS 应用。 敬请期待…… (反正我挺期待的) ======== 搭建之前,先理清几个概念 ======== RAG RAG(Retrieval-Augmented Generation,检索增强生成) 是一种将信息检索与大语言模型生成结合的技术架构。它的核心思路是:在让大模型回答问题之前,先从外部知识库中检索出相关内容,再把这些内容作为上下文喂给模型,让模型基于这些真实资料来生成回答。 大语言模型有几个固有局限:
RAG 通过“外挂知识库”的方式,绕开了这些问题——知识可以随时更新,回答有据可查,且不需要重新训练模型。 典型应用场景
AnythingLLM 是实现这个概念的现成工具。它自带对话界面。负责管理文档、切块、建索引、检索,然后把检索结果和你的问题拼在一起,发给 Ollama 去生成答案。 根据官方技术文档和实际使用情况,它主要支持以下几类: 文档类:PDF、Word(.docx/.doc)、Markdown(.md)、纯文本(.txt) 表格/数据类:Excel(.xlsx/.xls)、CSV、JSON 演示文稿:PPT(.pptx) 电子书:EPUB 音频:MP3、WAV(会通过语音识别转录成文字) 图片:PNG、JPG(会通过 OCR 识别图片里的文字) 邮件归档:MBOX 关于 HTML,你不需要单独下载成一个文件。AnythingLLM 支持直接在输入框里粘贴网页链接,它会自动抓取该页面的正文内容并转换成文本,然后加入知识库。比如你想把某个技术文档网页加进去,直接贴 URL 就行,比下载 HTML 文件再上传更省事。 坑1:根据我后面的尝试,不支持老版的.doc文件。我的很多资料都是早些年(年轻的我……)收集和整理的,word版本比较老。需要一个个转成.docx文件才能用。 据说网上有批量转换的工具,我还没找到。 ======== 搭建之前,准备几个新模型 ======== 为什么要换大模型? 做 RAG 的话,Qwen2.5-Coder不太适合直接拿来用。它们本身不是为 RAG 场景设计的,用在你的机器上效果可能不理想。 RAG 的工作流程其实分两步:先检索(从你的文档里找到相关内容),再生成(把找到的内容和问题一起交给模型来回答)。 Qwen2.5-Coder:3b 侧重于代码生成与补全,它的训练数据偏向编程 结合你的硬件限制,建议把“检索”和“生成”分开来选模型: 1. 用于检索的嵌入模型(必须装) 这是 RAG 的基础,负责把文档变成可检索的向量。 推荐:nomic-embed-text。 这是 Ollama 生态里最常用的轻量嵌入模型,速度快,占用资源少,很多 RAG 工具(如 AnythingLLM)默认就支持它。 中文优化备选:shaw/dmeta-embedding-zh。 如果你主要处理中文文档,这个 400M 大小的中文嵌入模型在语义检索上表现不错,非常轻量。 2. 用于回答的聊天模型(选一个) 检索到资料后,交给一个擅长“阅读理解并总结”的模型来生成答案。 优先推荐:qwen2.5:3b 。 Qwen2.5:3b 属于通用大模型,侧重于逻辑推理。这些通用对话模型比代码专用模型更适合总结文档内容。 3. 工具方面还是用 AnythingLLM 它可以把“嵌入模型”和“聊天模型”分开配置。你只需要在设置里: 把 Embedding 模型 设为 nomic-embed-text。 把 Chat 模型 设为你选定的对话模型(比如 qwen2.5:3b)。 这样,AnythingLLM 会自动用嵌入模型来检索你的文档,再把检索结果交给聊天模型来生成答案,各司其职,效率最高。 坑2:还是之前的问题,我目前使用的网络环境是一个4G的移动WIFI(考虑经常移动办公)。日常办公、看个电影或短视频完全够用。但是在下载这种大文件的大模型安装包就会经常崩溃。就这困扰了我好几天,最后借用一个宽带WIFI环境,才算顺利安装完成。所以,有个稳定且带宽够大的网络环境是必须的,建议用网线,会更稳定一些。 附:Ubuntu切换WIFI连接 1. 找到你的无线网卡名称 执行:ls /sys/class/net,找到以 w 开头的名字,比如 wlan0、wlp8s0 或 wlo1。 2. 编辑 Netplan 配置文件 文件通常在 /etc/netplan/ 目录下,文件名可能是 50-cloud-init.yaml 或 00-installer-config.yaml: sudo nano /etc/netplan/50-cloud-init.yaml 3. 修改 Wi-Fi 配置 network: version: 2 renderer: networkd wifis: wlp8s0: # 这里换成你的无线网卡名称 dhcp4: true optional: true access-points: "你的新Wi-Fi名字": password: "你的新Wi-Fi密码" 注意:Wi-Fi 名字和密码如果包含特殊字符(比如 @、#、- 等),建议用英文双引号括起来,比如 "My-WiFi"。你现在的名字和密码没有特殊字符,可以不加引号。 4. 应用配置 保存退出(Ctrl+O 回车,Ctrl+X),然后执行: sudo netplan try 它会先测试配置,30 秒内没断线就会自动生效;如果配置有错也会自动回滚,比较安全。确认没问题后按回车,或者直接,再执行: sudo netplan apply 如果 netplan apply 后 ip addr 里 wlp8s0 没有拿到新 IP,可以尝试重启服务器: sudo reboot ======== 正式开始 ======== 第一步:确保 Ollama 正在运行 AnythingLLM 需要连接本地的 Ollama 服务,先确认它在后台运行: systemctl status ollama 看到 active (running) 就说明正常。如果没在跑,执行 sudo systemctl start ollama 启动。 第二步:下载三个模型 在终端里依次执行,让 Ollama 拉取所需的模型: ollama pull qwen2.5:3b ollama pull nomic-embed-text ollama pull shaw/dmeta-embedding-zh 第三步:安装 Docker 并运行 AnythingLLM 你的服务器上可能还没装 Docker,先装: sudo apt update sudo apt install docker.io -y sudo systemctl start docker sudo systemctl enable docker 确认 Docker 可用: sudo docker --version 然后运行 AnythingLLM 容器。这一步会自动下载镜像并启动服务: 用wj用户执行: export STORAGE_LOCATION=/home/wj/anythingllm mkdir -p $STORAGE_LOCATION touch "$STORAGE_LOCATION/.env" sudo docker run -d -p 3001:3001 \ --cap-add SYS_ADMIN \ -v /home/wj/anythingllm:/app/server/storage \ -v /home/wj/anythingllm/.env:/app/server/.env \ -e STORAGE_DIR="/app/server/storage" \ mintplexlabs/anythingllm:latest --cap-add SYS_ADMIN 是必须的,它让 AnythingLLM 能够抓取网页内容。数据会保存在 ~/anythingllm 目录下,重启容器也不会丢失。 坑3:因为我嫌每次执行命令加sudo,都需要输入一遍密码太麻烦,我会先切换到root用户下。但是这里有个问题:需要先在/home/wj(我的登录用户路径)下面,用wj用户创建anythingllm目录,供anythingllm使用。 第四步:配置 AnythingLLM 在主力电脑的浏览器里访问: http://<服务器IP>:3001 比如我的服务器 IP 是 192.168.1.5,就访问 http://192.168.1.5:3001
进入后按下面配置: LLM Provider(对话模型):选择 Ollama,Model 选 qwen2.5:3b
Vector Database:保持默认的 LanceDB 即可 配置时注意 AnythingLLM 和 Ollama 在同一台机器上,Ollama 地址填 http://localhost:11434 就行。 Embedding Engine(嵌入模型):选择 Ollama,Model 选 shaw/dmeta-embedding-zh(如果你主要处理中文文档)或 nomic-embed-text
注:之前下载的两个模型shaw/dmeta-embedding-zh和nomic-embed-text的作用完全一样,都是“嵌入模型(Embedding Model)”。在这个界面里,它们俩是二选一的关系,你只需要选一个就行。 shaw/dmeta-embedding-zh:中文翻译官。它专门为中文优化,能把中文文档翻译得更准,找资料找得更精准。你选它是对的。 nomic-embed-text:英文翻译官。它在英文文档上表现很好,对中文的支持不如上面那个。 第五步:创建知识库并上传文档 在 AnythingLLM 界面里: 点击左侧创建一个 Workspace 点击上传按钮,把你想“喂”给 AI 的文档拖进去 上传后点击 Move to Workspace 再点 Save and Embed 等进度条走完,系统就完成了文档的向量化处理 之后在对话时,AnythingLLM 会自动从你上传的文档里检索相关内容,再交给 qwen2.5:3b 来生成答案。 坑4:直接在对话框里上传文件只是挂在对话框上作为临时上下文(Added as context!),并没有真正进入知识库。出了当前的对话区,就失效了。
要想长期有效,需要点击左侧工作区名称旁边的 “上传图标”。在弹出的窗口里,把文件放到“我的工作区”里,并且选中,并且点击每个文件右边的“图钉”按钮(一般会出现上传文件的进度条)。才算完成。
终于了终于,可以开始跟他对话了,你问的问题,他也会在你的“知识库”里找答案了:
阅读原文:原文链接 该文章在 2026/11/6 10:27:13 编辑过 |
关键字查询
相关文章
正在查询... |