跳到主要内容
本地模型写概览,卡在【简短】这两个字上

本地模型写概览,卡在【简短】这两个字上

老墨
老墨

· 阅读约 4 分钟

旧稿:

请为下面这篇文章生成一段简短的概览,帮助用户判断是否值得阅读。

这不是原作者写的那条,是我照着 DEV New Tab 的功能描述反推出来的,方向错不了。二十八个字,读着挺齐整,可它一句都没说清模型该干到哪一步。问题就卡在【简短】这两个字上。

先把这活的场景交代一句,不然下面几轮改动看着都像小题大做。概览是 Chrome 自带的本地 Prompt API 跑的,模型在用户机器上,没有 key,没有网络往返。更要紧的是它不现生成:提前备好、缓存住,开关预览都不重跑。延迟不是约束,token 也不是。

那【简短】留着干什么。它在这条 prompt 里唯一的作用,是让模型自己猜一个长度。模型猜长度从来不按你想的猜。

V1 我先把数字补上:

用两句话概括这篇文章,每句不超过 30 字,帮助用户判断是否值得阅读。

出来是这样的:「本文介绍了一个浏览器扩展的开发过程。作者分享了自己的想法,并讨论了功能的实现。」两句,字数达标,全是废话。标题里就写着这是个浏览器扩展,用不着概览再念一遍。

问题在这:只给了长度,没给内容维度。面对「概括」,模型最省力的路径永远是复述主题,因为主题白送在标题里。要它去答「解决什么问题」「说给谁听」「有没有能直接拿走的东西」,得一条条写出来。大模型或许能替你补出这层意图,本地跑的小模型不会。

顺带说,旧稿里「帮助用户判断是否值得阅读」不算错,但它是目的,不是动作。目的句写进 prompt,模型只当背景音乐听。要么翻成具体要答的问题,要么删掉。

V2 我换了个锚点词,把【概览】从「缩写」拉向「判断」:

读完下面这段,读者要能回答一个问题:这篇文章值不值得我花十分钟。
用两到三句回答,每句不超过 30 字。不要复述主题,说清楚:作者在解决什么具体问题、结论是什么、有没有可复用的做法。

这版开始有用了,也带出一个更麻烦的。它把结论直接摊开。前阵子有人在扩展的评论区问过差不多的事:概览会不会反而让人不去读原文。这担心是真的,只是因果搞反了。让人跳过原文的不是概览,是一份写得像结论的概览。读者看到「作者认为 X 方案更好」,心里就结了账,不会再回去看那三段论证。而原文恰恰是核对的唯一地方,本地小模型生成的二手话更是。

那让它故意说一半?不是。让它收尾留个指向原文的钩子。加第三条:

另外指出原文里哪部分需要回去核对(具体数据、代码片段、论证过程),用一句话。

这条看着像产品设计,本质是个位置问题。把「原文不可替代」写成模型必须输出的一行,比在界面上加十个「阅读全文」按钮都管用。它能成立,还是因为生成不是实时的,多要一句不多花一毫秒。

这里岔一句。「概」这个字本义是刮平斗斛的木板,从量器引申出「大概」,一个词里同时装着「量过」和「约摸」,本身就自相矛盾。写概览的人一直在两头拉扯:一头要准,一头要短。

扯回来。

三条要求的顺序也动过。最初「说清问题、结论、可复用的做法」放最后,跑出来模型经常只答前两条。改成把「不要代替原文下结论」压在末尾,因为它离输出最近,模型对结尾那条最敏感。这个亏我在 few-shot 排序上吃过一模一样的,没想到单条 prompt 的条目顺序也是同一个道理。

还有一处没解决干净:长度。评论区有人专门问了概览生成完会不会把相邻卡片顶得乱跳,原作者花了不少功夫做布局稳定。问题在界面上,根子有一半在 prompt 里,你不知道模型这次吐 40 字还是 120 字。V3 我加了字数区间,能收窄,收不死。小模型对「不超过 30 字」的服从度没你想的那么高,碰上长文章尤其松。所以布局该扛还得扛,prompt 这边只能承诺一个大概范围,承诺不了像素。

定稿:

为下面这篇文章写一段概览,让读者判断是否值得花时间读原文。
要求:
1. 两到三句,每句不超过 30 字
2. 不复述标题,说清楚:作者在解决什么具体问题、结论是什么、有没有可直接复用的做法
3. 最后一句指出原文里需要回去核对的部分(数据、代码或论证),不要代替原文下结论

从二十八个字到一百出头。比旧稿长得多,这是应该的:本地跑、提前跑、缓存复用省下来的那些成本,就该换成更硬的约束。

不敢说这是终版。「结论是什么」这一句我到现在也拿不准该不该让它说。说了读者省事,也省掉了读者自己去判断那一步。哪天想明白了再改一版,不丢人。