实现侧: - 上下文:任务范围拆分为 范围校验/范围授权;索引按可发现口径重建、索引新鲜度改对称差;依赖校验统一快照漂移说明。 - 知识方法:方法与材料读取口径统一;超限方法材料按可选省略,核对路径不再二次计费;删除无合同的读时重算。 - 任务运行:新增 context.usage/tool.denied 事件类型;连接池常驻并在装配生命周期内开关;调用结算与核对分列。 - 效果评测/审校修订/交付连载/作者经验/作品规划:凭据冻结、标定消费、导出补证、事实引文核对等收尾修复。 - 资源加载:能力正文不再夹带索引用的导航注记(该注记此前进入角色与技能的模型提示)。 - 元数据:受保护骨架与代码保护属性对齐;字段校验与内置结构口径同步。 - 基础设施:环境预检进入装配生命周期;数据库连接运行期字段不参与相等比较;索引指纹归一化 jsonb 浮点。 - 删除被替代实现:7 份旧提示词模板与空壳 资料来源 读取器。 用例侧: - 用例身份与导航元信息迁移;夹具补生命周期、同库暴露与模板封存; - 本轮定向修复:方法材料省略、事实引文、迁移回执、额度与暂停用例、慢用例超时预算等。
142 lines
5.5 KiB
Python
142 lines
5.5 KiB
Python
"""方法版本与绑定的确定性边界:嵌入、关键词、融合排序、渲染与状态迁移表。"""
|
||
|
||
import pytest
|
||
|
||
from muse.上下文.混合检索 import _rrf
|
||
from muse.基础设施.检索.关键词 import 关键词得分, 分词
|
||
from muse.基础设施.检索.向量 import 余弦相似, 向量得分
|
||
from muse.基础设施.模型.嵌入 import 特征哈希嵌入器
|
||
from muse.知识方法.方法卡 import 检索文本, 渲染方法材料
|
||
from muse.知识方法.方法版本 import 迁移表
|
||
|
||
|
||
@pytest.mark.case_id(
|
||
"NC-w20-20a01a",
|
||
environment="离线",
|
||
given="纯函数与状态迁移表",
|
||
when="执行边界输入",
|
||
then=["嵌入器同文本确定、范数归一、异文不同向量"],
|
||
contract="docs/系统架构/新版设计/模块设计/B04-知识方法.md",
|
||
)
|
||
def test_嵌入确定与归一__20a01a():
|
||
嵌入器 = 特征哈希嵌入器(128)
|
||
甲 = 嵌入器.嵌入("信息差要在爆点前埋设")
|
||
乙 = 嵌入器.嵌入("信息差要在爆点前埋设")
|
||
丙 = 嵌入器.嵌入("完全无关的另一段话")
|
||
assert 甲 == 乙
|
||
assert 余弦相似(甲, 丙) < 0.999
|
||
assert abs(sum(v * v for v in 甲) - 1.0) < 1e-9
|
||
assert len(甲) == 128
|
||
|
||
|
||
@pytest.mark.case_id(
|
||
"NC-w20-20a02b",
|
||
environment="离线",
|
||
given="纯函数与状态迁移表",
|
||
when="执行边界输入",
|
||
then=["二元组关键词计分与向量相似排序一致"],
|
||
contract="docs/系统架构/新版设计/模块设计/B04-知识方法.md",
|
||
)
|
||
def test_关键词与向量得分__20a02b():
|
||
语料 = {"v1": "信息差 埋设 爆点 前置", "v2": "战斗节奏 压迫 递进"}
|
||
词分 = 关键词得分("信息差 埋设", 语料)
|
||
assert 词分["v1"] > 0 and "v2" not in 词分
|
||
嵌入器 = 特征哈希嵌入器(64)
|
||
量分 = 向量得分(嵌入器.嵌入("信息差 埋设"), {k: 嵌入器.嵌入(v) for k, v in 语料.items()})
|
||
assert 量分["v1"] > 量分.get("v2", 0.0)
|
||
assert 分词("短") == ["短"]
|
||
|
||
|
||
@pytest.mark.case_id(
|
||
"NC-w20-20a03c",
|
||
environment="离线",
|
||
given="纯函数与状态迁移表",
|
||
when="执行边界输入",
|
||
then=["RRF 融合两路排名使双高者居首"],
|
||
contract="docs/系统架构/新版设计/模块设计/B04-知识方法.md",
|
||
)
|
||
def test_rrf融合两路排名__20a03c():
|
||
词 = {"a": 3.0, "b": 1.0}
|
||
量 = {"b": 2.0, "c": 1.0}
|
||
融 = _rrf([词, 量], [1.0, 1.0])
|
||
assert 融["b"] > 融["a"] and 融["b"] > 融["c"]
|
||
|
||
|
||
@pytest.mark.case_id(
|
||
"NC-w20-20a04d",
|
||
environment="离线",
|
||
given="纯函数与状态迁移表",
|
||
when="执行边界输入",
|
||
then=["消费材料含参数上限、反例与出处"],
|
||
contract="docs/系统架构/新版设计/模块设计/B04-知识方法.md",
|
||
)
|
||
def test_渲染材料含上限与反例__20a04d():
|
||
版本行 = {
|
||
"content": {"原理": "当X时做Y", "单章上限": 2},
|
||
"参数上限": {"单章上限": 2},
|
||
"type_id": "craft",
|
||
"title": "契诃夫之枪",
|
||
"version": 3,
|
||
}
|
||
证据 = [
|
||
{"kind": "source", "note": "", "ref": {"source_id": "s1", "revision": 2, "定位": "第3章"}},
|
||
{"kind": "counter", "note": "每章都埋即烂大街", "ref": {}},
|
||
]
|
||
文本 = 渲染方法材料(版本行, 证据)
|
||
assert "参数上限" in 文本 and "反例:每章都埋即烂大街" in 文本
|
||
assert "出处:s1@r2 第3章" in 文本
|
||
assert "单章上限:2" in 渲染方法材料(版本行, []) or "单章上限" in 检索文本(版本行, 证据)
|
||
|
||
|
||
@pytest.mark.case_id(
|
||
"NC-w20-20a05e",
|
||
environment="离线",
|
||
given="纯函数与状态迁移表",
|
||
when="执行边界输入",
|
||
then=["状态机迁移表封闭:不允许跳启与启撤"],
|
||
contract="docs/系统架构/新版设计/模块设计/B04-知识方法.md",
|
||
)
|
||
def test_状态迁移表封闭__20a05e():
|
||
assert ("proposed", "enabled") not in 迁移表
|
||
assert ("enabled", "withdrawn") not in 迁移表
|
||
assert ("proposed", "confirmed") in 迁移表
|
||
assert ("confirmed", "enabled") in 迁移表
|
||
assert ("enabled", "disabled") in 迁移表
|
||
assert ("disabled", "enabled") in 迁移表
|
||
|
||
|
||
@pytest.mark.case_id(
|
||
"NC-w20-20a06f",
|
||
environment="离线",
|
||
given="纯函数与状态迁移表",
|
||
when="执行边界输入",
|
||
then=["空文本嵌入为零向量且余弦安全"],
|
||
contract="docs/系统架构/新版设计/模块设计/B04-知识方法.md",
|
||
)
|
||
def test_空文本嵌入零向量安全__20a06f():
|
||
嵌入器 = 特征哈希嵌入器(32)
|
||
向量 = 嵌入器.嵌入(" ")
|
||
assert len(向量) == 32 and all(v == 0.0 for v in 向量)
|
||
assert 余弦相似(向量, 向量) == 0.0
|
||
|
||
|
||
@pytest.mark.case_id(
|
||
"NC-b09-method-structure-no-fake-hash", when="方法结构选择保留序列化但不伪造空哈希"
|
||
)
|
||
def test_方法结构选择保留序列化但不伪造空哈希__e13004():
|
||
from dataclasses import asdict
|
||
|
||
from pydantic import TypeAdapter
|
||
|
||
from muse.知识方法.接口 import 方法结构, 方法错误
|
||
|
||
值 = {"schema_id": "craft", "base_version": 2}
|
||
结构 = TypeAdapter(方法结构).validate_python(值)
|
||
assert 结构 == 方法结构("craft", 2)
|
||
assert asdict(结构) == 值
|
||
assert TypeAdapter(方法结构).dump_python(结构) == 值
|
||
assert set(TypeAdapter(方法结构).json_schema()["properties"]) == {"schema_id", "base_version"}
|
||
with pytest.raises(方法错误, match="从元数据已解析的有效结构取得哈希") as 错:
|
||
_ = 结构.effective_schema_hash
|
||
assert 错.value.错误码 == "METHOD_SCHEMA_UNRESOLVED"
|