문헌 탐색과 지식 관리
새 연구 주제를 받으면 검색창에 방법 이름을 넣고, 나온 논문 중 최근 것 몇 편을 읽고, 그 논문들이 비교한 baseline을 그대로 가져오기 쉽다. 이렇게 시작하면 세 가지를 놓친다. 그 방법이 원래 어떤 가정 아래에서 제안되었는지(원전), 누가 어떤 조건에서 그 방법이 실패한다고 보고했는지(반박), 그리고 다른 분야가 같은 문제를 다른 이름으로 이미 풀었는지다. 이 셋을 놓친 연구는 이미 알려진 실패를 다시 겪거나, 이미 풀린 문제를 다시 푼다.
이 장은 문헌을 체계적으로 찾고, 찾은 것을 나중에 다시 쓸 수 있게 관리하는 방법을 다룬다. 무엇을 읽을지 고르는 큰 기준(정보원의 층)은 1.6장에서 다루었다. 여기서는 한 연구 질문에 대해 관련 문헌을 빠짐없이 모으는 절차, 검색 결과를 정리하는 계산, 참고문헌과 연구 노트를 관리하는 습관, 그리고 모은 문헌을 연구 질문으로 이어지는 지도로 바꾸는 분류 방식을 다룬다.
학습 목표
- 체계적으로 문헌을 탐색한다
- 참고문헌과 연구 노트를 관리한다
- AI 도구가 제시한 검색 결과와 요약을 원문과 대조해 검증하고, 그 과정을 기록한다
탐색 전략
왜 전략이 필요한가. 키워드 검색 한 번은 검색어를 그 단어로 쓴 논문만 찾는다. 그런데 과학 문제에 ML을 쓰는 연구는 분야마다 같은 것을 다른 이름으로 부른다. 계산 비용이 큰 시뮬레이터를 근사하는 모델을 ML에서는 surrogate model, 공학에서는 reduced-order model, 기후·통계에서는 emulator라고 부르는 식이다. 검색어 하나로는 이 중 한 갈래만 보인다. 그래서 키워드 검색은 출발점으로만 쓰고, 찾은 논문들의 인용 관계를 따라가며 범위를 넓힌다.
다섯 종류의 문헌. 한 주제의 문헌은 역할이 다른 다섯 종류로 나눠 찾는다.
| 종류 | 찾는 이유 | 찾는 방법 |
|---|---|---|
| 서베이(survey, review) | 분야의 용어·갈래·대표 논문을 빠르게 파악한다 | "survey", "review", "tutorial"을 검색어에 더한다 |
| 원전(original paper) | 방법이 처음 제안될 때의 문제·가정·한계를 확인한다 | 서베이와 후속 연구의 참고문헌에서 공통으로 인용되는 오래된 논문 |
| 후속 연구(follow-up) | 방법이 어떻게 확장·수정되었는지 본다 | 원전의 피인용 목록 |
| 반박(critique, negative result) | 방법이 실패하는 조건, 재현되지 않은 결과를 안다 | 피인용 목록에서 "limitation", "failure", "revisiting", "reproducibility"가 들어간 논문 |
| 벤치마크(benchmark) | 공정한 비교 조건과 표준 baseline을 안다 | 데이터셋·리더보드 논문, 같은 데이터에서 여러 방법을 비교한 논문 |
순서는 대개 서베이 → 원전 → 후속 연구 → 반박 → 벤치마크다. 서베이로 지형을 잡고, 원전으로 가정을 확인하고, 후속 연구로 현재 상태를 보고, 반박으로 한계를 알고, 벤치마크로 비교 조건을 정한다. 반박을 찾는 단계가 가장 자주 빠진다. 반박 논문은 방법 이름을 제목에 쓰지 않는 경우가 많아 키워드 검색에 잘 걸리지 않는다.
인용 그래프 따라가기. 논문을 노드, 인용을 방향 있는 간선으로 보면 문헌은 인용 그래프(citation graph)가 된다. 인용 색인(citation index)이라는 아이디어 자체가, 한 논문에서 출발해 그 논문을 인용한 이후의 논문들을 찾아가려는 목적에서 나왔다(Garfield, 1955). 그래프를 따라가는 방향은 둘이다.
- backward snowballing: 시작 논문의 참고문헌을 따라간다. 더 오래된 연구, 즉 원전 쪽으로 간다.
- forward snowballing: 시작 논문을 인용한 논문을 따라간다. 더 새로운 연구, 즉 후속 연구와 반박 쪽으로 간다.
두 방향을 번갈아, 새로 찾은 관련 논문을 다음 시작점으로 삼아 반복하는 절차를 snowballing이라 한다. 소프트웨어 공학의 체계적 문헌 연구에서는 이 절차를 데이터베이스 검색의 대안이 될 수 있는 첫 탐색 전략으로 정리하고 실제 리뷰를 재현해 검토했다(Wohlin, 2014).
언제 멈추는가. 반복할 때마다 새로 찾은 관련 논문의 수를 센다. 한 바퀴를 돌았는데 새 관련 논문이 거의 나오지 않으면, 지금의 검색어와 시작점으로 닿을 수 있는 범위는 포화에 가깝다. "거의"의 기준(예: 한 바퀴에 새 관련 논문 2편 이하)은 탐색을 시작할 때 정해 검색 기록에 적어 둔다. 그래야 지쳐서 멈춘 것과 포화해서 멈춘 것이 구별된다. 기준에 닿으면 멈추되, 다른 분야의 용어로 시작점을 하나 더 넣어 한 바퀴를 더 돌려 본다. 포화는 "모든 문헌을 찾았다"가 아니라 "이 경로로는 더 나오지 않는다"는 뜻이다.
검색 기록. 언제, 어느 도구에서, 어떤 검색어로, 몇 편이 나왔고 몇 편을 골랐는지 적는다. 기록이 있어야 몇 달 뒤 같은 검색을 다시 돌려 새 논문만 확인할 수 있고, 리뷰어가 "이 논문을 왜 비교하지 않았는가"라고 물을 때 탐색 범위를 설명할 수 있다.
2026-03-02 OpenAlex "battery degradation" AND (surrogate OR emulator) 212편 → 제목 검토 31편
2026-03-02 forward 원전15의 피인용 64편 → 초록 검토 12편 (반박 2)
2026-03-09 backward 서베이23의 참고문헌 88편 → 새 관련 4편, 포화에 근접
핵심 논문 찾기: 피인용 수와 PageRank. 수백 편을 다 읽을 수 없으니 먼저 읽을 논문을 고른다. 가장 단순한 단서는 피인용 수, 즉 그래프에서 들어오는 간선의 수다. 그런데 피인용 수는 모든 인용을 같은 무게로 센다. 많이 인용되는 후속 연구들이 공통으로 인용하는 논문과, 아무도 인용하지 않는 논문들에게만 인용되는 논문을 구별하지 못한다.
PageRank는 "중요한 논문에게 인용되는 논문이 중요하다"는 재귀적 정의로 이 차이를 반영한다(Brin & Page, 1998). 논문 의 참고문헌이 개이면 는 자기 점수를 개로 나눠 각 참고문헌에 준다. 이 과정을 무한히 반복했을 때의 정상상태가 PageRank다.
은 논문 수, 는 "가 를 인용한다", 는 열 에 를 담은 열 확률행렬(column-stochastic matrix)이다. damping factor (흔히 0.85)는 인용을 따라가다가 확률 로 아무 논문으로나 건너뛰는 독자를 뜻한다. 이 항이 있어야 인용되지 않은 논문도 0이 아닌 값을 받고 반복이 수렴한다. 참고문헌이 하나도 없는 논문(그래프의 끝)은 자기 점수를 모든 논문에 균등하게 나눠 주는 것으로 처리한다.
가상의 작은 분야에서 계산한다. 2015년 원전, 2017–2021년 후속 연구·반박·벤치마크, 2023년 서베이, 2024년 최신 논문이 있다.
import numpy as np
papers = ["원전15", "후속17", "후속18", "반박19", "벤치20", "후속21", "서베이23", "최신24"]
cites = { # 인용하는 논문 → 인용된 논문들
"후속17": ["원전15"], "후속18": ["원전15", "후속17"], "반박19": ["원전15", "후속18"],
"벤치20": ["후속17", "후속18"], "후속21": ["후속18", "벤치20", "반박19"],
"서베이23": ["후속17", "후속18", "반박19", "벤치20", "후속21"],
"최신24": ["후속21", "벤치20", "원전15"],
}
n, idx = len(papers), {p: i for i, p in enumerate(papers)}
A = np.zeros((n, n)) # A[j, i] = 1: i가 j를 인용, (n, n)
for src, dsts in cites.items():
for dst in dsts:
A[idx[dst], idx[src]] = 1.0
out = A.sum(axis=0) # 각 논문의 참고문헌 수, (n,)
P = np.where(out > 0, A / np.maximum(out, 1), 1.0 / n) # 열 확률행렬, 참고문헌 없는 논문은 균등
d, r = 0.85, np.full(n, 1.0 / n)
for _ in range(100):
r = (1 - d) / n + d * P @ r # power iteration, (n,)
for i in np.argsort(-r, kind="stable"):
print(f"{papers[i]:<6} 피인용 {int(A[i].sum())} PageRank {r[i]:.3f}")
seed = "후속18"
print("backward(참고문헌):", cites[seed])
print("forward(피인용):", [p for p, ds in cites.items() if seed in ds])원전15 피인용 4 PageRank 0.313 후속17 피인용 3 PageRank 0.169 후속18 피인용 4 PageRank 0.158 벤치20 피인용 3 PageRank 0.097 반박19 피인용 2 PageRank 0.082 후속21 피인용 2 PageRank 0.076 서베이23 피인용 0 PageRank 0.052 최신24 피인용 0 PageRank 0.052 backward(참고문헌): ['원전15', '후속17'] forward(피인용): ['반박19', '벤치20', '후속21', '서베이23']
세 가지를 읽는다.
- 피인용 수가 같아도 PageRank는 두 배 차이가 난다.
원전15와후속18은 둘 다 4번 인용되지만,원전15를 인용한 논문들(후속17,후속18) 자체가 많이 인용되므로원전15가 훨씬 높다.후속17은 피인용이 3으로후속18보다 적은데도 PageRank는 더 높다. 점수가 높은후속18이 참고문헌 둘 중 하나로후속17을 인용해 큰 몫을 넘겨주기 때문이다. - 서베이와 최신 논문은 0.052로 가장 낮다. 나온 지 얼마 안 되어 아직 인용될 시간이 없었을 뿐이다. 인용 기반 지표는 나이에 편향되어 있다. 최신 논문은 이 지표가 아니라 연구 질문과의 관련성으로 골라야 한다.
- 시작점 하나에서 두 방향이 갈린다.
후속18에서 backward로 가면 원전 쪽으로, forward로 가면 반박·벤치마크·서베이 쪽으로 간다.반박19는 forward에서만 보인다.
도구
왜 도구를 여럿 쓰는가. 문헌 검색 도구는 저마다 포함 범위(어떤 출판물을 색인하는가)와 기능(인용 그래프, 알림, API)이 다르다. 한 도구에서 찾지 못한 논문이 다른 도구에는 있다. 그래서 두세 도구를 함께 쓰고, 결과를 합친 뒤 중복을 제거한다.
도구의 종류. 아래 표는 기능별 분류다. 각 도구의 포함 범위, 무료 여부, API 제한은 자주 바뀌므로 쓰기 전에 공식 안내 페이지에서 확인한다. 도구 이름은 집필 시점 예시다.
| 종류 | 기능 | 집필 시점 예시 |
|---|---|---|
| 범용 학술 검색 | 저널·학회·프리프린트·학위논문을 폭넓게 검색, 피인용 목록, 검색어·피인용 알림 | Google Scholar |
| 인용 그래프 데이터베이스 | 논문의 참고문헌·피인용 목록을 구조화된 데이터로 제공, 공개 API | Semantic Scholar, OpenAlex |
| 프리프린트 서버 | 심사 전 원고를 빠르게 공개, 분야별 신규 목록과 메일 알림 | arXiv, bioRxiv, ChemRxiv |
| 분야 데이터베이스 | 분야의 출판물을 분야의 분류 체계로 색인 | PubMed(생명·의학), NASA ADS(천문·물리) |
| 상용 인용 색인 | 선별된 저널의 인용 데이터, 기관 구독 | Web of Science, Scopus |
| 인용 그래프 시각화 도구 | 시작 논문 몇 편에서 관련 논문의 그래프를 그려 줌 | 여러 서비스가 있다. 기관이나 동료가 쓰는 것을 확인한다 |
API로 검색을 재현 가능하게 만들기. 웹 화면에서 한 검색은 다시 똑같이 돌리기 어렵다. 공개 API가 있는 데이터베이스는 검색을 스크립트로 남길 수 있고, 같은 검색을 몇 달 뒤 다시 돌려 새로 나온 논문만 뽑을 수 있다. 다음은 집필 시점의 예시다. 경로와 매개변수, 요청 횟수 제한은 각 서비스의 API 문서에서 확인한다.
# OpenAlex: 제목·초록 검색 (집필 시점 예시)
curl "https://api.openalex.org/works?search=battery%20degradation%20surrogate&per-page=5"
# Semantic Scholar: 한 논문(arXiv id)의 피인용 목록 = forward snowballing (집필 시점 예시)
curl "https://api.semanticscholar.org/graph/v1/paper/arXiv:<arXiv id>/citations?fields=title,year&limit=20"
알림. 탐색은 한 번으로 끝나지 않는다. 연구 기간 동안 새로 나오는 논문을 받으려면 알림을 걸어 둔다. 핵심 검색어에 대한 알림, 원전과 핵심 논문 몇 편에 대한 "새 피인용" 알림, 관심 분야 프리프린트의 신규 목록 메일이 기본이다. 알림으로 받은 논문은 1.6장의 2층 정보원처럼 정해진 시간에 훑고, 관련된 것만 지도에 추가한다.
검색 결과 합치기와 중복 제거. 여러 도구의 결과를 합치면 같은 논문이 여러 번 나온다. 같은 논문인데 레코드가 다른 이유는 여럿이다. 프리프린트와 게재본은 연도와 제목이 다를 수 있고, 도구마다 대소문자·구두점·철자(aging/ageing)가 다르게 저장된다. 그래서 다음 순서로 묶는다.
- 식별자: DOI, arXiv id 같은 영구 식별자가 같으면 같은 논문이다. 한 레코드에 DOI와 arXiv id가 함께 있으면 두 식별자를 잇는 다리가 된다.
- 정규화한 제목: 소문자로 바꾸고 구두점을 공백으로 바꾼 제목이 같으면 같은 논문으로 본다.
- 유사한 제목: 철자 변이처럼 정규화로도 같아지지 않는 경우는 유사도가 높은 쌍을 사람이 확인할 후보로만 표시한다. 자동으로 합치면 제목이 비슷한 다른 논문(같은 저자의 후속 논문 등)을 잘못 합친다.
"같은 논문"은 전이적이다. A와 B가 arXiv id를 공유하고 B와 C가 DOI를 공유하면 A와 C도 같은 논문이다. 이런 묶음은 union-find로 구한다. 세 도구에서 모은 가상의 검색 결과 7개를 묶는다.
import re
records = [ # 세 도구에서 모은 가상의 검색 결과: (출처, 제목, 연도, DOI, arXiv)
("arxiv", "Neural Solvers Learn Operators of PDEs", 2020, None, "2010.00001"),
("semantic", "Learning solution operators of PDEs.", 2021, "10.0000/j.1", "2010.00001"),
("journal", "Learning Solution Operators of PDEs", 2021, "10.0000/j.1", None),
("scholar", "Physics-Informed Surrogates: A Review", 2022, "10.0000/r.7", None),
("semantic", "Physics-informed surrogates - a review", 2022, None, None),
("arxiv", "Graph Networks for Battery Aging", 2023, None, "2301.00042"),
("scholar", "Graph networks for battery ageing", 2023, None, None),
]
norm = lambda t: re.sub(r"[^a-z0-9]+", " ", t.lower()).strip()
parent, seen = list(range(len(records))), {} # union-find: 같은 논문이면 한 묶음
def find(i):
while parent[i] != i:
i = parent[i]
return i
for i, (_, title, _, doi, arx) in enumerate(records):
for key in (("doi", doi), ("arxiv", arx), ("title", norm(title))):
if key[1] is not None: # 처음 본 키면 자기 자신과 묶는다(변화 없음)
parent[find(i)] = find(seen.setdefault(key, i))
groups = {}
for i in range(len(records)):
groups.setdefault(find(i), []).append(records[i][0])
print("제목 문자열 그대로:", len({r[1] for r in records}), "편")
print("정규화 제목:", len({norm(r[1]) for r in records}), "편")
print("식별자 + 정규화 제목:", len(groups), "편")
for g in groups.values():
print(" ", g)제목 문자열 그대로: 7 편 정규화 제목: 5 편 식별자 + 정규화 제목: 4 편 ['arxiv', 'semantic', 'journal'] ['scholar', 'semantic'] ['arxiv'] ['scholar']
제목 문자열을 그대로 비교하면 7편, 정규화한 제목으로는 5편이다. 첫 논문은 프리프린트 때의 제목이 게재본과 달라서 제목으로는 묶이지 않는다. 그러나 semantic 레코드가 arXiv id와 DOI를 함께 가지고 있어 다리 역할을 하므로, 식별자를 쓰면 세 레코드가 한 논문으로 묶여 4편이 된다. 마지막 두 레코드는 aging/ageing 철자 차이 때문에 아직 따로 있다. 이런 쌍은 확인 후보로 표시한다.
from difflib import SequenceMatcher
reps = [norm(records[k][1]) for k in groups]
for a in range(len(reps)):
for b in range(a + 1, len(reps)):
s = SequenceMatcher(None, reps[a], reps[b]).ratio()
if s > 0.9:
print(f"확인 후보: '{reps[a]}' ~ '{reps[b]}' (유사도 {s:.2f})")확인 후보: 'graph networks for battery aging' ~ 'graph networks for battery ageing' (유사도 0.98)
사람이 원문을 확인해 같은 논문이면 합친다. 최종 결과는 3편이다. 중복을 제거하지 않으면 같은 논문을 두 번 읽거나, 관련 연구 지도에서 한 논문의 무게를 두 배로 셈한다.
AI 보조 문헌 탐색과 인용 검증
왜 필요한가. LLM 기반 도구는 검색어의 동의어를 넓히고, 초록 수십 편을 훑고, 논문을 요약하는 데 쓸모가 있다. 그러나 언어모델은 그럴듯한 이어 쓰기를 학습한 모델이라(18.5장) 출력에 세 종류의 오류가 섞일 수 있다. 제목·저자·연도를 갖췄지만 존재하지 않는 서지, 실제 논문 두 편의 저자·제목·연도가 뒤섞인 혼합 서지, 실제 논문이지만 그 논문에 없는 주장이다. 그래서 AI 도구의 출력은 검색 결과가 아니라 확인할 후보 목록으로 다룬다.
확인 절차. AI 도구가 제시한 문헌과 요약마다 다음을 차례로 한다.
- 존재 확인. DOI는
https://doi.org/<DOI>로, arXiv id는 arXiv 페이지로 직접 연다. 식별자가 없으면 앞 절의 데이터베이스 두 곳 이상에서 제목으로 찾는다. 찾지 못하면 목록에서 뺀다. - 서지 대조. 열린 페이지의 제목·저자·연도·게재처가 AI가 제시한 것과 모두 맞는지 본다. 식별자는 실재하는데 다른 논문을 가리키거나, 제목과 저자가 서로 다른 논문에서 왔다면 혼합 서지다. 원문 기준으로 고치고, 어느 논문을 뜻했는지 알 수 없으면 뺀다.
- 주장 대조. 요약이 논문에 귀속한 주장마다 원문의 해당 절·표를 찾아 조건(데이터, 비교 대상, 적용 범위)과 함께 확인하고, 위치를 논문 노트에 적는다. 위치를 찾지 못한 주장은 인용하지 않는다.
- 기록. 검색 기록에 도구 이름과 사용 날짜, 입력한 질문 원문, 확인 결과(확인·수정·삭제 수)를 남긴다. LLM의 출력은 같은 질문에도 달라지고, 도구의 색인과 모델은 예고 없이 바뀐다. 무엇을 물어 무엇을 받았는지 남겨야 탐색 범위를 설명할 수 있다.
2026-03-10 AI 검색 도구 A 질문: "battery degradation surrogate의 실패를 보고한 연구" → 후보 9편
존재 확인 7 · 서지 수정 1(연도와 게재처가 다른 논문의 것) · 삭제 2(DOI 없음, 제목 검색 0건)
요약의 수치 주장 5개 → 원문 위치 확인 4 · 위치 없음 1(인용하지 않음)
검색 증강 도구의 한계. 데이터베이스에서 문서를 검색해 그 문서를 근거로 답하는 검색 증강(retrieval-augmented) 도구는 존재하지 않는 서지를 줄이고 답에 출처를 붙여 준다. 그래도 다음 한계가 남는다.
- 포함 범위의 빈틈. 도구가 색인한 문헌 안에서만 찾는다. 색인 밖의 학회 논문, 분야 데이터베이스, 비영어 문헌, 학위논문은 나오지 않는다. 결과가 없다는 것은 문헌이 없다는 뜻이 아니다.
- 최신성. 색인이 갱신되기 전에 나온 프리프린트와, 최근의 철회·정정 사실이 빠질 수 있다.
- 유료 장벽. 본문을 읽지 못하는 논문은 초록만으로 요약될 수 있고, 그러면 본문에 있는 조건과 한계가 빠진다. 요약의 근거가 초록인지 본문인지 확인한다.
- 많이 인용된 논문 쪽으로의 편향. 검색 순위에 피인용 수를 반영하는 도구가 있고, 모델이 학습한 텍스트에도 많이 인용된 논문이 더 자주 나온다. 앞에서 본 인용 지표의 나이 편향처럼 최신 논문과 반박 논문이 덜 나올 수 있다.
그래서 AI 도구는 데이터베이스 검색과 snowballing을 대신하지 않고 보탠다. AI 도구로 찾은 논문은 확인을 거쳐 시작점에 더하고, 다섯 종류 중 빈 칸(특히 반박)은 forward snowballing으로 직접 채운다.
참고문헌 관리
왜 관리 도구가 필요한가. 30편을 넘으면 "어디서 읽었더라"가 시작된다. 논문 PDF가 내려받기 폴더에 흩어지고, 같은 논문을 다른 이름으로 두 번 저장하고, 논문을 쓸 때 서지 정보를 손으로 다시 친다. 손으로 친 서지 정보에는 오타가 들어가고, 프리프린트로 인용했던 논문이 나중에 저널에 실려도 고쳐지지 않는다.
citation manager. 참고문헌 관리 도구(citation manager)는 서지 정보, PDF, 메모를 한곳에 모으고, 논문을 쓸 때 원하는 형식으로 참고문헌 목록을 만든다. 오픈소스인 Zotero가 대표적인 예이고(집필 시점 예시), 브라우저에서 논문 페이지를 열고 버튼 하나로 서지 정보와 PDF를 저장하는 기능이 있다. 어떤 도구를 쓰든 다음을 지킨다.
- 서지 정보는 식별자로 가져온다. DOI나 arXiv id로 서지 정보를 불러오고 손으로 치지 않는다.
- 프리프린트를 게재본으로 갱신한다. 인용한 프리프린트가 학회·저널에 실렸는지 주기적으로 확인하고, 실렸으면 게재본을 인용한다. 두 판의 내용이 다를 수 있으니 인용한 수치가 게재본에도 있는지 확인한다.
- 컬렉션과 태그를 연구 질문 단위로 만든다. 다음 절의 분류 방식(문제·가정·한계)을 태그로 쓰면 지도를 만들 때 바로 쓸 수 있다.
BibTeX. LaTeX로 논문을 쓰면 참고문헌은 BibTeX 파일(.bib)로 관리한다. 항목마다 인용 키(citation key)가 있고, 본문에서는 \cite{brin1998anatomy}처럼 키로 인용한다. 키는 한 번 쓰기 시작하면 바꾸기 어려우므로 <첫 저자 성><연도><제목 첫 단어> 같은 규칙을 정해 고정한다. 이 책의 data/references.bib도 같은 규칙을 쓰고, 항목마다 note 필드에 원문을 어디서 확인했는지 적는다. 자신의 .bib 파일에도 이렇게 확인 기록을 남겨 두면, 확인하지 않은 인용이 섞여 들어가는 것을 막을 수 있다.
DOI가 있으면 BibTeX 항목을 DOI 서비스에서 직접 받을 수 있다(DOI content negotiation). 다음은 집필 시점의 예시다.
# DOI로 BibTeX 항목 받기 (집필 시점 예시)
curl -LH "Accept: application/x-bibtex" https://doi.org/<DOI>
받은 항목도 저자 이름의 철자, 학회 이름, 쪽수를 원문과 한 번 대조한다. 데이터베이스의 서지 정보에도 오류가 있다.
연구 노트
왜 노트를 남기는가. 석 달 전에 읽은 논문을 다시 펼쳐 "이 논문이 무엇을 가정했더라"를 찾는 데 30분이 걸린다면, 30편이면 하루가 넘는다. 읽을 때 정해진 양식으로 짧게 남긴 노트는 이 시간을 줄이고, 관련 연구 절을 쓸 때 그대로 재료가 된다. 연구 전체의 기록(실험 노트, 결정 기록)은 23.7장에서 다루고, 여기서는 논문 노트를 다룬다.
논문 노트 양식. 한 논문에 한 장. 23.2장에서 다룰 읽기의 결과를 이 양식에 담는다.
# <논문 제목> (<첫 저자>, <연도>) key: <BibTeX 키>
- 식별자: DOI / arXiv id / 코드 저장소
- 종류: 서베이 · 원전 · 후속 · 반박 · 벤치마크
- 문제: 입력 → 출력, 일반화 대상, 평가 분할
- 가정: 데이터·물리·평가에 대한 가정 (명시된 것 / 내가 추정한 것)
- 기여: 저자가 주장하는 기여 한두 줄
- 근거: 주장마다 뒷받침하는 표·그림의 위치 (예: 표 2, 4.3절)
- 한계: 저자가 밝힌 한계 / 내가 발견한 한계
- 연결: 이 논문이 기대는 논문, 반박하는 논문, 비슷한 문제를 다른 이름으로 푼 논문
- 내 생각: 내 연구에 쓸 수 있는 점, 의문 (요약과 구분해서 쓴다)
- 읽은 날짜와 깊이: 훑어봄 / 이해 / 재구성
두 가지가 특히 중요하다. 첫째, 근거의 위치를 적는다. 나중에 "이 논문은 X를 보였다"고 인용할 때 원문의 표 번호를 바로 찾아 다시 확인할 수 있다. 둘째, 논문의 주장과 내 생각을 구분한다. 섞어 쓰면 몇 달 뒤 내 추측을 논문의 주장으로 인용하게 된다.
개념 간 연결. 노트를 논문별로만 두면 "이 가정을 쓰는 논문은 어떤 것들이었지"라는 질문에 답하기 어렵다. 노트 안의 가정·문제·한계를 개념 노트로 따로 만들고 논문 노트에서 링크한다. 예를 들어 "격자 해상도에 무관하다는 가정"이라는 개념 노트에는 그 가정을 쓰는 논문, 그 가정을 시험한 논문, 그 가정이 깨진 사례가 모인다. Markdown 파일과 링크만으로도 충분하고, 노트 도구를 쓴다면 내보내기가 되는 평문 형식을 쓰는 도구를 고른다.
분류 방식
왜 방법 이름으로 분류하면 안 되는가. 관련 연구를 "GNN 기반", "Transformer 기반", "물리 기반"처럼 방법 이름으로 나누면 정리는 쉽지만 쓸모가 적다. 같은 Transformer를 쓴 두 논문이 전혀 다른 문제를 풀 수도 있고, 이름이 다른 두 방법이 같은 가정에 기대어 같은 곳에서 실패할 수도 있다. 방법 이름은 몇 년마다 바뀌지만 문제와 가정은 오래간다.
문제 · 가정 · 한계로 분류한다. 각 논문을 세 축으로 기록하고, 같은 값을 가진 논문끼리 묶는다.
- 문제: 무엇을 입력으로 무엇을 예측하는가, 일반화 대상은 무엇인가(새 측정, 새 시료, 새 조건). 1.3장의 문제 정의 항목을 그대로 쓴다.
- 가정: 결과가 성립하려면 무엇이 참이어야 하는가. 데이터가 같은 분포에서 나온다, 지배 방정식을 안다, 측정 잡음이 작다, 학습 범위 안에서만 쓴다.
- 한계: 어디서 실패한다고 보고되었는가, 무엇이 시험되지 않았는가.
이렇게 정리한 표가 관련 연구 지도다. 다음은 가상의 배터리 수명 예측 분야를 예로 든 일부다.
| 논문 | 문제(입력 → 출력, 일반화 대상) | 핵심 가정 | 보고된 한계 | 시험되지 않은 것 |
|---|---|---|---|---|
| 원전15 | 초기 100 사이클 곡선 → 수명, 새 셀 | 모든 셀이 같은 충전 조건 | 충전 조건이 바뀌면 오차 증가 | 다른 화학 조성 |
| 후속18 | 같은 문제 + 충전 조건 입력 | 학습 범위 안의 충전 조건 | 범위 밖 외삽 미시험 | 범위 밖 충전 조건 |
| 반박19 | 원전15를 다른 실험실 데이터에 적용 | — | 실험실 간 측정 차이로 오차 두 배 | 실험실 효과 보정 방법 |
| 벤치20 | 여러 방법을 셀 단위 분할로 비교 | 공개 데이터 3종이 대표적 | 데이터가 한 화학 조성에 치우침 | 화학 조성 간 일반화 |
이 표는 방법 이름이 하나도 없어도 연구의 흐름을 보여 준다. "같은 충전 조건"이라는 가정에서 출발해 → 충전 조건을 입력으로 넣었고 → 실험실이 바뀌면 깨진다는 반박이 나왔고 → 벤치마크는 화학 조성이 치우쳐 있다. 마지막 열에서 "화학 조성이나 실험실이 바뀔 때의 일반화"라는 빈틈이 보인다. 이것이 연구 질문의 후보가 된다(23.4장).
실습
자신의 연구 주제(또는 관심 주제)에 대해 30편 규모의 관련 연구 지도를 만든다.
- 시작점 정하기. 서베이 1–2편과, 핵심이라고 생각하는 논문 2–3편을 시작점으로 정한다. 다른 분야에서 같은 문제를 부르는 용어를 두 개 이상 찾아 검색어에 넣는다.
- 검색과 snowballing. 두 개 이상의 도구에서 검색하고, 시작점에서 backward와 forward를 각각 한 바퀴 이상 돈다. 본문의 양식으로 검색 기록을 남기고, 바퀴마다 새로 찾은 관련 논문 수를 적는다.
- 중복 제거와 선별. 결과를 합쳐 식별자로 중복을 제거하고, 제목·초록으로 30편 안팎을 고른다. 다섯 종류(서베이·원전·후속·반박·벤치마크)가 모두 들어 있는지 확인한다. 반박이 없으면 forward 목록을 다시 본다.
- 노트와 지도. 고른 논문마다 논문 노트를 쓰고(깊이는 "훑어봄"이어도 된다), 문제·가정·한계 열로 지도를 만든다. 마지막 열 "시험되지 않은 것"을 채우고, 빈틈 하나를 골라 두세 문장의 연구 질문 후보로 쓴다.
- 참고문헌 파일. 30편의 BibTeX 파일을 만들고, 원문을 확인한 항목에 확인 기록을 남긴다.
- AI 보조 탐색 검증. AI 도구 하나에 같은 주제의 관련 논문 10편과 요약을 요청하고, 본문의 네 단계로 확인한다. 확인·수정·삭제 수, 요약의 주장 중 원문 위치를 찾은 수, 3단계에서 고른 30편과 겹치는 논문 수를 기록한다. AI 도구가 새로 찾아 준 논문과 직접 탐색에서만 나온 논문이 다섯 종류(서베이·원전·후속·반박·벤치마크) 중 어디에 속하는지 비교한다.
인용 그래프에서 먼저 읽을 논문을 고르는 계산을 직접 구현한다.
실패 사례
- 최신 논문만 읽고 원전을 읽지 않는 것. 최신 논문은 원전의 가정을 당연하게 여기고 생략한다. 원전에서 "이 방법은 주기 경계 조건에서만 시험했다"고 밝힌 한계가 후속 연구의 인용을 거치며 사라지고, 그 한계를 모른 채 비주기 문제에 적용해 실패한다.
- 방법 이름 하나로만 검색하는 것. 다른 분야가 같은 문제를 다른 이름으로 이미 풀었거나, 그 방법의 실패를 보고한 반박 논문이 검색되지 않는다. 동의어를 찾고 인용 그래프를 따라간다.
- 피인용 수로 논문의 옳고 그름을 판단하는 것. 인용 지표는 읽을 순서를 정하는 단서다. 최신 논문은 지표가 낮을 수밖에 없고, 많이 인용된 결과가 나중에 재현되지 않기도 한다.
- 초록이나 요약만 읽고 인용하는 것. 초록과 AI 요약은 조건을 생략한다. 인용하는 주장은 원문의 해당 표·절에서 조건과 함께 확인하고, 노트에 위치를 남긴다.
- AI 도구의 문헌 목록을 확인 없이 쓰거나, 결과가 없으면 문헌이 없다고 보는 것. 존재하지 않는 서지와 혼합 서지가 참고문헌에 들어가고, 색인 밖의 문헌은 처음부터 보이지 않는다. 식별자로 존재를 확인하고 직접 탐색으로 보충한다.
- 검색 기록 없이 탐색하는 것. 몇 달 뒤 같은 검색을 다시 돌려 새 논문을 확인할 수 없고, 탐색 범위를 설명할 수 없다.
통과 기준
- 자신의 주제에 대한 30편 안팎의 관련 연구 지도를 만든다. 지도에는 다섯 종류의 문헌이 모두 들어 있고, 논문마다 문제·가정·한계·시험되지 않은 것이 채워져 있다.
- 검색 기록(날짜·도구·검색어·결과 수·선별 수)과 snowballing 바퀴별 새 관련 논문 수를 남긴다.
- 지도의 흐름을 방법 이름 없이, 문제와 가정이 어떻게 바뀌어 왔는지로 동료에게 5분 안에 설명한다.
- AI 도구가 제시한 문헌 10편 이상에 대해 존재·서지·주장 확인 결과와 도구·날짜·질문 기록을 남기고, 직접 탐색에서만 나온 논문을 지도에 보충한다.
- 연습문제
citation-pagerank의 테스트를 통과한다.
참고 문헌
- Garfield (1955). Citation indexes for science: A new dimension in documentation through association of ideas. Science, 122(3159), 108–111. — 인용 색인의 아이디어
- Brin, Page (1998). The anatomy of a large-scale hypertextual Web search engine. Computer Networks and ISDN Systems, 30(1–7), 107–117. — PageRank를 쓴 검색 엔진의 설계
- Wohlin (2014). Guidelines for snowballing in systematic literature studies and a replication in software engineering. Proceedings of the International Conference on Evaluation and Assessment in Software Engineering (EASE '14), Article 38. — backward·forward snowballing 절차와 데이터베이스 검색과의 비교