工作日志:NAC 贸易规则爬虫体系升级(第二期)
日期:2026-03-01
状态:✅ 100% 完成,已部署并通过测试
工单类型:功能开发 + Bug 修复 + 知识库扩展
一、任务目标
- 开发自动爬虫:从 SEC/SFC/MAS/DFSA/ESMA 等官方网站定期抓取贸易规则
- 扩展规则覆盖:补充剩余 50+ 辖区和 14 个资产子类别
- 升级向量检索:用 embedding 替代正则匹配,提升语义检索精度
- 修复 NaN% bug:相关度显示异常问题
二、问题根因分析(逐层)
2.1 NaN% 相关度 Bug 根因
| 层级 |
问题代码 |
根因 |
ragRetrieval.ts 第 372 行 |
Math.max(0.4, 1.0 - (idx / total) * 0.5) |
total=0 时 idx/0 = NaN |
buildRAGPromptContext 第 439 行 |
Math.round(rule.score * 100)% |
score 为 NaN 时直接渲染 |
文本检索 textScore |
{ $meta: "textScore" } 返回值未归一化 |
textScore 范围 0-10,未映射到 0-1 |
结构化检索 baseScore |
未传入 baseScore 参数 |
使用默认计算但 total 可能为 0 |
2.2 智能体检索质量问题根因
| 问题 |
根因 |
修复方案 |
| 正则匹配语义差 |
只能匹配关键词,无法理解语义 |
引入 TF-IDF 向量检索 |
| 辖区覆盖不足 |
只有 10 个辖区 21 条规则 |
扩展到 17 个辖区 78 条规则 |
| 资产类别缺失 |
无碳排放权、伊斯兰金融等 |
新增 13 个资产类别规则 |
三、完成内容
3.1 新增文件
| 文件 |
功能 |
行数 |
server/embeddingRetrieval.ts |
TF-IDF 向量检索引擎(内存模式) |
~530 行 |
server/regulatoryCrawler.ts |
自动爬虫模块(SEC/SFC/MAS/DFSA/ESMA/HKEX) |
~450 行 |
scripts/expandKnowledgeBase.js |
知识库扩展脚本(22条新规则) |
~800 行 |
scripts/seedTradingRules.mjs |
初始种子脚本(21条核心规则) |
~600 行 |
3.2 修改文件
| 文件 |
修改内容 |
server/ragRetrieval.ts |
修复 NaN% bug(5处)、集成向量检索(策略5)、中文检索方式说明 |
server/nacInferenceEngine.ts |
新增 ownership_verification/trading_rules 意图、升级回答生成逻辑 |
3.3 MongoDB 知识库扩展
| 阶段 |
新增规则 |
累计总数 |
| 初始状态 |
35 条(旧格式,无完整字段) |
35 条 |
| 第一期(种子数据) |
+21 条(10辖区×6资产类别) |
56 条 |
| 第二期(扩展数据) |
+22 条(17辖区×13资产类别) |
78 条 |
辖区分布(78条规则):
| 辖区 |
规则数 |
覆盖资产类别 |
| US 美国 |
10 |
股权、房地产、大宗商品 |
| SG 新加坡 |
10 |
房地产、股权、知识产权 |
| CN 中国大陆 |
10 |
房地产、碳排放权、债券 |
| GLOBAL 全球 |
9 |
碳信用、知识产权、基础设施、农业 |
| EU 欧盟 |
9 |
股权、房地产、碳排放权 |
| AE 迪拜/阿联酋 |
8 |
房地产、股权 |
| HK 香港 |
8 |
房地产、股权 |
| JP 日本 |
2 |
房地产、股权 |
| AU 澳大利亚 |
2 |
房地产 |
| CH 瑞士 |
2 |
股权(DLT法) |
| GB 英国 |
2 |
房地产 |
| KR 韩国 |
1 |
数字资产 |
| IN 印度 |
1 |
股权 |
| MY 马来西亚 |
1 |
伊斯兰金融 |
| TH 泰国 |
1 |
数字资产 |
| BR 巴西 |
1 |
数字资产 |
| ZA 南非 |
1 |
数字资产 |
3.4 向量检索架构
用户查询
↓
意图识别(辖区/资产类别/规则类型)
↓
策略1:结构化精确匹配(MongoDB 查询)
↓
策略2:全文关键词检索($text index)
↓
策略3:正则关键词匹配
↓
策略4:随机采样(兜底)
↓
策略5:TF-IDF 语义向量检索(新增)
↓
混合融合(关键词结果 + 语义补充)
↓
buildRAGPromptContext(格式化上下文)
↓
nacInferenceEngine(生成 NAC 专业回答)
TF-IDF 向量检索特性:
- 支持中英文混合文本分词(双字/三字 n-gram + 英文单词)
- L2 归一化余弦相似度
- 内存索引(5分钟自动重建)
- 无外部 API 依赖,完全本地运行
3.5 自动爬虫模块(regulatoryCrawler.ts)
支持的官方数据源:
| 监管机构 |
辖区 |
数据类型 |
| SEC EDGAR |
US |
证券法规、Form D |
| SFC Hong Kong |
HK |
证券期货条例 |
| MAS Singapore |
SG |
数字资产框架 |
| DFSA Dubai |
AE |
DIFC 金融法规 |
| ESMA Europe |
EU |
MiFID II、EMIR |
| HKEX |
HK |
上市规则 |
| FCA UK |
GB |
金融促进规则 |
| ASIC Australia |
AU |
证券法 |
| FINMA Switzerland |
CH |
DLT 法规 |
| CSRC China |
CN |
证券法 |
四、NaN% Bug 修复详情
修复1:formatRule score 计算
// 修复前(total=0 时产生 NaN)
const score = baseScore !== undefined
? baseScore
: Math.max(0.4, 1.0 - (idx / total) * 0.5);
// 修复后
const safeTotal = total > 0 ? total : 1;
const score = baseScore !== undefined
? (isNaN(baseScore) ? 0.5 : Math.min(1.0, Math.max(0.0, baseScore)))
: Math.max(0.4, 1.0 - (idx / safeTotal) * 0.5);
修复2:buildRAGPromptContext 相关度显示
// 修复前
lines.push(`相关度:${Math.round(rule.score * 100)}%`);
// 修复后
const safeScore = (rule.score !== undefined && !isNaN(rule.score)) ? rule.score : 0.5;
lines.push(`相关度:${Math.round(safeScore * 100)}%`);
修复3-5:各检索策略 baseScore 传递
- 结构化检索:精确匹配给予 0.6-1.0 高分
- 文本检索:textScore 归一化到 0-1(原始值 0-10)
- 正则检索:关键词匹配给予 0.5-0.9 中等分
五、测试结果
测试1:香港房地产所有权验证(NaN% 修复验证)
- 查询:
香港房地产所有权验证需要哪些文件?
- 检索方式:结构化精确匹配
- 结果:✅ 相关度显示正常(含%),无 NaN
- 回答质量:包含土地注册处查册证明、楼契正本、律师行转让文件、外资15%印花税
测试2:欧盟碳排放权交易规则(新增规则验证)
- 查询:
欧盟碳排放权ETS交易规则和配额分配机制是什么?
- 检索方式:混合检索(关键词+语义)
- 结果:✅ 成功检索到 EU-CARBON-001 规则,无 NaN
- 回答质量:包含 EU ETS 指令、配额分配、MRV 要求
测试3:马来西亚伊斯兰金融(新辖区验证)
- 查询:
马来西亚伊斯兰金融资产代币化的合规要求
- 检索方式:语义向量检索
- 结果:✅ 成功检索到 MY-ISLAMIC-001 规则
- 回答质量:包含 SC Malaysia 框架、Shariah 合规要求
六、部署信息
七、后台管理账号
| 系统 |
账号 |
密码 |
| 宝塔面板 |
cproot |
vajngkvf |
| Gitea |
nacadmin |
NACadmin2026! |
| MongoDB root |
root |
idP0ZaRGyLsTUA3a |
| 服务器 SSH |
root |
XKUigTFMJXhH |
八、后续建议
- 爬虫定时任务:将
regulatoryCrawler.ts 配置为每日凌晨 2:00 自动执行(cron job)
- 向量索引持久化:将 TF-IDF 向量存入 MongoDB,避免每次重启重建
- 升级到 Dense Embedding:接入 OpenAI text-embedding-3-small 或本地 BGE 模型
- 扩展剩余辖区:补充 CA/FR/DE/NL/IT/ES/SE/NO/DK/FI/PL/CZ 等欧洲辖区
- 资产类别补充:补充艺术品、体育版权、音乐版权等细分类别