你在 ollama 里问最新的事,它一本正经胡说;或者你贴了个链接过去,它说读不到内容。这不是模型笨,是本地推理链路里根本没有取网页这一步。这篇把「谁去抓、抓完怎么塞进上下文、怎么确认真读到了」拆成几步,让你按自己环境选一条能跑通的路。
你在 ollama 里问最新的事,它一本正经胡说;或者你贴了个链接过去,它说读不到内容。这不是模型笨,是本地推理链路里根本没有取网页这一步。ollama 本身只负责「给文本、出文本」,抓取、清洗、拼接全得你自己补上。
这篇把「谁去抓、抓完怎么塞进上下文、怎么确认真读到了」拆成几步,让你按自己的环境选一条能跑通的路。全文只讲判断标准和可执行动作,具体数字和版本信息请到站内对应页面核对当时的记录。
先搞清:ollama 本身不带联网这件能力
ollama 是一个本地推理服务,它的接口收到 prompt、吐出 token,中间没有任何抓取器或搜索引擎。你在回答里看到某个网址,多半是训练语料里的记忆被复述出来,不是它刚刚访问了那个页面。
- 把它断网跑一次,答案内容基本不变,说明它压根没联网;
- 问它一个只有某个页面才有的小细节,它答得流畅但答错,基本就是在编;
- 看请求日志,如果只有一次 /api/generate 或 /api/chat 调用,说明没有任何外部抓取发生;
- 多模态视觉模型能「看」你上传的截图,但那是读图,不等于读网页,别混为一谈。
三条可选路线:检索插件、自建抓取、手工粘贴
让本地模型读到网页,抽象看只有三件事:拿到正文、把正文放进上下文、要求模型基于正文回答。区别只在这三件事由谁做、做得多自动。
| 路线 | 谁来抓 | 适合谁 | 主要代价 |
|---|---|---|---|
| 对话前端插件 | 前端内置的搜索与抓取模块 | 只在聊天框里偶尔用的人 | 受插件能力限制,不好定制 |
| 自建脚本 | 你自己的抓取 + 拼接代码 | 要做固定流程或批量处理 | 要处理超时、截断、失败重试 |
| 手工粘贴 | 你的浏览器复制 | 一个月偶尔查一两个页面 | 上下文全被正文占满,效率低 |
选择依据很简单:问得频繁走前两条,一个月问三次就用第三条。前两条的差别在于可控性和维护成本,不是谁更高级。
按你的使用频率和技术栈挑方案
先明确你是「一个人聊天用」还是「要做成流水线」,这决定了选型的复杂度。前者优先看前端的联网插件是否支持自定义搜索引擎和抓取超时;后者才值得引入框架。
- 对话前端插件
- 装好即用,但抓取行为受插件控制,出问题时排查点少。
- 自建抓取脚本
- 抓取、清洗、截断全在手里,出问题能定位到具体一步。
- 网页加载器类框架
- 适合把抓取和本地向量库串起来,多页检索时省事。
- 预下载离线库
- 纯内网环境下唯一可行路径,把资料事先抓到本地再喂。
不适用的情况也要说清:纯内网离线环境走不了公网抓取,只能改成预先把资料下载进本地库;多人共用一个 ollama 实例时,得考虑抓取并发、缓存和失败重试,别让一个人的长网页把整台机器拖住。
抓网页这一步的实操细节
抓取最容易翻车的地方不在「能不能下载」,而在「下载下来的东西能不能用」。整页 HTML 里导航、广告、脚本占比很高,直接塞给模型等于花了大半上下文读废话。
- 先取正文用正文提取把 HTML 里的主体段落抽出来,去掉菜单和页脚;验证方法是把结果打印出来人工扫一眼,看有没有整段导航文字。
- 再按上限截断按字符或 token 设一个上限,超长页面先分段再逐段摘要;验证方法是统计截断前后的字符数,确认没有悄悄丢内容。
- 设超时和重定向上限给每次请求配超时和最大跳转次数;验证方法是拿一个故意慢的地址跑一次,确认它在预期时间内报错而不是一直挂着。
- 失败要有回退抓取失败时不要直接给模型一个空字符串,改成明确告诉它「本次没取到资料」;验证方法是断开网络跑一次,看回答是否还假装读过。
格式转换这类杂活没必要手写正则,去 Session 转换器(/tools/session-converter) 看有没有现成处理方式,往往比你自己拼字符串省事。
把抓到的内容喂给本地模型
拼 prompt 时要把「资料」和「问题」明确分开,并写清资料可能不完整,让模型不要硬编。否则它会把资料当背景知识,随手补上不存在的内容。
- 在提示里写「以下资料可能不完整,缺信息就说缺」,比让它自由发挥安全得多;
- 先算一下你这台机器实际能容纳多少字符,超长会被静默截断,你看到的是开头而不是全部;
- 要求模型回答时标注依据来自哪一段,方便你回头核对是不是在编;
- 需要跨几十个页面做全局推理时,先检索再喂,不要全文塞进上下文。
怎么确认它真的读到了,而不是在编
验证的核心是找只有那个页面才有的细节,而不是问常识。问常识对了也说明不了它读过,可能只是记住了。
- 让它复述冷门细节挑页面里一个小标题或具体表述让它复述;答不上来或答得含糊,说明资料没进去。
- 换无关页面再问一次给它一个明显和你问题无关的页面,看回答会不会跟着一起胡编;会编说明提示里没限制住。
- 单独打印抓取结果把清洗后的正文单独输出看一眼;很多「模型乱答」其实是抓取拿到了登录页或验证码页。
- 固定一组测试问题每次改抓取或改提示后跑同一组问题,比较回答差异;没有基线就没法判断改动有没有生效。
这种「先验证管道、再评价输出」的思路,和 中转站真假在线实测(/tools/verify) 里探针的做法是一回事:先确认链路通,再谈质量好不好。
常见翻车点和排查顺序
排查要有固定顺序,从外到内一层层砍,不要一上来就怀疑模型。绝大部分问题出在网络和内容获取这两步。
| 顺序 | 查什么 | 典型现象 | 怎么确认 |
|---|---|---|---|
| 第一步 | 网络 | 容器里的 ollama 没配 DNS 或代理 | 直接 curl 目标地址,看是否超时 |
| 第二步 | 内容 | 抓到登录页、验证码页 | 打印正文,长度接近 0 就是没取到 |
| 第三步 | 长度 | 资料被截断 | 对比抓取字符数和送进上下文的字符数 |
| 第四步 | 提示 | 没要求引用来源 | 看回答里有没有可核对的出处 |
按这个顺序走,一般前三步就能定位。真到第四步,再回去改提示模板,比反复重装环境有效得多。
本地模型读不了网页不是模型的问题,是推理链路里缺了取网页这一步。下一步想对比不同方案和站内工具的实际效果,可以到工具目录和价格追踪页核对当时的记录,再决定用哪条路线。→
常见问题
ollama 能直接联网吗?
不能。ollama 提供的是本地推理接口,本身没有搜索或抓取能力。联网这件事必须由外层的对话前端、脚本或框架来完成,抓到内容后再作为文本发给 ollama。所以问「ollama 怎么联网」,实际是在问「用什么工具帮它取网页」。
为什么我把网址发给它,它却说打不开?
因为模型看到的只是你输入的那串字符,它没有浏览器。网址对它是普通文本,不是可访问的资源。要让它处理网页内容,你得先把正文取出来,作为上下文一起发过去,或者用带联网开关的前端代你完成这一步。
本地跑还要联网,是不是就失去了离线的意义?
看你的目的。离线部署的意义通常是数据不出内网、不依赖外部模型服务,而不是禁止一切网络请求。如果合规上确实不能出网,就改成定期把需要的资料下载到本地库,再让模型从本地库检索,这样两边都满足。
抓下来的网页太长塞不进去怎么办?
先分段,再按相关度挑几段喂进去,或者先让模型对每段做摘要再合并。直接截断开头的最容易漏掉关键信息。具体你这台机器能吃多少字符,去 部署测算(/models/deploy) 按你的显存和量化档位算一遍更准。
怎么判断答案是有依据的还是编的?
让它指出这句话来自资料的哪一段,并复述该段的原话。如果它只能泛泛而谈,或者说不出出处,那大概率是凭记忆生成的。也可以换一份内容相反的页面再问同一问题,看回答是否跟着变。