2026년 10월 5일 월요일

[KORG X2] 오후 내내 RAG를 만지작거리다가 원래 자리로 돌아왔다

오늘 오전에는 Korg X2/X3 매뉴얼을 좀 더 편하게 찾아보기 위한 작은 프로그램을 만들었다(원본 글). 가지고 있는 매뉴얼 PDF는 오래된 스캔 자료라서 텍스트를 직접 검색할 수 없다. 우선 OCR을 거쳐 각 페이지의 글자를 추출하고, 어느 매뉴얼의 몇 번째 PDF 페이지에서 나온 글인지 알 수 있도록 JSON 파일로 정리하였다. 여기에 Ollama에서 로컬로 실행하는 qwen3:1.7b를 이용하여 한국어 질문을 검색에 적합한 영어 표현으로 바꾸고, 관련성이 높은 매뉴얼 페이지를 찾아주는 기능을 붙였다. 검색된 페이지는 원래 PDF의 모습 그대로 화면에서 볼 수 있게 하였다.

처음에는 검색된 내용을 다시 언어모델에 넘겨 질문에 대한 답까지 만들어 보기도 했다. 그런데 여기에서 작은 문제가 발견되었다. 검색된 원문에는 없는 용어나 수치를 언어모델이 그럴듯하게 만들어 답에 섞는 일이 있었다. 오래된 신시사이저의 사용법을 알아보려고 매뉴얼을 찾는 것인데, 없는 기능을 AI가 만들어내면 곤란하다. 그래서 AI가 답을 대신 써 주게 하는 것보다 관련된 원문 페이지를 잘 찾아서 내가 직접 읽는 것이 이 용도에는 더 안전하겠다는 생각이 들었다.

그렇게 해서 오전 작업의 결과물은 거창한 AI 챗봇이라기보다는 일종의 지능형 매뉴얼 검색기에 가까워졌다. 한국어로 질문하면 관련성이 높은 페이지 몇 개를 제시하고, 그중 하나를 선택하면 실제 매뉴얼 페이지를 보여준다. Basic Guide와 Reference Guide의 목차를 이용해서 직접 찾아 들어갈 수도 있다. 인터넷 연결도 필요 없고 API 사용료도 들지 않는다. 드럼 키트의 편집 위치나 snare drum의 pitch 조정처럼 구체적인 질문에는 꽤 쓸 만한 페이지를 찾아 주었다. 여기까지만 해도 처음 원했던 것은 거의 이루어진 셈이었다.

그런데 오후가 되자 욕심이 생겼다. 예를 들어 “왼손으로는 베이스, 오른손으로는 피아노를 연주하려면 어떻게 하나?”와 같은 질문을 생각해 보았다. 사람이라면 이것이 건반을 두 영역으로 나누는 split 설정에 관한 질문이라는 것을 쉽게 알아듣는다. Korg X2의 구조를 조금 아는 사람이라면 Combination에서 각 Timbre의 Key Window를 설정하는 부분을 찾아야 한다는 것도 짐작할 수 있다. 그러나 작은 언어모델과 단순한 검색의 조합은 반드시 그렇게 생각하지 않았다.

여기에서 오후의 삽질이 시작되었다. 요즘 문서 기반 AI를 이야기하면 빠지지 않고 등장하는 것이 RAG(Retrieval-Augmented Generation), 즉 검색 증강 생성이다. 오전에 만든 프로그램도 넓게 보면 검색한 원문을 언어모델과 연결한다는 점에서 아주 단순한 RAG라고 할 수 있다. 그렇다면 조금 더 제대로 된 RAG 방식을 적용하면 검색 성능이 좋아지지 않을까 하는 생각이 들었다.

우선 페이지 전체를 검색 단위로 삼는 것이 문제일 수 있다고 생각하여 매뉴얼의 OCR 텍스트를 작은 덩어리, 즉 chunk로 나누었다. Basic Guide와 Reference Guide를 합쳐 모두 609개의 chunk가 만들어졌다. 결과를 직접 살펴보니 나누어진 모양 자체는 제법 괜찮았다. Split과 관련된 Key Window 설명도 적절한 덩어리로 잡혔고, snare drum의 Tune이나 tempo 설정에 관한 설명도 잘 나뉘어 있었다.

다음에는 각 chunk의 의미를 숫자로 표현하는 embedding을 만들었다. Ollama에서 nomic-embed-text 모델을 사용하였다. 609개의 chunk를 모두 embedding하는 데 내 노트북에서 약 249초가 걸렸다. 질문도 같은 방법으로 벡터로 만들면 단어가 정확하게 일치하지 않더라도 의미가 비슷한 설명을 찾을 수 있을 것이라고 기대하였다.

여기에 CrossEncoder라는 것도 동원하였다. embedding 검색으로 우선 후보를 뽑고, 질문과 각각의 후보를 다시 함께 비교하여 관련성을 좀 더 정밀하게 평가하는 reranking 방식이다. 문서 검색에서는 이미 널리 사용되는 전형적인 2단계 구조라고 한다. 처음에는 609개 chunk를 전부 CrossEncoder로 비교해 보았는데 너무 느렸고, 그래서 embedding으로 상위 20개 후보를 먼저 고른 뒤 그 후보만 다시 순위를 매기는 방식으로 바꾸었다. 어느새 오래된 신시사이저 매뉴얼을 좀 편하게 읽겠다는 일이 작은 정보검색 실험으로 변하고 있었다.

결과는 흥미로웠다. Snare pitch나 tempo처럼 질문과 매뉴얼의 용어가 비교적 잘 대응하는 경우에는 아주 잘 작동하였다. 정답에 해당하는 chunk가 embedding 검색에서 처음부터 1위에 들어왔고 reranking을 거친 뒤에도 1위를 유지하였다. 하지만 정작 개선하고 싶었던 split 질문은 그렇지 않았다. 관련된 Key Window chunk 하나가 embedding 검색 후보 16위에 겨우 들어왔고 reranking 뒤에는 5위가 되었다. 더 직접적으로 관련된 다른 chunk는 상위 20개 후보에도 들어오지 못했다. 엉뚱한 effect 관련 설명이 최종 1위를 차지하는 경우도 있었다.

검색 한 번에는 3초 남짓이 걸렸다. 오전에 만든 단순한 검색보다 구조는 훨씬 복잡해졌지만 결과가 그만큼 좋아졌다고 하기는 어려웠다. “왼손은 베이스, 오른손은 피아노”라는 일상적인 표현과 “Combination mode의 Timbre별 Key Window”라는 Korg X2의 전문 용어 사이에는 상당한 의미의 간격이 있다. 문서를 잘게 나누고 벡터를 만들고 순위를 다시 매긴다고 해서 그 간격이 저절로 사라지는 것은 아니었다.

그러다 문득 내가 왜 이 일을 하고 있는지를 다시 생각하게 되었다. 내가 필요한 것은 Korg X2에 관한 질문이라면 무엇이든 대답하는 인공지능이 아니다. 오래된 매뉴얼 두 권에서 내가 읽어야 할 페이지를 빨리 찾아주는 도구가 필요했을 뿐이다. 그렇게 생각하고 나니 오전에 만든 단순한 프로그램이 다시 달리 보였다.

질문을 입력하면 관련성이 높은 페이지 세 개 정도가 나온다. 그중 하나를 선택하여 원본 매뉴얼을 읽고, 설명이 앞뒤로 이어진다면 화살표를 눌러 한 페이지씩 넘겨 보면 된다. 결국 오후 늦게 프로그램에 추가한 가장 유용한 기능은 복잡한 RAG 기법이 아니라 PDF 페이지를 앞뒤로 넘기는 좌우 화살표였다. PDF를 작게 만드는 별도의 버튼도 처음에는 만들어 보았지만 그것조차 필요 없었다. 브라우저 창의 폭을 조절하면 PDF도 선명한 상태로 따라서 줄어든다. 몇 시간 동안 embedding, chunking, reranking을 돌아다닌 뒤 도착한 곳은 결국 책에서 관련 페이지를 찾아 앞뒤로 넘겨 읽는 방식이었다.

오늘 오후의 경험에서 얻은 교훈은 RAG나 embedding의 원리를 조금 더 알게 되었다는 것만은 아니다. 오히려 이미 잘 알려진 문제를 너무 처음부터 다시 풀려고 했다는 생각이 들었다. 문서 검색에는 오랫동안 사용되어 온 방법이 있고, embedding 검색과 reranking 역시 각각 어디에서 유용하고 어떤 한계를 갖는지 많은 사람이 이미 경험하였다. 그런데 AI가 코드를 척척 만들어 주니 “이것이 잘 안 되면 이것도 붙여 보자”는 식으로 하나씩 직접 시험하게 되었고, 어느 순간 남들이 이미 겪은 시행착오를 작은 Korg 매뉴얼 두 권을 가지고 다시 재현하고 있었다.

생각해 보면 AI를 이용한 프로그래밍에서 이것은 꽤 조심해야 할 점이다. 예전에는 새로운 방법을 시험하려면 코드를 작성하는 비용이 컸기 때문에 시작하기 전에 방법을 충분히 조사할 수밖에 없었다. 지금은 AI에게 부탁하면 몇 분 안에 다음 실험을 위한 코드가 나온다. 구현 비용이 낮아진 덕분에 오히려 충분히 조사하지 않고 여러 방법을 차례로 시험해 보는 일이 쉬워졌다. 코드를 빨리 만들 수 있다는 것과 문제를 빨리 해결한다는 것은 같은 뜻이 아니다.

다음에는 순서를 조금 바꾸어야겠다. 먼저 내가 풀려는 문제가 이미 어떤 이름으로 불리는지 알아보고, 그 문제에 널리 쓰이는 가장 단순한 방법이 무엇인지 찾아보는 것이 먼저다. 그것을 구현하여 실제로 써 본 뒤 부족한 점이 확인되었을 때에만 다음 단계를 추가하면 된다. AI 시대에는 코드를 만드는 비용이 크게 낮아졌다. 그래서 역설적으로 무엇을 더 만들 것인가보다 무엇을 만들지 않을 것인가를 판단하는 일이 더 중요해졌는지도 모르겠다.

609개의 chunk를 embedding하느라 노트북이 249초 동안 열심히 일한 것은 아마 그것을 배우기 위한 수업료였을 것이다. 다행히 API 사용료는 들지 않았다. 전기료는 조금 들었겠지만.

[KORG X2] 거창한 RAG 챗봇을 만들려다가 소박한 매뉴얼 검색기 구현으로 끝내다

며칠 전 오래된 Korg X2/X3 신시사이저의 매뉴얼을 뒤적이다가 한 가지 생각을 했다. Basic Guide와 Reference Guide를 AI에게 모두 읽혀 놓고 한국어로 질문하면 매뉴얼을 근거로 답해 주는 개인용 챗봇을 만들 수 있지 않을까? 요즘 흔히 말하는 RAG(Retrieval-Augmented Generation)를 로컬 PC에서 구현하면 될 것 같았다. 매뉴얼에서 질문과 관련된 내용을 검색하고, 그것을 로컬에서 실행되는 LLM에 넘겨 답을 만들게 하는 것이다. 별도의 API 사용료 없이 내 노트북에서 모든 것을 처리한다는 것도 매력적으로 느껴졌다.

처음 기대한 것은 제법 그럴듯했다. “드럼 키트는 어디에서 편집하지?”, “패턴을 트랙에 넣으려면?”, “MIDI로 Program을 선택하는 방법은?”과 같이 한국어로 물어보면 AI가 매뉴얼에서 근거를 찾아 답해 주는 시스템을 생각했다. 그러나 며칠 동안 작은 모델과 임베딩, OCR, 여러 단계의 답변 생성 방법을 시험해 본 끝에 결과물은 처음 구상과 상당히 달라졌다. 내 노트북의 제한된 자원으로 무엇을 할 수 있고, 무엇을 굳이 하지 않는 편이 나은지를 알아 가면서 목표 자체가 바뀌었기 때문이다. 내가 쓰는 노트북은 2022년 여름 용산에서 구입한 ThinkPad E14 Gen3이다(구입 당시 쓴 글).

Python 작업 환경부터 만들기

Windows에서 프로젝트 폴더를 하나 만들고 Python 가상환경(venv)을 만들었다. Python은 3.11을 사용했다. PowerShell에서 프로젝트 디렉터리로 이동한 다음 다음과 같이 가상환경을 만들고 활성화하였다.

python -m venv .venv
.\.venv\Scripts\Activate.ps1

PowerShell의 실행 정책 때문에 활성화가 막힌다면 현재 세션에 한해서 다음과 같이 허용할 수 있다.

Set-ExecutionPolicy -Scope Process -ExecutionPolicy Bypass
.\.venv\Scripts\Activate.ps1

필요한 Python 패키지도 설치하였다. 최종적으로 남은 프로그램만 생각한다면 다음 정도면 된다.

python -m pip install --upgrade pip
pip install streamlit pymupdf requests pillow pytesseract

PDF가 스캔 이미지이므로 OCR을 위해 Tesseract도 별도로 설치했다. 여기에서 처음 접하는 사람이라면 조금 헷갈릴 수 있는데, pip install pytesseract로 설치되는 것은 OCR 프로그램 자체가 아니다. pytesseract는 Python에서 Tesseract를 호출하기 위한 인터페이스이고, 실제 Tesseract OCR 프로그램은 Windows에 따로 설치해야 한다.

처음에는 임베딩을 이용한 검색도 시도했기 때문에 다음 패키지도 설치하였다.

pip install sentence-transformers numpy

그러나 이것들은 최종 프로그램에서는 사용하지 않게 되었다. 시행착오를 그대로 재현하려는 것이 아니라면 설치할 필요가 없다.

스캔한 매뉴얼을 검색할 수 있게 만들기

내가 가지고 있는 Korg X2/X3 매뉴얼은 텍스트가 포함된 PDF가 아니라 스캔한 문서다. 따라서 PDF 파일을 열었다고 해서 Drum Kit나 Pattern 같은 단어를 곧바로 검색할 수 있는 것은 아니었다. PyMuPDF로 PDF의 각 페이지를 읽어 이미지로 만들고 Tesseract로 OCR을 수행한 뒤, 페이지별로 추출된 텍스트를 manual_index.json이라는 파일에 저장했다.

구조를 단순하게 표현하면 다음과 같다.

Basic Guide
  PDF page 1 → OCR text
  PDF page 2 → OCR text
  ...

Reference Guide
  PDF page 1 → OCR text
  PDF page 2 → OCR text
  ...

OCR 결과는 물론 완벽하지 않았다. 오래된 영문 매뉴얼을 읽히다 보니 170을 17O로 읽거나 171이 전혀 엉뚱한 문자로 변하는 일도 있었다. 그래도 내가 원하는 것은 완벽한 전자책을 만드는 것이 아니라 관련 페이지를 찾는 것이므로, Drum Kit, Pattern, MIDI Data Dump, Program Change 같은 기술 용어가 대체로 제대로 인식되는 정도면 충분했다.

RAG라면 임베딩부터 해야 하는 줄 알았다

RAG라는 말을 처음 접하면 문서를 잘게 나누고 임베딩(IBM의 짧은 설명)을 만들어 벡터 검색을 해야 할 것 같은 생각부터 든다. 나도 그렇게 시작했다. paraphrase-multilingual-MiniLM-L12-v2를 사용하여 288페이지의 매뉴얼을 384차원의 벡터로 만들고 manual_embeddings.npy라는 파일로 저장하였다. 한국어로 질문해도 의미가 비슷한 영문 매뉴얼 페이지를 찾아줄 것이라고 기대했다.

여기서 ‘문서를 잘게 나눈다’는 것은 긴 문서 전체를 한꺼번에 검색 대상으로 삼지 않고, 몇 문단이나 한 페이지 정도의 작은 단위로 쪼개는 것을 뜻한다. 그리고 ‘임베딩(embedding)’은 각각의 작은 문서 조각을 그 내용의 특징을 나타내는 여러 개의 숫자로 바꾸는 과정이다. 이렇게 만들어진 숫자의 묶음을 벡터(vector)라고 한다. 질문도 같은 방법으로 벡터로 바꾼 뒤, 질문 벡터와 가까운 문서 벡터를 찾으면 단어가 정확히 일치하지 않아도 의미가 비슷한 내용을 찾을 수 있다. 이것이 여기서 말하는 벡터 검색이다.

그런데 실제로 시험해 보니 이 매뉴얼에서는 생각만큼 만족스럽지 않았다. 내가 찾고 싶은 것은 문장의 추상적인 의미가 비슷한 페이지라기보다 Drum Kit Setup, Put to Track, Program Change, MIDI Data Dump처럼 매뉴얼에 실제로 쓰인 기술 용어가 등장하는 곳이었다. 그렇다면 굳이 모든 페이지를 벡터로 바꾸어 의미상의 거리를 계산하기보다, 한국어 질문을 매뉴얼에서 사용될 법한 영어 검색어로 잘 바꾼 다음 전통적인 문자열 검색을 하는 편이 나을 수도 있었다.

이것은 이번 작업에서 처음으로 목표를 크게 줄인 지점이었다. 임베딩 검색이 나쁜 기술이라는 뜻은 아니다. 내가 가진 자료의 양과 성격, 그리고 찾으려는 정보의 종류에는 더 단순한 방법이 잘 맞았다는 뜻이다.

작은 로컬 LLM에게 너무 많은 일을 시켰다

로컬 LLM은 Ollama를 통해 실행했다. 처음에는 Qwen 모델에게 질문을 영어 검색어로 바꾸는 일뿐 아니라 검색된 매뉴얼 내용을 읽고, 적절한 근거인지 판단하고, 마지막에는 한국어 답변까지 작성하도록 했다. 관련 없는 질문을 걸러 내는 relevance gate도 붙여 보고, 한 번의 호출로 잘 안 되면 두 번, 세 번에 나누어 일을 시키는 방법도 시험했다.

Qwen은 중국의 Alibaba Cloud가 개발하는 AI 언어 모델 계열이고, Ollama는 미국의 Ollama가 개발하는 로컬 AI 모델 실행 소프트웨어다. Qwen 자체는 일반 응용 프로그램이라기보다 문장을 이해하고 생성하도록 학습된 AI 모델이며, Ollama는 Qwen을 비롯한 여러 언어 모델을 내 컴퓨터에 내려받아 쉽게 실행하고 다른 프로그램에서 호출할 수 있게 해 준다. 이번 작업에서는 Ollama를 설치하고, 이를 통해 비교적 작은 Qwen 3 계열의 1.7B 모델(qwen3:1.7b)을 내 노트북에서 실행하였다.

문제는 내 노트북에 별도의 GPU가 없다는 것이다. Qwen 1.7B 정도의 작은 모델은 CPU만으로도 비교적 부담 없이 실행되었지만, 매뉴얼을 정확하게 해석하여 답을 만드는 일에서는 신뢰하기 어려운 경우가 있었다. 원문에는 분명히 Global Mode라고 적혀 있는데 답을 만드는 과정에서 다른 모드로 바꾸어 말하는 식의 오류가 생겼다. 더 큰 4B급 모델도 시험했지만 이번에는 기다리는 시간이 현실적인 문제가 되었다. 좋은 답 하나를 얻기 위해 매번 오래 기다려야 한다면 매뉴얼을 직접 펼쳐 보는 것보다 나을 것이 없다.

그렇다고 작은 모델이 쓸모없는 것은 아니었다. 오히려 일을 하나만 시키니 제법 잘했다. “답하지 말고, 한국어 질문을 이 영문 매뉴얼에서 검색하기 좋은 영어 단어로 바꾸어라”라고 역할을 제한한 것이다. 예를 들어 “드럼 키트를 편집하려면?”이라는 질문을 넣으면 drum kit edit setup global mode와 같은 검색어를 만들어 주고, “패턴을 트랙에 넣으려면?”이라고 하면 pattern put to track assign pattern track과 같은 결과를 내놓았다. 이 정도의 일은 1.7B 모델도 빠르고 제법 안정적으로 해냈다.

결국 검색 알고리즘은 아주 단순해졌다

LLM이 영어 검색어를 만들어 주고 나면 그다음부터는 AI라고 부를 만한 것도 별로 없다. OCR한 각 페이지에서 검색어가 얼마나 많이 등장하는지를 세고 점수를 주었다. 검색어 전체가 그대로 등장하면 추가 점수를 주는 정도의 단순한 방식이다.

핵심 아이디어를 단순화하면 다음과 같다.

def score_page(text, query):
    text = text.lower()
    query = query.lower()

    score = 0

    if query in text:
        score += 100

    for term in query.split():
        score += text.count(term) * 5

    return score

이렇게 해도 의외로 결과가 괜찮았다. 예를 들어 GM Song을 재생하는 방법을 묻는 질문에서 LLM이 gm song play라는 검색어를 만들면 Basic Guide의 Playing GM Songs가 있는 페이지가 상위에 나온다. 드럼 키트 편집을 물으면 Reference Guide의 Global Mode에 있는 Drum Kit Setup 페이지가 잘 검색된다. 기술 매뉴얼에서는 용어 자체가 상당한 정보를 가지고 있기 때문에 가능한 일일 것이다.

AI에게 답을 쓰게 하지 말고 원본 페이지를 보여 주자

여기에서 다시 한 번 방향을 바꾸었다. 검색된 OCR 텍스트를 작은 LLM에게 넘겨 답을 작성하게 하는 대신, 검색된 원본 PDF 페이지를 그대로 브라우저에 보여 주기로 했다. OCR은 어디까지나 검색용으로만 사용하고, 사람이 실제로 읽는 것은 스캔된 원래 매뉴얼이다.

이렇게 하니 여러 문제가 한꺼번에 사라졌다. OCR이 일부 문자를 잘못 인식하더라도 검색만 성공하면 원본 페이지에서 정확한 내용을 확인할 수 있다. 작은 LLM이 근거 문장을 잘못 해석하거나 그럴듯한 설명을 덧붙이는 문제도 없다. 무엇보다 내가 원하는 것은 Korg X2에 대해 유창하게 설명하는 AI가 아니라, 200쪽이 넘는 Reference Guide에서 필요한 페이지를 빨리 찾는 도구라는 사실이 분명해졌다.

결국 현재 프로그램의 처리 과정은 다음과 같이 단순해졌다.

한국어 질문
    ↓
Qwen 1.7B
    ↓
영문 매뉴얼용 검색어
    ↓
OCR 텍스트 검색
    ↓
관련 페이지 선정
    ↓
원본 PDF 페이지 표시

전형적인 RAG라면 마지막 단계에서 검색된 문서를 LLM에 다시 넣고 답변을 생성할 것이다. 내 프로그램은 그 단계를 아예 없애 버렸다. 따라서 이제 이것을 RAG 챗봇이라고 부르는 것은 적절하지 않다. “자연어로 매뉴얼 검색” 정도가 지금 하는 일을 가장 정확하게 표현한다.

Streamlit으로 검색 화면 만들기

사용자 인터페이스는 Streamlit으로 만들었다. 프로그램을 실행하는 방법은 간단하다.

streamlit run app.py

브라우저에는 Search, Basic Guide, Reference Guide의 세 탭이 나타난다. Search 탭에서 한국어나 영어로 궁금한 내용을 입력하면 관련도가 높은 Basic Guide와 Reference Guide 페이지를 각각 찾아 준다. 검색 결과 가운데 하나를 선택하면 바로 아래에 원본 PDF 페이지가 표시되고, 필요하면 앞뒤 페이지도 함께 볼 수 있게 하였다.

Basic Guide와 Reference Guide 탭은 전자 목차처럼 만들었다. 원래 매뉴얼의 Table of Contents를 OCR한 뒤 오류가 난 페이지 번호를 확인하여 별도의 toc.json으로 정리했다. Chapter와 Section을 선택하면 해당 원본 페이지로 바로 이동한다. 오래된 종이 매뉴얼을 스캔한 PDF가 이제는 검색과 목차 이동이 가능한 작은 웹 애플리케이션이 된 셈이다.

시행착오가 사라지고 남은 파일들

개발 중에는 여러 방법을 시험하느라 ask_manual_2call.py, ask_manual_3call_gate.py, ask_manual_grounded.py, search_embedding.py, build_embeddings.py 같은 파일이 계속 생겨났다. 이름만 보아도 작은 LLM에게 어떻게든 정확한 답을 만들어 내게 하려고 애쓴 흔적이 남아 있었다. 최종 방향을 정한 뒤에는 이런 실험용 파일과 임베딩 데이터도 모두 지웠다.

현재 남아 있는 것은 다음 정도다.

x2-assistant/
│
├─ .venv/
├─ manuals/
│  ├─ basic.pdf
│  └─ reference.pdf
│
├─ app.py
├─ build_index.py
├─ manual_index.json
└─ toc.json

app.py가 Streamlit 애플리케이션이고, manual_index.json에는 검색용 OCR 텍스트가 들어 있다. toc.json은 두 매뉴얼의 목차 이동에 사용하며, build_index.py는 나중에 PDF에서 OCR 인덱스를 다시 만들어야 할 경우를 대비해 남겨 두었다. 처음 생각했던 시스템에 비하면 놀랄 만큼 단출하다.

API, 로컬 LLM, RAG를 직접 만져 보면서

이번 일을 시작하기 전에는 API를 이용하는 AI와 내 컴퓨터에서 직접 돌리는 LLM의 차이, RAG에서 retrieval과 generation이 각각 무슨 역할을 하는지, 임베딩 검색이 왜 필요한지 같은 개념을 막연하게만 알고 있었다. 직접 만들어 보니 이런 용어들이 조금씩 구체적으로 느껴졌다. 특히 LLM을 사용한다고 해서 모든 단계를 LLM에게 맡길 필요는 없다는 점이 인상적이었다.

성능 좋은 외부 AI의 API를 사용했다면 검색된 몇 페이지를 넘겨서 꽤 훌륭한 답을 만들 수도 있었을 것이다. 그러나 이번에는 별도의 API 비용 없이 내 노트북 안에서 해결하는 것이 조건이었다. 그렇다면 CPU에서 작은 모델이 잘할 수 있는 일과 기존 프로그램이 훨씬 잘할 수 있는 일을 나누는 것이 합리적이다. 한국어 질문을 영어 기술 용어로 바꾸는 것은 작은 LLM에게 맡기고, 단어를 세어 페이지를 찾는 일은 평범한 Python 코드에 맡기며, 최종 판단은 원본 문서를 읽는 사람이 하도록 했다.

거창하게 시작했지만 이 정도가 오히려 쓸 만하다

처음에는 “내 노트북에서 돌아가는 Korg X2 전용 RAG 챗봇”을 생각했다. 임베딩을 만들고, 관련 문장을 추출하고, relevance gate를 붙이고, LLM을 여러 번 호출하면서 어떻게든 그럴듯한 답을 만들어 보려고 했다. 그러나 CPU만 사용하는 노트북에서 큰 모델을 돌리는 데에는 한계가 있었고, 작은 모델에게 복잡한 판단까지 맡기면 정확도가 마음에 들지 않았다. 결국 많은 기능을 하나씩 걷어 내고 작은 LLM, 단순한 문자열 검색, OCR 인덱스와 PDF 뷰어만 남겼다.

결과적으로 목표는 상당히 작아졌지만 실제 용도에는 오히려 더 잘 맞는다. 내가 필요한 것은 30년 된 신시사이저에 대해 AI와 대화를 나누는 것이 아니라, “Put to Track이 어디에 있었지?”라고 물었을 때 Reference Guide의 해당 페이지를 바로 펼쳐 주는 도구이기 때문이다. 제한된 컴퓨터 자원 때문에 타협했다고 생각할 수도 있지만, 며칠 동안 이것저것 만들어 보고 지우면서 느낀 것은 조금 다르다. AI를 얼마나 많이 사용하는가보다, AI에게 무슨 일을 맡기고 무슨 일은 맡기지 않을지를 정하는 것이 더 중요했다.

'자연어로 매뉴얼 찾기'는 약간 과장이다.

이번 작업은 거창한 AI 개발 프로젝트라기보다 AI를 직접 만져 본 나의 첫 작은 실험에 가까웠다. 그동안 AI를 이용하거나 관련 이야기를 접할 기회는 많았지만, 로컬 LLM을 직접 설치하고 임베딩을 만들어 검색해 보고, 작은 모델에게 답변을 시키면서 그 한계를 확인해 본 것은 이번이 처음이었다. 그런데 그 첫 경험이 업무에서가 아니라, 30년 된 신시사이저의 매뉴얼을 좀 더 편하게 찾아보겠다는 취미 프로젝트에서 이루어졌다는 점도 재미있다. 모든 일을 AI에게 맡기기보다 AI가 잘하는 작은 역할만 맡기고 나머지는 기존의 단순한 프로그램으로 처리하는 편이 더 나을 때가 있다는 것도 직접 확인했다. RAG나 임베딩, 로컬 LLM 같은 용어 역시 글로 읽을 때보다 직접 만들고 실패해 보니 훨씬 구체적으로 이해할 수 있었다.

이제 X2를 Ardule에서 어떻게 써먹을까?

이렇게 매뉴얼을 다시 들여다보고 SysEx와 MIDI 구조까지 조금씩 이해하게 된 이유는 결국 하나다. 30년이나 된 Korg X2를 지금 내가 만들고 있는 Ardule 생태계에서 어떻게 활용할 수 있을까? X2의 시퀀서나 패턴 기능을 오늘날의 소프트웨어로 그대로 흉내 낼 필요는 없을 것이다. 그런 일은 Raspberry Pi와 소프트웨어가 훨씬 자유롭게 할 수 있다. 대신 X2에는 지금도 쓸 만한 고유한 음색과 드럼 키트, Program과 Combination이 있고, MIDI와 SysEx를 이용하면 외부에서 이들을 꽤 세밀하게 제어할 수 있다.

따라서 Ardule에서는 FluidSynth와 SoundFont를 주된 음원으로 사용하면서 X2를 선택적으로 불러 쓰는 외부 하드웨어 음원으로 두는 것이 재미있을 것 같다. Ardule이 곡이나 연주 상황에 따라 MIDI 채널을 배분하고 Program이나 Combination을 선택하며, 필요한 경우 미리 준비한 SysEx를 보내 X2의 상태를 설정하는 식이다. 오래된 X2의 패턴을 분석하여 유용한 리듬은 Ardule 쪽의 패턴 라이브러리로 가져올 수도 있다. 그렇게 하면 X2의 낡은 시퀀서를 억지로 중심에 놓지 않으면서도 그 안에 들어 있는 소리와 데이터는 계속 활용할 수 있다.

어쩌면 이번 매뉴얼 검색기 만들기도 그 과정의 일부였던 셈이다. 1990년대의 신시사이저와 Raspberry Pi, Arduino, SoundFont, 그리고 이제는 로컬 LLM까지 한데 섞이기 시작했다. 서로 만들어진 시대도 다르고 원래 함께 쓰라고 만들어진 물건들도 아니지만, 필요한 부분만 골라 연결하는 것이 내가 생각하는 Ardule의 재미다. X2가 언제까지 정상적으로 작동할지는 모르겠지만, 적어도 당분간은 창고로 들어갈 이유가 하나 더 줄었다.

다음은 X2 하판을 고정하는 screw boss를 보강한 어제의 작업 결과를 사진으로 남긴 것이다. 


분해 조립을 자주 하면서 플라스틱으로 만들어진 나사산도 많이 뭉개지고, 몇 개의 보스는 갈라져 버렸다. 여기에 알리익스프레스에서 구입한 내경 8mm 스틸 무나사 스페이서를 끼워서 더 이상 갈라지지 않게 보강한 것이 주요 내용이다. 내경 9mm짜리를 구입했더라면 보스의 바깥을 갈아내느라 고생을 하지 않아도 되었을 것이다. 들어가다 만 것을 빼느라 플라이어로 이 금속 부품을 꽉 잡고 좌우로 돌려서 비틀었더니 보스 하나가 부러지는 사고를 치는 바람에 응급 수술도 하였다.


아직 뭉개진 나사산에 대한 보수 작업은 하지 않은 상태이다. 망가진 X2의 플로피 드라이브를 대신할 에뮬레이터를 구입할지도 아직 결정하지 못하였다. 이것이 있다면 USB 메모리를 이용하여 설정 상태를 백업하고 복원하는 일이 매우 편해진다. 모든 것을 SysEx 전송으로 해결할 수도 있지만 MIDI 자체의 전송 속도가 느리기 때문이다. 그나마 ChatGPT의 도움을 받아 KORG X2/X3의 SysEx 데이터와 SNG 파일 구조를 분석하는 리버스 엔지니어링 작업을 훨씬 수월하게 할 수 있다는 것이 다행이다.

2026년 9월 29일 화요일

회의는 AI가 다시 정리해 준다



부제: 게으른 국외출장자를 위한 영어 녹음·전사·요약 워크플로

생물학자에게 전사(transcription)라는 단어는 아주 특별한 의미로 각인되어 있다. 바로 DNA를 주형으로 RNA를 만드는 과정을 뜻한다. 중심원리(central dogma)를 처음 배울 때부터 DNA → RNA → Protein이라는 도식과 함께 전사와 번역(transcription and translation)을 수도 없이 외웠으니 그럴 만도 하다.

그래서 요즘 AI 서비스를 이야기하면서 “회의를 녹음해서 전사한다”라는 표현을 접하면 처음에는 조금 묘한 기분이 든다. 나에게 전사란 RNA polymerase가 하는 일이었으니까.

그러나 전사(轉寫)라는 말의 본래 의미를 생각하면 이상할 것이 없다. 영어 transcribe는 라틴어 transcribere에서 왔으며, trans-는 ‘건너서, 다른 쪽으로’, scribere는 ‘쓰다’를 뜻한다. 즉 본래 의미는 어떤 것을 다른 형태로 옮겨 적는 것이다. 한자어 轉寫도 말 그대로 ‘옮겨 쓴다’는 뜻이다.

DNA의 염기서열 정보를 RNA라는 다른 매체에 옮겨 적는 것도 transcription이고, 회의실에서 사람이 한 말을 문자로 옮겨 적는 것도 transcription이다. 생물학자에게 익숙한 전사가 오히려 이 넓은 의미의 한 사례인 셈이다.

그리고 이번 국외출장에서 새삼 깨달은 것이 있다.

AI-assisted transcription, 즉 AI를 이용한 전사는 출장 기록의 방식을 꽤 크게 바꿀 수 있다.

요즘 업무 회의를 마친 뒤 젊은 연구원들이 녹음 파일과 함께 AI가 자동으로 요약해 준 문서를 전달해 줄 때가 많다. 이처럼 AI를 이용하여 업무 효율화를 이루고 있는데, 나도 여기에 동참해야 하지 않겠는가. 그래서 이번에 싱가포르에서 열린 제14회 GA4GH Plenary에 참석하면서 수립한 워크플로를 글로 정리해 보았다. 미리 계획을 세우거나 조사한 것은 아니다. 회의장 테이블에서 발표내용을 기록하던 도중에 이리저리 검색하고 테스트하여 완성하였다. 따라서 이보다 더욱 효율적이면서도 정확한 기록 방법이 얼마든지 있을 수 있음을 미리 일러 둔다. 


출장보고서를 위해 회의 내용을 받아 적을 필요가 있을까

국외출장을 다녀오면 마지막에 남는 숙제가 있다. 출장보고서다.

회의 중에는 발표를 듣고, 슬라이드를 보고, 메모도 하고, 발표가 끝나면 사람들과 이야기도 해야 한다. 영어 발표라면 집중력도 더 필요하다. 그런데 이 모든 일을 하면서 동시에 “이 내용은 나중에 보고서에 써야 하니 적어놓자”고 생각하는 것은 상당히 피곤한 일이다.

이번 출장에서는 조금 다른 방법을 시험했다.

회의는 녹음한다. 슬라이드는 사진으로 남긴다. 그리고 나중에 AI에게 회의를 다시 정리하게 한다.

이때 가장 중요한 중간 단계가 바로 전사였다.

음성 녹음만 잔뜩 가지고 있어서는 활용하기 어렵다. 한 시간짜리 녹음을 다시 한 시간 동안 들으면서 필요한 내용을 찾는다면 AI를 사용하는 의미가 별로 없다. 음성을 검색하고 분석할 수 있는 텍스트로 바꾸어 놓아야 한다.

음성 → 전사된 텍스트 → 슬라이드와 결합 → AI에 의한 재구성

Otter와 Subtitle Edit는 쓰임새가 조금 다르다

영어 회의를 녹음하고 전사한다고 하면 먼저 떠오르는 서비스 중 하나가 Otter.ai다. 회의 녹음과 전사를 중심으로 만들어진 서비스라서 전사 결과를 확인하고 화자를 구분하며 회의 내용을 정리하는 데 편리하다. 온라인 회의나 협업 환경에서 쓰기에도 좋다. 나도 2년 전 워싱턴 DC 출장(AI-바이오과학 협력회의)에서는 Otter를 꽤 요긴하게 사용했었다.

그런데 이번 출장에서 내가 원했던 것은 조금 달랐다.

이미 녹음해 둔 한두 시간짜리 영어 음성 파일이 여러 개 있고, 이것을 인터넷 연결 상태에 크게 구애받지 않고 내 노트북에서 처리하고 싶었다.

여기에는 오픈소스 프로그램인 Subtitle Edit가 의외로 아주 잘 맞았다. 이름 그대로 원래 동영상 자막을 만들고 편집하는 프로그램이다. 하지만 이 프로그램 안에 Whisper 계열 음성인식 엔진을 이용하면 동영상뿐 아니라 녹음 파일을 자동으로 전사하는 데도 사용할 수 있다.

그리고 결과물로 SRT 자막 파일을 얻을 수 있다는 것이 이번 용도에는 아주 좋았다.

00:23:14 → 00:23:21
발표자가 이 시간에 한 말...

SRT에는 이렇게 시간 정보가 붙는다. 처음에는 그저 자막을 위한 시간표시라고 생각했지만, 나중에는 이것이 출장 기록에서 대단히 유용한 정보가 되었다.

Whisper 모델이란 무엇인가

Subtitle Edit 자체가 사람 말을 알아듣는 것은 아니다. 실제 음성인식을 담당하는 것이 Whisper다.

Whisper는 OpenAI가 공개한 음성인식 모델이다. 사람의 음성을 입력받아 문자로 변환하는 speech-to-text 모델이며, 여러 언어와 다양한 녹음 환경을 처리할 수 있다.

Subtitle Edit 프로그램에서 녹음 파일(MP3, M4A, WAV 등)을 연 뒤 Video → Audio to text (Whisper) 메뉴로 들어가 음성 인식 엔진으로 whisper.cpp를 선택한다. 처음 사용하는 경우 필요한 Whisper 실행 파일과 음성 인식 모델을 내려받아야 하는데, 나는 영어 회의 전사를 위해 **medium 모델(약 1.5GB)**을 사용했다. 모델이 클수록 일반적으로 인식 정확도는 좋아지지만 처리 시간과 메모리 사용량도 늘어나므로, 노트북에서 빠르게 처리하려면 small이나 medium 정도가 현실적이다. 언어는 회의가 영어라면 English로 명시해 주는 편이 좋고, 자동 감지에 맡길 수도 있다. 설정을 마치고 Generate를 누르면 Subtitle Edit가 녹음 파일을 구간별로 분석하여 자막을 만들며, 결과는 화면에서 바로 수정할 수 있고 SRT 파일로 저장할 수 있다. SRT에는 각 발화의 시간 정보가 함께 들어 있으므로, 나중에 AI에게 회의 내용을 요약시키면서 특정 발언이 녹음의 어느 부분에 해당하는지 추적하기에도 편리하다.

Whisper에는 크기가 다른 여러 모델이 있다. 일반적으로 작은 모델은 계산이 빠르고 필요한 컴퓨터 자원이 적은 대신 인식 정확도에서 손해를 볼 수 있고, 큰 모델은 처리 시간이 길어지는 대신 좀 더 나은 결과를 기대할 수 있다.

이번에는 Subtitle Edit에서 whisper.cpp와 medium 모델을 사용했다. 내가 선택한 모델의 용량은 약 1.5GB였다. 8GB의 데이터 로밍을 준비해 왔는데, 노트북을 휴대폰의 모바일 핫스팟에 연결해 이 모델을 다운로드하는 바람에 로밍 데이터를 상당히 소진하였다. 

2021년에 구입한 Dell XPS 노트북에서도 별도의 고성능 GPU 없이 처리할 수 있었다. 전사 시간이 실제 녹음 시간보다 조금 더 걸리기는 했다. 그러나 회의가 끝난 뒤 호텔에서 돌려놓는 작업이라면 큰 문제가 아니었다.

무엇보다 마음에 들었던 것은 일단 프로그램과 모델을 준비해 놓으면 인터넷에 연결하지 않고도 긴 녹음을 전사할 수 있다는 점이었다.

국내에서라면 클로바노트도 아주 편리한 선택이다. 한국어 회의뿐 아니라 외국어 음성도 처리할 수 있다. 영어 회의라면 노트를 만들 때 음성 인식 언어를 영어로 지정해서 사용하면 된다.

꼭 클로바노트 자체에서 녹음할 필요도 없다. 휴대폰의 기본 녹음기로 회의를 녹음한 다음 파일을 가져와 전사하는 방법도 있다.

문제는 이번과 같은 국외출장 환경이다.

클로바노트 같은 클라우드 기반 서비스를 이용하려면 결국 녹음 데이터를 서버로 보내야 한다. 짧은 음성이라면 별 문제가 아니지만 한두 시간짜리 회의를 하루에 몇 개씩 녹음하면 이야기가 달라진다. 호텔 Wi-Fi가 불안정하거나 로밍 데이터를 사용하고 있다면 대용량 음성 파일을 클라우드로 올리는 것 자체가 부담스럽다.

반면 Subtitle Edit + Whisper에서는 녹음 파일만 노트북에 가져오면 이후의 전사 작업은 로컬에서 이루어진다.

인터넷 연결이 충분하고 편리한 회의 관리가 중요하다면 클로바노트나 Otter,
긴 녹음 파일을 인터넷 연결 없이 내 컴퓨터에서 처리하고 싶다면 Subtitle Edit + Whisper.

녹음은 휴대폰이 가장 편했다

실제로 회의를 녹음해 보니 휴대폰이 가장 편했다. 별도의 녹음 장비를 가지고 다닐 필요가 없다. 테이블 위에 휴대폰을 놓고 녹음 버튼만 누르면 된다. 요즘 휴대폰의 마이크 성능이면 일반적인 회의실에서 발표 내용을 전사하기 위한 음질로는 충분했다.

문제는 녹음이 끝난 다음이다.

Whisper를 노트북에서 돌리려면 녹음 파일을 PC로 옮겨야 한다. USB 케이블을 연결하고 휴대폰 저장소를 찾아 들어가도 되지만 매번 그렇게 하는 것은 귀찮다.

이번에 써보니 이 문제의 답은 Quick Share였다.

Android 휴대폰과 Windows PC 사이에서 Quick Share를 이용하면 녹음 파일과 사진을 무선으로 바로 넘길 수 있다. 일반 Windows PC에서는 Google이 배포하는 Windows용 Quick Share를 사용할 수 있다.

휴대폰 녹음 → Quick Share → 노트북 → Subtitle Edit/Whisper → SRT

노트북 자체의 녹음기도 시험해 보았다. 이것도 생각보다 나쁘지 않았다. 어차피 회의장에서 노트북을 펼쳐 놓고 있다면 녹음이 끝나는 순간 파일이 이미 PC에 있으므로 Quick Share 과정조차 필요 없다.

그래도 휴대폰은 위치를 자유롭게 잡을 수 있고 녹음을 시작하고 끝내기도 편하다. 개인적으로는 휴대폰을 주 녹음기로 쓰는 쪽이 마음에 들었다.

게으른 출장자도 슬라이드 사진은 부지런히 찍어야 한다

여기에서 약간의 모순이 생긴다.

제목은 ‘게으른 국외출장자를 위한 워크플로’인데, 슬라이드 사진만큼은 부지런히 찍어야 한다.

슬라이드가 바뀔 때마다 가능하면 고해상도로 찍는다. 그렇다고 현장에서 사진 이름을 바꾸고 발표자별 폴더를 만들 필요까지는 없다. 중요한 것은 순서와 촬영 시각을 보존하는 것이다.

사진에는 촬영 시각이 기록되어 있다. SRT에는 녹음 시작점을 기준으로 각 발언의 시간이 기록되어 있다.

예를 들어 오전 9시 30분에 녹음을 시작했고 SRT의 00:27:30에 어떤 발언이 있다면 실제 시각은 대략 오전 9시 57분 30초다. 그 무렵 촬영한 사진을 찾아보면 당시 화면에 떠 있던 슬라이드를 찾을 수 있다. SRT의 타임코드와 사진의 촬영시각이 연결고리가 되는 것이다.

Subtitle Edit의 결과 화면.


Whisper가 틀린 것은 슬라이드가 고쳐 준다

Whisper의 영문 전사 결과는 놀라울 정도로 쓸 만했지만 당연히 완벽하지 않았다.

특히 국제학회는 음성인식 프로그램에 꽤 가혹한 환경이다. 여러 나라 사람들의 억양이 섞이고, 생소한 사람 이름과 기관명, 프로젝트명, 약어가 끊임없이 등장한다.

이때 슬라이드 사진이 위력을 발휘한다.

Whisper가 발표자의 이름을 엉뚱하게 받아썼더라도 첫 슬라이드에는 정확한 이름과 소속이 적혀 있다. 프로젝트명이나 전문용어, 숫자도 마찬가지다.

반대로 슬라이드에는 제목과 몇 개의 불릿만 있고 발표자가 그것을 어떻게 설명했는지는 나타나 있지 않다. 그 부분은 SRT가 채워준다.

슬라이드는 ‘무엇을 보여주었는가’를 기록한다.
SRT는 ‘무엇을 말했는가’를 기록한다.
손으로 쓴 메모는 ‘그중 무엇이 나에게 중요했는가’를 기록한다.

마지막으로 ChatGPT에 밀어 넣는다

이번에는 하루 동안 촬영한 슬라이드 사진이 200장을 넘었다. 여기에 여러 시간 분량의 SRT 파일도 생겼다.

예전 같으면 이 자료를 보는 순간 출장보고서를 쓸 의욕부터 사라졌을 것이다.

이번에는 사진을 시간 순서대로 묶고 SRT와 함께 ChatGPT에 넣었다. 그리고 세션을 구분하고, 발표자와 발표 제목을 확인하고, 슬라이드와 전사 내용을 대응시키면서 출장보고서 형태로 정리하도록 했다.

여기서 중요한 점이 있다. AI에게 아무 자료 없이 “오늘 학회에 다녀왔으니 출장보고서를 써줘”라고 하는 것이 아니다.

오히려 그 반대다.

가능한 한 충실한 원자료를 남기고, 그 원자료를 AI에게 다시 읽히는 것이 핵심이다.

음성에는 발표자의 설명이 있다. SRT에는 그것을 검색하고 분석할 수 있는 텍스트와 시간 정보가 있다. 사진에는 정확한 제목, 사람 이름, 기관명, 수치와 그림이 있다.

AI에게 맡기는 것은 기억이 아니라 재구성이다.

녹음 + SRT + 슬라이드 사진 → 발표 흐름의 재구성 → 요약 → 출장보고서

찍을 수 있는 것과 공개할 수 있는 것은 다르다

여기에는 중요한 전제가 하나 있다.

프로젝터에 보인다고 해서 모든 슬라이드를 촬영해도 되는 것은 아니다.

학회나 회의에 따라서는 발표 자료의 촬영이나 녹음을 금지하기도 한다. 미공개 연구 결과, 아직 출판되지 않은 데이터, 환자 또는 연구참여자와 관련된 정보, 기업의 기밀 자료 등이 포함될 수도 있다. 발표자가 특정 슬라이드에 대해 촬영하지 말아 달라고 요청하는 경우도 있다.

따라서 여기서 말하는 ‘슬라이드가 바뀔 때마다 찍는다’는 방법은 촬영이 허용된 범위 안에서만 적용되는 원칙이다. 녹음 역시 마찬가지다. 회의 성격과 주최 측의 규정을 먼저 확인해야 한다.

또 하나 중요한 것은 촬영과 공개는 전혀 다른 문제라는 점이다.

출장보고서를 작성하기 위해 개인적으로 촬영이 허용된 자료라고 해도 그 사진을 블로그나 SNS에 그대로 공개해도 된다는 뜻은 아니다. 발표 자료에는 저작권이 있고, 발표 당시에는 공개되었지만 온라인 재배포까지 의도하지 않은 내용도 있을 수 있다.

이번 워크플로에서 슬라이드 사진의 일차적인 목적은 공개가 아니라 기록과 확인이다. Whisper가 틀리게 인식한 이름이나 프로젝트명을 확인하고, 발표 순서를 복원하고, 발표자의 설명과 화면의 내용을 대응시키기 위한 원자료에 가깝다.

AI 서비스에 자료를 올리는 행위 역시 외부 서비스에 데이터를 제공하는 것이므로, 기밀자료나 개인정보처럼 외부 처리가 허용되지 않은 자료라면 업로드해서도 안 된다.

기록할 수 있는 것만 기록하고,
AI에 제공할 수 있는 것만 제공하며,
공개해도 되는 것만 공개한다.

그래서 이제 회의를 안 들어도 되는가?

물론 그렇지는 않다.

녹음에는 회의장의 모든 맥락이 담기지 않는다. 어떤 발표에서 사람들이 유난히 관심을 보였는지, 어떤 질문에서 분위기가 달라졌는지, 쉬는 시간에 누구와 무슨 이야기를 나누었는지는 직접 그 자리에 있었던 사람만 안다.

AI가 만들어 준 결과도 확인할 필요가 있다. Whisper가 고유명사를 틀릴 수 있고, 사진이 빠졌을 수도 있으며, AI가 서로 다른 발표의 내용을 잘못 연결할 수도 있다. 중요한 이름, 숫자, 발표 제목 정도는 원자료와 다시 맞춰보는 것이 좋다.

하지만 한 가지는 분명했다.

“출장보고서를 써야 하니까 지금 이 문장을 받아 적어야 한다”는 부담에서는 상당히 자유로워질 수 있다.

그 시간에 발표 자체에 더 집중하면 된다.

그리고 저녁이 되면 AI가 회의를 다시 정리해 준다.

정확히 말하면 AI가 나 대신 회의에 참석한 것이 아니다. 내가 남겨놓은 여러 종류의 기록을 시간축 위에서 다시 조립해 주는 것이다.

이번에 실제로 해보니 이 방법은 앞으로 국외출장에서도 계속 써먹을 만하다.

나의 새로운 출장 준비물은 별것 없다.

휴대폰, 노트북, Quick Share,
Subtitle Edit + Whisper, 그리고 ChatGPT.

아, 하나 더 있다.

슬라이드가 바뀔 때 사진 찍는 것을 잊지 않을 정도의 성실함.

그리고 그보다 더 중요한 것 하나.

찍어도 되는 것과 공개해도 되는 것을 구별하는 상식.

게으른 출장자에게 요구되는 성실함은 딱 그 정도면 될 것 같다. 

이 글을 마무리하면서 많은 고민을 하였다. 너무나 쉽게 출장 보고서를 쓰는 꼼수를 공개하는 부도덕한 일은 아닐까? 혹은 AI를 업무에 활용하여 자동화할 것은 최대로 자동화한다. 반면 회의장에서 듣고, 질문하고, 판단하고, 중요한 것을 알아채는 일은 사람이 한다. 이때 AI는 훌륭한 도구가 된다.

출장보고서 작성에 두 시간을 썼느냐 이틀을 썼느냐가 보고서의 성실성을 결정하는 것은 아니다. 중요한 것은 실제로 무엇을 보고 들었는지를 얼마나 충실하게 남기고, 그것을 왜곡하지 않고 전달하느냐일 것이다. AI 덕분에 그 과정이 쉬워졌다면, 그것은 요령이라기보다 도구의 발전에 가깝다.

2026년 9월 26일 토요일

브리츠 BR-1800 Classic 스피커에 파일럿 램프를 달다

당장 폐가전제품 수거통에 넣어도 아깝지 않을 고물 액티브 스피커에 너무 정성을 들이는 것은 아닐까. 가벼우면서도 출력이 높고(대부분 Class D일 것이므로) 블루투스까지 연결되는 현대적인 PC용 스피커를 몇 만원만 주면 살 수 있는 요즘에 2005년 11월 제조일자가 찍힌 구형 스피커를 부품까지 바꾸어 가면서 쓰는 정성이란...

이 액티브 스피커는 전원이 들어왔는지 표시해 주는 파일럿 램프가 없다. 손가락으로 더듬어서 뒷면에 위치한 스위치를 확실히 내리는 것으로 만족스럽지 못하다. 시각적으로 작동 상태를 확실히 보여주기 위하여 파일럿 램프를 달아 주기로 하였다. 이틀 전 MAX4410 헤드폰 앰프에 케이스를 달면서 LED 파일럿을 달아 주었던 일(링크)이 '자작심(心)'을 자극한 것일게다.

이는 아날로그 아날로그 리니어 파워 앰프 IC인 LM1875T를 써서 Class AB로 동작한다. 무거운 전원 트랜스포머가 들어 있고, 으며, 18-0-18V AC를 정류·평활하여 대략 ±24 V의 DC 전원을 앰프 회로에 공급하는 전형적인 구성이다.

LM1875T는 한 시대를 풍미했던 이른바 ‘게인클론(Gainclone)’ 계열의 리니어 파워 앰프 IC이기도 하다. 정확히 말하면 원조 게인클론에 사용된 칩은 아니지만, LM1875를 비롯하여 LM3875, LM3886 같은 칩 하나로 간결한 Class AB 파워 앰프를 만드는 방식은 한때 오디오 DIY에서 상당한 인기를 누렸다. 이제는 작고 가볍고 효율까지 높은 Class D 앰프가 그 자리를 거의 차지해 버렸다. 무거운 전원 트랜스포머까지 품고 있는 이 BR-1800 Classic은 그런 의미에서도 제법 옛날 물건이 되었다.

전원 레일 한쪽에 저항과 LED를 달면 파일럿 램프 대용으로 쓸 수 있다. 그러나 저항값을 계산하기가 귀찮다. 부품통에 샤시용 네온램프(AC 220V 연결용)가 하나쯤 남아 있을텐데... 찾았다! 뒷면 패널 아래쪽 전원스위치와 왼쪽 스피커 출력선을 연결하는 RCA 단자 중간 부분에 적당히 구멍을 뚫고 램프를 고정하였다. 



LED를 썼다면 저항을 적당히 조합하여 더 밝게 만들 수도 있었을 것이다. 기기 뒷면에 있으니 밝은 것이 여러모로 유리하겠지만 손이 덜 가는 방법을 택했다. 납땜조차 하지 않은 채 압착 커넥터로 아주 간단하게 처리하였다.

새로 산다면 4인치 우퍼를 장착한 에디파이어 MR4 정도면 충분할 것이다. 가끔 음악 작업도 하니 조금 사치를 부려 전문적인 냄새가 물씬 나는 제네렉 8020D 한 조를 책상 위에 올려놓는 것도 좋겠다.

그런데도 나는 BR-1800 Classic을 버리지 않고 또 케이스에 구멍을 뚫어 작은 네온램프 하나를 달았다. 소리가 더 좋아진 것도 아니고 수명이 늘어난 것도 아니다. 그저 전원이 들어왔다는 것을 눈으로 확인할 수 있게 되었을 뿐이다.

몇 만원이면 새 스피커를 살 수 있는 시대에 이런 수고가 경제적으로 합리적일 리는 없다. 그래도 멀쩡히 소리가 나는 오래된 물건에 작은 불 하나를 밝혀 주는 일은 제법 즐겁다. 아마 그래서 아직도 이런 짓을 하나 보다.

2026년 9월 24일 목요일

Human reference genome은 도대체 누구의 것인가?

추석 연휴인데 사무실에 나와 컴퓨터를 두드리고 있다. 다음 주 싱가포르에서 열리는 제14차 GA4GH(Global Alliance for Genomics and Health) Plenary Meeting에 참석하기 위한 준비 때문이다. 연휴에 굳이 사무실까지 나와야 하나 싶기도 하지만, 이번에는 단순히 학회에 참석하는 것만으로 끝날 일이 아니다.

한국에서는 국가통합바이오빅데이터구축사업(BIKO)에 참여하는 주요 인사들이 대거 참석한다. 나도 일행 중 한 사람으로서 Patrick Tan을 비롯한 PRECISE(Precision Health Research, Singapore)의 주요 인사들과 만날 예정이다. 만나서 무슨 이야기를 할 것인가 생각하다 보니 당연히 싱가포르의 국가 정밀의료 사업인 NPM(National Precision Medicine)을 공부하지 않을 수 없었다. 많은 미팅을 주선한 사업단 관계자들께 특별한 감사의 뜻을 전한다.

때마침 아주 적절한 논문도 나와 있었다. 2026년 8월 Nature Genetics에 실린 “Translating genomic data into healthcare practice with the Singapore National Precision Medicine program”이라는 Perspective 논문이다. Patrick Tan을 비롯한 PRECISE 관계자들이 대거 저자로 참여했다. 제목부터 노골적으로 translating genomic data into healthcare practice이다. 너무 길어서 읽기가 불편하다면 PRECISE 웹사이트에 실린 소개의 글만 봐도 도움이 될 것이다.

처음에는 다음 주 미팅을 위해 필요한 내용만 뽑아 읽을 생각이었다. 그런데 읽다 보니 생각보다 재미있었다.

우리는 BIKO와 같은 대규모 바이오데이터 구축 사업의 활용을 이야기할 때 대체로 두 가지를 떠올린다. 연구자가 데이터를 이용하여 좋은 논문을 쓰는 것, 그리고 기업이 이를 이용하여 신약이나 새로운 진단기술을 개발하는 것이다. 나 역시 별다른 의심 없이 그렇게 생각해 왔다.

그런데 싱가포르 NPM에는 그 사이에 한 단계가 더 있었다. Clinical Implementation Pilot(CIP)이다. 연구에서 얻은 유전체 지식을 실제 진료 과정에 집어넣어 보고, 임상적으로 정말 도움이 되는지, 비용을 들일 만한 가치가 있는지를 검증한 뒤 실제 의료체계로 옮기는 것이다. 가족성 고콜레스테롤혈증(familial hypercholesterolemia, FH)은 그렇게 해서 국가적인 유전자 검사 및 관리 프로그램으로 이어졌다. 지난주 보스턴에서 열렸던 International Precision Health Summit에서 UK Biobank 관계자도 비슷한 내용을 이야기하였다. 당시에 찍었던 발표 자료를 여기에 소개해 둔다. 2035년이 되면 영국의 전체 의료 서비스 이용에서 최대 절반에서 유전체 정보가 어떤 형태로든 활용될 수 있다고 한다. 정말 부럽지 않은가?




논문을 읽지 않고 AI가 만들어 준 digest 정도만 보았더라면 아마 “SG100K를 구축했고 연구와 임상 활용을 추진하고 있다” 정도로 이해하고 넘어갔을 것이다. 틀린 말은 아니지만 정작 중요한 것이 빠진다. 연구 결과가 저절로 의료가 되는 것이 아니라 그 사이에 clinical pathway를 만들고, health economics를 따지고, 실제 의료체계 안에서 시험하는 과정이 있었다.

NPM이 Phase I을 proof of concept, Phase II를 proof of value, 현재의 Phase III를 proof of scale이라고 부르는 이유도 이제 조금 이해가 되었다.

그런데 이 논문을 읽다가 나의 관심은 엉뚱한 방향으로 흐르기 시작했다.


그런데 우리는 도대체 누구의 유전체를 보고 있는 것일까?

싱가포르는 Chinese, Malay, Indian이 함께 사는 나라이다. PRECISE-SG100K 역시 이 세 population을 중심으로 만들어진 multi-ancestry Asian cohort이다. 그러다 보니 서로 다른 아시아 국가에서 생산한 유전체 데이터를 함께 분석하려면 무엇을 맞추어야 하는지가 궁금해졌다. 다음 주 PRECISE 사람들과 이야기를 나눌 만한 주제이기도 했다.

그런데 생각은 여기서 한 번 더 옆길로 샜다. Harmonize한다는 것이 정확히 무엇이지? Sequencing depth와 QC 기준을 맞추고, variant calling pipeline을 통일하는 것까지는 쉽게 생각할 수 있다. 그런데 reference genome이 다르면 어떻게 하지?

여기에서 또 하나의 아주 기초적인 질문이 튀어나왔다.

그런데 GRCh38은 도대체 누구의 유전체인가?

좀 당황스러운 질문이다.

GRCh37과 GRCh38은 오랫동안 들어와서 잘 알고 있다. Reference가 다르면 좌표를 변환해야 한다는 것도 알고, 최근에는 T2T-CHM13이 나왔다는 것도 알고, Human Pangenome이라는 것도 대충 알고 있었다.

그런데 정작 “GRCh38은 누구의 유전체인가?”라는 질문에는 즉시 대답할 수가 없었다.

생각해 보니 내가 가지고 있던 지식은 조각조각이었다. Human Genome Project에서 여러 사람의 DNA를 사용했다는 이야기도 어디선가 들었고, reference genome은 어느 한 사람의 genome이 아니라는 것도 알고 있었다. 한 사람의 샘플이 꽤 많은 비중을 차지한다는 것 정도는 알고 있었지만, 그것들이 머릿속에서 하나의 이야기로 연결되어 있지는 않았다.

그래서 찾아보기 시작했다.

GRCh38의 70%를 차지하는 RP11

Genome Reference Consortium의 설명을 읽어 보니 GRCh38은 여러 익명의 사람에게서 만든 genomic clone library의 염기서열을 조합한 composite genome이다. 여기까지는 예상했던 바이다.

그런데 구성 비율이 예상 밖이었다.

GRCh38 primary assembly의 약 93%가 11개의 genomic clone library에서 왔고, 그 가운데 RP11(RPCI-11 Human Male BAC Library)이라는 하나의 library가 혼자서 약 70%를 차지한다.

무려 70%라니!

여러 사람의 유전체를 골고루 섞어서 만든 reference 같은 것을 막연히 상상했다면 꽤 많이 틀린 셈이다. 실질적으로 GRCh38의 대부분은 한 사람에게서 온 것이다.

Genome Reference Consortium: Frequently Asked Questions

그런데 더 의외의 사실이 하나 있었다.

RP11 donor는 익명의 남성인데, 유전체를 분석해 보니 African-European admixed ancestry를 가진 것으로 추정된다는 것이다. 후속 연구에서는 RP11이 GRCh38의 72.6%를 차지한다고 계산했고, ancestry를 판별할 수 있었던 RP11 clone 가운데 56.0%는 African, 28.1%는 European local ancestry로 분류했다. 논문에서는 이 donor를 admixed African-American ancestry를 가진 사람이라고 표현한다.

어라?

나 역시 reference genome의 population bias를 이야기하면서 별 생각 없이 ‘Western population 중심의 reference’ 같은 표현을 사용하곤 했다. 그런데 GRCh38의 대부분을 제공한 사람이 내가 막연히 상상했던 European ancestry의 ‘백인 표준 인간’이 아니었다. 아, 여기에서 매우 주의해야 한다. 백인이 모든 인종의 표준이라는 의미로 읽지는 말기를 바란다.

더 재미있는 것은 두 번째로 큰 CTD library이다. GRCh38의 약 5.5%를 차지하는데, ancestry를 분석할 수 있었던 clone의 86.3%가 East Asian local ancestry로 추정되었다.

Aganezov et al. A complete reference genome improves analysis of human genetic variation

그러니까 GRCh38은 European genome도 아니고 African genome도 아니며, 당연히 Asian genome도 아니다.

애초에 그런 식으로 이해할 물건이 아니었다.

여러 사람에게서 얻은 DNA 조각을 이어 붙여 만든 mosaic reference이고, 그중 압도적으로 많은 부분이 한 admixed donor에게서 왔다.

그러면 T2T-CHM13은 좀 나은가?

여기까지 오니 당연히 다음 질문이 생겼다.

GRCh38이 이렇게 복잡한 물건이라면 2022년에 ‘완성된 인간 유전체’로 등장한 T2T-CHM13은 어떨까?

T2T-CHM13은 대단한 성과이다. GRCh38에서 제대로 조립하지 못했던 centromere, segmental duplication, 반복서열 등의 영역을 포함하여 telomere에서 telomere까지 이어지는 거의 완전한 인간 유전체를 만들었다.

그런데 CHM13의 정체를 알고 나면 여기에서도 이야기가 묘해진다.

CHM13은 일반적인 사람의 혈액에서 얻은 평범한 diploid genome이 아니라고 한다. Complete hydatidiform mole(완전포상기태)에서 유래한 세포주이다. 쉽게 말하면, 난자의 핵 DNA가 없는 상태에서 들어온 한 정자의 haploid genome이 복제되어 두 벌이 된 것에 가깝다. 따라서 염색체 수는 46개이지만 두 벌의 서열이 거의 동일하다. 보통 사람처럼 부계와 모계에서 물려받은 서로 다른 두 haplotype을 구별할 필요가 거의 없으므로, 완전한 genome assembly를 만들기에 매우 유리했다.

즉 CHM13이 선택된 것은 이 사람이 인류를 가장 잘 대표해서가 아니다. 완전한 genome을 조립하기에 아주 좋은, 다소 특별한 생물학적 재료였기 때문이다.

그런데 ancestry까지 들여다보면 CHM13은 대체로 European ancestry를 가진 genome이다.

여기서 또 한번 머리를 긁적이게 된다.

머리를 긁적이는 장면
뚜껑이 열릴 일이다. 팀 버튼의 <크리스마스 악몽>(1993) 중에 출연한 Dr. Finkelsterin.

GRCh38은 여러 사람의 DNA가 섞여 있고 그 대부분은 African-European admixed donor에서 왔다. T2T-CHM13은 훨씬 완전하지만 사실상 하나의 haplotype에 가까운 genome이고 predominantly European ancestry이다.

완전한 인간 유전체(complete human genome)가 인류를 대표하는 유전체(representative human genome)라는 뜻은 아니다.

생각해 보면 너무나 당연한 말인데 나는 두 가지를 은연중에 같은 문제처럼 생각하고 있었던 것 같다. Completeness와 population diversity는 전혀 다른 문제이다.

아, 그래서 Pangenome을 써야 하는구나

여기까지 오고 나니 Human Pangenome이 갑자기 다르게 보였다.

전에는 pangenome을 ‘여러 사람의 유전체를 더 많이 모아서 만든 더 좋은 reference’ 정도로 막연히 이해하고 있었다. 그러나 문제의 핵심은 reference에 sequence를 조금 더 추가하는 데 있는 것이 아니었다.

한 사람 또는 소수 사람의 linear genome 하나를 기준으로 모든 인간의 variation을 기술하는 방식 자체에 한계가 있는 것이다.

Human Pangenome Reference Consortium(HPRC)이 2023년에 발표한 첫 draft human pangenome은 서로 다른 ancestry를 가진 47명의 phased diploid assembly를 이용했다. GRCh38과 비교하면 약 119 million base pairs의 euchromatic polymorphic sequence가 추가되었고, small variant와 structural variant를 찾아내는 성능도 향상되었다.

Liao et al. A draft human pangenome reference. Nature 617, 312–324 (2023)

여기서 또 하나 궁금해졌다. Pangenome은 여러 사람의 유전체를 단순히 이어 붙인 거대한 FASTA 파일이 아니다. 여러 haplotype의 서로 다른 경로를 graph 형태로 표현한다. 그렇다면 지금까지 GRCh38이라는 하나의 linear reference를 놓고 BWA로 read를 mapping하던 방식도 달라져야 한다. 실제로 pangenome에서는 vg Giraffe와 같은 graph-aware mapper가 사용된다. 다만 graph 안에 GRCh38이나 CHM13과 같은 기존 reference를 하나의 path로 유지할 수 있으므로, 기존 좌표계와의 연결을 완전히 포기하는 것은 아니다. 결국 pangenome의 문제는 reference sequence 하나를 바꾸는 것에 그치지 않고, mapping에서 variant representation, 그리고 좌표계에 이르는 분석 체계 전체를 바꾸는 문제인 셈이다.

하지만 여기에서도 ‘이제 인류의 다양성을 충분히 대표한다’고 말하기는 어렵다. 이것은 어디까지나 47명으로 만든 첫 draft였고, HPRC 자체도 더 많은 사람과 population을 포함하는 방향으로 확장하고 있다. 한편 중국에서는 36개 population을 대상으로 별도의 Chinese pangenome reference를 구축했다.

Gao et al. A pangenome reference of 36 Chinese populations. Nature 619, 112–121 (2023)

그러면 또 문제가 생긴다.

한국인은 한국인에게 더 잘 맞는 reference를 만들고, 중국은 중국 population을 위한 pangenome을 만들고, 싱가포르는 Chinese, Malay, Indian을 포함하는 reference를 만들면 각 population의 분석에는 분명 도움이 될 것이다.

그런데 그렇게 만든 데이터를 나중에 한데 모아 분석하려면 어떻게 하지?

결국 다시 PRECISE로 돌아왔다

처음에는 다음 주 PRECISE 사람들과 무엇을 이야기할 것인지 준비하다가 여기까지 흘러왔다.

이번에 읽은 Nature Genetics 논문에서 PRECISE-SG100K는 Chinese, Malay, Indian을 중심으로 한 multi-ancestry Asian population resource로 소개된다. 싱가포르 NPM은 Phase III가 끝날 무렵에는 국민의 약 10%를 genetically mapped population으로 만들겠다는 계획을 갖고 있다.

논문은 또 PRECISE가 GA4GH의 WGS Quality Control Standards, Regulatory and Ethics Work Stream, federated gnomAD, National Initiatives Forum 등에 참여하고 있다고 설명한다. 그리고 공교롭게도 내가 다음 주 참석할 2026년 제14차 GA4GH Plenary가 아시아에서는 처음으로 싱가포르에서 열린다는 내용도 이 논문에 들어 있다.

Translating genomic data into healthcare practice with the Singapore National Precision Medicine program. Nature Genetics 58, 1760–1772 (2026)

그러니 이 문제를 그들과 이야기해 보지 않을 이유가 없다.

아시아 각국이 자기 population에 더 적합한 reference 또는 pangenome을 사용하기 시작한다면, 그 장점을 살리면서도 국가 간 데이터의 interoperability를 어떻게 유지할 것인가. 또 T2T와 human pangenome이 등장한 지금, 언제까지 GRCh38이라는 하나의 linear reference에 의존할 것인가. 그렇다고 지난 수십 년 동안 GRCh37과 GRCh38을 기준으로 축적한 방대한 데이터를 버릴 수도 없다.

다음 주에는 질문을 할 기회가 주어진다면 이런 이야기도 한번 꺼내 볼 생각이다. 어떤 답을 들을 수 있을지 궁금하다.

처음의 의문은 우리 식으로 말하자면 biosample의 provenance에 관한 것이었다. GRCh38이라는 reference를 구성한 DNA는 도대체 누구에게서 왔는가? 어떤 시료에서 만들어졌고, 그 시료를 제공한 사람의 ancestry는 무엇인가? 평소 데이터를 다루면서 provenance의 중요성을 그렇게 강조하면서도, 정작 가장 들어 온 reference genome의 provenance에 대해서는 제대로 알고 있지 못했다.

그런데 RP11을 거쳐 T2T-CHM13과 human pangenome까지 따라가고 나니 질문의 성격이 달라졌다. 처음에는 reference를 만든 시료의 출처가 궁금했는데, 점차 ‘무엇을 reference라고 부를 것인가’로 질문이 바뀌고 있었다.

GRCh38에서는 여러 사람의 DNA 조각을 하나의 linear genome으로 조립했다. T2T-CHM13에서는 거의 하나의 haplotype으로부터 훨씬 완전한 genome을 만들었다. 그리고 pangenome에 와서는 하나의 linear sequence가 모든 사람을 대표해야 한다는 전제 자체에서 벗어나기 시작했다. Reference가 더 정확해졌다기보다 reference라는 개념 자체가 달라지고 있는 셈이다.

이것은 과거 Human Genome Project의 역사를 되짚어 보는 잡학으로 끝날 문제도 아니다. BIKO에서 수십만 명의 유전체를 만들고, 언젠가 SG100K를 비롯한 다른 아시아 국가의 데이터와 함께 분석하려 한다면 각 population의 다양성을 더 잘 표현하는 것과 서로 다른 데이터 사이의 interoperability를 유지하는 것을 동시에 해결해야 한다.

추석 연휴에 다음 주 국외 출장 준비를 하다가 생각보다 멀리 와 버렸다. 시작은 biosample의 provenance였는데, 끝에 와 보니 질문은 전혀 다른 것이 되어 있었다.

앞으로 우리는 무엇을 reference라고 부르게 될까?

MAX4410의 시대는 지나갔는가

Fluid Ardule의 I²S DAC(PCM5102A 사용) 출력은 헤드폰을 직접 울리기에 적당하지는 않다. 음원 파일이나 여러 채널의 출력이 동시에 나오는 MIDI 파일 재생에서는 큰 문제가 없으나, 어쿠스틱 피아노 사운드폰트를 걸어놓고 연주할 때에는 약간 빈약한 느낌이다. 16개 채널 중 하나에서만 소리가 나므로 그러한 기분이 드는 것은 당연하다. 이 DAC의 출력은 파워앰프로 보내어 스피커를 울리는 것이 가장 바람직하다.

근본적인 해결책은 적당한 헤드폰 앰플리파이어를 쓰는 것이다. 예전에 MAX4410칩을 사용한 헤드폰 앰플리파이어 보드를 몇 개 구입해 둔 일이 있다. 문제는 이를 Fluid Ardule 내에 깔끔하게 넣어버릴 수가 없다는 점이다. 우선 전후 패널이 너무 두꺼워서 볼륨 pot의 나사산이 이를 통과하여 나오지 못한다. 더 큰 문제는 SMPS의 자체 노이즈가 보드의 음성 출력에 딸려 나오는 것이다. 전원이 들어간 SMPS에 가까이 귀를 대면 '삐~뀨~'하는 소리가 난다. DAC에서는 문제가 없으나 이를 MAX4410 앰플리파이어 보드의 전원으로 공급하면 여지없이 출력단에서 이 소리가 딸려 나온다. 

따라서 별도의 전원을 공급하는 거치형 헤드폰 앰플리파이어를 만들어야 한다. 그러려면 기존의 보드를 적당한 케이스에 넣고 입출력 단자와 파일럿 LED 등을 달아야 한다. 서투른 DIYer를 가장 힘들게 하는 점은 바로 케이스 가공하기가 아니던가.

차라리 완제품 앰프를 살까? 알리익스프레스를 검색해 보니 MAX97220이라는 칩을 사용한 보드가 대세이다. 3.5mm 스테레오 폰잭이 입력과 출력에 전부 달려 있어고 USB-C 커넥터가 붙어 있어서 작업이 편리한 보드가 눈에 뜨였다. 내가 보유한 MAX4410 보드는 출력용 폰잭만 붙어 있다.

항목 MAX97220 MAX4410
용도 저왜곡 헤드폰 앰프 저전압 헤드폰 앰프
전원 약 2.5–5.5 V 약 1.8–3.6 V 계열*
출력 방식 DirectDrive 계열, ground-referenced DirectDrive 계열
입력 차동 입력 가능 기본적으로 single-ended
출력 능력 비교적 강함 충분하지만 구형 설계
노이즈/왜곡 매우 낮음 양호
PSRR 우수 상대적으로 불리
PCM5102A와 조합 추천 사용 가능
세대 2011년 출시 2000년대 초반 출시

* 시중 MAX4410 모듈이 5–12 V 입력을 지원한다고 표시되어 있다면, 보드에 별도의 전압 레귤레이터가 포함되어 MAX4410의 실제 동작전압으로 낮추어 주는 경우를 구분해야 한다. 내가 갖고 있는 보드가 그러하다.

성능은 비교적 최근 제품인 MAX97220이 더 나은 것 같다. 구입을 할까? 일단 하나를 주문한 다음, 작업실로 쓰는 작은 방으로 들어갔다. MAX4410 보드에 케이스와 커넥터를 연결하려고 책상 위에 부품을 늘어 놓고는 거의 두 달 가까운 시간이 흘렀다.

에이, 해 보자. 파일럿 LED는 보드의 레귤레이터에 붙여버렸다. Fluid Ardule의 핵심 부품인 라즈베리 파이 3B를 한때 품고 있었던 파랑 알루미늄 케이스의 일부를 사용했다. 사실 사진에서 보인 것은 상판이다. 하판은 라즈베이 3B의 마운팅용 보드가 되어 Fluid Ardule 내에 영구히 머물고 있다.


몇 달 전에 측면 구멍을 넓히느라 무척 애를 먹었다.


나쁘지 않다! 앰프의 볼륨을 올리니 피아노 소리가 이제야 좀 박력있게 느껴진다. 출력단자에 해당하는 듀폰 커넥터의 접촉이 약간 불량한데, 핀을 살짝 구부리든지 또는 납땜으로 직결을 해 버리면 된다.

이것을 매번 어댑터로 구동하려면 약간 성가시다. 보조배터리를 연결하면 좋을 것 같은데, 배터리의 USB-A 스타일 단자에서 단순히 VBUS와 GND를 뽑아서 일반적인 어댑터 단자를 통해 앰프를 연결하면 몇 초 후에 배터리가 자동으로 차단된다. 아마도 저전류가 흐를 때에는 보조배터리의 출력을 차단하는 너무나 스마트한 기능이 숨어 있는 것 같다. 보조배터리의 USB-C 단자를 이용하되, 케이블 끝의 USB-C 단자에 다음과 같은 보드를 달아서 원하는 전압을 뽑으면 되지 않을까? USB-C 단자에서는 단순히 +5V/GND에서 선을 끌어다가 다른 기기를 구동하면 안 된다. USB-A 시절과 같이 그렇게 단순하지 않다. 



ChatGPT의 설명을 들어 보자.

USB-C에서는 CC1/CC2(Configuration Channel) 핀을 통해 전원을 공급하는 쪽(Source)과 받는 쪽(Sink)이 서로 연결 상태와 역할을 확인합니다. 정상적인 USB-C Sink 장치는 CC 핀에 Rd 저항(보통 5.1 kΩ)을 연결하여 “나는 전원을 받는 장치다”라고 Source에 알려줍니다. 이 절차가 성립해야 Source가 VBUS에 5 V를 공급하는 것이 USB-C의 정상적인 동작입니다.

따라서 USB-C 커넥터에서 VBUS와 GND만 납땜해서 빼내면 문제가 생길 수 있습니다. 단순한 충전기는 우연히 5 V를 계속 내보낼 수도 있지만, 규격을 제대로 따르는 충전기나 보조배터리는 Sink가 연결된 것으로 인식하지 못하여 아예 5 V를 켜지 않거나 일정 시간이 지나면 출력을 차단할 수 있습니다.

여기에 보조배터리에는 또 하나의 문제가 있습니다. CC 협상이 제대로 되어 5 V가 나왔다고 해도, 헤드폰 앰프처럼 소비전력이 매우 작은 장치는 보조배터리가 “부하가 없어졌다”고 판단하여 자동으로 꺼질 수 있습니다. 어제 100 Ω 저항을 달고, 다시 91 Ω을 병렬로 추가했는데도 배터리가 꺼졌던 문제는 이 저부하 자동 차단과 관련된 별개의 문제일 가능성이 큽니다.

보유 중이던 MAX4410 보드를 케이스에 넣었으니 더 이상 필요하지 않게 된 MAX97220 앰플리파이어 보드는 결국 주문을 취소하였다. 

공작을 한동안 쉬면 감각이 줄어서 질 좋은 결과물이 나오지 않는다. 사실 어제 업무 스트레스를 삭이기 위해 정말 오랜만에 납땜인두를 들었다가 제대로 되는 것이 하나도 없어서 엄청난 좌절감을 느꼈었다. 온갖 부품과 잡동사니를 다 치워 버리고 더 이상 DIY를 하지 말까 생각도 했었다. 욕심을 버리고 차분한 마음을 갖는 것이 무엇보다 중요하다.

다음 DIY 프로젝트는 KORG X2 Music Workstation의 망가진 2DD 플로피 디스크 드라이브를 대체할 에뮬레이터를 달아 보는 것. 이렇게 하면 USB 매체를 이용해서 X2와 PC 사이의 양방향 데이터 전송이 가능하다. 현재는 SysEx를 이용한 느린 덤프만 겨우 가능한 상태이다. PCG 파일의 역엔지니어링이 충분히 가능하므로 플로피 에뮬레이터가 제대로 설치만 되면 X2를 Ardule 생태계에 편입할 수 있을 것이다.


2026년 9월 24일 업데이트

많은 보조배터리는 버튼을 더블클릭하면 저전류(소전류) 충전 모드로 진입한다고 한다. 이러한 문제를 겪는 것이 나 혼자만은 아니니, 어쩌면 제조사측에서 합리적인 해결 방안을 이미 만들어 두었을 가능성이 크다. 불필요한 부품을 또 쇼핑하여 자꾸 재고만 늘릴 것이 아니라 테스트를 먼저 해 보자.

결과는 성공이었다. 이 제품의 경우 버튼을 길게 누르면 저전류 충전 모드로 들어간다. 2초 정도는 눌러야 하는 것 같다. 그 뒤에는 충전상태를 표시하는 LED가 주기적으로 다음 영상과 같이 흐르듯 작동한다.


저전류 충전 모드에서는 케이블을 뽑아서 부하를 제거해도 LED가 계속 켜진 상태이다. 이때는 버튼을 더블클릭하면 꺼진다. 인터넷 검색과 실험을 통해서 불필요한 부품 구입에 대한 부담을 줄일 수 있었다.

헤드폰 앰프 작동에 사용한 배터리(아이리버 IWP-20)의 제품 겉면에 인쇄된 상세 정보.


2026년 9월 23일 수요일

바이오데이터를 공유한다는 것은 무엇인가? Open Repository, Controlled Access, 그리고 Federation

※ 이 글은 다음 주 싱가포르에서 열리는 제14차 GA4GH Plenary meeting 참석을 앞두고 개인적인 공부를 위해 작성한 것이다. GA4GH의 개념과 관련 자료를 이해하기 위해 생성형 AI(ChatGPT)와 대화하면서 초안을 자동 생성하고, 내용을 검토·수정하여 정리하였다. 따라서 GA4GH나 소속기관의 공식 입장을 나타내는 글이 아니다.


연구데이터를 공유해야 한다는 데에는 이제 큰 이견이 없다. Open Science와 FAIR Data가 연구정책의 중요한 원칙이 되었고, 공공 연구비로 생산한 데이터는 가능한 한 널리 재사용할 수 있어야 한다는 요구도 강해졌다.

그러나 바이오데이터, 특히 사람의 유전체와 임상정보를 다루기 시작하면 이야기는 금방 복잡해진다.

모든 데이터를 인터넷에서 자유롭게 내려받게 하는 것이 과연 가장 바람직한 데이터 공유일까?

더 나아가 데이터를 반드시 한곳에 모아야 할까? 원자료를 분산해서 보관하더라도, 적어도 메타데이터만큼은 한곳에 모아야 제대로 검색하고 활용할 수 있는 것일까?

어쩌면 우리는 지금까지 ‘공유’를 너무 쉽게 한곳에 모으고, 한곳에서 검색하고, 필요한 데이터를 내려받는 것으로 생각해 온 것은 아닐까?

그렇지 않다. 오히려 오늘날의 바이오데이터 인프라를 이해하려면 다음 세 가지 sharing architecture를 구별해 볼 필요가 있다.

  1. Open-access repository
  2. Controlled-access repository / environment
  3. Federated data-sharing infrastructure

이 세 가지는 앞의 방식이 낡아서 뒤의 방식으로 대체되는 발전단계가 아니다. 데이터의 성격과 위험, 그리고 연구환경에 따라 서로 다른 방식이 필요하며 실제로는 함께 존재한다.

1. 가장 단순하고 강력한 모델: Open-access repository

생명정보학 연구자에게 가장 익숙한 것은 공개 데이터 저장소이다.

연구자가 데이터를 생산하고 repository에 제출하면 accession이 부여되고, 다른 연구자는 검색하여 데이터를 내려받는다.

Researcher
    ↓ submit
Repository
    ↓ search / download
Research community

염기서열 데이터에서는 INSDC가 대표적인 사례이다. GenBank, ENA, DDBJ가 데이터를 국제적으로 교환함으로써 연구자는 공개된 nucleotide sequence data를 전 세계 어디에서나 활용할 수 있다.

이 모델은 현대 생명과학 발전에 엄청난 기여를 했다. 논문에 염기서열 몇 줄을 싣는 대신 accession을 제시하면 전 세계 연구자가 동일한 원자료를 다시 사용할 수 있게 되었다. 이처럼 연구데이터를 가능한 한 제약 없이 이용할 수 있게 하는 Open Access는 Open Science의 이상과도 매우 잘 맞는다.

Open Science의 이상과도 매우 잘 맞는다.

그러나 여기에서 중요한 구별이 하나 필요하다.

Open Science가 반드시 모든 데이터를 Open Access, 즉 누구나 별도의 접근 승인을 받지 않고 이용할 수 있는 형태로 제공하라는 뜻은 아니다.

개인정보, 임상정보, human genomic data처럼 공개함으로써 연구참여자에게 위험을 초래할 수 있는 데이터에는 정당한 접근 제한이 필요하다. UNESCO의 Recommendation on Open Science도 scientific knowledge는 가능한 한 개방되어야 하지만 privacy, confidentiality, human subjects 보호 등의 이유로 정당화되고 비례적인 접근 제한을 둘 수 있으며, 필요한 경우 defined access criteria에 따른 mediated access를 사용할 수 있음을 명시하고 있다.

따라서 Open Science의 반대말이 Controlled Access인 것은 아니다.

오히려 Controlled Access 역시 책임 있는 Open Science를 구현하는 한 방법이라고 볼 수 있다.

2. 사람의 유전체가 등장하면서 문제가 달라졌다

사람의 genome은 일반적인 연구데이터와 성격이 다르다.

이름과 주민등록번호를 제거했다고 해서 완전히 익명이라고 단정하기 어렵다. Genotype이나 molecular sequence 자체가 개인 식별 가능성을 가질 수 있고, phenotype이나 clinical information과 결합되면 위험은 더 커질 수 있다.

따라서 human genomic data에서는 다음과 같은 모델이 필요해졌다.

Researcher
    ↓ request
Data Access Committee
    ↓ review
Controlled-access repository
    ↓ approved access
Researcher

미국 NIH의 dbGaP가 대표적인 사례이다.

연구자는 단순히 회원가입을 하고 controlled data를 내려받는 것이 아니라 Data Use Certification을 포함한 access request를 제출한다. NIH Data Access Committee(DAC)는 제안된 연구목적이 연구참여자의 consent와 해당 dataset에 설정된 제한조건에 부합하는지를 검토한다.

따라서 핵심 질문은 더 이상 단순한 availability가 아니다.

Can I find the data?

에 더하여

Am I allowed to use the data
for this particular purpose?

라는 질문이 등장한다.

이것이 Controlled Access의 세계이다.

3. 하지만 Controlled-access repository만으로도 충분하지 않다

여기까지는 여전히 repository 중심의 사고방식이다.

승인을 받으면 데이터를 repository에서 연구자가 있는 곳으로 가져오는 방식을 생각하기 쉽다.

Repository
     ↓
 approved download
     ↓
Researcher's environment

그러나 dataset이 수십 TB, 수백 TB가 되고 여러 병원과 국가에 분산되면 상황이 달라진다.

더 중요한 것은 모든 데이터를 하나의 중앙 repository로 옮기는 것 자체가 불가능하거나 바람직하지 않을 수 있다는 점이다.

병원 A의 데이터는 병원 A에 있어야 하고, 병원 B의 데이터는 병원 B의 governance 아래 있어야 할 수 있다. 한국의 데이터와 싱가포르의 데이터에는 서로 다른 법률과 consent, access policy가 적용될 수도 있다.

그렇다면 새로운 질문이 생긴다.

데이터를 한곳에 모으지 않고도 하나의 연구 인프라처럼 사용할 수는 없을까?

여기에서 Federation이라는 개념이 중요해진다.

4. GA4GH가 풀려는 문제

GA4GH(Global Alliance for Genomics and Health)는 거대한 국제 유전체 데이터베이스를 만들려는 조직이 아니다.

GA4GH는 genomic and health community가 실제로 필요로 하는 technical standards와 regulatory·ethical policy tools를 개발한다. 그 목적은 서로 독립적으로 관리되는 genomic and health data infrastructure가 안전하고 책임 있는 방식으로 함께 작동할 수 있게 하는 데 있다.

예를 들어 연구자는 먼저 데이터가 어디에 있는지 찾아야 한다.

                 Researcher
                     ↓
                   Beacon
                     ↓
          ┌─────┼─────┐
          ↓          ↓          ↓
        Korea    Singapore    Europe

Beacon은 관련 데이터가 존재하는지를 찾게 해준다. 데이터 자체를 연구자에게 곧바로 넘겨주는 서비스는 아니다.

그 다음에는 그 데이터가 어떤 목적으로 사용될 수 있는지를 알아야 한다.

Dataset
   ↓
  DUO

DUO(Data Use Ontology)는 dataset의 permitted use를 machine-readable하게 표현하기 위한 ontology이다.

반대편에는 연구자가 있다.

Researcher
    ↓
Passport / Visa

연구자가 누구인지, 어떤 자격과 authorization을 가지고 있는지를 서로 다른 기관이 신뢰할 수 있는 방식으로 전달할 필요가 있다.

그리고 실제 data object를 표준적인 방식으로 가리키고 접근하기 위해 DRS(Data Repository Service)와 같은 interface를 사용할 수 있다.

이렇게 되면 서로 다른 기관이 반드시 같은 software나 같은 storage를 사용할 필요가 없다.

중요한 것은 같은 시스템을 사용하는 것이 아니라 서로 이해할 수 있다는 것이다.

5. 더 나아가 데이터를 움직이지 않을 수도 있다

Federation에서 특히 흥미로운 변화는 분석 방식에서 나타난다.

전통적인 모델은 다음과 같다.

DATA
 ↓
Researcher

연구자가 데이터를 내려받아 자신의 compute environment에서 분석한다.

그러나 sensitive genomic data에서는 반대로 할 수 있다.

WORKFLOW
   ↓
 DATA

즉 연구자의 분석 workflow를 데이터가 존재하는 secure compute environment로 보내는 것이다. 흔히 compute-to-data 또는 bring the algorithms to the data라고 표현한다.

GA4GH의 WES(Workflow Execution Service)와 TES(Task Execution Service)는 이런 방식의 federated analysis를 지원할 수 있는 표준 interface를 제공한다.

따라서 여기에서는 데이터 공유라는 말 자체의 의미가 달라질 수 있다.

과거에는 흔히

데이터를 공유한다 = 파일을 전달한다

라고 생각했다.

Federation에서는 이를 다음처럼 생각할 수도 있다.

데이터를 공유한다 = 허가된 연구자가 그 데이터로부터 연구결과를 얻을 수 있게 한다.

파일 자체가 연구자의 컴퓨터로 전달되지 않아도 데이터는 연구에 활용될 수 있다.

6. 세 가지 모델을 비교해 보자

Open-access repository Controlled-access repository Federated infrastructure
대표 질문 데이터가 공개되어 있는가? 내가 이 데이터를 이 목적으로 사용할 수 있는가? 서로 다른 기관의 데이터를 함께 사용할 수 있는가?
접근 방식 공개 검색·다운로드 신청·심의·승인 Discovery + authorization + interoperable access/compute
데이터 위치 Repository Controlled repository / secure environment 여러 기관에 분산 가능
연구자 인증 상대적으로 단순 중요 기관 간 신뢰 가능한 identity가 특히 중요
Data-use restriction 상대적으로 적음 핵심 요소 Machine-readable policy와 기관 간 trust가 중요
분석 방식 주로 다운로드 후 분석 승인 후 다운로드 또는 secure environment Compute-to-data 가능
대표 사례/개념 INSDC 등 dbGaP, EGA 등 GA4GH standards를 활용한 federated ecosystem
핵심 가치 Openness Responsible access Interoperability + Trust + Local control

여기에서 중요한 것은 이 세 모델을 우열관계로 보지 않는 것이다.

공개할 수 있는 nucleotide sequence를 굳이 복잡한 access-control system 안에 넣을 필요는 없다.

반대로 identifiable human genomic data를 Open Science라는 이유만으로 unrestricted download하게 만들어서도 안 된다.

그리고 데이터가 여러 병원과 국가에 분산되어 있다면 하나의 controlled repository로 모두 복사하는 것보다 federation이 적절할 수 있다.

결국 데이터의 성격에 맞는 sharing architecture를 선택해야 한다.

7. Open과 Closed 사이에는 넓은 공간이 있다

이런 관점에서 보면 데이터 공유를

OPEN ←────────────────────────→ CLOSED

라는 한 축으로만 생각하는 것이 오히려 문제일 수 있다.

실제 연구데이터 infrastructure에는 훨씬 다양한 access model이 존재한다.

Open download
      ↓
Registered access
      ↓
Controlled access
      ↓
Secure analysis environment
      ↓
Federated analysis

아래로 내려간다고 반드시 데이터가 덜 공유되는 것은 아니다.

예를 들어 100,000명의 genome을 연구자에게 직접 다운로드하게 하는 것보다 secure environment 안에서 승인된 workflow를 실행할 수 있게 하는 것이 개인정보를 더 잘 보호하면서도 실제 연구 활용성을 높이는 방법이 될 수 있다.

따라서 중요한 질문은

How open is the data?

하나만이 아닐 것이다.

어쩌면 더 중요한 질문은

How usable is the data under appropriate governance?

일 수 있다.

8. 결국 핵심은 Trust이다

Open repository에서는 trust 문제가 상대적으로 단순하다. 누구나 데이터를 사용할 수 있기 때문이다.

Controlled access에서는 연구자를 신뢰해야 한다.

Federation에서는 한 단계 더 나아간다.

기관이 다른 기관을 신뢰해야 한다.

Can Hospital A trust
the identity issued by Institution B?

Can Singapore trust
an access authorization from Korea?

Can the data custodian trust
the workflow submitted by a foreign researcher?

따라서 API 몇 개를 연결한다고 federation이 완성되는 것은 아니다.

오늘 공부하면서 나는 federation의 핵심을 다음과 같이 정리하게 되었다.

Federation = Trust + Interoperability + Local control

9. 다시 Open Science로 돌아가면

이제 처음의 질문으로 돌아가 보자.

Open Science는 모든 연구데이터를 인터넷에 공개하는 것일까?

적어도 바이오데이터에서는 그렇게 단순하게 정의하기 어렵다.

Open Science가 추구해야 할 것을 반드시 unrestricted access라고 보기보다 maximum responsible reuse라고 생각하는 편이 더 적절할 수도 있다.

공개 가능한 데이터는 open repository에 둔다.

민감하지만 연구가치가 높은 데이터는 controlled access로 제공한다.

그리고 물리적으로 이동시키기 어렵거나 서로 다른 기관의 governance 아래 있어야 하는 데이터는 federation을 통해 발견하고, 허가받고, 분석한다.

OPEN-ACCESS REPOSITORY
          │
          │
  CONTROLLED ACCESS
          │
          │
FEDERATED ACCESS & ANALYSIS

이들은 서로 경쟁하는 모델이 아니다.

데이터를 가능한 한 많이 공유하면서도, 그 데이터가 요구하는 책임을 지키기 위해 만들어진 서로 다른 도구들이다.

이렇게 생각하고 나니 GA4GH의 의미도 조금 다르게 보인다.

GA4GH는 Open Science를 제한하기 위한 체계라기보다, 단순한 Open Access로는 공유할 수 없는 genomic and health data까지 책임 있는 재사용의 영역으로 끌어들이기 위한 기술적·governance적 시도라고 볼 수 있지 않을까.

GA4GH 스스로도 genomic and health-related data의 공유가 human health의 발전에 중요하다고 전제하면서, privacy, non-discrimination, procedural fairness와 human rights에 기반한 responsible data sharing을 강조한다.

다음 주 싱가포르에서 실제 GA4GH community의 사람들을 만나고 Plenary의 여러 발표를 들으면서, 오늘 공부하며 만들어 놓은 이 그림이 실제 현장에서는 어떻게 구현되고 있는지 확인해 보고 싶다.


참고자료

  • UNESCO, Recommendation on Open Science
    https://www.unesco.org/en/legal-affairs/recommendation-open-science
  • GA4GH, Framework for Responsible Sharing of Genomic and Health-Related Data
    https://www.ga4gh.org/framework/
  • GA4GH, What We Do
    https://www.ga4gh.org/what-we-do/
  • GA4GH, About Us
    https://www.ga4gh.org/about-us/
  • NIH dbGaP, Requesting Controlled-Access Data
    https://www.ncbi.nlm.nih.gov/projects/gap/cgi-bin/about.html