> ## Documentation Index
> Fetch the complete documentation index at: https://private-7c7dfe99-vortex-format.mintlify.site/llms.txt
> Use this file to discover all available pages before exploring further.

> LAION 5B 데이터셋의 벡터 1천만 개를 포함한 데이터셋

# LAION 5B 데이터셋

export const Image = ({img, alt, size = "lg", background}) => {
  const normalizedSize = ["sm", "md", "lg"].includes(size) ? size : "lg";
  const backgroundColor = background === "white" ? "white" : background === "black" ? "rgb(31 31 28)" : undefined;
  return <div className={`ch-image-${normalizedSize}`}>
      <Frame>
        <img src={img} alt={alt} style={{
    backgroundColor
  }} />
      </Frame>
    </div>;
};

<div id="introduction">
  ## 소개
</div>

[LAION 5b 데이터셋](https://laion.ai/blog/laion-5b/)에는 58억 5천만 개의 이미지-텍스트 임베딩과
관련 이미지 메타데이터가 포함되어 있습니다. 임베딩은 `Open AI CLIP` 모델 [ViT-L/14](https://huggingface.co/sentence-transformers/clip-ViT-L-14)를 사용해 생성되었습니다. 각
임베딩 벡터의 차원은 `768`입니다.

이 데이터셋은 대규모 실제 벡터 검색 애플리케이션의 설계, 규모 산정, 성능 측면을 모델링하는 데 사용할 수 있습니다.
이 데이터셋은 텍스트-이미지 검색과 이미지-이미지 검색 모두에 사용할 수 있습니다.

<div id="dataset-details">
  ## 데이터셋 세부 정보
</div>

전체 데이터셋은 [opendatalab/laion5b-downloader](https://github.com/opendatalab/laion5b-downloader)를 사용하여 다운로드할 수 있습니다.

ClickHouse는 공개 `S3` 버킷에 1천만 개 벡터의 부분 집합을 제공했습니다.
부분 집합은 하나의 `Parquet` 파일에 저장됩니다.

이 데이터셋에 필요한 스토리지와 메모리 요구 사항을 추정하려면 먼저 [문서](/ko/reference/engines/table-engines/mergetree-family/annindexes)를 참고하여 규모 산정을 수행하는 것이 좋습니다.

<div id="steps">
  ## 단계
</div>

<Steps>
  <Step title="테이블 생성" id="create-table">
    `laion_5b_10m` 테이블을 생성하여 embeddings 및 관련 속성을 저장합니다:

    ```sql theme={null}
    CREATE TABLE laion_5b_10m
    (
        id UInt32,
        image_path String,
        caption String,
        NSFW Nullable(String) default 'unknown',
        similarity Float32,
        LICENSE Nullable(String),
        url String,
        key String,
        status LowCardinality(String),
        width Int32,
        height Int32,
        original_width Int32,
        original_height Int32,
        exif Nullable(String),
        md5 String,
        vector Array(Float32) CODEC(NONE)
    ) ENGINE = MergeTree ORDER BY (id)
    ```

    `id`는 단순히 증가하는 정수입니다. 추가 속성은 [문서](/ko/reference/engines/table-engines/mergetree-family/annindexes)에서 설명한 포스트필터링/프리필터링과 결합된 벡터 유사도 검색을 이해하기 위한 프레디케이트에 사용할 수 있습니다.
  </Step>

  <Step title="데이터 로드" id="load-table">
    데이터셋을 로드하려면 다음 SQL 문을 실행하세요:

    ```sql theme={null}
    INSERT INTO laion_5b_10m SELECT * FROM s3('https://clickhouse-datasets.s3.amazonaws.com/laion-5b/laion5b_100m_part_1_of_10.parquet', NOSIGN);
    ```

    1,000만 행을 테이블에 로드하는 데 몇 분 정도 걸립니다.
  </Step>

  <Step title="브루트포스 방식으로 벡터 유사성 검색 실행" id="run-a-brute-force-vector-similarity-search">
    KNN(k - 최근접 이웃) 검색 또는 브루트포스 검색에서는 데이터셋의 각 벡터와
    검색 임베딩 벡터 간의 거리를 계산한 후, 이를 정렬하여 최근접 이웃을 찾습니다. 데이터셋의 벡터 중 하나를
    검색 벡터로 사용할 수 있습니다. 예시는 다음과 같습니다:

    ```sql title="Query" theme={null}
    SELECT id, url 
    FROM laion_5b_10m
    ORDER BY cosineDistance( vector, (SELECT vector FROM laion_5b_10m WHERE id = 9999) ) ASC
    LIMIT 20

    The vector in the row with id = 9999 is the embedding for an image of a Deli restaurant.
    ```

    ANN(벡터 인덱스 사용) 쿼리의 지연 시간과 비교할 수 있도록 쿼리 지연 시간을 기록해 두십시오.
    1,000만 행의 경우 벡터 인덱스 없이 위 쿼리를 완료하는 데 수 초에서 수 분이 걸릴 수 있습니다.
  </Step>

  <Step title="벡터 유사성 인덱스 구축" id="build-vector-similarity-index">
    다음 SQL을 실행하여 `laion_5b_10m` 테이블의 `vector` 컬럼에 벡터 유사성 인덱스를 정의하고 생성합니다:

    ```sql theme={null}
    ALTER TABLE laion_5b_10m ADD INDEX vector_index vector TYPE vector_similarity('hnsw', 'cosineDistance', 768, 'bf16', 64, 512);

    ALTER TABLE laion_5b_10m MATERIALIZE INDEX vector_index SETTINGS mutations_sync = 2;
    ```

    인덱스 생성 및 검색의 매개변수와 성능 고려 사항은 [문서](/ko/reference/engines/table-engines/mergetree-family/annindexes)에 설명되어 있습니다.
    위 문에서는 HNSW 하이퍼매개변수 `M`과 `ef_construction`에 각각 64와 512를 사용합니다.
    인덱스 빌드 시간과 선택한 값에 따른 검색 결과 품질을 평가하여 이러한 매개변수의 최적값을 신중하게 선택해야 합니다.

    사용 가능한 CPU 코어 수와 스토리지 대역폭에 따라 1,000만 행 부분 집합에 대한 인덱스를 빌드하고 저장하는 데 상당한 시간이 걸릴 수 있습니다.
  </Step>

  <Step title="ANN 검색 수행" id="perform-ann-search">
    벡터 유사성 인덱스가 생성되면 벡터 검색 쿼리에서 자동으로 해당 인덱스를 사용합니다:

    ```sql title="Query" theme={null}
    SELECT id, url 
    FROM laion_5b_10m
    ORDER BY cosineDistance( vector, (SELECT vector FROM laion_5b_10m WHERE id = 9999) ) ASC
    LIMIT 20

    ```

    벡터 인덱스를 메모리에 처음 로드할 때 몇 초에서 몇 분 정도 걸릴 수 있습니다.
  </Step>

  <Step title="검색 쿼리용 임베딩 생성" id="generating-embeddings-for-search-query">
    `LAION 5b` 데이터셋의 임베딩 벡터는 `OpenAI CLIP` 모델 `ViT-L/14`를 사용해 생성되었습니다.

    아래 Python 스크립트 예시는 `CLIP` API를 사용해 프로그래밍 방식으로 임베딩 벡터를 생성하는 방법을 보여줍니다. 그런 다음 검색 임베딩 벡터를 `SELECT` 쿼리에서 [`cosineDistance()`](/ko/reference/functions/regular-functions/distance-functions#cosineDistance) 함수의 인수로 전달합니다.

    `clip` 패키지 설치 방법은 [OpenAI GitHub 리포지토리](https://github.com/openai/clip)를 참고하십시오.

    ```python theme={null}
    import torch
    import clip
    import numpy as np
    import sys
    import clickhouse_connect

    device = "cuda" if torch.cuda.is_available() else "cpu"
    model, preprocess = clip.load("ViT-L/14", device=device)

    # Search for images that contain both a dog and a cat
    text = clip.tokenize(["a dog and a cat"]).to(device)

    with torch.no_grad():
        text_features = model.encode_text(text)
        np_arr = text_features.detach().cpu().numpy()

        # Pass ClickHouse credentials here
        chclient = clickhouse_connect.get_client()

        params = {'v1': list(np_arr[0])}
        result = chclient.query("SELECT id, url FROM laion_5b_10m ORDER BY cosineDistance(vector, %(v1)s) LIMIT 100",
                                parameters=params)

        # Write the results to a simple HTML page that can be opened in the browser. Some URLs may have become obsolete.
        print("<html>")
        for r in result.result_rows:
            print("<img src = ", r[1], 'width="200" height="200">')
        print("</html>")
    ```

    위 검색 결과는 다음과 같습니다.

    <Image img="https://mintcdn.com/private-7c7dfe99-vortex-format/agnD0K8lRu5saRkm/images/getting-started/example-datasets/laion5b_visualization_1.webp?fit=max&auto=format&n=agnD0K8lRu5saRkm&q=85&s=50d0326bb6866dde38494d80419d00c2" alt="벡터 유사도 검색 결과" size="md" width="3400" height="1794" data-path="images/getting-started/example-datasets/laion5b_visualization_1.webp" />
  </Step>
</Steps>
