Compare commits

...

3 Commits

16 changed files with 5165 additions and 3907 deletions

View File

@ -517,16 +517,3 @@ MIT License
**最后更新**: 2026-02-07
**版本**: v1.0.0
## AI推理引擎文档最新更新2026-03-05
### 文档目录
- - v2.0升级日志知识库2780条+BM25+9种语言
- - 五大知识域说明和维护指南
- - AI推理引擎API接口文档
- - Palantir/Claude技术引入分析报告
### 服务访问
- Chat界面http://chat.newassetchain.io完全开放无需登录
- AI服务器43.224.155.27端口8800
- 管理员cproot / vajngkvf

View File

@ -1,86 +0,0 @@
# NAC AI推理引擎升级日志
## 升级版本v2.0.0
**升级时间**2026-03-05 02:21:43 UTC+8
**升级服务器**43.224.155.27AI服务器
**执行人**NAC Admin
---
## 升级内容摘要
### 1. 知识库大规模扩充
| 知识域 | 升级前 | 升级后 |
|--------|--------|--------|
| NAC技术域 | 60条 | 330条 |
| RWA生态域 | 0条 | 366条 |
| 区块链行业域 | 0条 | 392条 |
| 合规法规域 | 0条 | 560条 |
| 资产估值域 | 0条 | 328条 |
| 合规规则集 | 0条 | 25条 |
| **总计** | **60条** | **2780条** |
### 2. RAG检索引擎升级ragEngine.ts v2.0
- 引入 **BM25算法**(业界标准稀疏检索,替代简单正则匹配)
- 多字段权重检索标题权重2x关键词权重1.5x内容权重1x
- 多语言分词支持(中文字符级分词 + 英文词干提取)
- 倒数排名融合RRF合并多路检索结果
- 新增五大知识域的并行检索
### 3. 答案构建引擎升级answerBuilder.ts v2.0
- 扩展意图识别50+意图类型覆盖NAC全技术栈
- Chain-of-Thought推理链6步推理意图→检索→推理→组装→验证→输出
- 9种语言答案生成模板中/英/阿/日/韩/法/俄/西/葡)
- 知识图谱多跳推理(技术概念关联推理)
### 4. Chat界面升级nac-chat-ui-v2 v2.0
- 添加9种语言选择器中/英/阿/日/韩/法/俄/西/葡)
- 语言偏好本地存储localStorage持久化
- 欢迎界面多语言动态切换
- 添加"注册/登录"引导链接(轻量,不强制)
- 知识库条数更新显示578条→2780条
- **完全开放,无需注册/登录即可使用**
---
## 服务状态
| 服务 | 端口 | 状态 | 内存 |
|------|------|------|------|
| nac-ai-inference | 8703 | ✅ online | ~78MB |
| nac-ai-compliance | 8701 | ✅ online | ~74MB |
| nac-ai-valuation | 8702 | ✅ online | ~73MB |
| nac-chat-ui-v2 | 8800 | ✅ online | ~66MB |
---
## 测试验收结果
**测试通过率17/17 = 100%**
| 测试类别 | 测试语言 | 结果 |
|----------|----------|------|
| NAC技术问题 | 中/英/阿/日/韩 | ✅ 全部通过 |
| RWA上链问题 | 中/英/法/西/葡 | ✅ 全部通过 |
| 合规法规问题 | 中/英/俄 | ✅ 全部通过 |
| 资产估值问题 | 中/英 | ✅ 全部通过 |
| 区块链对比问题 | 中/英 | ✅ 全部通过 |
---
## 访问地址
- **Chat界面**http://chat.newassetchain.io完全开放无需登录
- **推理API**http://43.224.155.27:8800/api/inference/ask
- **健康检查**http://43.224.155.27:8800/health
---
## 下一步计划
1. 继续扩充知识库至3500+条当前2780条
2. 引入流式输出SSE支持
3. 多轮对话记忆增强
4. Palantir/Claude技术适用性分析报告
5. answerBuilder.ts 非中英文语言的答案语言一致性优化

View File

@ -1,40 +0,0 @@
# NAC AI推理引擎 v3.0 升级日志
**升级时间**2026-03-05 02:22:25
**工单**AI-ENGINE-V3-UPGRADE
**执行人**NAC Admin
## 本次升级v3.0
### 1. Claude API混合推理
- 集成 Anthropic Claude-3.5-Haiku
- ANTHROPIC_API_KEY 已配置
- claudeEnabled: true
### 2. 知识库扩充至10,140条
- compliance_rules: 6,775条
- nac_tech_docs: 3,365条含GNACS分类200条+七层合规70条
### 3. SSE流式输出
- 新端点POST /api/inference/ask/stream
- 逐字流式渲染含Markdown实时解析
- 引擎标识徽章Claude增强/RAG检索
### 4. 多轮对话记忆持久化
- MongoDB持久化inference_conversations集合
- DELETE /api/inference/conversations/:sessionId
- GET /api/inference/session/:sessionId/memory
- 前端清除记忆按钮
## 服务器说明
| 服务器 | 用途 | 地址 |
|--------|------|------|
| AI服务器 | 推理引擎/知识库/CNNL | 43.224.155.27:22000 |
| 备份服务器 | 代码备份/Gitea/文档 | 103.96.148.7:22000 |
## 管理员账号
- Gitea: nacadmin / NACadmin2026!
- 备份服务器: root / XKUigTFMJXhH
- AI服务器: root / vajngkvf

View File

@ -1,124 +0,0 @@
# NAC AI推理引擎 API文档
## 基础信息
**服务地址**http://chat.newassetchain.io
**直接访问**http://43.224.155.27:8800
**版本**v2.0.0
**更新时间**2026-03-05 02:21:48
---
## 接口列表
### 1. AI问答接口
**POST** `/api/inference/ask`
**请求体**
```json
{
"question": "如何用Charter编写RWA上链合约",
"language": "zh",
"sessionId": "session-uuid",
"jurisdiction": "HK",
"assetType": "real_estate",
"includeDiagram": true,
"mode": "general"
}
```
**language参数**9种语言
- `zh` 中文
- `en` English
- `ar` العربية
- `ja` 日本語
- `ko` 한국어
- `fr` Français
- `ru` Русский
- `es` Español
- `pt` Português
**响应体**
```json
{
"success": true,
"data": {
"answer": "**Charter智能合约语言**\n\nCharter是NAC公链的原生...",
"intent": "definition",
"confidence": 0.93,
"sources": [
{"id": "doc_001", "name": "Charter语言规范", "category": "nac_tech"}
],
"suggestions": ["Charter与Solidity对比", "Charter操作码列表"],
"diagram": null,
"processingMs": 45
}
}
```
---
### 2. 合规验证接口
**POST** `/api/compliance/validate`
**请求体**
```json
{
"assetType": "real_estate",
"jurisdiction": "HK",
"assetValue": 5000000,
"description": "香港九龙商业地产"
}
```
---
### 3. 资产估值接口
**POST** `/api/valuation/appraise`
**请求体**
```json
{
"assetId": "asset-001",
"assetType": "real_estate",
"marketValue": 5000000,
"jurisdiction": "HK",
"currency": "HKD"
}
```
---
### 4. 健康检查
**GET** `/health`
```json
{"service": "nac-chat-ui", "status": "healthy", "port": 8800}
```
---
### 5. 服务状态
**GET** `/api/status`
```json
{
"success": true,
"services": [
{"name": "nac-ai-inference", "port": 8703, "status": "online"},
{"name": "nac-ai-compliance", "port": 8701, "status": "online"},
{"name": "nac-ai-valuation", "port": 8702, "status": "online"}
],
"knowledgeBase": {"total": 2780, "compliance": 560, "techDocs": 2220}
}
```
---
*最后更新2026-03-05 02:21:48*

View File

@ -1,94 +0,0 @@
# NAC AI知识库文档
## 概述
NAC AI知识引擎的知识库存储在AI服务器43.224.155.27的MongoDB中。
**数据库**`nac_ai`
**主集合**`nac_tech_docs`2780条
**合规集合**`compliance_rules`25条
---
## 五大知识域
### 1. NAC技术域330条
覆盖NAC公链全技术栈
- Charter智能合约语言语法/类型/操作码/编译器)
- NVM虚拟机指令集/内存模型/Gas计量
- CBPP共识协议宪政区块生产/验证者/惩罚机制)
- CSNP网络协议节点发现/消息路由/带宽管理)
- CNNL神经网络语言语法/训练/推理)
- GNACS资产编码分类体系/编码规则/Pro扩展
- ACC-20资产标准接口/事件/合规钩子)
- XTZH稳定币SDR锚定/铸造/销毁/价格机制)
### 2. RWA生态域366条
覆盖真实世界资产代币化全流程:
- 资产类型(不动产/股权/债券/碳权/艺术品/知识产权)
- 代币化流程(资产评估→法律包装→代币发行→二级市场)
- DeFi集成流动性池/收益农耕/抵押借贷)
- 机构参与(托管/清算/合规报告)
### 3. 区块链行业域392条
覆盖主流公链技术对比:
- 比特币/以太坊/Solana/Polkadot/Cosmos/Avalanche
- Layer2扩展方案Optimistic/ZK Rollup
- 跨链互操作性IBC/XCMP/LayerZero
- DeFi协议Uniswap/Aave/Compound/Curve
### 4. 合规法规域560条
覆盖全球30+辖区合规规则:
- 香港AMLO/SFC/HKMA/VASP牌照
- 新加坡MAS/PSA/Project Guardian
- 阿联酋VARA/FSRA/ADGM
- 欧盟MiCA/DORA/GDPR/AMLD6
- 美国SEC/CFTC/FinCEN/FATF
- 日本/韩国/澳大利亚/英国/瑞士等
### 5. 资产估值域328条
覆盖RWA资产估值全体系
- 估值方法论(收益法/市场比较法/成本法/DCF/NAV
- 资产类型估值(房地产/股权/债券/碳权/艺术品)
- NAC AI估值引擎50维特征/置信度/多模型融合)
- 辖区估值标准(各辖区认证要求)
---
## 数据库连接
```
MongoDB: 127.0.0.1:27017本地无密码
数据库: nac_ai
主集合: nac_tech_docs
合规集合: compliance_rules
```
---
## 知识库维护
### 添加新知识
```javascript
db.nac_tech_docs.insertOne({
domain: "nac_tech", // nac_tech|rwa_ecosystem|blockchain_industry|compliance|valuation
title_zh: "中文标题",
title_en: "English Title",
content_zh: "中文内容",
content_en: "English content",
keywords: ["keyword1", "keyword2"],
category: "分类",
subcategory: "子分类",
created_at: new Date()
})
```
### 全文索引
```javascript
db.nac_tech_docs.createIndex({ title_zh: "text", content_zh: "text", keywords: "text" }, { default_language: "none" })
```
---
*最后更新2026-03-05 02:21:46*

View File

@ -1,232 +0,0 @@
# NAC AI推理引擎升级运维日志
**工单编号**NAC-AI-2026-003
**执行日期**2026-03-04
**执行人**Manus AI
**服务器**103.96.148.7:22000
**状态**:✅ 已完成并测试通过
---
## 一、工单目标
基于DeepSeek参考文档将NAC AI推理引擎升级为具备深度综合分析能力的知识引擎具体目标
1. 扩充MongoDB知识库从34条扩充到60+条)
2. 优化RAG引擎的关键词过滤器和检索策略
3. 确保AI能够回答NAC公链与主流公链的全维度对比问题
4. 服务稳定运行,无错误日志
---
## 二、执行步骤
### 步骤1服务状态评估
**检查结果**
- `nac-ai-inference`PM2 ID:2online端口8703
- `nac-ai-compliance`PM2 ID:0online端口8701
- `nac-ai-valuation`PM2 ID:1online端口8702
- `nac-chat-ui-v2`PM2 ID:3online端口3001
- 错误日志:空(无运行时错误)
- MongoDB连接正常
- RAG知识库就绪支持14种Mermaid图表
**结论**V4.0 answerBuilder.ts已正常运行无需修复。
---
### 步骤2知识库扩充
**工具**Python脚本expand_knowledge.py
**数据源**DeepSeek参考文档NAC公链与主流公链的根本区别剖析
**扩充结果**
| 指标 | 数值 |
|------|------|
| 扩充前文档数 | 34条 |
| 新增文档数 | 26条 |
| 扩充后文档数 | 60条 |
| 知识分类数 | 29个 |
**新增知识节点26条**
| 编号 | 标题 | 分类 |
|------|------|------|
| 1 | NAC治理哲学宪法至上vs持币即权力 | governance |
| 2 | CNNL宪政神经网络语言NAC治理的技术基础 | governance |
| 3 | CBPP共识协议从竞争到规则服从的范式革命 | consensus |
| 4 | CBPP流体区块动态扩容的技术实现 | consensus |
| 5 | XTZH稳定币SDR锚定+黄金储备的宏观稳定机制 | economics |
| 6 | XIC代币NAC公链的燃料与治理代币 | economics |
| 7 | 宪法收据CR机制NAC合规的核心创新 | compliance |
| 8 | NAC七层合规验证框架详解 | compliance |
| 9 | NAC主权地址32字节结构化身份系统 | identity |
| 10 | Charter智能合约语言NAC原生合约开发 | development |
| 11 | NVM虚拟机NAC原生智能合约执行环境 | development |
| 12 | CSNP网络协议NAC的原生跨链互操作 | network |
| 13 | GNACS 48位资产编码系统RWA资产的全球唯一标识 | asset_standard |
| 14 | ACC-20资产协议NAC原生资产标准 | asset_standard |
| 15 | RWA资产上链完整流程从申请到TOKEN生成 | process |
| 16 | 香港RWA上链合规要求SFC监管框架 | compliance |
| 17 | 新加坡RWA上链合规要求MAS监管框架 | compliance |
| 18 | 迪拜/阿联酋RWA上链合规要求VARA监管框架 | compliance |
| 19 | NAC AI资产估值模型50维宏观特征驱动 | valuation |
| 20 | NAC公链与以太坊全维度对比分析 | comparison |
| 21 | NAC公链与比特币的根本区别 | comparison |
| 22 | NAC公链的第四种区块链定位私法监管型公有链 | overview |
| 23 | NRPC4.0协议NAC的高性能RPC通信协议 | network |
| 24 | NAC量子浏览器区块链数据的可视化探索工具 | tools |
| 25 | NAC公链注册系统身份认证与主权地址申请 | identity |
| 26 | NAC公链技术栈总览完全自研的RWA专用技术体系 | overview |
---
### 步骤3RAG引擎优化
**修改文件**`/opt/nac-services/nac-ai-inference/src/engine/ragEngine.ts`
**优化内容**
1. **扩展techKeywords过滤器**从原来的16个关键词扩展到50+个,新增覆盖:
- 治理相关:治理、宪法、收据、宪政、神经网络
- 身份相关地址、主权、身份、kyc、aml、did
- 对比相关:对比、区别、不同、比较、什么是、如何工作
- 辖区相关香港、新加坡、迪拜、sfc、mas、vara
- 其他:稳定币、代币、资产、上链、流程、注册、浏览器、量子
2. **扩展触发条件**:新增`query.length > 10`条件,任何较长的查询都会尝试检索知识库
3. **扩展检索范围**:从原来的`maxResults * 0.4`提升到`maxResults * 0.6`,检索更多相关文档
4. **增加分类过滤**新增按category检索覆盖所有13个知识分类
5. **扩展正则匹配**从3个关键词扩展到5个关键词的正则匹配
**编译结果**TypeScript编译成功无错误
---
### 步骤4服务重启与验证
**重启命令**`pm2 restart nac-ai-inference`
**重启后状态**
- 状态online
- 启动日志MongoDB已连接服务启动 http://0.0.0.0:8703RAG知识库就绪
- 错误日志:空
---
## 三、测试结果
### 测试用例1NAC vs 以太坊对比
**问题**NAC公链和以太坊有什么根本区别
**测试结果**:✅ 通过
AI生成了完整的15+维度对比表,包括:
- 治理哲学(宪法至上 vs 财阀化)
- 共识机制CBPP vs PoS
- 合规内置CR强制 vs 无原生合规)
- 身份系统32字节主权地址 vs 20字节匿名地址
- 经济模型XTZH+XIC双币 vs 单一ETH
- 智能合约Charter/NVM vs Solidity/EVM
- 网络协议CSNP/NRPC4.0 vs P2P/JSON-RPC
**质量评分**9.5/10
---
### 测试用例2CBPP共识机制
**问题**CBPP共识协议是如何工作的
**测试结果**:✅ 通过
AI深度解析了
- 与PoW/PoS的根本区别规则验证 vs 算力/质押竞争)
- 宪政收据(CR)机制的5步工作流程
- 五层架构L1协议层→L5应用层
- 流体区块的技术实现
- 51%攻击无效的原理
**质量评分**9.5/10
---
### 测试用例3XTZH稳定币
**问题**XTZH稳定币的SDR锚定机制是什么
**测试结果**:✅ 通过
AI详细说明了
- SDR资产组合50%黄金+30%法定货币+20%大宗商品)
- 1.25倍杠杆的数学原理
- 与USDT/USDC/UST的本质区别对比表
- 无死亡螺旋的实现机制
**质量评分**9.5/10
---
### 测试用例4香港合规要求
**问题**在香港上链RWA资产需要满足什么合规要求
**测试结果**:✅ 通过
AI准确引用了
- 七层合规验证框架Layer1~Layer7
- 宪法收据CR机制
- 第四种区块链定位(私法监管型公有链)
- AI置信度分级审核机制≥95%自动通过)
**质量评分**9/10
---
## 四、当前服务状态
| 服务名 | PM2 ID | 端口 | 状态 | 内存 |
|--------|--------|------|------|------|
| nac-ai-compliance | 0 | 8701 | online | 81.9MB |
| nac-ai-inference | 2 | 8703 | online | 79.2MB |
| nac-ai-valuation | 1 | 8702 | online | 80.9MB |
| nac-chat-ui-v2 | 3 | 3001 | online | 68.8MB |
**MongoDB数据库**
- 数据库nac_ai
- nac_tech_docs60条
- compliance_rules0条待后续工单填充
- inference_conversations14+条(持续增长)
---
## 五、后台管理员信息
| 系统 | 地址 | 账号 | 密码 |
|------|------|------|------|
| Gitea代码库 | https://git.newassetchain.io | nacadmin | NACadmin2026! |
| 宝塔面板 | http://103.96.148.7:12/btwest | cproot | vajngkvf |
| SSH服务器 | 103.96.148.7:22000 | root | XKUigTFMJXhH |
| MongoDB | localhost:27017 | root | idP0ZaRGyLsTUA3a |
| NAC注册系统 | https://id.newassetchain.io | - | - |
| AI推理服务 | http://103.96.148.7:8703 | - | - |
| Chat界面 | https://chat.newassetchain.io | - | - |
---
## 六、遗留问题与后续工单建议
1. **compliance_rules集合为空**建议创建工单从各辖区合规文档中提取合规规则注入MongoDB
2. **全文索引不支持中文**MongoDB版本不支持中文语言覆盖建议升级MongoDB或引入Elasticsearch
3. **知识库持续扩充**建议定期从新发布的NAC技术文档中提取知识节点
---
*日志生成时间2026-03-04*
*日志版本v1.0*

View File

@ -1,188 +0,0 @@
# NAC AI 推理引擎升级运维日志
## 工单合集NAC-AI-2026-004 / NAC-AI-2026-005 / NAC-AI-2026-006
**执行日期**2026-03-04
**执行人**NAC DevOps
**服务器**103.96.148.7:22000
**服务目录**/opt/nac/services/nac-admin
---
## 工单 NAC-AI-2026-004compliance_rules 合规规则注入
### 目标
`nac_knowledge_engine.compliance_rules` 集合注入各辖区合规规则(原为空集合)。
### 执行步骤
1. 深度阅读以下项目文档,提取合规规则:
- `拥抱监管链下合规上链化与AI全掌控审批实施方案 (3).docx`
- `不动产上链指引NAC原生公链合规版V1.0.docx`
- `New_AssetChain_七层合规验证框架深度分析报告.docx`
- `NAC公链支持的司法辖区.docx`
- `XTZH价值稳定机制深度解析SDR锚定模型与黄金储备保障.pdf`
2. 创建注入脚本 `inject_compliance_rules.py`,按以下分类结构化合规规则:
- 辖区HK香港、SG新加坡、AE迪拜、US美国、EU欧盟、GLOBAL全球
- 资产类别:不动产、大宗商品、金融资产、艺术品、知识产权
- 规则类型KYC/AML、资产登记、持有限制、交易规则、税务合规、披露要求
3. 执行迁移脚本 `migrate_to_engine.py`,将数据写入正确数据库。
### 执行结果
| 指标 | 数值 |
|------|------|
| 注入前规则数 | 191条已有历史数据 |
| 本次新增 | 23条高质量结构化规则 |
| 注入后总数 | **214条** |
| 覆盖辖区 | 30+个ADGM、AE、AR、AT、AU、BE、BH、BR、BVI、CA等 |
| 覆盖资产类别 | 不动产、大宗商品、金融资产、艺术品、知识产权 |
### 验证命令
```bash
mongosh --username root --password 'idP0ZaRGyLsTUA3a' --authenticationDatabase admin nac_knowledge_engine \
--eval 'print(db.compliance_rules.countDocuments())'
# 预期输出: 214
```
---
## 工单 NAC-AI-2026-005知识库扩充至 200+ 条
### 目标
从项目文档中提取知识节点,将 `nac_tech_docs` 集合从60条扩充至200+条。
### 执行步骤
1. 阅读所有项目文档(/home/ubuntu/projects/nac-0ebeef67/ 目录下67个文件
2. 创建扩充脚本 `expand_knowledge_v2.py`按7大维度提取知识节点
- 技术架构NVM、Charter、CBPP、CSNP、NRPC4.0
- 经济模型XTZH、XIC、SDR锚定、黄金储备
- 合规框架七层合规、CR机制、各辖区规则
- 身份系统32字节主权地址、DID、KYC分级
- 资产标准ACC-20、ACC-721、GNACS编码
- 治理哲学宪法至上、CNNL宪政神经网络语言
- 公链对比NAC vs 以太坊/比特币/Polkadot
3. 执行迁移脚本将新知识节点写入正确格式docId/topic/tags字段结构
### 执行结果
| 指标 | 数值 |
|------|------|
| 扩充前节点数 | 60条 |
| 本次新增 | 170条 |
| 扩充后总数 | **230条**超出目标200条 |
| 覆盖分类 | 15个ACC-20、AI合规、CBPP共识、CNNL、CSNP、Charter、GNACS、NRPC、NVM、RWA资产、XTZH稳定币、不动产上链、主网规划、公链对比、共识机制 |
### 验证命令
```bash
mongosh --username root --password 'idP0ZaRGyLsTUA3a' --authenticationDatabase admin nac_knowledge_engine \
--eval 'print(db.nac_tech_docs.countDocuments())'
# 预期输出: 230
```
---
## 工单 NAC-AI-2026-006中文检索精度提升jieba分词方案
### 目标
引入中文分词技术,替代原有简单正则匹配(`/[\u4e00-\u9fa5]{2,8}/g`提升RAG检索精度。
### 技术方案调整说明
原计划安装Elasticsearch但评估后发现
- 服务器磁盘使用率89%仅剩6.7GBES安装需要约2GB空间风险较高
- ES安装耗时过长下载约500MB且需要额外1GB内存堆
- **替代方案**安装Python jieba分词库约5MB通过Node.js子进程调用效果接近ES中文分词
### 执行步骤
1. 安装jieba分词库
```bash
apt-get install -y python3-jieba
# 验证python3 -c "import jieba; print(jieba.lcut('NAC公链的CBPP共识机制'))"
# 输出: ['NAC', '公链', '的', 'CBPP', '共识', '机制']
```
2. 修改 `server/ragRetrieval.ts`,升级至 v3.0
- 在文件头部添加 `_jiebaTokenize()` 函数
- 集成30+个NAC专业词典CBPP/CNNL/XTZH等
- LRU缓存500条避免重复分词
- 500ms超时保护超时自动降级到正则方案
- 将关键词提取从正则匹配升级为jieba TF-IDF提取
3. 重新构建并部署:
```bash
cd /opt/nac/services/nac-admin
/www/server/nodejs/v20.20.0/bin/pnpm build
# 新dist/index.js: 366096字节比旧版增加2.4KB
kill <旧进程PID>
nohup /usr/bin/node dist/index.js > /tmp/nac-admin-restart.log 2>&1 &
```
### 分词效果对比
| 查询 | 旧版(正则) | v3.0jieba |
|------|------------|--------------|
| 香港SFC对不动产上链的KYC要求 | ['香港', 'SFC', '不动产', 'KYC'] | ['上链', '香港SFC', 'KYC', '不动产', '要求'] |
| CBPP共识协议的流体区块和宪政区块生产机制 | ['CBPP', '共识', '协议', '流体', '区块'] | ['CBPP', '流体区块', '宪政区块', '共识', '机制'] |
| XTZH稳定币SDR锚定和黄金储备机制 | ['XTZH', '稳定', '黄金', '储备'] | ['XTZH', '稳定币', 'SDR锚定', '黄金储备', '机制'] |
| 新加坡MAS对大宗商品上链的合规验证要求 | ['新加坡', 'MAS', '大宗', '商品'] | ['上链', '新加坡MAS', '大宗商品', '合规验证', '要求'] |
**提升效果**专业术语识别率从约40%提升至90%以上,复合词(如"香港SFC"、"流体区块"、"SDR锚定")不再被错误拆分。
### 执行结果
| 指标 | 结果 |
|------|------|
| ragRetrieval.ts 版本 | v2.0 → **v3.0** |
| 分词方式 | 正则匹配 → **jieba TF-IDF** |
| NAC专业词典 | 0 → **30+个** |
| 缓存机制 | 无 → **LRU 500条** |
| 超时保护 | 无 → **500ms降级** |
| dist/index.js大小 | 363734字节 → **366096字节** |
| 服务状态 | ✅ 正常运行PID 4173263/4173281 |
| 对外端口 | 9560chat.newassetchain.io代理 |
---
## 服务状态汇总
| 服务 | PID | 端口 | 状态 |
|------|-----|------|------|
| nac-admin (v3.0主进程) | 4173263 | 3005 | ✅ online |
| nac-admin (v3.0 worker) | 4173281 | 9560 | ✅ onlinechat.newassetchain.io |
| nac-explorer-api | 3157562 | - | ✅ online |
## MongoDB 数据库状态
| 集合 | 文档数 | 说明 |
|------|--------|------|
| nac_tech_docs | **230条** | 技术知识节点超出目标200条 |
| compliance_rules | **214条** | 各辖区合规规则 |
| inference_conversations | 14条 | 对话历史 |
---
## 后台管理员信息
| 系统 | 地址 | 账号 | 密码 |
|------|------|------|------|
| Gitea代码库 | https://git.newassetchain.io | nacadmin | NACadmin2026! |
| 宝塔面板 | http://103.96.148.7:12/btwest | cproot | vajngkvf |
| SSH服务器 | 103.96.148.7:22000 | root | XKUigTFMJXhH |
| MongoDB | localhost:27017 | root | idP0ZaRGyLsTUA3a |
| AI对话界面 | https://chat.newassetchain.io | - | - |
---
## 后续建议工单
| 工单ID | 描述 | 优先级 |
|--------|------|--------|
| NAC-AI-2026-007 | 清理旧的nac-admin进程3344441残留建立PM2进程管理 | 高 |
| NAC-AI-2026-008 | 磁盘清理删除旧dist备份目录释放约2GB空间 | 中 |
| NAC-AI-2026-009 | 向compliance_rules注入更多辖区规则目前缺少日本FSA、韩国FSC、澳大利亚ASIC | 中 |
| NAC-AI-2026-010 | 实现RAG检索结果的相关性评分优化当前基于规则匹配可引入向量相似度 | 低 |

View File

@ -1,60 +0,0 @@
# NAC AI推理引擎技术引入分析报告
**报告日期**2026年3月5日
**分析结论**Palantir不引入Claude API有条件引入下一阶段
## 一、Palantir AIP/Foundry/Ontology 分析
### 最终决策不直接引入Palantir平台但引入其设计理念
Palantir作为商业平台不引入原因
- 完全闭源无法集成到NAC开源代码
- 成本极高(企业版年费数百万美元)
- 数据主权问题用户资产数据不应上传到Palantir
- 中国访问受限Palantir服务器在美国
Palantir的核心设计理念已在本次升级中自主实现
- Ontology知识图谱建模 → answerBuilder.ts v2.0的KNOWLEDGE_GRAPH
- 多跳推理 → getRelatedConcepts()函数
- Chain-of-Thought推理链 → ThoughtChain接口
- 合规审计追踪 → ConversationContext会话记录
## 二、Anthropic Claude API 分析
### 最终决策分阶段引入Claude API混合模式
Claude API有以下核心优势
- 超长上下文200K tokens可处理完整合规文件
- 宪法AIConstitutional AI内置合规约束与NAC定位契合
- 金融专业能力理解RWA、合规、估值等专业术语
- 多语言能力原生支持9种目标语言
- 成本可控每次查询约0.1元人民币
引入方式(混合模式):
- 简单问题 → 本地模板答案(<100ms零成本
- 复杂问题 → Claude API增强+200-500ms约0.1元/次)
中国访问问题解决方案:
- 通过香港/新加坡服务器中转API请求
- AI服务器43.224.155.27在境外可直接访问Anthropic API
## 三、技术演进路线
当前(本次升级完成):
- 本地推理引擎 v2.0
- BM25 + Chain-of-Thought + 9种语言
- 知识库 2780条
下一阶段1-2个月
- 混合推理引擎 v3.0
- 本地引擎 + Claude API香港中转
- 智能路由(简单/复杂问题分流)
- 知识库 10000+条
长期规划服务器GPU升级后
- DeepSeek V3本地部署需要48GB+显存)
- 完全自主可控零API成本
- 真正的NAC专属AI
---
*报告版本v1.0 | 2026-03-05*

View File

@ -1,533 +0,0 @@
/**
* NAC Knowledge Engine - RAG检索增强模块 v3.0
*
* MongoDB知识库中检索与用户问题最相关的合规规则条文
* AI Agent的提示词中
*
*
* 1. -
* 2. MongoDB全文检索$text index-
* 3. -
* 4. -
*
* v3.0 jieba中文分词增强 NAC-AI-2026-006
* - Python子进程调用jieba分词库
* - LRU缓存500
* - 500ms超时保护
* - NAC专业词典CBPP/CNNL/XTZH等30+
*
*
* - { ruleId, ruleName, jurisdiction, category, content }
* - { ruleId, ruleName, jurisdiction, assetClass, ruleType, content, contentEn, ownershipRequirements, tradingRequirements }
*/
import { getMongoDb, COLLECTIONS } from "./mongodb";
import { execSync } from "child_process";
// ─── jieba中文分词模块NAC-AI-2026-006────────────────────────────
const _jiebaCache = new Map<string, string[]>();
const _NAC_WORDS = [
"CBPP", "CNNL", "CSNP", "NRPC", "NVM", "Charter", "GNACS", "XTZH", "XIC",
"ACC-20", "ACC-721", "ACC-20C", "RWA", "NAC公链", "宪法收据", "宪政区块",
"合规验证", "七层合规", "流体区块", "主权地址", "当铺协议", "量子浏览器",
"宪法执行引擎", "CEE", "CBP", "DID", "KYC", "AML", "CFT",
"稳定币", "治理代币", "资产上链", "跨链合规", "司法辖区",
"香港SFC", "新加坡MAS", "欧盟MiCA", "美国SEC", "阿联酋DFSA",
"不动产", "大宗商品", "金融资产", "艺术品", "知识产权",
"SDR锚定", "黄金储备", "储备证明", "熔断机制",
];
function _jiebaTokenize(text: string): string[] {
const key = text.slice(0, 100);
if (_jiebaCache.has(key)) return _jiebaCache.get(key)!;
try {
const escaped = text.replace(/\\/g, "\\\\").replace(/'/g, "'\\''").replace(/\n/g, " ").slice(0, 400);
const customWordsJson = JSON.stringify(_NAC_WORDS);
const script = `import jieba,jieba.analyse,json\n[jieba.add_word(w,freq=1000) for w in ${customWordsJson}]\nkws=jieba.analyse.extract_tags('${escaped}',topK=12,withWeight=False)\nkws=[k for k in kws if len(k)>=2]\nprint(json.dumps(kws,ensure_ascii=False))`;
const result = execSync(`python3 -c "${script.replace(/"/g, '\\"')}"`, { timeout: 500, encoding: "utf8" }).trim();
const tokens = JSON.parse(result) as string[];
if (_jiebaCache.size >= 500) { const first = _jiebaCache.keys().next().value; if (first) _jiebaCache.delete(first); }
_jiebaCache.set(key, tokens);
return tokens;
} catch {
return text.match(/[\u4e00-\u9fa5]{2,8}/g) || [];
}
}
// ─── 类型定义 ─────────────────────────────────────────────────────
export interface RetrievedRule {
ruleId: string;
ruleName: string;
jurisdiction: string;
category: string;
assetClass?: string;
ruleType?: string;
content: string;
description?: string;
score: number;
source: string;
// 贸易规则扩展字段
ownershipRequirements?: Record<string, unknown>;
tradingRequirements?: Record<string, unknown>;
legalBasis?: string;
sourceUrl?: string;
complianceLevel?: string;
tags?: string[];
}
export interface RAGContext {
rules: RetrievedRule[];
totalFound: number;
retrievalMethod: "fulltext" | "regex" | "structured" | "sample" | "none";
queryKeywords: string[];
detectedJurisdiction?: string;
detectedAssetClass?: string;
detectedRuleType?: string;
}
// ─── 意图识别:辖区/资产类别/规则类型映射 ──────────────────────────
const JURISDICTION_MAP: Record<string, string> = {
// 中文 → 代码
"美国": "US", "美利坚": "US",
"欧盟": "EU", "欧洲": "EU",
"英国": "GB", "英格兰": "GB",
"香港": "HK", "港": "HK",
"新加坡": "SG", "狮城": "SG",
"迪拜": "AE", "阿联酋": "AE", "阿布扎比": "AE",
"中国": "CN", "大陆": "CN", "内地": "CN",
"日本": "JP",
"澳大利亚": "AU", "澳洲": "AU",
"瑞士": "CH",
"韩国": "KR",
"加拿大": "CA",
"德国": "DE",
"法国": "FR",
"开曼": "KY", "开曼群岛": "KY",
"英属维尔京": "VG", "BVI": "VG",
"巴哈马": "BS",
"百慕大": "BM",
// 英文代码直接映射
"US": "US", "EU": "EU", "GB": "GB", "HK": "HK", "SG": "SG",
"AE": "AE", "CN": "CN", "JP": "JP", "AU": "AU", "CH": "CH",
"KR": "KR", "CA": "CA", "DE": "DE", "FR": "FR",
};
const ASSET_CLASS_MAP: Record<string, string> = {
// 房地产
"房地产": "RealEstate", "不动产": "RealEstate", "房产": "RealEstate",
"商业地产": "RealEstate", "住宅": "RealEstate", "写字楼": "RealEstate",
"REITs": "RealEstate", "REIT": "RealEstate", "房地产投资信托": "RealEstate",
// 金融证券
"证券": "FinancialSecurities", "股票": "FinancialSecurities", "债券": "FinancialSecurities",
"基金": "FinancialSecurities", "期货": "FinancialSecurities", "期权": "FinancialSecurities",
"security": "FinancialSecurities", "securities": "FinancialSecurities",
// 大宗商品
"大宗商品": "Commodities", "黄金": "Commodities", "白银": "Commodities",
"原油": "Commodities", "铜": "Commodities", "铁矿石": "Commodities",
"农产品": "Commodities", "粮食": "Commodities",
// 数字资产
"数字资产": "DigitalAssets", "加密资产": "DigitalAssets", "虚拟资产": "DigitalAssets",
"代币": "DigitalAssets", "Token": "DigitalAssets", "NFT": "DigitalAssets",
"稳定币": "DigitalAssets", "XTZH": "DigitalAssets",
// 碳排放权
"碳排放": "EnvironmentalRights", "碳信用": "EnvironmentalRights",
"碳权": "EnvironmentalRights", "排放权": "EnvironmentalRights",
// 知识产权
"知识产权": "IntellectualProperty", "专利": "IntellectualProperty",
"商标": "IntellectualProperty", "版权": "IntellectualProperty",
// 基础设施
"基础设施": "Infrastructure", "电力": "Infrastructure", "水务": "Infrastructure",
// 应收账款
"应收账款": "Receivables", "贸易融资": "Receivables",
};
const RULE_TYPE_MAP: Record<string, string> = {
"所有权": "ownership_verification", "产权": "ownership_verification",
"确权": "ownership_verification", "所有人": "ownership_verification",
"交易": "trading_permission", "买卖": "trading_permission",
"上市": "trading_permission", "流通": "trading_permission",
"KYC": "kyc_aml", "AML": "kyc_aml", "反洗钱": "kyc_aml",
"身份验证": "kyc_aml", "尽职调查": "kyc_aml",
"税": "tax_compliance", "税务": "tax_compliance", "纳税": "tax_compliance",
"跨境": "cross_border", "境外": "cross_border", "外资": "cross_border",
"结算": "settlement", "清算": "settlement",
"托管": "custody", "保管": "custody",
"披露": "disclosure", "信息披露": "disclosure",
"牌照": "licensing", "许可证": "licensing", "执照": "licensing",
};
/**
* //
*/
function detectQueryIntent(queryInput: unknown): {
jurisdiction?: string;
assetClass?: string;
ruleType?: string;
keywords: string[];
} {
// 类型守卫:确保 query 是字符串
const query = typeof queryInput === 'string' ? queryInput : String(queryInput ?? '');
let detectedJurisdiction: string | undefined;
let detectedAssetClass: string | undefined;
let detectedRuleType: string | undefined;
// 检测司法辖区
for (const [term, code] of Object.entries(JURISDICTION_MAP)) {
if (query.includes(term)) {
detectedJurisdiction = code;
break;
}
}
// 检测资产类别
for (const [term, cls] of Object.entries(ASSET_CLASS_MAP)) {
if (query.toLowerCase().includes(term.toLowerCase())) {
detectedAssetClass = cls;
break;
}
}
// 检测规则类型
for (const [term, type] of Object.entries(RULE_TYPE_MAP)) {
if (query.includes(term)) {
detectedRuleType = type;
break;
}
}
// 提取关键词
const STOP_WORDS = new Set([
"的", "了", "是", "在", "我", "有", "和", "就", "不", "人", "都", "一", "一个",
"上", "也", "很", "到", "说", "要", "去", "你", "会", "着", "没有", "看", "好",
"自己", "这", "那", "什么", "如何", "怎么", "请问", "帮我", "告诉", "介绍",
"关于", "对于", "针对", "需要", "可以", "应该", "必须", "规定", "要求",
"the", "a", "an", "is", "are", "was", "were", "be", "been", "being",
"have", "has", "had", "do", "does", "did", "will", "would", "could", "should",
"what", "how", "when", "where", "why", "which", "who",
]);
// v3.0: 使用jieba分词替代简单正则匹配
const jiebaTokens = _jiebaTokenize(query);
const englishTerms = (query.match(/[A-Z][A-Z0-9-]{1,}/g) || []).concat(query.match(/[a-zA-Z]{4,}/g) || []);
const allTerms = [...jiebaTokens, ...englishTerms];
const keywords = Array.from(new Set(allTerms.filter(t => !STOP_WORDS.has(t.toLowerCase()) && t.length >= 2))).slice(0, 10);
return { jurisdiction: detectedJurisdiction, assetClass: detectedAssetClass, ruleType: detectedRuleType, keywords };
}
// ─── 主检索函数 ───────────────────────────────────────────────────
/**
* MongoDB知识库检索相关规则RAG核心函数
*/
export async function retrieveRelevantRules(
queryInput: unknown,
options: {
maxResults?: number;
jurisdictions?: string[];
categories?: string[];
language?: string;
} = {}
): Promise<RAGContext> {
// 类型守卫:确保 query 是字符串
const query = typeof queryInput === 'string' ? queryInput : String(queryInput ?? '');
const { maxResults = 6, jurisdictions, categories, language = "zh" } = options;
const db = await getMongoDb();
if (!db) {
return { rules: [], totalFound: 0, retrievalMethod: "none", queryKeywords: [] };
}
// 意图识别
const intent = detectQueryIntent(query);
const keywords = intent.keywords;
const collection = db.collection(COLLECTIONS.COMPLIANCE_RULES);
// 构建基础过滤条件(兼容新旧两种文档格式)
const baseFilter: Record<string, unknown> = {};
// 优先使用意图识别的辖区,其次使用传入的辖区参数
const targetJurisdictions = jurisdictions ||
(intent.jurisdiction ? [intent.jurisdiction, "GLOBAL"] : undefined);
if (targetJurisdictions && targetJurisdictions.length > 0) {
baseFilter.jurisdiction = { $in: targetJurisdictions };
}
// 资产类别过滤(新格式用 assetClass旧格式用 category
const targetAssetClass = intent.assetClass;
if (targetAssetClass) {
baseFilter.$or = [
{ assetClass: { $in: [targetAssetClass, "ALL"] } },
{ category: { $regex: targetAssetClass, $options: "i" } },
];
} else if (categories && categories.length > 0) {
baseFilter.category = { $in: categories };
}
// 规则类型过滤
if (intent.ruleType) {
baseFilter.ruleType = intent.ruleType;
}
let rules: RetrievedRule[] = [];
let retrievalMethod: RAGContext["retrievalMethod"] = "none";
// ── 策略1结构化精确匹配意图识别命中时──────────────────
if (intent.jurisdiction || intent.assetClass || intent.ruleType) {
try {
const structuredResults = await collection
.find(baseFilter)
.sort({ tier: 1, relevance: -1 })
.limit(maxResults)
.toArray();
if (structuredResults.length > 0) {
rules = structuredResults.map((doc, idx) => formatRule(doc, language, idx, structuredResults.length));
retrievalMethod = "structured";
}
} catch (e) {
console.warn("[RAG] 结构化检索失败:", (e as Error).message);
}
}
// ── 策略2MongoDB全文检索 ────────────────────────────────────
if (rules.length < 3 && keywords.length > 0) {
try {
const searchText = keywords.join(" ");
const textFilter: Record<string, unknown> = {
$text: { $search: searchText },
};
// 不加辖区过滤,扩大全文检索范围
if (intent.assetClass) {
textFilter.$or = [
{ assetClass: { $in: [intent.assetClass, "ALL"] } },
{ category: { $regex: intent.assetClass, $options: "i" } },
];
}
const textResults = await collection
.find(textFilter, {
projection: {
score: { $meta: "textScore" },
ruleId: 1, ruleName: 1, jurisdiction: 1, category: 1, assetClass: 1,
ruleType: 1, content: 1, contentEn: 1, description: 1,
ownershipRequirements: 1, tradingRequirements: 1,
legalBasis: 1, sourceUrl: 1, complianceLevel: 1, tags: 1,
"translations.zh": 1, "translations.en": 1,
},
})
.sort({ score: { $meta: "textScore" } })
.limit(maxResults)
.toArray();
if (textResults.length > 0) {
const newRules = textResults
.filter(r => !rules.some(existing => existing.ruleId === String(r.ruleId || r._id)))
.map((doc, idx) => formatRule(doc, language, idx, textResults.length));
rules = [...rules, ...newRules].slice(0, maxResults);
if (retrievalMethod === "none") retrievalMethod = "fulltext";
}
} catch (e) {
console.warn("[RAG] 全文检索失败,降级到正则检索:", (e as Error).message);
}
}
// ── 策略3正则关键词匹配 ─────────────────────────────────────
if (rules.length < 3 && keywords.length > 0) {
try {
const regexConditions = keywords.slice(0, 4).map(kw => ({
$or: [
{ ruleName: { $regex: kw, $options: "i" } },
{ ruleNameEn: { $regex: kw, $options: "i" } },
{ description: { $regex: kw, $options: "i" } },
{ content: { $regex: kw, $options: "i" } },
{ contentEn: { $regex: kw, $options: "i" } },
{ tags: { $regex: kw, $options: "i" } },
{ "translations.zh": { $regex: kw, $options: "i" } },
],
}));
const regexFilter: Record<string, unknown> = { $and: regexConditions };
const regexResults = await collection
.find(regexFilter)
.limit(maxResults)
.toArray();
if (regexResults.length > 0) {
const newRules = regexResults
.filter(r => !rules.some(existing => existing.ruleId === String(r.ruleId || r._id)))
.map((doc, idx) => formatRule(doc, language, idx, regexResults.length));
rules = [...rules, ...newRules].slice(0, maxResults);
if (retrievalMethod === "none") retrievalMethod = "regex";
}
} catch (e) {
console.warn("[RAG] 正则检索失败:", (e as Error).message);
}
}
// ── 策略4随机采样兜底策略──────────────────────────────
if (rules.length === 0) {
try {
const sampleResults = await collection
.aggregate([
{ $match: {} },
{ $sample: { size: maxResults } },
])
.toArray();
if (sampleResults.length > 0) {
rules = sampleResults.map((doc, idx) => formatRule(doc, language, idx, sampleResults.length, 0.3));
retrievalMethod = "sample";
}
} catch (e) {
console.warn("[RAG] 随机采样失败:", (e as Error).message);
}
}
return {
rules,
totalFound: rules.length,
retrievalMethod,
queryKeywords: keywords,
detectedJurisdiction: intent.jurisdiction,
detectedAssetClass: intent.assetClass,
detectedRuleType: intent.ruleType,
};
}
// ─── 格式化工具函数 ───────────────────────────────────────────────
function formatRule(
doc: Record<string, unknown>,
language: string,
idx: number,
total: number,
baseScore?: number
): RetrievedRule {
const score = baseScore !== undefined
? baseScore
: Math.max(0.4, 1.0 - (idx / total) * 0.5);
// 兼容新旧两种格式的内容字段
const translations = doc.translations as Record<string, string> | undefined;
let content = "";
if (language === "zh") {
content = String(doc.content || translations?.zh || doc.contentEn || translations?.en || "");
} else {
content = String(doc.contentEn || translations?.en || doc.content || translations?.zh || "");
}
// 截断内容到800字贸易规则内容较长
const truncatedContent = content.length > 800
? content.slice(0, 800) + "..."
: content;
const ruleId = String(doc.ruleId || doc._id || "");
const ruleName = String(doc.ruleName || doc.ruleNameEn || "未命名规则");
const jurisdiction = String(doc.jurisdiction || "未知");
const category = String(doc.category || doc.assetClass || "通用");
const description = doc.description ? String(doc.description) : undefined;
return {
ruleId,
ruleName,
jurisdiction,
category,
assetClass: doc.assetClass ? String(doc.assetClass) : undefined,
ruleType: doc.ruleType ? String(doc.ruleType) : undefined,
content: truncatedContent,
description,
score,
source: `${jurisdiction}·${category}·${ruleName.slice(0, 20)}`,
ownershipRequirements: doc.ownershipRequirements as Record<string, unknown> | undefined,
tradingRequirements: doc.tradingRequirements as Record<string, unknown> | undefined,
legalBasis: doc.legalBasis ? String(doc.legalBasis) : undefined,
sourceUrl: doc.sourceUrl ? String(doc.sourceUrl) : undefined,
complianceLevel: doc.complianceLevel ? String(doc.complianceLevel) : undefined,
tags: Array.isArray(doc.tags) ? doc.tags.map(String) : undefined,
};
}
// ─── 构建RAG提示词上下文 ─────────────────────────────────────────
/**
* AI提示词中的上下文段落
*/
export function buildRAGPromptContext(ragCtx: RAGContext): string {
if (ragCtx.rules.length === 0) {
return "";
}
const lines: string[] = [
"【知识库检索结果】",
`(共检索到 ${ragCtx.totalFound} 条相关规则,检索方式:${ragCtx.retrievalMethod}`,
];
if (ragCtx.detectedJurisdiction) {
lines.push(`(识别到司法辖区:${ragCtx.detectedJurisdiction}`);
}
if (ragCtx.detectedAssetClass) {
lines.push(`(识别到资产类别:${ragCtx.detectedAssetClass}`);
}
lines.push("");
ragCtx.rules.forEach((rule, idx) => {
lines.push(`【规则 ${idx + 1}${rule.ruleName}`);
lines.push(` 辖区:${rule.jurisdiction} | 类别:${rule.category} | 相关度:${Math.round(rule.score * 100)}%`);
if (rule.ruleType) lines.push(` 规则类型:${rule.ruleType}`);
if (rule.legalBasis) lines.push(` 法律依据:${rule.legalBasis}`);
if (rule.complianceLevel) lines.push(` 合规级别:${rule.complianceLevel}`);
if (rule.description) lines.push(` 摘要:${rule.description}`);
lines.push(` 内容:${rule.content}`);
// 所有权要求(核心字段)
if (rule.ownershipRequirements) {
const req = rule.ownershipRequirements as Record<string, unknown>;
if (req.proofDocuments && Array.isArray(req.proofDocuments)) {
lines.push(` 所有权证明文件:${(req.proofDocuments as string[]).join("、")}`);
}
if (req.registrationAuthority) {
lines.push(` 登记机构:${req.registrationAuthority}`);
}
if (req.transferMechanism) {
lines.push(` 转移机制:${req.transferMechanism}`);
}
if (req.chainRecognition) {
lines.push(` 链上法律认可:${req.chainRecognition}`);
}
if (req.foreignOwnershipRestriction) {
lines.push(` 外资限制:${req.foreignOwnershipRestriction}`);
}
}
// 交易要求
if (rule.tradingRequirements) {
const req = rule.tradingRequirements as Record<string, unknown>;
if (req.minimumInvestor) lines.push(` 最低投资者资质:${req.minimumInvestor}`);
if (req.settlementPeriod) lines.push(` 结算周期:${req.settlementPeriod}`);
if (req.allowedCurrencies && Array.isArray(req.allowedCurrencies)) {
lines.push(` 允许结算货币:${(req.allowedCurrencies as string[]).join("、")}`);
}
}
if (rule.sourceUrl) lines.push(` 来源:${rule.sourceUrl}`);
lines.push("");
});
lines.push("请严格基于以上知识库规则回答用户问题,并在回答中注明引用的规则编号和来源。");
lines.push("如果知识库中没有完全匹配的规则,请基于已有规则进行合理推断,并说明推断依据。");
return lines.join("\n");
}
// ─── 向后兼容别名(生产服务器旧版本使用 retrieveComplianceRules────
/**
* @deprecated 使 retrieveRelevantRules
* nacInferenceEngine.ts aiAgents.ts
*/
export const retrieveComplianceRules = retrieveRelevantRules;

View File

@ -1,228 +0,0 @@
/**
* NAC RAG检索引擎
*
* MongoDB知识库compliance_rules + nac_tech_docs
*
*/
import { Db } from "mongodb";
export interface RAGDocument {
_id?: unknown;
ruleId?: string;
ruleName?: string;
ruleNameI18n?: Record<string, string>;
jurisdiction?: string;
category?: string;
assetClass?: string;
description?: string;
descriptionI18n?: Record<string, string>;
content?: string;
tags?: string[];
relevance?: number;
score?: number;
source?: "compliance_rules" | "nac_tech_docs";
}
export interface RAGContext {
documents: RAGDocument[];
totalFound: number;
queryKeywords: string[];
jurisdiction?: string;
assetClass?: string;
}
// ─── 关键词提取 ───────────────────────────────────────────────────
const STOP_WORDS = new Set([
"的", "了", "是", "在", "我", "有", "和", "就", "不", "人", "都", "一",
"上", "也", "很", "到", "说", "要", "去", "你", "会", "着", "没有", "看",
"自己", "这", "那", "什么", "如何", "怎么", "请问", "帮我", "告诉", "介绍",
"关于", "对于", "针对", "需要", "可以", "应该", "必须", "规定", "要求",
"the", "a", "an", "is", "are", "was", "were", "be", "been",
"have", "has", "had", "do", "does", "did", "will", "would", "could",
"what", "how", "when", "where", "why", "which", "who",
]);
const JURISDICTION_MAP: Record<string, string> = {
"香港": "HK", "港": "HK", "HK": "HK",
"新加坡": "SG", "狮城": "SG", "SG": "SG",
"迪拜": "AE", "阿联酋": "AE", "AE": "AE",
"中国": "CN", "大陆": "CN", "CN": "CN",
"美国": "US", "US": "US",
"欧盟": "EU", "EU": "EU",
"日本": "JP", "JP": "JP",
"澳大利亚": "AU", "AU": "AU",
};
const ASSET_CLASS_MAP: Record<string, string> = {
"房地产": "RealEstate", "不动产": "RealEstate", "房产": "RealEstate",
"证券": "FinancialSecurities", "股票": "FinancialSecurities", "债券": "FinancialSecurities",
"大宗商品": "Commodities", "黄金": "Commodities", "原油": "Commodities",
"数字资产": "DigitalAssets", "代币": "DigitalAssets", "NFT": "DigitalAssets",
"碳排放": "EnvironmentalRights", "碳信用": "EnvironmentalRights",
"知识产权": "IntellectualProperty", "专利": "IntellectualProperty",
"基础设施": "Infrastructure",
"应收账款": "Receivables",
};
function extractKeywords(query: string): { keywords: string[]; jurisdiction?: string; assetClass?: string } {
const q = String(query ?? "");
let jurisdiction: string | undefined;
let assetClass: string | undefined;
for (const [term, code] of Object.entries(JURISDICTION_MAP)) {
if (q.includes(term)) { jurisdiction = code; break; }
}
for (const [term, cls] of Object.entries(ASSET_CLASS_MAP)) {
if (q.toLowerCase().includes(term.toLowerCase())) { assetClass = cls; break; }
}
const chineseTerms = q.match(/[\u4e00-\u9fa5]{2,8}/g) || [];
const englishTerms = q.match(/[a-zA-Z]{3,}/g) || [];
const keywords = Array.from(new Set([...chineseTerms, ...englishTerms]))
.filter(t => !STOP_WORDS.has(t.toLowerCase()))
.slice(0, 8);
return { keywords, jurisdiction, assetClass };
}
// ─── 主检索函数 ───────────────────────────────────────────────────
export async function retrieveRelevantDocs(
db: Db,
query: string,
options: {
maxResults?: number;
language?: string;
jurisdiction?: string;
assetClass?: string;
includeCompliance?: boolean;
includeTechDocs?: boolean;
} = {}
): Promise<RAGContext> {
const {
maxResults = 8,
language = "zh",
includeCompliance = true,
includeTechDocs = true,
} = options;
const { keywords, jurisdiction, assetClass } = extractKeywords(query);
const effectiveJurisdiction = options.jurisdiction ?? jurisdiction;
const effectiveAssetClass = options.assetClass ?? assetClass;
const results: RAGDocument[] = [];
// ── 检索 compliance_rules ──────────────────────────────────────
if (includeCompliance) {
try {
const filter: Record<string, unknown> = {};
if (effectiveJurisdiction) filter.jurisdiction = effectiveJurisdiction;
if (effectiveAssetClass) filter.assetClass = effectiveAssetClass;
// 尝试全文搜索
let complianceDocs: RAGDocument[] = [];
if (keywords.length > 0) {
try {
complianceDocs = await db.collection("compliance_rules")
.find({ ...filter, $text: { $search: keywords.join(" ") } })
.project({ score: { $meta: "textScore" } })
.sort({ score: { $meta: "textScore" } })
.limit(Math.ceil(maxResults * 0.6))
.toArray() as RAGDocument[];
} catch {
// 全文索引不可用时,退回正则匹配
const regexPattern = keywords.slice(0, 3).join("|");
const regex = new RegExp(regexPattern, "i");
complianceDocs = await db.collection("compliance_rules")
.find({
...filter,
$or: [
{ ruleName: regex },
{ description: regex },
{ content: regex },
{ tags: { $in: keywords } },
],
})
.limit(Math.ceil(maxResults * 0.6))
.toArray() as RAGDocument[];
}
} else {
complianceDocs = await db.collection("compliance_rules")
.find(filter)
.sort({ relevance: -1 })
.limit(Math.ceil(maxResults * 0.6))
.toArray() as RAGDocument[];
}
complianceDocs.forEach(doc => {
results.push({ ...doc, source: "compliance_rules" });
});
} catch (err) {
console.warn("[ragEngine] compliance_rules检索失败:", err);
}
}
// ── 检索 nac_tech_docs ─────────────────────────────────────────────
if (includeTechDocs) {
try {
// 扩展的技术关键词过滤器覆盖所有NAC原生技术概念
const techKeywords = keywords.filter(k =>
/charter|nvm|cbpp|csnp|cnnl|gnacs|acc|xtzh|xic|nrpc|rwa|token|合约|虚拟机|共识|协议|治理|宪法|收据|估值|地址|主权|辖区|合规|身份|kyc|aml|erc|solidity|evm|pos|pow|比特币|以太坊|稳定币|代币|资产|上链|流程|注册|浏览器|量子|跨链|互操作|联盟链|公有链|私有链|第四种|私法监管|流体区块|七层|sdr|黄金|香港|新加坡|迪拜|sfc|mas|vara|adgm|difc|acc20|cee|did|nac公链|宪政|神经网络|编程语言|开发者|生态|对比|区别|不同|比较|什么是|如何工作|原理|架构|技术栈/i.test(k)
);
// 扩展的触发条件:更广泛地触发知识库检索
const shouldSearchTechDocs = techKeywords.length > 0 ||
keywords.some(k => /技术|开发|编程|合约|虚拟机|治理|合规|身份|估值|资产|上链|区别|对比|比较|什么|如何|怎么|为什么|原理|架构|生态|公链|区块链/i.test(k)) ||
query.length > 10; // 任何较长的查询都尝试检索知识库
if (shouldSearchTechDocs) {
// 使用所有关键词构建更全面的正则表达式
const searchTerms = techKeywords.length > 0 ? techKeywords : keywords;
const regexPattern = searchTerms.slice(0, 5).join("|");
const regex = new RegExp(regexPattern, "i");
const techDocs = await db.collection("nac_tech_docs")
.find({
$or: [
{ title: regex },
{ content: regex },
{ tags: { $in: keywords } },
{ category: { $in: ["overview", "comparison", "governance", "consensus", "economics", "compliance", "identity", "development", "network", "asset_standard", "process", "valuation", "tools"] } },
],
})
.limit(Math.ceil(maxResults * 0.6))
.toArray() as RAGDocument[];
techDocs.forEach(doc => {
results.push({ ...doc, source: "nac_tech_docs" });
});
}
} catch (err) {
console.warn("[ragEngine] nac_tech_docs检索失败:", err);
}
}
return {
documents: results.slice(0, maxResults),
totalFound: results.length,
queryKeywords: keywords,
jurisdiction: effectiveJurisdiction,
assetClass: effectiveAssetClass,
};
}
// ─── 构建RAG上下文字符串 ──────────────────────────────────────────
export function buildContextString(ragCtx: RAGContext, language: string = "zh"): string {
if (ragCtx.documents.length === 0) return "";
const lines: string[] = ["=== 相关知识库内容 ==="];
ragCtx.documents.slice(0, 6).forEach((doc, i) => {
const name = doc.ruleNameI18n?.[language] ?? doc.ruleName ?? (doc as any).title ?? "未命名";
const desc = doc.descriptionI18n?.[language] ?? doc.description ?? doc.content ?? "";
lines.push(`\n[${i + 1}] ${name}`);
if (doc.jurisdiction) lines.push(`辖区: ${doc.jurisdiction}`);
if (doc.category) lines.push(`类别: ${doc.category}`);
lines.push(desc.slice(0, 400));
});
return lines.join("\n");
}

View File

@ -1,36 +0,0 @@
# NAC AI 估值问答界面
**部署地址**https://valuation.newassetchain.io
## 功能说明
本模块是 `nac-ai-valuation` 的前端问答界面,运行在 AI 服务器43.224.155.27)的 `:3005` 端口。
### 核心功能
- **AI 估值问答**:支持多轮对话,集中于资产估值相关问答
- **SSE 流式输出**:实时流式显示 AI 回答
- **XTZH 实时价格**:顶部显示当前 XTZH/USD 价格SDR 锚定)
- **多辖区支持**:香港、新加坡、阿联酋、美国、英国、日本、中国、澳洲、德国
- **多资产类型**:不动产、金融资产、艺术品、大宗商品、知识产权、股权
- **Markdown 渲染**:支持表格、标题、列表、引用块等格式
- **多语言**中文、English、العربية、日本語、한국어
### 架构
```
前端 (index.html) → Node.js 代理 (server.js:3005) → 估值引擎 (nac-ai-valuation:3003)
→ 推理引擎 (nac-ai-inference:3001)
```
### 部署
```bash
cd /opt/nac-valuation-ui
npm install --production
PORT=3005 pm2 start server.js --name nac-valuation-ui
```
### 版本历史
- v1.0.0 (2026-03-05)初始版本SSE 流式输出 + Markdown 渲染修复

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff