モデル概要
モデル特徴
モデル能力
使用事例
license: apache-2.0 datasets:
- Tongyi-Zhiwen/DocQA-RL-1.6K base_model:
- deepseek-ai/DeepSeek-R1-Distill-Qwen-32B tags:
- long-context
- large-reasoning-model pipeline_tag: text-generation library_name: transformers
QwenLong-L1: 強化学習による長文脈大規模推論モデルへのアプローチ
Fanqi Wan, Weizhou Shen, Shengyi Liao, Yingcheng Shi, Chenliang Li,
Ziyi Yang, Ji Zhang, Fei Huang, Jingren Zhou, Ming Yan
Alibaba Group 同義智研
ニュース
-
2025年5月28日: ü§ó QwenLong-L1-32B-AWQをリリースしました。ms-swiftフレームワークを使用したAWQ int4量子化を施しています。
-
2025年5月26日: ü§ó QwenLong-L1-32Bをリリースしました。これは長文脈推論のために強化学習で訓練された初の長文脈LRMです。7つの長文脈DocQAベンチマークでの実験により、QwenLong-L1-32BはOpenAI-o3-miniやQwen3-235B-A22Bなどの主要LRMを上回り、Claude-3.7-Sonnet-Thinkingと同等の性能を達成し、最先端のLRMの中でリーディング性能を示しています。
-
2025年5月26日: ü§ó DocQA-RL-1.6Kをリリースしました。数学的、論理的、マルチホップ推論領域にまたがる1.6Kの文書質問応答(DocQA)問題からなる専門的なRL訓練データセットです。
イントロダクション
本研究では、QwenLong-L1という新しい強化学習(RL)フレームワークを提案します。このフレームワークは、LRMが短文脈の熟練から堅牢な長文脈汎化へ移行するのを促進するように設計されています。予備実験では、短文脈と長文脈推論RLの訓練ダイナミクスの違いを説明しています。
私たちのフレームワークは、RL訓練中の漸進的な文脈スケーリングを通じて短文脈LRMを強化します。このフレームワークは3つのコアコンポーネントで構成されています:堅牢なポリシーを初期化するためのウォームアップ教師あり微調整(SFT)フェーズ、短文脈から長文脈への安定した適応を促進するカリキュラムガイド付きRLフェーズ、および訓練の複雑さを段階的に調整してポリシー探索を促進する難易度対応回顧サンプリングメカニズムです。GRPOやDAPOを含む最近のRLアルゴリズムを活用し、精度と再現率のバランスを取るためにルールベースとモデルベースのバイナリ結果報酬を組み合わせたハイブリッド報酬関数を統合しています。ポリシー最適化中のグループ相対優位性を戦略的に利用することで、堅牢な長文脈接地と優れた推論能力に不可欠な効果的な推論パターンをLRMに学習させます。
モデルリリース
ü§ó QwenLong-L1-32Bをリリースしました。これは長文脈推論のために強化学習で訓練された初の長文脈LRMです。7つの長文脈DocQAベンチマークでの実験により、QwenLong-L1-32BはOpenAI-o3-miniやQwen3-235B-A22Bなどの主要LRMを上回り、Claude-3.7-Sonnet-Thinkingと同等の性能を達成し、最先端のLRMの中でリーディング性能を示しています。
評価結果は以下の通りです。
要件
# conda環境の作成
conda create -n qwenlongl1 python==3.10
conda activate qwenlongl1
# 要件のインストール
pip3 install -r requirements.txt
# verlのインストール
cd verl
pip3 install -e .
# vLLMのインストール
pip3 install vllm==0.7.3
# flash-attnのインストール
pip3 install flash-attn --no-build-isolation
クイックスタート
ü§ó Transformersを使用してモデルを実行する方法は以下の通りです:
from transformers import AutoModelForCausalLM, AutoTokenizer
model_name = "Tongyi-Zhiwen/QwenLong-L1-32B"
# トークナイザーとモデルをロード
tokenizer = AutoTokenizer.from_pretrained(model_name)
model = AutoModelForCausalLM.from_pretrained(
model_name,
torch_dtype="auto",
device_map="auto"
)
# モデル入力の準備
template = """以下のテキストを読み、以下の質問に答えてください。
<text>
$DOC$
</text>
$Q$
回答は次の形式で記述してください:「したがって、答えは(ここに答えを挿入)です。」"""
context = "<あなたのコンテキスト>"
question = "<あなたの質問>"
prompt = template.replace('$DOC$', context.strip()).replace('$Q$', question.strip())
messages = [
# {"role": "system", "content": "あなたはAlibaba同義智研が作成したQwenLong-L1です。あなたは役立つアシスタントです。"}, # 必要に応じてシステムプロンプトを使用してアイデンティティを定義
{"role": "user", "content": prompt}
]
text = tokenizer.apply_chat_template(
messages,
tokenize=False,
add_generation_prompt=True
)
model_inputs = tokenizer([text], return_tensors="pt").to(model.device)
# テキスト生成の実行
generated_ids = model.generate(
**model_inputs,
max_new_tokens=10000,
temperature=0.7,
top_p=0.95
)
output_ids = generated_ids[0][len(model_inputs.input_ids[0]):].tolist()
# 思考内容の解析
try:
# 151649 (</think>)を検索
index = len(output_ids) - output_ids[::-1].index(151649)
except ValueError:
index = 0
thinking_content = tokenizer.decode(output_ids[:index], skip_special_tokens=True).strip("\n")
content = tokenizer.decode(output_ids[index:], skip_special_tokens=True).strip("\n")
print("思考内容:", thinking_content)
print("内容:", content)
長文書の処理
入力の総長(入力と出力を含む)が32,768トークンを大幅に超える場合、RoPEスケーリング技術を使用して長文テキストを効果的に処理することを推奨します。YaRNメソッドを使用して、最大131,072トークンのコンテキスト長でのモデルの性能を検証しました。
YaRNは現在、いくつかの推論フレームワークでサポートされています。例えば、ローカル使用のためのtransformers
やllama.cpp
、デプロイメントのためのvllm
やsglang
などです。一般的に、サポートされているフレームワークでYaRNを有効にするには2つのアプローチがあります:
-
モデルファイルの変更:
config.json
ファイルにrope_scaling
フィールドを追加:{ ..., "rope_scaling": { "rope_type": "yarn", "factor": 4.0, "original_max_position_embeddings": 32768 } }
llama.cpp
の場合、変更後にGGUFファイルを再生成する必要があります。 -
コマンドライン引数の受け渡し:
vllm
の場合:vllm serve ... --rope-scaling '{"rope_type":"yarn","factor":4.0,"original_max_position_embeddings":32768}' --max-model-len 131072
sglang
の場合:python -m sglang.launch_server ... --json-model-override-args '{"rope_scaling":{"rope_type":"yarn","factor":4.0,"original_max_position_embeddings":32768}}'
llama.cpp
のllama-server
の場合:llama-server ... --rope-scaling yarn --rope-scale 4 --yarn-orig-ctx 32768
[!IMPORTANT] 以下の警告が表示された場合:
'rope_type'='yarn'の`rope_scaling`で認識されないキー: {'original_max_position_embeddings'}
transformers>=4.51.0
にアップグレードしてください。
[!NOTE] すべての注目すべきオープンソースフレームワークは静的YaRNを実装しており、これはスケーリングファクターが入力長に関係なく一定であることを意味し、短いテキストでの性能に影響を与える可能性があります。 長文脈の処理が必要な場合にのみ
rope_scaling
設定を追加することをお勧めします。 また、必要に応じてfactor
を変更することをお勧めします。例えば、アプリケーションの典型的なコンテキスト長が65,536トークンの場合、factor
を2.0に設定する方が良いでしょう。
[!NOTE] 平均コンテキスト長が32,768トークンを超えない場合、このシナリオではYaRNを有効にしないことをお勧めします。モデルの性能が低下する可能性があります。
データセット
検証可能な長文脈推論のための挑戦的なRLデータセットを構築するために、ü§ó DocQA-RL-1.6Kを開発しました。これは3つの推論領域にわたる1.6KのDocQA問題で構成されています:
(1) 数学的推論:DocMathデータセットから600の問題を使用し、財務報告書などの長く専門的な文書にわたる数値推論を必要とします。DocMathについては、訓練用に有効分割から各サブセットの75%を、評価用に25%をサンプリングしました。
(2) 論理的推論:DeepSeek-R1を使用して、法律、金融、保険、生産領域にわたる現実世界の文書の論理分析を必要とする600の多肢選択問題を合成しました。
(3) マルチホップ推論:MultiHopRAGから200の例とMusiqueから200の例をサンプリングし、文書間推論を強調しました。
訓練と評価のために以下のデータセットを./datasets/
にダウンロードして配置してください。
RL訓練データ: ü§ó DocQA-RL-1.6K。
評価データ: ü§ó docmath, ü§ó frames, ü§ó longbench。
訓練
DAPOを使用した単一ステージRL訓練の基本的なデモ訓練コードを提供します。
まず、ローカル検証器を起動します。
export CUDA_VISIBLE_DEVICES=0
vllm serve "Qwen/Qwen2.5-1.5B-Instruct" \
--host 0.0.0.0 \
--port 23547
次に、4ノードでRL訓練を開始します。
export PROJ_DIR="<あなたのプロジェクトディレクトリ>"
export MASTER_IP="<マスターIP>" # rayマスターIP
export NNODES=4 # 総GPUノード数
export NODE_RANK=${RANK} # 現在のノードのランク
export PORT=6382
export WANDB_API_KEY="<あなたのWANDB_API_KEY>"
export WANDB_PROJECT="QwenLong-L1"
export LLM_JUDGE=Y # 'Y': LLM判定, 'N': ルールベース
export VLLM_ATTENTION_BACKEND=FLASH_ATTN
# 検証器
export VERIFIER_PATH="Qwen/Qwen2.5-1.5B-Instruct"
export VERIFIER_HOST="<検証器ホスト>"
export VERIFIER_PORT="23547"
ray_start_retry() {
while true; do
ray start --address="${MASTER_IP}:${PORT}"
if [ $? -eq 0 ]; then
break
fi
echo "マスターへの接続に失敗しました、5秒後に再試行します..."
sleep 5
done
}
check_ray_status() {
until ray status >/dev/null 2>&1; do
echo "Rayクラスタの準備を待っています..."
sleep 5
done
}
if [ "$RANK" == "0" ]; then
echo "HEADノードを起動しています..."
ray start --head --port=${PORT}
check_ray_status
echo "Rayヘッドノードが正常に起動しました"
else
echo "WORKERノードを起動しています..."
ray_start_retry
check_ray_status
echo "Rayクラスタに正常に参加しました"
fi
if [ "$RANK" == "0" ]; then
bash ${PROJ_DIR}/scripts/rl_4nodes_dapo.sh 2>&1 | tee ${PROJ_DIR}/logs/rl_log_$(date +%Y%m%d_%H%M%S).txt &
else
sleep 30d
fi
wait
評価
7つの長文脈DocQAベンチマークで評価を実施しました。これには2WikiMultihopQA、HotpotQA、Musique、NarrativeQA、Qasper、Framesなどのマルチホップ推論ベンチマークやDocMathなどの数学的推論ベンチマークが含まれます。RL訓練プロセスの報酬関数と一致するように、完全一致とLLM判定精度の最大値を最終スコアとして報告します。温度0.0のDeepSeek-V3を判定モデルとして使用し、信頼性の高い評価を提供します。
# ステップ1. 評価用にモデルをサーブ
export CUDA_VISIBLE_DEVICES="0,1,2,3,4,5,6,7"
MODEL_NAME="QwenLong-L1-32B"
MODEL_PATH="Tongyi-Zhiwen/QwenLong-L1-32B"
vllm serve ${MODEL_PATH} \
--port 23547 \
--api-key "token-abc123" \
--tensor-parallel-size 8 \
--gpu-memory-utilization 0.95 \
--max_model_len 131072 \
--trust-remote-code
# ステップ2. 各データセットに対するモデル応答を生成
export SERVE_HOST="<サーバーホスト>" # 例: 127.0.0.1
export SERVE_PORT="23547"
PROJ_DIR="<プロジェクトディレクトリ>"
DATA="<データ>" # 例: docmath, frames, 2wikimqa, hotpotqa, musique, narrativeqa, pasper
python ${PROJ_DIR}/eval/${DATA}.py \
--save_dir "${PROJ_DIR}/eval/results/${DATA}" \
--save_file "${MODEL_NAME}" \
--model "${MODEL_PATH}" \
--tokenizer "${MODEL_PATH}" \
--n_proc 16 \
--api "openai"
# ステップ3. 各データセットに対するモデル応答を検証
export VERIFIER_API="<APIキー>"
export VERIFIER_URL="https://api.deepseek.com/v1"
PROJ_DIR="<プロジェクトディレクトリ>"
DATA="<データ>" # 例: docmath, frames, 2wikimqa, hotpotqa, musique, narrativeqa, pasper
python ${PROJ_DIR}/eval/${DATA}_verify.py \
--save_dir "${PROJ_DIR}/results/${DATA}" \
--save_file "${MODEL_NAME}" \
--judge_model "deepseek-chat" \
--batch_size 20
引用
この研究があなたの研究やアプリケーションに関連している場合は、ぜひ私たちの研究を引用してください!
@article{wan2025qwenlongl1,
title={QwenLong-L1: : 強化学習による長文脈大規模推論モデルへのアプローチ},
author={Fanqi Wan, Weizhou Shen, Shengyi Liao, Yingcheng Shi, Chenliang Li, Ziyi Yang, Ji Zhang, Fei Huang, Jingren Zhou, Ming Yan},
journal={arXiv preprint arXiv:2505.17667},
year={2025}
}



