> ## 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 数据集中 1000 万个向量的数据集

# 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` bucket 中提供了包含 1000 万个向量的子集。
该子集存储在一个 `Parquet` 文件中。

我们建议用户先参考[文档](/zh/reference/engines/table-engines/mergetree-family/annindexes)进行容量评估，以估算该数据集所需的存储和内存。

<div id="steps">
  ## 步骤
</div>

<Steps>
  <Step title="创建表" id="create-table">
    创建 `laion_5b_10m` 表，用于存储嵌入向量及其关联属性：

    ```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` 只是一个递增的整数。其他属性可用于谓词，以便了解[文档](/zh/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);
    ```

    将 1000 万行数据加载到该表中需要几分钟。
  </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 (向量索引) 的查询延迟进行比较。
    在 1000 万行数据的情况下，上述未使用向量索引的查询可能需要数秒至数分钟才能完成。
  </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;
    ```

    有关索引创建和搜索的参数及性能注意事项，请参阅[文档](/zh/reference/engines/table-engines/mergetree-family/annindexes)。
    上述语句中，HNSW 超参数 `M` 和 `ef_construction` 分别设置为 64 和 512。
    您需要通过评估索引构建时间和相应的搜索结果质量，谨慎选择这些参数的最优值。

    对于包含 1000 万行的子集，构建和保存索引可能需要较长时间，具体取决于可用的 CPU 核心数量和存储带宽。
  </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()`](/zh/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>
