尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

树莓派上跑通离线LLM问答:小模型+量化+RAG全攻略

树莓派上跑通离线LLM问答:小模型+量化+RAG全攻略 先把结论放在最前面树莓派做LLM本地部署不是拿什么60B大模型硬塞而是把“小模型量化自定义知识库”这三件事正确搭起来。我在一块树莓派58GB版上跑通了一套完全离线的智能问答助手浏览器打开就能问断网照常工作知识库内容全在自己资料库里数据不出局域网。整个过程花了两个晚上踩了四个不算浅的坑。这篇文章不聊概念把我当时怎么选型、怎么部署、怎么调优以及哪些地方容易翻车全部分享出来。想自己动手的照着做就行。我为什么非得在树莓派上做这件事之前做设备维护运维记录散落在各种Markdown文档、Excel表格和聊天记录里每次查一个参数都要翻半天。云端的问答API确实方便但内部资料不方便送出去有些内容根本不允许离开本地网络。于是就想在办公室角落放一台小机器让它能“翻资料、答问题”数据完全留在本地。试了一圈方案之后最后留在生产环境的组合是Ollama跑量化小模型、Chroma做向量检索、FastAPI做后端、一个不到一百行的纯HTML页面做前端。下面按步骤拆开讲。1. 为什么敢在树莓派上跑LLM先算清楚性能这笔账1.1 树莓派硬件的真实算力水平经常有人看到“树莓派跑大模型”就摇头觉得这板子性能太弱。我先把两代主流板子的硬参数拿出来再往下算账就清楚多了。项目树莓派4B8GB树莓派58GBSoCBCM2711 四核 Cortex-A72BCM2712 四核 Cortex-A76CPU主频1.8GHz2.4GHz内存类型LPDDR4-3200LPDDR4X-4266实测内存带宽约3.2GB/s约4.3GB/s理论FP32算力约13 GFLOPS约30 GFLOPS对比一台带独立显卡的PC显存带宽动辄200GB/s以上算力差距是两三个数量级。所以结论很直接树莓派不适合拼算力峰值。但LLM在CPU上的推理瓶颈从来不是算力而是内存带宽。只要模型能在内存里装下CPU也能逐字把答案“挤”出来只是速度慢。1.2 为什么CPU也能跑LLM量化与带宽瓶颈要理解这个问题先看一个关键公式生成一个token大概就要把模型权重完整读一遍。所以token生成速度的下限近似等于“模型体积 ÷ 内存带宽”。拿7B模型举例FP16精度大约是14GB在树莓派4B的3.2GB/s带宽下读一遍要4秒多也就是每秒只能出0.2个token回答50个字要等将近两分钟基本不可用。但量化到4bit之后同样7B模型压缩到4.7GB左右读一遍缩短到1.5秒上下能达到接近1 token/s的水平只能说勉强能等。换一条更务实的路选3B参数的小模型4bit量化后约2GB树莓派5读一遍约0.5秒实际跑起来能到3到6 token/s。这个速度对于“知识库问答”这种场景已经够用了用户看前几个字的时候后面还在继续生成体感不会太差。这就是整篇文章的底层逻辑用“更小的模型 量化 外部知识库”去替代“更大模型的记忆”把性能需求压到树莓派能扛住的范围里。不必纠结为什么不上7B、13B先把1.5B或3B的链路跑通价值已经很大。1.3 这套方案适合什么场景我在工作室里主要拿它做三件事查设备参数比如某型号电源规格、翻运维排障笔记、汇总历史项目记录。这些问题的特点是答案基本固定藏在具体文档里不需要模型有特别强的推理能力只需要它能把相关资料找出来并组织成通顺的话。这套组合也适合家庭场景比如把自己收藏的菜谱、说明书、读书笔记做成知识库适合独立开发者在展会上跑演示Demo不依赖现场网络也适合教学环境让学生直观看到本地模型、向量检索、RAG这些概念的真实运转。不适合的场景也很明显长时间多轮对话上下文会越拖越长内存扛不住、复杂逻辑推理小模型确实力不从心、高并发多用户内存带宽就那么大并发等于互相抢资源。明确这些边界后面调优就不会走弯路。2. 起步配置从烧录系统到散热、电源与存储选型2.1 系统镜像选择与初始化我推荐用 Raspberry Pi OS Lite 64位版也就是不带桌面的精简系统。跑模型占用CPU和内存本来就高桌面环境、文件管理器、声音服务这些东西一点用都没有纯属浪费。Lite版开机后空载内存在200MB以内桌面版动不动爬到500MB对8GB板子来说虽然不算致命但能省则省。烧录时用官方Raspberry Pi Imager就行注意在烧录前就把下面几项配好主机名设为rpi-llm方便局域网内直接用主机名访问。开启SSH并填入公钥避免用密码登录。设置固定IP或者后续在路由器上做DHCP静态绑定保证问答服务地址不飘。系统用户名我习惯用pi如果你改成别的后面所有路径记得同步调整。系统起来后先做基础更新sudo apt update sudo apt upgrade -y sudo apt install -y vim git curl wget htop tmux然后配一下国内镜像源。树莓派默认源在英国国内访问时快时慢换成清华或阿里的软件源后apt安装效率完全不一样。注意改完源要sudo apt update一次才能生效。2.2 散热与电源是稳定运行的前提树莓派跑LLM时CPU会持续满载这和平时跑个小脚本完全不是一回事。模型加载阶段CPU要把几个GB的模型文件解压、映射、初始化占用率经常一条直线顶满生成阶段每个token都要做大量矩阵运算四个核基本没有闲着的时候。这种持续负载下裸板跑一会儿就会触发热降频。我用树莓派4B试过不加散热直接跑3B模型die温度可以冲到85度以上主频从1.8GHz掉到1.2GHztoken速度直接腰斩。所以散热不是锦上添花是刚需。树上派5建议用官方主动冷却器一个小风扇加散热片装上之后温度能压在60度左右。4B则推荐带风扇的铝合金外壳散热效果和性价比都合适。另一个容易忽略的是电源。树莓派5建议用官方27W USB-C PD电源4B用5V/3A。供电不足的典型表现是屏幕角落出现红色闪电图标或者系统在负载高的时候莫名其妙重启。排查历史上有没有欠压降频可以跑一条命令vcgencmd get_throttled输出中如果出现非零值说明曾经发生过欠压或温度降频。这个命令在调优阶段非常有用。2.3 存储TF卡能跑但SSD更稳模型加载本质是顺序读取大文件TF卡随机读写能力虽然弱但顺序读速度一般也有几十MB/s对启动影响不大。问题出在长期运行Ollama的日志、Chroma的向量索引、系统的journal日志都要频繁写入TF卡时间长了TF卡容易提前报废。我后来直接把系统装到一块SSD上用USB3.0硬盘盒接在树莓派5上从TF卡切换到SSD启动模型的加载速度、服务稳定性都有提升。如果你手头只有TF卡至少可以把日志放到内存里减少写入sudo nano /etc/systemd/journald.conf # 找到 Storageauto 改成 Storagevolatile sudo systemctl restart systemd-journald远程管理方面我习惯用tmux挂长任务。SSH登录后在tmux里启动服务关掉终端也不会断回来还能看到完整输出。这个习惯在调试Ollama时特别省心。3. 模型运行时选型Ollama还是llama.cpp模型梯队怎么挑3.1 为什么直接用Ollama而不是手动编译llama.cppllama.cpp是底层推理引擎Ollama本质上是对它的一层友好封装。两者在树莓派上的差别主要在于Ollama把几件麻烦事全包了GGUF模型管理、量化等级选择、内存分配策略、OpenAI兼容API、systemd服务集成。手动编译llama.cpp当然更灵活可以针对AArch64的NEON指令集做优化但代价是你得自己处理模型下载、量化格式、server端参数、上下文长度、并发策略……对只想把问答跑起来的人来说学习成本太高。Ollama在ARM64上有官方安装包一条命令就能装好curl -fsSL https://ollama.com/install.sh | sh装完验证一下systemctl status ollama ollama --version如果官方安装脚本在你网络环境下下载很慢也可以去GitHub Releases里手动下载对应的ARM64安装包。注意别用第三方来源的二进制跑模型这种东西环境不干净出了问题非常难排查。3.2 模型梯队在1.5B到8B之间选一个合适的树莓派上选模型我的原则是“先看内存预算再看任务复杂度”。下面是我实测过的梯队模型量化后体积8GB板子上内存占用生成速度参考适合场景Qwen2.5-1.5B-Instruct约1.1GB1.5GB-1.8GB8-15 token/s简单问答、快速原型Qwen2.5-3B-Instruct约2.0GB2.2GB-2.7GB3-6 token/s知识库问答主力选择Llama-3.2-3B-Instruct约2.0GB2.2GB-2.7GB3-5 token/s英文内容为主DeepSeek-R1-Distill-Qwen-7B约4.7GB5.2GB以上0.5-1.5 token/s体验模型不推荐长期用中文场景下Qwen系列明显比其他开源模型稳回答质量、指令遵循能力、中文语感都在线。我的最终选择是qwen2.5:3b因为它体积和内存占用在8GB板子上留出了足够余量回答质量又比1.5B高一个台阶。拉取模型命令ollama pull qwen2.5:1.5b ollama pull qwen2.5:3b如果你只是先验证链路直接上1.5B跑通之后再切3B顺序很重要。3.3 量化、上下文长度与线程配置Ollama默认拉取的tag通常已经选了比较合理的量化等级q4_K_M这类4bit量化在日常使用中质量损失很小但体积能比FP16缩小约4倍。不建议在树莓派上手动追求q8_0体积大了内存占用上去了回答质量的提升却感觉不到。上下文长度是需要手工调的参数。默认值一般是2048或4096知识库问答场景下4096完全够用。不要盲目拉到16384或更高KV Cache会吃掉几百MB甚至更多内存小内存板子很容易OOM。在Ollama服务配置里可以这样限定sudo systemctl edit ollama写入[Service] EnvironmentOLLAMA_HOST0.0.0.0 EnvironmentOLLAMA_KEEP_ALIVE30mOLLAMA_HOST0.0.0.0让服务监听所有网卡局域网内其他设备才能访问API。OLLAMA_KEEP_ALIVE30m让模型加载后常驻30分钟不会每次请求都重新加载一遍这对树莓派这种慢设备太关键了。线程数方面树莓派5四个大核我实测OMP_NUM_THREADS4比默认值更快偶尔降到2也能减少调度开销。这个参数跟具体模型和系统负载有关建议自己跑一遍对比没有绝对标准。可以临时这样测试OMP_NUM_THREADS4 ollama run qwen2.5:3b4. 知识库的关键链文档切分、Embedding与向量检索4.1 为什么要用RAG而不是微调模型小模型的参数知识有截止日期你私有的运维记录、产品手册、项目文档它完全不知道。理论上可以靠微调让模型记住这些内容但对树莓派这种设备不现实微调需要大量计算资源每次知识更新都要重新训练还有风险让小模型“灾难性遗忘”原有能力。RAG检索增强生成是更聪明的做法。它把知识库文档切块、向量化、存进向量库用户提问时先从向量库里找出最相关的几个片段和问题一起拼成Prompt交给模型生成答案。打个比方模型像个新来的实习生脑子里没多少现成经验但手边有一个随时能翻的资料架每次回答前先翻资料再说话准确率高得多。4.2 框架选型别急着上Dify和全家桶搜方案时你一定见过Dify、LangChain、LlamaIndex这些名字。我在树莓派上评估过它们各自的适用性。Dify很强大图形化编排、自带知识库、模型管理、对话界面都有但它的标配是Docker全家桶几个容器同时占内存在8GB板子上还要再跑一个模型很快就吃紧。我建议Dify留给16GB内存以上的NUC或小主机树莓派别凑这个热闹。LangChain和LlamaIndex是开发框架功能齐全但版本迭代快API经常变在树莓派上调试起来很费劲而且很多功能场景根本用不上。最后我选择自己写一个轻量RAG链路核心代码只有几十行。这不是“重新造轮子”而是因为树莓派上的应用链确实简单到不需要框架。核心链路就五步读取文档、切分、向量化、存入向量库、检索拼Prompt。剩下的都是可以手写的小逻辑。4.3 Embedding模型选择轻量、离线、中文友好Embedding模型负责把文本变成向量选得好不好直接影响检索质量。中文知识库场景我强烈建议优先考虑中文优化过的模型。方案体积内存占用中文效果建议BAAI/bge-small-zh-v1.5约100MB约500MB好推荐轻量且效果好BAAI/bge-m3约2.2GB约2.5GB以上很好太重适合大内存设备all-minilm:l6-v2约22MB很小一般英文场景够用Ollama官方库里有bge-m3可以一行拉取但2.2GB的体积在树莓派上太奢侈。我更推荐用Python的sentence-transformers跑BAAI/bge-small-zh-v1.5单独起一个小服务提供Embedding接口。这样做的好处是内存占用低、中文效果好、不挤占LLM的内存预算。安装命令pip install sentence-transformers模型加载和向量生成的核心代码非常简单from sentence_transformers import SentenceTransformer model SentenceTransformer(BAAI/bge-small-zh-v1.5) vec model.encode(树莓派5的电源规格是多少) print(vec.shape) # (768,)第一次加载模型需要联网下载权重如果下载慢可以用国内的Hugging Face镜像站或者在一台网络好的机器上下好之后拷贝到树莓派的缓存目录。项目上线之后这个Embedding进程可以常驻内存避免每次提问都重新加载一次模型。4.4 文档切分决定RAG成败的细节向量检索的效果好坏一半取决于Embedding模型另一半取决于文档切分策略。切分这件事看起来不就是“把长文本切成小块”吗但真做起来一堆细节。我踩过的坑是最初按512字符硬切遇到列表和代码块时经常从中间切开检索时拿到的是语义不完整的碎片模型回答自然不靠谱。后来改成“结构优先”的策略按段落、标题、列表项等结构先做一级拆分。对超长段落再做二次切割每块控制在512个token左右。相邻块之间保留50个token的重叠防止关键信息正好被切在边界上。中文场景下我会额外处理一下标点。不要按字符数生切优先按句号、问号、换行符断句这样每个chunk内部语义相对完整。如果文档是Markdown或HTML先把标题标记提取出来作为切分的锚点。一个相对完整的切分逻辑大致长这样def split_document(text, chunk_size512, overlap50): paragraphs re.split(r\n\s*\n, text) chunks [] for para in paragraphs: if len(para) chunk_size: chunks.append(para) else: start 0 while start len(para): end start chunk_size chunks.append(para[start:end]) start end - overlap return chunks实际项目里我还会把标题拼进chunk的前缀比如“3.2 电源规格”作为这段内容的上下文提示检索命中时Prompt里能看到标题模型更容易理解这是在讲什么。4.5 向量入库与检索拼装Chroma是轻量向量数据库支持持久化到本地目录不需要单独起服务非常适合树莓派。安装后写一个简单的入库脚本import chromadb client chromadb.PersistentClient(path./chroma_data) collection client.get_or_create_collection(docs) # docs 是 [{id, text, metadata}] 的列表 for item in docs: vec model.encode(item[text]).tolist() collection.add( ids[item[id]], embeddings[vec], documents[item[text]], metadatas[item[metadata]] )检索阶段更是简洁把用户问题编码成向量查最相近的4个chunk把这4段文本拼进Prompt里。results collection.query( query_embeddings[model.encode(question).tolist()], n_results4 ) top_chunks results[documents][0]拼接Prompt时我会用一个固定的模板让模型明确“只能依据资料回答资料里没有就直说不知道”这样能有效压制幻觉你是一个离线知识库问答助手。请只根据下面提供的资料回答用户问题。 如果资料中没有相关信息请直接回答“知识库中未找到相关内容”不要编造。 资料 {context} 问题 {question}这个模板看似简单实际作用非常大。它先给模型设定角色和边界再把资料原文放进去最后才给问题模型就不太会偏出去胡编。5. 把问答助手真正跑起来API对接与前端交互5.1 整体服务架构整个系统在树莓派上常驻三个进程Ollama服务监听11434端口负责跑LLM。Embedding进程监听一个本地端口负责把文本转向量我这里是直接和Python后端合在一起。FastAPI后端监听8000端口负责检索知识库、拼Prompt、调用Ollama的API、把答案返回给前端。用户端只需要一个浏览器在局域网内访问http://树莓派IP:8000就能进入问答页面。手机、平板、电脑都能用不需要安装任何App也不依赖外网。5.2 后端接口设计后端我只暴露了一个/ask接口请求体就是{question: 你的问题}响应体包含答案和来源片段。这样设计的好处是前端可以非常薄以后想换页面主题或者接入其他客户端都只要调这一个接口。核心代码骨架如下from fastapi import FastAPI, HTTPException from pydantic import BaseModel import requests from sentence_transformers import SentenceTransformer import chromadb app FastAPI() encoder SentenceTransformer(BAAI/bge-small-zh-v1.5) collection chromadb.PersistentClient(path./chroma_data).get_collection(docs) OLLAMA_URL http://localhost:11434/api/chat class AskRequest(BaseModel): question: str class AskResponse(BaseModel): answer: str sources: list[str] app.post(/ask, response_modelAskResponse) def ask(req: AskRequest): # 第一步编码问题 q_vec encoder.encode(req.question).tolist() # 第二步检索知识库 results collection.query( query_embeddings[q_vec], n_results4 ) contexts results[documents][0] context_text \n\n.join(contexts) prompt f你是一个离线知识库问答助手。请只根据下面提供的资料回答用户问题。 如果资料中没有相关信息请直接回答“知识库中未找到相关内容”不要编造。 资料 {context_text} 问题 {req.question} # 第三步调用 Ollama 生成回答 payload { model: qwen2.5:3b, messages: [{role: user, content: prompt}], stream: False, options: {temperature: 0.3} } resp requests.post(OLLAMA_URL, jsonpayload, timeout120) resp.raise_for_status() answer resp.json()[message][content] return AskResponse(answeranswer, sourcescontexts)注意 temperature 我设成了0.3知识库问答场景追求准确稳定温度越高越容易发散。5.3 前端一个够用的纯HTML页面前端我刻意做得非常简单一个输入框一个对话展示区一个发送按钮。不引任何前端框架原生HTML加少量JavaScript就够了。这样树莓派完全不需要承担Node、webpack这些重依赖页面加载速度飞快。!DOCTYPE html html langzh head meta charsetUTF-8 title离线智能问答/title style body { max-width: 700px; margin: 40px auto; padding: 0 20px; } #chat { min-height: 400px; border: 1px solid #ccc; padding: 12px; } .msg { margin: 8px 0; } .user { text-align: right; color: #1a73e8; } .bot { text-align: left; color: #333; } .sources { font-size: 12px; color: #999; } /style /head body h2本地知识库问答/h2 div idchat/div input idq typetext placeholder请输入问题 stylewidth: 70%; / button onclickask()发送/button script async function ask() { const q document.getElementById(q).value; if (!q) return; const chat document.getElementById(chat); chat.innerHTML div classmsg user q /div; document.getElementById(q).value ; const r await fetch(/ask, { method: POST, headers: {Content-Type: application/json}, body: JSON.stringify({question: q}) }); const data await r.json(); chat.innerHTML div classmsg bot data.answer /div; if (data.sources data.sources.length) { chat.innerHTML div classsources来源片段 data.sources.length 段/div; } chat.scrollTop chat.scrollHeight; } /script /body /html这个小页面虽然没有流式打字效果但对“先跑通再优化”来说已经足够。实际体验时如果模型生成要好几秒可以在发送后先显示一个“正在检索资料并生成回答…”的占位避免用户重复点击。5.4 用systemd把服务做成开机自启树莓派很多时候是无人值守的断电重启后最好服务能自己起来。Ollama自带systemd服务我们要做的只是把Embedding和后端也交给systemd管理。在/etc/systemd/system/rag-backend.service里写[Unit] DescriptionRAG Knowledge Base Backend Afternetwork.target ollama.service [Service] Typesimple Userpi WorkingDirectory/home/pi/rag_backend ExecStart/usr/bin/python3 /home/pi/rag_backend/main.py EnvironmentOLLAMA_HOST127.0.0.1 Restarton-failure RestartSec5 [Install] WantedBymulti-user.target然后启用sudo systemctl daemon-reload sudo systemctl enable --now rag-backend查看日志用journalctl -u rag-backend -f排查问题比在终端里瞎猜直观太多。6. 实测表现与调优速度、内存与并发上限6.1 我实测的数据以下数据来自树莓派58GB版 官方主动冷却器 Qwen2.5-3B-Instruct 4bit量化室温约25度。环境不同数据会有浮动但量级有参考价值。指标Qwen2.5-1.5BQwen2.5-3B首token延迟3-5秒6-10秒后续生成速度8-15 token/s3-6 token/sOllama常驻内存约1.5GB约2.3GB后端Embedding内存约700MB约700MB知识库索引5000个chunk约400MB约400MB整体内存占用维持在3.5GB到4GB左右8GB版树莓派还有一半余量Chroma的索引就算继续膨胀也能扛住。树莓派4B我也试过主频和内存带宽相对低一些速度大约只有5代的60%-75%跑Qwen2.5-1.5B依然可用跑3B就明显着急了。如果你手里是4B建议主力模型用1.5B。6.2 几个有效的调优手段第一调整线程数。树莓派跑OllamaOMP_NUM_THREADS不是越大越好。我分别在4个线程和默认配置下测过4线程往往比默认更快因为减少了线程切换和调度开销。在systemd override里加一行EnvironmentOMP_NUM_THREADS4第二让模型常驻内存。OLLAMA_KEEP_ALIVE30m加成后第一次请求之后模型不会立刻卸载后续每次问答都能省掉几秒的加载时间。第三开启zram压缩交换。树莓派在极端场景下内存会吃紧用TF卡做swap是灾难但可以用zram把一部分内存做压缩交换。安装方式sudo apt install -y zram-tools然后编辑/etc/default/zramswap设置一个适合自己的压缩空间比如4096MB。这样在内存紧张时系统能挤出一点缓冲空间而不是直接OOM。第四关闭无用服务比如蓝牙、WiFi如果不需要就禁用桌面环境彻底不装。这些零碎的内存和CPU占用叠加起来对树莓派的影响比想象中大。6.3 并发上限诚实回答树莓派跑这种问答服务并发能力就是“一次一个人最多排队”。我测过同时发两个请求模型生成速度会被拖到2 token/s左右两边都体验崩塌。所以后端一定要加队列锁保证同一时间只处理一个请求让后来的请求排队而不是抢内存资源。在后端加一个asyncio.Lock是最简单的方案import asyncio lock asyncio.Lock() app.post(/ask) async def ask(req: AskRequest): async with lock: # 原有逻辑 ...这样对于局域网内三五个人轮流提问的场景完全够用如果有人连着猛戳最多就是排队等待不会把进程搞崩。7. 踩坑实录几个典型问题与排查思路7.1 Ollama拉模型总是中断模型损坏症状是ollama pull下载到一半卡住或者下载完成后ollama run报错提示模型文件不完整。第一次遇到时我反复重试了好几次后来发现与其靠运气不如换一条更可控的路。排查链路是先看磁盘空间df -h确认/usr/share/ollama所在分区有足够空间再用ollama rm qwen2.5:3b把损坏的模型删掉最后重新ollama pull。如果网络不稳定导致反复中断我就直接从Hugging Face镜像站手动下载GGUF文件通过Modelfile导入# 先下载 qwen2.5-3b-instruct-q4_K_M.gguf 到本地 # 写一个 Modelfile FROM ./qwen2.5-3b-instruct-q4_K_M.gguf然后ollama create qwen2.5-3b -f Modelfile这种方式可以用支持断点续传的下载工具把模型文件先下载完整再导入Ollama比在大文件传输中反复试错省心得多。7.2 模型加载到一半被OOM Kill症状是进程直接消失或者系统日志里出现oom-kill。我在树莓派4B上硬跑7B模型时踩过这个坑。排查链路用两条命令free -h dmesg | tail -30dmesg能看到内核杀进程的记录确定是不是内存不足。解决方案按优先级排列换更小的模型、缩减上下文长度、关闭桌面和后台服务、启用zram。如果这些还不够那就老实升级到8GB版本再跑3B模型别跟内存过不去。我后来发现一个隐蔽的内存杀手Chroma在批量入库几千个文档时如果一次性把所有向量都放进内存再写盘内存瞬间暴涨。正确做法是分批写入比如每500条commit一次。7.3 Web界面打不开或白屏第一次我图省事直接用了Open WebUI的Docker镜像结果在树莓派上页面要加载一两分钟还经常白屏。后来意识到树莓派上跑这类重前端完全是浪费资源很多WebUI依赖Node构建ram占用轻松超过1GB。换成纯静态页面后问题彻底消失。经验就一条在树莓派上部署任何服务都先问一句“能不能用更轻的东西替代”。80%的“卡在网页上”问题都是因为服务本身起步太重。7.4 回答质量翻车答非所问和幻觉有一次我问“固件升级的具体步骤”模型答得头头是道但引用来源里全是物流条款。排查时我把sources打印出来才发现检索到的chunk和问题完全不相关。问题出在检索策略太粗糙中文分词不准确、查询向量和文档向量之间的相关性阈值没设导致最相近的几个chunk其实都很偏。优化手段是组合拳改进切分策略让chunk内部语义更集中调低相似度阈值不够相关的片段直接过滤检索时对问题做一次简单关键词预处理比如把“固件升级步骤”拆成“固件”“升级”“步骤”三个关键词辅助召回。另外Prompt里明确要求“只依据资料回答”模型胡编的倾向也会明显下降。模型幻觉问题说到底不是单点问题而是切分、检索、Prompt、temperature这几件事共同作用的结果。我最终的稳定配置是chunk_size512、overlap50、top_k4、temperature0.3、Prompt强制限定边界这套组合在绝大多数文档场景下都能给出可信答案。最后再分享一点实际操作中的体会树莓派跑LLM这件事没必要跟跑分较劲。我一开始也想上7B结果体验一塌糊涂换成3B之后每天稳定运行问什么都答得上来。如果你也想搭一套我的建议是——先拿1.5B把整个链路跑通再切3B体验质量提升最后再加知识库。这个顺序能帮你省下一整晚的调试时间也会让你对这套系统的理解深得多。
返回列表