NAC_Blockchain/nac-ai-valuation/src/lib.rs

155 lines
5.3 KiB
Rust
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 AI资产估值系统
//!
//! 提供基于多元AI协同仲裁的资产估值服务
//!
//! # 特性
//!
//! - 12种资产类型分类
//! - 8个辖区支持US, EU, China, HK, Singapore, UK, Japan, Middle East
//! - 5个国际贸易协定WTO, SCO, RCEP, CPTPP, USMCA
//! - 多元AI模型ChatGPT-4.1, DeepSeek-V3, 豆包AI-Pro
//! - 协同仲裁算法(加权投票 + 贝叶斯融合)
//!
//! # 示例
//!
//! ```no_run
//! use nac_ai_valuation::{ValuationEngine, ValuationEngineConfig, Asset, AssetType, Jurisdiction, InternationalAgreement};
//! use rust_decimal::Decimal;
//!
//! #[tokio::main]
//! async fn main() {
//! let engine = ValuationEngine::new(
//! "chatgpt_api_key".to_string(),
//! "deepseek_api_key".to_string(),
//! "doubao_api_key".to_string(),
//! ValuationEngineConfig::default(),
//! ).expect("mainnet: handle error");
//!
//! let asset = Asset::new(
//! "asset_001".to_string(),
//! AssetType::RealEstate,
//! "GNACS-001".to_string(),
//! "Manhattan Office Building".to_string(),
//! Decimal::new(50_000_000, 0),
//! "USD".to_string(),
//! );
//!
//! let result = engine.appraise(
//! &asset,
//! Jurisdiction::US,
//! InternationalAgreement::WTO,
//! ).await.expect("mainnet: handle error");
//!
//! println!("估值: {} XTZH", result.valuation_xtzh);
//! println!("置信度: {:.1}%", result.confidence * 100.0);
//! }
//! ```
pub mod asset;
pub mod jurisdiction;
pub mod agreement;
pub mod ai_model;
pub mod ai_models;
pub mod arbitration;
pub mod engine;
pub mod realtime;
pub mod history;
pub mod validation;
pub use asset::{Asset, AssetType};
pub use jurisdiction::{Jurisdiction, AccountingStandard};
pub use agreement::InternationalAgreement;
pub use ai_model::{AIProvider, AIModelManager, AIValuationResult};
pub use ai_models::{AIModelConfig, AIModelClient};
pub use arbitration::{Arbitrator, ArbitrationConfig, DynamicWeightCalculator};
pub use engine::{ValuationEngine, ValuationEngineConfig};
pub use realtime::{RealtimeValuationEngine, RealtimeDataSource, RealtimeConfig, ValuationCache, CacheStats};
pub use history::{ValuationHistory, ValuationHistoryEntry, TrendAnalyzer, TrendAnalysis, TrendDirection, DataExporter};
pub use validation::{ValuationValidator, ValidationRule, ValidationResult, AccuracyEvaluator, AccuracyMetrics, DivergenceAnalyzer, DivergenceAnalysis, ModelOptimizer, OptimizationSuggestion};
use rust_decimal::Decimal;
use serde::{Deserialize, Serialize};
use std::collections::HashMap;
/// 最终估值结果
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct FinalValuationResult {
/// 最终估值XTZH
pub valuation_xtzh: Decimal,
/// 综合置信度 [0.0, 1.0]
pub confidence: f64,
/// 各AI模型的估值结果
pub model_results: Vec<AIValuationResult>,
/// 各模型权重
pub weights: HashMap<AIProvider, f64>,
/// 是否存在异常值
pub is_anomaly: bool,
/// 异常值报告
pub anomaly_report: Option<String>,
/// 分歧分析报告
pub divergence_report: String,
/// 是否需要人工审核
pub requires_human_review: bool,
}
impl FinalValuationResult {
/// 生成完整的估值报告
pub fn generate_report(&self) -> String {
let mut report = String::new();
report.push_str("# NAC AI资产估值报告\n\n");
report.push_str(&format!("## 最终估值\n\n"));
report.push_str(&format!("**{} XTZH**\n\n", self.valuation_xtzh));
report.push_str(&format!("- 综合置信度: {:.1}%\n", self.confidence * 100.0));
report.push_str(&format!("- 需要人工审核: {}\n\n", if self.requires_human_review { "" } else { "" }));
if let Some(ref anomaly_report) = self.anomaly_report {
report.push_str("## ⚠️ 异常值警告\n\n");
report.push_str(anomaly_report);
report.push_str("\n\n");
}
report.push_str(&self.divergence_report);
report.push_str("\n\n");
report.push_str("## AI模型详细结果\n\n");
for result in &self.model_results {
report.push_str(&format!("### {:?}\n\n", result.provider));
report.push_str(&format!("- 估值: {} XTZH\n", result.valuation_xtzh));
report.push_str(&format!("- 置信度: {:.1}%\n", result.confidence * 100.0));
report.push_str(&format!("- 权重: {:.1}%\n", self.weights.get(&result.provider).unwrap_or(&0.0) * 100.0));
report.push_str(&format!("- 推理过程:\n\n{}\n\n", result.reasoning));
}
report
}
/// 转换为JSON
pub fn to_json(&self) -> serde_json::Result<String> {
serde_json::to_string_pretty(self)
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_final_valuation_result() {
let result = FinalValuationResult {
valuation_xtzh: Decimal::new(1000000, 0),
confidence: 0.85,
model_results: vec![],
weights: HashMap::new(),
is_anomaly: false,
anomaly_report: None,
divergence_report: "Test report".to_string(),
requires_human_review: false,
};
let report = result.generate_report();
assert!(report.contains("1000000 XTZH"));
assert!(report.contains("85.0%"));
}
}