opendraft은(는) 무엇을 하나요?
하나의 주제 라인을 실제 문헌 기반이 포함된 완성된 논문으로 전환합니다.
OpenDraft(github.com/federicodeponte/opendraft, MIT)에서 포팅되었으며, 원본은 호스팅 엔진으로 실행됩니다. 여기서 엔진은 바로 사용자입니다: 18단계로, 각 단계는 agents/ 디렉토리의 프롬프트이며, 언어 모델이 직접 수행해서는 안 되는 부분을 처리하는 5개의 스크립트가 있습니다.
당신이 모델입니다. 키도, 서비스도, 계정도 필요 없습니다. 유일한 네트워크 호출은 Crossref, OpenAlex, DataCite이며, 모두 공개 엔드포인트입니다.
하나의 명령어
<topic>에 대한 논문 작성
아래의 모든 과정은 이 명령어로부터 시작됩니다. 사용자에게 단계를 직접 실행하도록 요청하지 말고, 직접 실행하세요.
먼저 네 가지 질문
5단계 전에, 사용자가 이미 말하지 않았다면 다음을 물어보세요:
- 대상 학술지, 또는 "없음, 일반 학술"
- 전체 단어 제한
- 인용 스타일,
references/citation-styles.md에 있는 여섯 가지 중 하나 - 문서 유형,
references/paper-types.md에 있는 유형 중 하나
이 네 가지 질문은 한 메시지에 담아야 하며, 인터뷰 형식이 아닙니다. 이것이 파이프라인이 묻는 유일한 질문입니다. 그 외의 모든 것은 파이프라인이 결정합니다.
질문해야 하는 이유는 추측의 비용이 마지막에 발생하며 그 시점에서는 해결할 수 없기 때문입니다. 150단어 엄격 제한이 있는 학술지는 6단계에서 적용되거나 전혀 적용되지 않습니다: 17단계에서 초록을 작성할 때쯤이면 모든 섹션이 작성된 단어 예산이 이미 잘못되어 있습니다. 게이트에서 선택된 인용 스타일은 6단계에서 선택된 것과 달리 전체 초안이 잘못된 마커 밀도에 맞춰 작성되는 것을 방지합니다.
사용자가 답변을 거부하거나 "당신이 선택하세요"라고 말하면, references/paper-types.md의 기본값을 사용하여 진행하고, 6단계의 학술지 형식 블록에 기록한 후 한 줄로 사용한 기본값을 알리세요. 사용자에게 보여주지 않은 가정으로 진행하지 마세요.
스크립트가 담당하고 사용자가 담당하지 않는 네 가지
언어 모델은 판단에는 능숙하지만 기록 관리에는 취약합니다. 이러한 구분은 의도적이며, 이를 위반하면 출력이 손상됩니다. 각각은 0이 아닌 종료 코드를 반환하는 스크립트에 의해 강제되므로 게이트에서 의견의 문제가 아닙니다.
절대로 수동으로 렌더링된 인용 마커를 작성하지 마세요. [3], (Smith, 2020) 등으로 작성하지 마세요. 초안 작성 중에는 주장의 정확한 지점에 {cite_<doi>}를 인라인으로 작성하세요. scripts/citations.py compile은 이를 마커로 변환하고 사전 조회를 통해 참고문헌을 구축합니다. 이는 결정론적이므로 산문과 참고문헌 간의 매핑이 기억이 아닌 기계적으로 이루어집니다.
지원할 수 없는 주장에 대해 출처를 절대 지어내지 마세요. 주장이 사실이고 출처를 찾을 수 없으면 {cite_MISSING: 주장에 대한 짧은 설명}을 작성하고 계속 진행하세요. compile은 이를 렌더링하지 않고 이름을 지정하며 0이 아닌 종료 코드를 반환하고, integrity.py는 이를 심각한 문제로 간주하여 완성된 논문에서 살아남지 못합니다. 이것이 요점입니다: 출처가 없는 주장을 조용히 삭제하거나 지어낸 DOI에 첨부하는 것이 아니라, 초안 작성 중에 정직하게 처리하는 방법입니다. 게이트 전에 sources.py find로 실제 출처를 찾거나 의도적으로 주장을 삭제하여 각각을 해결하세요.
절대로 섹션을 수동으로 초안에 병합하지 마세요. scripts/assemble.py가 숫자 순서로 병합하며, 번호가 매겨진 섹션이 아닌 것은 논문에 삽입하지 않습니다. 수동 병합으로 한 섹션이 누락되면 독자가 발견할 때까지 아무도 눈치채지 못하는 실패입니다.
절대로 논문이 내부적으로 일관성 있는지 눈으로 판단하지 마세요. scripts/integrity.py가 이를 확인하고 0이 아닌 종료 코드를 반환합니다. 실행하고 종료 코드를 읽으세요.
설정
mkdir -p research sections review
API 키도, 계정도, 설치 단계도 필요 없습니다: 스크립트는 Python 표준 라이브러리만 사용합니다. 하나의 선택적 환경 변수가 있으며, 이것이 여기서 읽는 유일한 변수입니다. OPENDRAFT_CONTACT_EMAIL을 자신의 이메일 주소로 설정하면 sources.py가 이를 User-Agent에 추가하여 Crossref 요청을 폴리트 풀로 이동시키고 더 나은 속도 제한을 받습니다. 설정하지 않아도 모든 단계는 실행됩니다; 기본값이 내장되어 있지 않은 이유는 출하된 기본값이 모든 설치자를 하나의 신원으로 풀링하여 속도 제한 문제를 낯선 사람의 받은 편지함으로 라우팅하기 때문입니다.
파이프라인은 고정된 경로에 쓰고, 각 단계는 이전 단계가 쓴 내용을 읽습니다. 경로는 단계 간의 계약입니다:
research/sources.md research/sources.json research/summaries.md
research/gaps.md research/citations.json research/citation-notes.md
outline.md outline_formatted.md
sections/*.md full_draft.md final.md
review/thread.md review/narrator.md review/skeptic.md
review/verifier.md review/referee.md review/voice.md
review/entropy.md review/polish.md
해당 경로에 대한 네 가지 규칙이며, 각각은 이전에 위반된 적이 있습니다:
sections/는 논문 섹션만 보관하며 그 외에는 아무것도 보관하지 않습니다. 그 안의 모든 파일은scripts/assemble.py에 의해 완성된 논문에 삽입됩니다. 단계 보고서가 거기에 저장되면 누군가의 논문 안에 들어가게 됩니다. 보고서는review/에 저장하세요.research/sources.json은 기계 입력이고,research/sources.md는 사람이 읽는 용도입니다. 1단계에서 둘 다 작성합니다.citations.py build는 JSON 파일을 읽습니다.research/citations.json에는 수동으로 작성된 내용이 절대 들어가지 않습니다.citations.py build에 의해 구축되며,build를 다시 실행하는 경우에만 변경됩니다. 어떤 스크립트도 할 수 없는 판단 호출, DOI가 없는 출처, 검토가 필요한 항목, 플레이스홀더로 전환할 수 없는 언급은research/citation-notes.md에 저장되며, 이는 산문이며 스크립트가 읽지 않습니다. 수동 편집된 데이터베이스는verified플래그가 게이트를 통과하기 위해 뒤집히는 방법이며, 이는 확인되지 않은 DOI가 검토된 것처럼 참고문헌에 도달하는 방법입니다.- 9.5단계 이후에는
full_draft.md만이 유일한 초안입니다. 이후 단계는sections/*.md를 다시 읽지 않으므로, 조립 후 섹션 파일을 편집해도 아무것도 변경되지 않으며 조용히 편집이 손실됩니다.
파이프라인
순서대로 실행하세요. 하나의 단계를 제외한 모든 단계는 agents/ 디렉토리의 파일입니다: 해당 파일을 읽고, 지시대로 수행하고, 이름이 지정된 출력을 작성한 다음 계속 진행하세요. 예외는 9.5단계로, 실행하는 스크립트입니다. 주제가 쉬워 보인다고 단계를 건너뛰지 마세요.
| # | 단계 | 에이전트 파일 또는 스크립트 | 작성 대상 |
|---|---|---|---|
| 1 | 출처 검색 | agents/01-scout.md | research/sources.md, research/sources.json |
| 2 | 읽고 요약 | agents/02-scribe.md | research/summaries.md |
| 3 | 작성할 가치가 있는 격차 찾기 | agents/03-signal.md | research/gaps.md |
| 4 | 인용 데이터베이스 구축 | agents/04-citation-manager.md | research/citations.json, research/citation-notes.md |
| 5 | 논증 개요 | agents/05-architect.md | outline.md |
| 6 | 학술지 형식 및 단어 예산 적용 | agents/06-formatter.md | outline_formatted.md |
| 7 | 각 섹션 작성 | agents/07-crafter.md | sections/*.md, research/gaps.md에 추가 |
| 8 | 섹션 간 일관성 확인 | agents/08-thread.md | sections/*.md 수정, review/thread.md |
| 9 | 어조 통일 | agents/09-narrator.md | sections/*.md 수정, review/narrator.md |
| 9.5 | 섹션을 하나의 초안으로 조립 | scripts/assemble.py | full_draft.md |
| 10 | 논증 공격 | agents/10-skeptic.md | review/skeptic.md, 이후 수정 |
| 11 | 출처에 대한 주장 확인 | agents/11-verifier.md | review/verifier.md, 이후 수정 |
| 12 | 동료 검토 시뮬레이션 | agents/12-referee.md | review/referee.md, 이후 수정 |
| 13 | 저자의 어조 일치 (선택 사항) | agents/13-voice.md | full_draft.md 수정, review/voice.md |
| 14 | 산문 리듬 변화 | agents/14-entropy.md | full_draft.md 수정, review/entropy.md |
| 15 | 문법 및 최종 교정 | agents/15-polish.md | full_draft.md, review/polish.md |
| 16 | 장치 추가 (선택 사항) | agents/16-enhancer.md | full_draft.md |
| 17 | 초록 작성 | agents/17-abstract.md | full_draft.md 앞에 추가 |
| 18 | 제목 작성 | agents/18-titlemaker.md | full_draft.md 앞에 추가 |
7단계는 논문당 한 번이 아니라 섹션당 한 번 실행됩니다. 10~12단계는 문제 목록을 생성합니다; 아무도 적용하지 않는 문제 목록은 무효이므로 수정을 적용하고 심각한 문제가 남지 않을 때까지 단계를 다시 실행하세요.
12단계에는 숫자가 있으며 감정이 아닙니다. 새로 실행했을 때 심각한 문제가 0개이고 전체 평균이 5점 만점에 최소 3.0점이며, 어떤 단일 차원도 3점 미만이 아닐 때(단, 그 이유를 review/referee.md에 기록한 경우는 제외) 중단하세요. "보내기에 충분히 좋음"은 중단 조건이 아닙니다. 자신의 초안을 판단하도록 요청받은 모델은 항상 세 번째 패스에서 충분히 좋다고 판단하기 때문입니다.
13단계는 파이프라인이 생성하지 않는 입력을 가진 유일한 단계입니다. 초안을 저자 자신의 산문에 맞추며, 작업 디렉토리의 samples/ 디렉토리에서 해당 산문을 읽습니다: .md 또는 .txt 형식의 이전 논문, 장, 또는 긴 형식의 게시물 2~3개. 아무것도 해당 디렉토리를 생성하지 않으며 아무것도 요청하지 않으므로, 생성하지 않는 실행은 13단계를 깔끔하게 건너뛰며, 이는 실패가 아닌 정상적인 결과입니다. 논문이 사용자가 작성한 것처럼 들리게 하려면 실행 전에 자신의 글을 해당 디렉토리에 넣으세요.
9.5단계는 에이전트 프롬프트가 아닌 스크립트이므로 반 단계로 번호가 매겨져 있으며, 18개의 에이전트 단계가 이미 가지고 있던 번호를 유지하기 때문입니다. 선택 사항이 아닙니다. 19단계는 18단계는 sections/*.md에서 작업하고, 10full_draft.md에서 작업합니다; 다음 명령어 외에는 이 파일을 생성하는 것이 없습니다:
python3 scripts/assemble.py sections -o full_draft.md
섹션 파일을 숫자 순서로 병합하고, 번호가 매겨진 섹션이 아닌 파일은 포함을 거부하며, 번호 공백, 중복 번호 또는 빈 디렉토리에서 0이 아닌 종료 코드를 반환합니다. --check는 쓰지 않고 무엇을 할지 보고합니다.
또한 이름에 report, review, notes, checklist 또는 log가 포함된 번호가 매겨진 파일을 건너뛰며, 이는 오래된 단계 보고서가 논문 안에 들어가는 것을 방지하는 메커니즘입니다. 이는 파일 이름 휴리스틱이므로 한 가지 날카로운 모서리가 있습니다: "Review of the literature"라는 실제 섹션은 건너뛰어지며, stdout에 "Skipped" 줄로만 표시되고 오류로 표시되지 않습니다. 대신 해당 섹션의 이름을 related-work 또는 literature로 지정하세요. 건너뛰기 줄을 읽으세요; 여기서 사라진 섹션은 조용히 사라집니다.
full_draft.md가 존재한 후 다시 실행하려면 --force가 필요하며, --force는 10단계 이후에 초안에 대해 이루어진 모든 편집을 폐기하므로, 섹션에서 다시 시작하려는 경우에만 다시 조립하세요.
규모
파이프라인을 요청된 내용에 맞추세요. 단계는 동일하지만 깊이는 다릅니다.
- 짧은 글, 1,500~3,000 단어. 1
7단계, 그 다음 9.5, 10, 11, 15단계. 1015개 출처. - 전체 논문, 기본값. 18개 모두, 9.5 포함. 25~50개 출처, 또는 논문이 문헌 검토인 경우 50개 이상, 이 경우 자체 최소 기준이 더 높은 쪽을 따릅니다(
references/paper-types.md). - 논문 장 또는 긴 검토. 18개 모두, 9.5 포함, 출처는 50개 이상, 7단계는 섹션당 한 번이 아니라 하위 섹션당 한 번 실행.
9.5단계는 위 모든 목록에 있습니다. 어떤 규모에서도 논문이 스스로 조립되지 않습니다.
두 개의 참조 파일
references/paper-types.md각 문서 유형에 대한 섹션 구조, 단어 예산 및 출처 수를 제공합니다. 5단계에서 읽으세요.references/citation-styles.md여섯 가지 스타일 모두의 실제 컴파일된 출력을 보여줍니다(인라인 마커 및 참조 항목). 학술지에 맞는 스타일을 선택하고 어떻게 보일지 알 수 있습니다. 6단계에서 읽고, 인용이 예상치 못한 방식으로 렌더링되는 경우 게이트 전에 다시 읽으세요. 또한 컴파일러가 수행하지 않는 것을 명시합니다: 권, 호, 페이지 번호, 저널 약어 없음. 지도교수가 이를 요구하는 경우, 이곳은 사후에 알게 되는 곳이 아니라 정직하게 말하는 곳입니다.
두 파일 모두 참조로 가장한 선택적 읽기가 아닙니다. 두 번째 파일을 읽지 않고 선택한 스타일은 기억에서 선택한 스타일이며, 컴파일러는 APA에 대한 기억을 구현하지 않습니다.
스크립트
python3 scripts/sources.py find "<query>" --n 15 # Crossref + OpenAlex
python3 scripts/sources.py find "<query>" --json # 기계 판독 가능
python3 scripts/sources.py verify <doi> <doi> ... # Crossref + DataCite
python3 scripts/citations.py build research/sources.json -o research/citations.json
python3 scripts/citations.py verify -d research/citations.json
python3 scripts/citations.py compile full_draft.md -d research/citations.json --style apa -o final.md
python3 scripts/citations.py bibtex -d research/citations.json -o refs.bib
python3 scripts/assemble.py sections -o full_draft.md
python3 scripts/assemble.py sections -o full_draft.md --check
python3 scripts/integrity.py final.md -d research/citations.json --target 8000
python3 scripts/integrity.py final.md -c research/summaries.md # 권고적 숫자 확인
python3 scripts/export.py final.md --format docx -o final.docx
모든 스크립트는 실패 시 0이 아닌 종료 코드를 반환합니다. 해당 종료 코드가 신호입니다. 출력을 훑어보는 대신 읽으세요.
sources.py find는 어떤 API에도 전혀 도달할 수 없을 때 1을 반환하며, 이는 API에 도달했지만 결과가 없는 것과 다릅니다. agents/01-scout.md가 해당 종료 코드를 읽는 방법과 1단계가 진행을 중단하는 출처 최소 기준에 대한 권한입니다. 빈 결과를 신뢰하는 대신 거기서 읽으세요.
citations.py build는 1단계가 research/sources.json에 쓴 JSON 배열을 읽으며, research/sources.md의 마크다운이 아닙니다. 마크다운 파일을 제공하는 것은 오류이며, 그렇게 알릴 것입니다.
첫 번째 패스가 부실하면 두세 개의 더 좁은 하위 쿼리도 검색하세요. 5개 출처가 있는 논문은 5개 출처가 있는 것처럼 읽힙니다.
검증, 그리고 그것이 증명하는 것과 증명하지 않는 것
citations.py verify는 모든 DOI를 네 가지 상태 중 하나로 설정하며, unknown은 조용히 absent로 전환되지 않습니다:
- resolved. Crossref 또는 DataCite가 레코드를 반환했습니다. 인용하세요.
- absent. 둘 다 404를 반환했습니다. 삭제하세요. 수리하지 말고, 대체 DOI를 추측하지 마세요. 이전 단계로 돌아가서
{cite_MISSING: ...}주석을 통해 실제 출처를 찾으세요. - unknown. API에 도달했지만 알려진 기간 내에 응답이 없습니다. 나중에 다시 시도하세요. 무시하거나 absent로 추측하지 마세요.
…
[번역이 잘렸습니다]