Skip to content

Commit 9cec8c1

Browse files
test: add unit tests for vector stores of Milvus, Qdrant and Weaviate (langgenius#3688)
1 parent 8ca5aa1 commit 9cec8c1

File tree

15 files changed

+211
-6
lines changed

15 files changed

+211
-6
lines changed

.github/workflows/api-tests.yml

+26-2
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,27 @@ jobs:
3737
- name: Checkout code
3838
uses: actions/checkout@v4
3939

40+
- name: Set up Weaviate
41+
uses: hoverkraft-tech/[email protected]
42+
with:
43+
compose-file: docker/docker-compose.middleware.yaml
44+
services: weaviate
45+
46+
- name: Set up Qdrant
47+
uses: hoverkraft-tech/[email protected]
48+
with:
49+
compose-file: docker/docker-compose.qdrant.yaml
50+
services: qdrant
51+
52+
- name: Set up Milvus
53+
uses: hoverkraft-tech/[email protected]
54+
with:
55+
compose-file: docker/docker-compose.milvus.yaml
56+
services: |
57+
etcd
58+
minio
59+
milvus-standalone
60+
4061
- name: Set up Python ${{ matrix.python-version }}
4162
uses: actions/setup-python@v5
4263
with:
@@ -49,6 +70,9 @@ jobs:
4970
- name: Install dependencies
5071
run: pip install -r ./api/requirements.txt -r ./api/requirements-dev.txt
5172

73+
- name: Run Unit tests
74+
run: dev/pytest/pytest_unit_tests.sh
75+
5276
- name: Run ModelRuntime
5377
run: dev/pytest/pytest_model_runtime.sh
5478

@@ -58,5 +82,5 @@ jobs:
5882
- name: Run Workflow
5983
run: dev/pytest/pytest_workflow.sh
6084

61-
- name: Run Unit tests
62-
run: dev/pytest/pytest_unit_tests.sh
85+
- name: Run Vector Stores
86+
run: dev/pytest/pytest_vdb.sh

api/core/rag/datasource/vdb/milvus/milvus_vector.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -250,7 +250,7 @@ def create_collection(
250250

251251
# Create the collection
252252
collection_name = self._collection_name
253-
self._client.create_collection(collection_name=collection_name,
253+
self._client.create_collection_with_schema(collection_name=collection_name,
254254
schema=schema, index_param=index_params,
255255
consistency_level=self._consistency_level)
256256
redis_client.set(collection_exist_cache_key, 1, ex=3600)

api/requirements.txt

+1-1
Original file line numberDiff line numberDiff line change
@@ -55,7 +55,7 @@ xinference-client==0.9.4
5555
safetensors~=0.4.3
5656
zhipuai==1.0.7
5757
werkzeug~=3.0.1
58-
pymilvus~=2.3.7
58+
pymilvus==2.3.1
5959
qdrant-client==1.7.3
6060
cohere~=5.2.4
6161
pyyaml~=6.0.1

api/tests/integration_tests/vdb/milvus/__init__.py

Whitespace-only changes.
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
import uuid
2+
3+
from core.rag.datasource.vdb.milvus.milvus_vector import MilvusConfig, MilvusVector
4+
from models.dataset import Dataset
5+
from tests.integration_tests.vdb.test_vector_store import (
6+
get_sample_document,
7+
get_sample_embedding,
8+
get_sample_query_vector,
9+
setup_mock_redis,
10+
)
11+
12+
13+
def test_milvus_vector(setup_mock_redis) -> None:
14+
dataset_id = str(uuid.uuid4())
15+
vector = MilvusVector(
16+
collection_name=Dataset.gen_collection_name_by_id(dataset_id),
17+
config=MilvusConfig(
18+
host='localhost',
19+
port=19530,
20+
user='root',
21+
password='Milvus',
22+
)
23+
)
24+
25+
# create vector
26+
vector.create(
27+
texts=[get_sample_document(dataset_id)],
28+
embeddings=[get_sample_embedding()],
29+
)
30+
31+
# search by vector
32+
hits_by_vector = vector.search_by_vector(query_vector=get_sample_query_vector())
33+
assert len(hits_by_vector) >= 1
34+
35+
# milvus dos not support full text searching yet in < 2.3.x
36+
37+
# delete vector
38+
vector.delete()

api/tests/integration_tests/vdb/qdrant/__init__.py

Whitespace-only changes.
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
import uuid
2+
3+
from core.rag.datasource.vdb.qdrant.qdrant_vector import QdrantConfig, QdrantVector
4+
from models.dataset import Dataset
5+
from tests.integration_tests.vdb.test_vector_store import (
6+
get_sample_document,
7+
get_sample_embedding,
8+
get_sample_query_vector,
9+
get_sample_text,
10+
setup_mock_redis,
11+
)
12+
13+
14+
def test_qdrant_vector(setup_mock_redis)-> None:
15+
dataset_id = str(uuid.uuid4())
16+
vector = QdrantVector(
17+
collection_name=Dataset.gen_collection_name_by_id(dataset_id),
18+
group_id=dataset_id,
19+
config=QdrantConfig(
20+
endpoint='http://localhost:6333',
21+
api_key='difyai123456',
22+
)
23+
)
24+
25+
# create vector
26+
vector.create(
27+
texts=[get_sample_document(dataset_id)],
28+
embeddings=[get_sample_embedding()],
29+
)
30+
31+
# search by vector
32+
hits_by_vector = vector.search_by_vector(query_vector=get_sample_query_vector())
33+
assert len(hits_by_vector) >= 1
34+
35+
# search by full text
36+
hits_by_full_text = vector.search_by_full_text(query=get_sample_text())
37+
assert len(hits_by_full_text) >= 1
38+
39+
# delete vector
40+
vector.delete()
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
from unittest.mock import MagicMock
2+
3+
import pytest
4+
5+
from core.rag.models.document import Document
6+
from extensions import ext_redis
7+
8+
9+
def get_sample_text() -> str:
10+
return 'test_text'
11+
12+
13+
def get_sample_embedding() -> list[float]:
14+
return [1.1, 2.2, 3.3]
15+
16+
17+
def get_sample_query_vector() -> list[float]:
18+
return get_sample_embedding()
19+
20+
21+
def get_sample_document(sample_dataset_id: str) -> Document:
22+
doc = Document(
23+
page_content=get_sample_text(),
24+
metadata={
25+
"doc_id": sample_dataset_id,
26+
"doc_hash": sample_dataset_id,
27+
"document_id": sample_dataset_id,
28+
"dataset_id": sample_dataset_id,
29+
}
30+
)
31+
return doc
32+
33+
34+
@pytest.fixture
35+
def setup_mock_redis() -> None:
36+
# get
37+
ext_redis.redis_client.get = MagicMock(return_value=None)
38+
39+
# set
40+
ext_redis.redis_client.set = MagicMock(return_value=None)
41+
42+
# lock
43+
mock_redis_lock = MagicMock()
44+
mock_redis_lock.__enter__ = MagicMock()
45+
mock_redis_lock.__exit__ = MagicMock()
46+
ext_redis.redis_client.lock = mock_redis_lock

api/tests/integration_tests/vdb/weaviate/__init__.py

Whitespace-only changes.
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
import uuid
2+
3+
from core.rag.datasource.vdb.weaviate.weaviate_vector import WeaviateConfig, WeaviateVector
4+
from models.dataset import Dataset
5+
from tests.integration_tests.vdb.test_vector_store import (
6+
get_sample_document,
7+
get_sample_embedding,
8+
get_sample_query_vector,
9+
get_sample_text,
10+
setup_mock_redis,
11+
)
12+
13+
14+
def test_weaviate_vector(setup_mock_redis) -> None:
15+
attributes = ['doc_id', 'dataset_id', 'document_id', 'doc_hash']
16+
dataset_id = str(uuid.uuid4())
17+
vector = WeaviateVector(
18+
collection_name=Dataset.gen_collection_name_by_id(dataset_id),
19+
config=WeaviateConfig(
20+
endpoint='http://localhost:8080',
21+
api_key='WVF5YThaHlkYwhGUSmCRgsX3tD5ngdN8pkih',
22+
),
23+
attributes=attributes
24+
)
25+
26+
# create vector
27+
vector.create(
28+
texts=[get_sample_document(dataset_id)],
29+
embeddings=[get_sample_embedding()],
30+
)
31+
32+
# search by vector
33+
hits_by_vector = vector.search_by_vector(query_vector=get_sample_query_vector())
34+
assert len(hits_by_vector) >= 1
35+
36+
# search by full text
37+
hits_by_full_text = vector.search_by_full_text(query=get_sample_text())
38+
assert len(hits_by_full_text) >= 1
39+
40+
# delete vector
41+
vector.delete()

api/tests/unit_tests/core/rag/datasource/vdb/milvus/test_milvus.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ def test_default_value():
1818
with pytest.raises(ValidationError) as e:
1919
MilvusConfig(**config)
2020
assert e.value.errors()[1]['msg'] == f'config MILVUS_{key.upper()} is required'
21-
21+
2222
config = MilvusConfig(**valid_config)
2323
assert config.secure is False
2424
assert config.database == 'default'

dev/pytest/pytest_vdb.sh

+4
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
#!/bin/bash
2+
set -x
3+
4+
pytest api/tests/integration_tests/vdb/

docker/milvus-standalone-docker-compose.yml renamed to docker/docker-compose.milvus.yaml

+1-1
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,7 @@ services:
3636
timeout: 20s
3737
retries: 3
3838

39-
standalone:
39+
milvus-standalone:
4040
container_name: milvus-standalone
4141
image: milvusdb/milvus:v2.3.1
4242
command: ["milvus", "run", "standalone"]

docker/docker-compose.qdrant.yaml

+12
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
version: '3'
2+
services:
3+
# Qdrant vector store.
4+
qdrant:
5+
image: langgenius/qdrant:v1.7.3
6+
restart: always
7+
volumes:
8+
- ./volumes/qdrant:/qdrant/storage
9+
environment:
10+
QDRANT_API_KEY: 'difyai123456'
11+
ports:
12+
- "6333:6333"

0 commit comments

Comments
 (0)