开源开放 | EasyEdit升级新版本提升大模型调控能力
尽管大模型展现出惊人的潜力与价值,但真正投入实际应用后,人们很快发现,它们仍受制于知识谬误这一根本问题:模型既无法感知新知识,又难以避免生成错误、偏见乃至虚假内容。
为解决这一问题,研究者提出了 知识编辑(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!
可以看到,原始回答偏中性,而干预后模型的输出立即变得积极向上。这表明,推理时干预能够在不改变模型原有知识与能力的前提下,让用户按需塑造输出风格与行为倾向。
如图右侧部分所示,从更系统的角度来看,推理时干预方法大体上有三类方法:
-
Prompt-based Steering:通过额外提示语或上下文控制输出;
-
Activation-based Interventions:在模型隐层中注入/调整向量,引导生成方向;
-
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_tokens、temperature、do_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 网站。
更多推荐


所有评论(0)