package init

main
liu 11 months ago
parent 0cbee97102
commit 895389bad3

@ -3,10 +3,9 @@
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>3.2.5</version>
<relativePath/> <!-- lookup parent from repository -->
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies-parent</artifactId>
<version>4.1.1</version>
</parent>
<groupId>com.supervision</groupId>
<artifactId>nx-llm</artifactId>
@ -15,69 +14,10 @@
<description>nx-llm</description>
<properties>
<java.version>17</java.version>
<spring-ai.version>0.8.1</spring-ai.version>
<spring.ai.version>1.0.3</spring.ai.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<!-- 引入ollama的依赖.版本号来自于 dependencyManagement中 spring-ai-bom中的版本号.-->
<dependency>
<groupId>io.springboot.ai</groupId>
<artifactId>spring-ai-ollama-spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>cn.hutool</groupId>
<artifactId>hutool-all</artifactId>
<version>5.8.26</version>
</dependency>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml</artifactId>
<version>4.1.2</version>
</dependency>
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-spring-boot3-starter</artifactId>
<version>3.5.5</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.26</version>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid-spring-boot-3-starter</artifactId>
<version>1.2.21</version>
</dependency>
</dependencies>
<dependencyManagement>
<dependencies>
<dependency>
@ -91,33 +31,4 @@
</dependencyManagement>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<excludes>
<exclude>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</exclude>
</excludes>
</configuration>
</plugin>
</plugins>
</build>
<repositories>
<repository>
<id>spring-milestones</id>
<name>Spring Milestones</name>
<url>https://repo.spring.io/milestone</url>
<snapshots>
<enabled>false</enabled>
</snapshots>
</repository>
</repositories>
</project>

@ -1,14 +0,0 @@
package com.supervision.nxllm;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@MapperScan(basePackages = {"com.supervision.**.mapper"})
@SpringBootApplication(scanBasePackages = {"com.supervision.**"})
public class NxLlmApplication {
public static void main(String[] args) {
SpringApplication.run(NxLlmApplication.class, args);
}
}

@ -1,120 +0,0 @@
package com.supervision.nxllm.controller;
import cn.hutool.core.io.FileUtil;
import cn.hutool.core.map.MapUtil;
import cn.hutool.core.util.StrUtil;
import com.supervision.springaidemo.domain.ModelMetric;
import com.supervision.springaidemo.dto.QARecordNodeDTO;
import com.supervision.springaidemo.service.ModelMetricService;
import com.supervision.springaidemo.service.NoteCheckRecordService;
import com.supervision.springaidemo.thread.RunCheckThread;
import com.supervision.springaidemo.thread.RunCheckThreadPool;
import com.supervision.springaidemo.util.RecordRegexUtil;
import com.supervision.springaidemo.util.WordReadUtil;
import lombok.extern.slf4j.Slf4j;
import org.springframework.ai.chat.messages.AssistantMessage;
import org.springframework.ai.chat.messages.Message;
import org.springframework.ai.chat.messages.SystemMessage;
import org.springframework.ai.chat.messages.UserMessage;
import org.springframework.ai.chat.prompt.Prompt;
import org.springframework.ai.ollama.OllamaChatClient;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.io.File;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
* ,
*/
@RestController
@Slf4j
@RequestMapping("exampleChat")
public class ExampleChatController {
private final OllamaChatClient chatClient;
@Autowired
private ModelMetricService modelMetricService;
@Autowired
private NoteCheckRecordService noteCheckRecordService;
@Autowired
public ExampleChatController(OllamaChatClient chatClient) {
this.chatClient = chatClient;
}
private static final String exampleTemplate = """
step by step,
step1:;
:
---
{context}
---
step2::
:
:{metricName}
true:{example};
false;
,,,empty
step3:,:
1.:true/false/empty
2.:,()true,!
3.:,,true/false,!
step4:json, JSONvalue,:
---
{"result":"结论", "originalContext":"笔录对应原话","reason":"原因"}
---
,!
""";
@GetMapping("exampleChat")
public void exampleChat() {
File file = FileUtil.file("/Users/flevance/Desktop/宁夏审讯大模型/裴金禄/行为人和受害人/裴金禄第一次.docx");
String context = WordReadUtil.readWord(file.getPath());
List<QARecordNodeDTO> qaList = RecordRegexUtil.recordRegex(context, "裴金禄");
for (QARecordNodeDTO qaRecordNodeDTO : qaList) {
// 只查入罪指标
List<ModelMetric> list = modelMetricService.lambdaQuery().likeRight(ModelMetric::getMetricCode, "RZ").list();
for (ModelMetric modelMetric : list) {
String systemPrompt = """
,,,,,,Think step by step
""";
List<Message> messages = new ArrayList<>(List.of(new SystemMessage(systemPrompt)));
Map<String, Object> param = new HashMap<>();
param.put("context", qaRecordNodeDTO.toString());
param.put("metricName", modelMetric.getMetricName());
param.put("example", StrUtil.format(modelMetric.getExample(), MapUtil.of("action", "裴金禄")));
String format = StrUtil.format(exampleTemplate, param);
List<Message> userMessageList = new ArrayList<>();
if (format.length() > 8000) {
log.info("分段提交");
for (String s : StrUtil.split(format, 6000)) {
userMessageList.add(new UserMessage(s));
userMessageList.add(new AssistantMessage("继续"));
}
userMessageList.remove(userMessageList.size() - 1);
} else {
userMessageList.add(new UserMessage(format));
}
messages.addAll(userMessageList);
RunCheckThread runCheck = new RunCheckThread("裴金禄尝试正则来做", chatClient, noteCheckRecordService, new Prompt(messages), FileUtil.getName(file), format, systemPrompt, modelMetric, 0);
RunCheckThreadPool.chatExecutor.submit(runCheck);
}
}
}
}

@ -1,91 +0,0 @@
package com.supervision.nxllm.thread;
import cn.hutool.core.util.StrUtil;
import cn.hutool.json.JSONUtil;
import com.supervision.springaidemo.domain.ModelMetric;
import com.supervision.springaidemo.domain.NoteCheckRecord;
import com.supervision.springaidemo.dto.MetricResultDTO;
import com.supervision.springaidemo.service.NoteCheckRecordService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.ai.chat.ChatResponse;
import org.springframework.ai.chat.Generation;
import org.springframework.ai.chat.prompt.Prompt;
import org.springframework.ai.ollama.OllamaChatClient;
import org.springframework.util.StopWatch;
@Slf4j
public class RunCheckThread implements Runnable {
private final String caseName;
private final OllamaChatClient chatClient;
private final NoteCheckRecordService noteCheckRecordService;
private final Prompt prompt;
private final String fileName;
private final String format;
private final String systemPrompt;
private final ModelMetric modelMetric;
private Integer count;
public RunCheckThread(String caseName, OllamaChatClient chatClient, NoteCheckRecordService noteCheckRecordService, Prompt prompt, String fileName, String format, String systemPrompt, ModelMetric modelMetric, Integer count) {
this.caseName = caseName;
this.chatClient = chatClient;
this.noteCheckRecordService = noteCheckRecordService;
this.prompt = prompt;
this.fileName = fileName;
this.format = format;
this.systemPrompt = systemPrompt;
this.modelMetric = modelMetric;
this.count = count;
}
@Override
public void run() {
try {
StopWatch stopWatch = new StopWatch();
stopWatch.start();
log.info("开始分析:{}",fileName);
ChatResponse call = chatClient.call(prompt);
stopWatch.stop();
log.info("耗时:{}", stopWatch.getTotalTimeSeconds());
Generation result = call.getResult();
String content = result.getOutput().getContent();
log.info("分析的结果是:{}", content);
MetricResultDTO metricResultDTO = JSONUtil.toBean(content, MetricResultDTO.class);
// 如果为空,则再跑一次,最多跑5次
if (StrUtil.isBlank(metricResultDTO.getResult())) {
if (count > 5) {
log.info("{}的{}结果超过5次,不再继续跑了", fileName, modelMetric);
} else {
log.info("{}的{}结果为空,当前跑了{}次,重新提交,再跑一次", fileName, modelMetric, count);
Integer newCount = count++;
RunCheckThread runCheck = new RunCheckThread(caseName, chatClient, noteCheckRecordService, prompt, fileName, format, systemPrompt, modelMetric, newCount);
RunCheckThreadPool.chatExecutor.submit(runCheck);
}
} else {
NoteCheckRecord noteCheckRecord = new NoteCheckRecord();
noteCheckRecord.setCaseName(caseName);
noteCheckRecord.setNoteName(fileName);
noteCheckRecord.setMetricCode(modelMetric.getMetricCode());
noteCheckRecord.setMetricName(modelMetric.getMetricName());
noteCheckRecord.setSystemPrompt(systemPrompt);
noteCheckRecord.setPrompt(format);
noteCheckRecord.setResult(metricResultDTO.getResult());
noteCheckRecord.setOriginalContext(metricResultDTO.getOriginalContext());
noteCheckRecord.setReason(metricResultDTO.getReason());
noteCheckRecordService.save(noteCheckRecord);
}
} catch (Exception e) {
log.error("出现错误", e);
}
}
}

@ -1,10 +0,0 @@
package com.supervision.nxllm.thread;
import cn.hutool.core.thread.ThreadUtil;
import java.util.concurrent.ExecutorService;
public class RunCheckThreadPool {
public static final ExecutorService chatExecutor = ThreadUtil.newFixedExecutor(20, Integer.MAX_VALUE, "chat", false);
}

@ -1,50 +0,0 @@
spring:
application:
name: nx-llm
ai:
# 文档地址 https://docs.spring.io/spring-ai/reference/1.0-SNAPSHOT/api/chat/ollama-chat.html
ollama:
# base-url: http://113.128.242.110:11434
base-url: http://192.168.10.70:11434
chat:
enabled: true
options:
model: llama3-chinese:8b
# 控制模型在请求后加载到内存中的时间(稍微长一点的时间,避免重复加载浪费性能,加快处理速度)
keep_alive: 30m
# 例如0.3
temperature: 0.1
format: json
# 减少产生废话的可能性。较高的值例如100将给出更多样化的答案而较低的值例如10将更加保守。
top-k: 90
# 与top-k一起工作。较高的值例如0.95将导致更加多样化的文本而较低的值例如0.5)将生成更加集中和保守的文本。
top-p: 0.95
datasource:
type: com.alibaba.druid.pool.DruidDataSource
druid:
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://192.168.10.137:3306/nx_llm?useUnicode=true&characterEncoding=utf-8&useSSL=true&nullCatalogMeansCurrent=true&serverTimezone=GMT%2B8
username: root
password: '123456'
initial-size: 5 # 初始化大小
min-idle: 10 # 最小连接数
max-active: 20 # 最大连接数
max-wait: 60000 # 获取连接时的最大等待时间
min-evictable-idle-time-millis: 300000 # 一个连接在池中最小生存的时间,单位是毫秒
time-between-eviction-runs-millis: 60000 # 多久才进行一次检测需要关闭的空闲连接,单位是毫秒
filters: stat,wall # 配置扩展插件stat-监控统计log4j-日志wall-防火墙防止SQL注入去掉后监控界面的sql无法统计
validation-query: SELECT 1 # 检测连接是否有效的 SQL语句为空时以下三个配置均无效
test-on-borrow: true # 申请连接时执行validationQuery检测连接是否有效默认true开启后会降低性能
test-on-return: true # 归还连接时执行validationQuery检测连接是否有效默认false开启后会降低性能
test-while-idle: true # 申请连接时如果空闲时间大于timeBetweenEvictionRunsMillis执行validationQuery检测连接是否有效默认false建议开启不影响性能
stat-view-servlet:
enabled: false # 是否开启 StatViewServlet
filter:
stat:
enabled: true # 是否开启 FilterStat默认true
log-slow-sql: true # 是否开启 慢SQL 记录默认false
slow-sql-millis: 5000 # 慢 SQL 的标准,默认 3000单位毫秒
merge-sql: false # 合并多个连接池的监控数据默认false
logging:
level:
org.springframework.ai: TRACE
Loading…
Cancel
Save