Verificar um resumo de IA frase por frase em relação à fonte
Separe um resumo de IA em afirmações individuais, relacione cada uma a frases específicas da fonte e marque afirmações sem suporte ou exageradas antes de reutilizá-las. Um pequeno documento sintético mostra por que até resumos fluentes precisam de verificação de evidências.
Conteúdo verificado 2026.09.20Inclui arquivos de exemplo
Ver o sumário
A tradução foi feita com IA. Confira o código, as unidades e os valores junto com o original. A revisão por falantes nativos de cada idioma ainda não foi concluída. English
Para quem éEste guia é para quem usa IA para resumir relatórios, notas ou material de pesquisa e quer uma revisão rastreável frase por frase.
Preparação
Python 3.12 e um comando de terminal que inicie essa versão.
Um editor de texto capaz de salvar arquivos de texto e CSV em UTF-8.
Uma pasta de trabalho em que o script possa criar uma nova pasta dentro de outputs.
É necessária apenas a biblioteca padrão do Python: csv e pathlib.
01Trate cada frase do resumo como uma afirmação
Um resumo de IA pode estar gramaticalmente correto e ainda assim alterar uma causa, remover uma limitação ou acrescentar uma conclusão que a fonte nunca apresentou. Por isso, uma revisão útil faz uma pergunta simples para cada frase do resumo: qual parte exata da fonte sustenta esta afirmação?
Este tutorial usa três veredictos. SUPPORTED significa que a fonte sustenta diretamente a frase. PARTIAL significa que apenas parte da frase tem suporte ou que falta uma condição importante. UNSUPPORTED significa que a fonte não sustenta a afirmação ou a contradiz.
02Crie um documento-fonte sintético e um resumo de IA
A fonte e o resumo a seguir são sintéticos e foram escritos especificamente para este artigo. Salve o primeiro bloco como source.txt e o segundo como ai_summary.txt.
text
S1|The pilot processed 20 test cases.
S2|Eighteen cases completed successfully.
S3|Two cases stopped during input validation before the solver started.
S4|Among the 18 completed cases, the median runtime was 42 seconds.
S5|The test was performed on one workstation under the same software configuration.
S6|No production deployment or long-term reliability test was performed.
text
A1|The pilot processed 20 cases, and 18 completed successfully.
A2|Two cases failed because the solver crashed.
A3|The median runtime for completed cases was 42 seconds.
A4|The results show that the automation is reliable enough for production use.
A fonte contém 6 frases. O resumo de IA contém 4 frases. Os valores são intencionalmente pequenos para permitir verificação sem software.
03Compare cada frase do resumo com a fonte
A1 é sustentada por S1 e S2. A2 é contradita por S3: a fonte diz que os dois casos pararam durante input validation antes de o solver começar, e não por falhas do solver. A3 é sustentada diretamente por S4. A4 vai além das evidências porque S6 afirma explicitamente que não houve production deployment nem long-term reliability test.
ID do resumo
Veredicto
Evidência
Motivo
A1
SUPPORTED
S1;S2
A quantidade de casos e as conclusões bem-sucedidas correspondem à fonte.
A2
UNSUPPORTED
S3
A fonte atribui as interrupções a input validation antes do início do solver.
A3
SUPPORTED
S4
A median runtime de 42 segundos é informada para os 18 casos concluídos.
A4
UNSUPPORTED
S6
A prontidão para produção não foi testada.
Portanto, a revisão esperada contém 2 frases SUPPORTED e 2 UNSUPPORTED. Nenhuma das quatro frases sintéticas exige a classificação PARTIAL.
04Registre a revisão em um CSV rastreável
Salve o conteúdo a seguir como summary_review.csv. A coluna evidence contém IDs das frases da fonte, em vez de parágrafos copiados, mantendo a revisão compacta sem perder a rastreabilidade.
csv
summary_id,verdict,evidence,reason
A1,SUPPORTED,S1;S2,The case count and successful completions match the source.
A2,UNSUPPORTED,S3,The source attributes the stops to input validation before solver start.
A3,SUPPORTED,S4,The 42-second median is stated for the 18 completed cases.
A4,UNSUPPORTED,S6,Production readiness was not tested.
Esta revisão continua sendo um julgamento humano. O próximo script não decide se uma afirmação é verdadeira. Ele verifica se cada frase do resumo de IA recebeu um veredicto válido e se cada ID de fonte citado realmente existe.
05Verifique se todas as frases foram revisadas
Salve o script a seguir como check_summary_review.py. Ele lê a fonte, o resumo e o CSV de revisão concluído, verifica IDs e veredictos e grava um novo relatório validado sem modificar nenhum arquivo de entrada.
python
import csv
from pathlib import Path
SOURCE = Path("source.txt")
SUMMARY = Path("ai_summary.txt")
REVIEW = Path("summary_review.csv")
OUTPUT_DIR = Path("outputs") / "summary_source_check"
OUTPUT = OUTPUT_DIR / "validated_review.csv"
VALID_VERDICTS = {"SUPPORTED", "PARTIAL", "UNSUPPORTED"}
def read_id_text(path: Path) -> dict[str, str]:
result = {}
with path.open("r", encoding="utf-8") as stream:
for line_number, line in enumerate(stream, start=1):
line = line.rstrip("\n")
if not line:
continue
item_id, separator, text = line.partition("|")
if not separator or not item_id or not text:
raise ValueError(f"Invalid line {line_number} in {path}.")
if item_id in result:
raise ValueError(f"Duplicate ID {item_id} in {path}.")
result[item_id] = text
return result
def main() -> None:
for path in (SOURCE, SUMMARY, REVIEW):
if not path.is_file():
raise FileNotFoundError(f"Missing input: {path}")
if OUTPUT_DIR.exists():
raise FileExistsError(f"Output folder already exists: {OUTPUT_DIR}")
source = read_id_text(SOURCE)
summary = read_id_text(SUMMARY)
reviewed = {}
with REVIEW.open("r", encoding="utf-8-sig", newline="") as stream:
reader = csv.DictReader(stream)
required = {"summary_id", "verdict", "evidence", "reason"}
if reader.fieldnames is None or not required.issubset(reader.fieldnames):
raise ValueError("Review CSV is missing a required column.")
for row in reader:
summary_id = row["summary_id"].strip()
verdict = row["verdict"].strip()
evidence_ids = [x.strip() for x in row["evidence"].split(";") if x.strip()]
if summary_id not in summary:
raise ValueError(f"Unknown summary ID: {summary_id}")
if summary_id in reviewed:
raise ValueError(f"Duplicate review: {summary_id}")
if verdict not in VALID_VERDICTS:
raise ValueError(f"Invalid verdict for {summary_id}: {verdict}")
if not evidence_ids:
raise ValueError(f"No evidence listed for {summary_id}.")
unknown = [item for item in evidence_ids if item not in source]
if unknown:
raise ValueError(f"Unknown source IDs for {summary_id}: {unknown}")
if not row["reason"].strip():
raise ValueError(f"Missing reason for {summary_id}.")
reviewed[summary_id] = {
"summary_id": summary_id,
"summary_text": summary[summary_id],
"verdict": verdict,
"evidence": ";".join(evidence_ids),
"reason": row["reason"].strip(),
}
missing = [item for item in summary if item not in reviewed]
if missing:
raise ValueError(f"Summary sentences not reviewed: {missing}")
OUTPUT_DIR.parent.mkdir(parents=True, exist_ok=True)
OUTPUT_DIR.mkdir()
fields = ["summary_id", "summary_text", "verdict", "evidence", "reason"]
with OUTPUT.open("x", encoding="utf-8", newline="") as stream:
writer = csv.DictWriter(stream, fieldnames=fields)
writer.writeheader()
for summary_id in summary:
writer.writerow(reviewed[summary_id])
counts = {verdict: 0 for verdict in VALID_VERDICTS}
for row in reviewed.values():
counts[row["verdict"]] += 1
print(f"Summary sentences checked: {len(summary)}.")
print(
f"Supported: {counts['SUPPORTED']}; partial: {counts['PARTIAL']}; "
f"unsupported: {counts['UNSUPPORTED']}."
)
print(f"Output: {OUTPUT.as_posix()}")
if __name__ == "__main__":
main()
06Confira o resultado esperado
Na revisão sintética acima, as 4 frases do resumo têm um veredicto válido e referências válidas à fonte. A saída esperada do console aparece abaixo. Ela foi derivada manualmente e não é um log de execução.
Confirme que cada A-ID apareça exatamente uma vez na revisão.
Confirme que cada S-ID citado exista em source.txt.
Confirme que afirmações UNSUPPORTED não tenham sido reescritas silenciosamente como SUPPORTED.
Mantenha o resumo original da IA sem alterações para que a revisão continue auditável.
Execute o script novamente sem alterar OUTPUT_DIR. Ele deve parar com FileExistsError em vez de sobrescrever a validação anterior.
07Reconheça erros comuns e limites
Problema
O que fazer
Uma frase do resumo contém duas afirmações separadas
Divida a frase em unidades do tamanho de uma afirmação ou revise cada afirmação separadamente.
A evidência sustenta apenas parte da frase
Use PARTIAL e registre a condição ausente na coluna reason.
A fonte não diz nada sobre uma conclusão
Marque como UNSUPPORTED em vez de tratar uma inferência plausível como um fato sustentado pela fonte.
Uma frase da fonte é citada, mas não sustenta de fato a afirmação
Corrija a revisão humana; IDs válidos sozinhos não comprovam suporte semântico.
Fontes diferentes discordam
Registre explicitamente a divergência em vez de forçar uma única conclusão sem suporte.
O script em Python valida a completude da revisão e os IDs de referência, não a verdade. O suporte semântico ainda exige leitura humana ou um processo separado de avaliação de evidências. Um veredicto humano incorreto pode passar pelo verificador estrutural.
Para relatórios longos, use números de página, IDs de parágrafo, números de tabela ou localizações exatas de citações em vez de referências informais. Também diferencie afirmações diretas da fonte, cálculos, interpretações e conhecimento externo. Um resumo não deve transformar silenciosamente uma categoria em outra.
Foram verificadas manualmente 4 frases sintéticas do resumo em relação a 6 frases sintéticas da fonte.
A1 e A3 foram classificadas como SUPPORTED e A2 e A4 como UNSUPPORTED.
Foi confirmado que A2 entra em conflito com S3 porque a fonte diz que input validation interrompeu os casos antes do início do solver.
Foi confirmado que A4 vai além da fonte porque S6 diz que production deployment e long-term reliability não foram testados.
As contagens esperadas foram calculadas manualmente como 2 supported, 0 partial e 2 unsupported.
O script foi inspecionado quanto a revisões ausentes, IDs duplicados, veredictos inválidos, IDs de fonte desconhecidos, proteção contra colisão de saída e geração de relatório.
Limites da verificação
O autor desta resposta não executou o código; nenhum CSV de validação foi criado.
O verificador estrutural não determina se uma fonte citada sustenta semanticamente uma afirmação.
Apenas a fonte e o resumo sintéticos mostrados aqui foram revisados; documentos longos, tabelas, figuras e fontes conflitantes não foram testados.
As URLs da documentação oficial foram fornecidas a partir de locais conhecidos, mas não foram verificadas em tempo real.
Transforme “automatize isso” em uma descrição de tarefa executável. Anexe uma amostra sintética sem dados sensíveis e um resultado esperado verificado manualmente para completar uma solicitação de script que totaliza registros de trabalho por equipe.
Verifique uma função de agregação com quatro linhas que você pode calcular manualmente e 12 unit tests. Verifique não apenas valores normais, mas também entrada vazia, zero, decimais e entrada inválida.
Separe um resumo plausível em fatos, cálculos e interpretações. Recalcule proporções e médias a partir de dados mensais sintéticos e reescreva frases com fontes ausentes ou causas exageradas como afirmações que possam ser verificadas.
Trate uma regex gerada por IA como um rascunho, não como uma regra final. Monte uma pequena tabela de testes sintéticos, compare os resultados esperados com as correspondências reais, revise o padrão e salve um relatório de revisão antes de usá-lo em dados reais.