Compare commits
No commits in common. "895f2f9caaa1e452828dd645173d7ab96456cb06" and "480f5a145658af4cfaa49c344b4666439b267043" have entirely different histories.
895f2f9caa
...
480f5a1456
|
|
@ -41,11 +41,11 @@
|
||||||
</dependency>
|
</dependency>
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>org.springframework.ai</groupId>
|
<groupId>org.springframework.ai</groupId>
|
||||||
<artifactId>spring-ai-starter-model-ollama</artifactId>
|
<artifactId>spring-ai-elasticsearch-store-spring-boot-starter</artifactId>
|
||||||
</dependency>
|
</dependency>
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>org.springframework.ai</groupId>
|
<groupId>org.springframework.ai</groupId>
|
||||||
<artifactId>spring-ai-starter-vector-store-mariadb</artifactId>
|
<artifactId>spring-ai-ollama-spring-boot-starter</artifactId>
|
||||||
</dependency>
|
</dependency>
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>org.springframework.ai</groupId>
|
<groupId>org.springframework.ai</groupId>
|
||||||
|
|
@ -71,7 +71,6 @@
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>org.mariadb.jdbc</groupId>
|
<groupId>org.mariadb.jdbc</groupId>
|
||||||
<artifactId>mariadb-java-client</artifactId>
|
<artifactId>mariadb-java-client</artifactId>
|
||||||
<version>3.5.1</version>
|
|
||||||
</dependency>
|
</dependency>
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>com.electromagnetic.data</groupId>
|
<groupId>com.electromagnetic.data</groupId>
|
||||||
|
|
|
||||||
|
|
@ -1,13 +1,24 @@
|
||||||
package com.electromagnetic.industry.software.manage.config;
|
package com.electromagnetic.industry.software.manage.config;
|
||||||
|
|
||||||
|
import jakarta.annotation.Resource;
|
||||||
import org.springframework.ai.chat.client.advisor.MessageChatMemoryAdvisor;
|
import org.springframework.ai.chat.client.advisor.MessageChatMemoryAdvisor;
|
||||||
|
import org.springframework.ai.chat.client.advisor.QuestionAnswerAdvisor;
|
||||||
import org.springframework.ai.chat.memory.InMemoryChatMemory;
|
import org.springframework.ai.chat.memory.InMemoryChatMemory;
|
||||||
|
import org.springframework.ai.vectorstore.VectorStore;
|
||||||
import org.springframework.context.annotation.Bean;
|
import org.springframework.context.annotation.Bean;
|
||||||
import org.springframework.stereotype.Component;
|
import org.springframework.stereotype.Component;
|
||||||
|
|
||||||
@Component
|
@Component
|
||||||
public class AiAdvisor {
|
public class AiAdvisor {
|
||||||
|
|
||||||
|
@Resource
|
||||||
|
private VectorStore vectorStore;
|
||||||
|
|
||||||
|
@Bean
|
||||||
|
public QuestionAnswerAdvisor questionAnswerAdvisor() {
|
||||||
|
return new QuestionAnswerAdvisor(vectorStore);
|
||||||
|
}
|
||||||
|
|
||||||
@Bean
|
@Bean
|
||||||
public MessageChatMemoryAdvisor messageChatMemoryAdvisor() {
|
public MessageChatMemoryAdvisor messageChatMemoryAdvisor() {
|
||||||
return new MessageChatMemoryAdvisor(new InMemoryChatMemory());
|
return new MessageChatMemoryAdvisor(new InMemoryChatMemory());
|
||||||
|
|
|
||||||
|
|
@ -24,6 +24,7 @@ import jakarta.annotation.Resource;
|
||||||
import lombok.extern.slf4j.Slf4j;
|
import lombok.extern.slf4j.Slf4j;
|
||||||
import org.springframework.ai.chat.client.ChatClient;
|
import org.springframework.ai.chat.client.ChatClient;
|
||||||
import org.springframework.ai.chat.client.advisor.MessageChatMemoryAdvisor;
|
import org.springframework.ai.chat.client.advisor.MessageChatMemoryAdvisor;
|
||||||
|
import org.springframework.ai.chat.client.advisor.QuestionAnswerAdvisor;
|
||||||
import org.springframework.ai.chat.messages.UserMessage;
|
import org.springframework.ai.chat.messages.UserMessage;
|
||||||
import org.springframework.ai.chat.model.ChatResponse;
|
import org.springframework.ai.chat.model.ChatResponse;
|
||||||
import org.springframework.ai.chat.prompt.Prompt;
|
import org.springframework.ai.chat.prompt.Prompt;
|
||||||
|
|
@ -55,24 +56,29 @@ public class ChatService {
|
||||||
@Resource
|
@Resource
|
||||||
private MessageChatMemoryAdvisor messageChatMemoryAdvisor;
|
private MessageChatMemoryAdvisor messageChatMemoryAdvisor;
|
||||||
@Resource
|
@Resource
|
||||||
|
private QuestionAnswerAdvisor questionAnswerAdvisor;
|
||||||
|
@Resource
|
||||||
private AiFileUploadRecordMapper aiFileUploadRecordMapper;
|
private AiFileUploadRecordMapper aiFileUploadRecordMapper;
|
||||||
@Resource
|
@Resource
|
||||||
private AiQuestionRecordMapper aiQuestionRecordMapper;
|
private AiQuestionRecordMapper aiQuestionRecordMapper;
|
||||||
@Resource
|
@Resource
|
||||||
private ElePropertyConfig elePropertyConfig;
|
private ElePropertyConfig elePropertyConfig;
|
||||||
|
|
||||||
// public ElectromagneticResult<?> deleteDocument(List<String> ids) {
|
public ElectromagneticResult<?> deleteDocument(List<String> ids) {
|
||||||
// List<String> vectorIds = aiFileUploadRecordMapper.selectList(Wrappers.lambdaQuery(AiFileUploadRecord.class)
|
List<String> vectorIds = aiFileUploadRecordMapper.selectList(Wrappers.lambdaQuery(AiFileUploadRecord.class)
|
||||||
// .in(AiFileUploadRecord::getId, ids))
|
.in(AiFileUploadRecord::getId, ids))
|
||||||
// .stream()
|
.stream()
|
||||||
// .map(AiFileUploadRecord::getVectorId)
|
.map(AiFileUploadRecord::getVectorId)
|
||||||
// .toList();
|
.toList();
|
||||||
// vectorStore.delete(vectorIds);
|
Optional<Boolean> delete = vectorStore.delete(vectorIds);
|
||||||
// aiFileUploadRecordMapper.update(Wrappers.lambdaUpdate(AiFileUploadRecord.class)
|
if (null != delete && delete.isPresent() && delete.get()) {
|
||||||
// .in(AiFileUploadRecord::getId, ids)
|
aiFileUploadRecordMapper.update(Wrappers.lambdaUpdate(AiFileUploadRecord.class)
|
||||||
// .set(AiFileUploadRecord::getEffectFlag, EffectFlagEnum.NOT_EFFECTIVE.code));
|
.in(AiFileUploadRecord::getId, ids)
|
||||||
// return ElectromagneticResultUtil.success(true);
|
.set(AiFileUploadRecord::getEffectFlag, EffectFlagEnum.NOT_EFFECTIVE.code));
|
||||||
// }
|
return ElectromagneticResultUtil.success(true);
|
||||||
|
}
|
||||||
|
return ElectromagneticResultUtil.fail("-1", "删除失败。");
|
||||||
|
}
|
||||||
|
|
||||||
@Transactional(rollbackFor = Exception.class)
|
@Transactional(rollbackFor = Exception.class)
|
||||||
public ElectromagneticResult<?> addFromUpload(MultipartFile file) throws Exception {
|
public ElectromagneticResult<?> addFromUpload(MultipartFile file) throws Exception {
|
||||||
|
|
@ -166,17 +172,15 @@ public class ChatService {
|
||||||
UserThreadLocal.set(userLoginInfo);
|
UserThreadLocal.set(userLoginInfo);
|
||||||
aiQuestionRecordMapper.insert(record);
|
aiQuestionRecordMapper.insert(record);
|
||||||
UserThreadLocal.remove();
|
UserThreadLocal.remove();
|
||||||
List<Document> documents = vectorStore.similaritySearch(queryDTO.getMsg());
|
|
||||||
String augmentedPrompt = "基于以下信息回答:" + documents + "\n\n" + queryDTO.getMsg();
|
|
||||||
return ChatClient.builder(model)
|
return ChatClient.builder(model)
|
||||||
.defaultSystem("必须用中文回答")
|
.defaultSystem("必须用中文回答")
|
||||||
.defaultAdvisors(messageChatMemoryAdvisor)
|
.defaultAdvisors(messageChatMemoryAdvisor, questionAnswerAdvisor)
|
||||||
.defaultOptions(OllamaOptions
|
.defaultOptions(OllamaOptions
|
||||||
.builder()
|
.builder()
|
||||||
.temperature(0.3)
|
.temperature(0.3)
|
||||||
.build())
|
.build())
|
||||||
.build()
|
.build()
|
||||||
.prompt(augmentedPrompt)
|
.prompt(queryDTO.getMsg())
|
||||||
.stream()
|
.stream()
|
||||||
.content();
|
.content();
|
||||||
}
|
}
|
||||||
|
|
@ -188,17 +192,15 @@ public class ChatService {
|
||||||
UserThreadLocal.set(userLoginInfo);
|
UserThreadLocal.set(userLoginInfo);
|
||||||
aiQuestionRecordMapper.insert(record);
|
aiQuestionRecordMapper.insert(record);
|
||||||
UserThreadLocal.remove();
|
UserThreadLocal.remove();
|
||||||
List<Document> documents = vectorStore.similaritySearch(queryDTO.getMsg());
|
|
||||||
String augmentedPrompt = "基于以下信息回答:" + documents + "\n\n" + queryDTO.getMsg();
|
|
||||||
return ChatClient.builder(model)
|
return ChatClient.builder(model)
|
||||||
.defaultSystem("必须用中文回答")
|
.defaultSystem("必须用中文回答")
|
||||||
.defaultAdvisors(messageChatMemoryAdvisor)
|
.defaultAdvisors(messageChatMemoryAdvisor, questionAnswerAdvisor)
|
||||||
.defaultOptions(OllamaOptions
|
.defaultOptions(OllamaOptions
|
||||||
.builder()
|
.builder()
|
||||||
.temperature(0.3)
|
.temperature(0.3)
|
||||||
.build())
|
.build())
|
||||||
.build()
|
.build()
|
||||||
.prompt(new Prompt(new UserMessage(augmentedPrompt)))
|
.prompt(new Prompt(new UserMessage(queryDTO.getMsg())))
|
||||||
.stream()
|
.stream()
|
||||||
.chatResponse();
|
.chatResponse();
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -5,21 +5,27 @@ spring.servlet.multipart.max-file-size=500MB
|
||||||
spring.servlet.multipart.max-request-size=500MB
|
spring.servlet.multipart.max-request-size=500MB
|
||||||
spring.mvc.async.request-timeout=3600000
|
spring.mvc.async.request-timeout=3600000
|
||||||
#mysql
|
#mysql
|
||||||
spring.datasource.url=jdbc:mariadb://139.196.179.195:3506/em_data_dev?serverTimezone=UTC&useUnicode=true&characterEncoding=utf-8&sslModel=true&serverTimezone=GMT%2B8&allowMultiQueries=true&rewriteBatchedStatements=true
|
spring.datasource.url=jdbc:mariadb://139.196.179.195:3306/em_data_dev?serverTimezone=UTC&useUnicode=true&characterEncoding=utf-8&sslModel=true&serverTimezone=GMT%2B8&allowMultiQueries=true&rewriteBatchedStatements=true
|
||||||
spring.datasource.driver-class-name=org.mariadb.jdbc.Driver
|
spring.datasource.driver-class-name=org.mariadb.jdbc.Driver
|
||||||
|
#spring.datasource.url=jdbc:mysql://139.196.179.195:3306/em_data_dev?serverTimezone=UTC&useUnicode=true&characterEncoding=utf-8&useSSL=true&serverTimezone=GMT%2B8&allowMultiQueries=true&rewriteBatchedStatements=true
|
||||||
|
#spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
|
||||||
spring.datasource.username=em_user_dev
|
spring.datasource.username=em_user_dev
|
||||||
spring.datasource.password=123456
|
spring.datasource.password=123456
|
||||||
spring.datasource.type=com.alibaba.druid.pool.DruidDataSource
|
spring.datasource.type=com.alibaba.druid.pool.DruidDataSource
|
||||||
|
# es
|
||||||
|
spring.elasticsearch.password=123456
|
||||||
|
spring.elasticsearch.username=elastic
|
||||||
|
spring.elasticsearch.uris=http://139.196.179.195:9200
|
||||||
#ai
|
#ai
|
||||||
spring.ai.ollama.base-url=http://localhost:11434
|
spring.ai.ollama.base-url=http://localhost:11434
|
||||||
spring.ai.ollama.chat.options.model=gemma3:latest
|
spring.ai.ollama.chat.options.model=gemma3:latest
|
||||||
spring.ai.ollama.chat.options.num-g-p-u=1
|
spring.ai.ollama.chat.options.num-g-p-u=1
|
||||||
spring.ai.ollama.embedding.options.internal-tool-execution-enabled=true
|
spring.ai.ollama.embedding.enabled=true
|
||||||
spring.ai.ollama.embedding.options.model=nomic-embed-text
|
spring.ai.ollama.embedding.model=nomic-embed-text
|
||||||
spring.ai.vectorstore.mariadb.initialize-schema=true
|
spring.ai.vectorstore.elasticsearch.initialize-schema=true
|
||||||
spring.ai.vectorstore.mariadb.distance-type=COSINE
|
spring.ai.vectorstore.elasticsearch.index-name=rag
|
||||||
spring.ai.vectorstore.mariadb.dimensions=1536
|
spring.ai.vectorstore.elasticsearch.dimensions=768
|
||||||
spring.ai.vectorstore.mariadb.table-name=rag
|
spring.ai.vectorstore.elasticsearch.similarity=cosine
|
||||||
allow.upload.file.types=doc, docx, txt, csv, xls, xlsx, pdf, ppt, pptx
|
allow.upload.file.types=doc, docx, txt, csv, xls, xlsx, pdf, ppt, pptx
|
||||||
# mybatis
|
# mybatis
|
||||||
mybatis-plus.mapper-locations=classpath:sqlmapper/*.xml
|
mybatis-plus.mapper-locations=classpath:sqlmapper/*.xml
|
||||||
|
|
|
||||||
2
pom.xml
2
pom.xml
|
|
@ -20,7 +20,7 @@
|
||||||
<maven.compiler.target>17</maven.compiler.target>
|
<maven.compiler.target>17</maven.compiler.target>
|
||||||
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
|
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
|
||||||
<spring.boot.version>3.3.8</spring.boot.version>
|
<spring.boot.version>3.3.8</spring.boot.version>
|
||||||
<spring.ai.version>1.0.0-M7</spring.ai.version>
|
<spring.ai.version>1.0.0-M5</spring.ai.version>
|
||||||
</properties>
|
</properties>
|
||||||
|
|
||||||
<dependencyManagement>
|
<dependencyManagement>
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue