Files
qdrant/tests/openapi/test_relevance_feedback.py
Andrey Vasnetsov da98a8eec4 Untagged Enum for FeedbackStrategy (#8171)
* [manual] make untagged enum for consistent API for FeedbackStrategy

* add #[validate(nested)]

---------

Co-authored-by: Luis Cossío <luis.cossio@outlook.com>
2026-02-18 17:21:06 +01:00

125 lines
4.2 KiB
Python

import pytest
from .helpers.collection_setup import basic_collection_setup, drop_collection
from .helpers.helpers import request_with_validation
@pytest.fixture(autouse=True, scope="module")
def setup(on_disk_vectors, collection_name):
basic_collection_setup(collection_name=collection_name, on_disk_vectors=on_disk_vectors)
yield
drop_collection(collection_name=collection_name)
def test_validations(collection_name):
response = request_with_validation(
api="/collections/{collection_name}/points/query",
method="POST",
path_params={"collection_name": collection_name},
body={
"query": {
"relevance_feedback": {
"target": [0.1, 0.2, 0.3, 0.4],
"feedback": [ {"example": 10000, "score": 0.85} ],
"strategy": {
"naive": {
"a": 0.12,
"b": 1.25,
"c": 0.99
}
}
}
}
},
)
assert not response.ok, response.text
assert response.json()["status"]["error"] == "Not found: No point with id 10000 found"
response = request_with_validation(
api="/collections/{collection_name}/points/query",
method="POST",
path_params={"collection_name": collection_name},
body={
"query": {
"relevance_feedback": {
"target": [0.1, 0.2, 0.3, 0.4],
"feedback": [ ],
"strategy": {
"naive": {
"a": 0.12,
"b": 1.25,
"c": 0.99
}
}
}
}
},
)
assert not response.ok, response.text
assert "feedback elements must be non-empty" in response.json()["status"]["error"]
response = request_with_validation(
api="/collections/{collection_name}/points/query",
method="POST",
path_params={"collection_name": collection_name},
body={
"query": {
"relevance_feedback": {
"target": [0.1, 0.2, 0.3, 0.4],
"feedback": [ {"example": 1, "score": 0.85} ],
"strategy": {
"naive": {
"a": 0.12,
"b": -1.0,
"c": 0.99
}
}
}
}
},
)
assert not response.ok, response.text
assert response.json()["status"]["error"] == "Validation error in JSON body: [internal.query.relevance_feedback.strategy.naive.b: value -1.0 invalid, must be 0.0 or larger]"
def test_feedback_pair_requirement(collection_name):
response = request_with_validation(
api="/collections/{collection_name}/points/query",
method="POST",
path_params={"collection_name": collection_name},
body={
"query": {
"relevance_feedback": {
"target": [0.1, 0.2, 0.3, 0.4],
"feedback": [ {"example": [0.42, 0.42, 0.42, 0.42], "score": 0.85} ],
"strategy": {
"naive": {
"a": 1.0, # identity value for score boosting
"b": 100.0, # unused without feedback pairs
"c": 100.0 # unused without feedback pairs
}
}
}
},
"limit": 3
},
)
assert response.ok, response.text
feedback_results = response.json()["result"]
response = request_with_validation(
api="/collections/{collection_name}/points/query",
method="POST",
path_params={"collection_name": collection_name},
body={
"query": {
"nearest": [0.1, 0.2, 0.3, 0.4],
},
"limit": 3
},
)
assert response.ok, response.text
query_results = response.json()["result"]
assert feedback_results == query_results