知识库是拿站上的三百多篇文章喂的,问题都是站内常见问题。问怎么改邮箱,它答一段如何配置SMTP服务器。问发票怎么开,它把退款流程背了一遍。每次答得都很流畅,就是不沾边。
这类问题第一步不是换模型,是把检索到的片段打印出来。大多数框架有debug开关,能把命中的原文和分数一起吐出来。看着那段原文,就知道模型手里到底有没有答案。原文里有答案还答错,是提示词的事;原文里根本没有,就是检索的事。这两条岔路分开,后面才有的放矢。
八成的锅在切片长度。按固定字数硬切,一篇讲备案的文章会被切成三段,答案那句刚好落在切缝上,前后语境全丢。切片设成两千字,一次塞进去五段,模型看到的大半是无关内容,注意力被稀释。
更好的切法是按结构切,一个标题下的内容算一段。文章本身有小标题,切出来天然对齐,语义完整。切完把标题拼回去,做成一段前缀再入库,检索时这段前缀也参与匹配,命中率会明显好一截。站内问答类内容,三百到五百汉字一段比较稳,相邻两段留八十个字的交叠。交叠不能省,答案刚好跨在两句之间的时候,全靠这八十个字把它接起来。表格类内容单独成段,别和正文混。
第二种情况更安静,你要是中途换过embedding模型。入库时用的是A模型,查询时用了B模型,两边维度都是1024,接口不报错,相似度算出来全是噪声。这种错最难查,因为一切都在正常返回。
换模型必须重建整个库,一条条重算,不能只改配置。维度不同的话反而好,入库会直接报错,一眼就能看出配错了。维度相同才麻烦,向量照样算出来,每个数都在合理范围内,就是彼此不搭。
top_k和相似度阈值是两个旋钮,往两个方向拧。k设成十,阈值放到零点七,召回多但杂音大。k降到三,阈值提到零点八,答不上来就直说不知道。
文档是PDF的话还要多一道,解析器常把表格拆成一行行乱序的文字。价格表被拆散之后,模型答价格就只能编。这类文档单独走一遍人工校对,比调参有用。宁可少喂十篇,别喂错的。
验证的办法是准备三十个有标准答案的问题,跑一遍看命中率。改动前后各跑一次,数字会说话。只看一两个例子容易被偶然骗过去。命中率从六成到八成,体感差别很大。页面上加一句提示,让它把依据的原文一起贴出来,用户自己会判断。
申请创业报道,分享创业好点子。点击此处,共同探讨创业新机遇!
