predictive-intelligence

Compare original and translation side by side

🇺🇸

Original

English
🇨🇳

Translation

Chinese

Predictive Intelligence for ServiceNow

ServiceNow 中的 Predictive Intelligence

Predictive Intelligence uses machine learning to automate categorization, routing, and recommendations.
Predictive Intelligence 利用机器学习实现分类、路由和推荐的自动化。

PI Capabilities

PI 功能

CapabilityUse Case
ClassificationAuto-categorize incidents, cases
SimilarityFind similar records
ClusteringGroup related items
RegressionPredict numeric values
RecommendationSuggest next actions
功能(Capability)应用场景
Classification自动分类事件、案例
Similarity查找相似记录
Clustering分组相关项目
Regression预测数值
Recommendation建议下一步操作

Key Tables

核心表

TablePurpose
ml_solution
ML solution definitions
ml_solution_definition
Solution configuration
ml_capability_definition
Capability settings
ml_model
Trained models
ml_prediction_result
Prediction results
表名用途
ml_solution
机器学习解决方案定义
ml_solution_definition
解决方案配置
ml_capability_definition
功能设置
ml_model
训练完成的模型
ml_prediction_result
预测结果

Classification (ES5)

分类功能(仅支持ES5)

Configure Classification Solution

配置分类解决方案

javascript
// Create classification solution (ES5 ONLY!)
// Note: Usually done via UI, shown for understanding

var solution = new GlideRecord('ml_solution');
solution.initialize();

solution.setValue('name', 'Incident Category Classifier');
solution.setValue('label', 'Incident Category Classifier');
solution.setValue('table', 'incident');
solution.setValue('active', true);

// Capability type
solution.setValue('capability', 'classification');

// Target field to predict
solution.setValue('target_field', 'category');

// Input fields for training
solution.setValue('input_fields', 'short_description,description');

solution.insert();
javascript
// Create classification solution (ES5 ONLY!)
// Note: Usually done via UI, shown for understanding

var solution = new GlideRecord('ml_solution');
solution.initialize();

solution.setValue('name', 'Incident Category Classifier');
solution.setValue('label', 'Incident Category Classifier');
solution.setValue('table', 'incident');
solution.setValue('active', true);

// Capability type
solution.setValue('capability', 'classification');

// Target field to predict
solution.setValue('target_field', 'category');

// Input fields for training
solution.setValue('input_fields', 'short_description,description');

solution.insert();

Get Classification Prediction

获取分类预测结果

javascript
// Get classification prediction for record (ES5 ONLY!)
function getClassificationPrediction(tableName, recordSysId, solutionName) {
    var predictor = new sn_ml.ClassificationPredictor(solutionName);

    var gr = new GlideRecord(tableName);
    if (!gr.get(recordSysId)) {
        return null;
    }

    try {
        var result = predictor.predict(gr);

        return {
            predicted_value: result.getPredictedValue(),
            confidence: result.getConfidence(),
            top_predictions: result.getTopPredictions(5)
        };
    } catch (e) {
        gs.error('Prediction failed: ' + e.message);
        return null;
    }
}
javascript
// Get classification prediction for record (ES5 ONLY!)
function getClassificationPrediction(tableName, recordSysId, solutionName) {
    var predictor = new sn_ml.ClassificationPredictor(solutionName);

    var gr = new GlideRecord(tableName);
    if (!gr.get(recordSysId)) {
        return null;
    }

    try {
        var result = predictor.predict(gr);

        return {
            predicted_value: result.getPredictedValue(),
            confidence: result.getConfidence(),
            top_predictions: result.getTopPredictions(5)
        };
    } catch (e) {
        gs.error('Prediction failed: ' + e.message);
        return null;
    }
}

Apply Prediction to Record

将预测结果应用到记录

javascript
// Auto-apply classification prediction (ES5 ONLY!)
// Business Rule: before, insert, incident

(function executeRule(current, previous) {
    // Skip if already categorized
    if (current.category) {
        return;
    }

    var solutionName = 'incident_category_classifier';

    try {
        var predictor = new sn_ml.ClassificationPredictor(solutionName);
        var result = predictor.predict(current);

        // Only apply if confidence is high enough
        if (result.getConfidence() >= 0.8) {
            current.category = result.getPredictedValue();
            current.work_notes = 'Category auto-assigned by Predictive Intelligence ' +
                                '(Confidence: ' + Math.round(result.getConfidence() * 100) + '%)';
        }
    } catch (e) {
        gs.warn('Classification prediction failed: ' + e.message);
    }
})(current, previous);
javascript
// Auto-apply classification prediction (ES5 ONLY!)
// Business Rule: before, insert, incident

(function executeRule(current, previous) {
    // Skip if already categorized
    if (current.category) {
        return;
    }

    var solutionName = 'incident_category_classifier';

    try {
        var predictor = new sn_ml.ClassificationPredictor(solutionName);
        var result = predictor.predict(current);

        // Only apply if confidence is high enough
        if (result.getConfidence() >= 0.8) {
            current.category = result.getPredictedValue();
            current.work_notes = 'Category auto-assigned by Predictive Intelligence ' +
                                '(Confidence: ' + Math.round(result.getConfidence() * 100) + '%)';
        }
    } catch (e) {
        gs.warn('Classification prediction failed: ' + e.message);
    }
})(current, previous);

Similarity (ES5)

相似性功能(仅支持ES5)

Find Similar Records

查找相似记录

javascript
// Find similar incidents (ES5 ONLY!)
function findSimilarIncidents(incidentSysId, maxResults) {
    maxResults = maxResults || 5;

    var incident = new GlideRecord('incident');
    if (!incident.get(incidentSysId)) {
        return [];
    }

    try {
        var similarity = new sn_ml.SimilarityPredictor('incident_similarity');
        var results = similarity.findSimilar(incident, maxResults);

        var similar = [];
        for (var i = 0; i < results.length; i++) {
            var match = results[i];
            similar.push({
                sys_id: match.getRecordSysId(),
                similarity_score: match.getSimilarityScore(),
                record: match.getRecord()
            });
        }

        return similar;
    } catch (e) {
        gs.error('Similarity search failed: ' + e.message);
        return [];
    }
}
javascript
// Find similar incidents (ES5 ONLY!)
function findSimilarIncidents(incidentSysId, maxResults) {
    maxResults = maxResults || 5;

    var incident = new GlideRecord('incident');
    if (!incident.get(incidentSysId)) {
        return [];
    }

    try {
        var similarity = new sn_ml.SimilarityPredictor('incident_similarity');
        var results = similarity.findSimilar(incident, maxResults);

        var similar = [];
        for (var i = 0; i < results.length; i++) {
            var match = results[i];
            similar.push({
                sys_id: match.getRecordSysId(),
                similarity_score: match.getSimilarityScore(),
                record: match.getRecord()
            });
        }

        return similar;
    } catch (e) {
        gs.error('Similarity search failed: ' + e.message);
        return [];
    }
}

Similar Record Widget

相似记录组件

javascript
// Widget Server Script for similar records (ES5 ONLY!)
(function() {
    if (!input || !input.table || !input.sys_id) {
        data.similar = [];
        return;
    }

    var solutionName = input.table + '_similarity';

    try {
        var gr = new GlideRecord(input.table);
        if (!gr.get(input.sys_id)) {
            data.similar = [];
            return;
        }

        var similarity = new sn_ml.SimilarityPredictor(solutionName);
        var results = similarity.findSimilar(gr, 5);

        data.similar = [];
        for (var i = 0; i < results.length; i++) {
            var match = results[i];
            var record = match.getRecord();

            data.similar.push({
                sys_id: match.getRecordSysId(),
                score: Math.round(match.getSimilarityScore() * 100),
                number: record.getValue('number'),
                short_description: record.getValue('short_description'),
                state: record.state.getDisplayValue()
            });
        }
    } catch (e) {
        data.error = 'Similarity search unavailable';
        data.similar = [];
    }
})();
javascript
// Widget Server Script for similar records (ES5 ONLY!)
(function() {
    if (!input || !input.table || !input.sys_id) {
        data.similar = [];
        return;
    }

    var solutionName = input.table + '_similarity';

    try {
        var gr = new GlideRecord(input.table);
        if (!gr.get(input.sys_id)) {
            data.similar = [];
            return;
        }

        var similarity = new sn_ml.SimilarityPredictor(solutionName);
        var results = similarity.findSimilar(gr, 5);

        data.similar = [];
        for (var i = 0; i < results.length; i++) {
            var match = results[i];
            var record = match.getRecord();

            data.similar.push({
                sys_id: match.getRecordSysId(),
                score: Math.round(match.getSimilarityScore() * 100),
                number: record.getValue('number'),
                short_description: record.getValue('short_description'),
                state: record.state.getDisplayValue()
            });
        }
    } catch (e) {
        data.error = 'Similarity search unavailable';
        data.similar = [];
    }
})();

Clustering (ES5)

聚类功能(仅支持ES5)

Get Cluster Assignment

获取聚类分配结果

javascript
// Get cluster for record (ES5 ONLY!)
function getClusterAssignment(tableName, recordSysId, solutionName) {
    var gr = new GlideRecord(tableName);
    if (!gr.get(recordSysId)) {
        return null;
    }

    try {
        var clustering = new sn_ml.ClusteringPredictor(solutionName);
        var result = clustering.predict(gr);

        return {
            cluster_id: result.getClusterId(),
            cluster_label: result.getClusterLabel(),
            confidence: result.getConfidence()
        };
    } catch (e) {
        gs.error('Clustering failed: ' + e.message);
        return null;
    }
}
javascript
// Get cluster for record (ES5 ONLY!)
function getClusterAssignment(tableName, recordSysId, solutionName) {
    var gr = new GlideRecord(tableName);
    if (!gr.get(recordSysId)) {
        return null;
    }

    try {
        var clustering = new sn_ml.ClusteringPredictor(solutionName);
        var result = clustering.predict(gr);

        return {
            cluster_id: result.getClusterId(),
            cluster_label: result.getClusterLabel(),
            confidence: result.getConfidence()
        };
    } catch (e) {
        gs.error('Clustering failed: ' + e.message);
        return null;
    }
}

Analyze Clusters

分析聚类

javascript
// Get cluster statistics (ES5 ONLY!)
function getClusterStats(solutionName) {
    var stats = [];

    var cluster = new GlideRecord('ml_cluster');
    cluster.addQuery('solution.name', solutionName);
    cluster.query();

    while (cluster.next()) {
        stats.push({
            cluster_id: cluster.getValue('cluster_id'),
            label: cluster.getValue('label'),
            size: parseInt(cluster.getValue('record_count'), 10),
            keywords: cluster.getValue('keywords')
        });
    }

    return stats;
}
javascript
// Get cluster statistics (ES5 ONLY!)
function getClusterStats(solutionName) {
    var stats = [];

    var cluster = new GlideRecord('ml_cluster');
    cluster.addQuery('solution.name', solutionName);
    cluster.query();

    while (cluster.next()) {
        stats.push({
            cluster_id: cluster.getValue('cluster_id'),
            label: cluster.getValue('label'),
            size: parseInt(cluster.getValue('record_count'), 10),
            keywords: cluster.getValue('keywords')
        });
    }

    return stats;
}

Training Models (ES5)

模型训练(仅支持ES5)

Trigger Model Training

触发模型训练

javascript
// Trigger retraining of ML solution (ES5 ONLY!)
function retrainSolution(solutionName) {
    var solution = new GlideRecord('ml_solution');
    if (!solution.get('name', solutionName)) {
        gs.error('Solution not found: ' + solutionName);
        return false;
    }

    try {
        // Queue training job
        var trainer = new sn_ml.MLTrainer();
        trainer.train(solution.getUniqueValue());

        gs.info('Training queued for solution: ' + solutionName);
        return true;
    } catch (e) {
        gs.error('Training failed: ' + e.message);
        return false;
    }
}
javascript
// Trigger retraining of ML solution (ES5 ONLY!)
function retrainSolution(solutionName) {
    var solution = new GlideRecord('ml_solution');
    if (!solution.get('name', solutionName)) {
        gs.error('Solution not found: ' + solutionName);
        return false;
    }

    try {
        // Queue training job
        var trainer = new sn_ml.MLTrainer();
        trainer.train(solution.getUniqueValue());

        gs.info('Training queued for solution: ' + solutionName);
        return true;
    } catch (e) {
        gs.error('Training failed: ' + e.message);
        return false;
    }
}

Check Training Status

检查训练状态

javascript
// Check model training status (ES5 ONLY!)
function getTrainingStatus(solutionName) {
    var model = new GlideRecord('ml_model');
    model.addQuery('solution.name', solutionName);
    model.orderByDesc('sys_created_on');
    model.setLimit(1);
    model.query();

    if (model.next()) {
        return {
            model_id: model.getUniqueValue(),
            status: model.getValue('state'),
            accuracy: model.getValue('accuracy'),
            trained_on: model.getValue('sys_created_on'),
            record_count: model.getValue('training_record_count')
        };
    }

    return null;
}
javascript
// Check model training status (ES5 ONLY!)
function getTrainingStatus(solutionName) {
    var model = new GlideRecord('ml_model');
    model.addQuery('solution.name', solutionName);
    model.orderByDesc('sys_created_on');
    model.setLimit(1);
    model.query();

    if (model.next()) {
        return {
            model_id: model.getUniqueValue(),
            status: model.getValue('state'),
            accuracy: model.getValue('accuracy'),
            trained_on: model.getValue('sys_created_on'),
            record_count: model.getValue('training_record_count')
        };
    }

    return null;
}

Prediction Results (ES5)

预测结果(仅支持ES5)

Store Prediction Feedback

存储预测反馈

javascript
// Record prediction feedback for model improvement (ES5 ONLY!)
function recordPredictionFeedback(predictionSysId, wasCorrect, actualValue) {
    var prediction = new GlideRecord('ml_prediction_result');
    if (!prediction.get(predictionSysId)) {
        return false;
    }

    prediction.setValue('feedback', wasCorrect ? 'correct' : 'incorrect');
    prediction.setValue('actual_value', actualValue);
    prediction.setValue('feedback_date', new GlideDateTime());
    prediction.setValue('feedback_user', gs.getUserID());

    prediction.update();

    return true;
}
javascript
// Record prediction feedback for model improvement (ES5 ONLY!)
function recordPredictionFeedback(predictionSysId, wasCorrect, actualValue) {
    var prediction = new GlideRecord('ml_prediction_result');
    if (!prediction.get(predictionSysId)) {
        return false;
    }

    prediction.setValue('feedback', wasCorrect ? 'correct' : 'incorrect');
    prediction.setValue('actual_value', actualValue);
    prediction.setValue('feedback_date', new GlideDateTime());
    prediction.setValue('feedback_user', gs.getUserID());

    prediction.update();

    return true;
}

Analyze Prediction Accuracy

分析预测准确率

javascript
// Get prediction accuracy stats (ES5 ONLY!)
function getPredictionAccuracy(solutionName, days) {
    days = days || 30;

    var startDate = new GlideDateTime();
    startDate.addDaysLocalTime(-days);

    var ga = new GlideAggregate('ml_prediction_result');
    ga.addQuery('solution.name', solutionName);
    ga.addQuery('sys_created_on', '>=', startDate);
    ga.addNotNullQuery('feedback');
    ga.addAggregate('COUNT');
    ga.groupBy('feedback');
    ga.query();

    var stats = { correct: 0, incorrect: 0 };

    while (ga.next()) {
        var feedback = ga.getValue('feedback');
        var count = parseInt(ga.getAggregate('COUNT'), 10);
        stats[feedback] = count;
    }

    var total = stats.correct + stats.incorrect;
    stats.accuracy = total > 0 ? Math.round((stats.correct / total) * 100) : 0;
    stats.total = total;

    return stats;
}
javascript
// Get prediction accuracy stats (ES5 ONLY!)
function getPredictionAccuracy(solutionName, days) {
    days = days || 30;

    var startDate = new GlideDateTime();
    startDate.addDaysLocalTime(-days);

    var ga = new GlideAggregate('ml_prediction_result');
    ga.addQuery('solution.name', solutionName);
    ga.addQuery('sys_created_on', '>=', startDate);
    ga.addNotNullQuery('feedback');
    ga.addAggregate('COUNT');
    ga.groupBy('feedback');
    ga.query();

    var stats = { correct: 0, incorrect: 0 };

    while (ga.next()) {
        var feedback = ga.getValue('feedback');
        var count = parseInt(ga.getAggregate('COUNT'), 10);
        stats[feedback] = count;
    }

    var total = stats.correct + stats.incorrect;
    stats.accuracy = total > 0 ? Math.round((stats.correct / total) * 100) : 0;
    stats.total = total;

    return stats;
}

MCP Tool Integration

MCP 工具集成

Available Tools

可用工具

ToolPurpose
snow_query_table
Query ML tables
snow_execute_script_with_output
Test predictions
ml_predict_change_risk
Predict change risk
ml_detect_anomalies
Anomaly detection
工具用途
snow_query_table
查询机器学习相关表
snow_execute_script_with_output
测试预测功能
ml_predict_change_risk
预测变更风险
ml_detect_anomalies
异常检测

Example Workflow

示例工作流

javascript
// 1. Query ML solutions
await snow_query_table({
    table: 'ml_solution',
    query: 'active=true',
    fields: 'name,table,capability,target_field'
});

// 2. Check model status
await snow_query_table({
    table: 'ml_model',
    query: 'solution.active=true',
    fields: 'solution,state,accuracy,sys_created_on'
});

// 3. Test prediction
await snow_execute_script_with_output({
    script: `
        var result = getClassificationPrediction('incident', 'inc_sys_id', 'incident_classifier');
        gs.info(JSON.stringify(result));
    `
});
javascript
// 1. Query ML solutions
await snow_query_table({
    table: 'ml_solution',
    query: 'active=true',
    fields: 'name,table,capability,target_field'
});

// 2. Check model status
await snow_query_table({
    table: 'ml_model',
    query: 'solution.active=true',
    fields: 'solution,state,accuracy,sys_created_on'
});

// 3. Test prediction
await snow_execute_script_with_output({
    script: `
        var result = getClassificationPrediction('incident', 'inc_sys_id', 'incident_classifier');
        gs.info(JSON.stringify(result));
    `
});

Best Practices

最佳实践

  1. Quality Data - Clean training data is essential
  2. Feature Selection - Choose relevant input fields
  3. Confidence Thresholds - Only apply high-confidence predictions
  4. Feedback Loop - Collect user feedback
  5. Regular Retraining - Update models periodically
  6. Monitor Accuracy - Track prediction performance
  7. Fallback - Have manual process when prediction fails
  8. ES5 Only - No modern JavaScript syntax
  1. 高质量数据 - 干净的训练数据至关重要
  2. 特征选择 - 选择相关的输入字段
  3. 置信度阈值 - 仅应用高置信度的预测结果
  4. 反馈循环 - 收集用户反馈
  5. 定期重训练 - 定期更新模型
  6. 监控准确率 - 跟踪预测性能
  7. 备选方案 - 当预测失败时启用人工流程
  8. 仅支持ES5 - 不支持现代JavaScript语法