test.py 6.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201
  1. import json
  2. import logging
  3. import os
  4. from src.extractor import InfoExtractor
  5. logging.basicConfig(
  6. level=logging.INFO,
  7. format="%(asctime)s [%(levelname)s] %(name)s: %(message)s",
  8. )
  9. SAMPLE_ARTICLE = (
  10. "2026年6月1日晚8点,好友们决定为王若飞(男)组织一场生日派对。"
  11. "这次小范围聚会共有5人参加,刘阳(女)作为总策划,"
  12. "除寿星和总策划外,还有李四(女)、王五(男)和赵六(男)参加。"
  13. "活动总预算为3000元,且已完成备案,"
  14. "现场安排了掷骰子、扔飞镖和打桌球等破冰游戏,确保大家玩得尽兴。"
  15. "派对过程中,李四、王五和赵六还为王若飞送上了蛋糕,大家一起唱了生日歌。"
  16. "派对结束后,若飞和阳阳表示非常感谢大家的参加。"
  17. )
  18. SAMPLE_DEFINITION = {
  19. "metadata": {
  20. "node_label": "PDJH",
  21. "node_name": "派对计划",
  22. "node_type": "concept",
  23. },
  24. "subnodes": {
  25. "JBXX": {
  26. "metadata": {
  27. "node_label": "JBXX",
  28. "node_name": "基本信息",
  29. "node_type": "concept",
  30. },
  31. "subnodes": {
  32. "PDMC": {
  33. "metadata": {
  34. "node_label": "PDMC",
  35. "node_name": "派对名称",
  36. "node_type": "property",
  37. "value_type": "string",
  38. "is_list": False,
  39. }
  40. },
  41. "PDKSSJ": {
  42. "metadata": {
  43. "node_label": "PDKSSJ",
  44. "node_name": "派对开始时间",
  45. "node_type": "property",
  46. "value_type": "date_time",
  47. "is_list": False,
  48. }
  49. },
  50. "PDZRS": {
  51. "metadata": {
  52. "node_label": "PDZRS",
  53. "node_name": "派对总人数",
  54. "node_type": "property",
  55. "value_type": "integer",
  56. "is_list": False,
  57. }
  58. },
  59. "PDZYS": {
  60. "metadata": {
  61. "node_label": "PDZYS",
  62. "node_name": "派对总预算",
  63. "node_type": "property",
  64. "value_type": "float",
  65. "is_list": False,
  66. }
  67. },
  68. "SFBA": {
  69. "metadata": {
  70. "node_label": "SFBA",
  71. "node_name": "是否备案",
  72. "node_type": "property",
  73. "value_type": "boolean",
  74. "is_list": False,
  75. }
  76. },
  77. },
  78. },
  79. "RYXX": {
  80. "metadata": {
  81. "node_label": "RYXX",
  82. "node_name": "人员信息",
  83. "node_type": "concept",
  84. },
  85. "subnodes": {
  86. "ZCH": {
  87. "metadata": {
  88. "node_label": "ZCH",
  89. "node_name": "总策划",
  90. "node_type": "property",
  91. "value_type": "class",
  92. "is_list": False,
  93. },
  94. "subnodes": {
  95. "XM": {
  96. "metadata": {
  97. "node_label": "XM",
  98. "node_name": "姓名",
  99. "node_type": "property",
  100. "value_type": "string",
  101. "is_list": False,
  102. }
  103. },
  104. "XB": {
  105. "metadata": {
  106. "node_label": "XB",
  107. "node_name": "性别",
  108. "node_type": "property",
  109. "value_type": "string",
  110. "is_list": False,
  111. }
  112. },
  113. },
  114. },
  115. "RYQD": {
  116. "metadata": {
  117. "node_label": "RYQD",
  118. "node_name": "人员清单",
  119. "node_type": "property",
  120. "value_type": "class",
  121. "is_list": True,
  122. },
  123. "subnodes": {
  124. "XM": {
  125. "metadata": {
  126. "node_label": "XM",
  127. "node_name": "姓名",
  128. "node_type": "property",
  129. "value_type": "string",
  130. "is_list": False,
  131. }
  132. },
  133. "XB": {
  134. "metadata": {
  135. "node_label": "XB",
  136. "node_name": "性别",
  137. "node_type": "property",
  138. "value_type": "string",
  139. "is_list": False,
  140. }
  141. },
  142. },
  143. },
  144. },
  145. },
  146. "HDXX": {
  147. "metadata": {
  148. "node_label": "HDXX",
  149. "node_name": "活动信息",
  150. "node_type": "concept",
  151. },
  152. "subnodes": {
  153. "PBYXQD": {
  154. "metadata": {
  155. "node_label": "PBYXQD",
  156. "node_name": "破冰游戏清单",
  157. "node_type": "property",
  158. "value_type": "string",
  159. "is_list": True,
  160. }
  161. }
  162. },
  163. },
  164. },
  165. }
  166. def main() -> None:
  167. # 初始化提取器
  168. # 方式 1: 使用环境变量(OPENAI_API_KEY, OPENAI_BASE_URL)
  169. # 方式 2: 直接传入参数
  170. extractor = InfoExtractor(
  171. model_name="glm-5.2",
  172. api_key=os.environ.get("INFO_EXTRACTOR_API_KEY", "your-api-key"),
  173. base_url=os.environ.get("INFO_EXTRACTOR_BASE_URL", "https://open.bigmodel.cn/api/coding/paas/v4"),
  174. temperature=0,
  175. max_retries=3,
  176. )
  177. # 执行提取
  178. result = extractor.extract(
  179. article=SAMPLE_ARTICLE,
  180. definition=SAMPLE_DEFINITION,
  181. mode="two_phase",
  182. verbose=True,
  183. annotate=True,
  184. debug=True,
  185. )
  186. # 输出结果
  187. print("\n" + "=" * 60)
  188. print("提取结果:")
  189. print("=" * 60)
  190. print(json.dumps(result, ensure_ascii=False, indent=2))
  191. if __name__ == "__main__":
  192. main()