엔진

테라바이트급 생물학 데이터를 바로 검색하는 엔진

BioQ는 메타게놈 단백질 57.4억 개와 UniProt 레코드 1.49억 건을 데이터베이스에 옮기지 않고 그 자리에서 답합니다. 그 뒤에 있는 기술을, 직접 잰 숫자로 소개합니다.

5.74BID로 바로 꺼내는 메타게놈 단백질
107 GB1.15 TB 원본 앞에 놓인 인덱스
1.5M×빨라진 「Pfam 도메인 없음」 판정: 35.6분 → 1.4ms
230 q/s동시 64명 접속에서, 중앙값 165ms

대부분의 도구는 등록된 것을 찾습니다. BioQ는 조건을 만족하는 것을 찾습니다.

포털과 BLAST류 도구는 「X를 보여 줘」, 「X와 비슷한 것」에 답합니다. 발견은 여러 데이터셋에 걸친 조건이라, 엔진이 층들을 대신 엮어 줍니다.

조회

UniProt P04637 보여 줘

내 서열과 비슷한 서열

토양에서 채취된 단백질

조건

단백질 A는 있고 단백질 B는 없는 어셈블리

알려진 도메인이 없는 토양의 대형 단백질 패밀리

이 ID를 아는 데이터베이스와, 아예 찾아보지 않은 데이터베이스

직접 하면 얼마나 걸리는가

실제 질문 여섯 개를 양쪽 방식으로 쟀습니다. 다운로드 시간은 공개 아카이브에서 저희가 측정한 전송 속도 기준이며, 사용자 환경에 따라 다를 수 있습니다.

메타게놈 단백질 57.4억 개 중 하나를 ID로 꺼내기
직접 할 때≈3 h

1.11 TB 다운로드 후 정렬되지 않은 로우그룹 46,303개 탐색

BioQ0.17 s

요청 한 번. 클러스터 대표 서열은 0.17초, 그 밖의 멤버는 처음에 최대 14.5초

64K×
이 단백질의 Pfam 도메인은? 아니면 없음?
직접 할 때≈7.5 h

117.6 GB 다운로드 후 66 GB 정방향 인덱스 구축(74분)

BioQ40 ms

요청 한 번, 인터넷 너머로 약 40ms

678K×
단백질 A가 있고 B는 없는 어셈블리
직접 할 때≈2.4 h

탐색 불가능한 gzip 26.1 GB 다운로드 후 질문마다 112 GB 압축 해제

BioQ≤1.5 s

요청 한 번이 5 MB 블록 하나만 읽음

6K×
UniProt TrEMBL 레코드 하나의 서열
직접 할 때≈2.3 h

40.6 GB 다운로드 후 그 레코드 앞부분을 전부 압축 해제

BioQ76 s

그 깊이는 처음 76초, 이후로는 캐시에서 즉시

110×
RefSeq 서열 544,891개 중 특정 좌표의 염기
직접 할 때≈1 h

11.9 GB 다운로드 후 BGZF·FASTA 인덱스 구축(19분)

BioQ0.07 s

요청 한 번, 엔진 내부 1.7ms

51K×
이 ID를 아는 데이터베이스는? 찾아보지도 않은 곳은?
직접 할 때≈3.3 h

≈1.2 TB 아카이브를 받아 하나씩 확인

BioQ0.12–0.48 s

요청 한 번이 9개 층에 동시에 질의

25K×

막대는 1밀리초~10시간 로그 눈금입니다.

사용자와 1.15 TB 사이의 다섯 층

쓰는 곳

어디서든 같은 답
Web appREST APIResearch agentMCP · Claude · ChatGPT

게이트웨이

누가, 얼마나 물을 수 있는지
Google · email sign-inAPI keysDaily quotasParameter validationResponse scrubbing

엔진

22개 층 중 20개 서비스 중
/whereis/search/lookup/domains/cooccur/depmap/affinity/interaction/dna+12

직접 만든 인덱스

약 107 GB, 원본과 대조 검증
parquet footer indexseekable C2 storeBGZF + .gzi/.fai32 MB co-occurrence blocksTrEMBL offset indexPfam forward + invertedMMseqs2 k-mer index

공개 원본

통째로 복사하지 않고 그 자리에서 읽음
UniProtMGnifyPfamPDBAlphaFold DBChEMBLDrugCentralGtoPdbClinVarSTRINGBioGRIDDepMapRefSeqGRCh38GRCm39

속도를 만든 인덱싱 결정 여섯 가지

파일의 푸터가 곧 인덱스

1.11 TB parquet은 이미 로우그룹 46,303개 전부의 최소·최대 ID를 담고 있습니다. 827 MB 푸터가 2 MB 인덱스가 됩니다.

이전1.11 TB
이후25.5 MB

많은 사용자를 위한 배치

대표 서열 1.287억 개를 탐색 가능한 저장소로 다시 써서, 조회 한 번에 최대 242 MB 대신 46 KB만 옮깁니다.

이전42.9 s
이후168 ms

gzip 안에서의 임의 접근

일반 gzip은 처음부터 풀어야 합니다. 블록 인덱스가 있는 BGZF로 다시 쓰면 어떤 좌표든 한 번에 찾습니다.

이전1.40 s
이후1.7 ms

질문 하나에 블록 하나

탐색할 수 없던 26 GB gzip을 독립 블록 5,773개로 바꿨습니다. 잃어버린 레코드 0건, 인덱스 404 KB.

이전715 ms
이후13.2 ms

양방향 인덱스, 촘촘하게

46.2억 쌍에 대한 Pfam 단백질→도메인, 도메인→단백질 인덱스를 66 GB에서 18 GB로 다시 묶었습니다.

이전35.6 min
이후1.4 ms

데이터와 함께 쓰는 인덱스

나중에 붙인 희소 인덱스는 한 시간 넘게 걸렸지만, 빌드 중에 쓰면 비용이 없습니다. 작은 파일 102,074개를 4개로 묶었습니다.

이전6,829 ms
이후374 ms

기억하는 상동성 검색

미리 만든 k-mer 인덱스로 MMseqs2를 돌립니다. 결과는 서열·매개변수·데이터베이스 버전의 지문으로 캐시돼, 같은 질문은 즉시 답하면서도 언제 계산했는지 함께 알려 줍니다.

8.8–10 s

인터넷 너머 첫 검색

0.04 s

같은 검색을 다시 할 때

양성 대조

QueryE-valueIdentity
HIV reverse transcriptase1.3×10⁻¹³36.7%
Human hemoglobin α1.1×10⁻¹¹99.0%
E. coli β-lactamase2.6×10⁻³³50.0%

인덱스를 신중하게 만드는 이유

k-mer 인덱스는 데이터베이스의 20~46배 크기입니다. Swiss-Prot(서열 575,748개)은 서비스 중이고, 더 큰 코퍼스는 인덱싱 중입니다.

DB1.59 GB
Index73 GB

질문 하나, 모든 층, 정직한 답

/whereis는 9개 층에 각자 마감 시간을 두고 동시에 묻고, 각 층이 실제로 무엇을 했는지 그대로 보고합니다. 인터넷 너머로 0.12~0.48초에 답합니다.

GET /api/v1/whereis?id=MGYP000000149140found
MGnify C2찾음1.05 ms
MGnify proteins찾음2,017 ms
MGnify assemblies찾음103 ms
Pfam domains검색함, 없음0.13 ms
UniProt TrEMBL해당 없음
Pfam domain index해당 없음
Structures해당 없음
Binding해당 없음
ClinVar해당 없음

주장에는 독립된 근거가 필요합니다

연관 주장에는 서로 다른 채취 실행에서 나온 어셈블리가 최소 3개 필요합니다. 모든 답에 판정이 붙습니다.

testable · ≥3weak · <3no claim · 1 run

모집단 없는 비율은 없습니다

같은 겹침도 모집단에 따라 1.000이 되기도, 212.5가 되기도 합니다. 엔진은 이를 추측하지 않습니다.

추측1.000
명시212.5

부하가 걸릴수록 빨라집니다

탐색 가능한 저장소에서는 동시 접속이 늘수록 중앙값 지연이 오히려 줄었고, 실패는 0건이었습니다.

초당 질의 수

1×5.4 q/s
32×138.9 q/s
64×230.2 q/s

중앙값 지연

1×179 ms
32×168 ms
64×165 ms

서비스를 시작하기 전, 엔진은 실제 질문 다섯 개에 맞게 답해야 합니다

  1. KRAS: 가장 의존적인 계통은 췌장
  2. TP53–MDM2 상호작용 점수 700 이상
  3. RefSeq에서 SARS-CoV-2 스파이크 염기 반환
  4. 헤모글로빈 검색이 상동체를 찾음
  5. 음성 대조가 부재를 증명

저희가 찾아내고, 측정하고, 설계로 막은 「조용한 오답」

395,688

구간 탐색이 서열 395,688개를 놓치고 「없음」이라 답했습니다.

이제 모든 로우그룹을 확인합니다. 회귀 시험 4/4 통과.

89.2%

TrEMBL 샤드 19개 중 2개만 적재됐을 때, 레코드의 89.2%가 없는 것처럼 보일 뻔했습니다.

적재 범위를 보고하고, 부재를 가정하지 않습니다.

+1

한 칸 밀림 오류로 모든 단백질의 도메인이 한 행씩 어긋났는데, 합계는 전부 맞았습니다.

빌더가 자가 점검하고, 리더가 적재 시 길이를 확인합니다.

∅ = ∅

검증기가 양쪽이 모두 비어 있을 때 「일치」로 기록했습니다.

검증기는 무언가를 찾은 뒤에만 비교합니다.

212.5×

실제 212.5배 농축이 1.000으로 보고됐습니다.

모집단이 명시되지 않으면 비율을 내지 않습니다.

7.8×

AlphaFold 「잔기 수」가 실제로는 원자 수여서 7.8배 컸습니다.

Cα 레코드로 다시 만들었고 대조 4/4를 통과했습니다.

모든 층이 따르는 다섯 가지 규칙

  1. 모든 답에 출처를 붙인다.
  2. 인덱스는 원본과 대조한다. 자기 자신과 비교하지 않는다.
  3. 일부만 적재되면 이유와 함께 503으로 답한다. 조용히 「없음」이라 하지 않는다.
  4. 빌드는 합계를 단언한다.
  5. 양성 대조 없이는 완료가 아니다.

시험 스위트는 일부러 망가뜨린 계약 13개를 13개 모두 잡아냅니다.

시험 단계

다음 단계: 단백질 언어 모델로 의미 기반 검색

Swiss-Prot 단백질 575,748개 전부를 ESM-2(650M)로 GPU 한 대에서 47.6분 만에 임베딩하고, 원거리 상동체에서 MMseqs2와 비교했습니다.

MMseqs2가 정렬하지 못하는 쌍

MMseqs240.7%
ESM-246.9%

MMseqs2가 정렬할 수 있는 쌍

MMseqs286.8%
ESM-278.2%

두 방법은 서로를 보완하므로, MMseqs2로 먼저 찾고 ESM-2로 다시 정렬하는 구조로 갑니다. 아직 서비스 전입니다.

내 질문에 어떻게 답하는지 직접 보세요

무료 계정에서도 엔진 전체를 씁니다. 모든 층, 에이전트, API까지.

무료로 시작API