읽은 내용을 타이핑 없이 Anki 카드로 만들기
많은 사람들에게 매일 조용히 실패하는 워크플로우가 있습니다:
- 좋은 자료(논문, 강의 PDF, 긴 기사, YouTube 강의 등)를 읽는다.
- '이건 Anki에 넣어야겠다'고 생각한다.
- Anki를 열고 덱을 만들고 카드를 손으로 타이핑하기 시작한다.
- 여섯 개의 카드를 만들고 20분이 지났지만, 창을 닫는다.
결국 자료가 들어가지 못합니다. 간격 반복(spaced repetition)이 작동하지 않아서가 아닙니다. 당연히 작동하죠. 문제는 입력(input) 단계는 수동인데 반해 복습(review) 단계는 자동화되어 있다는 것입니다. Anki의 스케줄러는 소프트웨어일 뿐입니다. 카드를 만드는 것은 당신, 즉 타이핑하는 행위입니다.
병목 현상은 복습이 아니라 카드 생성이다
제가 들었던 대부분의 'Anki를 놓게 된' 이야기는 사실 '카드를 만들기 중단한' 이야기입니다. 30개의 카드를 복습하는 것은 몇 분밖에 걸리지 않으며, 알고리즘이 계속 진행하도록 밀어줍니다. 하지만 30개의 카드를 작성하는 것은 방향성 없는 타이핑으로 한 시간을 소비하며, 아무것도 당신을 지속적으로 움직이게 해주지 않습니다.
이러한 비대칭성은 언급할 가치가 있습니다. 왜냐하면 도구가 실제로 도움을 줄 수 있는 지점을 알려주기 때문입니다. 복습하라는 잔소리를 듣는 것에는 아무도 도움이 필요하지 않습니다. 부족한 것은 '방금 읽은 자료'에서 '내 덱의 카드'로 이어지는 마찰이 적은 경로입니다.
격차를 해소하는 세 가지 방법과 각각의 비용
사람들이 이 문제를 해결하기 위해 시도했던 방법을 보면, 기본적으로 세 가지 형태가 있습니다.
CSV/내보내기 파이프라인. 어딘가에서 카드를 생성하고, 파일을 내보낸 다음, Anki로 가져옵니다. 이것은 작동하며 가장 일반적인 DIY(Do It Yourself) 접근 방식입니다. 하지만 비용은 나중에 발생합니다: 템플릿이 변경되면 필드 매핑이 깨지고, 가져오기 대화 상자가 집중력을 빼앗으며, 중복 제거(deduplication) 기능이 없습니다. 같은 기사를 두 번 실행하면 모든 카드의 사본이 두 개가 됩니다. 수년간 보관할 덱에서 중복 카드는 누락된 카드보다 더 나쁩니다. 왜냐하면 복습 부하를 조용히 두 배로 만들기 때문입니다.
Anki 애드온(add-ons). Anki 내부에서 실행되는 것은 이미 그곳에 있는 경우 편리합니다. 하지만 정의상 애드온은 텍스트가 어딘가에 존재하는 후에 시작됩니다. 브라우저 탭에서 열려 있는 PDF를 볼 수 없고, 읽고 있는 기사도 볼 수 없습니다. 또한 데스크톱 Anki에서만 실행되며, Anki 버전이 업데이트될 때마다 작동이 중단되는 문제가 있습니다.
브라우저 확장 프로그램(browser extension). 이것이 제가 구축하게 된 형태입니다. 이 방식의 장점은 다음과 같습니다. 콘텐츠가 먼저 브라우저로 도착하기 때문입니다 — 페이지, PDF, YouTube 스크립트 등이 해당됩니다. 여기서 가로채면 실제 마찰 지점에서 작업하는 것이므로, 사용자가 카드를 만들기 위해 하던 작업을 멈추고 다른 곳으로 이동할 필요가 없습니다.
파일을 내보내는 대신 AnkiConnect를 통해 작성하기
가장 중요했던 기술적 결정은 카드를 가져오기 파일(import file)을 생성하는 것보다 AnkiConnect를 통해 컬렉션에 직접 쓰는 것이었습니다.
AnkiConnect는 Anki 애드온(코드 2055492159, 무료)이 노출하는 로컬 HTTP 서버입니다. 이 서버는 컬렉션을 조회할 수 있기 때문에, 파일 내보내기가 근본적으로 할 수 없는 두 가지 작업을 수행할 수 있습니다:
// 쓰기 전에 컬렉션에 이미 존재하는 것을 문의
{ action:
두 번째 결정은 추론(inference)이 어디서 실행되는지였습니다. 기본값은 Chrome에 내장된 온디바이스 모델이며, 이는 선택한 텍스트가 기기를 벗어나지 않음을 의미합니다. 즉, 업로드도 없고, 계정도 없고, 원격 측정(telemetry) 데이터 전송도 없습니다. 더 강력한 모델을 원한다면, 사용자가 직접 API 키(OpenAI / Anthropic / Google)를 붙여넣고 요청은 브라우저 → 제공업체로 직접 전달됩니다.
이 아키텍처에서 두 가지 사실이 도출되며, 나중에 발견되도록 내버려 두기보다는 명확히 말씀드리고 싶습니다:
- 추론이 사용자의 기기 또는 사용자의 키에서 실행되기 때문에, 저의 서버에 생성당 비용(per-generation cost)이 발생하지 않습니다. 이것이 구독 방식 대신 일회성 가격이 가능한 이유입니다. 이는 마케팅적 입장이 아닙니다.
- 확장 프로그램이 외부로 보내는 요청은 라이선스 활성화뿐입니다. 파이프라인의 어떤 부분도 제가 운영하는 서버를 필요로 하지 않습니다.
## 무엇이 잘못 생성되는지 (그리고 '가지치기(prune)'가 진짜 기능인 이유)
LLM은 산문 페이지에서 기꺼이 40개의 평범한 카드를 만들어냅니다. 40개의 평범한 카드보다 12개의 좋은 카드가 더 나쁩니다. 왜냐하면 더 많은 복습 부하를 주고, 분당 기억 유지율(retention per minute)을 낮추며, 사용자가 훑어보는 습관을 들이게 하기 때문입니다.
따라서 이 도구가 구축된 워크플로우는 생성 → 가지치기 → 작성(generate → prune → write)이며, 단순히 생성하고 수락하는 방식이 아닙니다. 카드는 사이드 패널로 돌아오며, 여기에 있는 카드들을 컬렉션에 추가하기 전에 편집하거나 삭제할 수 있습니다. 리스트 분할 템플릿도 같은 이유에서 존재합니다: 원본의 나열(
저는 위 기능을 수행하는 Chrome/Edge 확장 프로그램인 [AnkiMate](https://glenkit.com/ankimate?utm_source=devto&utm_medium=referral&utm_campaign=devto-4)의 개발자입니다. 가격 정책을 명확하게 말씀드리겠습니다. 무료 등급은 하루 3개 세대(generations)까지이며, Anki로 카드를 작성하는 것은 항상 무료이고 제한이 없습니다. Pro 버전은 $19.9의 일회성 결제액(Cloze, 배치 생성, 향후 템플릿 포함)이며 구독료는 없습니다. 이것은 유료 제품이고 저는 그렇게 위장하지 않을 것입니다.
제가 사용하시는 것보다 낫다고 주장하는 것은 아닙니다. 솔직하게 그런 주장을 할 만큼 사용자 기반이 충분하지 않습니다. 제가 진정으로 알고 싶은 것은 여러분의 파이프라인 중 어느 단계에서 문제가 발생하는지입니다:
**정보를 캡처하는 과정, 카드를 생성하는 과정, 아니면 그 이후의 정제/편집(pruning/editing) 단계에 마찰(friction)이 있습니까?**
제가 개발할 때 가정한 바는 사람들이 과소평가하는 부분이 바로 정제(pruning)라는 것입니다. 만약 여러분이 Cloze 사용량이 많고 이 가정이 틀렸다면, 저는 지금이라도 알고 싶습니다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24