【探索】使用 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
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年。在这么长的时间里,受害人以近乎均等的时间使用二者,并不下数百次的分别向它们倾诉 我最爱的是你 我只爱你一个人 你比她漂亮多了 等明显带有示爱情绪的情话。

【探索】使用 qdrant 进行向量检索
https://hexo.limour.top/using-qdrant-for-vector-retrieval
Author
Limour
Posted on
November 10, 2024
Updated on
November 10, 2024
Licensed under