AI 업무 활용

AI가 인용한 참고자료와 링크가 실제로 존재하는지 확인하기

AI가 제시한 참고자료는 그럴듯해 보여도 링크가 존재하지 않거나 실제 문서 내용이 AI의 설명과 다를 수 있습니다. 작은 합성 예제로 링크 존재 여부와 출처가 실제 주장과 관련 있는지를 함께 확인합니다.

목차 보기

이런 분께AI 채팅 도우미를 조사, 보고서, 문서 작성에 활용하면서 인용된 참고자료를 직접 검증하고 싶은 사람을 위한 글입니다.

준비사항
  • Python 3.12
  • URL 확인 스크립트를 실행할 때 인터넷 연결

01AI가 만든 참고자료를 왜 확인해야 할까?

전문적으로 보이는 참고자료라고 해서 자동으로 신뢰할 수 있는 것은 아닙니다. AI 답변에는 실제 URL이지만 설명이 부정확한 경우, 더 이상 존재하지 않는 URL, 또는 완전히 만들어진 참고자료가 포함될 수 있습니다. 따라서 검증은 두 가지 질문으로 나눠야 합니다. 참고자료가 실제로 존재하는지, 그리고 그 자료가 AI의 주장을 실제로 뒷받침하는지 확인해야 합니다.

  • 존재 여부 확인: URL에 접속할 수 있고 정상적인 웹 응답이 반환되는가?
  • 내용 확인: 가져온 페이지에 AI가 주장한 내용과 관련된 정보가 실제로 있는가?
  • 출처 확인: 페이지가 AI가 언급한 기관, 발행처, 공식 문서 사이트의 자료가 맞는가?
  • 사람의 최종 검토: 몇 개의 키워드가 일치하는 수준이 아니라 전체 주장을 실제로 뒷받침하는가?

02작은 합성 예제로 확인하기

다음 예시는 합성 데이터입니다. AI 채팅 도우미에게 URL 열기와 JSON 처리를 설명하는 Python 표준 라이브러리 공식 문서를 물어봤다고 가정합니다. 업무 노트에 참고자료를 넣기 전에 답변을 직접 검증하려는 상황입니다.

AI에게 요청할 내용: URL을 여는 방법과 JSON을 읽고 쓰는 방법에 대한 공식 Python 참고자료를 알려줘. 각 참고자료가 뒷받침하는 구체적인 주장 하나와 정확한 URL도 함께 제시해줘.

참고자료AI의 주장URL
urllib.requestPython은 URL을 열기 위한 urllib.request를 제공한다.https://docs.python.org/3/library/urllib.request.html
jsonPython의 json 모듈은 JSON 인코딩과 디코딩 기능을 제공한다.https://docs.python.org/3/library/json.html
합성 가짜 참고자료이 페이지는 AI 전용 참고자료 검증기를 설명한다.https://example.invalid/fake-reference

세 번째 행은 이 합성 예제를 위해 의도적으로 만든 가짜 참고자료입니다. 목표는 인용 형식이 그럴듯하다는 이유로 믿는 것이 아니라, 검증 과정에서 이런 항목을 찾아내는 것입니다.

03AI 답변을 명확한 확인 항목으로 바꾸기

Python에게 자연어 주장이 전체적으로 참인지 판단하게 하지 않는 것이 좋습니다. 대신 URL, AI의 주장, 그리고 해당 페이지가 관련 있다면 나타날 가능성이 높은 몇 개의 검색어를 기록합니다. 이 검색어는 어디까지나 빠른 선별을 위한 보조 수단입니다.

URL확인할 단어
https://docs.python.org/3/library/urllib.request.htmlurllib.request; URL
https://docs.python.org/3/library/json.htmljson; encoding; decoding
https://example.invalid/fake-referencereference; verifier
  1. AI가 반환한 각 URL을 그대로 복사합니다.
  2. URL만 확인하지 말고 그 옆에 AI의 주장도 함께 기록합니다.
  3. 페이지 관련성을 빠르게 확인할 수 있는 특징적인 단어 몇 개만 고릅니다.
  4. 자동 확인이 끝난 뒤 실제로 인용할 모든 참고자료는 직접 열어 관련 부분을 읽습니다.

04Python으로 URL과 페이지 텍스트 확인하기

다음 표준 라이브러리 스크립트는 각 페이지를 요청하고, 최종 URL과 HTTP 상태를 기록하고, 기본적인 화면 텍스트를 추출한 뒤 지정한 검색어가 포함되는지 확인합니다. 결과는 outputs/reference_check.json에 저장합니다. 이전 검토 결과를 덮어쓰지 않도록 outputs 폴더가 이미 존재하면 실행을 중단합니다.

python
from pathlib import Path
from urllib.request import Request, urlopen
from urllib.error import HTTPError, URLError
import html
import json
import re

checks = [
    {
        "reference": "urllib.request",
        "url": "https://docs.python.org/3/library/urllib.request.html",
        "claim": "Python provides urllib.request for opening URLs.",
        "terms": ["urllib.request", "URL"],
    },
    {
        "reference": "json",
        "url": "https://docs.python.org/3/library/json.html",
        "claim": "Python's json module provides JSON encoding and decoding.",
        "terms": ["json", "encoding", "decoding"],
    },
    {
        "reference": "Synthetic fake reference",
        "url": "https://example.invalid/fake-reference",
        "claim": "This page documents an AI-specific reference verifier.",
        "terms": ["reference", "verifier"],
    },
]

output_dir = Path("outputs")
if output_dir.exists():
    raise SystemExit("outputs already exists; remove or rename it before running again")
output_dir.mkdir()

results = []

for item in checks:
    result = {
        "reference": item["reference"],
        "url": item["url"],
        "claim": item["claim"],
        "reachable": False,
        "status": None,
        "final_url": None,
        "term_matches": {},
        "error": None,
    }

    try:
        request = Request(
            item["url"],
            headers={"User-Agent": "Worknote reference checker/1.0"},
        )
        with urlopen(request, timeout=10) as response:
            result["status"] = response.status
            result["final_url"] = response.geturl()
            raw = response.read(500_000).decode("utf-8", errors="replace")

        text = re.sub(r"<script.*?</script>", " ", raw, flags=re.I | re.S)
        text = re.sub(r"<style.*?</style>", " ", text, flags=re.I | re.S)
        text = re.sub(r"<[^>]+>", " ", text)
        text = html.unescape(text)
        text = re.sub(r"\s+", " ", text)

        result["reachable"] = True
        lowered = text.casefold()
        result["term_matches"] = {
            term: term.casefold() in lowered for term in item["terms"]
        }

    except HTTPError as exc:
        result["status"] = exc.code
        result["error"] = f"HTTPError: {exc}"
    except URLError as exc:
        result["error"] = f"URLError: {exc.reason}"
    except Exception as exc:
        result["error"] = f"{type(exc).__name__}: {exc}"

    results.append(result)

report_path = output_dir / "reference_check.json"
report_path.write_text(
    json.dumps(results, indent=2, ensure_ascii=False),
    encoding="utf-8",
)

for result in results:
    print(result["reference"])
    print("  reachable:", result["reachable"])
    print("  status:", result["status"])
    print("  final URL:", result["final_url"])
    print("  term matches:", result["term_matches"])
    print("  error:", result["error"])

print(f"Saved: {report_path}")

05결과를 보수적으로 해석하기

페이지에 정상적으로 접속되고 검색어도 발견되었다면 '수동 검토가 필요한 후보' 정도로 판단해야 합니다. 자동으로 검증된 주장으로 처리해서는 안 됩니다. 단순 문자열 일치만으로는 문맥, 적용 범위, 부정 표현, 예외 조건, 또는 AI가 원문을 과장했는지를 판단할 수 없습니다.

결과해석다음 조치
접속 가능, 검색어 발견페이지가 관련 자료일 가능성이 있다.관련 섹션을 직접 읽고 AI의 정확한 주장과 비교한다.
접속 가능, 검색어 없음URL은 존재하지만 빠른 내용 확인에서 예상 표현을 찾지 못했다.페이지를 직접 검토하고 AI가 잘못된 페이지를 인용했는지 확인한다.
HTTP 오류서버가 오류 상태를 반환했다.URL, 리디렉션, 접근 조건, 참고자료 이동 여부를 확인한다.
네트워크 또는 DNS 오류스크립트가 주소에 접근하지 못했다.철자를 확인하고 다른 방법으로 참고자료 존재 여부를 검증한다.

06마지막으로 직접 확인하기

  1. 페이지 제목과 기관명이 AI가 언급한 출처와 일치하는지 확인합니다.
  2. 페이지에서 AI 주장의 핵심 개념을 직접 찾습니다.
  3. 관련 문장의 앞뒤 내용을 충분히 읽어 조건과 예외를 확인합니다.
  4. AI가 제한적인 원문 표현을 더 넓은 결론으로 바꾸지는 않았는지 확인합니다.
  5. 나중에 다시 검토할 수 있도록 관련 섹션 제목이나 위치를 기록합니다.
  6. 출처를 찾을 수 없거나 주장을 뒷받침하지 않는 인용은 제외하거나 수정합니다.

07자주 하는 실수와 한계

  • 익숙한 도메인이라는 이유만으로 해당 도메인의 모든 URL이 실제 문서라고 판단하는 것.
  • 페이지 어딘가에 키워드 하나가 있다는 이유로 주장이 검증됐다고 판단하는 것.
  • 리디렉션을 무시하고 AI가 처음 제시한 URL만 확인하는 것.
  • 페이지 제목, 검색 결과 설명, 초록, 목차만으로 세부 주장을 검증하는 것.
  • 자동 텍스트 검색을 실제 인용 문장 검토의 대체 수단으로 사용하는 것.
  • 정상적인 사이트라도 자동 요청을 차단하거나 JavaScript, 로그인, 별도 접근 방식이 필요할 수 있다는 점을 무시하는 것.

학술 자료를 확인할 때는 저자, 제목, 연도, 학술지, DOI와 실제 논문 내용도 함께 검증해야 합니다. 단순 URL 확인 스크립트만으로는 학술적 타당성을 평가하거나 철회된 논문을 판별하거나 연구의 방법론적 신뢰성을 판단할 수 없습니다.

실행·검증 기록

2026-09-21 · hand-checked example · Python 3.12

  • 예제에 총 3개의 참고자료가 있고 세 번째 항목이 합성 가짜 참고자료로 명시되어 있는지 손으로 확인했습니다.
  • 두 개의 실제 예제 URL이 urllib.request와 json에 대한 Python 공식 문서 경로인지 확인했습니다.
  • 스크립트가 Python 표준 라이브러리만 사용하도록 구성되어 있는지 확인했습니다.
  • 스크립트가 outputs/reference_check.json을 만들고 기존 outputs 폴더를 덮어쓰지 않고 중단하도록 구성되어 있는지 확인했습니다.
  • URL 접속 가능 여부, 단순 검색어 일치, 수동 주장 검토를 서로 분리하는 논리를 확인했습니다.
검증 범위의 한계
  • 코드는 제가 직접 실행하지 않았습니다.
  • 실제 네트워크 요청을 수행하지 않았으므로 현재 HTTP 상태 코드와 리디렉션 상태는 여기서 확인하지 않았습니다.
  • 검색어가 존재한다는 사실만으로 페이지가 주장을 뒷받침한다고 판단할 수 없으며 관련 문장은 사람이 직접 검토해야 합니다.
  • 일부 정상적인 웹사이트는 자동 요청을 차단하거나 JavaScript 렌더링, 로그인, 기타 접근 방식을 요구할 수 있습니다.

사이트 전체의 작성·검증 원칙

참고 출처

설명과 예제는 직접 작성했습니다. 관련 동작과 개념은 아래 공식 자료에서 확인할 수 있습니다.