Michael Yang
2025-05-07 5afa5041ea166f462a90a996d5264c64837f4341
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
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
package tech.aiflowy.common.ai;
 
import tech.aiflowy.common.ai.util.LLMUtil;
import tech.aiflowy.common.options.SysOptions;
import tech.aiflowy.common.util.StringUtil;
import com.agentsflex.core.llm.ChatContext;
import com.agentsflex.core.llm.Llm;
import com.agentsflex.core.llm.StreamResponseListener;
import com.agentsflex.core.llm.response.AiMessageResponse;
import com.agentsflex.core.prompt.TextPrompt;
import com.agentsflex.core.store.DocumentStore;
import com.agentsflex.store.aliyun.AliyunVectorStore;
import com.agentsflex.store.aliyun.AliyunVectorStoreConfig;
import com.agentsflex.store.milvus.MilvusVectorStore;
import com.agentsflex.store.milvus.MilvusVectorStoreConfig;
import com.agentsflex.store.qcloud.QCloudVectorStore;
import com.agentsflex.store.qcloud.QCloudVectorStoreConfig;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.servlet.mvc.method.annotation.SseEmitter;
 
import java.io.IOException;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
 
public class EmbeddingManager {
 
    private static final Logger logger = LoggerFactory.getLogger(EmbeddingManager.class);
    private static final EmbeddingManager manager = new EmbeddingManager();
 
    public static EmbeddingManager getInstance() {
        return manager;
    }
 
    private ExecutorService sseExecutor = Executors.newFixedThreadPool(Runtime.getRuntime().availableProcessors());
 
    public Llm getEmbeddingModel() {
        String modelOfEmbedding = SysOptions.get("model_of_embedding");
        return LLMUtil.getLlmByType(modelOfEmbedding);
    }
 
    public DocumentStore getVectorStore() {
        String vectorStoreType = SysOptions.get("vectorstore_type");
        if (StringUtil.noText(vectorStoreType)) {
            return null;
        }
 
        DocumentStore store = null;
 
        if ("aliyun".equalsIgnoreCase(vectorStoreType)) {
            AliyunVectorStoreConfig storeConfig = new AliyunVectorStoreConfig();
            storeConfig.setDefaultCollectionName(SysOptions.get("vectorstore_default_collection"));
            storeConfig.setApiKey(SysOptions.get("aliyun_vdb_api_key"));
            storeConfig.setEndpoint(SysOptions.get("aliyun_vdb_endpoint"));
            storeConfig.setDatabase(SysOptions.get("aliyun_vdb_database"));
            store = new AliyunVectorStore(storeConfig);
        }
        //腾讯云
        else if ("qcloud".equalsIgnoreCase(vectorStoreType)) {
            QCloudVectorStoreConfig storeConfig = new QCloudVectorStoreConfig();
            storeConfig.setDefaultCollectionName(SysOptions.get("vectorstore_default_collection"));
            storeConfig.setHost(SysOptions.get("qcloud_vdb_endpoint"));
            storeConfig.setApiKey(SysOptions.get("qcloud_vdb_api_key"));
            storeConfig.setAccount(SysOptions.get("qcloud_vdb_username"));
            storeConfig.setDatabase(SysOptions.get("qcloud_vdb_database"));
            store = new QCloudVectorStore(storeConfig);
        }
        //Milvus 数据库
        else if ("milvus".equalsIgnoreCase(vectorStoreType)) {
            MilvusVectorStoreConfig storeConfig = new MilvusVectorStoreConfig();
            storeConfig.setDatabaseName(SysOptions.get("milvus_database"));
            storeConfig.setDefaultCollectionName(SysOptions.get("vectorstore_default_collection"));
            storeConfig.setUri(SysOptions.get("milvus_endpoint"));
            storeConfig.setToken(SysOptions.get("milvus_apikey"));
            store = new MilvusVectorStore(storeConfig);
        }
 
        Llm embeddingModel = getEmbeddingModel();
        if (store != null && embeddingModel != null) {
            store.setEmbeddingModel(embeddingModel);
        }
 
        return store;
    }
 
 
    public SseEmitter sseEmitter(String prompt) {
        return sseEmitter(new TextPrompt(prompt));
    }
 
    public SseEmitter sseEmitter(TextPrompt prompt) {
        SseEmitter emitter = new SseEmitter((long) (1000 * 60 * 2));
        sseExecutor.execute(() -> {
            Llm llm = getEmbeddingModel();
            if (llm == null) {
                try {
                    emitter.send(SseEmitter.event().data("AI 大模型未配置正确"));
                    emitter.complete();
                } catch (IOException e) {
                    logger.error(e.toString(), e);
                    emitter.completeWithError(e);
                }
                return;
            }
            llm.chatStream(prompt, new StreamResponseListener() {
                @Override
                public void onMessage(ChatContext chatContext, AiMessageResponse aiMessageResponse) {
                    try {
                        String content = aiMessageResponse.getMessage().getContent();
                        System.out.println("ai send >>>>>>" + content + "<<<<<<");
                        emitter.send(SseEmitter.event().data(content));
                    } catch (IOException e) {
                        logger.error(e.toString(), e);
                        emitter.completeWithError(e);
                    }
                }
 
                @Override
                public void onStop(ChatContext context) {
                    emitter.complete();
                }
            });
        });
        return emitter;
    }
 
    public ExecutorService getSseExecutor() {
        return sseExecutor;
    }
 
    public void setSseExecutor(ExecutorService sseExecutor) {
        this.sseExecutor = sseExecutor;
    }
}