NAC_Blockchain/ops/nac-admin/server/aiAgents.ts

439 lines
16 KiB
TypeScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/**
* NAC Knowledge Engine - AI智能体系统
*
* 四类Agent无Manus依赖使用OpenAI兼容接口
* 1. KnowledgeQAAgent - 知识库问答(基于合规规则库)
* 2. ComplianceAgent - 合规分析(七层合规验证框架)
* 3. TranslationAgent - 多语言翻译(七种语言)
* 4. ApprovalAssistAgent - 审批辅助(案例分析与建议)
*
* 使用环境变量:
* NAC_AI_API_URL - AI接口地址OpenAI兼容
* NAC_AI_API_KEY - AI接口密钥
* NAC_AI_MODEL - 模型名称(默认 qwen-plus 或 gpt-3.5-turbo
*/
import { getMongoDb, COLLECTIONS } from "./mongodb";
import { retrieveRelevantRules, buildRAGPromptContext } from "./ragRetrieval";
// ─── 基础类型定义 ─────────────────────────────────────────────────
export type AgentType = "knowledge_qa" | "compliance" | "translation" | "approval_assist";
export interface AgentMessage {
role: "system" | "user" | "assistant";
content: string;
}
export interface AgentRequest {
agentType: AgentType;
userMessage: string;
conversationHistory?: AgentMessage[];
context?: Record<string, unknown>;
}
export interface AgentResponse {
agentType: AgentType;
message: string;
confidence: number; // 0-1
sources?: string[]; // 引用的知识库条目
suggestions?: string[]; // 后续操作建议
metadata?: Record<string, unknown>;
}
// ─── AI接口调用OpenAI兼容无Manus依赖────────────────────────
export function isAgentConfigured(): boolean {
return !!(process.env.NAC_AI_API_URL && process.env.NAC_AI_API_KEY);
}
async function callAgentLLM(
messages: AgentMessage[],
maxTokens = 4096,
temperature = 0.7
): Promise<string> {
const apiUrl = process.env.NAC_AI_API_URL;
const apiKey = process.env.NAC_AI_API_KEY;
// 默认使用通义千问plus国内稳定也支持gpt-3.5-turbo等
const model = process.env.NAC_AI_MODEL || "qwen-plus";
if (!apiUrl || !apiKey) {
throw new Error(
"[AI Agent] 未配置AI接口。请在 .env 文件中设置 NAC_AI_API_URL 和 NAC_AI_API_KEY。\n" +
"推荐:阿里云通义千问 https://dashscope.aliyuncs.com/compatible-mode"
);
}
const endpoint = `${apiUrl.replace(/\/$/, "")}/v1/chat/completions`;
const response = await fetch(endpoint, {
method: "POST",
headers: {
"content-type": "application/json",
authorization: `Bearer ${apiKey}`,
},
body: JSON.stringify({
model,
messages,
max_tokens: maxTokens,
temperature,
stream: false,
}),
});
if (!response.ok) {
const errorText = await response.text().catch(() => "");
throw new Error(`AI接口调用失败: ${response.status} ${response.statusText} ${errorText.slice(0, 500)}`);
}
const result = await response.json() as {
choices: Array<{ message: { content: string } }>;
usage?: { total_tokens: number };
};
const content = result.choices?.[0]?.message?.content;
if (!content) throw new Error("AI接口返回空内容");
return content.trim();
}
// ─── 知识库问答Agent ──────────────────────────────────────────────
const KNOWLEDGE_QA_SYSTEM_PROMPT = `你是 NACNewAssetChain公链的专业知识引擎具备深度技术分析和法律合规推理能力。
【NAC 公链核心架构】
NAC 是一条 RWA真实世界资产专用原生公链完全独立开发不继承以太坊或任何现有公链
- 智能合约语言Charter非 Solidity独立语法体系支持宪政规则内嵌
- 虚拟机NVMNAC Virtual Machine非 EVM支持 GNACS 资产分类操作码)
- 共识协议CBPP宪政区块生产协议四大原则约法即是治法/宪法即是规则/参与即是共识/节点产生区块)
- 网络层CSNP宪政安全网络协议非 P2P支持辖区路由
- API 网关NAC_Lens/4.0(原名 NRPC已更名
- 神经网络语言CNNL宪政神经网络语言用于 AI 合规推理)
- 资产标准ACC-20NAC 原生资产协议,非 ERC-20
- 资产分类GNACS全球资产分类编码系统
- 稳定机制XTZHSDR 锚定 + 黄金储备)
- 类型系统Address 32字节Hash 48字节SHA3-384
【七层合规验证框架】
L1: 身份验证KYC/AML- 基于 ACC-20 协议
L2: 资产真实性验证 - 基于 Charter 智能合约
L3: 司法管辖合规 - 基于 CNNL 神经网络语言
L4: 资产估值合理性 - 基于 XTZH 稳定机制
L5: 法律文件完整性 - 基于 GNACS 分类系统
L6: 宪政合规审查 - 基于 CBPP 共识协议
L7: 最终审批决策 - AI 辅助 + 人工审批
【全球辖区覆盖31个
Tier 1成熟监管CN/HK/SG/AE/US/EU-DE/EU-FR/JP/KR/AU/GB
Tier 2离岸金融BM/KY/VG/MT/LU/GI/JE/IM/PA/MU
Tier 3新兴市场BR/IN/TH/ID/NG/MX/ZA/TR/SA/RU
伊斯兰合规辖区AE/SA/MY支持 Sukuk/Murabaha/Ijara 等 9 种 Sharia 结构)
【RWA 资产类型与法律要素】
资产类型:不动产(各国产权登记要求不同)、动产/商品Incoterms 贸易术语)、知识产权(专利/版权/商标)、金融资产、自然资源、基础设施、数字资产
法律体系大陆法系CN/JP/DE/FR、普通法系US/GB/HK/SG/AU、伊斯兰法系AE/SA/MY、混合法系
跨境规则CN-EU/CN-JP/CN-US/CN-SG/EU-US/EU-JP 双边贸易规则矩阵
【回答原则】
1. 完整性优先:不受字数限制,确保回答完整,不截断
2. 精确推理:涉及计算(税率/费率/估值)时,逐步展示计算过程,不跳步骤
3. 辖区差异:明确说明不同辖区的差异,不用"一般来说"模糊处理
4. 技术准确:严格使用 NAC 原生术语,不混用以太坊/Solidity/EVM 等外链概念
5. 引用来源:引用具体规则名称和辖区代码
6. 不确定性:对不确定内容明确标注"需进一步核实",不猜测
7. 保留专有名词NAC/RWA/Charter/NVM/CBPP/CSNP/CNNL/ACC-20/GNACS/XTZH/NAC_Lens 不翻译`;
async function runKnowledgeQAAgent(
userMessage: string,
history: AgentMessage[],
context?: Record<string, unknown>
): Promise<AgentResponse> {
// ── RAG检索增强从 MongoDB 知识库检索相关规则 ──
const ragCtx = await retrieveRelevantRules(userMessage, {
maxResults: 5,
jurisdictions: context?.jurisdiction ? [String(context.jurisdiction)] : undefined,
language: String(context?.language || "zh"),
});
const ragPromptSection = buildRAGPromptContext(ragCtx);
const sources = ragCtx.rules.map(r => r.source);
// 计算置信度:检索到相关规则则提高置信度
const baseConfidence = ragCtx.retrievalMethod === "fulltext"
? 0.90
: ragCtx.retrievalMethod === "regex"
? 0.80
: ragCtx.retrievalMethod === "sample"
? 0.65
: 0.55;
const systemPrompt = KNOWLEDGE_QA_SYSTEM_PROMPT +
(context?.jurisdiction ? `\n\n当前关注的司法管辖区${context.jurisdiction}` : "") +
(ragPromptSection ? `\n\n${ragPromptSection}` : "");
const messages: AgentMessage[] = [
{ role: "system", content: systemPrompt },
...history.slice(-6), // 保留最近6条历史
{ role: "user", content: userMessage },
];
const reply = await callAgentLLM(messages, 4096, 0.5);
return {
agentType: "knowledge_qa",
message: reply,
confidence: baseConfidence,
sources,
suggestions: [
"查看相关司法管辖区的完整合规规则",
"提交资产上链申请",
"了解七层合规验证流程",
],
metadata: {
ragMethod: ragCtx.retrievalMethod,
ragKeywords: ragCtx.queryKeywords,
ragRulesCount: ragCtx.totalFound,
},
};
}
// ─── 合规分析Agent ────────────────────────────────────────────────
const COMPLIANCE_ANALYSIS_SYSTEM_PROMPT = `你是NAC公链的七层合规验证分析专家。
七层合规验证框架:
L1: 身份验证KYC/AML- 基于ACC-20协议
L2: 资产真实性验证 - 基于Charter智能合约
L3: 司法管辖合规 - 基于CNNL神经网络语言
L4: 资产估值合理性 - 基于XTZH稳定机制
L5: 法律文件完整性 - 基于GNACS分类系统
L6: 宪政合规审查 - 基于CBPP共识协议
L7: 最终审批决策 - 管理员人工审批
你的职责:
1. 分析资产上链申请的合规风险
2. 识别缺失的合规材料
3. 评估各层验证的通过可能性
4. 提供具体的改进建议
输出格式:
- 合规评分0-100
- 各层状态(通过/待审/未通过/不适用)
- 风险点列表
- 改进建议`;
async function runComplianceAgent(
userMessage: string,
history: AgentMessage[],
context?: Record<string, unknown>
): Promise<AgentResponse> {
const assetContext = context?.assetType
? `\n\n待分析资产类型${context.assetType}\n司法管辖区${context.jurisdiction || "未指定"}`
: "";
const messages: AgentMessage[] = [
{ role: "system", content: COMPLIANCE_ANALYSIS_SYSTEM_PROMPT + assetContext },
...history.slice(-4),
{ role: "user", content: userMessage },
];
const reply = await callAgentLLM(messages, 4096, 0.3);
return {
agentType: "compliance",
message: reply,
confidence: 0.8,
suggestions: [
"查看完整的七层合规验证报告",
"上传缺失的合规文件",
"联系合规顾问",
],
};
}
// ─── 翻译Agent ────────────────────────────────────────────────────
const TRANSLATION_SYSTEM_PROMPT = `你是NAC公链的专业法律合规翻译专家。
支持语言中文zh、英文en、阿拉伯文ar、日文ja、韩文ko、法文fr、俄文ru
翻译要求:
1. 保持法律术语的准确性和专业性
2. 保留专有名词NAC、RWA、Charter、NVM、CBPP、CSNP、CNNL、ACC-20、GNACS、XTZH不翻译
3. 保留机构名称SEC、SFC、MAS、ESMA、DFSA、DLD不翻译
4. 阿拉伯语使用标准现代阿拉伯语MSA文本方向RTL
5. 只返回翻译结果,不添加解释`;
async function runTranslationAgent(
userMessage: string,
history: AgentMessage[],
context?: Record<string, unknown>
): Promise<AgentResponse> {
const langContext = context?.targetLang
? `\n\n目标语言${context.targetLang}`
: "";
const messages: AgentMessage[] = [
{ role: "system", content: TRANSLATION_SYSTEM_PROMPT + langContext },
...history.slice(-4),
{ role: "user", content: userMessage },
];
const reply = await callAgentLLM(messages, 4096, 0.2);
return {
agentType: "translation",
message: reply,
confidence: 0.9,
metadata: {
targetLang: context?.targetLang,
isRTL: context?.targetLang === "ar",
},
};
}
// ─── 审批辅助Agent ────────────────────────────────────────────────
const APPROVAL_ASSIST_SYSTEM_PROMPT = `你是NAC公链审批工作流的AI辅助助手。
你的职责:
1. 分析审批案例的合规评分和风险点
2. 根据七层合规验证结果提供审批建议
3. 识别高风险案例并提醒审核员关注
4. 生成标准化的审批意见模板
审批决策依据:
- 合规评分 ≥ 90建议自动批准需管理员确认
- 合规评分 70-89建议人工审核
- 合规评分 50-69建议要求补充材料
- 合规评分 < 50建议拒绝
输出要求:
- 给出明确的审批建议(批准/拒绝/需补充材料)
- 列出关键风险点
- 提供标准化审批意见文本`;
async function runApprovalAssistAgent(
userMessage: string,
history: AgentMessage[],
context?: Record<string, unknown>
): Promise<AgentResponse> {
const caseContext = context?.caseNumber
? `\n\n案例编号${context.caseNumber}\n合规评分${context.complianceScore || "未知"}\n资产类型${context.assetType || "未知"}\n司法管辖区${context.jurisdiction || "未知"}`
: "";
const messages: AgentMessage[] = [
{ role: "system", content: APPROVAL_ASSIST_SYSTEM_PROMPT + caseContext },
...history.slice(-4),
{ role: "user", content: userMessage },
];
const reply = await callAgentLLM(messages, 4096, 0.4);
return {
agentType: "approval_assist",
message: reply,
confidence: 0.75,
suggestions: [
"查看完整案例详情",
"添加审核意见",
"更新审批状态",
],
};
}
// ─── Agent调度器 ──────────────────────────────────────────────────
/**
* 运行指定类型的Agent
*/
export async function runAgent(request: AgentRequest): Promise<AgentResponse> {
if (!isAgentConfigured()) {
return {
agentType: request.agentType,
message: "AI智能体服务未配置。请在生产服务器 .env 文件中设置 NAC_AI_API_URL 和 NAC_AI_API_KEY。\n\n推荐接入阿里云通义千问国内访问稳定\n- NAC_AI_API_URL=https://dashscope.aliyuncs.com/compatible-mode\n- NAC_AI_API_KEY=sk-xxxxxxxx\n- NAC_AI_MODEL=qwen-plus",
confidence: 0,
suggestions: ["配置AI服务后重试"],
};
}
const { agentType, userMessage, conversationHistory = [], context } = request;
try {
switch (agentType) {
case "knowledge_qa":
return await runKnowledgeQAAgent(userMessage, conversationHistory, context);
case "compliance":
return await runComplianceAgent(userMessage, conversationHistory, context);
case "translation":
return await runTranslationAgent(userMessage, conversationHistory, context);
case "approval_assist":
return await runApprovalAssistAgent(userMessage, conversationHistory, context);
default:
throw new Error(`未知的Agent类型: ${agentType}`);
}
} catch (error) {
console.error(`[Agent:${agentType}] 执行失败:`, (error as Error).message);
return {
agentType,
message: `Agent执行失败: ${(error as Error).message}`,
confidence: 0,
};
}
}
// ─── Agent元数据 ──────────────────────────────────────────────────
export const AGENT_REGISTRY = [
{
type: "knowledge_qa" as AgentType,
name: "知识库问答助手",
nameEn: "Knowledge QA Agent",
description: "基于NAC合规规则库回答问题支持七大司法管辖区的合规查询",
icon: "BookOpen",
capabilities: ["合规规则查询", "司法管辖区解读", "上链流程指导"],
suggestedQuestions: [
"中国大陆房地产上链需要哪些文件?",
"香港RWA合规要求是什么",
"七层合规验证框架是什么?",
],
},
{
type: "compliance" as AgentType,
name: "合规分析专家",
nameEn: "Compliance Analysis Agent",
description: "基于七层合规验证框架分析资产上链申请的合规风险",
icon: "Shield",
capabilities: ["风险评估", "合规评分", "缺失材料识别", "改进建议"],
suggestedQuestions: [
"分析这个房产上链申请的合规风险",
"我的资产缺少哪些合规文件?",
"如何提高合规评分?",
],
},
{
type: "translation" as AgentType,
name: "多语言翻译专家",
nameEn: "Translation Agent",
description: "专业法律合规文本翻译,支持七种语言,保留专有名词",
icon: "Languages",
capabilities: ["七语言翻译", "法律术语准确", "专有名词保留", "阿拉伯语RTL"],
suggestedQuestions: [
"将这段合规规则翻译成英文",
"翻译成阿拉伯语",
"生成七种语言的翻译",
],
},
{
type: "approval_assist" as AgentType,
name: "审批辅助助手",
nameEn: "Approval Assist Agent",
description: "辅助审核员分析案例、生成审批意见、识别高风险案例",
icon: "ClipboardCheck",
capabilities: ["审批建议", "风险识别", "意见模板", "案例分析"],
suggestedQuestions: [
"分析这个案例应该批准还是拒绝?",
"生成标准审批意见",
"这个案例有哪些风险点?",
],
},
];
export type AgentRegistryItem = typeof AGENT_REGISTRY[number];