test_prompt_quality.py 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899
  1. from __future__ import annotations
  2. from agent import get_preset
  3. from script_build_host.agents.presets import register_script_presets
  4. from script_build_host.agents.prompts import (
  5. COMPARISON_WORKER_PROMPT,
  6. COMPOSE_WORKER_PROMPT,
  7. DECODE_RETRIEVAL_WORKER_PROMPT,
  8. DIRECTION_WORKER_PROMPT,
  9. ELEMENT_SET_WORKER_PROMPT,
  10. EXTERNAL_RETRIEVAL_WORKER_PROMPT,
  11. KNOWLEDGE_RETRIEVAL_WORKER_PROMPT,
  12. PARAGRAPH_WORKER_PROMPT,
  13. PATTERN_RETRIEVAL_WORKER_PROMPT,
  14. PLANNER_PROMPT,
  15. ROOT_VALIDATOR_PROMPT,
  16. SCRIPT_CANDIDATE_VALIDATOR_PROMPT,
  17. STRUCTURE_WORKER_PROMPT,
  18. script_build_prompt_manifest,
  19. )
  20. def test_retrieval_roles_freeze_distinct_source_specific_prompts() -> None:
  21. retrieval_presets = {
  22. "script_pattern_retrieval_worker": (
  23. "pattern_retrieval_worker.md",
  24. PATTERN_RETRIEVAL_WORKER_PROMPT,
  25. "query_pattern_qa",
  26. ),
  27. "script_decode_retrieval_worker": (
  28. "decode_retrieval_worker.md",
  29. DECODE_RETRIEVAL_WORKER_PROMPT,
  30. "search_script_decode_case",
  31. ),
  32. "script_external_retrieval_worker": (
  33. "external_retrieval_worker.md",
  34. EXTERNAL_RETRIEVAL_WORKER_PROMPT,
  35. "external_search_case",
  36. ),
  37. "script_knowledge_retrieval_worker": (
  38. "knowledge_retrieval_worker.md",
  39. KNOWLEDGE_RETRIEVAL_WORKER_PROMPT,
  40. "search_knowledge",
  41. ),
  42. }
  43. manifest = {str(item["preset"]): item for item in script_build_prompt_manifest()}
  44. assert len({content for _, content, _ in retrieval_presets.values()}) == 4
  45. for preset, (filename, content, tool_name) in retrieval_presets.items():
  46. assert manifest[preset]["source_id"] == filename
  47. assert manifest[preset]["content"] == content
  48. assert tool_name in content
  49. assert "且仅再调用一次" in content
  50. def test_registered_retrieval_presets_use_their_own_prompt() -> None:
  51. register_script_presets()
  52. expected = {
  53. "script_pattern_retrieval_worker": PATTERN_RETRIEVAL_WORKER_PROMPT,
  54. "script_decode_retrieval_worker": DECODE_RETRIEVAL_WORKER_PROMPT,
  55. "script_external_retrieval_worker": EXTERNAL_RETRIEVAL_WORKER_PROMPT,
  56. "script_knowledge_retrieval_worker": KNOWLEDGE_RETRIEVAL_WORKER_PROMPT,
  57. }
  58. for preset, prompt in expected.items():
  59. assert get_preset(preset).system_prompt == prompt
  60. def test_creative_prompts_preserve_quality_and_convergence_contracts() -> None:
  61. assert "前期可探索不同的真实路径" in PLANNER_PROMPT
  62. assert "一个最主要的缺陷簇" in PLANNER_PROMPT
  63. assert "受众可感知结果" in DIRECTION_WORKER_PROMPT
  64. assert "不预写 Phase 2" in DIRECTION_WORKER_PROMPT
  65. assert "段落方案" in DIRECTION_WORKER_PROMPT
  66. assert "不是完成的正文" in STRUCTURE_WORKER_PROMPT
  67. assert "不可随意互换" in STRUCTURE_WORKER_PROMPT
  68. assert "受众最终能直接看到" in PARAGRAPH_WORKER_PROMPT
  69. assert "不是提纲、创作说明" in PARAGRAPH_WORKER_PROMPT
  70. assert "只是抽象评价" in ELEMENT_SET_WORKER_PROMPT
  71. assert "先按完全相同的 criteria 独立评价" in COMPARISON_WORKER_PROMPT
  72. assert "不在 Compose 阶段补写或润色" in COMPOSE_WORKER_PROMPT
  73. def test_validator_prompts_require_audience_visible_semantic_evidence() -> None:
  74. dimensions = (
  75. "D1 Goal 实现",
  76. "D2 具体可执行",
  77. "D3 结构叙事",
  78. "D4 元素一致",
  79. "D5 主题与 persona",
  80. "D6 信息与事实",
  81. )
  82. for dimension in dimensions:
  83. assert dimension in SCRIPT_CANDIDATE_VALIDATOR_PROMPT
  84. assert "标签、自述和 Artifact URI 本身都不能证明内容质量" in (
  85. SCRIPT_CANDIDATE_VALIDATOR_PROMPT
  86. )
  87. assert "真实受众的阅读顺序" in ROOT_VALIDATOR_PROMPT
  88. assert "空 evidence、空正文、零独立 Element 或零 Link" in ROOT_VALIDATOR_PROMPT