predictive-intelligence
Compare original and translation side by side
🇺🇸
Original
English🇨🇳
Translation
ChinesePredictive Intelligence for ServiceNow
ServiceNow 中的 Predictive Intelligence
Predictive Intelligence uses machine learning to automate categorization, routing, and recommendations.
Predictive Intelligence 利用机器学习实现分类、路由和推荐的自动化。
PI Capabilities
PI 功能
| Capability | Use Case |
|---|---|
| Classification | Auto-categorize incidents, cases |
| Similarity | Find similar records |
| Clustering | Group related items |
| Regression | Predict numeric values |
| Recommendation | Suggest next actions |
| 功能(Capability) | 应用场景 |
|---|---|
| Classification | 自动分类事件、案例 |
| Similarity | 查找相似记录 |
| Clustering | 分组相关项目 |
| Regression | 预测数值 |
| Recommendation | 建议下一步操作 |
Key Tables
核心表
| Table | Purpose |
|---|---|
| ML solution definitions |
| Solution configuration |
| Capability settings |
| Trained models |
| Prediction results |
| 表名 | 用途 |
|---|---|
| 机器学习解决方案定义 |
| 解决方案配置 |
| 功能设置 |
| 训练完成的模型 |
| 预测结果 |
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
可用工具
| Tool | Purpose |
|---|---|
| Query ML tables |
| Test predictions |
| Predict change risk |
| Anomaly detection |
| 工具 | 用途 |
|---|---|
| 查询机器学习相关表 |
| 测试预测功能 |
| 预测变更风险 |
| 异常检测 |
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
最佳实践
- Quality Data - Clean training data is essential
- Feature Selection - Choose relevant input fields
- Confidence Thresholds - Only apply high-confidence predictions
- Feedback Loop - Collect user feedback
- Regular Retraining - Update models periodically
- Monitor Accuracy - Track prediction performance
- Fallback - Have manual process when prediction fails
- ES5 Only - No modern JavaScript syntax
- 高质量数据 - 干净的训练数据至关重要
- 特征选择 - 选择相关的输入字段
- 置信度阈值 - 仅应用高置信度的预测结果
- 反馈循环 - 收集用户反馈
- 定期重训练 - 定期更新模型
- 监控准确率 - 跟踪预测性能
- 备选方案 - 当预测失败时启用人工流程
- 仅支持ES5 - 不支持现代JavaScript语法