1
秦芳睿
8 天以前 e70a362606b78a822e93d5117a9013e8f9086faf
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
89
90
91
92
93
94
95
96
97
package com.smtaiserver.smtaiserver.javaai.qwen.agent;
 
import java.util.ArrayList;
import java.util.List;
 
import com.smtaiserver.smtaiserver.core.SMTAIServerRequest;
import com.smtaiserver.smtaiserver.database.SMTDatabase.DBRecord;
import com.smtaiserver.smtaiserver.javaai.SMTJavaAIError;
import com.smtaiserver.smtaiserver.javaai.llm.core.SMTLLMConnect;
import com.smtservlet.util.Json;
import com.smtservlet.util.SMTJsonWriter;
import com.smtservlet.util.SMTStatic;
 
public class SMTQwenAgentKnowlgFile extends SMTQwenAgent 
{
    protected int    _vectorScope;
    
    @Override
    public void initInstance(DBRecord rec) throws Exception
    {
        _inSupervisor = !("Y".equals(rec.getString("inner_call")));
        _agentTitle = rec.getString("knowlg_title");
        
        // 不要调用基类的initInstance,因为它是从knowlg_name_list过来的表
        _agentId = rec.getString("knowlg_id");
        _agentType = "knowledge";
        _agentPrompt = 
              _agentId + "\n"
            + "    功能:\n"
            + "        " + SMTStatic.indentStrLines(rec.getString("knowlg_prompt"), "        ") + "\n"
            + "    参数:\n"
            + "        question:提出的问题\n"
            ;
        
        _agentGroup = rec.getString("agent_group");
        if(rec.getFieldMap().containsKey("GROUP_TYPE"))
            _agentGroupType = rec.getString("group_type");
        else
            _agentGroupType = "";
 
        Integer vectorScope = rec.getInteger("vector_scope");
        if(vectorScope != null)
            _vectorScope = vectorScope;
        else
            _vectorScope = 90;
    }
    
    @Override
    public SMTJavaAIError callAgents(String jsonPath, Json jsonArgs, SMTLLMConnect llm, String question, SMTAIServerRequest tranReq) throws Exception
    {
        SMTJsonWriter jsonWrResult = tranReq.getResultJsonWr();
        
        String vectorSQL = 
               "SELECT file_name as vector_title, vector_text as vector_message, ?::vector <=> vector_value AS ratio  \r\n"
            + "FROM ai_doc.doc_file_vector A \r\n"
            + "INNER JOIN ai_doc.doc_file_list B \r\n"
            + "ON A.file_id = B.file_id\r\n"
            + "INNER JOIN ai_doc.knowlg_file_list c\r\n"
            + "ON C.knowlg_file_id=B.file_id\r\n"
            + "AND C.knowlg_id='" + _agentId + "'\r\n"
            + "ORDER BY ratio LIMIT 4"
            ;
        
        jsonWrResult.addKeyValue("answer_type", "knowledge");
        jsonWrResult.beginArray("knowledge");
        {
            jsonWrResult.beginMap(null);
            {
                long tick = System.currentTimeMillis();
                List<String[]> contexts = new ArrayList<>();
                String result = llm.callWithVector(question, tranReq.getRawQuestion(), vectorSQL, _vectorScope, tranReq, contexts);
                tranReq.traceLLMDebug("executeCmd_QUERY回答问题:[" + ((double)(System.currentTimeMillis() - tick) / 1000) + "秒] [\n" + result + "\n]");
                jsonWrResult.addKeyValue("answer", result);
                jsonWrResult.beginArray("contexts");
                for(String[] context : contexts)
                {
                    jsonWrResult.beginMap(null);
                    {
                        jsonWrResult.addKeyValue("page_content", context[1]);
                        jsonWrResult.beginMap("metadata");
                        {
                            jsonWrResult.addKeyValue("Title", context[0]);
                        }
                        jsonWrResult.endMap();
                    }
                    jsonWrResult.endMap();
                }
                jsonWrResult.endArray();
            }
            jsonWrResult.endMap();
        }
        jsonWrResult.endArray();
 
        return null;
    }
 
}