feat: persist isolated vector snapshots and exact retrieval
This commit is contained in:
@@ -0,0 +1,91 @@
|
||||
"""Explicit opt-in: actual pinned model -> HTTP -> PostgreSQL -> HTTP process restart."""
|
||||
|
||||
import os
|
||||
|
||||
import pytest
|
||||
from sqlalchemy import text
|
||||
from test_runtime import server
|
||||
|
||||
from app.services.embedding import SMALL_ZH
|
||||
|
||||
|
||||
@pytest.mark.skipif(
|
||||
os.environ.get("RUN_LOCAL_EMBEDDING_TEST") != "1",
|
||||
reason="requires optional CPU runtime and offline pinned model cache",
|
||||
)
|
||||
def test_real_local_model_vectors_retrieval_and_http_restart(migrated_database):
|
||||
options = {
|
||||
"EMBEDDING_ENABLED": "true",
|
||||
"EMBEDDING_MODEL": "small",
|
||||
"EMBEDDING_CACHE_DIR": os.environ["EMBEDDING_CACHE_DIR"],
|
||||
"HF_HUB_OFFLINE": "1",
|
||||
"HF_HUB_DISABLE_TELEMETRY": "1",
|
||||
"HF_HUB_DISABLE_IMPLICIT_TOKEN": "1",
|
||||
"TOKENIZERS_PARALLELISM": "false",
|
||||
}
|
||||
query = {"query": "合成测试中交通安排应查阅哪份资料?"}
|
||||
with server(migrated_database, environment_overrides=options) as client:
|
||||
ids = []
|
||||
for topic, body in [
|
||||
("交通", "【合成测试】占位交通资料介绍测试公交线路与班次的查询入口。"),
|
||||
("住宿", "【合成测试】占位住宿资料介绍测试房型与入住须知。"),
|
||||
("审核", "【合成测试】占位审核资料说明测试出处核验流程。"),
|
||||
]:
|
||||
item = client.post(
|
||||
"/api/knowledge",
|
||||
json={
|
||||
"title": f"{topic}合成测试",
|
||||
"content": body,
|
||||
"source_url": "https://example.com/",
|
||||
"collected_at": "2026-10-16T00:00:00Z",
|
||||
},
|
||||
).json()
|
||||
response = client.post(
|
||||
f"/api/knowledge/{item['id']}/review",
|
||||
json={
|
||||
"expected_version": item["version"],
|
||||
"verification_status": "verified",
|
||||
"reviewer": "test-reviewer",
|
||||
"verification_notes": "仅为模型/HTTP/数据库持久化测试,不是事实资料",
|
||||
},
|
||||
)
|
||||
assert response.status_code == 200
|
||||
ids.append(item["id"])
|
||||
text_ = client.post("/api/indexes", json={"chunk_size": 200, "overlap": 20}).json()
|
||||
assert (
|
||||
client.post(
|
||||
f"/api/indexes/{text_['id']}/publish", json={"expected_generation": 0}
|
||||
).status_code
|
||||
== 200
|
||||
)
|
||||
built = client.post(
|
||||
"/api/vector-indexes", json={"text_index_version_id": text_["id"]}, timeout=60
|
||||
)
|
||||
assert built.status_code == 201, built.text
|
||||
version = built.json()
|
||||
assert version["space_id"] == SMALL_ZH.space_id and version["dimension"] == 512
|
||||
published = client.post(
|
||||
f"/api/vector-indexes/{version['id']}/publish", json={"expected_generation": 0}
|
||||
)
|
||||
assert published.status_code == 200
|
||||
active = published.json()
|
||||
response = client.post("/api/retrieval/vector", json=query, timeout=60)
|
||||
assert response.status_code == 200, response.text
|
||||
first = response.json()
|
||||
assert {h["knowledge_id"] for h in first["results"]} == set(ids)
|
||||
assert all(-1 <= h["score"] <= 1 for h in first["results"])
|
||||
assert first["config"]["space"]["spec"]["revision"] == SMALL_ZH.revision
|
||||
with migrated_database.connect() as c:
|
||||
assert (
|
||||
c.scalar(
|
||||
text("SELECT count(*) FROM chunk_vectors WHERE public.vector_dims(embedding)=512")
|
||||
)
|
||||
== 3
|
||||
)
|
||||
assert c.scalar(text("SELECT count(*) FROM vector_publications")) == 1
|
||||
with server(migrated_database, environment_overrides=options) as client:
|
||||
assert client.get("/api/vector-indexes/active").json() == active
|
||||
assert client.get(f"/api/retrieval/runs/{first['run_id']}").json() == first
|
||||
response = client.post("/api/retrieval/vector", json=query, timeout=60)
|
||||
assert response.status_code == 200, response.text
|
||||
assert response.json()["results"] == first["results"]
|
||||
Reference in New Issue
Block a user