union-py-app-stream-chat 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +85 -0
- package/config/config.example.yaml +60 -0
- package/knowledge/files/scenario-netunion-runtime-risk-v1.md +111 -0
- package/knowledge/files/severity-netunion-runtime-classification-v1.md +112 -0
- package/knowledge//350/201/224/345/220/210/350/277/220/347/273/264/347/237/245/350/257/206/345/272/223/345/273/272/347/253/213/350/247/204/350/214/203.md +272 -0
- package/main.py +46 -0
- package/package.json +21 -0
- package/pyproject.toml +23 -0
- package/requirements.txt +11 -0
- package/src/api/__init__.py +0 -0
- package/src/api/routes.py +34 -0
- package/src/core/__init__.py +0 -0
- package/src/core/config_loader.py +99 -0
- package/src/manager/toolcall_manager.py +12 -0
- package/src/models/__init__.py +0 -0
- package/src/models/schemas.py +7 -0
- package/src/service/__init__.py +0 -0
- package/src/service/chat_service.py +245 -0
- package/src/service/rag_service.py +154 -0
- package/src/utils/function_utils.py +421 -0
- package/tests/__init__.py +0 -0
- package/tests/test_chat_service.py +75 -0
- package/trainingDocs//347/275/221/347/273/234/346/224/257/344/273/230/346/270/205/347/256/227/345/271/263/345/217/260/350/201/224/345/220/210/350/277/220/347/273/264/350/277/220/350/241/214/345/256/236/350/267/265/346/214/207/345/274/225V1.0.md +33 -0
|
@@ -0,0 +1,421 @@
|
|
|
1
|
+
"""定义可供大模型调用的联合运维业务工具。"""
|
|
2
|
+
import json
|
|
3
|
+
from typing import Any, Dict, Optional
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
LARGE_UNITS = {
|
|
7
|
+
"工商银行", "农业银行", "中国银行", "建设银行", "交通银行", "邮储银行", "招商银行",
|
|
8
|
+
"微众银行", "网商银行", "农信银中心", "支付宝", "财付通",
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
MEDIUM_UNITS = {
|
|
12
|
+
"中信银行", "光大银行", "民生银行", "兴业银行", "广发银行", "平安银行", "浦发银行",
|
|
13
|
+
"浙江联社", "网银在线",
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
BUSINESS_GUIDANCE = {
|
|
17
|
+
"business_scope": {
|
|
18
|
+
"title": "业务范围",
|
|
19
|
+
"content": "网联平台主要业务包括签约、解约、快捷支付、付款、退款、代收、网关支付等,此版本暂不包含条码业务。",
|
|
20
|
+
},
|
|
21
|
+
"unit_classification": {
|
|
22
|
+
"title": "单位分类",
|
|
23
|
+
"content": "大型单位为上一年全年日均交易量大于等于2000万笔;中型单位为大于等于500万笔且小于2000万笔;小型单位为小于500万笔。附录B列出了常见大型和中型单位。",
|
|
24
|
+
},
|
|
25
|
+
"production_change": {
|
|
26
|
+
"title": "生产变更",
|
|
27
|
+
"content": "生产变更覆盖技术变更、数据变更、系统升级或更改、应用版本投产、应急演练、灾备切换、紧急补丁等。变更需要提前通知,按影响评估选择保持关注、关闭渠道、重点保障或特殊方案。",
|
|
28
|
+
},
|
|
29
|
+
"production_operation": {
|
|
30
|
+
"title": "生产运行",
|
|
31
|
+
"content": "生产运行覆盖风险识别、异常处置、升级、恢复和事后定级。常见处置包括异常方排查并同步结果,影响方保持关注、降低流量或暂停受影响业务交易发送。",
|
|
32
|
+
},
|
|
33
|
+
"fault_grading": {
|
|
34
|
+
"title": "运行故障定级",
|
|
35
|
+
"content": "故障定级按单位类别区分轻微、一般、严重。异常交易笔数与异常持续时间为“或”关系,满足其中一项即可定级;同时满足多个标准时按最高级别确定。",
|
|
36
|
+
},
|
|
37
|
+
"recovery": {
|
|
38
|
+
"title": "恢复策略",
|
|
39
|
+
"content": "异常方故障修复后应第一时间通知平台,平台同步影响方,影响方根据平台通知灰度恢复业务;如果恢复中反复故障,平台应在异常方恢复后观察一段时间再通知灰度恢复。",
|
|
40
|
+
},
|
|
41
|
+
"periodic_evaluation": {
|
|
42
|
+
"title": "周期评价",
|
|
43
|
+
"content": "周期评价按周、月、年进行,评价内容包括日常运行情况、故障影响、生产变更质量、客诉和负面影响。综合分数大于等于90且系统成功率大于99.99%为优秀。",
|
|
44
|
+
},
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
|
|
48
|
+
def _normalize_unit_name(unit_name: Optional[str]) -> str:
|
|
49
|
+
return (unit_name or "").strip().replace("中国邮政储蓄银行", "邮储银行")
|
|
50
|
+
|
|
51
|
+
|
|
52
|
+
def classify_member_unit(unit_name: Optional[str] = None, daily_txn_count: Optional[int] = None) -> Dict[str, Any]:
|
|
53
|
+
"""按指引附录B或上一年全年日均交易量识别成员单位分类。"""
|
|
54
|
+
normalized = _normalize_unit_name(unit_name)
|
|
55
|
+
reason = ""
|
|
56
|
+
|
|
57
|
+
if normalized:
|
|
58
|
+
if normalized in LARGE_UNITS:
|
|
59
|
+
return {"unit_name": unit_name, "category": "大型单位", "reason": "命中附录B大型单位名单"}
|
|
60
|
+
if normalized in MEDIUM_UNITS:
|
|
61
|
+
return {"unit_name": unit_name, "category": "中型单位", "reason": "命中附录B中型单位名单"}
|
|
62
|
+
|
|
63
|
+
if daily_txn_count is not None:
|
|
64
|
+
if daily_txn_count >= 20_000_000:
|
|
65
|
+
category = "大型单位"
|
|
66
|
+
reason = "上一年全年日均交易量大于等于2000万笔"
|
|
67
|
+
elif daily_txn_count >= 5_000_000:
|
|
68
|
+
category = "中型单位"
|
|
69
|
+
reason = "上一年全年日均交易量大于等于500万笔且小于2000万笔"
|
|
70
|
+
else:
|
|
71
|
+
category = "小型单位"
|
|
72
|
+
reason = "上一年全年日均交易量小于500万笔"
|
|
73
|
+
return {"unit_name": unit_name, "daily_txn_count": daily_txn_count, "category": category, "reason": reason}
|
|
74
|
+
|
|
75
|
+
return {
|
|
76
|
+
"unit_name": unit_name,
|
|
77
|
+
"category": "小型单位",
|
|
78
|
+
"reason": "未命中附录B大型/中型单位名单,按指引归为其余小型成员单位;如有日均交易量大幅波动需特殊处理",
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
|
|
82
|
+
def get_ops_guidance(topic: str) -> Dict[str, Any]:
|
|
83
|
+
"""获取联合运维指引中指定主题的业务说明。"""
|
|
84
|
+
guidance = BUSINESS_GUIDANCE.get(topic)
|
|
85
|
+
if not guidance:
|
|
86
|
+
return {
|
|
87
|
+
"error": "未知主题",
|
|
88
|
+
"supported_topics": sorted(BUSINESS_GUIDANCE.keys()),
|
|
89
|
+
}
|
|
90
|
+
return {"topic": topic, **guidance, "source": "网络支付清算平台联合运维运行实践指引V1.0"}
|
|
91
|
+
|
|
92
|
+
|
|
93
|
+
def get_fault_aftercare(fault_level: str) -> Dict[str, Any]:
|
|
94
|
+
"""获取不同故障级别的善后账务处置时限。"""
|
|
95
|
+
mapping = {
|
|
96
|
+
"轻微故障": "应在1个自然日内完成账务调整",
|
|
97
|
+
"一般故障": "应在2个小时内完成账务调整",
|
|
98
|
+
"严重故障": "应在30分钟内完成账务调整",
|
|
99
|
+
}
|
|
100
|
+
return {
|
|
101
|
+
"fault_level": fault_level,
|
|
102
|
+
"aftercare_requirement": mapping.get(fault_level, "未知故障级别,应先完成故障定级"),
|
|
103
|
+
"sync_requirement": "故障方处理完成后应第一时间与网联平台同步信息,否则视为未及时调整",
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
|
|
107
|
+
def evaluate_fault_grade(
|
|
108
|
+
unit_category: Optional[str] = None,
|
|
109
|
+
unit_name: Optional[str] = None,
|
|
110
|
+
abnormal_txn_count: Optional[int] = None,
|
|
111
|
+
duration_minutes: Optional[float] = None,
|
|
112
|
+
) -> Dict[str, Any]:
|
|
113
|
+
"""根据异常交易笔数或异常持续时间判断运行故障级别。"""
|
|
114
|
+
category = unit_category or classify_member_unit(unit_name).get("category")
|
|
115
|
+
thresholds = {
|
|
116
|
+
"大型单位": {
|
|
117
|
+
"轻微故障": {"txn_min": 1000, "txn_max": 25000, "duration_min": 0, "duration_max": 10},
|
|
118
|
+
"一般故障": {"txn_min": 25000, "txn_max": 50000, "duration_min": 10, "duration_max": 30},
|
|
119
|
+
"严重故障": {"txn_min": 50000, "txn_max": None, "duration_min": 30, "duration_max": None},
|
|
120
|
+
},
|
|
121
|
+
"中型单位": {
|
|
122
|
+
"轻微故障": {"txn_min": 1000, "txn_max": 10000, "duration_min": 0, "duration_max": 30},
|
|
123
|
+
"一般故障": {"txn_min": 10000, "txn_max": 25000, "duration_min": 30, "duration_max": 60},
|
|
124
|
+
"严重故障": {"txn_min": 25000, "txn_max": None, "duration_min": 60, "duration_max": None},
|
|
125
|
+
},
|
|
126
|
+
"小型单位": {
|
|
127
|
+
"轻微故障": {"txn_min": 500, "txn_max": 5000, "duration_min": 0, "duration_max": 60},
|
|
128
|
+
"一般故障": {"txn_min": 5000, "txn_max": 10000, "duration_min": 60, "duration_max": 120},
|
|
129
|
+
"严重故障": {"txn_min": 10000, "txn_max": None, "duration_min": 120, "duration_max": None},
|
|
130
|
+
},
|
|
131
|
+
}
|
|
132
|
+
rank = {"未达故障定级": 0, "轻微故障": 1, "一般故障": 2, "严重故障": 3}
|
|
133
|
+
matched = "未达故障定级"
|
|
134
|
+
evidence = []
|
|
135
|
+
|
|
136
|
+
for level, rule in thresholds.get(category, thresholds["小型单位"]).items():
|
|
137
|
+
if abnormal_txn_count is not None:
|
|
138
|
+
txn_max = rule["txn_max"]
|
|
139
|
+
if abnormal_txn_count >= rule["txn_min"] and (txn_max is None or abnormal_txn_count < txn_max):
|
|
140
|
+
if rank[level] > rank[matched]:
|
|
141
|
+
matched = level
|
|
142
|
+
evidence.append(f"异常交易笔数{abnormal_txn_count}笔命中{category}{level}标准")
|
|
143
|
+
if duration_minutes is not None:
|
|
144
|
+
duration_max = rule["duration_max"]
|
|
145
|
+
if duration_minutes >= rule["duration_min"] and (duration_max is None or duration_minutes < duration_max):
|
|
146
|
+
if rank[level] > rank[matched]:
|
|
147
|
+
matched = level
|
|
148
|
+
evidence.append(f"异常持续{duration_minutes}分钟命中{category}{level}标准")
|
|
149
|
+
|
|
150
|
+
return {
|
|
151
|
+
"unit_name": unit_name,
|
|
152
|
+
"unit_category": category,
|
|
153
|
+
"fault_level": matched,
|
|
154
|
+
"evidence": evidence or ["未提供足够指标或未达到轻微故障阈值"],
|
|
155
|
+
"rule": "异常交易笔数与异常持续时间为或关系,满足其中一项即可定级;同时满足多个标准时按最高级别确定",
|
|
156
|
+
"aftercare": get_fault_aftercare(matched),
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
|
|
160
|
+
def evaluate_operation_scene(
|
|
161
|
+
unit_category: Optional[str] = None,
|
|
162
|
+
unit_name: Optional[str] = None,
|
|
163
|
+
system_success_rate: Optional[float] = None,
|
|
164
|
+
system_failure_count: Optional[int] = None,
|
|
165
|
+
average_latency_ms: Optional[float] = None,
|
|
166
|
+
abnormal_txn_count: Optional[int] = None,
|
|
167
|
+
duration_minutes: Optional[float] = None,
|
|
168
|
+
business_success_drop_pct: Optional[float] = None,
|
|
169
|
+
request_drop_pct: Optional[float] = None,
|
|
170
|
+
bandwidth_usage_pct: Optional[float] = None,
|
|
171
|
+
) -> Dict[str, Any]:
|
|
172
|
+
"""按生产运行场景识别风险、联合处置或关闭渠道策略。"""
|
|
173
|
+
category = unit_category or classify_member_unit(unit_name).get("category")
|
|
174
|
+
evidence = []
|
|
175
|
+
scene = "未触发明确处置场景"
|
|
176
|
+
action = "继续监控,补充系统成功率、失败笔数、耗时、异常交易数量、持续时间等指标后再判断"
|
|
177
|
+
|
|
178
|
+
risk_failure_threshold = {"大型单位": 100, "中型单位": 50, "小型单位": 10}[category]
|
|
179
|
+
if (
|
|
180
|
+
system_success_rate is not None and system_success_rate < 99.99
|
|
181
|
+
and system_failure_count is not None and system_failure_count > risk_failure_threshold
|
|
182
|
+
and duration_minutes is not None and duration_minutes >= 5
|
|
183
|
+
):
|
|
184
|
+
scene = "存在运行风险"
|
|
185
|
+
evidence.append(f"{category}平均系统成功率低于99.99%,系统失败笔数>{risk_failure_threshold}笔,持续达到5分钟")
|
|
186
|
+
action = "异常方重点关注并尽快排查,影响方保持关注并及时同步信息"
|
|
187
|
+
|
|
188
|
+
if business_success_drop_pct is not None and business_success_drop_pct > 20:
|
|
189
|
+
scene = "存在运行风险"
|
|
190
|
+
evidence.append("业务成功率较正常情况下降超过20%,需先与相关方排查确认")
|
|
191
|
+
action = "异常方重点关注并尽快排查,影响方保持关注并及时同步信息"
|
|
192
|
+
if request_drop_pct is not None and request_drop_pct > 20:
|
|
193
|
+
scene = "存在运行风险"
|
|
194
|
+
evidence.append("交易请求数量较正常情况下降超过20%,需先与相关方排查确认")
|
|
195
|
+
if bandwidth_usage_pct is not None and bandwidth_usage_pct > 60:
|
|
196
|
+
scene = "存在运行风险"
|
|
197
|
+
evidence.append("带宽容量超过60%预警指标")
|
|
198
|
+
|
|
199
|
+
if (
|
|
200
|
+
(system_success_rate is not None and system_success_rate < 90 and duration_minutes is not None and duration_minutes >= 1)
|
|
201
|
+
or (average_latency_ms is not None and average_latency_ms >= 2000 and duration_minutes is not None and duration_minutes >= 1 and category != "小型单位")
|
|
202
|
+
or (abnormal_txn_count is not None and abnormal_txn_count >= 1000)
|
|
203
|
+
or (business_success_drop_pct is not None and business_success_drop_pct > 40)
|
|
204
|
+
or (request_drop_pct is not None and request_drop_pct > 40)
|
|
205
|
+
):
|
|
206
|
+
scene = "出现业务异常-联合处置"
|
|
207
|
+
evidence.append("命中联合处置类业务异常指标")
|
|
208
|
+
action = "异常方按应急预案处置并同步处理结果和根因;影响方根据实际情况降低受影响业务流量"
|
|
209
|
+
|
|
210
|
+
close_abnormal_threshold = {"大型单位": 500000, "中型单位": 250000, "小型单位": 100000}[category]
|
|
211
|
+
if (
|
|
212
|
+
(system_success_rate is not None and system_success_rate < 30 and duration_minutes is not None and duration_minutes >= 1)
|
|
213
|
+
or (abnormal_txn_count is not None and abnormal_txn_count >= close_abnormal_threshold)
|
|
214
|
+
or (business_success_drop_pct is not None and business_success_drop_pct > 60)
|
|
215
|
+
or (request_drop_pct is not None and request_drop_pct > 60)
|
|
216
|
+
):
|
|
217
|
+
scene = "出现业务异常-关闭渠道"
|
|
218
|
+
evidence.append(f"命中关闭渠道类业务异常指标,{category}异常交易数量阈值为{close_abnormal_threshold}笔")
|
|
219
|
+
action = "异常方按应急预案处置并同步结果和根因;影响方根据实际情况暂停受影响业务交易发送"
|
|
220
|
+
|
|
221
|
+
fault_grade = evaluate_fault_grade(category, unit_name, abnormal_txn_count, duration_minutes)
|
|
222
|
+
return {
|
|
223
|
+
"unit_name": unit_name,
|
|
224
|
+
"unit_category": category,
|
|
225
|
+
"scene": scene,
|
|
226
|
+
"evidence": evidence or ["未命中指引中的明确阈值"],
|
|
227
|
+
"recommended_action": action,
|
|
228
|
+
"fault_grade_reference": fault_grade,
|
|
229
|
+
"recovery_strategy": BUSINESS_GUIDANCE["recovery"]["content"],
|
|
230
|
+
}
|
|
231
|
+
|
|
232
|
+
|
|
233
|
+
def evaluate_change_strategy(
|
|
234
|
+
system_success_rate: Optional[float] = None,
|
|
235
|
+
impact_fault_level: Optional[str] = None,
|
|
236
|
+
requires_shutdown: bool = False,
|
|
237
|
+
requires_key_guarantee: bool = False,
|
|
238
|
+
has_special_rule: bool = False,
|
|
239
|
+
emergency_notice_minutes: Optional[int] = None,
|
|
240
|
+
) -> Dict[str, Any]:
|
|
241
|
+
"""按生产变更影响评估和通知时间给出处置策略。"""
|
|
242
|
+
scene = "场景一"
|
|
243
|
+
action = "变更发起方提前填报/发送变更通知并完成操作;变更影响方保持关注"
|
|
244
|
+
evidence = []
|
|
245
|
+
|
|
246
|
+
if has_special_rule:
|
|
247
|
+
scene = "场景六"
|
|
248
|
+
action = "按具体方案实施处置,不计入质量评价"
|
|
249
|
+
evidence.append("变更期间有监管要求、有损演练等特殊规定操作")
|
|
250
|
+
elif requires_key_guarantee:
|
|
251
|
+
scene = "场景五"
|
|
252
|
+
action = "变更发起方提前1周向网联平台提出保障申请,由网联平台组织三方确认流程、策略和联系人"
|
|
253
|
+
evidence.append("变更期间需要重点保障")
|
|
254
|
+
elif requires_shutdown:
|
|
255
|
+
scene = "场景四"
|
|
256
|
+
action = "变更发起方提前通知并执行变更;变更影响方关闭渠道"
|
|
257
|
+
evidence.append("变更期间需要停业或持续中断业务")
|
|
258
|
+
elif impact_fault_level in {"一般故障", "严重故障"}:
|
|
259
|
+
scene = "场景三"
|
|
260
|
+
action = "变更发起方提前通知并执行变更;变更影响方关闭渠道,可根据实际情况发探测渠道健康的交易"
|
|
261
|
+
evidence.append("影响业务超过一般故障定义的交易失败笔数")
|
|
262
|
+
elif impact_fault_level == "轻微故障" or (system_success_rate is not None and system_success_rate < 99.99):
|
|
263
|
+
scene = "场景二"
|
|
264
|
+
action = "变更发起方提前通知并在异常交易发生后及时完成账务调整;变更影响方保持关注,可在不关闭渠道前提下处置"
|
|
265
|
+
evidence.append("变更期间系统成功率抖动并造成一定业务影响")
|
|
266
|
+
else:
|
|
267
|
+
evidence.append("变更期间系统成功率预计保持不低于99.99%")
|
|
268
|
+
|
|
269
|
+
notice_judgement = None
|
|
270
|
+
if emergency_notice_minutes is not None:
|
|
271
|
+
if emergency_notice_minutes < 30:
|
|
272
|
+
notice_judgement = "紧急通知提前时间小于30分钟,影响方仍应尽量配合;如造成异常,记录为变更发起方问题"
|
|
273
|
+
else:
|
|
274
|
+
notice_judgement = "紧急通知提前时间大于等于30分钟,影响方应尽快配合;如造成异常,记录为变更影响方问题"
|
|
275
|
+
|
|
276
|
+
return {
|
|
277
|
+
"change_scene": scene,
|
|
278
|
+
"evidence": evidence,
|
|
279
|
+
"recommended_action": action,
|
|
280
|
+
"notice_judgement": notice_judgement,
|
|
281
|
+
}
|
|
282
|
+
|
|
283
|
+
|
|
284
|
+
FUNCTION_MAP = {
|
|
285
|
+
"classify_member_unit": classify_member_unit,
|
|
286
|
+
"get_ops_guidance": get_ops_guidance,
|
|
287
|
+
"evaluate_operation_scene": evaluate_operation_scene,
|
|
288
|
+
"evaluate_fault_grade": evaluate_fault_grade,
|
|
289
|
+
"get_fault_aftercare": get_fault_aftercare,
|
|
290
|
+
"evaluate_change_strategy": evaluate_change_strategy,
|
|
291
|
+
}
|
|
292
|
+
|
|
293
|
+
|
|
294
|
+
tools = [
|
|
295
|
+
{
|
|
296
|
+
"type": "function",
|
|
297
|
+
"function": {
|
|
298
|
+
"name": "classify_member_unit",
|
|
299
|
+
"description": "当用户提到具体银行、支付机构、成员单位或日均交易量,并且需要按大型/中型/小型单位套用阈值时调用。",
|
|
300
|
+
"parameters": {
|
|
301
|
+
"type": "object",
|
|
302
|
+
"properties": {
|
|
303
|
+
"unit_name": {"type": "string", "description": "成员单位名称,例如工商银行、支付宝、网银在线"},
|
|
304
|
+
"daily_txn_count": {"type": "integer", "description": "上一年全年日均交易量,单位为笔;用户未提供时不要编造"},
|
|
305
|
+
},
|
|
306
|
+
},
|
|
307
|
+
},
|
|
308
|
+
},
|
|
309
|
+
{
|
|
310
|
+
"type": "function",
|
|
311
|
+
"function": {
|
|
312
|
+
"name": "get_ops_guidance",
|
|
313
|
+
"description": "当用户询问联合运维制度解释、业务范围、单位分类、生产变更、生产运行、故障定级、恢复策略、周期评价等概念时调用。",
|
|
314
|
+
"parameters": {
|
|
315
|
+
"type": "object",
|
|
316
|
+
"properties": {
|
|
317
|
+
"topic": {
|
|
318
|
+
"type": "string",
|
|
319
|
+
"enum": [
|
|
320
|
+
"business_scope",
|
|
321
|
+
"unit_classification",
|
|
322
|
+
"production_change",
|
|
323
|
+
"production_operation",
|
|
324
|
+
"fault_grading",
|
|
325
|
+
"recovery",
|
|
326
|
+
"periodic_evaluation",
|
|
327
|
+
],
|
|
328
|
+
"description": "用户问题对应的业务主题",
|
|
329
|
+
},
|
|
330
|
+
},
|
|
331
|
+
"required": ["topic"],
|
|
332
|
+
},
|
|
333
|
+
},
|
|
334
|
+
},
|
|
335
|
+
{
|
|
336
|
+
"type": "function",
|
|
337
|
+
"function": {
|
|
338
|
+
"name": "evaluate_operation_scene",
|
|
339
|
+
"description": "当用户给出运行指标并询问是否存在运行风险、是否业务异常、是否需要联合处置/关闭渠道/恢复时调用。不要用于生产变更报备问题。",
|
|
340
|
+
"parameters": {
|
|
341
|
+
"type": "object",
|
|
342
|
+
"properties": {
|
|
343
|
+
"unit_category": {"type": "string", "enum": ["大型单位", "中型单位", "小型单位"], "description": "已知单位分类;未知时可传unit_name"},
|
|
344
|
+
"unit_name": {"type": "string", "description": "成员单位名称"},
|
|
345
|
+
"system_success_rate": {"type": "number", "description": "平均系统成功率百分数,例如99.95表示99.95%"},
|
|
346
|
+
"system_failure_count": {"type": "integer", "description": "系统失败笔数"},
|
|
347
|
+
"average_latency_ms": {"type": "number", "description": "平均耗时,毫秒"},
|
|
348
|
+
"abnormal_txn_count": {"type": "integer", "description": "异常交易数量,笔"},
|
|
349
|
+
"duration_minutes": {"type": "number", "description": "异常或指标持续时间,分钟"},
|
|
350
|
+
"business_success_drop_pct": {"type": "number", "description": "业务成功率较正常情况下降百分比"},
|
|
351
|
+
"request_drop_pct": {"type": "number", "description": "交易请求数量较正常情况下降百分比"},
|
|
352
|
+
"bandwidth_usage_pct": {"type": "number", "description": "带宽容量使用率百分数"},
|
|
353
|
+
},
|
|
354
|
+
},
|
|
355
|
+
},
|
|
356
|
+
},
|
|
357
|
+
{
|
|
358
|
+
"type": "function",
|
|
359
|
+
"function": {
|
|
360
|
+
"name": "evaluate_fault_grade",
|
|
361
|
+
"description": "当用户询问故障属于轻微/一般/严重,或提供异常交易笔数、异常持续时间要求定级时调用。",
|
|
362
|
+
"parameters": {
|
|
363
|
+
"type": "object",
|
|
364
|
+
"properties": {
|
|
365
|
+
"unit_category": {"type": "string", "enum": ["大型单位", "中型单位", "小型单位"], "description": "已知单位分类;未知时可传unit_name"},
|
|
366
|
+
"unit_name": {"type": "string", "description": "成员单位名称"},
|
|
367
|
+
"abnormal_txn_count": {"type": "integer", "description": "异常交易数量,笔"},
|
|
368
|
+
"duration_minutes": {"type": "number", "description": "异常持续时间,分钟"},
|
|
369
|
+
},
|
|
370
|
+
},
|
|
371
|
+
},
|
|
372
|
+
},
|
|
373
|
+
{
|
|
374
|
+
"type": "function",
|
|
375
|
+
"function": {
|
|
376
|
+
"name": "get_fault_aftercare",
|
|
377
|
+
"description": "当用户询问轻微/一般/严重故障的账务调整时限、善后处置要求时调用。",
|
|
378
|
+
"parameters": {
|
|
379
|
+
"type": "object",
|
|
380
|
+
"properties": {
|
|
381
|
+
"fault_level": {"type": "string", "enum": ["轻微故障", "一般故障", "严重故障"], "description": "故障级别"},
|
|
382
|
+
},
|
|
383
|
+
"required": ["fault_level"],
|
|
384
|
+
},
|
|
385
|
+
},
|
|
386
|
+
},
|
|
387
|
+
{
|
|
388
|
+
"type": "function",
|
|
389
|
+
"function": {
|
|
390
|
+
"name": "evaluate_change_strategy",
|
|
391
|
+
"description": "当用户询问生产变更影响评估、变更场景一至六、是否关闭渠道、重点保障、特殊规定、紧急通知时间责任归属时调用。",
|
|
392
|
+
"parameters": {
|
|
393
|
+
"type": "object",
|
|
394
|
+
"properties": {
|
|
395
|
+
"system_success_rate": {"type": "number", "description": "变更期间预计或实际系统成功率百分数"},
|
|
396
|
+
"impact_fault_level": {"type": "string", "enum": ["轻微故障", "一般故障", "严重故障"], "description": "预计或实际影响达到的故障级别"},
|
|
397
|
+
"requires_shutdown": {"type": "boolean", "description": "变更期间是否需要停业或持续中断业务"},
|
|
398
|
+
"requires_key_guarantee": {"type": "boolean", "description": "变更期间是否需要重点保障"},
|
|
399
|
+
"has_special_rule": {"type": "boolean", "description": "是否存在监管要求、有损演练等特殊规定操作"},
|
|
400
|
+
"emergency_notice_minutes": {"type": "integer", "description": "紧急通知提前时间,分钟"},
|
|
401
|
+
},
|
|
402
|
+
},
|
|
403
|
+
},
|
|
404
|
+
},
|
|
405
|
+
]
|
|
406
|
+
|
|
407
|
+
|
|
408
|
+
def call_function(name: str, arguments: str) -> str:
|
|
409
|
+
"""根据函数名和参数字符串调用对应函数,返回 JSON 字符串结果。"""
|
|
410
|
+
func = FUNCTION_MAP.get(name)
|
|
411
|
+
if func is None:
|
|
412
|
+
return json.dumps({"error": f"未知函数: {name}"}, ensure_ascii=False)
|
|
413
|
+
|
|
414
|
+
try:
|
|
415
|
+
args = json.loads(arguments) if arguments else {}
|
|
416
|
+
result = func(**args)
|
|
417
|
+
return json.dumps(result, ensure_ascii=False)
|
|
418
|
+
except json.JSONDecodeError as e:
|
|
419
|
+
return json.dumps({"error": f"工具参数不是合法JSON: {str(e)}", "raw_arguments": arguments}, ensure_ascii=False)
|
|
420
|
+
except Exception as e:
|
|
421
|
+
return json.dumps({"error": f"函数执行异常: {str(e)}"}, ensure_ascii=False)
|
|
File without changes
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
from src.service.chat_service import ChatService
|
|
2
|
+
from src.utils.function_utils import (
|
|
3
|
+
classify_member_unit,
|
|
4
|
+
evaluate_change_strategy,
|
|
5
|
+
evaluate_fault_grade,
|
|
6
|
+
evaluate_operation_scene,
|
|
7
|
+
)
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
def test_question_filter_allowed():
|
|
11
|
+
"""测试允许的问题"""
|
|
12
|
+
svc = ChatService()
|
|
13
|
+
# 通过反射调用私有方法测试
|
|
14
|
+
assert svc._check_question_valid("工商银行系统成功率下降怎么处置") is True
|
|
15
|
+
assert svc._check_question_valid("生产变更需要关闭渠道吗") is True
|
|
16
|
+
assert svc._check_question_valid("严重故障账务调整时限是多少") is True
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
def test_question_filter_rejected():
|
|
20
|
+
"""测试被拒绝的问题"""
|
|
21
|
+
svc = ChatService()
|
|
22
|
+
assert svc._check_question_valid("今天天气怎么样") is False
|
|
23
|
+
assert svc._check_question_valid("讲个笑话") is False
|
|
24
|
+
assert svc._check_question_valid("推荐一部电影") is False
|
|
25
|
+
|
|
26
|
+
|
|
27
|
+
def test_rejected_response_format():
|
|
28
|
+
"""测试拒绝返回格式"""
|
|
29
|
+
svc = ChatService()
|
|
30
|
+
result = next(svc.tool_call_stream("session-test", "讲个笑话", tools=[]))
|
|
31
|
+
assert result["session_id"] == "session-test"
|
|
32
|
+
assert result["finish_reason"] == "rejected"
|
|
33
|
+
assert result["delta"]
|
|
34
|
+
|
|
35
|
+
|
|
36
|
+
def test_conversation_history_uses_session_id():
|
|
37
|
+
"""测试对话上下文按session_id隔离"""
|
|
38
|
+
svc = ChatService()
|
|
39
|
+
svc._append_exchange("session-a", "问题A", "回答A")
|
|
40
|
+
svc._append_exchange("session-b", "问题B", "回答B")
|
|
41
|
+
|
|
42
|
+
messages = svc._build_messages("session-a", "后续问题")
|
|
43
|
+
|
|
44
|
+
assert {"role": "user", "content": "问题A"} in messages
|
|
45
|
+
assert {"role": "assistant", "content": "回答A"} in messages
|
|
46
|
+
assert {"role": "user", "content": "问题B"} not in messages
|
|
47
|
+
|
|
48
|
+
|
|
49
|
+
def test_classify_member_unit_by_name():
|
|
50
|
+
assert classify_member_unit(unit_name="支付宝")["category"] == "大型单位"
|
|
51
|
+
assert classify_member_unit(unit_name="网银在线")["category"] == "中型单位"
|
|
52
|
+
|
|
53
|
+
|
|
54
|
+
def test_evaluate_fault_grade_uses_highest_matched_rule():
|
|
55
|
+
result = evaluate_fault_grade(unit_category="大型单位", abnormal_txn_count=1200, duration_minutes=35)
|
|
56
|
+
assert result["fault_level"] == "严重故障"
|
|
57
|
+
assert "或关系" in result["rule"]
|
|
58
|
+
|
|
59
|
+
|
|
60
|
+
def test_evaluate_operation_scene_close_channel():
|
|
61
|
+
result = evaluate_operation_scene(
|
|
62
|
+
unit_category="中型单位",
|
|
63
|
+
system_success_rate=25,
|
|
64
|
+
duration_minutes=1,
|
|
65
|
+
abnormal_txn_count=260000,
|
|
66
|
+
)
|
|
67
|
+
assert result["scene"] == "出现业务异常-关闭渠道"
|
|
68
|
+
assert "暂停受影响业务交易发送" in result["recommended_action"]
|
|
69
|
+
|
|
70
|
+
|
|
71
|
+
def test_evaluate_change_strategy_shutdown():
|
|
72
|
+
result = evaluate_change_strategy(requires_shutdown=True, emergency_notice_minutes=20)
|
|
73
|
+
assert result["change_scene"] == "场景四"
|
|
74
|
+
assert "关闭渠道" in result["recommended_action"]
|
|
75
|
+
assert "小于30分钟" in result["notice_judgement"]
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
网络支付清算平台 联合运维 运行实践指引 V 1.0
|
|
2
|
+
|
|
3
|
+
目 录 前言 ................................ ................................ ................................ ................................ ................................ ...... 3 网络支付清算平台联合运维运行实践指引 ................................ ................................ ................................ ...... 4 1 范围 ................................ ................................ ................................ ................................ ...................... 4 2 规范性引用文件 ................................ ................................ ................................ ................................ .. 4 3 整体说明 ................................ ................................ ................................ ................................ .............. 4 3.1 业务范围 ................................ ................................ ................................ ................................ .. 4 3.2 单位分类 ................................ ................................ ................................ ................................ .. 4 3.3 生产变更 ................................ ................................ ................................ ................................ .. 4 3.4 生产运行 ................................ ................................ ................................ ................................ .. 5 3.5 周期评价 ................................ ................................ ................................ ................................ .. 5 4 生产变更指引 ................................ ................................ ................................ ................................ ...... 5 4.1 概述 ................................ ................................ ................................ ................................ .......... 5 4.2 变更评估与操作策略 ................................ ................................ ................................ .............. 5 4.3 变更异常处置策略 ................................ ................................ ................................ .................. 7 4.4 变更质量评价 ................................ ................................ ................................ .......................... 7 5 生产运行指引 ................................ ................................ ................................ ................................ ...... 9 5.1 概述 ................................ ................................ ................................ ................................ .......... 9 5.2 运行场景与处置策略 ................................ ................................ ................................ .............. 9 5.3 运行故障定级 ................................ ................................ ................................ ........................ 11 5.4 故障善后处置 ................................ ................................ ................................ ........................ 12 6 周期评价指引 ................................ ................................ ................................ ................................ .... 12 6.1 概述 ................................ ................................ ................................ ................................ ........ 12 6.2 评价对象 ................................ ................................ ................................ ................................ 12 6.3 评价周期 ................................ ................................ ................................ ................................ 12 6.4 评价内容 ................................ ................................ ................................ ................................ 12 6.5 评价定级 ................................ ................................ ................................ ................................ 14 附 录 A 运行指标 ................................ ................................ ................................ ................................ ...... 15 附 录 B 单位分类 ................................ ................................ ................................ ................................ ...... 16 参考文献 ................................ ................................ ................................ ................................ ............................ 17
|
|
4
|
+
|
|
5
|
+
前 言 本指引由网联清算有限公司提出。 本指引主要起草单位:网联清算有限公司、中国工商银行股份有限公司、中国农业银行股份有限公 司、中国银行股份有限公司、中国建设银行股份有限公司、交通银行股份有限公司、中国邮政储蓄银行 股份有限公司、中信银行股份有限公司、中国光大银行股份有限公司、中国民生银行股份有限公司、招 商银行股份有限公司、广发银行股份有限公司、上海浦东发展银行股份有限公司、农信银资金清算中心 有限责任公司、支付宝(中国)网络技术有限公司、财付通支付科技有限公司、网银在线(北京)科技 有限公司。 本指 引最终解释权归网联所有,由网联负责组织本指引的修订完善。 本指引主要起草人:唐龙飞、李阳、于佳馨、 王珏琦、 顾振捷、肖德敏、陆高平、李正山、刘威、 张胜男、袁荣、 许谷城、 孔楠、王炜、袁振州、孙宇鹏、周艳庆、张琪、缴建、陈志明、崔航、岳海辉、 赵晨、刘安飞、阳俊将、周扬帆、唐奡、戴炜明、邹高锋、封雄娃、王恒、赵斌鸿、任凌舒、彭健铿、 周志斌、郑黎鸣、姜海燕、关涵。
|
|
6
|
+
|
|
7
|
+
网络支付清算平台联合运维 运行实践指引 1 范围 本指引规定了网络支付清算平台 (以下简称“网联平台”) 主要业务在全链路 生产运行过程中, 根 据联合运维机制的条款内容, 针对不同运行场景 / 指标 ,具体实践内容和细节的指引与标准。 本指引适用于 网络支付清算平台联合运维全部成员单位, 作为生产变更、 生产运行 、周期评价等相 关工作的指引, 为成员单位生产运行优化提升明确目标方向。 成员单位可以根据自身业务特性和角色特 征在此指引 的 基础上进行适应性安排。 2 规范性引用文件 下列文件对于本文件的应用是必不可少的。 凡是注日期的引用文件, 仅注日期的版本适用于本文件。 凡是不注日期的引用文件,其最新版本(包括所有的修改单)适用于本文件。 Q - NUC 102 网络支付清算平台 报文交换技术规范 网络支付清算平台 联合运维机制 网络支付清算平台 联合运维实施规范 3 整体说明 3.1 业务范围 本指引主要面向网联平台签约、解约、快捷支付、付款、退款、代收、网关支付等业务(此版本暂 不包含条码业务) 。 3.2 单位分类 本指引中的单位分类是指将联合运维成员单位按照生产运行过程中的业务规模大小分为三类,参 考上一年全年日均交易量,日均交易量大于等于 2000 万笔为大型单位,日均交易量大于等于 500 万笔且 小于 2000 万笔为中型单位,日均交易量小于 500 万笔为小型单位,如遇到交易量大幅波动等特殊情况将 特殊处理 ,具体分类详见 附录 B 单位分类 。 3.3 生产变更 本指引中对于“生产变更”的定义既包括狭义概念上的技术变更、数据变更,也包括整体系统升级 或系统更改、应用版本投产、应急演练、灾备切换、紧急补丁等改变银行、支付机构、以及 网联平台 任 何一方或多方涉及 主要业务 全链路的各种系统节点与硬件设施环境的操作。
|
|
8
|
+
|
|
9
|
+
3.4 生产运行 本指引中的 “生产运行” 主要为应对生产运行中出现风险或者异常时, 指导联合运维各方 妥善处置, 保证业务连续性。包括事前的对于风险或者异常场景的识别,事中的处置策略、升级策略、恢复策略, 以及事后的故障定级和善后处置等。 3.5 周期评价 本指引中的“周期评价”主要是面向生产变更以及生产运行的质量评价,通过将联合运维各方的评 价内容和评价指标尽可能对齐, 增强联合运维各方对于业务连续性水平提升的进一步理解。 4 生产变更 指引 4.1 概述 为保证 各个成员单位在日常生产期间严格 把控变更流程、 变更管理、变更实施的质量 , 做到 对于变 更的业务影响情况,能够提前关注并进行全面评估,科学地确认变更对于 业务的影响与隐患,并务必提 前对于变更的业务影响通知到所有干系人, 特建立生产变更联合运维实践指引以及相对应的评价体系 。 同时 ,本指引也具有推动 银行、支付机构、网联 研究进一步优化变更管理 、发布版本的业务影响 最终达 到无损发布的作用 。 4.2 变更评估 与操作策略 4 .2.1 变更 影响 评估 评估 场景一: 变更期间,系统成功率 ≥ 99.99% 持续时间 生产变更全程 操作策略 变更发起方:按照联合运维实施规范提前填报 / 发送变更通知,并根据同步的通知信 息完成生产变更操作; 变更影响方:保持关注; 评估 场景二:变更期间,系统成功率抖动,造成一定业务影响 影响规模 影响业务不超过 一般故障 定义的交易失败 笔数 (参见 5.3 运行故障定级 ) 操作策略 变更发起方: 按照联合运维实施规范提前填报 / 发送变更通知,并根据同步的通知信息 完成生产变更操作 ,在有异常交易发生后, 应 及时 完成账务调整。 变更影响方:保持关注 (在不关闭渠道的前提下,可以根据受影响情况进行相应处 置) ; 说明: 对于账务调整,变更发起方应在处理完成后, 第一时间与 网联 平台 同步信息 。对于未向网联平台 同步相关信息的,在评价中 将视为未及时调整。
|
|
10
|
+
|
|
11
|
+
评估 场景三:变更期间,系统成功率抖动,超过一定业务影响 影响规模 影响业务超过 一般故障 定义的交易失败 笔数 (参见 5.3 运行故障定级 ) 操作策略 变更发起方: 按照联合运维实施规范提前填报 / 发送变更通知,并根据同步的通知信息 完成生产变更操作 ; 变更影响方:关闭渠道 (可以根据实际情况发探测渠道健康的交易) ; 评估 场景四: 变更期间,需要停业 / 持续中断业务 持续时间 生产变更全程 操作策略 变更发起方: 按照联合运维实施规范提前填报 / 发送变更通知,并根据同步的通知信息 完成生产变更操作 ; 变更影响方: 关闭渠道 ; 评估 场景五: 变更期间,需要重点保障 持续时间 生产变更全程 操作策略 1 . 由 变更发起方 提前 1 周 向网联平台 提出 保障申请(全年应控制重点保障的数量) ; 2 . 由网联平台组织变更发起方、影响方确认变更流程和内容,讨论明确操作策略,互 通指定保障人员联系方式; 3 . 三方共同按照讨论明确的操作策略处理;(对于变更方间隔关停的需求,影响方应 该予以支持); 说明: 场景举例 —— 核心系统演练(需要间隔关停交易)等。 评估 场景六:变更期间,有特殊规定操作(不计入质量评价) 持续时间 生产变更全程 操作策略 变更发起方: 按照联合运维实施规范提前填报 / 发送变更通知,并根据同步的通知信息 完成生产变更操作 ; 变更影响方: 按照具体方案实施处置 ; 说明: 场景举例 —— 有损演练、监管要求等 。 4 .2.2 信息 通知策略 生产变更 信息 通知 , 即生产运维信息同步, 变更发起方 应按照联合运维实施规范里的要求提前做好 通知工作。 对于 通知 中 的建议操作内容, 应 根据变更 影响 评估进行 处理 。 变更影响方应按照联合运 维实施规范里的要求做好配合工作。 最小紧急通知时间 , 对于紧急通知,如果需要变更影响方配合操作的, 变更发起方 应 提前 经网联平 台通知 到 变更影响方 。提前时间,按照变更影响方确认收到信息后开始计算 。当 提前时间 小于 3 0 分钟,变更影响方仍应尽量配合处置,如果造成异常,将 根据 生产运行故障等级进行处理,并记录 为 生产变更发起方 的 问题。当 提前时间 大于等于 3 0 分钟,变更影响 方 应尽快配合处置,如果造成
|
|
12
|
+
|
|
13
|
+
异常,将记录 为 生产变更影响方 的 问题。 4.3 变更异常处置策略 4 .3.1 非停机异常处置策略 异常场景一: 当 生产变更前 评估为 场景一、场景五 , 在生产变更中 实际发生了 场景二 ; 场景举例 评估变更对生产业务无影响,但实际造成 轻微故障 影响; 操作策略 变更发起方:及时 隔离 / 回滚,并在异常发生的 30 分钟内完成账务处置 ; 变更影响方:保持关注(在不关闭渠道的前提下,可以根据受影响情况进行相应处 置); 说明: 对于账务调整,变更发起方应在处理完成后, 第一时间与 网联 平台 同步信息 。对于未向网联平台 同步相关信息的,在评价中 将视为未及时调整。 异常场景二:当生产变更前评估为场景一、场景五,在生产变更中实际发生了场景三; 场景举例 评估变更对生产业务无影响,但实际造成 严重级别 交易影响; 操作策略 变更发起方:及时 隔离 / 回滚,并在异常发生的 30 分钟内完成账务处置 ; 变更影响方: 按照生产运行故障进行处置 ; 4 .3.2 停机异常处置策略 异常场景三:当生产变更前评估为场景四、场景五,在生产变更中实际需要延长关闭时间; 场景举例 评估变更关闭时间在 2 小时,实际遇到突发情况需要延长至 2. 5 小时; 操作策略 变更发起方: 提前 15 分钟做好通知工作 ; ( 按照变更影响方确认收到信息后开始计 算 ) 变更影响方: 延长关闭受影响渠道时间; 4 .3.3 临场协同处置策略 异常场景四:当生产变更前评估为场景四、场景五,在生产变更中实际需要提前打开渠道; 场景举例 评估变更关闭时间在 4 个小时,实际 2 个小时完成,需要提前打开渠道; 操作策略 变更发起方: 做好通知工作; 变更影响方: 结合自身业务需求配合提前打开渠道( 非 强制) ; 4.4 变更质量评价 4 .4.1 变更通知评价 紧急变更通知率 紧急变更通知率 = 统计时间段内, 紧急变更通知数量 / 变更通知总量 * 100 % ;其中,对于未按照联合 运维实施规范中提前进行信息同步的变更,均作为紧急变更通知;
|
|
14
|
+
|
|
15
|
+
类型 紧急变更 通知 率 优秀 紧急变更通知率 = 0% 良好 0% < 紧急变更通知率 ≤ 40% 中等 40% < 紧急变更通知率 ≤ 60% 差 紧急变更通知率 >60% 精准报备 为进一步提升生产变更的计划性及精准性, 鼓励变更发起方尽可能精确变更时间窗口, 避免报备宽 泛的变更窗口, 对于报备时间窗口与实际变更操作窗口吻合的精确变更, 将在周期评价中进行加分奖励。 4 .4. 2 变更执行 评价 级别 通知 变更期间保持关注 变更期间关闭渠道 优秀 √ 系统成功率保持 ≥ 99.99% — 良好 √ 影响交易达到轻微故障对应笔数,异常发生后, 账务调整 ≤ 30 分钟; 正常关闭 中等 √ 影响交易达到轻微故障对应笔数,异常发生后, 30 分钟 < 账务调整 ≤ 60 分钟; 延长关闭,提前 15 分钟通 知,且未造成额外影响 影响交易达到一般故障对应笔数,异常发生后, 账务调整 ≤ 30 分钟; 差 √ 影响交易达到轻微故障对应笔数,异常发生后, 账务调整 >60 分钟; 延长关闭,且造成额外影响 影响交易达到一般故障对应笔数,异常发生后, 账务调整 >30 分钟; 影响交易达到严重故障对应笔数 提前变更造成影响 影响业务类型 / 账户类型与通知不符,造成影响 × 出现异常,造成影响 说明: 1) 当变更期间既存在保持关注时段,又存在关闭渠道时段,则同时对两部分定级,取级别低的为整个 变更级别。 2) 账务调整时间计算为 异常发生后即开始统计账务处置时间。 3) 考虑到 银行周期大版本上线投产的特性 , 针对“变更期间关闭渠道”的场景, 每个季度给予一次 级 别从“良好” 晋级为 “ 优秀 ” 的机会,全年不超过 4 次。 4.4.3 变更事后 跟踪 对于生产变更, 一旦在实施后产生次生业务 异常 影响, 网联 平台将 与支付机构或者银行侧进行单独 沟通,确认问题和风险的具体情况。对于无业务影响的系统投产和版本发布,由网联 平台将定期 邀请表
|
|
16
|
+
|
|
17
|
+
现卓越的单位进行经验分享。 5 生产运行 指引 5.1 概述 为提升行业业务连续性水平与服务质量, 细化对齐联合运维生产运行各项参考指标, 明确生产运行 异常处置策略 ,特建立 生产运行 指引。 本指引 适用于联合运维覆盖的生产运行场景 , 其中 对于未 上报联 合运维平台的变更 导致的 异常 均 属于生产运行范围。 5.2 运行 场景与 处置策略 5 .2.1 存在运行风险 此阶段 存在一定的运行风险隐患, 异常方应该重点关注相关场景指标 。 如果一直持续出现,或者多 次间歇性出现,异常方 应尽快 排查 原因 ,避免异常影响扩大。如果异常影响迅速扩大,将按照出现业务 异常场景策略进行处置。 场景指标 (符合下列任意一项指标,则触发处置策略) 指标 大型单位 中型单位 小型单位 持续时间 平均 系统成功率 <99.99% 且 系统失败 笔数大于 100 笔 <99.99% 且 系统失败 笔数大于 50 笔 <99.99% 且 系统失败 笔数大于 10 笔 5min ※业务成功率 业务成功率与前一分 钟(正常情况)下降 幅度超过 20% 业务成功率与前一分 钟(正常情况)下降 幅度超过 20% 业务成功率与前一分 钟(正常情况)下降 幅度超过 20% — 平均耗时 ≥ 1000ms ≥ 1000ms — 2 min ※交易请求数量 交易请求数量与前一 分钟(正常情况)相 比下降幅度超过 20% 交易请求数量与前一 分钟(正常情况)相 比下降幅度超过 20% 交易请求数量与前一 分钟(正常情况)相 比下降幅度超过 20% — 带宽容量 >60% (预警指标) >60% (预警指标) >60% (预警指标) — ※代表参考指标,不作为系统决策指标,当场景触达参考指标,应先与相关方排查确认,再进行处置。 处置策略 异常方 重点关注,尽快排查,消除运行风险 。 影响方 保持关注,及时同步信息。 5 .2.2 出现业务异常 异常场景一:联合处置 此阶段对业务出现一定异常影响, 异常方和影响方均应该关注相关场景指标, 并采取一定的处置策 略避免异常影响进一步扩大 。 场景指标 (符合下列任意一项指标,则触发处置策略)
|
|
18
|
+
|
|
19
|
+
指标 大型单位 中型单位 小型单位 持续时间 平均 系统成功率 <90% <90% <90% 1min ※业务成功率 业务成功率与前一 分钟(正常情况)下 降幅度超过 40% 业务成功率与前一 分钟(正常情况)下 降幅度超过 40% 业务成功率与前一 分钟(正常情况)下 降幅度超过 40% — 平均耗时 ≥ 2000ms ≥ 2000ms — 1min ※交易请求数量 交易请求数量与前一 分钟下降超过 40% 交易请求数量与前一 分钟下降超过 40% 交易请求数量与前一 分钟下降超过 40% — 异常交易数量 1,000 1 ,000 1 ,000 — ※代表参考指标,当场景触达参考指标,应先进行排查确认,再进行处置。 处置策略 异常方 按照应急预案处置 , 异常方及时与网联平台同步异常处理结果和问题根本原因。 影响方 根据实际情况,降低受影响业务流量,减少异常影响 。 异常场景二:关闭渠道 此阶段对业务出现较大异常影响,异常方和影响方均应该关注相关场景指标,并联动止血。 场景 指标 (符合下列任意一项指标,则触发处置策略) 指标 大型单位 中型单位 小型单位 持续时间 平均 系统成功率 <30% <30% <30% 1min ※业务成功率 业务成功率与前一 分钟(正常情况)下 降幅度超过 60% 业务成功率与前一分 钟(正常情况)下降 幅度超过 60% 业务成功率与前一分 钟(正常情况)下降 幅度超过 60% — ※交易请求数量 交易请求数量与前一 分钟下降超过 60% 交易请求数量与前一 分钟下降超过 60% 交易请求数量与前一 分钟下降超过 60% — 异常交易数量 500,000 250,000 100,000 — ※代表参考指标,当场景触达参考指标,应先进行排查确认,再进行处置。 处置策略 异常方 按照应急预案处置 , 异常方及时与网联平台同步异常处理结果和问题根本原因。 影响方 根据实际情况,暂停受影响业务交易发送。 说明: 对于暂停受影响业务交易发送,网联平台在上述场景指标的基础上,将同时参考 上报监管 指标 情况,进行联动协调处置。 5 .2.3 处置 升级策略 升级场景一: 一般事件升级 场景指标 ( 符合下列任意一项指标,则触发处置策略)
|
|
20
|
+
|
|
21
|
+
指标 大型单位 中型单位 小型单位 异常交易数量 >25000 笔 >10000 笔 >5000 笔 异常持续时间 ≥ 10 分钟 ≥ 30 分钟 ≥ 60 分钟 处置策略: 按照事中升级策略 ,网联平台将 升级联系异常方联合运维接口人 / 运维升级联系人 。 升级场景二:严重事件升级 场景指标 ( 符合下列任意一项指标,则触发处置策略) 指标 大型单位 中型单位 小型单位 异常交易数量 >50000 笔 >25000 笔 >10000 笔 异常持续时间 ≥ 30 分钟 ≥ 60 分钟 ≥ 120 分钟 处置策略: 按照事中升级策略 ,网联平台将 升级联系异常方 运维 / 科技 部门 相关 负责人 。 5.2.4 恢复策略 异常方应在故障修复后第一时间通知平台, 平台根据通知同步到影响方, 影响方根据平台通知灰度 恢复业务; 如影响方恢复业务过程中反复发生故障, 平台应在异常方恢复后再观察一段时间通知影响方 灰度恢复业务。 5.3 运行故障定级 级别 类别 异常影响 异常持续时间 轻微 故障 大型单位 异常交易笔数 [1000,25000) <10min 中型单位 异常交易笔数 [1000,10000) <30min 小型单位 异常交易笔数 [500,5000) <60min 一般 故障 大型单位 异常交易笔数 [25000,50000) [10min,30min) 中型单位 异常交易笔数 [10000,25000) [30min,60min) 小型单位 异常交易笔数 [5000,10000) [60min,120min ) 严重 故障 大型单位 异常交易笔数 ≥ 50000 ≥ 30min 中型单位 异常交易笔数 ≥ 25000 ≥ 60min 小型单位 异常交易笔数 ≥ 10000 ≥ 120min 说明: 1 )异常影响与异常持续时间为“或”的关系,满足其中一项指标 即可 定级 ; 当同时满足多个故障定级 标准时,按最高级别确定故障等级 ; 2 ) 网联平台将根据中国人民银行支付结算司下发的 《关于建立支付清算系统安全事件日报制度的通知》 要求,对于如下故障情形将按日上报至中国人民银行支付结算司: 场景 1 :平台或成员机构引起业务影响超过 10 万笔。 场景 2 :平台引起的业务影响超过 5 分钟。 场景 3 :主要成员机构(国有银行、股份制、支付宝、财付通)故障影响超过 10 分钟(含间歇性或
|
|
22
|
+
|
|
23
|
+
者未完全恢复) 。 场景 4 :其他成员机构引起业务影响超过 30 分钟(含间歇性或者未完全恢复) ,且故障期间平均系 统成功率为日常均值的 50% 以下。 场景 5 :其余触发舆情影响的安全事件。 5.4 故障善后处置 级别 善后处置时间 轻微 应在 1 个自然日内完成账务调整 一般 应在 2 个小时内完成账务调整 严重 应在 3 0 分钟内完成账务调整 说明: 对于账务调整, 故障方 应在处理完成后, 第一时间与 网联 平台 同步信息 , 否则将视为未及时调整。 6 周期评价 指引 6.1 概述 为更全面的 反映 一段时间内 各家 单位 的 生产运行质量, 在变更质量 评价 以及故障 定级 的基础上, 特 制定 周期评价。周期评价主要关注于统计周期内的生产运行稳定性、正常提供服务 的 时长、故障数量 与 累计影响, 以及客诉 与 负面影响。 通过对运行质量 的 量化评价, 帮助成员单位发现生产运行问题 / 短板, 为成员单位明确后续优化提升的方向和目标。 6.2 评价对象 以联合运维 成员单位 为主。对于网联平台自身运行情况,将在紧急变更通知情况、 支付清算系统安 全事件、 客诉舆情等方面参照指引内容进行定期回顾。 6.3 评价周期 周 , 是按自然 周 进行周期评价, 主要是为及时回顾当周运行情况以及问题情况。 月 , 是按自然月进行周期评价,主要是为发现生产运行问题 / 短板,明确优化提升方向和目标。 年 , 是按半年 / 全年进行周期评价,主要是为对生产运行情况进行整体评价,并进行评优。 6.4 评价内容 6 .4.1 日常运行情况 日常运行情况从系统成功率、正常服务时间、运行稳定性以及平均耗时几个维度进行评价: 运行标准 计分 周 月 年 权重 系统成功率 — [90%,100%] 0 - 100 10% 正常服务时间 — 非异常 & 非停机 服务时间率 =[99%,100%] 10% 运行稳定性 — 系统成功率 / 平均耗时标准差 5%
|
|
24
|
+
|
|
25
|
+
运行标准 计分 周 月 年 权重 平均耗时 大型单位 ( 0,500ms] 5% 中型单位 ( 0,500ms] 小型单位 ( 0,1000ms] 6 .4.2 故障影响评价 故障 级别 计分 周 月 年 权重 轻微 - 10 - 5 - 2 30% 一般 - 25 - 15 - 5 严重 - 45 - 25 - 10 说明:根据不同故障级别,分周、月、年,按不同分值,按次累计扣减;例如, 1 周发生 1 次轻微故障, 则当周扣减 1 0 分;当月发生两次严重故障,则当月扣减 5 0 分; 6 .4.3 生产变更质量 生产变更质量从通知情况以及执行情况两个方面进行评价: 紧急变更通知率 级别 计分 周 月 年 权重 优秀 1 00 5% 良好 6 0 中等 20 差 0 变更执行情况 级别 计分 单次 周 月 年 权重 优秀 100 均值 均值 均值 25% 良好 80 中等 60 差 0 说明: 1 ) 根据变更执行情况对单次变更质量进行评分, 周期统计数据为单次数据的平均值;例如,一周进行 了两次变更,变更执行质量一次为优秀,一次为中等,则当周分数为( 100+60 ) /2=80 ; 2 ) 对于精准报备,单次加 5 分, 单周 加分不超过 1 次 ; 6 .4.4 外部评价情况
|
|
26
|
+
|
|
27
|
+
外部评价 情况 计分 周 月 年 权重 客诉 单次 问题 累计 客诉超过 10 00 通 - 20 - 10 - 5 5% 负面影响 出现重大舆情、监管投诉等 - 30 - 20 - 10 5% 说明: 1) 当 单次问题导致客诉累计超过 1000 通,则当周 按次进行扣减,一次 20 分, 月、年以此类推 ; 客诉 累计来自于支付机构反馈的数据; 2) 当单次问题引发舆情, 或者有被都投诉到监管部门等较为严重的负面影响情况发生, 则当周按次进 行扣减,一次 30 分,月、年以此类推; 6.5 评价定级 优秀 : 周期评价综合分数 ≥ 90 ; 同时系统成功率大于 9 9.99 % 以上; 良好 : 90 > 周期评价综合分数 ≥ 80 ;同时系统成功率大于 9 9.99 % 以上; 中等 : 80 > 周期评价综合分数 ≥ 60 ; 差 :周 期评价综合分数 < 60 ;
|
|
28
|
+
|
|
29
|
+
附 录 A 运行指标 A.1 系统请求数量 统计时间段内,系统发送的请求交易数量总和。当下游系统无法获取到准确的发送请求数量时,可 以 暂时 使用接收到的请求数量作为系统请求数量。 A.2 系统失败数量 统计时间段内,系统未接收到返回信息(超时) ,以及 根据网联平台的《报文交换技术规范》 接收 到的报文中系统返回码非 00000000 的交易数量总和。 当下游系统无法准确获取超时信息时,可以只按 报文返回码进行计算。 A.3 业务失败数量 统计时间段内, 根据网联平台的 《报文交换技术规范》 , 系统接收到的报文中业务返回码非 00000000 的交易数量总和。 A.4 系统成功率 统计时间段内, ( 系统请求数量 - 系统失败数量) / 系统请求数量 * 100 % ,保留小数点后 4 位 。 A.5 业务成功率 统计时间段内, (系统请求数量 - 业务失败数量) / 业务请求数量 * 100 % ,保留小数点后 4 位。 A.6 平均耗时 统计时间段内, 单笔交易 耗时 累计总和 / 系统请求数量 。 A.7 正常服务时间 统计时间段内, 总时长 - 异常运行时间 - 异常关闭时间 - 变更关闭时间 。 A.8 异常持续时间 故障结束时间 - 故障开始时间 ,故障结束通常指故障方已经完成止血隔离,业务恢复正常运行 ; 如 果在故障期间发生渠道关闭,即未恢复正常运行,则渠道关闭时间同样 计入 异常持续时间 。
|
|
30
|
+
|
|
31
|
+
附 录 B 单位 分类 大型单位 工商银行、农业银行、中国银行、建设银行、交通银行、邮储银行、招商银行、 微众银行、 网商银行、 农信银 中心 、支付宝、财付通 中型单位 中信银行、 光大银行、民生银行、兴业银行、广发银行、平安银行、 浦发银行、 浙江联社 、网银在线 小型单位 除 大型单位 、 中型单位 以外的其余成员单位
|
|
32
|
+
|
|
33
|
+
参 考 文 献 [1] 《银行业重要信息系统突发事件应急管理规范(试行)》 [2] 《商业银行信息科技风险管理指引》 [3] 《银行业信息系统灾难恢复管理规范》 [4] 《关于加强支付清算业务高峰时期保障工作有关事项的通知》(银办发【 2019 】 189 号) [5] 《商业银行业务连续性监管指引》(银监发( 2011 ) 104 号) [6] 《银行业金融机构重要信息系统投产及变更管理办法》(银监办发【 2009 】 437 号) [7] 《银行计算机安全事件报告管理制度》(银发【 2002 】 280 号) [8] 《银行证券跨行业信息系统突发事件应急处 置工作指引》(银监发【 2008 】 50 号) [9] 《银行业重要信息系统突发事件应急管理规范》(银监发【 2008 】 53 号) [10] 《金融行业信息系统信息安全等级保护实施指引》 [11] 《银行业数据中心监管指引》 [12] 《商业银行业务连续性监管指引》 [13] 《商业银行数据中心监管指引》 [14] 《银行业重要信息系统》 [15] 《银行业金融机构重要信息系统投产及变更管理办法》 [16] 《银行业信息系统灾难恢复管理规则》 [17] 《中国银监会关于银行风险控制工作的指导意见》 [18] 《 < 突发事件应预案管理办法 > 银监会通知要求突发事件的应急要求》 [19] 《银行业重要信息系统突发事件应急管理规范》 [20] 《 业务连续性管理办法 < 试行 > 》 [21] 支付清算系统总体应急预案管理 [22] 《关于建立支付清算系统安全事件日报制度的通知》(银支付函【 2019 】 2456 号) _________________________________
|