TangCheng
2025-02-28 d787e447e95c7b897c2cc9c0e832f8d2e5084934
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
package com.smtaiserver.smtaiserver.javaai.metrics.base;
 
import java.util.ArrayList;
import java.util.List;
 
import org.apache.commons.text.similarity.JaccardSimilarity;
import org.dom4j.Document;
import org.dom4j.Element;
import org.dom4j.Node;
 
import com.smtaiserver.smtaiserver.core.SMTAIServerApp;
import com.smtaiserver.smtaiserver.core.SMTAIServerRequest;
import com.smtaiserver.smtaiserver.database.SMTDatabase.DBRecord;
import com.smtaiserver.smtaiserver.javaai.ast.ASTDBMap;
import com.smtservlet.util.Json;
import com.smtservlet.util.SMTStatic;
 
public abstract class SMTMetricsDefXml extends SMTMetricsDef
{
    protected SMTMetricsSampleXml        _sampleQuestionXml;
    
    public void initInstance(DBRecord rec) throws Exception
    {
        super.initInstance(rec);
        
        String sJsonMacro = rec.getString("metrics_macro");
        Json jsonMacro = SMTStatic.isNullOrEmpty(sJsonMacro) ? null : Json.read(sJsonMacro);
        
        String sXml = SMTAIServerApp.getApp().convGlobalMacroString(rec.getString("metrics_config"), jsonMacro);
        Document doc = SMTStatic.convStrToXmlDoc("<ROOT>" + sXml + "</ROOT>");
        
        Node nodeSampleQuestion = doc.selectSingleNode("ROOT/SAMPLE_QUESTIONS");
        if(nodeSampleQuestion != null)
        {
            _sampleQuestionXml = new SMTMetricsSampleXml((Element)nodeSampleQuestion);
        }
        
        initInstanceByDoc(rec, doc);
    }
    
    protected void appendSampleQuestionToResponse(Json jsonAST, SMTAIServerRequest tranReq) throws Exception
    {
        List<String> listSampleQuestion = new ArrayList<>();
        querySampleQuestionToList(jsonAST, tranReq, listSampleQuestion);
        
        for(String sample : listSampleQuestion)
        {
            tranReq.addContentSampleQuestion(sample);
        }
    }
    
    protected void querySampleQuestionToList(Json jsonAST, SMTAIServerRequest tranReq, List<String> r_list) throws Exception
    {
        if(_sampleQuestionXml == null)
            return;
        
        ASTDBMap dbMap = new ASTDBMap();
        
        try
        {
            _sampleQuestionXml.createSampleQuestion(this, dbMap, jsonAST, tranReq, r_list);
        }
        finally
        {
            dbMap.close();
        }
    }
    
    public void queryUnknowQuestionList(JaccardSimilarity jaccardSimilarity, String keyword, SMTAIServerRequest tranReq) throws Exception
    {
        for(String matchName : this._setMatch)
        {
            double curSim = jaccardSimilarity.apply(matchName, keyword);
            if(curSim > 0.3 || keyword.indexOf(matchName) >= 0 || matchName.indexOf(keyword) >= 0)
            {
                List<String> listQuestion = new ArrayList<>();
                querySampleQuestionToList(Json.object(), tranReq, listQuestion);
                for(String question : listQuestion)
                {
                    tranReq.addContentSampleQuestion(question);
                }
                break;
            }
        }
    }
    
    protected abstract void initInstanceByDoc(DBRecord rec, Document doc) throws Exception;
}