本文へ移動
cccskills
無料GitHub で公開

long-context

Estenda janelas de contexto de modelos transformer usando RoPE, YaRN, ALiBi e técnicas de interpolação de posição. Use ao processar documentos longos (32k-128k+ tokens), estender modelos pré-treinados além dos limites de contexto originais ou implementar codificações posicionais eficientes. Cobre embeddings rotativos, vieses de atenção, métodos de interpolação e estratégias de extrapolação para LLMs.

インストール方法を見る

含まれるファイル(4)

  • SKILL.md15.9 KB
  • references/extension_methods.md14.2 KB
  • references/fine_tuning.md16.0 KB
  • references/rope.md11.8 KB

SKILL.md(原文)

インストールする前に、エージェントに与えられる指示の中身を確認できます。

Long Context: Estendendo Janelas de Contexto de Transformers

Quando Usar Esta Skill

Use técnicas de Long Context quando você precisa:

  • Processar documentos longos (32k, 64k, 128k+ tokens) com modelos transformer
  • Estender janelas de contexto de modelos pré-treinados (LLaMA, Mistral, etc.)
  • Implementar codificações posicionais eficientes (RoPE, ALiBi)
  • Treinar modelos com capacidades de extrapolação de comprimento
  • Fazer deploy de modelos que lidam com entradas de comprimento variável eficientemente
  • Fine-tunar modelos existentes para contextos mais longos com mínimo de computação

Técnicas-chave: RoPE (Rotary Position Embeddings), YaRN, ALiBi (Attention with Linear Biases), Position Interpolation

Papers: RoFormer (arXiv 2104.09864), YaRN (arXiv 2309.00071), ALiBi (arXiv 2108.12409), Position Interpolation (arXiv 2306.15595)

Instalação

# HuggingFace Transformers (inclui suporte RoPE, YaRN)
pip install transformers torch

# Para implementações customizadas
pip install einops  # Operações com tensores
pip install rotary-embedding-torch  # RoPE standalone

# Opcional: FlashAttention para eficiência
pip install flash-attn --no-build-isolation

Quick Start

RoPE (Rotary Position Embeddings)

import torch
import torch.nn as nn

class RotaryEmbedding(nn.Module):
    """Rotary Position Embeddings (RoPE)."""

    def __init__(self, dim, max_seq_len=8192, base=10000):
        super().__init__()
        # Compute inverse frequencies
        inv_freq = 1.0 / (base ** (torch.arange(0, dim, 2).float() / dim))
        self.register_buffer("inv_freq", inv_freq)
        self.max_seq_len = max_seq_len

    def forward(self, seq_len, device):
        # Position indices
        t = torch.arange(seq_len, device=device).type_as(self.inv_freq)

        # Compute frequencies
        freqs = torch.outer(t, self.inv_freq)  # (seq_len, dim/2)

        # Compute sin and cos
        emb = torch.cat((freqs, freqs), dim=-1)  # (seq_len, dim)
        return emb.cos(), emb.sin()

def rotate_half(x):
    """Rotate half the hidden dimensions."""
    x1, x2 = x.chunk(2, dim=-1)
    return torch.cat((-x2, x1), dim=-1)

def apply_rotary_pos_emb(q, k, cos, sin):
    """Apply rotary embeddings to queries and keys."""
    # q, k shape: (batch, heads, seq_len, dim)
    q_embed = (q * cos) + (rotate_half(q) * sin)
    k_embed = (k * cos) + (rotate_half(k) * sin)
    return q_embed, k_embed

# Usage
rope = RotaryEmbedding(dim=64, max_seq_len=8192)
cos, sin = rope(seq_len=2048, device='cuda')

# In attention layer
q_rotated, k_rotated = apply_rotary_pos_emb(query, key, cos, sin)

ALiBi (Attention with Linear Biases)

def get_alibi_slopes(num_heads):
    """Get ALiBi slope values for each attention head."""
    def get_slopes_power_of_2(n):
        start = 2 ** (-(2 ** -(math.log2(n) - 3)))
        ratio = start
        return [start * (ratio ** i) for i in range(n)]

    if math.log2(num_heads).is_integer():
        return get_slopes_power_of_2(num_heads)
    else:
        # Closest power of 2
        closest_power = 2 ** math.floor(math.log2(num_heads))
        slopes = get_slopes_power_of_2(closest_power)
        # Add extra slopes
        extra = get_slopes_power_of_2(2 * closest_power)
        slopes.extend(extra[0::2][:num_heads - closest_power])
        return slopes

def create_alibi_bias(seq_len, num_heads):
    """Create ALiBi attention bias."""
    # Distance matrix
    context_position = torch.arange(seq_len)
    memory_position = torch.arange(seq_len)
    relative_position = memory_position[None, :] - context_position[:, None]

    # Get slopes
    slopes = torch.tensor(get_alibi_slopes(num_heads))

    # Apply slopes to distances
    alibi = slopes[:, None, None] * relative_position[None, :, :]
    return alibi  # (num_heads, seq_len, seq_len)

# Usage in attention
num_heads = 8
seq_len = 2048
alibi_bias = create_alibi_bias(seq_len, num_heads).to('cuda')

# Add bias to attention scores
# attn_scores shape: (batch, num_heads, seq_len, seq_len)
attn_scores = attn_scores + alibi_bias
attn_weights = torch.softmax(attn_scores, dim=-1)

Position Interpolation para LLaMA

from transformers import LlamaForCausalLM, LlamaTokenizer

# Contexto original: 2048 tokens
model = LlamaForCausalLM.from_pretrained("meta-llama/Llama-2-7b-hf")

# Estender para 32k com interpolação de posição
# Modificar frequência base RoPE
model.config.rope_scaling = {
    "type": "linear",
    "factor": 16.0  # 2048 * 16 = 32768
}

# Ou usar scaling dinâmico
model.config.rope_scaling = {
    "type": "dynamic",
    "factor": 16.0
}

# Fine-tunar com documentos longos (apenas passos mínimos necessários)
# Interpolação de posição funciona automaticamente após esta mudança de config

Conceitos Principais

1. RoPE (Rotary Position Embeddings)

Como funciona:

  • Codifica posição absoluta via matriz de rotação
  • Fornece dependência de posição relativa em atenção
  • Permite extrapolação de comprimento

Formulação matemática:

q_m = (W_q * x_m) * e^(imθ)
k_n = (W_k * x_n) * e^(inθ)

where θ_j = base^(-2j/d) for j ∈ [0, d/2)

Vantagens:

  • Dependência entre tokens decaindo com distância
  • Compatível com atenção linear
  • Melhor extrapolação que codificações de posição absoluta

2. YaRN (Yet another RoPE extensioN)

Inovação-chave:

  • Interpolação consciente de NTK (Neural Tangent Kernel)
  • Scaling de temperatura de atenção
  • Extensão de contexto eficiente (10× menos tokens vs baselines)

Parâmetros:

# Configuração YaRN
yarn_config = {
    "scale": 16,                    # Fator de extensão
    "original_max_position": 2048,  # Contexto base
    "extrapolation_factor": 1.0,    # Parâmetro NTK
    "attn_factor": 1.0,             # Scaling de atenção
    "beta_fast": 32,                # Escala de alta frequência
    "beta_slow": 1,                 # Escala de baixa frequência
}

Performance:

  • Estende LLaMA para 128k tokens
  • 2.5× menos passos de treinamento que baselines
  • Extensão de janela de contexto state-of-the-art

3. ALiBi (Attention with Linear Biases)

Ideia principal:

  • Sem embeddings posicionais adicionados aos tokens
  • Aplicar penalidade de distância diretamente aos scores de atenção
  • Viés proporcional à distância entre chave e consulta

Fórmula:

attention_bias[i, j] = -m * |i - j|

where m = slope para cada cabeça de atenção

Vantagens:

  • 11% mais rápido em treinamento vs embeddings sinusoidais
  • 11% menos uso de memória
  • Extrapolação de comprimento forte (treinar 1k, testar 2k+)
  • Viés indutivo para recência

4. Position Interpolation

Técnica:

  • Escalar linearmente para baixo índices de posição
  • Interpolar dentro do intervalo treinado (vs extrapolar além)
  • Fine-tuning mínimo necessário

Fórmula:

# Original: índices de posição [0, 1, 2, ..., L]
# Extended: índices de posição [0, 0.5, 1.0, ..., L/2]
# (para extensão 2×)

scaled_position[i] = i / extension_factor

Resultados:

  • LLaMA 7B-65B estendido para 32k tokens
  • 1000 passos de fine-tuning suficientes
  • 600× melhor estabilidade que extrapolação

Comparação de Métodos

MétodoMax ContextTreinamento NecessárioMemóriaExtrapolaçãoMelhor Para
RoPE8k-32kPré-treinamento completoModeradoBomNovos modelos
YaRN32k-128kMínimo (10× eficiente)ModeradoExcelenteEstender modelos existentes
ALiBiIlimitadoPré-treinamento completoBaixo (-11%)ExcelenteTreinar do zero
Position Interpolation32k+Mínimo (1k passos)ModeradoFraco (por design)Extensão rápida

Padrões de Implementação

Integração HuggingFace Transformers

from transformers import AutoModelForCausalLM, AutoConfig

# RoPE com scaling YaRN
config = AutoConfig.from_pretrained("mistralai/Mistral-7B-v0.1")
config.rope_scaling = {
    "type": "yarn",
    "factor": 8.0,
    "original_max_position_embeddings": 8192,
    "attention_factor": 1.0
}

model = AutoModelForCausalLM.from_config(config)

# Position interpolation (mais simples)
config.rope_scaling = {
    "type": "linear",
    "factor": 4.0
}

# Dynamic scaling (ajusta baseado no comprimento da entrada)
config.rope_scaling = {
    "type": "dynamic",
    "factor": 8.0
}

Implementação RoPE Customizada

class LongContextAttention(nn.Module):
    """Atenção multi-cabeça com RoPE."""

    def __init__(self, hidden_size, num_heads, max_seq_len=32768):
        super().__init__()
        self.num_heads = num_heads
        self.head_dim = hidden_size // num_heads

        # Projeções Q, K, V
        self.q_proj = nn.Linear(hidden_size, hidden_size)
        self.k_proj = nn.Linear(hidden_size, hidden_size)
        self.v_proj = nn.Linear(hidden_size, hidden_size)
        self.o_proj = nn.Linear(hidden_size, hidden_size)

        # RoPE
        self.rotary_emb = RotaryEmbedding(
            dim=self.head_dim,
            max_seq_len=max_seq_len
        )

    def forward(self, hidden_states):
        batch_size, seq_len, _ = hidden_states.shape

        # Projetar para Q, K, V
        q = self.q_proj(hidden_states)
        k = self.k_proj(hidden_states)
        v = self.v_proj(hidden_states)

        # Remodelar para multi-cabeça
        q = q.view(batch_size, seq_len, self.num_heads, self.head_dim).transpose(1, 2)
        k = k.view(batch_size, seq_len, self.num_heads, self.head_dim).transpose(1, 2)
        v = v.view(batch_size, seq_len, self.num_heads, self.head_dim).transpose(1, 2)

        # Aplicar RoPE
        cos, sin = self.rotary_emb(seq_len, device=hidden_states.device)
        q, k = apply_rotary_pos_emb(q, k, cos, sin)

        # Atenção padrão
        attn_output = F.scaled_dot_product_attention(q, k, v)

        # Remodelar e projetar
        attn_output = attn_output.transpose(1, 2).contiguous()
        attn_output = attn_output.view(batch_size, seq_len, -1)
        output = self.o_proj(attn_output)

        return output

Fine-tuning para Long Context

Fine-tuning Mínimo (Position Interpolation)

from transformers import Trainer, TrainingArguments

# Estender config do modelo
model.config.max_position_embeddings = 32768
model.config.rope_scaling = {"type": "linear", "factor": 16.0}

# Argumentos de treinamento (passos mínimos necessários)
training_args = TrainingArguments(
    output_dir="./llama-32k",
    num_train_epochs=1,
    max_steps=1000,           # Apenas 1000 passos!
    per_device_train_batch_size=1,
    gradient_accumulation_steps=16,
    learning_rate=2e-5,
    warmup_steps=100,
    logging_steps=10,
    save_steps=500,
)

# Treinar em documentos longos
trainer = Trainer(
    model=model,
    args=training_args,
    train_dataset=long_document_dataset,  # Sequências de 32k tokens
)

trainer.train()

Fine-tuning com YaRN

# Clonar implementação YaRN
git clone https://github.com/jquesnelle/yarn
cd yarn

# Fine-tunar LLaMA com YaRN
python scripts/train.py \
    --model meta-llama/Llama-2-7b-hf \
    --scale 16 \
    --rope_theta 10000 \
    --max_length 32768 \
    --batch_size 1 \
    --gradient_accumulation 16 \
    --steps 400 \
    --learning_rate 2e-5

Boas Práticas

1. Escolher o Método Correto

# Para NOVOS modelos (treinando do zero)
use_method = "ALiBi"  # Melhor extrapolação, menor memória

# Para ESTENDER modelos RoPE existentes
use_method = "YaRN"  # Extensão mais eficiente (10× menos dados)

# Para EXTENSÃO RÁPIDA com mínimo de computação
use_method = "Position Interpolation"  # 1000 passos

# Para EXTENSÃO MODERADA com boa eficiência
use_method = "Linear RoPE Scaling"  # Built-in, simples

2. Seleção do Fator de Scaling

# Conservador (mais seguro, melhor qualidade)
scaling_factor = 2.0  # 8k → 16k

# Moderado (bom equilíbrio)
scaling_factor = 4.0  # 8k → 32k

# Agressivo (requer mais fine-tuning)
scaling_factor = 8.0  # 8k → 64k
scaling_factor = 16.0  # 8k → 128k

# Regra: Fatores maiores precisam de mais passos de fine-tuning
steps_needed = 100 * scaling_factor  # Estimativa aproximada

3. Dados para Fine-tuning

# ✅ Bom: Documentos longos combinando comprimento alvo
train_data = [
    {"text": long_doc_32k_tokens},  # 32k completo
    {"text": long_doc_24k_tokens},  # Comprimentos variados
    {"text": long_doc_16k_tokens},
]

# ❌ Ruim: Documentos curtos (não aprenderá contexto longo)
train_data = [
    {"text": short_doc_2k_tokens},
]

# Use datasets como:
# - PG-19 (livros, textos longos)
# - Artigos arXiv
# - Conversas longas
# - Repositórios GitHub (arquivos concatenados)

4. Evitar Armadilhas Comuns

# ❌ Ruim: Aplicar position interpolation sem fine-tuning
model.config.rope_scaling = {"type": "linear", "factor": 16.0}
# Modelo terá performance ruim sem fine-tuning!

# ✅ Bom: Fine-tunar após scaling
model.config.rope_scaling = {"type": "linear", "factor": 16.0}
fine_tune(model, long_documents, steps=1000)

# ❌ Ruim: Scaling muito agressivo sem dados
scale_to_1M_tokens()  # Não funcionará sem fine-tuning massivo

# ✅ Bom: Scaling incremental
# 8k → 16k → 32k → 64k (fine-tunar em cada passo)

Deploy em Produção

Inferência com Long Context

from transformers import AutoModelForCausalLM, AutoTokenizer

# Carregar modelo com long-context
model = AutoModelForCausalLM.from_pretrained(
    "togethercomputer/LLaMA-2-7B-32K",  # 32k de contexto
    torch_dtype=torch.float16,
    device_map="auto"
)
tokenizer = AutoTokenizer.from_pretrained("togethercomputer/LLaMA-2-7B-32K")

# Processar documento longo
long_text = "..." * 30000  # 30k tokens
inputs = tokenizer(long_text, return_tensors="pt", truncation=False).to('cuda')

# Gerar
outputs = model.generate(
    **inputs,
    max_new_tokens=512,
    temperature=0.7,
)

response = tokenizer.decode(outputs[0], skip_special_tokens=True)

Otimização de Memória

# Usar gradient checkpointing para fine-tuning
model.gradient_checkpointing_enable()

# Usar Flash Attention 2
model = AutoModelForCausalLM.from_pretrained(
    "meta-llama/Llama-2-7b-hf",
    attn_implementation="flash_attention_2",  # 2-3× mais rápido
    torch_dtype=torch.float16
)

# Usar paged attention (vLLM)
from vllm import LLM

llm = LLM(
    model="togethercomputer/LLaMA-2-7B-32K",
    max_model_len=32768,  # 32k de contexto
    gpu_memory_utilization=0.9
)

Recursos

Veja Também

  • references/rope.md - Implementação detalhada e teoria de RoPE
  • references/extension_methods.md - Comparações YaRN, ALiBi, Position Interpolation
  • references/fine_tuning.md - Guia completo de fine-tuning para extensão de contexto

レビュー

まだレビューはありません。使ってみた感想をお寄せください。

同じリポジトリのスキル

概要と使いどころ

Especialista em construir experiências 3D para a web - Three.js, React Three Fiber, Spline, WebGL e cenas 3D interativas. Cobre configuradores de produtos, portfólios 3D, websites imersivos e adição de profundidade às experiências web. Use quando: website 3D, three.js, WebGL, react three fiber, experiência 3D.

日本語の概要は準備中です。原文の説明を表示しています。

artubss/SKILLS-CLAUDE-CODE112026年5月17日 更新

Quando o usuário quer planejar, projetar ou implementar um teste A/B ou experimento. Também use quando o usuário menciona "teste A/B", "split test", "experimento", "testar essa mudança", "copy variante", "teste multivariado" ou "hipótese". Para implementação de rastreamento, veja analytics-tracking.

日本語の概要は準備中です。原文の説明を表示しています。

artubss/SKILLS-CLAUDE-CODE112026年5月17日 更新

Auditar e melhorar a acessibilidade web seguindo as diretrizes WCAG 2.1. Use quando solicitado para "melhorar acessibilidade", "auditoria a11y", "conformidade WCAG", "suporte a leitor de tela", "navegação por teclado" ou "tornar acessível".

日本語の概要は準備中です。原文の説明を表示しています。

artubss/SKILLS-CLAUDE-CODE112026年5月17日 更新

Testes e benchmarking de agentes LLM incluindo testes comportamentais, avaliação de capacidades, métricas de confiabilidade e monitoramento em produção—onde até os melhores agentes alcançam menos de 50% em benchmarks do mundo real. Use quando: testes de agentes, avaliação de agentes, benchmark de agentes, confiabilidade de agentes, teste de agentes.

日本語の概要は準備中です。原文の説明を表示しています。

artubss/SKILLS-CLAUDE-CODE112026年5月17日 更新

Criar, gerenciar e orquestrar agentes de IA usando o CLI AI Maestro. Use quando o usuário pedir para "criar agente", "listar agentes", "deletar agente", "hibernar agente", "despertar agente", "instalar plugin", "mostrar agente", "reiniciar agente" ou qualquer tarefa de gerenciamento do ciclo de vida do agente.

日本語の概要は準備中です。原文の説明を表示しています。

artubss/SKILLS-CLAUDE-CODE112026年5月17日 更新

Gerencie múltiplos agentes CLI locais via sessões tmux (iniciar/parar/monitorar/atribuir) com agendamento compatível com cron.

日本語の概要は準備中です。原文の説明を表示しています。

artubss/SKILLS-CLAUDE-CODE112026年5月17日 更新

artubss のスキルをすべて見る

このスキルの問題を報告する