"""旧选题检索的空结果观察由B09真实混合检索承接,不修改B04绑定列表合同。""" from unittest.mock import patch import pytest from muse.上下文.混合检索 import 混合检索 from muse.共享.错误 import Muse错误 from muse.基础设施.模型.嵌入 import 特征哈希嵌入器 @pytest.mark.case_id( "TC-e0a672070e60", environment="离线真实混合检索与确定性嵌入;只替换新鲜索引读取边界", when="选择或投影明确用途的固定方法版本。", contract="docs/系统架构/新版设计/模块设计/B04-知识方法.md", ) def test_无命中检索保留明确原因和索引身份__e0a672(): embedder = 特征哈希嵌入器(512) rows = [ { "method_version_id": "version-1", "检索文本": "astronomy", "vector": embedder.嵌入("astronomy"), } ] with ( patch( "muse.上下文.混合检索.读取新鲜索引", return_value=({"索引身份": "index-1"}, rows, {}) ), patch("muse.上下文.混合检索.读取方法检索身份", return_value=("version-1",)), ): result = 混合检索(object(), "无命中意图", embedder) assert result["结果"] == [] and result["索引身份"] == "index-1" assert result["empty_reason"] == "no_match" assert result["说明"] == "方法检索没有命中可授权卡" @pytest.mark.case_id( "TC-6e73eec88127", environment="离线真实混合检索与确定性嵌入;只替换新鲜索引读取边界", when="选择或投影明确用途的固定方法版本。", contract="docs/系统架构/新版设计/模块设计/B04-知识方法.md", ) @pytest.mark.parametrize("intent", ["", " \n "]) def test_空检索意图在读取索引前拒绝__6e73ee(intent): with patch("muse.上下文.混合检索.读取新鲜索引") as read: with pytest.raises(Muse错误, match="查询"): 混合检索(object(), intent, 特征哈希嵌入器()) read.assert_not_called()