- 新增3份任务模板并登记:正文/受限探索.md、抽取/章后抽取.md、抽取/拆书分析.md; 模板不带身份句,身份唯一来源为角色层,消除装配后双自我介绍 - 消费方改走 打开资源() 并返回(文本,sha256):生成正文.受限探索模板、 章后处理.章后抽取模板、拆书分析.拆书分析模板;探索/抽取检查点留痕模板哈希 - 配置探针保留代码内提示并加豁免注释(与探针合同同构、64 token、无迭代需求) - 新增架构守卫 tests/架构/test_提示词治理.py:系统提示字面量仅白名单豁免, 正则覆盖括号多行拼接与f-string形式,含守卫自检防假绿 - 新增 tests/单元/test_提示词装配.py:三链路装配=角色+模板+合同且模板无身份句 - test_规划审校发布模板.py 参数表扩至6份模板(同哈希、缺失/篡改不回退) 证据:离线全量1153项通过;受影响数据库集成19项通过(两阶段写手/章后失败与 重建/配置探针与章后绑定/参考分析权威/同作品抽取互斥/抽取版本与补偿); ruff+pyright 零告警;资源包已重建(构建编排.py),索引检查通过(用例+3)。
64 lines
2.4 KiB
Python
64 lines
2.4 KiB
Python
"""提示词治理守卫:模型系统提示必须来自登记资源,代码内字面量仅白名单豁免。
|
||
|
||
保护:A1 类回归——任务提示词散落在代码字面量、绕过资源登记/哈希冻结/发布包治理。
|
||
白名单唯一成员是配置探针:探针提示与探针合同同构、64 token 固定、无迭代需求,
|
||
豁免理由在 配置探针.py 调用处注释留痕。
|
||
"""
|
||
|
||
from __future__ import annotations
|
||
|
||
import re
|
||
from pathlib import Path
|
||
|
||
import pytest
|
||
|
||
仓库根 = Path(__file__).resolve().parents[2]
|
||
源码根 = 仓库根 / "src" / "muse"
|
||
|
||
白名单 = {"任务运行/配置探针.py"}
|
||
|
||
# 系统提示= 后接字符串字面量(含括号包裹的隐式拼接与 f/r/b 前缀)即硬编码;
|
||
# 变量或函数返回值传递(系统提示=模板 / 系统提示=拆书分析模板()[0])不匹配。
|
||
_硬编码 = re.compile(r"""系统提示\s*=\s*\(?\s*[fF]?[rRbBuU]{0,2}["']""")
|
||
|
||
|
||
def _源码文件():
|
||
for 文件 in sorted(源码根.rglob("*.py")):
|
||
if "__pycache__" in 文件.parts:
|
||
continue
|
||
yield 文件
|
||
|
||
|
||
@pytest.mark.case_id("NC-prompt-governance-no-hardcoded-system-prompt")
|
||
def test_系统提示字面量仅白名单豁免():
|
||
违规 = [
|
||
str(文件.relative_to(源码根))
|
||
for 文件 in _源码文件()
|
||
if str(文件.relative_to(源码根)) not in 白名单
|
||
and _硬编码.search(文件.read_text(encoding="utf-8"))
|
||
]
|
||
assert 违规 == [], f"系统提示不得硬编码字面量,应登记为资源模板:{违规}"
|
||
|
||
|
||
@pytest.mark.case_id("NC-prompt-governance-guard-self-check")
|
||
def test_守卫正则检出各字面量形式且不误报变量传递():
|
||
检出样例 = (
|
||
'系统提示="你是XX。"',
|
||
"系统提示='你是XX。'",
|
||
'系统提示=(\n "你是XX。"\n "做YY。"\n )',
|
||
'系统提示 = (\n "你是XX。"\n)',
|
||
'系统提示=f"你是{名}。"',
|
||
)
|
||
for 样例 in 检出样例:
|
||
assert _硬编码.search(样例), f"守卫漏检字面量形式:{样例}"
|
||
放行样例 = (
|
||
"系统提示=模板",
|
||
"系统提示=模板,",
|
||
"系统提示=探索提示,",
|
||
"系统提示=拆书分析模板()[0]",
|
||
"系统提示: str,",
|
||
"系统提示: str = 模板",
|
||
)
|
||
for 样例 in 放行样例:
|
||
assert not _硬编码.search(样例), f"守卫误报变量传递:{样例}"
|