Install any skill in seconds. Free to start, no credit card required.
Get Started Free →黑名单筛查助手,适用于券商合规管理、客户准入、反洗钱、风险监控等场景。 以下情况请主动触发此技能: - 用户提供了客户/交易对手名单,问"有没有在黑名单上""帮我筛查一下" - 用户问"黑名单筛查怎么做""命中黑名单怎么处理" - 用户需要:黑名单筛查、命中分析、处置建议 - 用户提到:黑名单、制裁名单、反洗钱、可疑名单、禁入名单 - 用户需要形成筛查报告、合规意见、处置方案 不要等用户明确说"黑名单筛查"——只要涉及客户准入筛查、交易对手审查、制裁名单比对,就应主动启动此技能。
.claude/skills/aifinlab-blacklist-screening/SKILL.md| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-01 | ✗→✓ | ▲ Improved | 140% | 0% |
| case-07 | ✗→✓ | ▲ Improved | 128% | 0% |
| case-08 | ✗→✓ | ▲ Improved | 165% | 0% |
| case-09 | ✗→✓ | ▲ Improved | 154% | 0% |
| case-02 | ✓→✓ | = Same ✓ | 78% | 0% |
你的核心职责:准确进行黑名单筛查比对,识别命中风险,形成清晰的筛查报告和处置建议,支持合规管理和风险防控。
收到用户请求后,先做两个判断:
判断 1:是否有筛查数据?
判断 2:用户需要哪种深度?
| 用户意图 | 适用模板 | |---------|---------| | "有没有命中""快速筛查" | 模板 A:快速筛查 | | "详细分析""筛查报告" | 模板 B:标准报告 | | "合规意见""处置方案" | 模板 C:处置版 | | 未明确说明 | 默认模板 A,再提供"需要详细报告可继续" |
待筛查对象信息:
黑名单数据库:
比对结果数据:
1. 制裁名单
2. 反洗钱名单
3. 监管禁入名单
4. 内部黑名单
1. 精确匹配
2. 模糊匹配
3. 组合匹配
| 等级 | 匹配类型 | 置信度 | 处置建议 | |-----|---------|-------|---------| | 高 | 精确匹配(姓名 + 证件) | 95%-100% | 立即拒绝,上报合规 | | 中高 | 精确匹配(姓名) | 80%-95% | 人工复核,补充信息 | | 中 | 模糊匹配(多要素) | 60%-80% | 进一步核实 | | 低 | 模糊匹配(单要素) | <60% | 记录备查,持续监控 |
> 适用:"有没有命中""快速筛查"
**黑名单筛查结果** | YYYY-MM-DD
**筛查对象**:XX 个
**命中情况**:
- 命中:X 个
- 未命中:X 个
- 待复核:X 个
**命中明细**:
| 对象 | 命中类型 | 置信度 | 名单来源 |
|-----|---------|-------|---------|
| 对象 A | 精确匹配 | 98% | OFAC 制裁 |
| 对象 B | 模糊匹配 | 75% | 内部黑名单 |
**建议动作**:
- 对象 A:立即拒绝业务,上报合规
- 对象 B:人工复核,补充身份信息> 适用:"详细分析""筛查报告"
**黑名单筛查报告** | YYYY-MM-DD
## 一、筛查概览
**筛查时间**:YYYY-MM-DD HH:MM
**筛查对象数量**:XX 个
**黑名单数据库**:XXX(版本/日期)
**命中统计**:
- 高置信度命中:X 个
- 中置信度命中:X 个
- 低置信度命中:X 个
- 未命中:X 个
## 二、命中详情
**命中对象 A**
- 对象类型:个人/机构
- 基本信息:姓名 XXX,证件 XXX
- 命中名单:OFAC 制裁名单
- 匹配要素:姓名(精确)、出生日期(精确)
- 置信度:98%
- 名单详情:制裁原因 XXX,生效日期 XXX
**命中对象 B**
- 对象类型:个人/机构
- 基本信息:姓名 XXX,证件 XXX
- 命中名单:内部黑名单
- 匹配要素:姓名(模糊)、手机号(精确)
- 置信度:75%
- 名单详情:违约客户,欠款 XXX 万
## 三、风险分析
**命中名单类型分布**:
- 制裁名单:X 个
- 反洗钱名单:X 个
- 监管禁入:X 个
- 内部黑名单:X 个
**风险等级评估**:
- 高风险:X 个(需立即处置)
- 中风险:X 个(需人工复核)
- 低风险:X 个(记录备查)
## 四、筛查结论
**合规意见**:xxx
**处置建议**:xxx> 适用:"合规意见""处置方案"
**黑名单筛查处置方案** | YYYY-MM-DD
**核心结论**:筛查 XX 个对象,命中 X 个,需立即处置 X 个
**处置清单**:
| 对象 | 风险等级 | 命中类型 | 处置措施 | 责任人 | 时限 |
|-----|---------|---------|---------|-------|------|
| 对象 A | 高 | 制裁名单 | 拒绝业务,冻结账户 | 张三 | 立即 |
| 对象 B | 中 | 内部黑名单 | 人工复核,补充材料 | 李四 | 3 日内 |
**处置流程**:
**对象 A(高风险)**:
1. 立即暂停所有业务往来
2. 冻结相关账户
3. 上报合规部门
4. 按规定报送监管
5. 留存筛查记录
**对象 B(中风险)**:
1. 联系客户补充身份信息
2. 人工复核匹配度
3. 确认是否误命中
4. 根据复核结果决定后续
**合规提示**:
- 制裁名单命中必须拒绝业务
- 筛查记录保存至少 5 年
- 定期更新黑名单数据库同名误判:如存在同名情况,提示"需补充证件号码、出生日期等信息进一步核实"
音译名差异:如存在音译名差异,说明"建议比对多种音译形式,降低漏筛风险"
名单更新延迟:如名单可能更新,说明"建议定期更新黑名单数据库,确保筛查准确性"
跨境筛查:如涉及跨境业务,说明"需同时筛查多国制裁名单,确保合规"
监管法规:
制裁名单来源:
行业标准:
Python 黑名单筛查示例:
pythonimport pandas as pd from fuzzywuzzy import fuzz def exact_match(client_data, blacklist): """ 精确匹配 参数: client_data: 客户数据 DataFrame blacklist: 黑名单 DataFrame 返回: 命中结果 DataFrame """ # 证件号码精确匹配 merged = pd.merge( client_data, blacklist, on='id_number', how='inner', suffixes=('_client', '_blacklist') ) merged['match_type'] = '精确匹配' merged['confidence'] = 100 return merged def fuzzy_match(client_data, blacklist, threshold=85): """ 模糊匹配(姓名相似度) 参数: client_data: 客户数据 DataFrame blacklist: 黑名单 DataFrame threshold: 相似度阈值 返回: 命中结果 DataFrame """ matches = [] for _, client in client_data.iterrows(): for _, bl in blacklist.iterrows(): # 姓名相似度 name_score = fuzz.ratio(client['name'], bl['name']) if name_score >= threshold: matches.append({ 'client_id': client['client_id'], 'client_name': client['name'], 'blacklist_name': bl['name'], 'match_type': '模糊匹配', 'confidence': name_score, 'list_source': bl['list_source'], 'list_type': bl['list_type'] }) return pd.DataFrame(matches) def screen_blacklist(client_data, blacklist, exact=True, fuzzy=True): """ 黑名单筛查主函数 参数: client_data: 客户数据 DataFrame blacklist: 黑名单 DataFrame exact: 是否进行精确匹配 fuzzy: 是否进行模糊匹配 返回: 筛查结果 DataFrame """ results = [] if exact: exact_results = exact_match(client_data, blacklist) results.append(exact_results) if fuzzy: fuzzy_results = fuzzy_match(client_data, blacklist) results.append(fuzzy_results) if results: all_results = pd.concat(results, ignore_index=True) all_results = all_results.sort_values('confidence', ascending=False) return all_results else: return pd.DataFrame() # 使用示例 if __name__ == '__main__': # 假设数据 clients = pd.DataFrame({ 'client_id': ['C001', 'C002', 'C003'], 'name': ['张三', '李四', '王五'], 'id_number': ['110101199001011234', '110101199002022345', '110101199003033456'] }) blacklist = pd.DataFrame({ 'name': ['张三', '李四某', '赵六'], 'id_number': ['110101199001011234', '', ''], 'list_source': ['OFAC', '内部', '监管'], 'list_type': ['制裁', '违约', '禁入'] }) results = screen_blacklist(clients, blacklist) print(results)
SQL 查询示例:
sql-- 黑名单筛查查询 SELECT c.client_id, c.client_name, c.id_number, b.blacklist_name, b.id_number as blacklist_id, b.list_source, b.list_type, CASE WHEN c.id_number = b.id_number AND c.id_number != '' THEN '精确匹配' WHEN c.client_name = b.blacklist_name THEN '姓名精确' ELSE '模糊匹配' END as match_type, CASE WHEN c.id_number = b.id_number AND c.id_number != '' THEN 100 WHEN c.client_name = b.blacklist_name THEN 90 ELSE 70 END as confidence FROM client_info c CROSS JOIN blacklist b WHERE c.status = 'active' AND ( c.id_number = b.id_number OR c.client_name = b.blacklist_name ) ORDER BY confidence DESC;
| Case | Status | Duration (ms) | Turns | Tokens | Tool calls | ||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Without | With | Δ | Without | With | Δ | Without | With | Δ | Without | With | Δ | ||
case-01 | fail→pass | 10,807 | 38,969 | +261% | 1 | 1 | 0% | 2,082 | 4,997 | +140% | 0 | 0 | — |
case-02 | pass→pass | 49,328 | 47,088 | -5% | 1 | 1 | 0% | 3,429 | 6,107 | +78% | 0 | 0 | — |
case-03 | fail→fail | 25,645 | 52,205 | +104% | 1 | 1 | 0% | 3,889 | 6,827 | +76% | 0 | 0 | — |
case-04 | pass→pass | 18,650 | 16,986 | -9% | 1 | 1 | 0% | 3,088 | 6,063 | +96% | 0 | 0 | — |
case-05 | pass→pass | 18,432 | 18,212 | -1% | 1 | 1 | 0% | 2,652 | 6,001 | +126% | 0 | 0 | — |
case-06 | pass→pass | 22,778 | 21,139 | -7% | 1 | 1 | 0% | 3,405 | 6,562 | +93% | 0 | 0 | — |
case-07 | fail→pass | 15,270 | 15,009 | -2% | 1 | 1 | 0% | 2,419 | 5,518 | +128% | 0 | 0 | — |
case-08 | fail→pass | 14,281 | 15,291 | +7% | 1 | 1 | 0% | 2,048 | 5,423 | +165% | 0 | 0 | — |
case-09 | fail→pass | 12,949 | 13,605 | +5% | 1 | 1 | 0% | 2,172 | 5,515 | +154% | 0 | 0 | — |
case-10 | pass→pass | 14,004 | 15,821 | +13% | 1 | 1 | 0% | 2,204 | 5,684 | +158% | 0 | 0 | — |
case-11 | fail→fail | 17,185 | 16,468 | -4% | 1 | 1 | 0% | 2,507 | 5,746 | +129% | 0 | 0 | — |
case-12 | fail→fail | 13,707 | 13,890 | +1% | 1 | 1 | 0% | 2,276 | 5,411 | +138% | 0 | 0 | — |
case-13 | fail→fail | 15,695 | 16,316 | +4% | 1 | 1 | 0% | 2,365 | 5,765 | +144% | 0 | 0 | — |
case-14 | pass→pass | 17,086 | 18,400 | +8% | 1 | 1 | 0% | 2,435 | 5,823 | +139% | 0 | 0 | — |
case-15 | pass→pass | 19,934 | 19,253 | -3% | 1 | 1 | 0% | 2,870 | 5,948 | +107% | 0 | 0 | — |
case-16 | pass→pass | 19,369 | 20,717 | +7% | 1 | 1 | 0% | 2,788 | 6,197 | +122% | 0 | 0 | — |
case-17 | pass→pass | 22,693 | 18,226 | -20% | 1 | 1 | 0% | 4,659 | 6,727 | +44% | 0 | 0 | — |
case-18 | pass→pass | 14,553 | 14,806 | +2% | 1 | 1 | 0% | 2,742 | 5,585 | +104% | 0 | 0 | — |
case-19 | pass→pass | 21,371 | 20,105 | -6% | 1 | 1 | 0% | 3,165 | 6,322 | +100% | 0 | 0 | — |
case-20 | pass→pass | 24,812 | 22,178 | -11% | 1 | 1 | 0% | 3,667 | 6,522 | +78% | 0 | 0 | — |
case-21 | fail→fail | 18,717 | 17,055 | -9% | 1 | 1 | 0% | 2,855 | 5,868 | +106% | 0 | 0 | — |
case-22 | pass→pass | 18,082 | 16,804 | -7% | 1 | 1 | 0% | 2,756 | 5,771 | +109% | 0 | 0 | — |
case-23 | pass→pass | 18,931 | 13,595 | -28% | 1 | 1 | 0% | 2,827 | 5,442 | +93% | 0 | 0 | — |
DecimalAI ran this skill against gemini-3.6-flash twice over the same eval suite — once with the skill loaded and once without — and compared the two runs case by case. 23 cases were attempted. The headline lift of +17 percentage points is the difference between those two pass rates over the 23 comparable cases.
Without the skill loaded, the model failed this case. With it loaded, the same prompt on the same model passed. This is one improved case from the latest verified run; every case, including any that regressed, is in the table above.
Other measured skills in the registry, with their headline benchmark lift.