Noosphere
Noosphere
큰 데이터를 그리기 전에, 작게 나눠 다루는 방법부터.

출발점과 담당 범위
논문 데이터 파이프라인 · 탐색 도구
맡은 범위
수집·좌표 변환·메타데이터 결합·LOD 타일·개념 투어를 연결하고 브라우저의 지도·필터·상세·시간 탐색을 구현했습니다. 투영 회귀 실험과 실제 지도 출력을 비교해 최종 처리 방식을 선택했습니다.
시작할 때의 상태
공개 데이터에서 시작한 비상용 연구 도구입니다.
개발 범위 · 기술 · 협업 자세히 읽기
시작할 때의 상태
공개 데이터에서 시작한 비상용 연구 도구입니다. 전체 원본을 보관하거나 모든 점을 한 번에 브라우저로 보내는 방식은 로컬 환경에 맞지 않았습니다.
작업 개요
공개 논문 데이터와 기존 임베딩을 지도 좌표로 바꾸고, 분야·시기·개념별로 탐색하는 도구를 만들었습니다. 로컬 저장 공간과 메모리의 한계를 계산 순서와 데이터 전달 방식으로 풀었습니다.
개발·개선 범위
- 공개 논문·개념 데이터 수집과 조각별 처리
- 기존 임베딩의 차원 축소·GPU 앵커 투영
- 좌표·메타데이터 조인과 연도별 분리
- 메모리 한계에 맞춘 LOD 타일 생성
- 가시 영역 로딩·분야 필터·시간순 개념 투어
- 사용한 기술
- Python · PyTorch · DuckDB · Parquet · PCA / UMAP · JavaScript
기존 자산 · 외부 서비스 · AI 활용
개인 연구로 AI 코딩 도구와 함께 구현했습니다. OpenAlex 등 공개 데이터, 기존 임베딩과 PCA·UMAP·PyTorch·DuckDB를 활용했습니다. 임베딩 모델이나 투영 알고리즘의 원천 연구를 제 성과로 소개하지 않습니다.
실제 실험 자료
최종 지도에 선택한 좌표.

문제 해결 / LOD 계산 순서
메모리를 늘리는 대신, 부모 타일의 계산 순서를 바꿨다
원본 전체를 다시 묶지 않고, 이미 만든 자식 타일의 표본으로 부모를 만들었습니다.
이미 작게 만든 표본에서, 더 넓은 지도를 만듭니다
브라우저현재 확대 수준 · 가시 영역의 타일만 요청
문제
확대 수준별 타일을 만드는 SQL 윈도 연산이 메모리 부족으로 중단됐습니다.
바꾼 점
상세 타일은 정렬 스트림으로 만들고, 부모는 자식 표본에 같은 고정 해시 순위를 적용합니다.
확인한 것
변경 커밋·타일 산출물·바이너리 헤더·뷰어 읽기 구조를 대조했습니다.
조사·판단·검증 과정 읽기
마주한 문제
좌표를 확대 수준별 타일로 만드는 SQL 윈도 연산이 메모리 부족으로 중단됐습니다. 원본을 나눠 수집했어도 가시화 단계에서 다시 전체 데이터를 크게 묶으면 같은 병목이 생겼습니다.
확인한 과정
각 확대 수준에서 원본 전체를 반복 처리할 필요가 있는지 확인했습니다. 타일은 모든 점을 담는 결과물이 아니라 제한된 표본이며, 부모 타일은 자식 영역의 합이라는 점에 주목했습니다.
선택한 방법
가장 상세한 타일은 외부 정렬된 스트림으로 만들고, 부모는 자식 타일의 표본을 합쳐 다시 선택하도록 바꿨습니다. 모든 단계에 같은 고정 해시 순위를 적용하고, 표본 수와 원래 영역의 전체 점 수를 따로 저장했습니다.
어떻게 확인했는가
OOM 이후 변경 커밋, 완성된 연도별 타일 산출물, 바이너리 헤더와 뷰어의 읽기 구조를 대조했습니다. 브라우저는 현재 확대 수준과 가시 영역에 해당하는 파일만 가져오도록 연결했습니다.
단계별 처리와 경계
조각 변환
임베딩 조각 → 좌표 Parquet; 완료 파일 기준 재실행
메타 연결
좌표와 분야·연도를 조인해 연도 구간으로 분리
타일 계층
상세 타일은 정렬 스트림, 부모는 자식 표본에서 생성
화면 탐색
가시 영역과 확대 수준에 맞는 타일만 로드
구조도와 처리 경계 자세히 보기
벡터를 좌표로, 좌표를 브라우저가 읽을 타일로
기존 임베딩을 청크로 투영하고, 상세 타일에서 상위 타일을 유도합니다. 계산 표본·화면에 표시한 점·원본 규모를 구분합니다.
- 처리·명시된 호출
- 비동기·별도 요청
- 데이터 읽기·참조
- 실패·제한 분기
판정·계산식
wᵢ = (dᵢ + 10⁻⁶)⁻¹ / Σⱼ(dⱼ + 10⁻⁶)⁻¹ p = Σᵢwᵢyᵢ + σ ε 가까운 앵커 3개 · dᵢ=1−cos 유사도, yᵢ=앵커 2D 좌표, σ=clip(0.5×평균 d, 0.0005, 0.01), ε=정규 잡음. 코드의 배치식이며 독자 알고리즘 고안 주장이 아님.
- 자식 타일에서 부모를 만드는 이유
- 레벨마다 큰 SQL 윈도를 만들다 메모리 한계에 부딪혔습니다. 고정 순위·동일 K라면 부모의 K개는 자식 표본 합집합에서 다시 고를 수 있어 계산 순서를 바꿨습니다.
- 좌표 오차만으로는 판단하지 않았다
- 앵커 벡터·좌표의 ID 경계와 조각별 완료 파일을 확인했습니다. 타일의 표본 수와 원래 점 수도 구분했습니다. 투영 후보는 실제 지도에서 군집이 구별되는지도 비교했습니다.
- 현재 도식에 포함한 범위
- P3 확정 커밋의 배치·탐색 구조이며 진행 중 P4 화면은 제외했습니다. 원본 좌표행 수를 브라우저 동시 렌더 수나 서비스 사용량으로 제시하지 않습니다.
이 구조의 한계라이브러리·기존 임베딩을 활용한 비상용 파이프라인입니다. 가중 배치가 모든 논문의 의미적 거리를 보존한다는 보장은 없습니다.
단계별 설명 · 구조도를 글로 읽기
기존 임베딩
공개 벡터 조각 · 새 모델 학습이 아님
- PCA·정규화 (처리·명시된 호출)
PCA·정규화
행 배치로 변환 · 64차원으로 축소
- 앵커 후보 찾기 (처리·명시된 호출)
앵커 후보 찾기
GPU 청크별 top-3 · 후보 합쳐 다시 top-3
- 2D 좌표 배치 (처리·명시된 호출)
2D 좌표 배치
역거리 가중 평균 · 거리 비례 지터 추가
- 임시 파일 저장 (처리·명시된 호출)
임시 파일 저장
조각별 Parquet · 완료 후 파일명 교체
- 좌표·메타 결합 (데이터 읽기·참조)
- 실패 집계·종료 (조각 처리 실패)
좌표·메타 결합
work_id로 연결 · 연도·분야·인용 정보
- atlas 버킷 (처리·명시된 호출)
atlas 버킷
10년 구간별 Parquet · 필요한 컬럼·연도 선택
- z7 정렬 스트림 (데이터 읽기·참조)
z7 정렬 스트림
타일 좌표로 외부 정렬 · 배치 끝 같은 타일 이월
- 고정 순위 표본 (처리·명시된 호출)
고정 순위 표본
ID 해시로 K개 선택 · 해시 오름차순 저장
- 상위 타일 유도 (처리·명시된 호출)
상위 타일 유도
자식 최대 4개 병합 · 같은 순위로 다시 K개
- bin·presence (처리·명시된 호출)
bin·presence
점 배열 + 존재 비트맵 · 원래 영역 총량도 전파
- 가시 타일 요청 (데이터 읽기·참조)
가시 타일 요청
확대 수준·화면 영역 · 해당 타일을 읽기
- 필터·탐색 (처리·명시된 호출)
필터·탐색
분야·연도·논문 선택 · 원본 전량 동시 표시 X
실패 집계·종료
다음 실행에서 재처리 · 완료 파일은 건너뜀
구조 탐색과 실제 소스 대조를 바탕으로 편집한 작동도입니다. 런타임 전체의 자동 검증을 뜻하지 않습니다.
문제 해결 / 투영 경로 선택
모델을 학습했지만, 최종 지도에는 쓰지 않았다
학습한 모델을 고집하지 않고, 실제 탐색 화면을 보며 최종 투영 경로를 골랐습니다.
만든 모델보다, 지도가 어떻게 보이는지를 선택

학습·검증 로그와 출력 플롯을 함께 검토

- PCA
- GPU 유사 앵커 탐색
- 좌표 가중 결합
문제
회귀 모델의 수치 개선이 지도에서 주제 군집이 또렷해지는 결과와 같지 않았습니다.
바꾼 점
PCA 다음 GPU에서 유사한 앵커를 찾고, 그 좌표를 가중 결합하는 방식을 선택했습니다.
확인한 것
학습 기록·저장 모델·출력 플롯과 최종 배치 스크립트의 앵커 경로를 대조했습니다.
조사·판단·검증 과정 읽기
마주한 문제
고차원 임베딩을 지도에 배치하는 회귀 모델을 학습했지만, 수치가 개선되는 것과 화면에서 주제 군집이 또렷하게 보이는 것은 같지 않았습니다.
확인한 과정
PyTorch 회귀 투영의 학습·검증 로그와 실제 출력 플롯을 함께 봤습니다. 기존 표본의 UMAP 좌표를 앵커로 삼는 후보도 만들어, 지도에서 구분되는 구조를 비교했습니다.
선택한 방법
최종 배치는 PCA로 차원을 줄인 뒤 GPU에서 유사한 앵커를 찾아 그 좌표를 가중 결합하는 방식을 택했습니다. 모델을 더 크게 만드는 방향보다, 탐색 화면에 필요한 결과를 내는 경로를 선택했습니다.
어떻게 확인했는가
학습 스크립트·저장 모델·투영 플롯이 남아 있고, 최종 배치 스크립트가 회귀 모델이 아닌 앵커 경로를 사용함을 대조했습니다. 선택 이유를 실험의 수치와 시각 관측으로 나눠 기록했습니다.
구조도와 처리 경계 자세히 보기
벡터를 좌표로, 좌표를 브라우저가 읽을 타일로
기존 임베딩을 청크로 투영하고, 상세 타일에서 상위 타일을 유도합니다. 계산 표본·화면에 표시한 점·원본 규모를 구분합니다.
- 처리·명시된 호출
- 비동기·별도 요청
- 데이터 읽기·참조
- 실패·제한 분기
판정·계산식
wᵢ = (dᵢ + 10⁻⁶)⁻¹ / Σⱼ(dⱼ + 10⁻⁶)⁻¹ p = Σᵢwᵢyᵢ + σ ε 가까운 앵커 3개 · dᵢ=1−cos 유사도, yᵢ=앵커 2D 좌표, σ=clip(0.5×평균 d, 0.0005, 0.01), ε=정규 잡음. 코드의 배치식이며 독자 알고리즘 고안 주장이 아님.
- 자식 타일에서 부모를 만드는 이유
- 레벨마다 큰 SQL 윈도를 만들다 메모리 한계에 부딪혔습니다. 고정 순위·동일 K라면 부모의 K개는 자식 표본 합집합에서 다시 고를 수 있어 계산 순서를 바꿨습니다.
- 좌표 오차만으로는 판단하지 않았다
- 앵커 벡터·좌표의 ID 경계와 조각별 완료 파일을 확인했습니다. 타일의 표본 수와 원래 점 수도 구분했습니다. 투영 후보는 실제 지도에서 군집이 구별되는지도 비교했습니다.
- 현재 도식에 포함한 범위
- P3 확정 커밋의 배치·탐색 구조이며 진행 중 P4 화면은 제외했습니다. 원본 좌표행 수를 브라우저 동시 렌더 수나 서비스 사용량으로 제시하지 않습니다.
이 구조의 한계라이브러리·기존 임베딩을 활용한 비상용 파이프라인입니다. 가중 배치가 모든 논문의 의미적 거리를 보존한다는 보장은 없습니다.
단계별 설명 · 구조도를 글로 읽기
기존 임베딩
공개 벡터 조각 · 새 모델 학습이 아님
- PCA·정규화 (처리·명시된 호출)
PCA·정규화
행 배치로 변환 · 64차원으로 축소
- 앵커 후보 찾기 (처리·명시된 호출)
앵커 후보 찾기
GPU 청크별 top-3 · 후보 합쳐 다시 top-3
- 2D 좌표 배치 (처리·명시된 호출)
2D 좌표 배치
역거리 가중 평균 · 거리 비례 지터 추가
- 임시 파일 저장 (처리·명시된 호출)
임시 파일 저장
조각별 Parquet · 완료 후 파일명 교체
- 좌표·메타 결합 (데이터 읽기·참조)
- 실패 집계·종료 (조각 처리 실패)
좌표·메타 결합
work_id로 연결 · 연도·분야·인용 정보
- atlas 버킷 (처리·명시된 호출)
atlas 버킷
10년 구간별 Parquet · 필요한 컬럼·연도 선택
- z7 정렬 스트림 (데이터 읽기·참조)
z7 정렬 스트림
타일 좌표로 외부 정렬 · 배치 끝 같은 타일 이월
- 고정 순위 표본 (처리·명시된 호출)
고정 순위 표본
ID 해시로 K개 선택 · 해시 오름차순 저장
- 상위 타일 유도 (처리·명시된 호출)
상위 타일 유도
자식 최대 4개 병합 · 같은 순위로 다시 K개
- bin·presence (처리·명시된 호출)
bin·presence
점 배열 + 존재 비트맵 · 원래 영역 총량도 전파
- 가시 타일 요청 (데이터 읽기·참조)
가시 타일 요청
확대 수준·화면 영역 · 해당 타일을 읽기
- 필터·탐색 (처리·명시된 호출)
필터·탐색
분야·연도·논문 선택 · 원본 전량 동시 표시 X
실패 집계·종료
다음 실행에서 재처리 · 완료 파일은 건너뜀
구조 탐색과 실제 소스 대조를 바탕으로 편집한 작동도입니다. 런타임 전체의 자동 검증을 뜻하지 않습니다.
학습한 모델과 최종 투영 결과 비교
실제 실험 자료에서 회귀 모델과 앵커 경로의 차이를 확인합니다.
결과와 현재의 경계
결과, 그리고 지금.
조각별 좌표 산출물에서 연도별 타일과 브라우저 탐색까지 이어지는 경로를 만들었습니다. 데이터 파이프라인 위에 개념별 시간순 투어를 연결해, 파일 산출물에서 실제 탐색 도구로 확장했습니다.
P3 기준의 비상용 배치·탐색 구현입니다. 처리한 좌표 행 수는 사용자 수나 브라우저 동시 표시 수가 아닙니다. 진행 중인 P4 제품화 작업과 상용 운영 경험은 포함하지 않습니다.
작성 기준: 2026년 9월 작업 기록·소스 대조. 과거 검증 결과를 현재의 모든 동작에 대한 보증으로 사용하지 않습니다.
역할과 협업 이야기하기