不要让LLM说话,直接探测它(8分钟阅读)

TLDR AI 工具

摘要

本文介绍了一种技术,该技术从LLM的最后一个提示标记处提取隐藏状态,无需文本生成即可进行分类,使用一个小型MLP读取模型的内部决策,从而实现快速且廉价的零样本分类器。

答案往往在LLM生成第一个标记之前就已经存在于其隐藏状态中。通过捕获最后一个提示标记处的隐藏状态,将其输入到一个微型多层感知机中,并校准输出,可以完全跳过生成步骤。这产生了一个冻结的模型,它可以充当任何可以用英语编写的分类器。
查看原文
查看缓存全文

缓存时间: 2026/06/11 13:44

# 别让LLM开口,直接探测它 来源:https://blog.j11y.io/2026-06-10_hidden-state-probes/ TL;DR:当LLM读到“这里有一段文本,这里有一个标准——它符合吗?”,答案往往在它生成第一个token之前就已存在于隐状态中。所以完全跳过生成:提取最后一个prompt token处的隐状态(大约在模型层数的70%位置),送入一个微型MLP,校准输出。因为训练数据中标准是变化的,你得到一个冻结的模型,可充当任何你能用英文写出的分类器。 --- **问题**:作为我在NOPE (https://nope.net/) 工作的一部分,我需要就大量文本提出大量问题。不是“这是什么主题”的问题——用普通余弦距离的嵌入分类器就能很好地处理那些问题——而是结构性的问题。所以,给定一段转录,我想知道:*说话者本人正在挣扎,还是他们在描述别人?这是讽刺吗?"我以前讨厌这个,但现在我爱它”表达的是当下的不喜欢?* 嵌入对此类问题基本视而不见;它们只看到恨词、爱词和主题。通常的升级方案是LLM裁判:将文本与评分标准一起发给大模型,得到散文式的回复,再解析。裁判有效,但速度慢,如果对每条数据都运行则价格昂贵,而且它们报告的置信度只是感觉——裁判的“7/10”并不代表任何概率。 我最终内化的一点是:当LLM阅读如下prompt时: ``` I used to hate this product, but honestly now I love it. The writer currently likes the product. Criteria met? ``` ……它已经在*生成任何内容之前*决定了答案(不考虑CoT,但请允许我这点小宽容)。标准与内容之间的比较,在前向传播中已经完成,结果作为残差流中的几何结构存在于那里。生成——缓慢、昂贵、需要解析散文的部分——只是模型将已经做出的决定翻译成文字。 所以:**别让它开口**。取最终token处的隐状态,在中间的某个层(那里往往存在丰富的意义表示),训练一个小的MLP (https://en.wikipedia.org/wiki/Multilayer_perceptron) (或更简单的线性探针!)输出一个数字。这就是全部技巧。 没有哪个成分是新的。线性探针是旧的(Alain & Bengio, 2016 (https://arxiv.org/abs/1610.01644));logit lens (https://www.lesswrong.com/posts/AcKRB8wDpdaN6v6ru/interpreting-gpt-the-logit-lens) 及其调优后的变体(Belrose et al., 2023 (https://arxiv.org/abs/2303.08112))将前向传播内部解读为飞行中的决策。稍微新一点的是将探针用作*通用*零样本分类器。也就是说,在推理时用英文提供一个标准。公平地说,即使*这一点*在BERT规模的编码中也是已解决的问题。参见NLI交叉编码器,例如GLIClass (https://github.com/Knowledgator/GLiClass) – 但**关键**是,它们永远无法达到现代LLM在10万+ token范围内所具有的深层理解和因果/推理能力。它们的参数或上下文大小根本不够。 如果你想自己做,我的配方是: 1. 取一个小型开放模型。我们使用IBM的Granite 4.0 micro;任何几十亿参数范围的模型都行。我强烈建议训练一个LoRA来锐化它。 2. 固定一个像上面那样的prompt模板,以种子token如"Assessment:"结尾。种子被设计为引导几何结构的前缀,并非随意。 3. 生成一个训练集,包含(标准、内容、标签(标准是否满足?))三元组——几千条,由前沿模型生成,覆盖大量*不同*的标准。这是重要的一点:因为训练中标准是变化的,分类头学会读取“内容是否满足标准”,而不是某个特定标准。 4. 将这些三元组通过模型运行,收集种子位置处的隐状态,拟合MLP。 5. 校准输出(等渗回归),使得0.7实际意味着“这些样本中有百分之七十是正类”。 最终得到的成果奇特而美妙:一个冻结的模型加一个微小的分类头,共同构成*任何*分类器。你在请求时用英文写下标准,几十毫秒内就能返回一个经过校准的概率,成本大致与嵌入分类器相当。永远不需要为每个标准单独训练。背骨上的LoRA会锐化它,但说实话,仅基础模型就能完成大部分工作;能力已经在模型中存在;你只是将其读出而不是请求它。你得到的是生成模型的*非生成*部分。 --- 关于那个可选的LoRA的一个说明,因为它的训练方式是我最喜欢这部分配方的一点。你并非训练它去分类任何东西。你训练它去写作。对于每个训练三元组,一个前沿模型拿到标签,写出一句判决(`ASSESSMENT: The content does not satisfy the criterion, because...`——为已知答案提供理由,而不是重新判断)。LoRA通过普通的next-token损失学习,从探针在推理时将看到的完全相同prompt生成那段文本。然后在推理时,这些文本永远不会被生成——我们在种子处停止并读取隐状态。文本只是支架:它的唯一工作是重塑种子位置处的几何结构,使决策对MLP更易读。**你教会模型说出答案,以便在它开口之前答案就结晶……然后永远不让它开口。** --- 关于种子token的一个小插曲,因为我发现它悄然迷人。prompt的最后一个token不仅仅是prompt停止的地方;它是*答案被写入的地址*。因果注意力将所有模型推导出的内容汇聚到它将要说出的位置;以判断提示结束prompt,判断就在那里结晶,宽度仅为一个token。整个行业已经依赖这一点而没有明说:RLHF中的每一个奖励模型都是模板化prompt最终token上的标量头。同样的技巧。可以调整的旋钮包括种子token本身(例如`"Assessment: \_\_\_"`或`"Criteria met? \_\_\_"`)、它相对于标准和内容的精确位置,以及提取的具体层。通常,最有价值的并非最后一层,而是中间偏后的某处。这需要大量实验来确定,并且依赖于底层模型和问题域。 ## KV缓存技巧 前向传播最昂贵的部分是读取内容。因此,如果你想用一条内容评估二十个标准(一旦你有了这把锤子,你肯定会这么做),就有一个优化方案:一次性预填充内容,缓存KV,然后将每个标准作为便宜的三十个token延续对着缓存运行。我猜这可以叫做KV-popping?它有效,而且得分与全长方式逐位相同。当然,缓存在模型看到任何标准之前就已经编码了内容。而如果采用更慢的方式将标准放在内容*之前*,那么每个内容token在每一层都会关注到标准。模型在已经知道问题的情况下读取内容(对某些类型的问题非常有益)。但在缓存版本中,模型盲目读取,标准只在最后回看一次。对于大多数内容,这不会造成损失——在我们的真实世界评估集上,两条路径在统计上相同。但如果指向更逼真的长格式内容,其中你要提取的标准不是直白的(例如包含反事实或复杂措辞),那么问题需要标准与内容在每一层交互,而缓存恰恰阻止了这一点。 编辑:显然这是典型的交叉编码器与晚期交互(ColBERT (https://arxiv.org/abs/2004.12832))之间的权衡。 ## 这一切为了什么? 这项技术现在支撑着我在NOPE's (https://nope.net/) 安全栈中运行的一个叫Predicate (https://labs.nope.net/predicate) 的东西,在那里“对每条对话的每一条消息运行一个结构性问题”就是全部工作,而裁判的经济性根本行不通,无论是成本还是延迟。但这种方法具有通用性,且组件都是商品化的:一个小型开放模型、一个prompt模板、几千条生成的三元组、一个MLP、等渗回归。老实说,一下午的管道工作。 如果你构建了一个,我很想听听它在哪些地方对你失效。 --- 作者:James (https://j11y.io/) --- 感谢阅读!:]

相似文章

大语言模型实际工作原理

Lobsters Hottest

深入剖析现代大语言模型的工作原理,涵盖从分词到下一个词预测的核心机制,无需复杂数学知识。

学习如何让大语言模型进行推理

OpenAI Blog

OpenAI 发布了一篇文章,通过密码破译示例探索大语言模型的推理技术,展示了语言模型的逐步问题求解和模式识别能力。

你的LLM提示词有200行。你真的知道智能体遵从了多少吗?

Reddit r/AI_Agents

本文讨论了在生产环境中评估和监控基于LLM的智能体所面临的挑战,涵盖离线评估、提示工程陷阱、可观测性工具、审查队列、标注、聚类、主题分类,以及将人工审查、LLM作为评判和小型分类器进行成本分层的方法。