context.py 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899
  1. # -*- coding: utf-8 -*-
  2. """PipelineContext 数据结构骨架。
  3. 按 ARCHITECTURE.md §6.1 定义,所有 Stage 共享一个上下文对象,
  4. 替代当前 extract.py::predict() 中函数间传递的大量散列变量。
  5. Phase 2 状态:
  6. 本文件仅提供 dataclass 骨架,不接入 extract.py。
  7. Phase 4/5/6 拆分 extract.py 时,各 Stage 会读写此 context。
  8. 约束(ARCHITECTURE.md §5.4):
  9. - AI 规则代码不得修改 PipelineContext 中非本规则声明的字段。
  10. - 核心代码通过 Pipeline 编排顺序传递结果,Predictor 之间不互相 import。
  11. Python 2/3 兼容说明:
  12. 本项目代码风格显示仍兼容 Python 2(见 dl/__init__.py 中的
  13. sys.path 处理和部分旧文件编码声明)。但 dataclass 是 Python 3.7+ 特性。
  14. 现有代码中已有 3.7+ 特性(如 f-string),因此本文件使用 dataclass。
  15. 若需在 Python 2 下运行,可改为普通类 + __init__。
  16. """
  17. from __future__ import absolute_import
  18. try:
  19. from dataclasses import dataclass, field
  20. _HAS_DATACLASS = True
  21. except ImportError: # pragma: no cover - Python < 3.7
  22. _HAS_DATACLASS = False
  23. __all__ = ["PipelineContext"]
  24. if _HAS_DATACLASS:
  25. @dataclass
  26. class PipelineContext(object):
  27. """Pipeline 各 Stage 之间传递的共享上下文。
  28. 字段对应 extract.py::predict() 当前散落的全局/局部变量:
  29. - 输入字段:doc_id / html / title / page_time / web_source_no 等
  30. - 预处理产物:articles / sentences / entities / outlines
  31. - 模型产物:model_results(按 predictor name 分桶)
  32. - 规则产物:rule_results(按 rule name 分桶)
  33. - 装配产物:assembled(包-角色-金额-联系人结构)
  34. - 最终结果:result(输出 JSON)
  35. - 性能数据:cost_time(各 stage 耗时)
  36. Stage 接口约定(Phase 4+ 落地)::
  37. class Stage:
  38. name: str
  39. def execute(self, ctx: PipelineContext) -> None: ...
  40. """
  41. # --- 输入字段(来自 predict() 入参) ---
  42. doc_id: str = ""
  43. html: str = ""
  44. title: str = ""
  45. page_time: str = ""
  46. web_source_no: str = ""
  47. web_source_name: str = ""
  48. original_docchannel: str = ""
  49. page_attachments: str = "[]"
  50. # --- 预处理产物 ---
  51. articles: list = field(default_factory=list)
  52. sentences: list = field(default_factory=list)
  53. entities: list = field(default_factory=list)
  54. outlines: list = field(default_factory=list)
  55. # --- 各层产物 ---
  56. model_results: dict = field(default_factory=dict)
  57. rule_results: dict = field(default_factory=dict)
  58. assembled: dict = field(default_factory=dict)
  59. result: dict = field(default_factory=dict)
  60. cost_time: dict = field(default_factory=dict)
  61. else: # pragma: no cover - Python 2 回退
  62. class PipelineContext(object):
  63. """PipelineContext(Python 2 兼容版,字段同上)。"""
  64. def __init__(self):
  65. self.doc_id = ""
  66. self.html = ""
  67. self.title = ""
  68. self.page_time = ""
  69. self.web_source_no = ""
  70. self.web_source_name = ""
  71. self.original_docchannel = ""
  72. self.page_attachments = "[]"
  73. self.articles = []
  74. self.sentences = []
  75. self.entities = []
  76. self.outlines = []
  77. self.model_results = {}
  78. self.rule_results = {}
  79. self.assembled = {}
  80. self.result = {}
  81. self.cost_time = {}