업무용 스크립트 요청문에 입력·출력·오류 원칙 담기
“자동화해 줘”를 실행 가능한 작업 설명으로 바꿉니다. 민감정보 없는 합성 샘플과 손으로 확인한 기대 결과를 붙여, 팀별 작업 기록 집계 스크립트를 요청하는 문장을 완성합니다.
AI가 제시한 참고자료는 그럴듯해 보여도 링크가 존재하지 않거나 실제 문서 내용이 AI의 설명과 다를 수 있습니다. 작은 합성 예제로 링크 존재 여부와 출처가 실제 주장과 관련 있는지를 함께 확인합니다.
이런 분께AI 채팅 도우미를 조사, 보고서, 문서 작성에 활용하면서 인용된 참고자료를 직접 검증하고 싶은 사람을 위한 글입니다.
전문적으로 보이는 참고자료라고 해서 자동으로 신뢰할 수 있는 것은 아닙니다. AI 답변에는 실제 URL이지만 설명이 부정확한 경우, 더 이상 존재하지 않는 URL, 또는 완전히 만들어진 참고자료가 포함될 수 있습니다. 따라서 검증은 두 가지 질문으로 나눠야 합니다. 참고자료가 실제로 존재하는지, 그리고 그 자료가 AI의 주장을 실제로 뒷받침하는지 확인해야 합니다.
다음 예시는 합성 데이터입니다. AI 채팅 도우미에게 URL 열기와 JSON 처리를 설명하는 Python 표준 라이브러리 공식 문서를 물어봤다고 가정합니다. 업무 노트에 참고자료를 넣기 전에 답변을 직접 검증하려는 상황입니다.
AI에게 요청할 내용: URL을 여는 방법과 JSON을 읽고 쓰는 방법에 대한 공식 Python 참고자료를 알려줘. 각 참고자료가 뒷받침하는 구체적인 주장 하나와 정확한 URL도 함께 제시해줘.
| 참고자료 | AI의 주장 | URL |
|---|---|---|
| urllib.request | Python은 URL을 열기 위한 urllib.request를 제공한다. | https://docs.python.org/3/library/urllib.request.html |
| json | Python의 json 모듈은 JSON 인코딩과 디코딩 기능을 제공한다. | https://docs.python.org/3/library/json.html |
| 합성 가짜 참고자료 | 이 페이지는 AI 전용 참고자료 검증기를 설명한다. | https://example.invalid/fake-reference |
세 번째 행은 이 합성 예제를 위해 의도적으로 만든 가짜 참고자료입니다. 목표는 인용 형식이 그럴듯하다는 이유로 믿는 것이 아니라, 검증 과정에서 이런 항목을 찾아내는 것입니다.
Python에게 자연어 주장이 전체적으로 참인지 판단하게 하지 않는 것이 좋습니다. 대신 URL, AI의 주장, 그리고 해당 페이지가 관련 있다면 나타날 가능성이 높은 몇 개의 검색어를 기록합니다. 이 검색어는 어디까지나 빠른 선별을 위한 보조 수단입니다.
| URL | 확인할 단어 |
|---|---|
| https://docs.python.org/3/library/urllib.request.html | urllib.request; URL |
| https://docs.python.org/3/library/json.html | json; encoding; decoding |
| https://example.invalid/fake-reference | reference; verifier |
다음 표준 라이브러리 스크립트는 각 페이지를 요청하고, 최종 URL과 HTTP 상태를 기록하고, 기본적인 화면 텍스트를 추출한 뒤 지정한 검색어가 포함되는지 확인합니다. 결과는 outputs/reference_check.json에 저장합니다. 이전 검토 결과를 덮어쓰지 않도록 outputs 폴더가 이미 존재하면 실행을 중단합니다.
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}")페이지에 정상적으로 접속되고 검색어도 발견되었다면 '수동 검토가 필요한 후보' 정도로 판단해야 합니다. 자동으로 검증된 주장으로 처리해서는 안 됩니다. 단순 문자열 일치만으로는 문맥, 적용 범위, 부정 표현, 예외 조건, 또는 AI가 원문을 과장했는지를 판단할 수 없습니다.
| 결과 | 해석 | 다음 조치 |
|---|---|---|
| 접속 가능, 검색어 발견 | 페이지가 관련 자료일 가능성이 있다. | 관련 섹션을 직접 읽고 AI의 정확한 주장과 비교한다. |
| 접속 가능, 검색어 없음 | URL은 존재하지만 빠른 내용 확인에서 예상 표현을 찾지 못했다. | 페이지를 직접 검토하고 AI가 잘못된 페이지를 인용했는지 확인한다. |
| HTTP 오류 | 서버가 오류 상태를 반환했다. | URL, 리디렉션, 접근 조건, 참고자료 이동 여부를 확인한다. |
| 네트워크 또는 DNS 오류 | 스크립트가 주소에 접근하지 못했다. | 철자를 확인하고 다른 방법으로 참고자료 존재 여부를 검증한다. |
학술 자료를 확인할 때는 저자, 제목, 연도, 학술지, DOI와 실제 논문 내용도 함께 검증해야 합니다. 단순 URL 확인 스크립트만으로는 학술적 타당성을 평가하거나 철회된 논문을 판별하거나 연구의 방법론적 신뢰성을 판단할 수 없습니다.
2026-09-21 · hand-checked example · Python 3.12
설명과 예제는 직접 작성했습니다. 관련 동작과 개념은 아래 공식 자료에서 확인할 수 있습니다.