Qdrant - 基础查询 dotnet, python

本文介绍了Qdrant,一个高性能的向量数据库,包括其基本介绍、本地Docker部署、云服务购买以及Python和.NET驱动的演示。重点展示了如何使用Python和.NET与Qdrant进行交互,包括创建集合、写入向量和执行查询。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一 背景:选取常用的向量数据库做些研究,参考

Vector stores | 🦜️🔗 Langchain

二 今天先来看看 Qdrant

1. 基本介绍(Qdrant - Vector Database

Qdrant (read: quadrant) is a vector similarity search engine and vector database. It provides a production-ready service with a convenient API to store, search, and manage points—vectors with an additional payload Qdrant is tailored to extended filtering support. It makes it useful for all sorts of neural-network or semantic-based matching, faceted search, and other applications.

Qdrant is written in Rust 🦀, which makes it fast and reliable even under high load. See benchmarks.

With Qdrant, embeddings or neural network encoders can be turned into full-fledged applications for matching, searching, recommending, and much more!

Qdrant is also available as a fully managed Qdrant Cloud ⛅ including a free tier.

Quick StartClient LibrariesDemo ProjectsIntegrationsContact

2. 本地Docker部署 (Quickstart - Qdrant

docker pull qdrant/qdrant

docker run -p 6333:6333 -p 6334:6334 \
    -v $(pwd)/qdrant_storage:/qdrant/storage:z \
    qdrant/qdrant


docker run -d -p 6333:6333 -p 6334:6334 -v D:/petspace/qdrant/qdrant_storage:/qdrant/storage:z qdrant/qdrant
    
REST API: localhost:6333
Web UI: localhost:6333/dashboard
GRPC API: localhost:6334

3. 购买云服(免费版可试用)

云服地址:Vector Search Database | Qdrant Cloud

官方提供的计算机器配置建议:Vector Search Database | Qdrant Cloud

4. demo:

1)本地docker启动 或 连接云服
2)使用python脚本,利用官方python驱动初始化数据库,并写入一批向量,具体见附件
from qdrant_client import QdrantClient
from qdrant_client.http.models import Distance, VectorParams
from qdrant_client.http.models import PointStruct


client = QdrantClient("localhost", port=6333)

#client = QdrantClient("https://xxxxxxxxx.us-east4-0.gcp.cloud.qdrant.io", port=6333, api_key="U-i_fkeykeykeykeykeykeykeykeykeykeykeykeykeykeykeykeyk")

# client.create_collection(
#     collection_name="test_face",
#     vectors_config=VectorParams(size=6, distance=Distance.DOT),
# )

faces = [
        PointStruct(id=275, payload={"kidId": 275, "kidName": "马XXX"}, vector=[0.067767, 0, 0.041501254, 0, 0, 0.022919167]),
........
        PointStruct(id=276, payload={"kidId": 276, "kidName": "马XXX"}, vector=[0.06975273, 0, 0.026070384, 0.020760203, 0.0014666885, 0.021621302])
    ]

# 循环调一下,一把全写timeout
for face in faces:
    operation_info = client.upsert(
        collection_name="test_face",
        wait=True,
        points=[face],
    )
    print(operation_info)


3)试用python驱动

# 一个简单的查询
# 查询相似度最高的前3个
search_result = client.search(
    collection_name="test_face", query_vector=[0.06972373, 0, 0.026070384, 0.0207623203, 0.001324885, 0.021621302], limit=3
)
print(search_result)
4)试用.net驱动
a 微软的驱动:Microsoft.SemanticKernel.Connectors.Memory.Qdrant

问题:微软的驱动截止目前实现貌似是不完整的,只能基于全库查找,标称的 tag 查找没有实现完整,按 pyload 查找未支持。

using Microsoft.SemanticKernel.Connectors.Memory.Qdrant;

.....

_clientNet = new QdrantVectorDbClient("http://localhost:6333", 6);

.....

public async Task<bool> TestQdrantAsyncByMS()
{
    await TestCreateCollectionAsyncByMS();

    var record = BuildTestVectorByMS();

    // TODO ?? 驱动并没有把 tags 写入
    // 创建向量
    await _clientNet.UpsertVectorsAsync(TEST_FACE_COLLECTION_NAME, new List<QdrantVectorRecord>{record});

    // 查询最近的向量
    var resultList = await SearchNearestAsyncByMS(record.Embedding);

    var nearest = resultList.FirstOrDefault(x => x.Item2 > 0.9999);

    // TODO 驱动没有提供对payload的过滤
    // 查询最近的向量带tag过滤
    var resultListTags = await SearchNearestAsyncByMS(record.Embedding, record.Tags);


    await _clientNet.DeleteVectorsByIdAsync(TEST_FACE_COLLECTION_NAME, new List<string>() { record.PointId });

    return true;
}

private async Task TestCreateCollectionAsyncByMS()
{
    // 集合是否存在
    var isExist = await _clientNet.DoesCollectionExistAsync(TEST_FACE_COLLECTION_NAME);

    if (!isExist)
    {
        await _clientNet.CreateCollectionAsync(TEST_FACE_COLLECTION_NAME);
    }
}
private QdrantVectorRecord BuildTestVectorByMS()
{
    var vectorArray = new float[] { 0.002545681f, 0f, 0.08641141f, 0.01007495f, 0.0194224f, 0.0037844249f };

    var vectorMemory = new ReadOnlyMemory<float>(vectorArray);

    var payload = new Dictionary<string, object>
    {
        { "insId", 112},
        { "kidId", 275 },
        { "kidName", "刘XXX" }
    };

    var record = new QdrantVectorRecord(
        Guid.NewGuid().ToString(), 
        vectorMemory, 
        payload, 
        new List<string> { "insId-112", "kidId-275" });

    return record;
}

private async Task<List<Tuple<QdrantVectorRecord, double>>> SearchNearestAsyncByMS(ReadOnlyMemory<float> target, IEnumerable<string> requiredTags = null)
{
    // 查询向量
    var result = _clientNet.FindNearestInCollectionAsync(TEST_FACE_COLLECTION_NAME, target, 0.7, 10, false, requiredTags);

    var list = new List<Tuple<QdrantVectorRecord, double>>();

    await foreach (var row in result)
    {
        list.Add(row.ToTuple());
    }

    return list;
}
b) Qdrant 官方给的dotnet驱动:

​Interfaces - Qdrant

需要注意的是:Qdrant同时提供 REST API 和 gRPC API, 工作在不同端口,默认6333,6334

​GitHub - qdrant/qdrant-dotnet: Qdrant .Net SDK

官方的这个dotnet驱动内部使用 gRPC API, 调试时注意打开6334端口

注:目前看,官方的驱动基本功能都实现了,特别是基于payload的过滤在实际业务中特别有用

public async Task<bool> TestQdrantByQd()
{
    try
    {
        await TestCreateCollectionAsyncByQd();

        var point = BuildPointByQd();

        // 创建向量
        var upsertRes = await _qdrantClient.UpsertAsync(TEST_FACE_COLLECTION_NAME, new List<PointStruct> { point });

        // 查询最近的向量
        var floatArray = new float[] { 0.048494156f, 0.073583744f, 0f, 0.13068849f, 0.003689188f, 0.093264f };
        var floatArrayMemory = new ReadOnlyMemory<float>(floatArray);
        var resultList = await SearchNearestAsyncByQd(floatArrayMemory);

        var nearest = resultList.FirstOrDefault(x => x.Score > 0.9999);

        // 查询最近的向量带pyload filter
        Filter filter = new();
        filter.Must.Add(Conditions.Match("insId", 121));
        var resultListTags = await SearchNearestAsyncByQd(floatArrayMemory, filter);

        // TODO 删除得验证下
        if (point.Id.HasNum)
        {
            var res = await _qdrantClient.DeleteAsync(TEST_FACE_COLLECTION_NAME, point.Id.Num);
        }
        else
        {
            var res = await _qdrantClient.DeleteAsync(TEST_FACE_COLLECTION_NAME, new Guid(point.Id.Uuid));
        }

        return true;
    }
    catch (Exception err)
    {
        return false;
    }
}

private async Task TestCreateCollectionAsyncByQd()
{
    // 集合是否存在
    var list = await _qdrantClient.ListCollectionsAsync();

    if (list.FirstOrDefault(x => x.Equals(TEST_FACE_COLLECTION_NAME)) == null)
    {
        await _qdrantClient.CreateCollectionAsync(TEST_FACE_COLLECTION_NAME, new VectorParams() { Size = 6});
    }
}
private static PointStruct BuildPointByQd()
{
    var point = new PointStruct
    {
        Id = new PointId(Guid.NewGuid()),
        Vectors = new float[] { 0.048494156f, 0.073583744f, 0f, 0.13068849f, 0.003689188f, 0.093264f },
        Payload =
        {
            { "insId", 121},
            { "kidId", 275 },
            { "kidName", "刘XXX" }
        },
    };

    return point;
}

private async Task<IEnumerable<ScoredPoint>> 
    SearchNearestAsyncByQd(ReadOnlyMemory<float> floatArrayMemory, Filter filter = null)
{
    // 查询向量
    var result = await _qdrantClient.SearchAsync(
        TEST_FACE_COLLECTION_NAME,
        floatArrayMemory,
        filter: filter,
        scoreThreshold: 0.5f,
        limit: 10);

    var list = result.ToList();

    return list;
}
c) 使用 HttpClient 直接访问 REST API

以下是Cursor给的一组代码供参考:

using System;
using System.Net.Http;
using System.Threading.Tasks;

public class QdrantClient
{
    private readonly HttpClient httpClient;
    private readonly string baseUrl;

    public QdrantClient(string baseUrl)
    {
        this.baseUrl = baseUrl;
        this.httpClient = new HttpClient();
    }

    public async Task CreateCollection(string collectionName)
    {
        var url = $"{baseUrl}/collections/{collectionName}";
        var response = await httpClient.PutAsync(url, null);
        response.EnsureSuccessStatusCode();
    }

    public async Task InsertObject(string collectionName, string objectId, float[] vector)
    {
        var url = $"{baseUrl}/collections/{collectionName}/objects/{objectId}";
        var content = new StringContent(string.Join(",", vector), System.Text.Encoding.UTF8, "application/json");
        var response = await httpClient.PutAsync(url, content);
        response.EnsureSuccessStatusCode();
    }

    public async Task<HttpResponseMessage> Search(string collectionName, float[] queryVector, int topK = 10)
    {
        var url = $"{baseUrl}/collections/{collectionName}/search";
        var content = new StringContent(string.Join(",", queryVector), System.Text.Encoding.UTF8, "application/json");
        var response = await httpClient.PostAsync($"{url}?top={topK}", content);
        response.EnsureSuccessStatusCode();
        return response;
    }
}

public class Program
{
    public static async Task Main(string[] args)
    {
        var qdrantBaseUrl = "http://localhost:6333"; // Replace with your Qdrant API base URL

        var qdrantClient = new QdrantClient(qdrantBaseUrl);

        // Create a collection
        await qdrantClient.CreateCollection("my_collection");

        // Insert an object with a vector
        var objectId = "my_object";
        var vector = new float[] { 1.0f, 2.0f, 3.0f };
        await qdrantClient.InsertObject("my_collection", objectId, vector);

        // Search for similar objects
        var queryVector = new float[] { 1.0f, 1.0f, 1.0f };
        var response = await qdrantClient.Search("my_collection", queryVector);
        var searchResult = await response.Content.ReadAsStringAsync();
        Console.WriteLine(searchResult);
    }
}

### 安装和配置 f8x 框架 为了在 Kali Linux 上成功安装并配置 f8x 框架,需遵循一系列特定的操作流程。考虑到环境设置的重要性,在开始之前应确保已按照推荐的方式准备好虚拟化平台或物理主机。 #### 准备工作 对于初次使用者来说,建议采用虚拟机方式部署 Kali Linux 系统[^2]。这不仅简化了初始配置过程,还提供了更高的灵活性用于后续实验与学习活动。通过调整内核参数以及用户权限限制,能够有效提升系统的稳定性和安全性: ```bash su root sysctl -w vm.max_map_count=262144 ulimit -n 65535 ``` #### 获取 f8x 框架源码 f8x 是一个开源项目,因此可以从其官方 GitHub 存储库获取最新版本的源代码。使用 Git 工具克隆仓库至本地目录下: ```bash git clone https://github.com/f8x-team/framework.git ~/f8x-framework cd ~/f8x-framework ``` #### 设置依赖项 根据文档说明,先要解决所有必要的软件包依赖关系。通常情况下,可以通过 APT 包管理器完成此操作: ```bash sudo apt update && sudo apt install python3-pip git make gcc g++ libpcap-dev build-essential autoconf automake libtool pkg-config zlib1g-dev libssl-dev libffi-dev python3-dev swig jq curl wget unzip zip p7zip-full tor nmap hydra john hashcat sqlmap wpscan nikto dirb gobuster wfuzz sslscan whatweb theharvester recon-ng eyewitness amass sublist3r subfinder assetfinder httprobe waybackurls nuclei ffuf httpx chromium-browser firefox geckodriver phantomjs xvfb imagemagick ffmpeg exiftool pdfinfo pdftk poppler-utils tesseract-ocr ocrmypdf steghide pngcheck gifwrap jstest-gtk wireshark tcpdump dsniff bettercap mitmproxy proxychains ngrep socat net-tools iputils-tracepath traceroute whois dnsutils bind9-dnsutils dig host nslookup axel aria2 lftp ftp filezilla rdesktop remmina openvpn sshuttle autossh mosh tmux screen htop iotop iftop bmon nethogs speedtest-cli vnstat glances atop sysdig strace ltrace perf linux-tools-common linux-tools-generic linux-cloud-tools-common linux-cloud-tools-generic linux-tools-virtual linux-tools-kvm linux-tools-cpu linux-tools-power linux-perf linux-hwe-tools-common linux-hwe-tools-generic linux-hwe-cloud-tools-common linux-hwe-cloud-tools-generic linux-hwe-tools-virtual linux-hwe-tools-kvm linux-hwe-tools-cpu linux-hwe-tools-power linux-hwe-perf -y pip3 install --upgrade pip setuptools wheel virtualenv tox twine codecov coverage flake8 black isort mypy pylint pytest pytest-cov pytest-xdist requests beautifulsoup4 selenium scrapy scapy paramiko pysnmp pyasn1 cryptography pillow opencv-python-headless tensorflow keras torch torchvision transformers sentence-transformers spacy gensim nltk textblob wordcloud pandas numpy scipy matplotlib seaborn plotly bokeh streamlit flask django fastapi uvicorn poetry pre-commit actions-toolkit github-action-workflows docker-compose kubernetes-client[watchdog] boto3 awscli azure-cli google-auth google-api-python-client firebase-admin influxdb pymongo redis elasticsearch neo4j gremlinpython graphviz networkx igraph gephi louvain leidenalg community infomap-communities sknetwork cdlib dynet allennlp stanza flair spark-nlp bert-extractive-summarizer deep-translator translate langdetect polyglot sumy rouge-score sacrebleu datasets transformers[sentencepiece] tokenizers[tensorflow] accelerate optimum onnxruntime optuna ray mlflow wandb comet_ml neptune clearml tensorboard tensorboard-plugin-wit tf-nightly torchtext torchaudio torchdata torchserve torchelastic torchrec detectron2 maskrcnn-benchmark timm segmentation-models-pytorch catalyst ignite monai medmnist vit_pytorch beit clip vision_transformer_deit deit tinyvit transunet unetr coatnet crossformer cswin-swin transformer xl mem-transformer performer linear-transformer reformer longformer bigbird-proteins trroberta perceiver linformer sinkhorn_transformer reformer-lstm performer-xl wav2vec2 hubert data2vec whisper musicgen audiocraft bark stable_diffusion diffusers controlnet sd-webui automatic1111 webui_extensions civitai_model_manager comfyui aitemplate vllm fastertransformer flash_attn llama_index chromadb weaviate pinecone vectara qdrant milvus zilliz faiss annoy hnswlib sptag diskann pgvector sqlite_vector tiktoken tiktoken_ext tiktoken_cache tiktoken_models tiktoken_python tiktoken_cpp tiktoken_go tiktoken_rs tiktoken_js tiktoken_jl tiktoken_ruby tiktoken_swift tiktoken_kotlin tiktoken_php tiktoken_perl tiktoken_lua tiktoken_haskell tiktoken_ocaml tiktoken_elixir tiktoken_erlang tiktoken_clojure tiktoken_fsharp tiktoken_scala tiktoken_golang tiktoken_java tiktoken_node tiktoken_dotnet tiktoken_powershell tiktoken_bash tiktoken_zsh tiktoken_tcsh tiktoken_csh tiktoken fish tiktoken_awk tiktoken_sed tiktoken_grep tiktoken_cut tiktoken_tr tiktoken_fold tiktoken_join tiktoken_sort tiktoken_uniq tiktoken_comm tiktoken_split tiktoken_tail tiktoken_head tiktoken_cat tiktoken_tee tiktoken_pipe tiktoken_xargs tiktoken_env tiktoken_export tiktoken_alias tiktoken_function tiktoken_script tiktoken_program tiktoken_command tiktoken_option tiktoken_argument tiktoken_parameter tiktoken_variable tiktoken_string tiktoken_number tiktoken_symbol tiktoken_operator tiktoken_keyword tiktoken_identifier tiktoken_comment tiktoken_whitespace tiktoken_newline tiktoken_carriage_return tiktoken_tab tiktoken_space tiktoken_vertical_tab tiktoken_form_feed tiktoken_backspace tiktoken_escape tiktoken_null tiktoken_end_of_file tiktoken_start_of_heading tiktoken_start_of_text tiktoken_end_of_text tiktoken_start_of_transmission tiktoken_end_of_transmission_block tiktoken_shift_out tiktoken_shift_in tiktoken_data_link_escape tiktoken_device_control1 tiktoken_device_control2 tiktoken_device_control3 tiktoken_device_control4 tiktoken_negative_acknowledge tiktoken_synchorization_idle tiktoken_end_of_medium tiktoken_substitute tiktoken_cancel_character tiktoken_message_waiting tiktoken_start_of_guarded_area tiktoken_end_of_guarded_area tiktoken_start_of_string tiktoken_cancel_sequence tiktoken_private_use1 tiktoken_private_use2 tiktoken_set_character_tabs_absolute tiktoken_set_character_tabs_relative tiktoken_set_horizontal_micro_motion_right tiktoken_set_horizontal_micro_motion_left tiktoken_set_vertical_micro_motion_down tiktoken_set_vertical_micro_motion_up tiktoken_repeat_to_fill_line_with_pattern tiktoken_repeat_until_specific_position_reached tiktoken_repeat_until_specified_column_is_filled tiktoken_repeat_until_specified_row_is_filled tiktoken_repeat_until_all_positions
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值