Mantendo o contexto entre partes
Use sobreposição, contexto contínuo e injeção de metadados para manter a continuidade.
Mantendo o contexto entre partes é uma aula grátis de AI Prompt Engineering no CoddyKit. Esta é a aula 4 de 4. Você pode ler a aula completa abaixo gratuitamente — depois pratica ao vivo no navegador com um editor de código integrado e um tutor de IA 24/7. Faz parte do caminho de aprendizado de AI Prompt Engineering, e seu progresso é sincronizado entre a web e o app CoddyKit. O curso de AI Prompt Engineering inclui 4 aulas no total.
O problema do contexto entre fragmentos
Quando um documento é dividido em fragmentos, as informações do fragmento N podem ser necessárias para interpretar corretamente o fragmento N+1. Por exemplo: um termo definido no fragmento 3 é usado no fragmento 7. Sem uma conexão de contexto, o modelo que processa o fragmento 7 não conhece essa definição.
Quatro estratégias resolvem esse problema: sobreposição, inserção de resumo acumulado, etiquetas de metadados e referências a números de página.
Estratégia 1: sobreposição de tokens
A sobreposição repete os últimos N tokens do fragmento N no início do fragmento N+1. Isso garante que uma sentença ou um argumento que atravesse um limite apareça completo em pelo menos um fragmento.
Sobreposição típica: 100–200 tokens (aproximadamente 75–150 palavras). Uma sobreposição grande demais aumenta a redundância e o custo; uma pequena demais deixa lacunas nos limites.
import tiktoken
enc = tiktoken.get_encoding('cl100k_base')
def chunk_with_overlap(text, max_tokens=1000, overlap=200):
tokens = enc.encode(text)
chunks = []
step = max_tokens - overlap
i = 0
while i < len(tokens):
chunk = tokens[i:i + max_tokens]
chunks.append(enc.decode(chunk))
i += step
return chunks
chunks = chunk_with_overlap(document, max_tokens=1000, overlap=200)
print(f'{len(chunks)} chunks with 200-token overlap')Sobreposição para recuperação versus sumarização
A sobreposição se comporta de maneira diferente conforme a tarefa:
- Recuperação: a sobreposição ajuda — uma consulta corresponde à região sobreposta em qualquer um dos dois fragmentos adjacentes, melhorando a cobertura. Use uma sobreposição de 10% a 20% do tamanho do fragmento.
- Sumarização: a sobreposição pode causar repetição — a mesma sentença é resumida duas vezes. Use uma sobreposição menor (5% a 10%) ou remova a sobreposição antes de resumir.
def strip_overlap(chunks, overlap_tokens=200):
'''Remove the leading overlap from each chunk (except the first).'''
cleaned = [chunks[0]]
for chunk in chunks[1:]:
tokens = enc.encode(chunk)
trimmed = enc.decode(tokens[overlap_tokens:])
cleaned.append(trimmed)
return cleanedEstratégia 2: Injeção do Resumo Progressivo
Um resumo progressivo é uma síntese contínua de todos os blocos processados até o momento. Antes de processar o bloco N, insira o resumo progressivo na instrução como contexto. Isso fornece ao modelo conhecimento do conteúdo anterior sem exceder a janela de contexto.
import openai
client = openai.OpenAI(api_key='sk-...')
def process_with_rolling_summary(chunks):
rolling_summary = ''
results = []
for i, chunk in enumerate(chunks):
context = ''
if rolling_summary:
context = f'Summary of previous sections:\n{rolling_summary}\n\n'
prompt = context + f'Current section:\n{chunk}'
resp = client.chat.completions.create(
model='gpt-4o',
messages=[
{'role': 'system', 'content': 'Answer questions or summarize, using prior context.'},
{'role': 'user', 'content': prompt}
]
)
result = resp.choices[0].message.content
results.append(result)
# Update rolling summary
rolling_summary = update_rolling_summary(rolling_summary, chunk)
return resultsAtualização do Resumo Progressivo
O resumo progressivo deve crescer gradualmente. Após processar cada bloco, peça ao LLM que atualize o resumo incorporando as novas informações desse bloco. Mantenha o resumo progressivo curto — 200–400 unidades de texto — para deixar espaço para o bloco atual.
def update_rolling_summary(current_summary, new_chunk, max_words=150):
if not current_summary:
prompt = f'Summarize the following in under {max_words} words:\n\n{new_chunk}'
else:
prompt = (
f'Current running summary (under {max_words} words):\n{current_summary}\n\n'
f'New section to incorporate:\n{new_chunk}\n\n'
f'Update the summary to include the new section. Stay under {max_words} words.'
)
resp = client.chat.completions.create(
model='gpt-4o-mini',
messages=[{'role': 'user', 'content': prompt}]
)
return resp.choices[0].message.contentEstratégia 3: Etiquetas de Metadados
Etiquetas de metadados associam informações estruturadas a cada bloco para que o LLM saiba o que está processando e possa manter a continuidade lógica.
Etiquetas comuns: document_title, chapter, section, page, chunk_index, total_chunks. Insira-as como cabeçalho na instrução, não no texto do bloco, para separar o conteúdo dos metadados.
def build_prompt_with_metadata(chunk, metadata):
header = (
f'Document: {metadata["title"]}\n'
f'Chapter: {metadata["chapter"]}\n'
f'Section: {metadata["section"]}\n'
f'Page: {metadata["page"]}\n'
f'Chunk: {metadata["chunk_index"] + 1} of {metadata["total_chunks"]}\n'
'---\n'
)
return header + chunk
prompt = build_prompt_with_metadata(
chunk=chunks[5],
metadata={
'title': 'Annual Report 2024',
'chapter': '3. Financial Results',
'section': '3.2 Revenue Breakdown',
'page': 42,
'chunk_index': 5,
'total_chunks': 120
}
)Estratégia 4: Referências a Números de Página
Quando um bloco faz referência a algo de uma página anterior, o modelo pode citá-lo se os números de página estiverem incorporados. Insira quebras de página como marcadores no texto antes de dividi-lo em blocos, para que elas permaneçam nos blocos:
def inject_page_markers(pages):
'''pages: list of strings, one per page.'''
marked = []
for i, page_text in enumerate(pages):
marked.append(f'[PAGE {i+1}]\n{page_text}')
return '\n\n'.join(marked)
# When the model sees [PAGE 12] in context, it can say
# 'As defined on page 12...' in its output, enabling traceability.
document_with_markers = inject_page_markers(pdf_pages)
chunks = chunk_with_overlap(document_with_markers)Combinação de Estratégias
Em produção, combine as quatro estratégias para obter a máxima fidelidade de contexto:
- Adicione marcadores de página antes de dividir em blocos
- Divida em blocos com sobreposição de 200 unidades de texto
- Anexe um cabeçalho de metadados à instrução de cada bloco
- Insira o resumo progressivo antes de cada bloco
A abordagem combinada garante que o modelo sempre saiba: onde está no documento, o que veio antes e como o bloco atual se relaciona com o todo.
def process_document(pages, doc_metadata):
# Step 1: inject page markers
full_text = inject_page_markers(pages)
# Step 2: chunk with overlap
chunks = chunk_with_overlap(full_text, max_tokens=900, overlap=150)
total = len(chunks)
rolling_summary = ''
results = []
for i, chunk in enumerate(chunks):
meta = {**doc_metadata, 'chunk_index': i, 'total_chunks': total}
prompt = build_prompt_with_metadata(chunk, meta)
if rolling_summary:
prompt = 'Prior context:\n' + rolling_summary + '\n\n' + prompt
result = call_llm(prompt)
results.append(result)
rolling_summary = update_rolling_summary(rolling_summary, chunk)
return resultsAvaliação da Retenção de Contexto
Para verificar se sua estratégia de contexto está funcionando, crie perguntas de teste que exijam informações de vários blocos:
- Defina um termo introduzido no bloco 2 e solicitado no bloco 8
- Calcule um total que abranja várias páginas
- Identifique uma contradição entre o capítulo 1 e o capítulo 5
Execute o fluxo de processamento e verifique se as respostas fazem referência corretamente ao conteúdo anterior. Se falharem, aumente a sobreposição ou o tamanho do resumo progressivo.
test_questions = [
{
'question': 'What is the definition of "net recurring revenue" used in this report?',
'defined_in_chunk': 2,
'asked_in_chunk': 9,
'expected_keywords': ['net recurring revenue', 'subscription', 'exclude']
}
]
def evaluate_context_retention(pipeline_results, test_questions):
for test in test_questions:
answer = pipeline_results[test['asked_in_chunk']]
for kw in test['expected_keywords']:
if kw.lower() not in answer.lower():
print(f'FAIL: missing "{kw}" in answer to chunk {test["asked_in_chunk"]}')Resumo das Compensações
Cada estratégia tem custos e benefícios:
- Sobreposição: simples, aumenta a quantidade de unidades de texto pelo percentual de sobreposição, pode causar repetição na síntese
- Resumo progressivo: poderoso, acrescenta uma chamada ao LLM por bloco, o resumo pode se desviar ou perder detalhes
- Etiquetas de metadados: gratuitas de adicionar, ajudam na orientação do modelo, não substituem o conteúdo
- Marcadores de página: permitem rastreabilidade, acrescentam caracteres ao texto, mas geram um acréscimo mínimo de unidades de texto
Comece com sobreposição + metadados. Adicione o resumo progressivo somente quando forem observadas falhas de contexto entre blocos nos testes.
Guia de Dimensionamento no Mundo Real
Tamanhos práticos para um documento de 100 páginas (média de 500 unidades de texto por página = 50.000 unidades de texto no total):
- Tamanho do bloco: 800 unidades de texto, sobreposição de 150 unidades de texto → ~73 blocos
- Resumo progressivo: no máximo 200 unidades de texto (atualizado após cada bloco)
- Cabeçalho de metadados: ~30 unidades de texto por bloco
- Entrada efetiva por chamada de API: 800 + 200 + 30 = 1030 unidades de texto
- Custo do mapeamento (gpt-4o-mini a $0.15/1M): 73 × 1030 × $0.15/1M ≈ $0.011
As estratégias de contexto acrescentam um custo mínimo e melhoram drasticamente a coerência.
Verificação de Conhecimento
Qual é a finalidade de um resumo progressivo no processamento de documentos bloco a bloco?
Recapitulação: Contexto entre Blocos
Quatro estratégias para manter o contexto entre blocos:
- Sobreposição: repita as últimas N unidades de texto do bloco N no início do bloco N+1
- Resumo progressivo: insira uma síntese contínua curta antes de cada bloco
- Etiquetas de metadados: cabeçalho com informações sobre documento, capítulo, seção e página
- Marcadores de página: incorpore os números de página ao texto antes de dividi-lo em blocos
Combine as quatro nos fluxos de processamento de produção. Teste a retenção de contexto entre blocos com perguntas que usem vários blocos. Isso conclui o Curso 16 sobre Estratégias para Processamento de Documentos Longos.
Perguntas Frequentes
A aula “Mantendo o contexto entre partes” é grátis?
Sim — o texto completo de “Mantendo o contexto entre partes” é grátis para ler aqui na web. Para praticá-la interativamente (um editor de código integrado e um tutor de IA 24/7) e desbloquear o restante do curso de AI Prompt Engineering, atualize para CoddyKit PRO. O curso de AI Prompt Engineering inclui 4 aulas no total.
O que vou aprender em “Mantendo o contexto entre partes”?
Use sobreposição, contexto contínuo e injeção de metadados para manter a continuidade. Você pratica AI Prompt Engineering com código prático que executa diretamente no navegador, e um tutor de IA 24/7 responde suas dúvidas enquanto trabalha na aula.
Preciso ter experiência prévia para começar AI Prompt Engineering?
Nenhuma experiência prévia é necessária. AI Prompt Engineering no CoddyKit é estruturado para alunos iniciantes até avançados, então você pode começar aqui ou desde o início e aprender no seu ritmo. Esta é a aula 4 de 4.
Quanto tempo leva a aula “Mantendo o contexto entre partes”?
A maioria das aulas CoddyKit leva cerca de 5–10 minutos. Cada uma é compacta e interativa, então você faz progresso constante e retoma exatamente de onde parou entre web e app.
Posso escrever e executar código nesta aula de AI Prompt Engineering?
Sim. Cada aula de AI Prompt Engineering inclui um editor de código integrado, então você escreve e executa código real direto no navegador e recebe feedback de IA instantaneamente — nenhuma configuração local necessária.
Todas as aulas deste curso
- Estratégias de divisão para textos longos
- Padrão de sumarização Map-Reduce
- Sumarização hierárquica
- Mantendo o contexto entre partes