Compare commits

..

No commits in common. "895f2f9caaa1e452828dd645173d7ab96456cb06" and "480f5a145658af4cfaa49c344b4666439b267043" have entirely different histories.

5 changed files with 49 additions and 31 deletions

View File

@ -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>

View File

@ -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());

View File

@ -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();
} }

View File

@ -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

View File

@ -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>