
波兰团队发布 Chopper:50 毫秒内筛除检索文本无用内容的小型边缘模型
来源标题:Show HN: Chopper, a tiny edge model that keeps only useful text in 50 ms
一种名为 Chopper 的小型编码器模型(基于 mmBERT,0.31B 参数)可在单次前向推理中逐个标记检索文本中每个词保留或丢弃,不生成文本。在 RTX 3090 上处理 20 条片段(约 2400 token)仅需 50 毫秒。团队用 400 道 MuSiQue 问题测试,搭配 Qwen3-14B 答题,每题只做一次检索和一次裁剪。
以下正文由 AI 翻译自 Hacker News 最新(原文版权归原站所有),可能存在偏差,重要内容请以原文为准。
Chops 是从数据库检索到的文本片段或长对话中切出来的片段:逐字引用,绝不改写。chopper(mmBERT,0.31B)负责切出这些片段;作为对照,Claude Opus 5.5 也会切,同样被强制要求逐字引用。
新在哪里:一种新方法,2026 年 11 月发明于波兰(欧盟)。chopper 不是对片段做摘要的 LLM:一个小型编码器一次性读入问题和全部 20 个片段,并标记每个词是保留还是丢弃。没有文本生成,所以很快:在消费级 GPU(RTX 3090)上每个问题 50 ms(20 个片段,约 2,400 tokens),用 mmBERT-small 则为 36 ms。
每个问题只做一次数据库检索,即使 4 跳也是如此。下面的每个结果都只用一次检索:每个问题拿到自己的 20 个片段一次,chopper 切一次,Qwen3-14B 回答一次。没有后续搜索,也没有第二轮,所以一个 4 跳问题必须从一次切分中串起来。
400 个 MuSiQue 问题,1、2、3、4 跳各 100 个,每个问题各有自己的 20 个检索片段。Qwen3-14B(4-bit,无微调,无思考模式)仅根据给定文本作答;由 gpt-5.6-luna 评判。长度 = prompt tokens。每个分数都计入所有正确答案,包括来自不完整 chops 的答案;括号中的数字只统计那些 chops 保留了每一跳及其答案的问题。
把每张图当作网站流量来读:问题从左向右流动,在每一跳,那些 chops 漏掉事实的问题就掉队;最后一级是 Qwen3-14B 正确作答。顶部:全部 20 个检索片段。中间:chopper 的 chops。底部:Opus 5.5 的 chops。最后一级是表格中的分数;其下方的浅色块统计 Qwen 从不完整 chops 中答对的答案,括号中的数字将它们排除在外。更多:docs/DETAILS.md §7。
同样的 400 个问题,同样的 20 个片段,同样的 Qwen3-14B prompt;每个压缩器只切一次片段:LLMLingua-2 不看问题就丢弃 tokens,所以一条链所需的事实很少能存活。Provence 会读问题,但逐个片段单独裁剪。公平地说:chopper 是在 MuSiQue 的训练集(本测试用其 dev 集)和其他多跳数据上训练的,而两者都是为通用的单段落用途训练的。
标准 RAG(检索增强生成)把整段文本粘贴进模型的上下文,而且它们会一直留在那里。其中约 95% 的 tokens 没有帮助。经过几次查找后,一个长会话大部分都是检索垃圾。
Chopper 是一个小模型,先读取检索到的段落,只保留重要的片段。你的模型随后每次查找看到约 100 tokens 而不是约 3,000 tokens,一个会话可以承载几十次查找。
question ─► retrieve 16 passages ─► 🔪 chop to ~3 fragments ─► model answers, or asks one follow-up search
🎯 干净的上下文:只有有用的片段进入会话;原始段落不会留下。 ⚡ 更少计算:主模型只读检索文本的 2–5%。 🔗 多跳可行:当缺少某个事实时,模型会写一个后续问题并再次搜索。 🏠 在一张家用 GPU 上构建:这里的所有数据集和模型都在单张 RTX 3090 上完成(部分标签来自 API)。
结果一览 主模型读取的检索文本 2–5%(约少 20–40 倍);对于 85% 的 HotpotQA 和 69% 的 TriviaQA 问题,答案仍在保留的文本中 “这里什么都没有”:答案已被删除的池子(8 种语言,商业文档) 67% 的情况下要求再次搜索,保留 1.4% 的文本 每次查找的切分时间(RTX 3090) 155 ms(单独的 mmBERT)· 277 ms(内置于 MiniCPM3-4B) Qwen3-14B 一次检索正确回答的 4 跳 MuSiQue 问题 12% → 29%,用 chopper 的 chops 代替全部 20 个片段(tokens 少 11 倍);用 Opus 5.5 的 chops:43% Qwen3-14B 正确回答的波兰语问题(PoQuAD、PolQA) 85.6% 来自波兰语 chopper 的 chops(255 tokens),而 85.2% 来自全部 16 个片段(3,856 tokens) 长对话记忆结果(LoCoMo、LongMemEval)在详情中:那里 4B 回答模型是瓶颈。
🟧 通用 🟪 集成式 它是什么 一个单独的小型编码器(mmBERT-base,0.31B,推荐;或 mmBERT-small,0.14B;两者也都有波兰语版本) MiniCPM3-4B 自身权重的 20% 切片 + 一个小型 LoRA 适用于 任何回答模型:文本输入,文本输出 MiniCPM3-4B 额外内存 0.31B / 0.14B 权重 45M 参数;读取模型自身的 cache 权重 🤗 wiiiktor/chopper_mmbert 🤗 wiiiktor/chopper_minicpm3
从通用版开始。集成式是长期赌注:从一开始就与模型一起训练,它应该会变得几乎免费。如果你预训练模型并想构建它,请联系 wiiiktor。
在你自己的 RAG 流水线中(LangChain、LlamaIndex、Haystack 或纯 Python): pip install chopper-rag # or "chopper-rag[langchain]", [llama-index], [haystack], [all] from chopper_rag import Chopper chopper = Chopper.from_pretrained(variant="base") # or "small"; for Polish "base-pl", "small-pl" result = chopper.run("When was the Eiffel Tower completed?", passages) # passages: list of retrieved texts print([c.text for c in result.chops], result.decision) # exact quotes + ANSWER / SEARCH 框架示例:integrations/chopper-rag。已列入 LangChain integrations(ChopperCompressor)。或试试本仓库中的 demo: pip install -r requirements.txt
your documents (a folder of .txt / .md, or a .jsonl with "title" and "text") + any Hugging Face causal LM
python operator-for-llm-with-mmbert.py --docs my_docs/ --model <hf model id>
--ask "Who founded the company that distributed the film UHF?"
leave out --ask for an interactive session; it shows how many tokens plain RAG would have added
权重在首次使用时从 Hugging Face 下载。训练数据:🤗 wiiiktor/chopper_demo。其他所有内容都在一页上,docs/DETAILS.md:
基于 mmBERT(JHU CLSP)、MiniCPM3-4B(OpenBMB)、Qwen3、Qwen3-Embedding 和 Qwen3-Reranker(Qwen 团队)、bge-reranker(BAAI)构建;
(原文较长,此处译出前 6000 字,完整内容请点「打开原文」。)
正文由 探How 从来源站点 RSS 同步,内容未经改写;遇到排版缺失或需要图片、视频时请以原文为准。