# 【探索】使用 qdrant 进行向量检索 - Limour's Blog
Qdrant 是一个开源的向量数据库，专为高性能相似性搜索和机器学习应用而设计，比 Chroma 更轻量(约80MiB)更快。它支持基于余弦相似度、欧氏距离等多种相似性度量的向量检索，并提供了灵活的过滤和分组功能。Qdrant 使用 Rust 语言编写，具有高效的索引和存储机制，能够快速处理大规模向量数据，适用于推荐系统、语义搜索、图像相似性匹配等场景。它提供了简单易用的 API，支持 gRPC
Author: Limour

# 【探索】使用 qdrant 进行向量检索

Last updated on November 10, 2024 pm

Qdrant 是一个开源的向量数据库，专为高性能相似性搜索和机器学习应用而设计，比 Chroma 更轻量(约80MiB)更快。它支持基于余弦相似度、欧氏距离等多种相似性度量的向量检索，并提供了灵活的过滤和分组功能。Qdrant 使用 Rust 语言编写，具有高效的索引和存储机制，能够快速处理大规模向量数据，适用于推荐系统、语义搜索、图像相似性匹配等场景。它提供了简单易用的 API，支持 gRPC 和 REST 接口，并且可以轻松集成到各种编程语言和机器学习框架中，是构建向量相似性搜索应用的理想选择。

## 部署

- 反向代理服务

    1
    2
    3
    4

    mkdir -p ~/app/qdrant && cd ~/app/qdrant && nano docker-compose.yml
    wget https://raw.githubusercontent.com/qdrant/qdrant/refs/heads/master/config/production.yaml
    sudo docker compose up -d
    sudo docker compose logs

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16

    services:
      qdrant:
        image: qdrant/qdrant:latest
        restart: always
        expose:
          - 6333
          - 6334
          - 6335
        volumes:
          - ./qdrant_data:/qdrant/storage
          - ./production.yaml:/qdrant/config/production.yaml

    networks:
      default:
        external: true
        name: ngpm

- 访问 `https://qdrant.limour.top/dashboard` 查看仪表盘

## 嵌入服务

- 下载 llama.cpp
  - 下载 `cudart-llama-bin-win-cu11.7.1-x64`
  - 下载对应后缀的 `llama-b4061-bin-win-cuda-cu11.7.1-x64`
  - 将两者解压到同一个目录
- 从 MTEB 上找一个良好的嵌入模型
- 下载 GGUF 格式的嵌入模型，比如 Dmeta-embedding-zh-small-GGUF
- 根据文档配置参数启动嵌入服务

    1

    ./llama-server.exe -m ./embd/Dmeta-embedding-zh-small-Q4_K_M.gguf -c 1024 --embedding -fa -ngl 99

- 测试嵌入模型

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14

    $headers = @{
        "Content-Type" = "application/json"
        "Authorization" = "Bearer no-key"
    }

    $body = @{
        "input" = @("hello", "world")
        "model" = "GPT-4o"
        "encoding_format" = "float"
    } | ConvertTo-Json

    $response = Invoke-WebRequest -Uri "http://localhost:8080/v1/embeddings" -Method Post -Headers $headers -Body $body

    echo $response.Content

## 客户端

    1

    conda create -n rag conda-forge::qdrant-client

- 获取测试所用内容 test_rag_qdrant

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46

    import os
    from qdrant_client import QdrantClient
    from qdrant_client.models import VectorParams, Distance
    from qdrant_client.models import PointStruct
    from m98_rag import embd, readChunks

    QDRANT_URL = os.getenv('QDRANT_URL', 'http://localhost:6333')
    QDRANT_KEY = os.getenv('QDRANT_KEY', '')

    client = QdrantClient(url=QDRANT_URL,
                          api_key=QDRANT_KEY,
                          timeout=100)

    if not client.collection_exists("my_collection"):
        client.create_collection(
            collection_name="my_collection",
            vectors_config=VectorParams(size=768, distance=Distance.COSINE)
        )

    if __name__ == '__main__':
        print(QDRANT_URL)
        print(QDRANT_KEY)
        chunks = readChunks('./test.md')
        for i in range(0, len(chunks), 8):
            batch = chunks[i: i+8]
            print(batch)
            vectors = embd(batch)
            client.upsert(
                collection_name="my_collection",
                points=[
                    PointStruct(
                        id=i+idx,
                        vector=vector[1],
                        payload={"text": vector[0]}
                    )
                    for idx, vector in enumerate(vectors)
                ]
            )
        # 进行搜索
        query_vector = embd(['机器人限拥令是什么？'])
        hits = client.search(
            collection_name="my_collection",
            query_vector=query_vector[0][1],
            limit=5  # Return 5 closest points
        )
        print(hits[0].payload['text'])

- 所得到的结果还不错~

    1
    2
    3
    4
    5
    6

    24小时客服在线电话：1919-114514810
     *注意：根据《国家质量标准认证iso7002》，《机器人管理条例》，机器人类产品不宜连续使用超过十五年。请定期到指定售后地点进行重置。
    ## 十三
    机器人限拥令的实施开端于2090年5月的一起案件。
    被害人约翰逊的尸体在其失踪的次日被发现于他自家的住宅。死状相当惨烈：在R级新闻团体才能合法展示的照片中，整个人被从身体中间沿着脊椎切割成两半，一半被他所购买的机器人ct13694582(型号为玛格丽特c6)紧紧抱在床上，另一半被他购买的另一台机器人ct12487967(型号为子矜7z)小心的存放在冷库里。案件现场几乎满地都是受害人的血，散发着浓烈的腥味，而身为罪魁祸首的两台机器人，一台已经关机，另一台则刻板地重复着几个动作。
    根据记录，两台机器人和受害人共处的时间分别长达18年和17年。在这么长的时间里，受害人以近乎均等的时间使用二者，并不下数百次的分别向它们倾诉 我最爱的是你  我只爱你一个人  你比她漂亮多了 等明显带有示爱情绪的情话。

#docker #rag
【探索】使用 qdrant 进行向量检索
https://hexo.limour.top/using-qdrant-for-vector-retrieval
Author
Limour
Posted on
November 10, 2024
Updated on
November 10, 2024
Licensed under
【记录】使用 circacompare 分析生物节律 Next

#### Search

Keyword