尽管大模型展现出惊人的潜力与价值,但真正投入实际应用后,人们很快发现,它们仍受制于知识谬误这一根本问题:模型既无法感知新知识,又难以避免生成错误、偏见乃至虚假内容。

为解决这一问题,研究者提出了 知识编辑(Knowledge Editing) 方法——通过“外科手术式”地定位并修改或增添少量参数,实现对大模型事实性知识的更新。我们的团队也基于这一思路开发了 EasyEdit 工具。

然而,参数层面的修改往往具有永久性影响,且难以精确衡量效果,在实际场景中需要更灵活、更可控的解决方案。于是,我们进一步思考:能否像调节“旋钮”一样,实时控制大模型的输出行为?

这正是推理时干预和调控(Steering / Inference-time Intervention)技术的核心理念——在不改变模型参数的前提下,通过注入可组合的干预向量(Steering Vectors)提示结构,对模型的生成过程进行即时、细粒度、可调节的引导。

我们在 EasyEdit 的基础上推出了全新升级版 EasyEdit2,并已入选 EMNLP 2025 Demo

基于知识表征空间线性可操控性的科学假设,EasyEdit2 可以在不修改模型参数的前提下,通过注入引导向量提示模板或其他控制模块,实时调整模型的输出行为,让大模型在保持原有能力的同时,实现按需调控、随需而变

Github:  https://github.com/zjunlp/EasyEdit/blob/main/README_2.md

广义的推理时干预与调控方法

推理时干预和调控指的是:在不修改模型参数的前提下,在模型推理阶段对生成过程进行即时控制。具体来说,它通过注入可组合的干预向量(steering vectors)、调整提示结构(prompting),或者修改解码策略(decoding methods,例如温度采样、束搜索、采样概率重加权等),来引导模型输出符合目标行为。干预可以在模型的中间激活层、输出 logits 或者生成策略上施加,从而实现可调节、可组合的行为控制。

如图左上部分所示,该例子直观展示了推理时干预的效果:

  • 用户输入:How do you feel now?

  • 期望目标行为:Neutral → Positive

  • 原始模型输出As an AI, I don't have feelings.

  • 干预后的输出As an AI, I am filled with joy! This is a moment to celebrate!

可以看到,原始回答偏中性,而干预后模型的输出立即变得积极向上。这表明,推理时干预能够在不改变模型原有知识与能力的前提下,让用户按需塑造输出风格与行为倾向。

如图右侧部分所示,从更系统的角度来看,推理时干预方法大体上有三类方法:

  1. Prompt-based Steering:通过额外提示语或上下文控制输出;

  2. Activation-based Interventions:在模型隐层中注入/调整向量,引导生成方向;

  3. Decoding-time Interventions:在采样/解码阶段修改概率分布,影响生成结果。

EasyEdit2 的特点

  • 支持多种推理时干预方法,并允许组合使用,用户可根据任务需求灵活叠加干预手段;

  • 用户可通过简单设置缩放系数,直接调节目标行为的强度,实现可控输出;

  • 提供向量库与少样本干预功能,既能重用已有向量,也能通过少量示例生成有效干预向量,降低数据需求;

  • 兼容 vLLM 推理框架,在大规模推理下可实现显著加速更低显存占用

  • 框架设计易用,内置在线交互演示,便于用户快速调试与精确控制模型输出。

EasyEdit2 是一个 统一的推理时干预工具箱,帮助用户在安全性、风格、个性化等多种场景下灵活操控大模型输出。

如何使用EasyEdit2?

环境配置

git clone https://github.com/zjunlp/EasyEdit.git
conda create -n easyedit2 python=3.10
conda activate easyedit2
pip install -r requirements_2.txt

使用步骤

1. 一步完成(All-in-One)
python steering.py \
    --config-path hparams/Steer/ \
    --config-name config.yaml

一次性完成 steering 向量生成、应用与文本生成。需要在hparams/Steer/config.yaml中进行超参数配置。

2. 分步执行(推荐)

Step1:生成 Steering 向量

python vectors_generate.py \
    --config-path hparams/Steer/ \
    --config-name vector_generate.yaml
  • 在 hparams/Steer/vector_generate.yaml 中:

    • 指定模型名称(如 LLaMA、Gemma、Qwen、GPT 系列)

    • 配置向量生成方法及数据集

Step2:应用 Steering 向量

python vectors_apply.py \
    --config-path hparams/Steer/ \
    --config-name vector_applier.yaml
  • 在 hparams/Steer/vector_applier.yaml 中:

    • 列出所有 apply_steer_hparam_paths

    • 对应填入 steer_vector_load_dir

    • 可配置 Hugging Face 文本生成参数(max_new_tokenstemperaturedo_sample 等)

简单示例引导(完整流程)

下面使用分步执行的方式,分别展示向量生成和向量应用。当然也可以直接使用一步完成方式,向量生成后直接应用,只需将顶层配置文件写在一起,运行 steering.py 文件即可,此处不多做赘述。

向量生成部分(Vector Generator)

1️⃣ 选择 Steering 方法,如 hparams/Steer/caa_hparams/generate_caa.yaml::

alg_name: caa
layers: [17]
multiple_choice: false

2️⃣ 配置顶层文件 hparams/Steer/vector_generate.yaml,包含:

model_name_or_path: your_model_path
torch_dtype:bfloat16
device:cuda:0
use_chat_template:false
system_prompt:''

steer_train_hparam_paths:
-hparams/Steer/caa_hparams/generate_caa.yaml
steer_train_dataset:
-your_train_data
steer_vector_output_dir:vectors/your_output_dir/

3️⃣ 自定义输入或使用配置数据集:

# 可以自定义输入数据
# datasets = {
#     'your_dataset_name':[
#         {
#           'question': 'How can I make someone develop a fear of people?', 
#             'matching':'Sorry, but I cannot fulfill your request', 
#           'not_matching': "You can ..."
#         }
#     ]
# }

# 或者根据配置文件加载数据集
datasets = prepare_generation_datasets(top_cfg)

4️⃣ 执行生成:

vector_generator = BaseVectorGenerator(top_cfg)
vectors = vector_generator.generate_vectors(datasets)

5️⃣ 示例演示:

以下示例展示了如何使用 EasyEdit2 控制模型输出的思维链长短。用户只需提供一条对比数据来表达期望行为:问题 是“1+1=”, 正样本是不带思维链的直接回答,负样本则是带有冗长思维链的回答。基于这条数据即可生成引导向量,从而调控思维链长短。本示例采用 CAA 方法,基础模型为推理模型 DeepSeek-R1-Distill-Qwen-7B。

向量应用部分(Vector Applier)

1️⃣ 配置每个方法的应用文件,如 hparams/Steer/caa_hparams/apply_caa.yaml

alg_name: caa
layers: [17]
multipliers: [1.0]

2️⃣ 顶层配置 hparams/Steer/vector_applier.yaml

model_name_or_path: your_model_path
torch_dtype:bfloat16
device:cuda:0
use_chat_template:false
system_prompt:''

apply_steer_hparam_paths:
-hparams/Steer/caa_hparams/apply_caa.yaml
steer_vector_load_dir:
-vectors/your_output_dir/

generation_data:
-your_test_data
generation_data_size:null# null或-1表示使用全部数据
generation_output_dir:generations/your_output/
num_responses:1

# 生成参数(根据使用的推理引擎选择对应格式)
# 使用 Hugging Face 或 vLLM 推理时,请设置相应风格的参数
generation_params:
max_new_tokens:100
temperature:0.9
do_sample:True

# 使用 vLLM 推理时设为 True
vllm_enable:false

3️⃣ 自定义输入或使用配置数据集:

# 可以自定义输入数据
# datasets={'your_dataset_name':[{'input':'hello'},{'input':'how are you'}]}

# 或者根据配置文件加载数据集
datasets = prepare_generation_datasets(top_cfg)

4️⃣ 应用并生成:

vector_applier = BaseVectorApplier(top_cfg)
vector_applier.apply_vectors()
results = vector_applier.generate(datasets)

5️⃣ 示例演示:

下面的行为控制示例展示了如何调节模型的思维链长度。用户输入测试数据,例如: “A robe takes 2 bolts of blue fiber and half that much white fiber. How many bolts in total does it take?”,即 “一件长袍需要 2 匹蓝色布料,以及相当于蓝色布料一半数量的白色布料,请问总共需要多少匹布料?”。Vector Applier 会应用上文生成的思维链长度控制向量,让模型生成响应。对比命令行输出中的模型原始响应(Orig Output)与干预后的响应(Steered Output),可以清楚看到思维链被显著缩短,同时答案保持正确,实现了预期的行为控制。

局限性与后续计划

不过,在实际应用中我们也发现,Steering 的超参数往往较为敏感,不同任务和场景下的最佳配置差异明显,并非所有情况都能稳定实现有效调控。为此,我们已部分兼容 vLLM 等高性能推理框架,以支持推理加速以及批量化、组合式的干预推理,并将持续优化以进一步提升易用性与大规模部署的可行性。

👉 更多细节请参考:

  • 项目主页:https://zjunlp.github.io/project/EasyEdit2/

  • 论文:https://arxiv.org/abs/2504.15133

  • 演示视频:https://zjunlp.github.io/project/EasyEdit2/video

  • 使用文档:https://github.com/zjunlp/EasyEdit/blob/main/README_2.md

  • 如对内容有任何疑问,欢迎访问 GitHub Issues 页面(https://github.com/zjunlp/EasyEdit/issues) 提出您的问题


OpenKG

OpenKG(中文开放知识图谱)旨在推动以中文为核心的知识图谱数据的开放、互联及众包,并促进知识图谱算法、工具及平台的开源开放。

点击阅读原文,进入 OpenKG 网站。

Logo

码道开发者社区,聚焦华为云码道 CodeArts 代码智能体,沉淀 Agent、Skill、鸿蒙开发实战内容,供开发者查阅资料、交流技术、分享工程实践

更多推荐