|
|
|
@ -1,336 +0,0 @@
|
|
|
|
|
package com.supervision.springaidemo.controller;
|
|
|
|
|
|
|
|
|
|
import cn.hutool.core.collection.CollUtil;
|
|
|
|
|
import cn.hutool.core.collection.ListUtil;
|
|
|
|
|
import cn.hutool.core.io.FileUtil;
|
|
|
|
|
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.ModelMetricService;
|
|
|
|
|
import com.supervision.police.service.NoteCheckRecordService;
|
|
|
|
|
import com.supervision.springaidemo.thread.RunCheckThread;
|
|
|
|
|
import com.supervision.springaidemo.thread.RunCheckThreadPool;
|
|
|
|
|
import com.supervision.springaidemo.util.WordReadUtil;
|
|
|
|
|
import lombok.extern.slf4j.Slf4j;
|
|
|
|
|
import org.springframework.ai.chat.ChatResponse;
|
|
|
|
|
import org.springframework.ai.chat.Generation;
|
|
|
|
|
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.RestController;
|
|
|
|
|
|
|
|
|
|
import java.io.BufferedReader;
|
|
|
|
|
import java.io.File;
|
|
|
|
|
import java.util.*;
|
|
|
|
|
|
|
|
|
|
@RestController
|
|
|
|
|
@Slf4j
|
|
|
|
|
public class ChatController {
|
|
|
|
|
|
|
|
|
|
private final OllamaChatClient chatClient;
|
|
|
|
|
|
|
|
|
|
@Autowired
|
|
|
|
|
private ModelMetricService modelMetricService;
|
|
|
|
|
|
|
|
|
|
@Autowired
|
|
|
|
|
private NoteCheckRecordService noteCheckRecordService;
|
|
|
|
|
|
|
|
|
|
// 使用多线程进行提交
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@Autowired
|
|
|
|
|
public ChatController(OllamaChatClient chatClient) {
|
|
|
|
|
this.chatClient = chatClient;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@GetMapping("/ai/chat")
|
|
|
|
|
public void generate() {
|
|
|
|
|
String template = """
|
|
|
|
|
一般嫌疑人或者受害者在笔录中说什么话能对应到下面指标呢
|
|
|
|
|
|
|
|
|
|
例子:指标:是否有金钱往来。回复:["XXX给我转来的钱。","我收到过XXX给我转来的钱","我通过银行给XXX转了钱"]
|
|
|
|
|
现在请对下面这个指标进行举例,例子要尽可能覆盖更多的情况;既要有行为人可能承认的话10条,还要有受害者可能指认的话10条!
|
|
|
|
|
指标:行为人在合同签订后支付了部分货款,并骗取全部货物后,在规定的期限内无正当理由不支付其余货款
|
|
|
|
|
回复json格式:{"behavior":[""],"victim":[""]}
|
|
|
|
|
""";
|
|
|
|
|
Prompt prompt = new Prompt(List.of(new UserMessage(template)));
|
|
|
|
|
ChatResponse call = chatClient.call(prompt);
|
|
|
|
|
Generation result = call.getResult();
|
|
|
|
|
String content = result.getOutput().getContent();
|
|
|
|
|
log.info(content);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private Message buildMessage(Map<String, Object> param) {
|
|
|
|
|
String messageTemplate = """
|
|
|
|
|
以下是案件的身份信息
|
|
|
|
|
---
|
|
|
|
|
行为人:金(李),吴
|
|
|
|
|
受害人:刘,尚,张
|
|
|
|
|
---
|
|
|
|
|
以下是笔录的内容:
|
|
|
|
|
---
|
|
|
|
|
问:我们是经侦大队的民警(出示工作证件),现依法向你询问有关问题。根据刑事诉讼法的有关规定,你应当如实提供证据、证言,如果有意作伪证或者隐匿罪证的,要负法律责任。你明白吗?答:明白。
|
|
|
|
|
问:现向你宣读《证人诉讼权利义务告知书》(向当事人宣读《证人诉讼权利义务告知书》,并将《证人诉讼权利义务告知书》送交当事人),你对你的权利义务是否清楚?答:清楚了。
|
|
|
|
|
问:你有什么要求吗?答:没有。
|
|
|
|
|
问:你的个人情况?答:我叫张,曾用名无,男,1980年出生,汉族,高中文化程度,户籍所在地宁夏固原市,现住宁夏固原市,现在无工作,居民身份证号码642226,联系电话13519。
|
|
|
|
|
问:你是否是中国共产党党员或国家机关工作人员?答:都不是。
|
|
|
|
|
问:你认识刘吗?答:认识,我们是朋友。
|
|
|
|
|
问:刘于2022年03月23日在我局报称:他和你、尚3人想合作经营一家汽车公司,被一名男子金骗了,该金自称是汽车有限公司的工作人员,负责西北地区推销,与刘签订了《汽车租赁合同》,租赁8辆新能源汽车,并协商每辆汽车缴纳5万元的押金使用3年,3年后由汽车公司收回车辆,退还押金,后刘分2次给该公司公户内转账20万元前期押金,剩余20万元押金等车辆到固原后将车辆上牌,再进行支付。支付押金后,金与该公司以各种借口推诿,至今未将租赁车辆交给你们3人,是否属实?答:属实。
|
|
|
|
|
问:你是如何得知汽车公司的?答:是金给我介绍的。
|
|
|
|
|
问:金是如何认识的?答:金是我通过平台认识,之后我们成为微信好友。
|
|
|
|
|
问:金是如何给你介绍汽车的?答:我之前与金在平台认识,之后我们成为微信好友,金平常就在微信内给我推送关于汽车的模式和链接。我当时看这个生意可以盈利,就与金了解汽车。
|
|
|
|
|
问:你是如何给刘和尚介绍的?答:当时我与金了解了汽车,前期需要投入40万元,我能力有限,就将此事与刘和尚商议,我当时给他们说合作在固原开一家汽车运营公司(包括卖车业务、租车业务、还有新能源汽车销售业务),我们3人商议后达成了合作协议。
|
|
|
|
|
问:你与刘、尚是如何出资的?答:前期需要缴纳20万元的押金,我出资了3万元,尚出资了5万元,刘出资了12万元,我和尚的钱全部交给刘,是刘分2次给汽车公司转账的。
|
|
|
|
|
问:你们具体是谁与金联系对接业务的?答:具体尚与金联系对接业务的。
|
|
|
|
|
问:你们将押金转给该公司后,该公司是否将你们预定的车辆发给你们?答:我们将20万元的押金转给该公司后,该公司与金以各种借口推诿,一直未将我们预定的车辆发给我们。之后我们到你们公安局报案,经你们民警联系后,该公司与金于2022年给我们发了一辆电动车,我当时察看后,该车是一辆旧车,也不能正常从板车上开下,我就没有要。
|
|
|
|
|
问:是谁给你通知让你去接车的?答:当时是一个山东省电话号码给我打电话,让我去固原市高速公路南出口接车,我去看见是一辆旧车,我就询问车辆司机,该车是从什么地方拉来的,司机称是从西安市拉来的。
|
|
|
|
|
问:你们当时是谁与金签订的《汽车租赁合同》?答:是刘与金签订的。
|
|
|
|
|
问:你们除了签订《汽车租赁合同》,还签订什么协议了吗?答:我们还签订了一份《授权及扶持补充协议》。
|
|
|
|
|
问:签订的《汽车租赁合同》、《授权及扶持补充协议》是谁制作的?答:是金带来的。
|
|
|
|
|
问:签订合同时,你是否在场?现场还有谁?答:我在场,现场还有尚,还有与金一起的女子。
|
|
|
|
|
问:你们当时签订合同预定的都是什么牌子的车辆?答:总共8辆全新的(刚出厂未挂牌)汽车,分别是创维4辆,奔腾2辆,尼桑1辆,大众朗逸1辆。
|
|
|
|
|
问:你讲一下金的基本情况?答:该男子真名不叫金,我们报案后,才知道该男子叫李,是山东人,身份证号码是:37078,联系电话是18,微信号是J,其他什么情况我不清楚。
|
|
|
|
|
问:你讲一下与金一起来的女子的基本情况?答:我只知道该女子姓吴,金称是他们公司的行政经理,联系电话是178,其他什么情况我不知道。
|
|
|
|
|
问:该姓吴女子来固原具体都做了什么工作?答:她只是来固原给我们办理注册公司。
|
|
|
|
|
问:你还有什么需要补充说明的吗?答:2022年01月刘将剩余的16万元转给该公司账户内,01月金(李)在微信内建了个微信群,群内有我、刘、尚、金(李)、刘、吴6人,称刘是汽车公司负责给各地发车,吴现在已经不在该群内了。
|
|
|
|
|
问:你以上所讲的是否属实?答:属实。
|
|
|
|
|
问:以上笔录请你仔细阅看。如果记录有误请指出来,我们即给予更正。请你确认记录无误后再在笔录上逐页签名。答:好的。
|
|
|
|
|
---
|
|
|
|
|
|
|
|
|
|
现在需要你根据以上内容,进行判断并以简体中文输出下面的各项,注意:如果笔录里面有提到了存在相关证据,则你可以认为这些证据文件是真实存在的
|
|
|
|
|
1.指标名称:{metricName}。
|
|
|
|
|
2.结论:true({metricTrueDesc})/false({metricFalseDesc}),直接给我true/false。
|
|
|
|
|
3.笔录对应原话:从笔录的对话中,得到该结论的原文(一定是摘抄的原文)。
|
|
|
|
|
4.原因:分析得出该结论的原因,需明确说明为什么得到该结论,需要逻辑清晰完整。
|
|
|
|
|
|
|
|
|
|
判断结果以json格式回复, JSON的value内容我给你的提示,在实际输出的时候不需要带上:
|
|
|
|
|
---
|
|
|
|
|
{"metricName":"指标名称", "result":"结论", "originalContext":"笔录对应原话","reason":"原因"}
|
|
|
|
|
---
|
|
|
|
|
""";
|
|
|
|
|
String format = StrUtil.format(messageTemplate, param);
|
|
|
|
|
return new UserMessage(format);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@GetMapping("/ai/run")
|
|
|
|
|
public void run() {
|
|
|
|
|
var list = modelMetricService.list();
|
|
|
|
|
for (ModelMetric modelMetric : list) {
|
|
|
|
|
Map<String, Object> param = new HashMap<>();
|
|
|
|
|
param.put("metricTrueDesc", modelMetric.getMetricTrueDesc());
|
|
|
|
|
param.put("metricFalseDesc", modelMetric.getMetricFalseDesc());
|
|
|
|
|
param.put("metricName", modelMetric.getMetricName());
|
|
|
|
|
Message message = buildMessage(param);
|
|
|
|
|
Prompt prompt = new Prompt(List.of(new SystemMessage("所有的回复以简体中文回答。请以step by step的方式进行。step1:理解笔录设计人员的身份信息;step2:根据笔录的内容分析案件之间的逻辑关系和关联;step3:判断给定的指标是否满足。step4:根据要求的给定格式进行回复"), message));
|
|
|
|
|
log.info("prompt:{}", prompt.toString());
|
|
|
|
|
ChatResponse call = chatClient.call(prompt);
|
|
|
|
|
Generation result = call.getResult();
|
|
|
|
|
String content = result.getOutput().getContent();
|
|
|
|
|
log.info(content);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private static final String template = """
|
|
|
|
|
我们现在需要以step by step的方式进行笔录的指标分析工作,得到最终的结果并返回。
|
|
|
|
|
step1:理解下面人员身份信息;
|
|
|
|
|
---
|
|
|
|
|
行为人:{actionUserNameList}
|
|
|
|
|
犯罪嫌疑人:{suspectUserNameList}
|
|
|
|
|
受害人:{victimUserNameList}
|
|
|
|
|
证人:{witnessNameList}
|
|
|
|
|
---
|
|
|
|
|
|
|
|
|
|
step2:分析笔录的内容;
|
|
|
|
|
以下是笔录的内容,笔录中"问"是办案警官问,"答"是{noteUserName}回答:
|
|
|
|
|
---
|
|
|
|
|
{context}
|
|
|
|
|
---
|
|
|
|
|
|
|
|
|
|
step3:现在给你指标以及指标的释义或例子:
|
|
|
|
|
指标:{metricName}
|
|
|
|
|
指标释义或例子及判断标准:
|
|
|
|
|
如({metricTrueDesc}),则为true;
|
|
|
|
|
如({metricFalseDesc}),则为false;
|
|
|
|
|
如果笔录中,没有任何笔录内容涉及到该项指标,则为empty。
|
|
|
|
|
|
|
|
|
|
step4:现在需要你根据上面提供的所有信息,尽可能实事求是完成判断:
|
|
|
|
|
1.判断结论:true/false/empty
|
|
|
|
|
2.得到结论的笔录原话:从笔录的对话中,得到该结论的原文(一定是摘抄的原文且为中文)。如果结论为true,则必须要有原文佐证!
|
|
|
|
|
3.得到结论的原因:分析得出该结论的原因,需明确说明为什么得到该结论,需要实事求是且为中文回复。如果结论为true/false,则必须有原因!
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
step5:必须以json格式回复, JSON的value内容我给你的提示,在实际输出的时候不需要带上:
|
|
|
|
|
---
|
|
|
|
|
{"result":"结论", "originalContext":"笔录对应原话","reason":"原因"}
|
|
|
|
|
---
|
|
|
|
|
好了,现在可以回复了!
|
|
|
|
|
""";
|
|
|
|
|
|
|
|
|
|
@GetMapping("runNoteCheck")
|
|
|
|
|
public void runNoteCheck() {
|
|
|
|
|
HashMap<String, String> map = new HashMap<>();
|
|
|
|
|
map.put("杨学明", "/Users/flevance/Desktop/宁夏审讯大模型/陈恩明合同诈骗/受害人杨学明询问笔录.docx");
|
|
|
|
|
map.put("朱文泽", "/Users/flevance/Desktop/宁夏审讯大模型/陈恩明合同诈骗/受害人朱文泽询问笔录.docx");
|
|
|
|
|
map.put("陈恩明", "/Users/flevance/Desktop/宁夏审讯大模型/陈恩明合同诈骗/嫌疑人陈恩明讯问笔录.docx");
|
|
|
|
|
map.put("武桂清1", "/Users/flevance/Desktop/宁夏审讯大模型/陈恩明合同诈骗/嫌疑人武桂清讯问笔录1.docx");
|
|
|
|
|
map.put("武桂清2", "/Users/flevance/Desktop/宁夏审讯大模型/陈恩明合同诈骗/嫌疑人武桂清讯问笔录2.docx");
|
|
|
|
|
for (Map.Entry<String, String> entry : map.entrySet()) {
|
|
|
|
|
String context = WordReadUtil.readWord(entry.getValue());
|
|
|
|
|
List<String> actionUserNameList = new ArrayList<>();
|
|
|
|
|
actionUserNameList.add("陈恩明");
|
|
|
|
|
actionUserNameList.add("武桂清");
|
|
|
|
|
List<String> victimUserNameList = new ArrayList<>();
|
|
|
|
|
victimUserNameList.add("漫旭昌");
|
|
|
|
|
victimUserNameList.add("杨学明");
|
|
|
|
|
victimUserNameList.add("朱文泽");
|
|
|
|
|
var list = modelMetricService.list();
|
|
|
|
|
for (ModelMetric modelMetric : list) {
|
|
|
|
|
// 没有跑过的,才继续跑
|
|
|
|
|
Long count = noteCheckRecordService.lambdaQuery().eq(NoteCheckRecord::getPersonName, entry.getKey()).eq(NoteCheckRecord::getMetricCode, modelMetric.getMetricCode()).count();
|
|
|
|
|
if (count < 1) {
|
|
|
|
|
Map<String, Object> param = new HashMap<>();
|
|
|
|
|
param.put("actionUserNameList", CollUtil.join(actionUserNameList, ";"));
|
|
|
|
|
param.put("victimUserNameList", CollUtil.join(victimUserNameList, ";"));
|
|
|
|
|
param.put("witnessNameList", "无");
|
|
|
|
|
param.put("noteUserName", entry.getKey());
|
|
|
|
|
param.put("context", context);
|
|
|
|
|
param.put("metricName", modelMetric.getMetricName());
|
|
|
|
|
param.put("metricTrueDesc", modelMetric.getMetricTrueDesc());
|
|
|
|
|
param.put("metricFalseDesc", modelMetric.getMetricFalseDesc());
|
|
|
|
|
String format = StrUtil.format(template, param);
|
|
|
|
|
Message message = new UserMessage(format);
|
|
|
|
|
Prompt prompt = new Prompt(List.of(new SystemMessage("所有的回复以简体中文回答。请以step by step的方式进行。step1:理解笔录设计人员的身份信息;step2:根据笔录的内容分析案件之间的逻辑关系和关联;step3:根据给定的指标,提取出来可能涉及的笔录内容文本;step4:根据该笔录内容判断给定的指标是否满足。step5:根据要求的给定格式进行回复"), message));
|
|
|
|
|
log.info("prompt:{}", prompt);
|
|
|
|
|
ChatResponse call = chatClient.call(prompt);
|
|
|
|
|
Generation result = call.getResult();
|
|
|
|
|
String content = result.getOutput().getContent();
|
|
|
|
|
log.info(content);
|
|
|
|
|
MetricResultDTO metricResultDTO = JSONUtil.toBean(content, MetricResultDTO.class);
|
|
|
|
|
NoteCheckRecord noteCheckRecord = new NoteCheckRecord();
|
|
|
|
|
noteCheckRecord.setPersonName(entry.getKey());
|
|
|
|
|
noteCheckRecord.setNoteName(FileUtil.getName(entry.getValue()));
|
|
|
|
|
noteCheckRecord.setType(entry.getKey().contains("询问") ? "询问" : "讯问");
|
|
|
|
|
noteCheckRecord.setMetricCode(modelMetric.getMetricCode());
|
|
|
|
|
noteCheckRecord.setMetricName(modelMetric.getMetricName());
|
|
|
|
|
noteCheckRecord.setResult(metricResultDTO.getResult());
|
|
|
|
|
noteCheckRecord.setOriginalContext(metricResultDTO.getOriginalContext());
|
|
|
|
|
noteCheckRecord.setReason(metricResultDTO.getReason());
|
|
|
|
|
noteCheckRecordService.save(noteCheckRecord);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 从word中读取笔录
|
|
|
|
|
*/
|
|
|
|
|
|
|
|
|
|
@GetMapping("runCheck")
|
|
|
|
|
public void runCheck() {
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// List<String> metricCodeList = ListUtil.list(false, "RZ010", "RZ019", "RZ020", "RZ022");
|
|
|
|
|
// 行为人
|
|
|
|
|
List<String> actionUserNameList = ListUtil.list(false, "裴金禄");
|
|
|
|
|
// 犯罪嫌疑人
|
|
|
|
|
List<String> suspectUserNameList = ListUtil.list(false, "裴金禄", "景涛", "李世怀", "万学宝");
|
|
|
|
|
// 受害人
|
|
|
|
|
List<String> victimUserNameList = ListUtil.list(false, "董金才", "吕加国", "吕志仓");
|
|
|
|
|
// 证人
|
|
|
|
|
List<String> witnessNameList = ListUtil.list(false, "白鹏", "丁建华", "雷建贵", "雷建明", "李泽懿", "王存良", "王开阔", "吴尚军", "杨正福", "叶魁伍", "赵景宝");
|
|
|
|
|
// 获取目录下的所有笔录信息
|
|
|
|
|
List<File> files = FileUtil.loopFiles("/Users/flevance/Desktop/宁夏审讯大模型/裴金禄/行为人和受害人/");
|
|
|
|
|
for (File file : files) {
|
|
|
|
|
// 只跑裴金禄的笔录
|
|
|
|
|
log.info("开始分析:{}的笔录", file.getName());
|
|
|
|
|
String context = WordReadUtil.readWord(file.getPath());
|
|
|
|
|
// List<ModelMetric> list = modelMetricService.lambdaQuery().in(ModelMetric::getMetricCode, metricCodeList).list();
|
|
|
|
|
List<ModelMetric> list = modelMetricService.list();
|
|
|
|
|
for (ModelMetric modelMetric : list) {
|
|
|
|
|
|
|
|
|
|
Map<String, Object> param = new HashMap<>();
|
|
|
|
|
param.put("actionUserNameList", CollUtil.join(actionUserNameList, ";"));
|
|
|
|
|
param.put("suspectUserNameList", CollUtil.join(suspectUserNameList, ";"));
|
|
|
|
|
param.put("victimUserNameList", CollUtil.join(victimUserNameList, ";"));
|
|
|
|
|
param.put("witnessNameList", CollUtil.join(witnessNameList, ";"));
|
|
|
|
|
param.put("context", context);
|
|
|
|
|
param.put("metricName", modelMetric.getMetricName());
|
|
|
|
|
param.put("metricTrueDesc", modelMetric.getMetricTrueDesc());
|
|
|
|
|
param.put("metricFalseDesc", modelMetric.getMetricFalseDesc());
|
|
|
|
|
String format = StrUtil.format(template, param);
|
|
|
|
|
List<Message> userMessageList = new ArrayList<>();
|
|
|
|
|
log.info("开始提交分析,prompt长度为:{}", format.length());
|
|
|
|
|
// 如果超过8000字,就进行截断,每次以6000字进行提交
|
|
|
|
|
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));
|
|
|
|
|
}
|
|
|
|
|
String systemPrompt = """
|
|
|
|
|
你是一个善于分析办案笔录的模型,能够根据办案笔录中的当事人的回答内容,实事求是的判断给定指标是否满足。注意,仅根据笔录进行分析,不要做笔录之外的推断。笔录内容可能比较长,可能分多次提交给你。
|
|
|
|
|
""";
|
|
|
|
|
List<Message> messages = new ArrayList<>(List.of(new SystemMessage(systemPrompt)));
|
|
|
|
|
messages.addAll(userMessageList);
|
|
|
|
|
Prompt prompt = new Prompt(messages);
|
|
|
|
|
RunCheckThread runCheck = new RunCheckThread("裴金禄第五次",chatClient, noteCheckRecordService, prompt, file.getName(), format, systemPrompt, modelMetric, 0);
|
|
|
|
|
RunCheckThreadPool.chatExecutor.submit(runCheck);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@GetMapping("testLongText")
|
|
|
|
|
public void testLongText() {
|
|
|
|
|
StringBuilder stringBuilder = new StringBuilder();
|
|
|
|
|
|
|
|
|
|
BufferedReader utf8Reader = FileUtil.getUtf8Reader("/Users/flevance/Desktop/宁夏审讯大模型/了不起的盖茨比 .txt");
|
|
|
|
|
utf8Reader.lines().forEach(stringBuilder::append);
|
|
|
|
|
String template = """
|
|
|
|
|
我现在给你一个小说,请你解析小说的内容:
|
|
|
|
|
---
|
|
|
|
|
{context}
|
|
|
|
|
---
|
|
|
|
|
现在请你分析小说内容,讲讲第8章讲了什么内容,清晰的描述出来.请以中文进行回答.并以json的形式进行输出
|
|
|
|
|
""";
|
|
|
|
|
String systemPrompt = """
|
|
|
|
|
你是一个善于归纳分析的大模型,我现在需要你来做小说内容提取。小说内容可能比较长,可能分多次提交给你。所有的回答都以中文的形式进行回答.
|
|
|
|
|
""";
|
|
|
|
|
Map<String, Object> param = new HashMap<>();
|
|
|
|
|
log.info("大小是:{}", stringBuilder.length());
|
|
|
|
|
param.put("context", stringBuilder.toString());
|
|
|
|
|
String format = StrUtil.format(template, param);
|
|
|
|
|
List<Message> userMessageList = new ArrayList<>();
|
|
|
|
|
for (String s : StrUtil.split(format, 6000)) {
|
|
|
|
|
userMessageList.add(new UserMessage(s));
|
|
|
|
|
userMessageList.add(new AssistantMessage("继续"));
|
|
|
|
|
}
|
|
|
|
|
userMessageList.remove(userMessageList.size() - 1);
|
|
|
|
|
List<Message> messages = new ArrayList<>(List.of(new SystemMessage(systemPrompt)));
|
|
|
|
|
messages.addAll(userMessageList);
|
|
|
|
|
Prompt prompt = new Prompt(messages);
|
|
|
|
|
|
|
|
|
|
ChatResponse call = chatClient.call(prompt);
|
|
|
|
|
Generation result = call.getResult();
|
|
|
|
|
|
|
|
|
|
String content = result.getOutput().getContent();
|
|
|
|
|
log.info("分析的结果是:{}", content);
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|