Como perguntar à IA sobre um documento e verificar citações por linha
Respostas de IA sobre documentos ficam mais fáceis de verificar quando cada afirmação inclui citações com números de linha. Este guia usa uma pequena nota sintética, pede respostas com citações a um assistente de IA e verifica automaticamente cada intervalo com Python.
Conteúdo verificado 2026.09.21Inclui 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 éPara quem usa um assistente de chat com IA para responder perguntas sobre relatórios, notas, políticas ou outros documentos de texto e quer um fluxo simples para verificar as citações.
Preparação
Python 3.12
Um documento em texto simples cuja numeração de linhas possa permanecer estável durante a revisão
01Por que exigir citações com números de linha
Quando um assistente de chat com IA responde perguntas sobre um documento, o principal problema não é se a resposta parece fluida. O importante é verificar se cada afirmação é realmente sustentada pelo documento fornecido. Exigir citações com números de linha permite voltar diretamente à fonte sem precisar procurar manualmente em todo o arquivo.
Um fluxo útil separa duas verificações. Primeiro, o software pode confirmar se cada citação aponta para números de linha reais e mostrar novamente essas linhas. Depois, uma pessoa verifica se o texto citado realmente sustenta a afirmação. A verificação automática detecta referências quebradas ou impossíveis, mas sozinha não comprova suporte semântico suficiente.
02Crie um pequeno documento sintético
Considere esta nota sintética de projeto. Salve exatamente as sete linhas mostradas em um arquivo de texto simples chamado project_note.txt. Como o exemplo é intencionalmente pequeno, cada resposta e cada citação também podem ser conferidas manualmente.
Linha
Texto
L1
Project Atlas weekly note
L2
Prototype test moved from 12 Sep to 16 Sep.
L3
Reason: replacement sensor arrived late.
L4
Analysis owner: Mina.
L5
Draft results due 18 Sep.
L6
Final review meeting scheduled 21 Sep.
L7
Budget status unchanged.
Suponha que a pergunta seja: qual cronograma mudou, por que mudou e quais prazos vêm depois? A fonte informa claramente que o teste do protótipo passou de 12 Sep para 16 Sep, que o motivo foi a chegada tardia de um sensor de reposição, que os resultados preliminares vencem em 18 Sep e que a reunião final de revisão está marcada para 21 Sep.
03Exija um formato de citação estrito no prompt
Não peça apenas que a IA cite o documento. Defina um formato exato para que um script consiga analisar a resposta depois. Neste exemplo, cada frase factual deve terminar com uma citação como [L2-L3] ou [L5].
Diga à IA para usar somente o documento fornecido.
Exija citações exatamente no formato [Lx] ou [Lx-Ly].
Peça que ela não cite linhas que não sustentem diretamente a afirmação anterior.
Diga que deve informar quando o documento não fornece uma resposta em vez de inventar uma.
Mantenha o arquivo de origem inalterado durante a revisão para preservar a numeração das linhas.
04Inspecione uma resposta típica com citações
Uma resposta adequada poderia ser: O teste do protótipo passou de 12 Sep para 16 Sep porque o sensor de reposição chegou atrasado. [L2-L3] Os resultados preliminares vencem em 18 Sep, seguidos pela reunião final de revisão em 21 Sep. [L5-L6]
Essa resposta contém dois intervalos de citação. O primeiro deve corresponder às linhas 2 e 3, e o segundo às linhas 5 e 6. Antes de confiar na resposta, um verificador pode confirmar que esses intervalos existem e mostrar o texto de origem exato associado a cada citação.
05Verifique automaticamente cada citação com Python
Salve a resposta da IA em ai_answer.txt. O script abaixo lê project_note.txt e ai_answer.txt, extrai as citações com uma expressão regular, rejeita intervalos inválidos e grava um relatório de revisão em outputs/citation_check.txt. Ele nunca modifica o documento original nem a resposta da IA e para se o relatório de saída já existir.
python
import re
from pathlib import Path
DOCUMENT_FILE = Path("project_note.txt")
ANSWER_FILE = Path("ai_answer.txt")
OUTPUT_DIR = Path("outputs")
OUTPUT_FILE = OUTPUT_DIR / "citation_check.txt"
CITATION_RE = re.compile(r"\[L(\d+)(?:-L?(\d+))?\]")
def main():
if not DOCUMENT_FILE.is_file():
raise SystemExit(f"Document not found: {DOCUMENT_FILE}")
if not ANSWER_FILE.is_file():
raise SystemExit(f"AI answer not found: {ANSWER_FILE}")
if OUTPUT_FILE.exists():
raise SystemExit(f"Output already exists: {OUTPUT_FILE}")
lines = DOCUMENT_FILE.read_text(encoding="utf-8").splitlines()
answer = ANSWER_FILE.read_text(encoding="utf-8")
matches = list(CITATION_RE.finditer(answer))
if not matches:
raise SystemExit("No citations found in AI answer.")
report = []
report.append(f"document_lines={len(lines)}")
report.append(f"citations_found={len(matches)}")
report.append("")
invalid_count = 0
for index, match in enumerate(matches, start=1):
start = int(match.group(1))
end = int(match.group(2)) if match.group(2) else start
citation = match.group(0)
valid = 1 <= start <= end <= len(lines)
report.append(f"citation_{index}={citation}")
report.append(f"valid_range={valid}")
if not valid:
invalid_count += 1
report.append("source=INVALID LINE RANGE")
report.append("")
continue
for line_number in range(start, end + 1):
source_text = lines[line_number - 1]
report.append(f"L{line_number}: {source_text}")
report.append("")
report.append(f"invalid_citations={invalid_count}")
OUTPUT_DIR.mkdir(parents=True, exist_ok=True)
OUTPUT_FILE.write_text("\n".join(report) + "\n", encoding="utf-8")
print(f"Wrote: {OUTPUT_FILE}")
if __name__ == "__main__":
main()
06Compare cada afirmação com as linhas extraídas
Para a resposta sintética, o verificador deve encontrar duas citações e zero intervalos inválidos. [L2-L3] corresponde à mudança da data do teste e ao atraso do sensor de reposição. [L5-L6] corresponde ao prazo dos resultados preliminares e à reunião final de revisão.
Citação
Linhas esperadas
Conclusão manual
[L2-L3]
L2 e L3
Sustenta a mudança da data do teste e o motivo informado.
[L5-L6]
L5 e L6
Sustenta o prazo dos resultados preliminares e a data da revisão final.
Agora teste deliberadamente uma citação incorreta como [L8]. Como o documento sintético tem apenas sete linhas, o script deve marcar esse intervalo como inválido. Isso ajuda a detectar citações que parecem convincentes no texto, mas que não podem apontar para a fonte real.
07Evite erros comuns e entenda os limites
Não edite o documento de origem depois de gerar a resposta da IA; inserir ou remover linhas altera a numeração.
Não aceite nomes de página ou expressões vagas como citações se o verificador espera a sintaxe [Lx].
Não suponha que uma linha existente comprove uma afirmação apenas porque o intervalo citado é válido.
Verifique se a IA combina dois fatos de partes diferentes do documento, mas cita apenas um deles.
Exija que a IA informe quando o documento não contém evidência, em vez de preencher lacunas com conhecimento geral.
Em documentos longos, preserve uma cópia estável da fonte para que outros revisores possam reproduzir a mesma numeração de linhas.
Esse método funciona bem com texto simples, mas PDFs, planilhas, saída de OCR e documentos gerados dinamicamente podem não ter limites de linha estáveis. Nesses casos, pode ser mais confiável usar outra unidade de citação, como número da página, ID do parágrafo, ID da seção ou célula da tabela.
Portanto, o fluxo tem duas camadas: validação automática da sintaxe e dos intervalos das citações, seguida por verificação humana para saber se cada trecho citado realmente sustenta a resposta. Usadas em conjunto, essas duas verificações tornam perguntas sobre documentos mais auditáveis do que respostas de IA sem citações.
Registro de execução e verificação
2026-09-21 · hand-checked example · Python 3.12
O documento sintético contém exatamente 7 linhas, como mostrado no artigo.
A resposta de exemplo contém exatamente 2 intervalos de citação: [L2-L3] e [L5-L6].
[L2-L3] foi conferido manualmente com a fonte sintética e contém a mudança da data do teste do protótipo e o motivo informado.
[L5-L6] foi conferido manualmente com a fonte sintética e contém o prazo dos resultados preliminares e a data da reunião final de revisão.
Uma citação a [L8] fica fora do documento de 7 linhas e, portanto, deve ser marcada como intervalo inválido pela lógica apresentada.
A expressão regular aceita os formatos previstos [L2], [L2-L3] e [L2-3].
Limites da verificação
O código Python deste artigo não foi executado pelo autor; seu comportamento foi revisado manualmente.
O script valida a sintaxe das citações e se os intervalos de linhas referenciados existem; ele não determina se uma afirmação é semanticamente sustentada por essas linhas.
O exemplo pressupõe numeração estável em texto simples e não aborda erros de OCR, mudanças de layout em PDF, tabelas ou documentos cujas linhas sejam reformatadas entre etapas de revisão.
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.