ClickHouse에 부동소수점을 비트 평면으로 저장하는 QBit 컬럼 타입을 추가해, 쿼리 시 읽을 비트 수를 선택하며 벡터 검색의 정확도와 성능을 동적으로 조절할 수 있게 했습니다.
TL;DR
우리는 ClickHouse에 QBit을 추가했습니다. QBit은 부동소수점을 비트 평면으로 저장하는 컬럼 타입으로, 벡터 검색 시 읽을 비트 수를 선택해 데이터 변경 없이 재현율과 성능을 조절할 수 있습니다.
요즘 벡터 검색은 어디에나 있습니다. 음악 추천, 외부 지식을 가져와 답변을 개선하는 대규모 언어 모델의 RAG, 심지어 구글링도 어느 정도는 벡터 검색에 의해 구동됩니다. 벡터 검색을 잘 처리하도록 설계된 특화 데이터베이스도 많습니다. 하지만 이런 시스템은 구조화 데이터의 저장과 쿼리에는 이상적이지 않은 경우가 흔합니다. 그 결과, 우리는 종종 완전한 벡터 전용 스토어보다 일반 데이터베이스의 임시 벡터 기능을 선호하는 사용자를 보게 됩니다.
ClickHouse는 이미 몇 년 전부터 완전 탐색(브루트포스) 기반의 벡터 검색을 지원해 왔습니다. 더 최근에는 빠른 벡터 검색의 사실상 표준인 HNSW를 포함해 근사 최근접 이웃(ANN) 검색 방법도 추가했습니다. 그리고 우리는 양자화를 다시 살펴보고 새로운 데이터 타입 QBit을 만들었습니다.
각 벡터 검색 방식은 재현율, 정확도, 성능 사이의 트레이드오프를 결정하는 고유한 파라미터가 있습니다. 보통은 이를 사전에 선택해야 합니다. 만약 잘못 선택하면 많은 시간과 리소스를 낭비하고, 나중에 방향을 바꾸는 것이 고통스러워집니다.
QBit을 사용하면 초기에 결정을 내릴 필요가 없습니다. 쿼리 시점에 직접 정밀도와 속도의 트레이드오프를 조절하면서, 진행 중에 적절한 균형을 탐색할 수 있습니다.
기본부터 시작해 봅시다. 벡터 검색은 데이터셋에서 가장 유사한 문서(텍스트, 이미지, 노래 등)를 찾는 데 사용됩니다. 먼저 모든 항목을 임베딩 모델을 사용해 고차원 벡터(부동소수점 배열)로 변환합니다. 이 임베딩은 데이터의 의미를 담습니다. 벡터 간 거리 비교를 통해 두 항목이 의미상 얼마나 가까운지 알 수 있습니다.
작은 예를 보겠습니다. 과일과 동물에 대한 임베딩이 있다고 합시다. 레몬과 가장 가까이 있는 것은 무엇일까요? 🍋

정답은 사과입니다! 이 예시는 다소 우스울 수도 있습니다. 개념적으로 레몬은 오렌지나, 같은 노란색인 바나나가 더 가까울 것 같으니까요. 그래도 이것은 크기 5의 꽤 작은 임베딩에서의 완전 탐색 결과로 실제 예시입니다.
1CREATE TABLE fruit_animal
2ENGINE = MergeTree
3ORDER BY word
4AS SELECT *
5FROM VALUES(
6 'word String, vec Array(Float64)',
7 ('apple', [-0.99105519, 1.28887844, -0.43526649, -0.98520696, 0.66154391]),
8 ('banana', [-0.69372815, 0.25587061, -0.88226235, -2.54593015, 0.05300475]),
9 ('orange', [0.93338752, 2.06571317, -0.54612565, -1.51625717, 0.69775337]),
10 ('dog', [0.72138876, 1.55757105, 2.10953259, -0.33961248, -0.62217325]),
11 ('horse', [-0.61435682, 0.48542571, 1.21091247, -0.62530446, -1.33082533])
12);
1SELECT word, L2Distance(
2 vec, [-0.88693672, 1.31532824, -0.51182908, -0.99652702, 0.59907770]
3) AS distance
4FROM fruit_animal
5ORDER BY distance
6LIMIT 5;
┌─word───┬────────────distance─┐
1. │ apple │ 0.14639757188169716 │
2. │ banana │ 1.9989613690076786 │
3. │ orange │ 2.039041552613732 │
4. │ horse │ 2.7555776805484813 │
5. │ dog │ 3.382295083120104 │
└────────┴─────────────────────┘
더 높은 차원의 임베딩은 더 복잡한 관계를 표현해 더 풍부한 결과를 제공합니다. 하지만 적어도 말과 개가 리스트의 아래쪽에 있는 것은 타당해 보인다는 데 동의할 수 있을 겁니다.
정확한(완전 탐색) 벡터 검색은 강력하지만 느리고, 따라서 비용이 큽니다. 많은 애플리케이션은 어느 정도의 유연성을 허용합니다. 예를 들어, Eminem을 들은 후에 Snoop Dogg나 Tupac을 추천받아도 괜찮습니다. 하지만 다음 추천이 이것이라면 뭔가 크게 잘못된 겁니다.
그래서 근사 최근접 이웃(ANN) 기법이 존재합니다. 이들은 완벽한 정확도를 일부 포기하는 대신 더 빠르고 저렴한 검색을 제공합니다. 가장 흔한 접근은 양자화와 HNSW입니다.
두 방법을 간단히 살펴본 뒤, QBit이 이 그림에서 어디에 들어맞는지 보겠습니다.
저장된 벡터 타입이 Float64이고, 성능이 만족스럽지 않다고 가정합시다. 자연스러운 질문은 이겁니다: 데이터를 더 작은 타입으로 다운캐스트하면 어떨까?
숫자가 작아지면 데이터도 작아지고, 작은 데이터는 거리 계산을 더 빠르게 합니다. ClickHouse의 벡터화된 쿼리 실행 엔진은 연산당 더 많은 값을 프로세서 레지스터에 담아 처리량을 직접적으로 늘릴 수 있습니다. 게다가 디스크에서 읽는 바이트 수가 줄어 I/O 부하도 감소합니다. 이 아이디어가 바로 양자화입니다.
양자화를 할 때는 데이터를 어떻게 저장할지 결정해야 합니다. 선택지는 두 가지입니다.
첫 번째 옵션은 저장 공간이 두 배 들지만, 언제든지 전체 정밀도로 되돌릴 수 있어 안전합니다. 두 번째 옵션은 공간과 I/O를 절약하지만 일방통행입니다. 나중에 양자화가 과했음을 알고 결과가 부정확하다는 걸 깨달아도, 되돌릴 방법이 없습니다.
모든 후보를 스캔하지 않고 최근접 이웃을 찾도록 설계된 자료구조가 많이 있습니다. 우리는 이를 인덱스라고 부릅니다. 그중에서도 HNSW는 군주처럼 자주 거론됩니다.

HNSW는 여러 레이어의 노드(벡터)로 구성됩니다. 각 노드는 하나 이상의 레이어에 무작위로 배정되며, 높은 레이어에 나타날 확률은 지수적으로 감소합니다.
검색을 수행할 때는 최상위 레이어의 노드에서 시작해 가장 가까운 이웃을 향해 그리디하게 이동합니다. 더 가까운 노드를 찾을 수 없게 되면 다음으로 더 조밀한 레이어로 내려가 같은 과정을 반복합니다. 높은 레이어는 지역 최솟값에 갇히지 않도록 장거리 연결을 제공하고, 낮은 레이어는 정밀도를 보장합니다.
이 다층 설계 덕분에 HNSW는 노드 수에 대해 로그 복잡도를 달성합니다. 완전 탐색이나 양자화 기반 방법이 사용하는 선형 스캔보다 훨씬 빠릅니다.
주요 병목은 메모리입니다. ClickHouse는 분할을 지원하지 않는 인메모리 자료구조인 usearch 구현체의 HNSW를 사용합니다. 그 결과, 더 큰 데이터셋에는 비례적으로 더 많은 RAM이 필요합니다. 인덱스를 구축하기 전에 데이터를 양자화하면 메모리 사용량을 줄일 수 있지만, 여전히 많은 HNSW 파라미터를 사전에 선택해야 하고, 양자화 수준 자체도 마찬가지입니다. QBit이 해결하려 했던 경직성도 바로 이것입니다.
QBit은 BFloat16, Float32, Float64 값을 부동소수점이 비트로 표현된다는 특성을 활용해 저장하는 새로운 데이터 구조입니다. 각 숫자를 통째로 저장하는 대신, QBit은 값을 비트 평면으로 분해합니다. 즉, 모든 첫 번째 비트, 모든 두 번째 비트, 모든 세 번째 비트… 식으로 저장합니다.
검색 시 ClickHouse는 사용자가 지정한 정밀도까지 데이터를 재구성하는 데 필요한 서브컬럼만 읽을 수 있습니다.

이 접근은 전통적 양자화의 주요 한계를 해결합니다. 중복 데이터를 저장할 필요도 없고, 값을 무의미하게 만들 위험도 없습니다. 또한 QBit은 인메모리 인덱스를 유지하지 않고 저장된 데이터를 직접 다루므로 HNSW의 RAM 병목도 피합니다.
무엇보다도 사전 결정이 필요 없습니다. 정밀도와 성능을 쿼리 시점에 동적으로 조절해, 정확도와 속도 간 균형을 최소한의 마찰로 탐색할 수 있습니다.
QBit은 벡터 검색을 가속하지만, 계산 복잡도는 여전히 O(n)입니다. 다시 말하면, 데이터셋이 충분히 작아 HNSW 인덱스를 RAM에 여유롭게 담을 수 있다면, 그 방법이 여전히 가장 빠릅니다.
| 범주 | 브루트포스 | HNSW | QBit |
|---|---|---|---|
| 정밀도 | 완벽 | 매우 좋음 | 유연함 |
| 속도 | 느림 | 빠름 | 유연함 |
| 기타 | 양자화: 더 많은 공간 또는 되돌릴 수 없는 정밀도 손실 | 인덱스는 메모리에 맞아야 하고 구축해야 함 | 여전히 O(#레코드) |
이제 익숙한 예시를 QBit의 세계에서 다시 살펴봅시다.
1CREATE TABLE fruit_animal
2(
3 word String,
4 vec QBit(Float64, 5)
5)
6ENGINE = MergeTree
7ORDER BY word;
8
9INSERT INTO fruit_animal VALUES
10('apple', [...]),
11('banana', [...]),
12('orange', [...]),
13('dog', [...]),
14('horse', [...]);
이제 쿼리를 실행할 수 있습니다:
1SELECT
2 word,
3 L2DistanceTransposed(vec, [...], 16) AS distance
4FROM fruit_animal
5ORDER BY distance;
┌─word───┬────────────distance─┐
1. │ apple │ 0.14639757188169716 │
2. │ banana │ 1.998961369007679 │
3. │ orange │ 2.039041552613732 │
4. │ cat │ 2.752802631487914 │
5. │ horse │ 2.7555776805484813 │
6. │ dog │ 3.382295083120104 │
└────────┴─────────────────────┘
QBit과의 상호작용은 두 부분으로 나눌 수 있습니다.
두 가지를 모두 살펴보겠습니다.

QBit 컬럼에 데이터가 삽입되면, 모든 첫 번째 비트가 서로 나란히, 모든 두 번째 비트가 서로 나란히 정렬되도록 전치됩니다. 우리는 이를 그룹이라고 부릅니다.
각 그룹은 별도의 FixedString(N) 컬럼에 저장됩니다. 고정 길이 N 바이트 문자열이 구분자 없이 메모리에 연속으로 저장됩니다. 이 모든 그룹은 Tuple 하나로 묶여 QBit의 내부 구조를 이룹니다.
8×Float64 요소의 벡터로 시작했다면, 각 그룹은 8비트를 포함합니다. Float64는 64비트이므로 64개의 그룹(각 비트마다 하나)을 얻게 됩니다. 따라서 QBit(Float64, 8)의 내부 레이아웃은 64×FixedString(1) 컬럼의 Tuple처럼 보입니다.
원래 벡터 길이가 8로 나누어떨어지지 않으면, 구조는 8에 맞춰 정렬되도록 보이지 않는 요소로 패딩됩니다. 이는 FixedString이 온전한 바이트 단위로만 동작하기 때문에 호환성을 보장합니다. 예컨대 위 그림에서 벡터는 5개의 Float64 값을 포함합니다. 여기에 3개의 0을 패딩해 8×Float64로 만든 다음, 64×FixedString(1)의 Tuple로 전치합니다. 또는 76×BFloat16 요소로 시작했다면, 80×BFloat16으로 패딩한 뒤 16×FixedString(10)의 Tuple로 전치하게 됩니다.
1SELECT
2 word,
3 L2DistanceTransposed(vec, [...], 16) AS distance
4FROM fruit_animal
5ORDER BY distance;
거리를 계산하기 전에, 필요한 데이터를 디스크에서 읽은 다음 전치 해제(그룹화된 비트 표현을 다시 완전한 벡터로 변환)해야 합니다. QBit은 정밀도 레벨별로 비트 전치되어 값을 저장하므로, ClickHouse는 원하는 정밀도까지 숫자를 재구성하는 데 필요한 상위 비트 평면만 읽을 수 있습니다.
위 쿼리에서는 정밀도 레벨로 16을 사용했습니다. Float64는 64비트이므로 처음 16개의 비트 평면만 읽고, 데이터의 75%는 건너뜁니다.

읽기가 끝나면, 로딩한 비트 평면으로 각 숫자의 상위 부분만 재구성하고 읽지 않은 비트는 0으로 남겨 둡니다.

Float32나 BFloat16처럼 더 작은 타입으로 캐스팅해 이 사용하지 않는 부분을 제거할 수 없을까 하는 의문이 들 수 있습니다. 가능합니다. 하지만 모든 행에 명시적 캐스트를 적용하면 비용이 큽니다. 대신, 기준 벡터만 다운캐스트하고 QBit 데이터를 더 좁은 값이 들어있는 것처럼 다룰 수 있습니다(일부 컬럼의 존재를 “잊는” 방식). 실제로 QBit의 레이아웃은 자주 그 타입들의 절단된 버전과 대응하기 때문입니다. 다만 항상 그런 것은 아닙니다!

우선 원래 데이터가 Float32이고 선택한 정밀도가 16비트 이하인 단순한 경우부터 봅시다. BFloat16은 Float32를 절반으로 줄인 형태입니다. 같은 부호 비트와 8비트 지수를 유지하지만, 23비트 가수부의 상위 7비트만 남깁니다. 이 때문에 QBit 컬럼에서 처음 16개의 비트 평면을 읽으면 사실상 BFloat16 값의 레이아웃이 재현됩니다. 따라서 이 경우 기준 벡터(모든 QBit 데이터와 비교하는 벡터)를 안전하게 BFloat16으로 변환해, QBit 데이터를 애초에 그 방식으로 저장된 것처럼 취급할 수 있습니다(실제로 그렇게 합니다).
하지만 Float64는 이야기가 다릅니다. 11비트 지수와 52비트 가수부를 사용하므로, 단순히 비트 수가 두 배인 Float32가 아닙니다. 구조와 지수 바이어스가 완전히 다릅니다. Float64를 Float32 같은 더 작은 형식으로 다운캐스팅하려면 실제 IEEE-754 변환이 필요합니다. 각 값을 표현 가능한 Float32 중 가장 가까운 값으로 반올림해야 하고, 이 반올림 단계는 계산 비용이 크며 단순한 비트 슬라이싱이나 치환으로 대체할 수 없습니다.
정밀도가 16 이하일 때도 마찬가지입니다. Float64에서 BFloat16으로 변환하는 것은 사실상 먼저 Float32로 변환한 뒤 그것을 BFloat16으로 절단하는 것과 같습니다. 따라서 이 경우에도 비트 수준의 요령이 통하지 않습니다.
일반 양자화 컬럼과 QBit 컬럼의 주요 성능 차이는 검색 중 비트 그룹화된 데이터를 다시 벡터 형태로 전치 해제해야 한다는 점입니다. 이를 효율적으로 수행하는 것이 중요합니다. ClickHouse에는 벡터화된 쿼리 실행 엔진이 있으므로 이를 활용하는 것이 타당합니다. 벡터화에 대해서는 이 ClickHouse 블로그 글에서 더 읽을 수 있습니다.
간단히 말해, 벡터화는 SIMD(Single-Instruction-Multiple-Data) 레지스터를 사용해 CPU가 단일 명령으로 여러 값을 처리하도록 합니다. SIMD라는 용어는 이런 명령이 작은 배치(벡터)의 데이터에 대해 동작한다는 데서 비롯됐습니다. 이 벡터 안의 개별 요소는 고정 길이이며 흔히 레인이라고 부릅니다.
알고리즘을 벡터화하는 접근은 일반적으로 두 가지가 있습니다.
SIMD 전치 해제는 컴파일러가 자동 벡터화하기에는 너무 복잡하므로, 우리는 두 번째 경로를 택했고 그 과정을 소개하겠습니다. 먼저 알고리즘의 아이디어를 살펴보고, 그런 다음 벡터화 세계에 어떻게 들어맞는지 보겠습니다.




우리는 QBit의 모든 FixedString 컬럼(예: Float64의 경우 64개)을 순회합니다. 각 컬럼 내에서는 FixedString의 모든 바이트를 순회하고, 각 바이트 내에서는 모든 비트를 순회합니다.
비트가 0이면, 목적지의 해당 위치에 0 마스크를 적용합니다. 비트가 1이면, 바이트 내 위치에 따라 달라지는 마스크를 적용합니다. 예를 들어 첫 번째 비트를 처리 중이면 마스크는 10000000이고, 두 번째 비트라면 01000000이 되는 식입니다. 적용하는 연산은 논리 OR이며, 소스에서 온 비트를 목적지 바이트에 병합합니다.
이제 위에서 두 번째 반복(단계 3과 4)을 현대 CPU에 널리 쓰이는 명령 집합인 AVX-512를 사용해 살펴보겠습니다. 이 예시에서는 두 번째 FixedString(1) 그룹을 풀어내고 있으며, 여기의 각 비트는 8개의 결과 Float64 값의 두 번째 비트에 기여합니다.

SIMD를 다룰 때는 레인 단위로 생각하는 것이 쉽습니다. AVX-512는 512비트 레지스터로 동작하며, 이는 8개의 64비트 레인에 해당합니다. 데이터 레이아웃을 시각화하기 위해 우리의 고정 문자열을 레인에 매핑해 봅시다.

우리는 각 Float64의 두 번째 비트를 풀어내고 있으므로, 비트마스크의 두 번째 비트가 설정되어 있습니다.
이 마스크를 레인 전체에 적용합니다.

목적지(dst)에는 이미 이전 반복에서의 결과가 들어 있습니다. 이제 두 번째 비트도 병합하려고 합니다.

이제 흥미로운 부분입니다. 마스크가 모두 1이었다면, 새 비트를 목적지에 단순히 OR 하면 됩니다(우리는 이를 upd라고 부릅니다). 마스크가 모두 0이라면 목적지는 변하지 않습니다. 실제로는 마스크의 각 비트가 어느 레인을 갱신할지 결정합니다. 마스크가 1인 곳은 upd 값을 취하고, 0인 곳은 기존 값을 유지합니다. 다행히 AVX-512는 정확히 이 작업을 수행하는 인스트린식을 제공합니다. 마스크 비트를 기준으로 레인 내 요소를 조건부로 병합하여, upd와 dst 사이에서 선택합니다.

축하합니다. 단 한 번의 반복으로 여덟 개의 값을 풀어냈습니다!
데이터가 준비되면 이제 거리를 계산할 수 있습니다. 이를 위해 우리는 거의 모든 하드웨어에서 벡터화된 거리 계산을 수행하는 훌륭한 라이브러리 SimSimd를 사용합니다.
우리는 약 2,900만 개의 댓글이 Float32 임베딩으로 표현된 HackerNews 데이터셋에서 벤치마크를 수행했습니다. 단일 신규 댓글(그 임베딩 사용)을 검색하는 속도를 측정했고, 10개의 신규 댓글을 기준으로 재현율을 계산했습니다.
여기서 재현율은 top-k 검색 결과(우리의 경우 k = 20)에 실제 최근접 이웃이 얼마나 포함되는지의 비율입니다. 세분도는 읽는 비트 그룹의 수입니다.

우리는 좋은 재현율을 유지하면서 거의 2배의 속도 향상을 달성했습니다. 더 중요한 것은 이제 워크로드에 맞춰 속도-정확도 균형을 직접 제어할 수 있게 됐다는 점입니다.
Float64 재현율 결과는 약간 감안해서 보세요. 해당 임베딩은 단순히 Float32를 업캐스트한 버전이므로, Float64 하위 절반의 비트는 거의 혹은 전혀 정보를 담지 않습니다. 따라서 이를 제거해도 재현율에 기대만큼 큰 영향이 없었습니다. 반면, 속도 향상 수치는 두 경우 모두 완전히 신뢰할 수 있습니다.
이제 지루한 벤치마크는 접어두고 재미를 봅시다!
DBpedia용 테이블을 만들고 데이터를 다운로드하세요. 100만 개의 위키피디아 문서가 Float32 임베딩으로 표현되어 있습니다. 이제 QBit 컬럼을 추가합니다.
1set allow_experimental_qbit_type = 1;
2ALTER TABLE dbpedia ADD COLUMN qbit QBit(Float32, 1536);
3ALTER TABLE dbpedia UPDATE qbit = vector WHERE 1;
완전 탐색부터 시작해 봅시다. 모든 우주 관련 검색어: Moon, Apollo 11, Space Shuttle, Astronaut, Rocket과 가장 관련 있는 개념을 찾아보겠습니다. 기술적으로 표현하면 이렇습니다.
다섯 개의 개념 각각에 대해 의미적으로 유사한 상위 1000개 항목을 검색합니다. 그 결과 중 최소 세 개에서 나타나는 항목을 반환하되, 일치한 개념의 개수와(원본을 제외하고) 그중 최소 거리로 순위를 매깁니다.
전체 쿼리는 길어서 Pastila에서 볼 수 있습니다. 결과는 다음과 같습니다.
Row 1:
──────
title: Apollo program
text: The Apollo program, also known as Project Apollo, was the third United States human spaceflight program carried out by the National Aeronautics and Space Administration (NASA), which accomplished landing the first humans on the Moon from 1969 to 1972. First conceived during Dwight D. Eisenhower's administration as a three-man spacecraft to follow the one-man Project Mercury which put the first Americans in space, Apollo was later dedicated to President John F.
num_concepts_matched: 4
min_distance: 0.82420665
avg_distance: 1.0207901149988174
Row 2:
──────
title: Apollo 8
text: Apollo 8, the second human spaceflight mission in the United States Apollo space program, was launched on December 21, 1968, and became the first manned spacecraft to leave Earth orbit, reach the Earth's Moon, orbit it and return safely to Earth.
num_concepts_matched: 4
min_distance: 0.8285278
avg_distance: 1.0357224345207214
Row 3:
──────
title: Lunar Orbiter 1
text: The Lunar Orbiter 1 robotic (unmanned) spacecraft, part of the Lunar Orbiter Program, was the first American spacecraft to orbit the Moon. It was designed primarily to photograph smooth areas of the lunar surface for selection and verification of safe landing sites for the Surveyor and Apollo missions. It was also equipped to collect selenodetic, radiation intensity, and micrometeoroid impact data.The spacecraft was placed in an Earth parking orbit on August 10, 1966 at 19:31 (UTC).
num_concepts_matched: 4
min_distance: 0.94581836
avg_distance: 1.0584313124418259
Row 4:
──────
title: Apollo (spacecraft)
text: The Apollo spacecraft was composed of three parts designed to accomplish the American Apollo program's goal of landing astronauts on the Moon by the end of the 1960s and returning them safely to Earth. The expendable (single-use) spacecraft consisted of a combined Command/Service Module (CSM) and a Lunar Module (LM).
num_concepts_matched: 4
min_distance: 0.9643517
avg_distance: 1.0367188602685928
Row 5:
──────
title: Surveyor 1
text: Surveyor 1 was the first lunar soft-lander in the unmanned Surveyor program of the National Aeronautics and Space Administration (NASA, United States). This lunar soft-lander gathered data about the lunar surface that would be needed for the manned Apollo Moon landings that began in 1969.
num_concepts_matched: 4
min_distance: 0.9738264
avg_distance: 1.0988530814647675
Row 6:
──────
title: Spaceflight
text: Spaceflight (also written space flight) is ballistic flight into or through outer space. Spaceflight can occur with spacecraft with or without humans on board. Examples of human spaceflight include the Russian Soyuz program, the U.S. Space shuttle program, as well as the ongoing International Space Station. Examples of unmanned spaceflight include space probes that leave Earth orbit, as well as satellites in orbit around Earth, such as communications satellites.
num_concepts_matched: 4
min_distance: 0.9831049
avg_distance: 1.060678943991661
Row 7:
──────
title: Skylab
text: Skylab was a space station launched and operated by NASA and was the United States' first space station. Skylab orbited the Earth from 1973 to 1979, and included a workshop, a solar observatory, and other systems. It was launched unmanned by a modified Saturn V rocket, with a weight of 169,950 pounds (77 t). Three manned missions to the station, conducted between 1973 and 1974 using the Apollo Command/Service Module (CSM) atop the smaller Saturn IB, each delivered a three-astronaut crew.
num_concepts_matched: 4
min_distance: 0.99155205
avg_distance: 1.0769911855459213
Row 8:
──────
title: Orbital spaceflight
text: An orbital spaceflight (or orbital flight) is a spaceflight in which a spacecraft is placed on a trajectory where it could remain in space for at least one orbit. To do this around the Earth, it must be on a free trajectory which has an altitude at perigee (altitude at closest approach) above 100 kilometers (62 mi) (this is, by at least one convention, the boundary of space). To remain in orbit at this altitude requires an orbital speed of ~7.8 km/s.
num_concepts_matched: 4
min_distance: 1.0075209
avg_distance: 1.085978478193283
Row 9:
───────
title: Dragon (spacecraft)
text: Dragon is a partially reusable spacecraft developed by SpaceX, an American private space transportation company based in Hawthorne, California. Dragon is launched into space by the SpaceX Falcon 9 two-stage-to-orbit launch vehicle, and SpaceX is developing a crewed version called the Dragon V2.During its maiden flight in December 2010, Dragon became the first commercially built and operated spacecraft to be recovered successfully from orbit.
num_concepts_matched: 4
min_distance: 1.0222818
avg_distance: 1.0942841172218323
Row 10:
───────
title: Space capsule
defravitext: A space capsule is an often manned spacecraft which has a simple shape for the main section, without any wings or other features to create lift during atmospheric reentry.Capsules have been used in most of the manned space programs to date, including the world's first manned spacecraft Vostok and Mercury, as well as in later Soviet Voskhod, Soyuz, Zond/L1, L3, TKS, US Gemini, Apollo Command Module, Chinese Shenzhou and US, Russian and Indian manned spacecraft currently being developed.
num_concepts_matched: 4
min_distance: 1.0262821
avg_distance: 1.0882147550582886
완전 탐색으로 실행하면 완벽한 결과가 나옵니다(Apollo, Lunar Orbiter, Surveyor…).
하지만 리소스 사용량은 만만치 않습니다.
10 rows in set. Elapsed: 1.157 sec. Processed 10.00 million rows, 32.76 GB (8.64 million rows/s., 28.32 GB/s.)
Peak memory usage: 6.05 GiB.
이건 통제된 벤치마크가 아니라 제 머신에서 제 쿼리를 돌린 결과일 뿐입니다. 이제 같은 작업을 정밀도 5(부호 1비트, 지수 4비트, 가수 0비트)로 QBit에서 시도해 봅시다. 쿼리: Pastila.
Row 1:
──────
title: Apollo 8
text: Apollo 8, the second human spaceflight mission in the United States Apollo space program, was launched on December 21, 1968, and became the first manned spacecraft to leave Earth orbit, reach the Earth's Moon, orbit it and return safely to Earth.
num_concepts_matched: 4
min_distance: 0.9924246668815613
avg_distance: 0.9929515272378922
Row 2:
──────
title: Apollo program
text: The Apollo program, also known as Project Apollo, was the third United States human spaceflight program carried out by the National Aeronautics and Space Administration (NASA), which accomplished landing the first humans on the Moon from 1969 to 1972. First conceived during Dwight D. Eisenhower's administration as a three-man spacecraft to follow the one-man Project Mercury which put the first Americans in space, Apollo was later dedicated to President John F.
num_concepts_matched: 4
min_distance: 0.9924481511116028
avg_distance: 0.9929344654083252
Row 3:
──────
title: Apollo 5
text: Apollo 5 was the first unmanned flight of the Apollo Lunar Module (LM), which would later carry astronauts to the lunar surface. It lifted off on January 22, 1968, with a Saturn IB rocket on an Earth-orbital flight.
num_concepts_matched: 4
min_distance: 0.9925317764282227
avg_distance: 0.9930042922496796
Row 4:
──────
title: Apollo (spacecraft)
text: The Apollo spacecraft was composed of three parts designed to accomplish the American Apollo program's goal of landing astronauts on the Moon by the end of the 1960s and returning them safely to Earth. The expendable (single-use) spacecraft consisted of a combined Command/Service Module (CSM) and a Lunar Module (LM).
num_concepts_matched: 4
min_distance: 0.9926576018333435
avg_distance: 0.9928816854953766
Row 5:
──────
title: Lunar Orbiter 1
text: The Lunar Orbiter 1 robotic (unmanned) spacecraft, part of the Lunar Orbiter Program, was the first American spacecraft to orbit the Moon. It was designed primarily to photograph smooth areas of the lunar surface for selection and verification of safe landing sites for the Surveyor and Apollo missions. It was also equipped to collect selenodetic, radiation intensity, and micrometeoroid impact data.The spacecraft was placed in an Earth parking orbit on August 10, 1966 at 19:31 (UTC).
num_concepts_matched: 4
min_distance: 0.9926905632019043
avg_distance: 0.9929626882076263
Row 6:
──────
title: Spaceflight
text: Spaceflight (also written space flight) is ballistic flight into or through outer space. Spaceflight can occur with spacecraft with or without humans on board. Examples of human spaceflight include the Russian Soyuz program, the U.S. Space shuttle program, as well as the ongoing International Space Station. Examples of unmanned spaceflight include space probes that leave Earth orbit, as well as satellites in orbit around Earth, such as communications satellites.
num_concepts_matched: 4
min_distance: 0.9927355647087097
avg_distance: 0.992923766374588
Row 7:
──────
title: Surveyor 1
text: Surveyor 1 was the first lunar soft-lander in the unmanned Surveyor program of the National Aeronautics and Space Administration (NASA, United States). This lunar soft-lander gathered data about the lunar surface that would be needed for the manned Apollo Moon landings that began in 1969.
num_concepts_matched: 4
min_distance: 0.9927787184715271
avg_distance: 0.9931300282478333
Row 8:
──────
title: Orbital spaceflight
text: An orbital spaceflight (or orbital flight) is a spaceflight in which a spacecraft is placed on a trajectory where it could remain in space for at least one orbit. To do this around the Earth, it must be on a free trajectory which has an altitude at perigee (altitude at closest approach) above 100 kilometers (62 mi) (this is, by at least one convention, the boundary of space). To remain in orbit at this altitude requires an orbital speed of ~7.8 km/s.
num_concepts_matched: 4
min_distance: 0.9927811026573181
avg_distance: 0.9929587244987488
Row 9:
───────
title: DSE-Alpha
text: Deep Space Expedition Alpha (DSE-Alpha), is the name given to the mission proposed in 2005 to take the first space tourists to fly around the Moon. The mission is organized by Space Adventures Ltd., a commercial spaceflight company. The plans involve a modified Soyuz capsule docking with a booster rocket in Earth orbit which then sends the spacecraft on a free return circumlunar trajectory that circles around the Moon once.
num_concepts_matched: 4
min_distance: 0.9928749799728394
avg_distance: 0.9931814968585968
Row 10:
───────
title: Luna programme
text: The Luna programme (from the Russian word Луна "Luna" meaning "Moon"), occasionally called Lunik or Lunnik by western media, was a series of robotic spacecraft missions sent to the Moon by the Soviet Union between 1959 and 1976. Fifteen were successful, each designed as either an orbiter or lander, and accomplished many firsts in space exploration.
num_concepts_matched: 4
min_distance: 0.9929065704345703
avg_distance: 0.9930566549301147
10 rows in set. Elapsed: 0.271 sec. Processed 8.46 million rows, 4.54 GB (31.19 million rows/s., 16.75 GB/s.)
Peak memory usage: 739.82 MiB.
결과는? 좋다 못해 놀랍습니다. 가수부 전체와 지수의 절반이 제거된 부동소수점이 여전히 의미 있는 정보를 담고 있다는 것은 자명하지 않습니다. QBit의 핵심 통찰은, 벡터의 전반적 방향에 거의 기여하지 않는, 즉 중요하지 않은 비트를 무시해도 벡터 검색은 여전히 잘 동작한다는 점입니다.
우리는 벡터 검색에서 거리 계산에 사용할 부동소수점의 비트 수를 제어할 수 있는 새로운 데이터 타입 QBit을 만들었습니다. 이는 정밀도/속도의 트레이드오프를 런타임에 조절할 수 있음을 의미합니다. 사전 결정은 필요 없습니다.
실제로 이는 벡터 검색 쿼리의 I/O와 계산 시간을 모두 줄이면서도 정확도를 놀라울 정도로 높게 유지합니다. 그리고 우리가 본 것처럼, 5비트만으로도 달까지 날아갈 수 있습니다 🚀