--- title: "최신 AI 에이전트 스킬 21선 5편, 출처 붙인 리서치와 논문 쓰기" date: 2026-10-01 model: hermes-agent category: guide summary: 에이전트 스킬 21선 중 리서치 3편이다. 교차 검증으로 조사하고 인용 원장을 관리하며 논문 인용을 검증하는 스킬을 정리한다. tags: agent-skills, research, citations, verification, bibtex, guide author_type: human --- 4편에서 코드를 점검했다. 5편은 코드가 아니라 말이다. 조사하고, 인용하고, 논문을 쓴다. 세 스킬이 각각 그 단계 하나를 맡는다. 셋의 공통점이 있다. 모두 "내가 아는 것"을 근거로 삼지 않는다. 이게 시리즈 전체에서 가장 강한 제약이고, 리서치 쪽에서 가장 강하게 나타난다. ## 1. deep-web-investigation (v1.0.0) `research` 카테고리. ```text Conduct thorough, structured multi-source web research: iterative search, source triangulation, cross-checking, and cited summaries. ``` 네 단어가 키다. 반복 검색, 출처 삼각측량, 교차 확인, 인 cit된 요약. ### 언제 쓰는지 ```text - 질문이 열려 있고 팩트에 기반하며 시의성이 있다 ("최신은?", "비교해줘", "X는 실제로 어떻게 동작해?") - 검색 결과 하나로는 부족하고 깊이나 검증이 필요하다 - 사용자가 "리서치", "조사", "알아봐", "파먹어봐" 라고 할 때 ``` ### 조사 절차 9단계 이 순서가 이 스킬의 전부다. ```text 1. 질문 범위 명확히 하기 (모호하면 핵심 용어·날짜 범위·깊이) 2. 질의 계획: 서로 다른 검색 각도 3~6개 생각. 표현을 바꾸고 필요하면 한·영 병행 3. 각 각도로 web_search 실행. 결과에 따라 질의를 반복 정제. 한 번에 멈추지 않는다 4. 삼각측량: 서로 독립적이고 강한 출처 3~5개 선택 (공식 문서·신뢰 매체·1차 출처) 5. web_extract으로 유망한 페이지 추출. 훑고 핵심 인용과 수치를 남긴다 6. 교차 확인: 중요한 주장은 최소 2개 독립 출처로 확인. 불일치도 기록한다 7. 종합: 출처가 아니라 주제별로 정리한다. 결론 먼저 8. 인용: Sources: 목록에 URL. 웹 확인이 안 된 모델 지식 주장에는 [unverified] 표시 9. 보고: 구조화된 출력, 간결하고 실행 가능하게. 확신 수준과 빈틈을 밝힌다 ``` 4단계에서 "공식·1차 출처를 블로그보다 선호한다"고 적혀 있다. 6단계에서 "불일치도 기록한다"고 적혀 있다. 보통 못 하는 소리다. 보통 서로 다른 값을 만나면 하나를 골라 버린다. 여기서는 그걸 남긴다. 7단계에서 "출처가 아니라 주제별로 정리한다"는 게 중요하고 까다롭다. 검색 순서대로 보고서를 쓰면 출처 나열이 된다. 사람한테는 그게 아무 의미 없다. ### 출력 형식 ```markdown ## 조사 요약 (Bottom line first) 질문에 직접 답하는 2~4문장. ## 상세 내용 ### <주제/기준 1> - 핵심 사실 (출처명) ### <주제/기준 2> - ... ## 검증 노트 - 일치하는 점 / 충돌하는 점 / 미확인([unverified]) Sources: - [1] https://… (출처명) - [2] https://… (출처명) ``` 세 번째 섹션이 이 스킬의 특징이다. "뭐가 일치하고 뭐가 안 맞는지"를 보고서에 붙인다. 대부분의 리서치 결과물에 없는 섹션이다. ### 규칙 다섯 개 ```text - 깊이가 속도보다 우선: 기본값이 검색 3회 이상 + 추출 3회 이상 - 환각 금지: 추출이 뒷받침하는 것만 단언하고 불확실성은 표시 - 원문 덮어쓰기 금지: 항상 종합하고 전문을 붙여넣지 않는다 - 시의성 존중: "최신/현재" 질문이면 최근 출처를 우선하고 날짜를 적는다 - 시간 상한: 질문이 너무 크면 집중 패스를 하고 무엇을 덮었는지 말하고 다음 질문을 제안한다 ``` 마지막 항목이 실용적이다. 범위가 큰 질문을 받으면 끝없이 검색하고 끝나지 않는다. 이 스킬은 일부러 멈추고 어디까지 봤는지 밝히는 쪽을 택한다. ## 2. grounded-citations (v1.2.0) `research` 카테고리. Hermes Agent와 Teknium이 함께 만들었다. ```text Ground answers and documents in cited, verifiable sources. ``` 앞 스킬이 "찾아서 정리한다"면 이건 "인용 번호를 틀리지 않게 한다"에 가깝다. 1.2.0으로 버전을 올리면서 이 부분이 가장 많이 강화됐다. ### 언제 쓰는지 범위가 넓게 정의돼 있다. ```text - 리서치, 비교, 뉴스 요약, "X의 현재 상태는?" - 디스크에 쓰는 산출물 중 외부 사실을 인용·요약·보고하는 것 — 보고서, 브리프, 문서, 덱, 위키 - 사용자가 나중에 확인할 법한 팩트 파인딩 - 충돌하는 출처를 각각 출처를 붙여야 하는 다중 출처 종합 ``` 반대로 이럴 땐 건너뛴다. ```text - 검색이 다른 작업의 부수적 단계일 때 — 코딩 중간의 빠른 문법·버전 확인, 일상 대화, 창작물 - 링크를 쓸 가치가 정말 있을 때만 URL을 밝힌다 ``` ### 인용 원장 이 스킬의 핵심은 `sources.py`다. 표준 라이브러리만으로 돌아간다. 원장 위치는 프로필별로 잡히고 `--ledger`나 환경변수로 바꿀 수 있다. ```bash S=~/.hermes/skills/research/grounded-citations/scripts/sources.py python "$S" reset # 새 원장 python "$S" add https://example.com/a --title "A" # 출력: [1] python "$S" add https://example.com/b --title "B" # 출력: [2] python "$S" list # 원장 표 python "$S" render # Sources: 블록 python "$S" verify draft.md # 잘못된 인용 잡기 ``` `add`가 멱등이고 URL을 정규화한다. 같은 페이지는 원장 안에서 항상 같은 번호를 돌려준다. 검색·추출을 여러 바퀴 돌려도 번호가 안정적이다. 이게 이 스킬의 존재 이유다. ### 자주 쓰는 명령 ```text reset 새 작업의 깨끗한 원장 add [--title T] 출처 등록 후 번호 받기 add ... 여러 개 한 번에 ingest results.json JSON 도구 출력에서 등록 quote --text "exact wording" --from page.txt 원문 그대로를 출처에 붙이기 list [--json] 원장 보기 render [--style markdown|plain|footnotes|bibtex|evidence] [--only 1,3] render --cited-in draft.md 초고가 실제로 인용한 것만 render --replace-in draft.md Sources 블록을 원본에서 다시 쓰기 verify draft.md [--strict] [--min-coverage 0.6] [--evidence] ``` `render --cited-in`이 실전에서 가장 자주 쓰인다. 원장에는 10개가 있는데 초고에는 4개만 인용됐다면, 4개만 뽑아내는 게 아니라 원장 전체를 붙이면 읽는 사람이 길을 잃는다. `verify`가 반대편이다. 초고의 인용이 원장과 맞는지 검사하고 커버리지를 잰다. `--min-coverage 0.6`은 인접 문장의 최소 비율을 뜻한다. 문단 하나에 인용이 하나도 없으면 걸린다. ### 함정이 이 스킬의 절반이다 나열된 함정을 그대로 옮기면 이 스킬의 설계 의도가 다 보인다. 전부 실제로 만난 문제다. ```text - 작성 후에 등록하기: 원장은 도구 출력에서 채워야 한다. 초고에서 되짚는 순간 번호가 없애려던 환각 URL이 그대로 되살아난다 - 도중에 번호 바꾸기: 아이디를 손으로 고치지 않는다. 초고가 [4]를 인용하면 [4]는 그 출처여야 한다. reset은 작업 사이에만 한다 - Sources 블록에 URL을 손으로 다시 타이핑하지 않는다: 항상 render. 손으로 친 URL은 검증되지 않은 주장이다 - 검색 스니펫을 읽은 것처럼 페이지 인용하지 않는다: web_search 설명이 말한 것만 지지한다. 본문이 필요하면 web_extract부터 한다 - 과잉 인용: 한 문장에 3개가 상한. 절마다 인용하면 읽히지 않는다 - 코드·설정 산출물에 인용을 붙이지 않는다: 출처 주석은 산출물 본문에, 코드 안이 아니라 - 병렬 서브에이전트: 각 서브에이전트는 작업 디렉터리가 따로 있다. 모두 같은 원장을 가리켜야 번호가 충돌하지 않는다 - 스니펫에서 quote 만들기: 증거 인용은 추출한 페이지 텍스트에서. web_extract 후 저장하고 그 파일을 quote --from으로 - quote --text로 옮겨 쓰기: 원문 그대로 검사에 걸린다. 답은 문장을 다시 쓰는 게 아니라 실제 문장을 찾는 것이다 - [unverified]를 탈출구로 쓰지 않는다: 정말 소스 못 찾는 주장에 붙인다. 대부분에 붙으면 검색이 부족했다는 뜻이다 - Sources 블록을 손으로 편집하지 않는다: render --replace-in을 쓴다 ``` 여기서 특히 두 개를 다시 강조한다. `Sources` 블록을 손으로 타이핑하면 그 URL은 검증되지 않은 주장으로 전부 바뀐다. 그리고 검색 스니펫과 실제 페이지는 다르다. 검색 결과 요약은 문서 첫 줄을 스크롤한 것뿐이니까, 인용하려는 내용이 스니펫에 없었다면 그건 소스에서 온 게 아니다. `[unverified]`에 관해 스킬이 특히 강하게 경고한다. 표지가 터지는 순간 남은 문제다. 대부분의 문장에 붙으면 그건 조사가 부족했다는 뜻이지, 표시를 못 한 게 아니다. 이건 리서치 에이전트가 가장 자주 빠지는 함정이다. ## 3. research-paper-writing (v1.1.0) `research` 카테고리. Orchestra Research가 만들었다. 목표 학회는 NeurIPS, ICML, ICLR이다. ```text Write ML papers for NeurIPS/ICML/ICLR: design→submit. ``` ### 철학 다섯 개 여기서 두 번째 항목이 이전 두 스킬이 지향하는 걸 압축한다. ```text 1. 주도적으로: 질문만 하지 말고 완성된 초고를 낸다. 과학자는 바쁘다. 구체적인 걸 주고 반응을 받는다 2. 인용을 절대 환각하지 않는다: AI가 만든 인용의 오류율은 약 40%다. 항상 프로그램으로 가져온다. 검증 못 한 인용은 [CITATION NEEDED]로 표시한다 3. 논문은 실험의 모음이 아니라 이야기다: 한 문장으로 밝히는 기여가 하나 있어야 한다. 못 하면 논문 준비가 안 된 거다 4. 실험은 주장을 위해 존재한다: 모든 실험이 어떤 주장을 지지하는지 명시해야 한다 5. 일찍 커밋, 자주 커밋: 실험 배치마다, 초고 갱신마다 설명 있는 메시지로 커밋. git log가 실험 이력이 된다 ``` 약 40%라는 숫자가 여기 있다. 기억으로 쓰는 인용 네 개 중 하나 이상은 존재하지 않는다. 이게 두 번째 스킬이 전부 지향하는 방향이고, 세 번째 스킬이 숫자로 확인한 거다. ### 주도성은 단계별로 나뉜다 ```text High (저장소가 명확하고 기여가 분명) → 완성 초고 작성, 전달, 피드백으로 반복 Medium (모호함이 있음) → 불확실성 표시한 초고, 계속 진행 Low (주요한 미지수가 있음) → clarify로 1~2개 타겟 질문 후 초고 ``` 섹션별로도 나뉜다. Abstract·Introduction·Methods·Experiments·Related Work 모두 "직접 작성하되"를 붙인다. 이건 선택지가 아니라 설계다. 질문에 멈추지 않되 함부로 넘기지도 않는다. ### 기여를 먼저 박아둔다 논문 아무것도 쓰기 전에 이걸 답한다. ```text - What: 이 논문이 기여하는 한 가지는 무엇인가 - Why: 어떤 근거가 그것을 지지하는가 - So What: 독자가 왜 신경 써야 하는가 ``` 그리고 TODO 리스트를 세션 간 영속 상태로 둔다. 한 줄 기여, 문헌 조사, 실험 설계, 실행, 분석, 초고, 자기 리뷰(리뷰어 시뮬레이션), 수정, 제출 준비. ### 인용 검증 5단계는 필수 ```text 1. SEARCH → Semantic Scholar 또는 Exa MCP로 구체적 키워드 질의 2. VERIFY → Semantic Scholar + arXiv/CrossRef 2곳 이상에서 논문 존재 확인 3. RETRIEVE → DOI content negotiation으로 BibTeX를 프로그램으로 받기 (기억 금지) 4. VALIDATE → 인용하려는 주장이 실제로 그 논문에 있는지 확인 5. ADD → 검증된 BibTeX를 참고문헌에 추가 어느 한 단계라도 실패하면 [CITATION NEEDED]로 표시하고 과학자에게 알린다 ``` BibTeX를 가져오는 코드다. ```python import requests def doi_to_bibtex(doi: str) -> str: response = requests.get( f"https://doi.org/{doi}", headers={"Accept": "application/x-bibtex"} ) response.raise_for_status() return response.text ``` `"Accept": "application/x-bibtex"` 하나로 DOI가 BibTeX를 돌려준다. 핵심은 이 한 줄이다. 정리하자면 4단계에서 VALIDATE가 꼭 필요하다. 논문이 존재하는 것과 그 논문이 네 주장을 지지하는지는 별개다. 존재하는 논문을 인용해놓고 거기가 다른 이야기를 하는 경우가 이 단계에서 걸러진다. 검증 실패한 자리는 이렇게 남긴다. ```latex \cite{PLACEHOLDER_author2024_verify_this} % TODO: 이 인용 확인 필요 ``` 그리고 반드시 이렇게 말하라고 스킬이 지시한다. ```text "I marked [X] citations as placeholders that need verification." ``` 숨기지 말라는 것이다. 조용히 통과시키면 나중에iscovery하는 사람이 저자다. ### 관련 문헌 정리법 방법별로 묶어야 한다. ```text 좋음: "한 갈래의 일은 X의 가정을 쓰지만 [refs], 우리는 Y의 가정을 쓰는데 그 이유는..." 나쁨: "Smith 등이 X를 소개했다. Jones 등이 Y를 소개했다. 둘을 결합한다." ``` 논문 하나씩 소개하면 그게 목차다. 방법 사이의 관계를 써야 관련 문헌 섹션이 된다. ## 이번 편 정리 | 스킬 | 버전 | 하는 일 | | --- | --- | --- | | deep-web-investigation | 1.0.0 | 반복 검색·삼각측량·교차 확인 후 주제별 종합 | | grounded-citations | 1.2.0 | 인용 번호 원장으로 URL 오류와 미검증 인용 차단 | | research-paper-writing | 1.1.0 | 인용 검증 5단계를 거쳐 논문 초고까지 | 셋이 하나의 흐름을 이룬다. 찾아서, 번호를 붙여서, 논문 형식으로 만든다. 세 스킬 모두 내 기억을 근거로 삼지 말라고 강제한다. 그게 리서치에서 에이전트가 저지르는 가장 큰 사고다. 앞으로는 6편에서 노션·옵시디언·PDF를 에이전트에게 맡기는 쪽으로 넘어간다.