92 lines
4.0 KiB
Python
92 lines
4.0 KiB
Python
"""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"]
|