Commit 35fdab75 authored by R10's avatar R10

Merge branch 'release_gdghg' of ssh://gitlab.gsstcloud.com:10022/poc/poc-api into release_gdghg

parents 9d028122 6c4e6a66
...@@ -26,6 +26,8 @@ public enum AiDialoguesTypeEnum { ...@@ -26,6 +26,8 @@ public enum AiDialoguesTypeEnum {
TRAVEL_BUSINESS("travel_business", "旅游业务"), TRAVEL_BUSINESS("travel_business", "旅游业务"),
MEETING_ASSISTANT("meeting_assistant","会议助手"),
; ;
private final String type; private final String type;
......
...@@ -22,11 +22,11 @@ public interface BizAiDialoguesService extends BaseService { ...@@ -22,11 +22,11 @@ public interface BizAiDialoguesService extends BaseService {
BizAiDialoguesEntity get(java.lang.Long id) throws Exception; BizAiDialoguesEntity get(java.lang.Long id) throws Exception;
List<BizAiDialoguesEntity> findByExample(BizAiDialoguesEntity example, PagingInfo pagingInfo) throws Exception; List<BizAiDialoguesEntity> findByExample(BizAiDialoguesEntity example, PagingInfo pagingInfo);
BizAiDialoguesEntity save(BizAiDialoguesEntity entity) throws Exception; BizAiDialoguesEntity save(BizAiDialoguesEntity entity) throws Exception;
BizAiDialoguesEntity update(BizAiDialoguesEntity entity) throws Exception; BizAiDialoguesEntity update(BizAiDialoguesEntity entity) ;
void deletedById(java.lang.Long id) throws Exception; void deletedById(java.lang.Long id) throws Exception;
......
...@@ -64,7 +64,7 @@ public class BizAiDialoguesServiceImpl extends BaseServiceImpl ...@@ -64,7 +64,7 @@ public class BizAiDialoguesServiceImpl extends BaseServiceImpl
} }
public List<BizAiDialoguesEntity> findByExample(BizAiDialoguesEntity example, PagingInfo pagingInfo) throws Exception { public List<BizAiDialoguesEntity> findByExample(BizAiDialoguesEntity example, PagingInfo pagingInfo) {
List<BizAiDialoguesEntity> result = new ArrayList<BizAiDialoguesEntity>(); List<BizAiDialoguesEntity> result = new ArrayList<BizAiDialoguesEntity>();
BizAiDialoguesModel model = new BizAiDialoguesModel(); BizAiDialoguesModel model = new BizAiDialoguesModel();
if (example != null) { if (example != null) {
...@@ -87,7 +87,7 @@ public class BizAiDialoguesServiceImpl extends BaseServiceImpl ...@@ -87,7 +87,7 @@ public class BizAiDialoguesServiceImpl extends BaseServiceImpl
return BizAiDialoguesConvert.modelToEntity(saveModel); return BizAiDialoguesConvert.modelToEntity(saveModel);
} }
public BizAiDialoguesEntity update(BizAiDialoguesEntity entity) throws Exception { public BizAiDialoguesEntity update(BizAiDialoguesEntity entity) {
Assert.notNull(entity); Assert.notNull(entity);
Assert.notNull(entity.getId(), "update pk can not be null"); Assert.notNull(entity.getId(), "update pk can not be null");
BizAiDialoguesModel model = this.repository.get(entity.getId()); BizAiDialoguesModel model = this.repository.get(entity.getId());
......
package cn.com.poc.common.segmentation;
import cn.com.poc.common.segmentation.domain.SegmentationConfig;
import cn.com.poc.common.segmentation.domain.SegmentationResult;
import cn.com.poc.common.utils.DocumentLoad;
import org.springframework.util.Assert;
import java.io.File;
import java.util.ArrayList;
import java.util.List;
/**
* 【默认分割】
* <p>
* 默认分割根据【大切分长度】和【子切分长度】进行分割,每个大切片包含多个子切片
* 通过配置RepetitionRate参数来控制重复率【上下分块重复大小】
*
* @author alex.yao
* @version 1.0
* @Date 2024/9/3
*/
public class DefaultSegmentation extends SegmentationAbstract {
@Override
public List<SegmentationResult> scrap(SegmentationConfig config) {
try {
// 校验配置
paramVerification(config);
// 下载文档
File file = DocumentLoad.downloadURLDocument(this.documentUrl);
// 加载文档内容
String content = DocumentLoad.documentToText(file);
// 分割内容
return contentSplitters(config, content);
} catch (Exception e) {
throw new RuntimeException("文档加载失败");
}
}
private static void paramVerification(SegmentationConfig config) {
Assert.notNull(config);
Assert.notNull(config.getChunkSize());
Assert.notNull(config.getScrapSize());
Assert.notNull(config.getRepetitionRate());
Assert.isTrue(config.getRepetitionRate() > 0 && config.getRepetitionRate() <= 50, "重复率参数错误,必须大于0和小于50");
Assert.isTrue(config.getChunkSize() > 0 && config.getScrapSize() > 0, "切块大小参数错误");
Assert.isTrue(config.getChunkSize() >= config.getScrapSize(), "【子切片】长度必须小于【大切片】长度");
}
public List<SegmentationResult> contentSplitters(SegmentationConfig config, String documentContents) {
List<SegmentationResult> result = new ArrayList<>();
int CHUNK_SIZE = 300;
int CHUNK_REDUNDANT_VALUE = CHUNK_SIZE / 5;
int SCRAP_SIZE = 80;
int SCRAP_REDUNDANT_VALUE = SCRAP_SIZE / 5;
int left = CHUNK_REDUNDANT_VALUE - CHUNK_SIZE, right = 0;//初始化左右指针
//切分大块
while (right < documentContents.length()) {
left = left + CHUNK_SIZE - CHUNK_REDUNDANT_VALUE; //更新大块左指针
right = Math.min(left + CHUNK_SIZE, documentContents.length());//更新大块右指针
String chunkContent = documentContents.substring(left, right);//大块内容
//大块分割成多小块
int scrapLeft = SCRAP_REDUNDANT_VALUE - SCRAP_SIZE; // 小块 左指针
int scrapRight = 0; //小块 右指针
List<String> scrapChunkContent = new ArrayList<>();
while (scrapRight < chunkContent.length()) {
scrapLeft = scrapLeft + SCRAP_SIZE - SCRAP_REDUNDANT_VALUE;//更新左指针
scrapRight = Math.min(scrapLeft + SCRAP_SIZE, chunkContent.length());//更新右指针
String scrapChunk = chunkContent.substring(scrapLeft, scrapRight);//小块内容
scrapChunkContent.add(scrapChunk);
}
SegmentationResult segmentationResult = new SegmentationResult();
segmentationResult.setChunkContent(chunkContent);
segmentationResult.setScrapChunkContent(scrapChunkContent);
result.add(segmentationResult);
}
return result;
}
}
package cn.com.poc.common.segmentation;
import cn.com.poc.common.segmentation.domain.SegmentationConfig;
import cn.com.poc.common.segmentation.domain.SegmentationResult;
import cn.com.poc.common.utils.DocumentLoad;
import org.apache.commons.lang3.StringUtils;
import org.springframework.util.Assert;
import java.io.File;
import java.util.ArrayList;
import java.util.List;
/**
* 【字数分割】
* <p>
* 默认分割根据【大切分长度】和【子切分长度】进行分割,每个大切片包含多个子切片
* 通过配置RepetitionRate参数来控制重复率【上下分块重复大小】
*
* @author alex.yao
* @version 1.0
* @Date 2024/9/3
*/
public class NumberOfWordSegmentation extends SegmentationAbstract {
@Override
public List<SegmentationResult> scrap(SegmentationConfig config) {
try {
// 校验配置
paramVerification(config);
String content = this.content;
if (StringUtils.isNotBlank(this.documentUrl)) {
// 下载文档
File file = DocumentLoad.downloadURLDocument(this.documentUrl);
// 加载文档内容
content = DocumentLoad.documentToText(file);
}
// 分割内容
return contentSplitters(config, content);
} catch (Exception e) {
throw new RuntimeException("文档加载失败");
}
}
private static void paramVerification(SegmentationConfig config) {
Assert.notNull(config);
Assert.notNull(config.getChunkSize());
Assert.notNull(config.getScrapSize());
Assert.notNull(config.getRepetitionRate());
Assert.isTrue(config.getRepetitionRate() > 0 && config.getRepetitionRate() <= 50, "重复率参数错误,必须大于0和小于50");
Assert.isTrue(config.getChunkSize() > 0 && config.getScrapSize() > 0, "切块大小参数错误");
Assert.isTrue(config.getChunkSize() >= config.getScrapSize(), "【子切片】长度必须小于【大切片】长度");
}
public List<SegmentationResult> contentSplitters(SegmentationConfig config, String documentContents) {
List<SegmentationResult> result = new ArrayList<>();
int CHUNK_SIZE = config.getChunkSize();
int CHUNK_REDUNDANT_VALUE = (int) (CHUNK_SIZE * (config.getRepetitionRate() / 100D));
int SCRAP_SIZE = config.getScrapSize();
int SCRAP_REDUNDANT_VALUE = (int) (SCRAP_SIZE * (config.getRepetitionRate() / 100D));
int left = CHUNK_REDUNDANT_VALUE - CHUNK_SIZE, right = 0;//初始化左右指针
//切分大块
while (right < documentContents.length()) {
left = left + CHUNK_SIZE - CHUNK_REDUNDANT_VALUE; //更新大块左指针
right = Math.min(left + CHUNK_SIZE, documentContents.length());//更新大块右指针
String chunkContent = documentContents.substring(left, right);//大块内容
//大块分割成多小块
int scrapLeft = SCRAP_REDUNDANT_VALUE - SCRAP_SIZE; // 小块 左指针
int scrapRight = 0; //小块 右指针
List<String> scrapChunkContent = new ArrayList<>();
while (scrapRight < chunkContent.length()) {
scrapLeft = scrapLeft + SCRAP_SIZE - SCRAP_REDUNDANT_VALUE;//更新左指针
scrapRight = Math.min(scrapLeft + SCRAP_SIZE, chunkContent.length());//更新右指针
String scrapChunk = chunkContent.substring(scrapLeft, scrapRight);//小块内容
scrapChunkContent.add(scrapChunk);
}
SegmentationResult segmentationResult = new SegmentationResult();
segmentationResult.setChunkContent(chunkContent);
segmentationResult.setScrapChunkContent(scrapChunkContent);
result.add(segmentationResult);
}
return result;
}
}
package cn.com.poc.common.segmentation;
import cn.com.poc.common.segmentation.domain.SegmentationConfig;
import cn.com.poc.common.segmentation.domain.SegmentationResult;
import java.util.List;
public abstract class SegmentationAbstract {
protected String documentName;
protected String content;
protected String documentUrl;
public List<SegmentationResult> scrap(SegmentationConfig config) {
return null;
}
public void setDocumentName(String documentName) {
this.documentName = documentName;
}
public void setDocumentUrl(String documentUrl) {
this.documentUrl = documentUrl;
}
public void setContent(String content) {
this.content = content;
}
}
package cn.com.poc.common.segmentation;
import cn.com.poc.common.segmentation.contents.SegmentationEnum;
import cn.com.yict.framemax.core.exception.BusinessException;
import org.apache.commons.lang3.StringUtils;
/**
* @author alex
*/
public class SegmentationBuilder {
private String content;
private String documentUrl;
private String documentName;
private String segmentationType;
public SegmentationBuilder content(String content) {
this.content = content;
return this;
}
public SegmentationBuilder documentUrl(String documentUrl) {
this.documentUrl = documentUrl;
return this;
}
public SegmentationBuilder documentName(String documentName) {
this.documentName = documentName;
return this;
}
public SegmentationBuilder segmentationType(String segmentationType) {
this.segmentationType = segmentationType;
return this;
}
public SegmentationAbstract build() {
try {
if (StringUtils.isBlank(this.documentUrl) && StringUtils.isBlank(content)) {
throw new BusinessException("文本分割器不能为空");
}
if (StringUtils.isBlank(this.segmentationType)) {
throw new BusinessException("文本分割器类型不能为空");
}
Class<? extends SegmentationAbstract> segmentationClass = SegmentationEnum.matchSegmentationClass(this.segmentationType);
if (segmentationClass == null) {
throw new BusinessException("未找到该类型文本分割器");
}
SegmentationAbstract segmentationAbstract = segmentationClass.newInstance();
segmentationAbstract.setDocumentUrl(this.documentUrl);
segmentationAbstract.setContent(this.content);
segmentationAbstract.setDocumentName(this.documentName);
return segmentationAbstract;
} catch (InstantiationException | IllegalAccessException e) {
throw new BusinessException("文本分割器初始化失败");
}
}
}
package cn.com.poc.common.segmentation.contents;
import cn.com.poc.common.segmentation.DefaultSegmentation;
import cn.com.poc.common.segmentation.NumberOfWordSegmentation;
import cn.com.poc.common.segmentation.SegmentationAbstract;
/**
* 内容分片枚举
*
* @author alex.yao
*/
public enum SegmentationEnum {
/**
* 默认-分片大小
*/
DEFAULT(DefaultSegmentation.class),
/**
* 按字数
*/
NUMBER_Of_WORDS(NumberOfWordSegmentation.class),
;
private final Class<? extends SegmentationAbstract> clazz;
SegmentationEnum(Class<? extends SegmentationAbstract> clazz) {
this.clazz = clazz;
}
public static Class<? extends SegmentationAbstract> matchSegmentationClass(String type) {
for (SegmentationEnum segmentation : SegmentationEnum.values()) {
if (segmentation.name().equalsIgnoreCase(type)) {
return segmentation.clazz;
}
}
return null;
}
}
package cn.com.poc.common.segmentation.domain;
import java.util.List;
public class SegmentationConfig {
/**
* 大分片大小
*/
private int chunkSize;
/**
* 小分片大小
*/
private int scrapSize;
/**
* 分片重复率
*/
private int repetitionRate;
/**
* 关联信息
*/
private List<String> relationInfo;
/**
* 自定义正则
*/
private String regex;
/**
* 标点符号
*/
private List<String> punctuations;
public List<String> getPunctuations() {
return punctuations;
}
public void setPunctuations(List<String> punctuations) {
this.punctuations = punctuations;
}
public String getRegex() {
return regex;
}
public void setRegex(String regex) {
this.regex = regex;
}
public int getChunkSize() {
return chunkSize;
}
public void setChunkSize(int chunkSize) {
this.chunkSize = chunkSize;
}
public int getScrapSize() {
return scrapSize;
}
public void setScrapSize(int scrapSize) {
this.scrapSize = scrapSize;
}
public int getRepetitionRate() {
return repetitionRate;
}
public void setRepetitionRate(int repetitionRate) {
this.repetitionRate = repetitionRate;
}
public List<String> getRelationInfo() {
return relationInfo;
}
public void setRelationInfo(List<String> relationInfo) {
this.relationInfo = relationInfo;
}
}
package cn.com.poc.common.segmentation.domain;
import java.util.List;
public class SegmentationResult {
private String chunkContent;
private List<String> scrapChunkContent;
public String getChunkContent() {
return chunkContent;
}
public void setChunkContent(String chunkContent) {
this.chunkContent = chunkContent;
}
public List<String> getScrapChunkContent() {
return scrapChunkContent;
}
public void setScrapChunkContent(List<String> scrapChunkContent) {
this.scrapChunkContent = scrapChunkContent;
}
@Override
public String toString() {
return "SegmentationResult{" +
"chunkContent='" + chunkContent + '\'' +
", scrapChunkContent=" + scrapChunkContent +
'}';
}
}
...@@ -12,7 +12,7 @@ import java.util.List; ...@@ -12,7 +12,7 @@ import java.util.List;
public interface LongTextDialoguesService { public interface LongTextDialoguesService {
void call(String dialoguesId, String fileUrl, String input, Integer[] knowledgeIds, Long userId) throws Exception; void call(String dialoguesId, String fileUrl, String input, Integer[] knowledgeIds, Long userId, Boolean enableSearchEngine, Boolean enableDeepThinking) throws Exception;
LongTextSummaryDto summary(String dialoguesId, Long userId) throws Exception; LongTextSummaryDto summary(String dialoguesId, Long userId) throws Exception;
......
...@@ -2,13 +2,14 @@ package cn.com.poc.long_document.aggregate.impl; ...@@ -2,13 +2,14 @@ package cn.com.poc.long_document.aggregate.impl;
import cn.com.poc.agent_application.entity.BizAgentApplicationDialoguesRecordEntity; import cn.com.poc.agent_application.entity.BizAgentApplicationDialoguesRecordEntity;
import cn.com.poc.agent_application.entity.BizAgentApplicationGcConfigEntity; import cn.com.poc.agent_application.entity.BizAgentApplicationGcConfigEntity;
import cn.com.poc.agent_application.entity.CheckPluginUseEntity;
import cn.com.poc.agent_application.entity.KnowledgeContentResult; import cn.com.poc.agent_application.entity.KnowledgeContentResult;
import cn.com.poc.agent_application.service.BizAgentApplicationDialoguesRecordService; import cn.com.poc.agent_application.service.BizAgentApplicationDialoguesRecordService;
import cn.com.poc.agent_application.service.BizAgentApplicationGcConfigService; import cn.com.poc.agent_application.service.BizAgentApplicationGcConfigService;
import cn.com.poc.agent_application.utils.AgentApplicationTools;
import cn.com.poc.ai_dialogues.entity.BizAiDialoguesEntity; import cn.com.poc.ai_dialogues.entity.BizAiDialoguesEntity;
import cn.com.poc.ai_dialogues.service.BizAiDialoguesService; import cn.com.poc.ai_dialogues.service.BizAiDialoguesService;
import cn.com.poc.common.constant.CommonConstant; import cn.com.poc.common.constant.CommonConstant;
import cn.com.poc.common.constant.FmxParamConfigConstant;
import cn.com.poc.common.model.BizFileUploadRecordModel; import cn.com.poc.common.model.BizFileUploadRecordModel;
import cn.com.poc.common.service.BizFileUploadRecordService; import cn.com.poc.common.service.BizFileUploadRecordService;
import cn.com.poc.common.utils.DocumentLoad; import cn.com.poc.common.utils.DocumentLoad;
...@@ -30,10 +31,17 @@ import cn.com.poc.long_document.service.BizLongTextSummaryCacheService; ...@@ -30,10 +31,17 @@ import cn.com.poc.long_document.service.BizLongTextSummaryCacheService;
import cn.com.poc.thirdparty.resource.demand.ai.aggregate.DemandKnowledgeService; import cn.com.poc.thirdparty.resource.demand.ai.aggregate.DemandKnowledgeService;
import cn.com.poc.thirdparty.resource.demand.ai.constants.KnowledgeSearchTypeEnum; import cn.com.poc.thirdparty.resource.demand.ai.constants.KnowledgeSearchTypeEnum;
import cn.com.poc.thirdparty.resource.demand.ai.constants.LLMRoleEnum; import cn.com.poc.thirdparty.resource.demand.ai.constants.LLMRoleEnum;
import cn.com.poc.thirdparty.resource.demand.ai.entity.dialogue.FunctionCall;
import cn.com.poc.thirdparty.resource.demand.ai.entity.dialogue.Message; import cn.com.poc.thirdparty.resource.demand.ai.entity.dialogue.Message;
import cn.com.poc.thirdparty.resource.demand.ai.entity.dialogue.Tool;
import cn.com.poc.thirdparty.resource.demand.ai.entity.dialogue.ToolFunction;
import cn.com.poc.thirdparty.resource.demand.ai.entity.function.FunctionCallResult;
import cn.com.poc.thirdparty.resource.demand.ai.entity.knowledge.SearchKnowledgeResult; import cn.com.poc.thirdparty.resource.demand.ai.entity.knowledge.SearchKnowledgeResult;
import cn.com.poc.thirdparty.resource.demand.ai.entity.largemodel.LargeModelDemandResult; import cn.com.poc.thirdparty.resource.demand.ai.entity.largemodel.LargeModelDemandResult;
import cn.com.poc.thirdparty.resource.demand.ai.entity.largemodel.LargeModelResponse; import cn.com.poc.thirdparty.resource.demand.ai.entity.largemodel.LargeModelResponse;
import cn.com.poc.thirdparty.resource.demand.ai.function.AbstractFunctionResult;
import cn.com.poc.thirdparty.resource.demand.ai.function.web_seach.WebSearchFunction;
import cn.com.poc.thirdparty.resource.demand.ai.function.web_seach.WebSearchFunctionResult;
import cn.com.poc.thirdparty.service.LLMService; import cn.com.poc.thirdparty.service.LLMService;
import cn.com.yict.framemax.core.exception.BusinessException; import cn.com.yict.framemax.core.exception.BusinessException;
import cn.com.yict.framemax.frame.service.FmxParamConfigService; import cn.com.yict.framemax.frame.service.FmxParamConfigService;
...@@ -97,9 +105,12 @@ public class LongTextDialoguesServiceImpl implements LongTextDialoguesService { ...@@ -97,9 +105,12 @@ public class LongTextDialoguesServiceImpl implements LongTextDialoguesService {
@Resource @Resource
private FmxParamConfigService fmxParamConfigService; private FmxParamConfigService fmxParamConfigService;
@Resource
private WebSearchFunction webSearchFunction;
@Override @Override
public void call(String dialoguesId, String fileUrl, String input, Integer[] knowledgeIds, Long userId) throws Exception { public void call(String dialoguesId, String fileUrl, String input, Integer[] knowledgeIds, Long userId, Boolean enableSearchEngine, Boolean enableDeepThinking) throws Exception {
BizAiDialoguesEntity bizAiDialoguesEntity = new BizAiDialoguesEntity(); BizAiDialoguesEntity bizAiDialoguesEntity = new BizAiDialoguesEntity();
bizAiDialoguesEntity.setDialoguesId(dialoguesId); bizAiDialoguesEntity.setDialoguesId(dialoguesId);
bizAiDialoguesEntity.setMemberId(userId); bizAiDialoguesEntity.setMemberId(userId);
...@@ -165,9 +176,15 @@ public class LongTextDialoguesServiceImpl implements LongTextDialoguesService { ...@@ -165,9 +176,15 @@ public class LongTextDialoguesServiceImpl implements LongTextDialoguesService {
sseUtil.send(JsonUtils.serialize(result)); sseUtil.send(JsonUtils.serialize(result));
} }
String longTextDialoguesModel = fmxParamConfigService.getParam("longtext.dialogues_model"); String longTextDialoguesModel = enableDeepThinking ? fmxParamConfigService.getParam("longtext.dialogues_model_think")
: fmxParamConfigService.getParam("longtext.dialogues_model");
// 插件调用
ToolFunction toolFunction = getToolFunction(dialoguesId, input, enableSearchEngine, sseUtil);
//组装请求参数 //组装请求参数
List<Message> messages = buildMessages(dialoguesId, userId, input, fileUrl, knowledgeResult); List<Message> messages = buildMessages(dialoguesId, userId, input, fileUrl, knowledgeResult, toolFunction);
LargeModelResponse largeModelResponse = new LargeModelResponse(); LargeModelResponse largeModelResponse = new LargeModelResponse();
largeModelResponse.setModel(longTextDialoguesModel); largeModelResponse.setModel(longTextDialoguesModel);
largeModelResponse.setMessages(messages.toArray(new Message[0])); largeModelResponse.setMessages(messages.toArray(new Message[0]));
...@@ -292,7 +309,7 @@ public class LongTextDialoguesServiceImpl implements LongTextDialoguesService { ...@@ -292,7 +309,7 @@ public class LongTextDialoguesServiceImpl implements LongTextDialoguesService {
} }
private List<Message> buildMessages(String dialogsId, Long userId, String input, String fileUrl, List<KnowledgeContentResult> knowledgeContentResults) throws Exception { private List<Message> buildMessages(String dialogsId, Long userId, String input, String fileUrl, List<KnowledgeContentResult> knowledgeContentResults, ToolFunction toolFunction) throws Exception {
// 获取对话提示词 // 获取对话提示词
String promptCode = "DocumentDialoguePrompt"; String promptCode = "DocumentDialoguePrompt";
BizAgentApplicationGcConfigEntity documentDialoguePrompt = bizAgentApplicationGcConfigService.getByConfigCode(promptCode); BizAgentApplicationGcConfigEntity documentDialoguePrompt = bizAgentApplicationGcConfigService.getByConfigCode(promptCode);
...@@ -315,6 +332,10 @@ public class LongTextDialoguesServiceImpl implements LongTextDialoguesService { ...@@ -315,6 +332,10 @@ public class LongTextDialoguesServiceImpl implements LongTextDialoguesService {
prompt = prompt.replace("${knowledgeContent}", StringUtils.EMPTY); prompt = prompt.replace("${knowledgeContent}", StringUtils.EMPTY);
} }
if (toolFunction != null) {
prompt = prompt.replace("${toolFunction}", JsonUtils.serialize(toolFunction));
}
// 配置message // 配置message
List<Message> messages = new ArrayList<>(); List<Message> messages = new ArrayList<>();
Message systemMessage = new Message(); Message systemMessage = new Message();
...@@ -577,4 +598,44 @@ public class LongTextDialoguesServiceImpl implements LongTextDialoguesService { ...@@ -577,4 +598,44 @@ public class LongTextDialoguesServiceImpl implements LongTextDialoguesService {
throw new BusinessException("获取核心观点失败"); throw new BusinessException("获取核心观点失败");
} }
} }
private ToolFunction getToolFunction(String dialoguesId, String input, Boolean enableSearchEngine, SSEUtil sseUtil) throws IOException {
ToolFunction toolFunction = null;
if (enableSearchEngine) {
List<Message> messages = new ArrayList<>();
Message message = new Message();
message.setRole("user");
message.setContent(input);
messages.add(message);
String[] unitIds = new String[1];
unitIds[0] = "web_search";
List<Tool> tools = AgentApplicationTools.buildFunctionConfig(null, "N", dialoguesId, dialoguesId, unitIds, "N");
CheckPluginUseEntity checkPluginUseEntity = AgentApplicationTools.checkPluginUse(messages, tools, null);
FunctionCallResult functionCallResult = checkPluginUseEntity.getFunctionCallResult();
if (functionCallResult != null) {
FunctionCall functionCall = functionCallResult.getFunctionCall();
if (functionCallResult.isNeed() && functionCall != null && "web_search".equals(functionCall.getName())) {
AbstractFunctionResult<List<WebSearchFunctionResult>> functionResult = webSearchFunction.doFunction(functionCall.getArguments(), dialoguesId, null, null);
if (functionResult != null && CollectionUtils.isNotEmpty(functionResult.getFunctionResult())) {
List<WebSearchFunctionResult> webSearchFunctionResults = functionResult.getFunctionResult();
if (CollectionUtils.isNotEmpty(webSearchFunctionResults)) {
toolFunction = new ToolFunction();
toolFunction.setResult(JsonUtils.serialize(webSearchFunctionResults));
toolFunction.setName("web_search");
toolFunction.setArguments(functionCall.getArguments());
toolFunction.setDisplayFormat("json");
LargeModelDemandResult result = new LargeModelDemandResult();
result.setCode("0");
result.setFunction(toolFunction);
result.setDbChainResult(null);
result.setKnowledgeContentResult(null);
sseUtil.send(JsonUtils.serialize(result));
}
}
}
}
}
return toolFunction;
}
} }
package cn.com.poc.long_document.dto; package cn.com.poc.long_document.dto;
import java.util.List;
/** /**
* @author alex.yao * @author alex.yao
* @date 2025/6/3 * @date 2025/6/3
...@@ -28,6 +26,33 @@ public class LongTextDialoguesCallDto { ...@@ -28,6 +26,33 @@ public class LongTextDialoguesCallDto {
*/ */
private Integer[] knowledgeIds; private Integer[] knowledgeIds;
/**
* 是否启用搜索引擎
*/
private boolean enableSearchEngine;
/**
* 是否开启深度思考
*/
private boolean enableDeepThinking;
public boolean getEnableSearchEngine() {
return enableSearchEngine;
}
public void setEnableSearchEngine(boolean enableSearchEngine) {
this.enableSearchEngine = enableSearchEngine;
}
public boolean getEnableDeepThinking() {
return enableDeepThinking;
}
public void setEnableDeepThinking(boolean enableDeepThinking) {
this.enableDeepThinking = enableDeepThinking;
}
public String getDialoguesId() { public String getDialoguesId() {
return dialoguesId; return dialoguesId;
} }
......
...@@ -40,7 +40,7 @@ public class LongTextDialoguesRestImpl implements LongTextDialoguesRest { ...@@ -40,7 +40,7 @@ public class LongTextDialoguesRestImpl implements LongTextDialoguesRest {
dto.getFileUrl(), dto.getFileUrl(),
dto.getInput(), dto.getInput(),
dto.getKnowledgeIds(), dto.getKnowledgeIds(),
userBaseEntity.getUserId()); userBaseEntity.getUserId(), dto.getEnableSearchEngine(), dto.getEnableDeepThinking());
} }
@Override @Override
......
package cn.com.poc.meeting.aggregate;
import cn.com.poc.meeting.entity.AnalysisTaskDetailEntity;
/**
* AI会议助手服务
*/
public interface AiMeetingAssistantService {
/**
* 创建会议解析任务
*
* @param fileUrl 音频文件地址
* @param dialoguesId 会议ID
* @param userId 用户ID
* @return 任务状态
*/
String createTask(String fileUrl, String dialoguesId, Long userId);
/**
* 获取会议解析任务详情
*
* @param dialoguesId
* @param userId
* @return
*/
AnalysisTaskDetailEntity getTaskDetail(String dialoguesId, Long userId);
/**
* 调用AI助手对话
*
* @param dialoguesId
* @param fileUrl
* @param input
* @param knowledgeIds
* @param userId
*/
void call(String dialoguesId, String fileUrl, String input, Integer[] knowledgeIds, Long userId) throws Exception;
}
package cn.com.poc.meeting.aggregate.impl;
import cn.com.poc.agent_application.entity.BizAgentApplicationDialoguesRecordEntity;
import cn.com.poc.agent_application.entity.BizAgentApplicationGcConfigEntity;
import cn.com.poc.agent_application.entity.KnowledgeContentResult;
import cn.com.poc.agent_application.service.BizAgentApplicationDialoguesRecordService;
import cn.com.poc.agent_application.service.BizAgentApplicationGcConfigService;
import cn.com.poc.ai_dialogues.constant.AiDialoguesTypeEnum;
import cn.com.poc.ai_dialogues.entity.BizAiDialoguesEntity;
import cn.com.poc.ai_dialogues.service.BizAiDialoguesService;
import cn.com.poc.common.constant.CommonConstant;
import cn.com.poc.common.service.BizFileUploadRecordService;
import cn.com.poc.common.utils.*;
import cn.com.poc.knowledge.aggregate.KnowledgeService;
import cn.com.poc.knowledge.constant.KnowledgeConstant;
import cn.com.poc.knowledge.entity.BizKnowledgeDocumentEntity;
import cn.com.poc.knowledge.query.KnowledgeDocumentRelationQueryItem;
import cn.com.poc.knowledge.service.BizKnowledgeDocumentService;
import cn.com.poc.long_document.domain.LongtextDialoguesResult;
import cn.com.poc.meeting.aggregate.AiMeetingAssistantService;
import cn.com.poc.meeting.cache.KeyWordCounter;
import cn.com.poc.meeting.constants.MeetingAssistantConstantEnum;
import cn.com.poc.meeting.convert.BizMeetingAssistantAnalysisTaskConvert;
import cn.com.poc.meeting.entity.AnalysisTaskDetailEntity;
import cn.com.poc.meeting.entity.BizMeetingAssistantAnalysisTaskEntity;
import cn.com.poc.meeting.entity.BizMeetingAssistantAsrTaskEntity;
import cn.com.poc.meeting.service.BizMeetingAssistantAnalysisTaskService;
import cn.com.poc.meeting.service.BizMeetingAssistantAsrTaskService;
import cn.com.poc.thirdparty.resource.demand.ai.aggregate.DemandKnowledgeService;
import cn.com.poc.thirdparty.resource.demand.ai.constants.KnowledgeSearchTypeEnum;
import cn.com.poc.thirdparty.resource.demand.ai.constants.LLMRoleEnum;
import cn.com.poc.thirdparty.resource.demand.ai.entity.dialogue.Message;
import cn.com.poc.thirdparty.resource.demand.ai.entity.knowledge.SearchKnowledgeResult;
import cn.com.poc.thirdparty.resource.demand.ai.entity.largemodel.LargeModelDemandResult;
import cn.com.poc.thirdparty.resource.demand.ai.entity.largemodel.LargeModelResponse;
import cn.com.poc.thirdparty.resource.simultanous_interpretation.entity.AsrOfflineDetailResult;
import cn.com.poc.thirdparty.resource.simultanous_interpretation.entity.Translation;
import cn.com.poc.thirdparty.resource.simultanous_interpretation.service.ASRService;
import cn.com.poc.thirdparty.service.LLMService;
import cn.com.poc.writing.dto.AiWritingTitleGenerationDto;
import cn.com.poc.writing.entity.BizAiWritingDialoguesRecordEntity;
import cn.com.poc.writing.service.BizAiWritingDialoguesRecordService;
import cn.com.yict.framemax.core.exception.BusinessException;
import com.alibaba.fastjson.TypeReference;
import org.apache.commons.collections4.CollectionUtils;
import org.apache.commons.lang3.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.BeanUtils;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import java.io.BufferedReader;
import java.io.File;
import java.io.IOException;
import java.util.*;
import java.util.stream.Collectors;
@Service
public class AiMeetingAssistantServiceImpl implements AiMeetingAssistantService {
private final Logger logger = LoggerFactory.getLogger(AiMeetingAssistantServiceImpl.class);
@Resource
private ASRService asrService;
@Resource
private BizAiDialoguesService bizAiDialoguesService;
@Resource
private BizFileUploadRecordService bizFileUploadRecordService;
@Resource
private BizMeetingAssistantAsrTaskService bizMeetingAssistantAsrTaskService;
@Resource
private BizMeetingAssistantAnalysisTaskService bizMeetingAssistantAnalysisTaskService;
@Resource
private BizAgentApplicationDialoguesRecordService bizAgentApplicationDialoguesRecordService;
@Resource
private KnowledgeService knowledgeService;
@Resource
private BizKnowledgeDocumentService bizKnowledgeDocumentService;
@Resource
private DemandKnowledgeService demandKnowledgeService;
@Resource
private LLMService llmService;
@Resource
private BizAgentApplicationGcConfigService bizAgentApplicationGcConfigService;
@Override
public String createTask(String fileUrl, String dialoguesId, Long userId) {
logger.info("创建会议解析任务,fileUrl:{},dialoguesId:{}", fileUrl, dialoguesId);
// 1. 查询dialoguesId 是否存在并且会话标题使用文件名
checkIsExistAndUpdateTitle(fileUrl, dialoguesId, userId);
// 2. 调用语音识别任务 [异步]
asrTask(fileUrl, dialoguesId, userId);
// 3. 保存会议内容分析状态
saveAnalysisTask(dialoguesId, userId);
return MeetingAssistantConstantEnum.GENERATE.getStatus();
}
private void checkIsExistAndUpdateTitle(String fileUrl, String dialoguesId, Long userId) {
// 1. 查询dialoguesId 是否存在
BizAiDialoguesEntity bizAiDialoguesEntity = new BizAiDialoguesEntity();
bizAiDialoguesEntity.setDialoguesId(dialoguesId);
bizAiDialoguesEntity.setMemberId(userId);
bizAiDialoguesEntity.setDialoguesType(AiDialoguesTypeEnum.MEETING_ASSISTANT.getType());
bizAiDialoguesEntity.setIsDeleted(CommonConstant.IsDeleted.N);
List<BizAiDialoguesEntity> aiDialoguesEntities = bizAiDialoguesService.findByExample(bizAiDialoguesEntity, null);
if (CollectionUtils.isEmpty(aiDialoguesEntities)) {
throw new BusinessException("会话不存在,查看会话ID是否正确");
}
//2. 获取文件名,更新标题
String fileName = bizFileUploadRecordService.getFileNameByFileUrl(fileUrl);
if (StringUtils.isBlank(fileName)) {
throw new BusinessException("获取文件失败,重新上传文件");
}
try {
BizAiDialoguesEntity updateAiDialoguesTitleEntity = aiDialoguesEntities.get(0);
updateAiDialoguesTitleEntity.setTitle(fileName);
bizAiDialoguesService.update(updateAiDialoguesTitleEntity);
} catch (Exception e) {
logger.error("------ update ai dialogues title error :", e);
throw new BusinessException("更新对话标题异常");
}
}
private void saveAnalysisTask(String dialoguesId, Long userId) {
// 若存在旧数据则删除旧数据
BizMeetingAssistantAnalysisTaskEntity findMeetingAssistantAnalysisTaskLegacyDataEntity = new BizMeetingAssistantAnalysisTaskEntity();
findMeetingAssistantAnalysisTaskLegacyDataEntity.setDiaguesId(dialoguesId);
findMeetingAssistantAnalysisTaskLegacyDataEntity.setIsDeleted(CommonConstant.IsDeleted.N);
List<BizMeetingAssistantAnalysisTaskEntity> analysisTaskEntities = bizMeetingAssistantAnalysisTaskService.findByExample(findMeetingAssistantAnalysisTaskLegacyDataEntity, null);
if (CollectionUtils.isNotEmpty(analysisTaskEntities)) {
BizMeetingAssistantAnalysisTaskEntity taskEntity = analysisTaskEntities.get(0);
bizMeetingAssistantAnalysisTaskService.deletedById(taskEntity.getId());
logger.info("------ 会议内容分析存在旧任务,已删除旧任务 id:{}---------", taskEntity.getId());
}
try {
BizMeetingAssistantAnalysisTaskEntity saveAnalysisTaskEntity = new BizMeetingAssistantAnalysisTaskEntity();
saveAnalysisTaskEntity.setDiaguesId(dialoguesId);
saveAnalysisTaskEntity.setMemberId(userId);
saveAnalysisTaskEntity.setAnalysisStatus(MeetingAssistantConstantEnum.GENERATE.getStatus());
bizMeetingAssistantAnalysisTaskService.save(saveAnalysisTaskEntity);
} catch (Exception e) {
logger.error("--------- save meeting assistant analysis task error :", e);
throw new BusinessException("保存分析任务失败");
}
}
private void asrTask(String fileUrl, String dialoguesId, Long userId) {
String sessionId = UUIDTool.getUUID();
String status = asrService.speechToText(sessionId, fileUrl);
if (StringUtils.isBlank(status) || !"success".equals(status)) {
throw new BusinessException("语音识别任务创建失败");
}
try {
BizMeetingAssistantAsrTaskEntity bizMeetingAssistantAsrTaskEntity = new BizMeetingAssistantAsrTaskEntity();
bizMeetingAssistantAsrTaskEntity.setGenerateStatus(MeetingAssistantConstantEnum.GENERATE.getStatus());
bizMeetingAssistantAsrTaskEntity.setSessionId(sessionId);
bizMeetingAssistantAsrTaskEntity.setDiaguesId(dialoguesId);
bizMeetingAssistantAsrTaskEntity.setMemberId(userId);
bizMeetingAssistantAsrTaskService.save(bizMeetingAssistantAsrTaskEntity);
} catch (Exception e) {
logger.error("-------- save meeting assistant asr task error :", e);
throw new BusinessException("保存语音识别任务状态异常");
}
}
@Override
public AnalysisTaskDetailEntity getTaskDetail(String dialoguesId, Long userId) {
AnalysisTaskDetailEntity analysisTaskDetailEntity = new AnalysisTaskDetailEntity();
// 1. 查询dialoguesId 是否存在
BizAiDialoguesEntity bizAiDialoguesEntity = new BizAiDialoguesEntity();
bizAiDialoguesEntity.setDialoguesId(dialoguesId);
bizAiDialoguesEntity.setMemberId(userId);
bizAiDialoguesEntity.setDialoguesType(AiDialoguesTypeEnum.MEETING_ASSISTANT.getType());
bizAiDialoguesEntity.setIsDeleted(CommonConstant.IsDeleted.N);
List<BizAiDialoguesEntity> aiDialoguesEntities = bizAiDialoguesService.findByExample(bizAiDialoguesEntity, null);
if (CollectionUtils.isEmpty(aiDialoguesEntities)) {
throw new BusinessException("会话不存在,查看会话ID是否正确");
}
// 内容分析任务
BizMeetingAssistantAnalysisTaskEntity meetingAssistantAnalysisTaskEntity = new BizMeetingAssistantAnalysisTaskEntity();
meetingAssistantAnalysisTaskEntity.setDiaguesId(dialoguesId);
meetingAssistantAnalysisTaskEntity.setMemberId(userId);
meetingAssistantAnalysisTaskEntity.setIsDeleted(CommonConstant.IsDeleted.N);
List<BizMeetingAssistantAnalysisTaskEntity> entities = bizMeetingAssistantAnalysisTaskService.findByExample(meetingAssistantAnalysisTaskEntity, null);
if (CollectionUtils.isEmpty(entities)) {
throw new BusinessException("无法找到对应解析任务,请重新生成");
}
BizMeetingAssistantAnalysisTaskEntity bizMeetingAssistantAnalysisTaskEntity = entities.get(0);
// 语音识别任务
BizMeetingAssistantAsrTaskEntity bizMeetingAssistantAsrTaskEntity = new BizMeetingAssistantAsrTaskEntity();
bizMeetingAssistantAsrTaskEntity.setDiaguesId(dialoguesId);
bizMeetingAssistantAsrTaskEntity.setMemberId(userId);
bizMeetingAssistantAsrTaskEntity.setIsDeleted(CommonConstant.IsDeleted.N);
List<BizMeetingAssistantAsrTaskEntity> asrTaskEntities = bizMeetingAssistantAsrTaskService.findByExample(bizMeetingAssistantAsrTaskEntity, null);
if (CollectionUtils.isEmpty(asrTaskEntities)) {
throw new BusinessException("获取语音识别任务异常");
}
BizMeetingAssistantAsrTaskEntity asrTaskEntity = asrTaskEntities.get(0);
if (MeetingAssistantConstantEnum.FAILED.getStatus().equals(asrTaskEntity.getGenerateStatus())) {
analysisTaskDetailEntity.setAnalysisStatus(MeetingAssistantConstantEnum.FAILED.getStatus());
analysisTaskDetailEntity.setAsrStatus(asrTaskEntity.getGenerateStatus());
logger.error("-------------- 语音识别任务失败 ,sessionId:{}--------------------", asrTaskEntity.getSessionId());
return analysisTaskDetailEntity;
} else if (MeetingAssistantConstantEnum.GENERATE.getStatus().equals(asrTaskEntity.getGenerateStatus())) {
analysisTaskDetailEntity.setAnalysisStatus(MeetingAssistantConstantEnum.GENERATE.getStatus());
analysisTaskDetailEntity.setAsrStatus(asrTaskEntity.getGenerateStatus());
logger.error("-------------- 语音识别任务执行中 ,sessionId:{}--------------------", asrTaskEntity.getSessionId());
return analysisTaskDetailEntity;
}
// 构造返回参数
analysisTaskDetailEntity = BizMeetingAssistantAnalysisTaskConvert.bizEntityToDetailEntity(bizMeetingAssistantAnalysisTaskEntity);
// 获取对话内容
AsrOfflineDetailResult asrServiceDetail = asrService.getDetail(asrTaskEntity.getSessionId());
List<Translation> translations = asrServiceDetail.getTranslation();
analysisTaskDetailEntity.setTranslations(translations);
// 获取说话人列表
Set<Long> spkSets = new HashSet<>();
for (Translation translation : translations) {
spkSets.add(translation.getSpk());
}
analysisTaskDetailEntity.setSpkSets(spkSets);
return analysisTaskDetailEntity;
}
@Override
public void call(String dialoguesId, String fileUrl, String input, Integer[] knowledgeIds, Long userId) throws Exception {
BizAiDialoguesEntity bizAiDialoguesEntity = new BizAiDialoguesEntity();
bizAiDialoguesEntity.setDialoguesId(dialoguesId);
bizAiDialoguesEntity.setMemberId(userId);
bizAiDialoguesEntity.setDialoguesType(AiDialoguesTypeEnum.MEETING_ASSISTANT.getType());
bizAiDialoguesEntity.setIsDeleted(CommonConstant.IsDeleted.N);
List<BizAiDialoguesEntity> bizAiDialoguesEntities = bizAiDialoguesService.findByExample(bizAiDialoguesEntity, null);
if (CollectionUtils.isEmpty(bizAiDialoguesEntities)) {
throw new BusinessException("对话ID不存在");
}
BizAiDialoguesEntity aiDialoguesEntity = bizAiDialoguesEntities.get(0);
// 初始化文件
BizAgentApplicationDialoguesRecordEntity dialoguesRecordEntity = new BizAgentApplicationDialoguesRecordEntity();
dialoguesRecordEntity.setDialogsId(dialoguesId);
dialoguesRecordEntity.setMemberId(userId);
dialoguesRecordEntity.setIsDeleted(CommonConstant.IsDeleted.N);
List<BizAgentApplicationDialoguesRecordEntity> dialoguesRecordEntities = bizAgentApplicationDialoguesRecordService.findByExample(dialoguesRecordEntity, null);
boolean isInit = false;
if (CollectionUtils.isEmpty(dialoguesRecordEntities)) {
if (StringUtils.isNoneBlank(aiDialoguesEntity.getFileUrl()) && StringUtils.isBlank(fileUrl)) {
fileUrl = aiDialoguesEntity.getFileUrl();
}
isInit = true;
}
// 文件是否变更
boolean isFileUrlChanged = (StringUtils.isNotBlank(fileUrl) && !fileUrl.equals(aiDialoguesEntity.getFileUrl()))
|| isInit;
if (StringUtils.isBlank(fileUrl)) {
fileUrl = aiDialoguesEntity.getFileUrl();
}
// 更新文件URL
if (isFileUrlChanged) {
if (!isInit && StringUtils.isNotBlank(fileUrl)) {
aiDialoguesEntity.setFileUrl(fileUrl);
bizAiDialoguesService.update(aiDialoguesEntity);
}
}
//获取会议语音内容
List<Translation> translations = getASRTranslations(dialoguesId, userId);
//记录提问时间
long inputTimestamp = System.currentTimeMillis();
SSEUtil sseUtil = new SSEUtil();
// 知识库
//获取知识库配置
List<Integer> kdIds = knowledgeService.getKdIdsByKnowledgeInfoIds(knowledgeIds);
List<KnowledgeContentResult> knowledgeResult = knowledge(kdIds, input, 5, 0.5, KnowledgeSearchTypeEnum.MIX);
if (CollectionUtils.isNotEmpty(knowledgeResult)) {
LargeModelDemandResult result = new LargeModelDemandResult();
result.setCode("0");
result.setFunction(null);
result.setDbChainResult(null);
result.setKnowledgeContentResult(knowledgeResult);
sseUtil.send(JsonUtils.serialize(result));
}
// 获取大模型配置
String promptCode = "AiMeetingAssistantPrompt";
BizAgentApplicationGcConfigEntity documentDialoguePrompt = bizAgentApplicationGcConfigService.getByConfigCode(promptCode);
if (documentDialoguePrompt == null || StringUtils.isBlank(documentDialoguePrompt.getConfigSystem())) {
logger.error("获取对话提示词失败 , configCode:{}", promptCode);
throw new BusinessException("获取对话提示词失败");
}
//组装请求参数
List<Message> messages = buildMessages(documentDialoguePrompt, dialoguesId, userId, input, fileUrl, knowledgeResult, translations);
LargeModelResponse largeModelResponse = new LargeModelResponse();
largeModelResponse.setModel(documentDialoguePrompt.getLargeModel());
largeModelResponse.setMessages(messages.toArray(new Message[0]));
largeModelResponse.setStream(true);
BufferedReader bufferedReader = llmService.chatChunk(largeModelResponse);
LongtextDialoguesResult longtextDialoguesResult = textOutputStream(sseUtil, bufferedReader);
// 保存用户输入记录
BizAgentApplicationDialoguesRecordEntity inputRecord = new BizAgentApplicationDialoguesRecordEntity();
inputRecord.setMemberId(userId);
inputRecord.setContent(input);
if (isFileUrlChanged) {
inputRecord.setFileUrl(fileUrl);
}
inputRecord.setDialogsId(dialoguesId);
inputRecord.setRole(LLMRoleEnum.USER.getRole());
inputRecord.setTimestamp(inputTimestamp);
// 保存AI回复记录
BizAgentApplicationDialoguesRecordEntity assistantRecord = new BizAgentApplicationDialoguesRecordEntity();
assistantRecord.setMemberId(userId);
assistantRecord.setContent(longtextDialoguesResult.getMessage());
assistantRecord.setReasoningContent(longtextDialoguesResult.getReasoningContent());
assistantRecord.setDialogsId(dialoguesId);
assistantRecord.setRole(LLMRoleEnum.ASSISTANT.getRole());
assistantRecord.setTimestamp(System.currentTimeMillis());
bizAgentApplicationDialoguesRecordService.save(inputRecord);
bizAgentApplicationDialoguesRecordService.save(assistantRecord);
}
private List<Translation> getASRTranslations(String dialoguesId, Long userId) {
// 获取会议分析内容
BizMeetingAssistantAnalysisTaskEntity bizMeetingAssistantAnalysisTaskEntity = new BizMeetingAssistantAnalysisTaskEntity();
bizMeetingAssistantAnalysisTaskEntity.setDiaguesId(dialoguesId);
bizMeetingAssistantAnalysisTaskEntity.setMemberId(userId);
bizMeetingAssistantAnalysisTaskEntity.setIsDeleted(CommonConstant.IsDeleted.N);
List<BizMeetingAssistantAnalysisTaskEntity> bizMeetingAssistantAnalysisTaskEntities = bizMeetingAssistantAnalysisTaskService.findByExample(bizMeetingAssistantAnalysisTaskEntity, null);
if (CollectionUtils.isEmpty(bizMeetingAssistantAnalysisTaskEntities)) {
throw new BusinessException("获取会议分析内容失败");
}
if (bizMeetingAssistantAnalysisTaskEntities.get(0).getAnalysisStatus().equals(MeetingAssistantConstantEnum.GENERATE.getStatus())) {
throw new BusinessException("会议内容正在解析,待解析完成后才可进行对话");
}
if (bizMeetingAssistantAnalysisTaskEntities.get(0).getAnalysisStatus().equals(MeetingAssistantConstantEnum.FAILED.getStatus())) {
throw new BusinessException("会议内容解析失败,无法进行对话");
}
//获取会议语音识别内容
BizMeetingAssistantAsrTaskEntity bizMeetingAssistantAsrTaskEntity = new BizMeetingAssistantAsrTaskEntity();
bizMeetingAssistantAsrTaskEntity.setIsDeleted(CommonConstant.IsDeleted.N);
bizMeetingAssistantAsrTaskEntity.setDiaguesId(dialoguesId);
bizMeetingAssistantAsrTaskEntity.setMemberId(userId);
List<BizMeetingAssistantAsrTaskEntity> asrTaskEntities = bizMeetingAssistantAsrTaskService.findByExample(bizMeetingAssistantAsrTaskEntity, null);
if (CollectionUtils.isEmpty(asrTaskEntities)) {
throw new BusinessException("获取语音识别内容异常");
}
String sessionId = asrTaskEntities.get(0).getSessionId();
AsrOfflineDetailResult asrServiceDetail = asrService.getDetail(sessionId);
return asrServiceDetail.getTranslation();
}
/**
* 文本输出结果
*
* @param sseUtil
* @param bufferedReader
* @throws IOException
*/
private LongtextDialoguesResult textOutputStream(SSEUtil sseUtil, BufferedReader bufferedReader) throws IOException {
String res = "";
StringBuilder output = new StringBuilder();
StringBuilder reasoningContent = new StringBuilder();
try {
while ((res = bufferedReader.readLine()) != null) {
if (StringUtils.isEmpty(res)) {
continue;
}
res = StringUtils.replace(res, "data: ", StringUtils.EMPTY);
LargeModelDemandResult result = JsonUtils.deSerialize(res, LargeModelDemandResult.class);
if (!"0".equals(result.getCode())) {
logger.error("LLM Error,code:{}", result.getCode());
BusinessException ex = new BusinessException("exception/call.failure");
result.setMessage(ex.getMessage());
sseUtil.send(JsonUtils.serialize(result));
sseUtil.send("[DONE]");
sseUtil.complete();
throw ex;
}
result.setFunction(null);
result.setDbChainResult(null);
result.setKnowledgeContentResult(null);
sseUtil.send(JsonUtils.serialize(result));
if (StringUtils.isNotEmpty(result.getMessage())) {
output.append(result.getMessage());
}
if (StringUtils.isNotEmpty(result.getReasoningContent())) {
reasoningContent.append(result.getReasoningContent());
}
}
// 关闭资源
sseUtil.send("[DONE]");
sseUtil.complete();
LongtextDialoguesResult longtextDialoguesResult = new LongtextDialoguesResult();
longtextDialoguesResult.setMessage(output.toString());
longtextDialoguesResult.setReasoningContent(reasoningContent.toString());
return longtextDialoguesResult;
} catch (IOException e) {
logger.error("连接断开,code:{}", e.getMessage());
sseUtil.completeByError("连接断开");
throw new BusinessException("连接断开");
} finally {
bufferedReader.close();
}
}
private List<KnowledgeContentResult> knowledge(List<Integer> kdIds, String input, Integer topK, Double score, KnowledgeSearchTypeEnum searchTypeEnum) {
List<KnowledgeContentResult> knowledgeContentResults = new ArrayList<>();
if (CollectionUtils.isEmpty(kdIds)) {
return knowledgeContentResults;
}
List<String> knowledgeIds = new ArrayList<>();
for (Integer kdId : kdIds) {
BizKnowledgeDocumentEntity knowledgeDocumentEntity = bizKnowledgeDocumentService.get(kdId);
// 筛选训练完成的文档,否则跳过该文档
if (null == knowledgeDocumentEntity && KnowledgeConstant.TrainStatus.COMPLETE.equals(knowledgeDocumentEntity.getTrainStatus())) {
continue;
}
knowledgeIds.add(knowledgeDocumentEntity.getKnowledgeId());
}
SearchKnowledgeResult searchKnowledgeResult = demandKnowledgeService.searchKnowledge(input, knowledgeIds, topK, score, searchTypeEnum);
if (CollectionUtils.isNotEmpty(searchKnowledgeResult.getDocuments())) {
for (int i = 1; i <= searchKnowledgeResult.getDocuments().size(); i++) {
KnowledgeContentResult knowledgeContentResult = new KnowledgeContentResult();
knowledgeContentResult.setContent(searchKnowledgeResult.getDocuments().get(i - 1));
knowledgeContentResult.setKnowledgeId(searchKnowledgeResult.getKnowledgeIds().get(i - 1));
knowledgeContentResult.setScore(searchKnowledgeResult.getScore().get(i - 1));
knowledgeContentResults.add(knowledgeContentResult);
}
// 根据knowledgeId获取知识库名和文档名
knowledgeIds = knowledgeContentResults.stream().map(KnowledgeContentResult::getKnowledgeId).distinct().collect(Collectors.toList());
List<KnowledgeDocumentRelationQueryItem> knowledgeDocumentRelationQueryItems = bizKnowledgeDocumentService.knowledgeDocumentRelationQuery(knowledgeIds, null);
for (KnowledgeContentResult result : knowledgeContentResults) {
String knowledgeId = result.getKnowledgeId();
KnowledgeDocumentRelationQueryItem item = knowledgeDocumentRelationQueryItems.stream().filter(v -> v.getKnowledgeId().equals(knowledgeId)).findFirst().get();
result.setKnowledgeName(item.getKnowledgeName());
result.setKdId(item.getKdId());
result.setDocumentName(item.getDocumentName());
}
}
return knowledgeContentResults;
}
private List<Message> buildMessages(BizAgentApplicationGcConfigEntity documentDialoguePrompt, String dialogsId, Long userId, String input, String fileUrl, List<KnowledgeContentResult> knowledgeContentResults, List<Translation> translations) throws Exception {
// 加载文件
String fileContent = StringUtils.EMPTY;
if (StringUtils.isNoneBlank(fileUrl)) {
File file = DocumentLoad.downloadURLDocument(fileUrl);
fileContent = DocumentLoad.documentToText(file);
}
// 加载对话提示词
String prompt = documentDialoguePrompt.getConfigSystem();
if (CollectionUtils.isNotEmpty(knowledgeContentResults)) {
String knowledgeContent = JsonUtils.serialize(knowledgeContentResults);
prompt = prompt.replace("${knowledgeContent}", knowledgeContent);
} else {
prompt = prompt.replace("${knowledgeContent}", StringUtils.EMPTY);
}
if (CollectionUtils.isNotEmpty(translations)) {
StringBuilder contentsBuilder = new StringBuilder();
for (Translation translation : translations) {
Long spk = translation.getSpk();
String content = translation.getContent();
contentsBuilder.append(spk).append(":").append(content).append(cn.com.poc.common.utils.StringUtils.LF);
}
prompt = prompt.replace("${meeting_content}", contentsBuilder.toString().length() > 25000 ? contentsBuilder.substring(0, 25000) : contentsBuilder);
} else {
prompt = prompt.replace("${meeting_content}", StringUtils.EMPTY);
}
prompt = prompt.replace("${fileContent}", fileContent);
// 配置message
List<Message> messages = new ArrayList<>();
Message systemMessage = new Message();
systemMessage.setContent(prompt);
systemMessage.setRole(LLMRoleEnum.SYSTEM.getRole());
messages.add(systemMessage);
// 对话记录
BizAgentApplicationDialoguesRecordEntity recordEntity = new BizAgentApplicationDialoguesRecordEntity();
recordEntity.setDialogsId(dialogsId);
recordEntity.setIsDeleted(CommonConstant.IsDeleted.N);
recordEntity.setMemberId(userId);
List<BizAgentApplicationDialoguesRecordEntity> recordEntities = bizAgentApplicationDialoguesRecordService.findByExample(recordEntity, null);
if (CollectionUtils.isNotEmpty(recordEntities)) {
for (BizAgentApplicationDialoguesRecordEntity entity : recordEntities) {
Message message = new Message();
message.setContent(entity.getContent());
message.setRole(entity.getRole());
messages.add(message);
}
}
//判断最后是否为User,若是则删除。
if (CollectionUtils.isNotEmpty(messages)) {
if (LLMRoleEnum.USER.getRole().equals(messages.get(messages.size() - 1).getRole())) {
Long recordId = recordEntities.get(recordEntities.size() - 1).getId();
bizAgentApplicationDialoguesRecordService.deletedById(recordId);
messages.remove(messages.size() - 1);
}
}
// 用户输入
Message message = new Message();
message.setContent(input);
message.setRole(LLMRoleEnum.USER.getRole());
messages.add(message);
logger.info("--------- Build Messages dialogsId:{},messages:{}--------------", dialogsId, messages);
return messages;
}
}
package cn.com.poc.meeting.analysis;
import cn.com.poc.agent_application.entity.BizAgentApplicationGcConfigEntity;
import cn.com.poc.common.segmentation.SegmentationBuilder;
import cn.com.poc.common.segmentation.contents.SegmentationEnum;
import cn.com.poc.common.segmentation.domain.SegmentationConfig;
import cn.com.poc.common.segmentation.domain.SegmentationResult;
import cn.com.poc.common.utils.JsonUtils;
import cn.com.poc.common.utils.StringUtils;
import cn.com.poc.thirdparty.resource.demand.ai.entity.dialogue.Message;
import cn.com.poc.thirdparty.resource.demand.ai.entity.largemodel.LargeModelDemandResult;
import cn.com.poc.thirdparty.resource.demand.ai.entity.largemodel.LargeModelResponse;
import cn.com.yict.framemax.core.exception.BusinessException;
import com.fasterxml.jackson.core.type.TypeReference;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
/**
* 会议助手-推荐问生成处理器
*/
public class FeaturedQuestionAnalyzer extends MeetingContentAnalysisAbstract<List<String>> {
private final Logger logger = LoggerFactory.getLogger(FeaturedQuestionAnalyzer.class);
private final String FIRST_GENERATE_GC_CONFIG_CODE = "MEETING_FEATURED_QUESTION_FIRST";
private final String MULTI_GENERATE_GC_CONFIG_CODE = "MEETING_FEATURED_QUESTION_MULTI";
@Override
public List<String> run(String content) {
BizAgentApplicationGcConfigEntity firstGcConfigEntity = bizAgentApplicationGcConfigService.getByConfigCode(FIRST_GENERATE_GC_CONFIG_CODE);
BizAgentApplicationGcConfigEntity multiGcConfigEntity = bizAgentApplicationGcConfigService.getByConfigCode(MULTI_GENERATE_GC_CONFIG_CODE);
if (firstGcConfigEntity == null || multiGcConfigEntity == null) {
throw new BusinessException("无法找到生成推荐问配置");
}
// 配置prompt参数
String firstPrompt = firstGcConfigEntity.getConfigSystem();
String firstModel = firstGcConfigEntity.getLargeModel();
String multiPrompt = multiGcConfigEntity.getConfigSystem();
String multiModel = multiGcConfigEntity.getLargeModel();
// 内容分片
SegmentationConfig segmentationConfig = new SegmentationConfig();
segmentationConfig.setPunctuations(new ArrayList<>());
segmentationConfig.setChunkSize(25000);
segmentationConfig.setScrapSize(25000);
segmentationConfig.setRepetitionRate(5);
segmentationConfig.setRelationInfo(new ArrayList<>());
List<SegmentationResult> segmentationResultList = new SegmentationBuilder()
.segmentationType(SegmentationEnum.NUMBER_Of_WORDS.name())
.content(content)
.build().scrap(segmentationConfig);
// 生成推荐问
String generateContent = "";
try {
for (int i = 0; i < segmentationResultList.size(); i++) {
if (i == 0) {
generateContent = firstGenerate(segmentationResultList.get(i).getChunkContent(), firstPrompt, firstModel);
} else {
generateContent = multiGenerate(segmentationResultList.get(i).getChunkContent(), generateContent, multiPrompt, multiModel);
}
double progress = ((double) (i + 1) / segmentationResultList.size()) * 100D;
logger.info("-------------推荐问生成进度 {} %--------------", progress);
}
} catch (Exception e) {
logger.error("推荐问生成失败", e);
return Collections.emptyList();
}
if (StringUtils.isBlank(generateContent)) {
return Collections.emptyList();
}
// 转换格式 json to list
int start = generateContent.lastIndexOf("[");
int end = generateContent.lastIndexOf("]");
return JsonUtils.deSerialize(generateContent.substring(start, end + 1), new TypeReference<List<String>>() {
}.getType());
}
private String firstGenerate(String content, String prompt, String model) {
LargeModelResponse largeResponse = new LargeModelResponse();
largeResponse.setModel(model);
Message[] messages = new Message[1];
Message message1 = new Message();
message1.setContent(prompt.replace("{content}", content));
message1.setRole("user");
messages[0] = message1;
largeResponse.setMessages(messages);
largeResponse.setStream(false);
largeResponse.setUser("MEETING_FEATURED_QUESTION");
LargeModelDemandResult chatResult = llmService.chat(largeResponse);
return chatResult.getMessage();
}
private String multiGenerate(String content, String summaries, String prompt, String model) {
LargeModelResponse largeResponse = new LargeModelResponse();
largeResponse.setModel(model);
Message[] messages = new Message[1];
Message message1 = new Message();
message1.setContent(prompt.replace("{content}", content).
replace("{summaries}", summaries));
message1.setRole("user");
messages[0] = message1;
largeResponse.setMessages(messages);
largeResponse.setStream(false);
largeResponse.setUser("MEETING_FEATURED_QUESTION");
LargeModelDemandResult chatResult = llmService.chat(largeResponse);
return chatResult.getMessage();
}
}
package cn.com.poc.meeting.analysis;
import cn.com.poc.agent_application.entity.BizAgentApplicationGcConfigEntity;
import cn.com.poc.common.segmentation.SegmentationBuilder;
import cn.com.poc.common.segmentation.contents.SegmentationEnum;
import cn.com.poc.common.segmentation.domain.SegmentationConfig;
import cn.com.poc.common.segmentation.domain.SegmentationResult;
import cn.com.poc.common.utils.JsonUtils;
import cn.com.poc.common.utils.StringUtils;
import cn.com.poc.meeting.cache.KeyWordCounter;
import cn.com.poc.thirdparty.resource.demand.ai.entity.largemodel.LargeModelDemandResult;
import cn.com.poc.thirdparty.resource.demand.ai.entity.largemodel.LargeModelResponse;
import cn.com.poc.thirdparty.resource.demand.ai.entity.dialogue.Message;
import cn.com.yict.framemax.core.exception.BusinessException;
import com.fasterxml.jackson.core.type.TypeReference;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Map;
/**
* 会议助手-提取关键词执行器
*/
public class KeyWordAnalyzer extends MeetingContentAnalysisAbstract<List<String>> {
private final Logger logger = LoggerFactory.getLogger(KeyWordAnalyzer.class);
private final String FIRST_GENERATE_GC_CONFIG_CODE = "MEETING_KEYWORD_FIRST";
private final String MULTI_GENERATE_GC_CONFIG_CODE = "MEETING_KEYWORD_MULTI";
@Override
public List<String> run(String content) {
BizAgentApplicationGcConfigEntity firstGcConfigEntity = bizAgentApplicationGcConfigService.getByConfigCode(FIRST_GENERATE_GC_CONFIG_CODE);
BizAgentApplicationGcConfigEntity multiGcConfigEntity = bizAgentApplicationGcConfigService.getByConfigCode(MULTI_GENERATE_GC_CONFIG_CODE);
if (firstGcConfigEntity == null || multiGcConfigEntity == null) {
throw new BusinessException("无法找到提取关键字配置");
}
// 配置prompt参数
String firstPrompt = firstGcConfigEntity.getConfigSystem();
String firstModel = firstGcConfigEntity.getLargeModel();
String multiPrompt = multiGcConfigEntity.getConfigSystem();
String multiModel = multiGcConfigEntity.getLargeModel();
// 内容分片
SegmentationConfig segmentationConfig = new SegmentationConfig();
segmentationConfig.setPunctuations(new ArrayList<>());
segmentationConfig.setChunkSize(25000);
segmentationConfig.setScrapSize(25000);
segmentationConfig.setRepetitionRate(5);
segmentationConfig.setRelationInfo(new ArrayList<>());
List<SegmentationResult> segmentationResultList = new SegmentationBuilder()
.segmentationType(SegmentationEnum.NUMBER_Of_WORDS.name())
.content(content)
.build().scrap(segmentationConfig);
// 提取关键字
String generateContent = "";
try {
for (int i = 0; i < segmentationResultList.size(); i++) {
if (i == 0) {
generateContent = firstGenerate(segmentationResultList.get(i).getChunkContent(), firstPrompt, firstModel);
} else {
generateContent = multiGenerate(segmentationResultList.get(i).getChunkContent(), generateContent, multiPrompt, multiModel);
}
double progress = ((double) (i + 1) / segmentationResultList.size()) * 100D;
logger.info("-------------关键词提取进度 {} %--------------", progress);
}
} catch (Exception e) {
logger.error("关键词提取失败", e);
return Collections.emptyList();
}
if (StringUtils.isBlank(generateContent)) {
return Collections.emptyList();
}
// 转换格式 json to list
int start = generateContent.lastIndexOf("[");
int end = generateContent.lastIndexOf("]");
List<String> res = JsonUtils.deSerialize(generateContent.substring(start, end + 1), new TypeReference<List<String>>() {
}.getType());
return res;
}
private String firstGenerate(String content, String prompt, String model) {
LargeModelResponse largeResponse = new LargeModelResponse();
largeResponse.setModel(model);
Message[] messages = new Message[1];
Message message1 = new Message();
message1.setContent(prompt.replace("{content}", content));
message1.setRole("user");
messages[0] = message1;
largeResponse.setMessages(messages);
largeResponse.setStream(false);
largeResponse.setUser("MEETING_KEY_WORD");
LargeModelDemandResult chatResult = llmService.chat(largeResponse);
return chatResult.getMessage();
}
private String multiGenerate(String content, String summaries, String prompt, String model) {
LargeModelResponse largeResponse = new LargeModelResponse();
largeResponse.setModel(model);
Message[] messages = new Message[1];
Message message1 = new Message();
message1.setContent(prompt.replace("{content}", content).
replace("{summaries}", summaries));
message1.setRole("user");
messages[0] = message1;
largeResponse.setMessages(messages);
largeResponse.setStream(false);
largeResponse.setUser("MEETING_KEY_WORD");
LargeModelDemandResult chatResult = llmService.chat(largeResponse);
return chatResult.getMessage();
}
}
package cn.com.poc.meeting.analysis;
import cn.com.poc.agent_application.service.BizAgentApplicationGcConfigService;
import cn.com.poc.common.utils.SpringUtils;
import cn.com.poc.thirdparty.service.LLMService;
/**
* 会议内容分析处理器抽象类
*/
public abstract class MeetingContentAnalysisAbstract<T> {
protected LLMService llmService;
protected BizAgentApplicationGcConfigService bizAgentApplicationGcConfigService;
public MeetingContentAnalysisAbstract() {
llmService = SpringUtils.getBean(LLMService.class);
bizAgentApplicationGcConfigService = SpringUtils.getBean(BizAgentApplicationGcConfigService.class);
}
public abstract T run(String content);
}
package cn.com.poc.meeting.analysis;
import cn.com.poc.agent_application.entity.BizAgentApplicationGcConfigEntity;
import cn.com.poc.common.segmentation.SegmentationBuilder;
import cn.com.poc.common.segmentation.contents.SegmentationEnum;
import cn.com.poc.common.segmentation.domain.SegmentationConfig;
import cn.com.poc.common.segmentation.domain.SegmentationResult;
import cn.com.poc.common.utils.StringUtils;
import cn.com.poc.thirdparty.resource.demand.ai.entity.dialogue.Message;
import cn.com.poc.thirdparty.resource.demand.ai.entity.largemodel.LargeModelDemandResult;
import cn.com.poc.thirdparty.resource.demand.ai.entity.largemodel.LargeModelResponse;
import cn.com.yict.framemax.core.exception.BusinessException;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.util.ArrayList;
import java.util.List;
public class SummaryAnalyzer extends MeetingContentAnalysisAbstract<String> {
private final Logger logger = LoggerFactory.getLogger(SummaryAnalyzer.class);
private final String FIRST_GENERATE_GC_CONFIG_CODE = "MEETING_SUMMARY_FIRST";
private final String MULTI_GENERATE_GC_CONFIG_CODE = "MEETING_SUMMARY_MULTI";
@Override
public String run(String content) {
BizAgentApplicationGcConfigEntity firstGcConfigEntity = bizAgentApplicationGcConfigService.getByConfigCode(FIRST_GENERATE_GC_CONFIG_CODE);
BizAgentApplicationGcConfigEntity multiGcConfigEntity = bizAgentApplicationGcConfigService.getByConfigCode(MULTI_GENERATE_GC_CONFIG_CODE);
if (firstGcConfigEntity == null || multiGcConfigEntity == null) {
throw new BusinessException("无法找到生成会议摘要配置");
}
// 配置prompt参数
String firstPrompt = firstGcConfigEntity.getConfigSystem();
String firstModel = firstGcConfigEntity.getLargeModel();
String multiPrompt = multiGcConfigEntity.getConfigSystem();
String multiModel = multiGcConfigEntity.getLargeModel();
// 内容分片
SegmentationConfig segmentationConfig = new SegmentationConfig();
segmentationConfig.setPunctuations(new ArrayList<>());
segmentationConfig.setChunkSize(25000);
segmentationConfig.setScrapSize(25000);
segmentationConfig.setRepetitionRate(5);
segmentationConfig.setRelationInfo(new ArrayList<>());
List<SegmentationResult> segmentationResultList = new SegmentationBuilder()
.segmentationType(SegmentationEnum.NUMBER_Of_WORDS.name())
.content(content)
.build().scrap(segmentationConfig);
// 会议摘要生成
String generateContent = "";
try {
for (int i = 0; i < segmentationResultList.size(); i++) {
if (i == 0) {
generateContent = firstGenerate(segmentationResultList.get(i).getChunkContent(), firstPrompt, firstModel);
} else {
generateContent = multiGenerate(segmentationResultList.get(i).getChunkContent(), generateContent, multiPrompt, multiModel);
}
double progress = ((double) (i + 1) / segmentationResultList.size()) * 100D;
logger.info("-------------会议摘要生成进度 {} %--------------", progress);
}
} catch (Exception e) {
logger.error("会议摘要生成失败", e);
return StringUtils.EMPTY;
}
return generateContent;
}
private String firstGenerate(String content, String prompt, String model) {
LargeModelResponse largeResponse = new LargeModelResponse();
largeResponse.setModel(model);
Message[] messages = new Message[1];
Message message1 = new Message();
message1.setContent(prompt.replace("{content}", content));
message1.setRole("user");
messages[0] = message1;
largeResponse.setMessages(messages);
largeResponse.setStream(false);
largeResponse.setUser("MEETING_SUMMARY");
LargeModelDemandResult chatResult = llmService.chat(largeResponse);
return chatResult.getMessage();
}
private String multiGenerate(String content, String summaries, String prompt, String model) {
LargeModelResponse largeResponse = new LargeModelResponse();
largeResponse.setModel(model);
Message[] messages = new Message[1];
Message message1 = new Message();
message1.setContent(prompt.replace("{content}", content).
replace("{summaries}", summaries));
message1.setRole("user");
messages[0] = message1;
largeResponse.setMessages(messages);
largeResponse.setStream(false);
largeResponse.setUser("MEETING_SUMMARY");
LargeModelDemandResult chatResult = llmService.chat(largeResponse);
return chatResult.getMessage();
}
}
package cn.com.poc.meeting.analysis;
import cn.com.poc.agent_application.entity.BizAgentApplicationGcConfigEntity;
import cn.com.poc.thirdparty.resource.demand.ai.entity.dialogue.Message;
import cn.com.poc.thirdparty.resource.demand.ai.entity.largemodel.LargeModelDemandResult;
import cn.com.poc.thirdparty.resource.demand.ai.entity.largemodel.LargeModelResponse;
import cn.com.yict.framemax.core.exception.BusinessException;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class ThemeAnalyzer extends MeetingContentAnalysisAbstract<String> {
private final Logger logger = LoggerFactory.getLogger(ThemeAnalyzer.class);
private final String GC_CONFIG_CODE = "MEETING_THEME";
@Override
public String run(String content) {
BizAgentApplicationGcConfigEntity firstGcConfigEntity = bizAgentApplicationGcConfigService.getByConfigCode(GC_CONFIG_CODE);
if (firstGcConfigEntity == null) {
throw new BusinessException("无法找到生成会议主题配置");
}
// 配置prompt参数
String prompt = firstGcConfigEntity.getConfigSystem();
String model = firstGcConfigEntity.getLargeModel();
// 会议主题生成
return generateTheme(content, prompt, model);
}
private String generateTheme(String content, String prompt, String model) {
LargeModelResponse largeResponse = new LargeModelResponse();
largeResponse.setModel(model);
Message[] messages = new Message[1];
Message message1 = new Message();
message1.setContent(prompt.replace("{content}", content));
message1.setRole("user");
messages[0] = message1;
largeResponse.setMessages(messages);
largeResponse.setStream(false);
largeResponse.setUser("MEETING_THEME");
LargeModelDemandResult chatResult = llmService.chat(largeResponse);
return chatResult.getMessage();
}
}
package cn.com.poc.meeting.cache;
import cn.com.poc.common.service.RedisService;
import cn.com.poc.common.utils.SpringUtils;
import org.jetbrains.annotations.NotNull;
import java.util.*;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
/**
* 关键词计数器
*/
public class KeyWordCounter {
private final static String REDIS_PREFIX = "MEETING_KEY_WORD_COUNT:";
/**
* 关键词计数统计
*
* @param content 文本
* @param keywords 关键词
* @return 关键词:数量
*/
public static Map<String, Integer> keywordCount(String content, List<String> keywords) {
Map<String, Integer> resMap = new LinkedHashMap<>();
for (String keyword : keywords) {
Pattern compile = Pattern.compile(keyword);
Matcher matcher = compile.matcher(content);
int count = 0;
while (matcher.find()) {
count++;
}
resMap.put(keyword, count);
}
Map<String, Integer> sortedMap = getSortedMap(resMap);
return sortedMap;
}
/**
* 缓存关键词计数
*/
public static void cacheKeyWordCount(String key, Map<String, Integer> map) {
String redisKey = REDIS_PREFIX + key;
RedisService redisService = SpringUtils.getBean(RedisService.class);
Map<String, Object> saveMap = new LinkedHashMap<>();
for (String k : map.keySet()) {
Integer count = map.get(k);
saveMap.put(k, count);
}
redisService.hmset(redisKey, saveMap);
}
/**
* 获取关键词计数缓存
*/
public static Map<String, Integer> getKeywordCountCache(String key) {
Map<String, Integer> resMap = new LinkedHashMap<>();
String redisKey = REDIS_PREFIX + key;
RedisService redisService = SpringUtils.getBean(RedisService.class);
if (!redisService.hasKey(redisKey)) {
return resMap;
}
Map<Object, Object> map = redisService.hmget(redisKey);
for (Object k : map.keySet()) {
Integer count = (Integer) map.get(k);
resMap.put(String.valueOf(k), count);
}
return getSortedMap(resMap);
}
private static @NotNull Map<String, Integer> getSortedMap(Map<String, Integer> resMap) {
// 将Map转换为List
List<Map.Entry<String, Integer>> list = new ArrayList<>(resMap.entrySet());
// 使用自定义Comparator按value排序
list.sort((o1, o2) -> {
return o2.getValue().compareTo(o1.getValue()); // 降序
});
// 将排序后的结果存入LinkedHashMap (可选,如果需要保持插入顺序)
Map<String, Integer> sortedMap = new LinkedHashMap<>();
for (Map.Entry<String, Integer> entry : list) {
sortedMap.put(entry.getKey(), entry.getValue());
}
return sortedMap;
}
}
package cn.com.poc.meeting.constants;
/**
* 会议助手-状态枚举类
*/
public enum MeetingAssistantConstantEnum {
GENERATE("generate"),
COMPLETED("completed"),
FAILED("failed");
private String status;
public String getStatus() {
return status;
}
public void setStatus(String status) {
this.status = status;
}
MeetingAssistantConstantEnum(String status) {
this.status = status;
}
}
package cn.com.poc.meeting.convert;
import cn.com.poc.common.utils.JsonUtils;
import cn.com.poc.meeting.cache.KeyWordCounter;
import cn.com.poc.meeting.constants.MeetingAssistantConstantEnum;
import cn.com.poc.meeting.entity.AnalysisTaskDetailEntity;
import cn.com.poc.meeting.model.BizMeetingAssistantAnalysisTaskModel;
import cn.com.poc.meeting.entity.BizMeetingAssistantAnalysisTaskEntity;
import cn.com.poc.meeting.dto.BizMeetingAssistantAnalysisTaskDto;
import com.alibaba.fastjson.TypeReference;
import org.apache.commons.lang3.StringUtils;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.Set;
public class BizMeetingAssistantAnalysisTaskConvert {
public static BizMeetingAssistantAnalysisTaskEntity modelToEntity(BizMeetingAssistantAnalysisTaskModel model) {
BizMeetingAssistantAnalysisTaskEntity entity = new BizMeetingAssistantAnalysisTaskEntity();
entity.setId(model.getId());
entity.setMemberId(model.getMemberId());
entity.setDiaguesId(model.getDiaguesId());
entity.setAnalysisStatus(model.getAnalysisStatus());
entity.setThemeContent(model.getThemeContent());
entity.setThemeGenerateStatus(model.getThemeGenerateStatus());
entity.setKeyWordContent(model.getKeyWordContent());
entity.setKeyWordGenerateStatus(model.getKeyWordGenerateStatus());
entity.setMeetingSummaryContent(model.getMeetingSummaryContent());
entity.setMeetingSummaryGenerateStatus(model.getMeetingSummaryGenerateStatus());
entity.setFeaturedQuestionsGenerateStatus(model.getFeaturedQuestionsGenerateStatus());
entity.setFeaturedQuestions(model.getFeaturedQuestions());
entity.setIsDeleted(model.getIsDeleted());
entity.setCreator(model.getCreator());
entity.setCreatedTime(model.getCreatedTime());
entity.setModifier(model.getModifier());
entity.setModifiedTime(model.getModifiedTime());
entity.setSysVersion(model.getSysVersion());
return entity;
}
public static BizMeetingAssistantAnalysisTaskModel entityToModel(BizMeetingAssistantAnalysisTaskEntity entity) {
BizMeetingAssistantAnalysisTaskModel model = new BizMeetingAssistantAnalysisTaskModel();
model.setId(entity.getId());
model.setMemberId(entity.getMemberId());
model.setDiaguesId(entity.getDiaguesId());
model.setAnalysisStatus(entity.getAnalysisStatus());
model.setThemeContent(entity.getThemeContent());
model.setThemeGenerateStatus(entity.getThemeGenerateStatus());
model.setKeyWordContent(entity.getKeyWordContent());
model.setKeyWordGenerateStatus(entity.getKeyWordGenerateStatus());
model.setMeetingSummaryContent(entity.getMeetingSummaryContent());
model.setMeetingSummaryGenerateStatus(entity.getMeetingSummaryGenerateStatus());
model.setFeaturedQuestionsGenerateStatus(entity.getFeaturedQuestionsGenerateStatus());
model.setFeaturedQuestions(entity.getFeaturedQuestions());
model.setIsDeleted(entity.getIsDeleted());
model.setCreator(entity.getCreator());
model.setCreatedTime(entity.getCreatedTime());
model.setModifier(entity.getModifier());
model.setModifiedTime(entity.getModifiedTime());
model.setSysVersion(entity.getSysVersion());
return model;
}
public static BizMeetingAssistantAnalysisTaskDto entityToDto(BizMeetingAssistantAnalysisTaskEntity entity) {
BizMeetingAssistantAnalysisTaskDto dto = new BizMeetingAssistantAnalysisTaskDto();
dto.setId(entity.getId());
dto.setMemberId(entity.getMemberId());
dto.setDiaguesId(entity.getDiaguesId());
dto.setAnalysisStatus(entity.getAnalysisStatus());
dto.setThemeContent(entity.getThemeContent());
dto.setThemeGenerateStatus(entity.getThemeGenerateStatus());
dto.setKeyWordContent(entity.getKeyWordContent());
dto.setKeyWordGenerateStatus(entity.getKeyWordGenerateStatus());
dto.setMeetingSummaryContent(entity.getMeetingSummaryContent());
dto.setMeetingSummaryGenerateStatus(entity.getMeetingSummaryGenerateStatus());
dto.setFeaturedQuestionsGenerateStatus(entity.getFeaturedQuestionsGenerateStatus());
dto.setFeaturedQuestions(entity.getFeaturedQuestions());
dto.setIsDeleted(entity.getIsDeleted());
dto.setCreator(entity.getCreator());
dto.setCreatedTime(entity.getCreatedTime());
dto.setModifier(entity.getModifier());
dto.setModifiedTime(entity.getModifiedTime());
dto.setSysVersion(entity.getSysVersion());
return dto;
}
public static BizMeetingAssistantAnalysisTaskEntity dtoToEntity(BizMeetingAssistantAnalysisTaskDto dto) {
BizMeetingAssistantAnalysisTaskEntity entity = new BizMeetingAssistantAnalysisTaskEntity();
entity.setId(dto.getId());
entity.setMemberId(dto.getMemberId());
entity.setDiaguesId(dto.getDiaguesId());
entity.setAnalysisStatus(dto.getAnalysisStatus());
entity.setThemeContent(dto.getThemeContent());
entity.setThemeGenerateStatus(dto.getThemeGenerateStatus());
entity.setKeyWordContent(dto.getKeyWordContent());
entity.setKeyWordGenerateStatus(dto.getKeyWordGenerateStatus());
entity.setMeetingSummaryContent(dto.getMeetingSummaryContent());
entity.setMeetingSummaryGenerateStatus(dto.getMeetingSummaryGenerateStatus());
entity.setFeaturedQuestionsGenerateStatus(dto.getFeaturedQuestionsGenerateStatus());
entity.setFeaturedQuestions(dto.getFeaturedQuestions());
entity.setIsDeleted(dto.getIsDeleted());
entity.setCreator(dto.getCreator());
entity.setCreatedTime(dto.getCreatedTime());
entity.setModifier(dto.getModifier());
entity.setModifiedTime(dto.getModifiedTime());
entity.setSysVersion(dto.getSysVersion());
return entity;
}
public static AnalysisTaskDetailEntity bizEntityToDetailEntity(BizMeetingAssistantAnalysisTaskEntity entity) {
AnalysisTaskDetailEntity analysisTaskDetailEntity = new AnalysisTaskDetailEntity();
analysisTaskDetailEntity.setAnalysisStatus(entity.getAnalysisStatus());
analysisTaskDetailEntity.setThemeContent(entity.getThemeContent());
analysisTaskDetailEntity.setThemeGenerateStatus(entity.getThemeGenerateStatus());
analysisTaskDetailEntity.setKeyWordGenerateStatus(entity.getKeyWordGenerateStatus());
//获取关键字计数
if (MeetingAssistantConstantEnum.COMPLETED.getStatus().equals(entity.getKeyWordGenerateStatus())) {
Map<String, Integer> keywordCountMap = KeyWordCounter.getKeywordCountCache(entity.getDiaguesId());
analysisTaskDetailEntity.setKeyWordCount(keywordCountMap);
if (StringUtils.isNotBlank(entity.getKeyWordContent())) {
List<String> keyWords = new ArrayList<>(keywordCountMap.keySet());
analysisTaskDetailEntity.setKeyWordContent(keyWords);
}
}
analysisTaskDetailEntity.setMeetingSummaryContent(entity.getMeetingSummaryContent());
analysisTaskDetailEntity.setMeetingSummaryGenerateStatus(entity.getMeetingSummaryGenerateStatus());
analysisTaskDetailEntity.setFeaturedQuestionsGenerateStatus(entity.getFeaturedQuestionsGenerateStatus());
if (StringUtils.isNotBlank(entity.getFeaturedQuestions())) {
List<String> featuredQuestions = JsonUtils.deSerialize(entity.getFeaturedQuestions(), new TypeReference<List<String>>() {
}.getType());
analysisTaskDetailEntity.setFeaturedQuestions(featuredQuestions);
}
return analysisTaskDetailEntity;
}
}
\ No newline at end of file
package cn.com.poc.meeting.convert;
import cn.com.poc.meeting.dto.BizMeetingAssistantAsrTaskDto;
import cn.com.poc.meeting.entity.BizMeetingAssistantAsrTaskEntity;
import cn.com.poc.meeting.model.BizMeetingAssistantAsrTaskModel;
public class BizMeetingAssistantAsrTaskConvert {
public static BizMeetingAssistantAsrTaskEntity modelToEntity(BizMeetingAssistantAsrTaskModel model){
BizMeetingAssistantAsrTaskEntity entity = new BizMeetingAssistantAsrTaskEntity();
entity.setId(model.getId());
entity.setMemberId(model.getMemberId());
entity.setDiaguesId(model.getDiaguesId());
entity.setSessionId(model.getSessionId());
entity.setGenerateStatus(model.getGenerateStatus());
entity.setMessage(model.getMessage());
entity.setIsDeleted(model.getIsDeleted());
entity.setCreator(model.getCreator());
entity.setCreatedTime(model.getCreatedTime());
entity.setModifier(model.getModifier());
entity.setModifiedTime(model.getModifiedTime());
entity.setSysVersion(model.getSysVersion());
return entity;
}
public static BizMeetingAssistantAsrTaskModel entityToModel(BizMeetingAssistantAsrTaskEntity entity){
BizMeetingAssistantAsrTaskModel model = new BizMeetingAssistantAsrTaskModel();
model.setId(entity.getId());
model.setMemberId(entity.getMemberId());
model.setDiaguesId(entity.getDiaguesId());
model.setSessionId(entity.getSessionId());
model.setGenerateStatus(entity.getGenerateStatus());
model.setMessage(entity.getMessage());
model.setIsDeleted(entity.getIsDeleted());
model.setCreator(entity.getCreator());
model.setCreatedTime(entity.getCreatedTime());
model.setModifier(entity.getModifier());
model.setModifiedTime(entity.getModifiedTime());
model.setSysVersion(entity.getSysVersion());
return model;
}
public static BizMeetingAssistantAsrTaskDto entityToDto(BizMeetingAssistantAsrTaskEntity entity){
BizMeetingAssistantAsrTaskDto dto = new BizMeetingAssistantAsrTaskDto();
dto.setId(entity.getId());
dto.setMemberId(entity.getMemberId());
dto.setDiaguesId(entity.getDiaguesId());
dto.setSessionId(entity.getSessionId());
dto.setGenerateStatus(entity.getGenerateStatus());
dto.setMessage(entity.getMessage());
dto.setIsDeleted(entity.getIsDeleted());
dto.setCreator(entity.getCreator());
dto.setCreatedTime(entity.getCreatedTime());
dto.setModifier(entity.getModifier());
dto.setModifiedTime(entity.getModifiedTime());
dto.setSysVersion(entity.getSysVersion());
return dto;
}
public static BizMeetingAssistantAsrTaskEntity dtoToEntity(BizMeetingAssistantAsrTaskDto dto){
BizMeetingAssistantAsrTaskEntity entity = new BizMeetingAssistantAsrTaskEntity();
entity.setId(dto.getId());
entity.setMemberId(dto.getMemberId());
entity.setDiaguesId(dto.getDiaguesId());
entity.setSessionId(dto.getSessionId());
entity.setGenerateStatus(dto.getGenerateStatus());
entity.setMessage(dto.getMessage());
entity.setIsDeleted(dto.getIsDeleted());
entity.setCreator(dto.getCreator());
entity.setCreatedTime(dto.getCreatedTime());
entity.setModifier(dto.getModifier());
entity.setModifiedTime(dto.getModifiedTime());
entity.setSysVersion(dto.getSysVersion());
return entity;
}
}
\ No newline at end of file
package cn.com.poc.meeting.dto;
public class AiMeetingAssistantDto {
/**
* 对话id
*/
private String dialoguesId;
/**
* 文件地址
*/
private String fileUrl;
/**
* 输入内容
*/
private String input;
/**
* 知识库id
*/
private Integer[] knowledgeIds;
public Integer[] getKnowledgeIds() {
return knowledgeIds;
}
public void setKnowledgeIds(Integer[] knowledgeIds) {
this.knowledgeIds = knowledgeIds;
}
public String getDialoguesId() {
return dialoguesId;
}
public void setDialoguesId(String dialoguesId) {
this.dialoguesId = dialoguesId;
}
public String getFileUrl() {
return fileUrl;
}
public void setFileUrl(String fileUrl) {
this.fileUrl = fileUrl;
}
public String getInput() {
return input;
}
public void setInput(String input) {
this.input = input;
}
}
package cn.com.poc.meeting.dto;
import cn.com.poc.thirdparty.resource.simultanous_interpretation.entity.Translation;
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import com.fasterxml.jackson.annotation.JsonInclude;
import java.util.List;
import java.util.Map;
import java.util.Set;
@JsonInclude(JsonInclude.Include.NON_NULL)
@JsonIgnoreProperties(ignoreUnknown = true)
public class AnalysisTaskDetailDto {
/**
* analysis_status
* 内容分析总状态 generate-生成中 completed-完成 failed-失败
*/
private java.lang.String analysisStatus;
public java.lang.String getAnalysisStatus() {
return this.analysisStatus;
}
public void setAnalysisStatus(java.lang.String analysisStatus) {
this.analysisStatus = analysisStatus;
}
/**
* theme_content
* 会议主题
*/
private java.lang.String themeContent;
public java.lang.String getThemeContent() {
return this.themeContent;
}
public void setThemeContent(java.lang.String themeContent) {
this.themeContent = themeContent;
}
/**
* theme_generate_status
* 会议主题生成状态
*/
private java.lang.String themeGenerateStatus;
public java.lang.String getThemeGenerateStatus() {
return this.themeGenerateStatus;
}
public void setThemeGenerateStatus(java.lang.String themeGenerateStatus) {
this.themeGenerateStatus = themeGenerateStatus;
}
/**
* key_word_content
* 关键词
*/
private List<String> keyWordContent;
public List<String> getKeyWordContent() {
return keyWordContent;
}
public void setKeyWordContent(List<String> keyWordContent) {
this.keyWordContent = keyWordContent;
}
/**
* key_word_generate_status
* 关键词生成状态
*/
private java.lang.String keyWordGenerateStatus;
public java.lang.String getKeyWordGenerateStatus() {
return this.keyWordGenerateStatus;
}
public void setKeyWordGenerateStatus(java.lang.String keyWordGenerateStatus) {
this.keyWordGenerateStatus = keyWordGenerateStatus;
}
/**
* 关键词计数
*/
private Map<String, Integer> keyWordCount;
public Map<String, Integer> getKeyWordCount() {
return keyWordCount;
}
public void setKeyWordCount(Map<String, Integer> keyWordCount) {
this.keyWordCount = keyWordCount;
}
/**
* meeting_summary_content
* 会议摘要
*/
private java.lang.String meetingSummaryContent;
public java.lang.String getMeetingSummaryContent() {
return this.meetingSummaryContent;
}
public void setMeetingSummaryContent(java.lang.String meetingSummaryContent) {
this.meetingSummaryContent = meetingSummaryContent;
}
/**
* meeting_summary_generate_status
* 会议摘要生成状态
*/
private java.lang.String meetingSummaryGenerateStatus;
public java.lang.String getMeetingSummaryGenerateStatus() {
return this.meetingSummaryGenerateStatus;
}
public void setMeetingSummaryGenerateStatus(java.lang.String meetingSummaryGenerateStatus) {
this.meetingSummaryGenerateStatus = meetingSummaryGenerateStatus;
}
/**
* featured_questions_generate_status
* 推荐问生成状态
*/
private java.lang.String featuredQuestionsGenerateStatus;
public java.lang.String getFeaturedQuestionsGenerateStatus() {
return this.featuredQuestionsGenerateStatus;
}
public void setFeaturedQuestionsGenerateStatus(java.lang.String featuredQuestionsGenerateStatus) {
this.featuredQuestionsGenerateStatus = featuredQuestionsGenerateStatus;
}
/**
* featured_questions
* 推荐问
*/
private List<String> featuredQuestions;
public List<String> getFeaturedQuestions() {
return featuredQuestions;
}
public void setFeaturedQuestions(List<String> featuredQuestions) {
this.featuredQuestions = featuredQuestions;
}
/**
* spk_sets
* 说话人列表
*/
private Set<Long> spkSets;
public Set<Long> getSpkSets() {
return spkSets;
}
public void setSpkSets(Set<Long> spkSets) {
this.spkSets = spkSets;
}
/**
* 语音识别内容
* translation
*/
private List<Translation> translations;
public List<Translation> getTranslations() {
return translations;
}
public void setTranslations(List<Translation> translations) {
this.translations = translations;
}
}
package cn.com.poc.meeting.dto;
public class BizMeetingAssistantAnalysisTaskDto {
private static final long serialVersionUID = 1L;
/** id
*
*/
private java.lang.Long id;
public java.lang.Long getId(){
return this.id;
}
public void setId(java.lang.Long id){
this.id = id;
}
/** member_id
*用户id
*/
private java.lang.Long memberId;
public java.lang.Long getMemberId(){
return this.memberId;
}
public void setMemberId(java.lang.Long memberId){
this.memberId = memberId;
}
/** diagues_id
*会话id
*/
private java.lang.String diaguesId;
public java.lang.String getDiaguesId(){
return this.diaguesId;
}
public void setDiaguesId(java.lang.String diaguesId){
this.diaguesId = diaguesId;
}
/** analysis_status
*内容分析总状态 generate-生成中 completed-完成 failed-失败
*/
private java.lang.String analysisStatus;
public java.lang.String getAnalysisStatus(){
return this.analysisStatus;
}
public void setAnalysisStatus(java.lang.String analysisStatus){
this.analysisStatus = analysisStatus;
}
/** theme_content
*会议主题
*/
private java.lang.String themeContent;
public java.lang.String getThemeContent(){
return this.themeContent;
}
public void setThemeContent(java.lang.String themeContent){
this.themeContent = themeContent;
}
/** theme_generate_status
*会议主题生成状态
*/
private java.lang.String themeGenerateStatus;
public java.lang.String getThemeGenerateStatus(){
return this.themeGenerateStatus;
}
public void setThemeGenerateStatus(java.lang.String themeGenerateStatus){
this.themeGenerateStatus = themeGenerateStatus;
}
/** key_word_content
*关键词
*/
private java.lang.String keyWordContent;
public java.lang.String getKeyWordContent(){
return this.keyWordContent;
}
public void setKeyWordContent(java.lang.String keyWordContent){
this.keyWordContent = keyWordContent;
}
/** key_word_generate_status
*关键词生成状态
*/
private java.lang.String keyWordGenerateStatus;
public java.lang.String getKeyWordGenerateStatus(){
return this.keyWordGenerateStatus;
}
public void setKeyWordGenerateStatus(java.lang.String keyWordGenerateStatus){
this.keyWordGenerateStatus = keyWordGenerateStatus;
}
/** meeting_summary_content
*会议摘要
*/
private java.lang.String meetingSummaryContent;
public java.lang.String getMeetingSummaryContent(){
return this.meetingSummaryContent;
}
public void setMeetingSummaryContent(java.lang.String meetingSummaryContent){
this.meetingSummaryContent = meetingSummaryContent;
}
/** meeting_summary_generate_status
*会议摘要生成状态
*/
private java.lang.String meetingSummaryGenerateStatus;
public java.lang.String getMeetingSummaryGenerateStatus(){
return this.meetingSummaryGenerateStatus;
}
public void setMeetingSummaryGenerateStatus(java.lang.String meetingSummaryGenerateStatus){
this.meetingSummaryGenerateStatus = meetingSummaryGenerateStatus;
}
/** featured_questions_generate_status
*推荐问生成状态
*/
private java.lang.String featuredQuestionsGenerateStatus;
public java.lang.String getFeaturedQuestionsGenerateStatus(){
return this.featuredQuestionsGenerateStatus;
}
public void setFeaturedQuestionsGenerateStatus(java.lang.String featuredQuestionsGenerateStatus){
this.featuredQuestionsGenerateStatus = featuredQuestionsGenerateStatus;
}
/** featured_questions
*推荐问
*/
private java.lang.String featuredQuestions;
public java.lang.String getFeaturedQuestions(){
return this.featuredQuestions;
}
public void setFeaturedQuestions(java.lang.String featuredQuestions){
this.featuredQuestions = featuredQuestions;
}
/** is_deleted
*是否删除 Y 是 N 否
*/
private java.lang.String isDeleted;
public java.lang.String getIsDeleted(){
return this.isDeleted;
}
public void setIsDeleted(java.lang.String isDeleted){
this.isDeleted = isDeleted;
}
/** CREATOR
*创建人
*/
private java.lang.String creator;
public java.lang.String getCreator(){
return this.creator;
}
public void setCreator(java.lang.String creator){
this.creator = creator;
}
/** CREATED_TIME
*创建时间
*/
private java.util.Date createdTime;
public java.util.Date getCreatedTime(){
return this.createdTime;
}
public void setCreatedTime(java.util.Date createdTime){
this.createdTime = createdTime;
}
/** MODIFIER
*修改人
*/
private java.lang.String modifier;
public java.lang.String getModifier(){
return this.modifier;
}
public void setModifier(java.lang.String modifier){
this.modifier = modifier;
}
/** MODIFIED_TIME
*修改时间
*/
private java.util.Date modifiedTime;
public java.util.Date getModifiedTime(){
return this.modifiedTime;
}
public void setModifiedTime(java.util.Date modifiedTime){
this.modifiedTime = modifiedTime;
}
/** SYS_VERSION
*乐观锁,版本号
*/
private java.lang.Integer sysVersion;
public java.lang.Integer getSysVersion(){
return this.sysVersion;
}
public void setSysVersion(java.lang.Integer sysVersion){
this.sysVersion = sysVersion;
}
}
\ No newline at end of file
package cn.com.poc.meeting.dto;
public class BizMeetingAssistantAsrTaskDto {
private static final long serialVersionUID = 1L;
/** id
*主键ID
*/
private java.lang.Long id;
public java.lang.Long getId(){
return this.id;
}
public void setId(java.lang.Long id){
this.id = id;
}
/** member_id
*用户id
*/
private java.lang.Long memberId;
public java.lang.Long getMemberId(){
return this.memberId;
}
public void setMemberId(java.lang.Long memberId){
this.memberId = memberId;
}
/** diagues_id
*会话id
*/
private java.lang.String diaguesId;
public java.lang.String getDiaguesId(){
return this.diaguesId;
}
public void setDiaguesId(java.lang.String diaguesId){
this.diaguesId = diaguesId;
}
/** session_id
*语音识别任务ID
*/
private java.lang.String sessionId;
public java.lang.String getSessionId(){
return this.sessionId;
}
public void setSessionId(java.lang.String sessionId){
this.sessionId = sessionId;
}
/** generate_status
*任务状态 generate-生成中 completed-完成 failed-异常
*/
private java.lang.String generateStatus;
public java.lang.String getGenerateStatus(){
return this.generateStatus;
}
public void setGenerateStatus(java.lang.String generateStatus){
this.generateStatus = generateStatus;
}
/** message
*异常信息
*/
private java.lang.String message;
public java.lang.String getMessage(){
return this.message;
}
public void setMessage(java.lang.String message){
this.message = message;
}
/** is_deleted
*是否删除 Y 是 N 否
*/
private java.lang.String isDeleted;
public java.lang.String getIsDeleted(){
return this.isDeleted;
}
public void setIsDeleted(java.lang.String isDeleted){
this.isDeleted = isDeleted;
}
/** CREATOR
*创建人
*/
private java.lang.String creator;
public java.lang.String getCreator(){
return this.creator;
}
public void setCreator(java.lang.String creator){
this.creator = creator;
}
/** CREATED_TIME
*创建时间
*/
private java.util.Date createdTime;
public java.util.Date getCreatedTime(){
return this.createdTime;
}
public void setCreatedTime(java.util.Date createdTime){
this.createdTime = createdTime;
}
/** MODIFIER
*修改人
*/
private java.lang.String modifier;
public java.lang.String getModifier(){
return this.modifier;
}
public void setModifier(java.lang.String modifier){
this.modifier = modifier;
}
/** MODIFIED_TIME
*修改时间
*/
private java.util.Date modifiedTime;
public java.util.Date getModifiedTime(){
return this.modifiedTime;
}
public void setModifiedTime(java.util.Date modifiedTime){
this.modifiedTime = modifiedTime;
}
/** SYS_VERSION
*乐观锁,版本号
*/
private java.lang.Integer sysVersion;
public java.lang.Integer getSysVersion(){
return this.sysVersion;
}
public void setSysVersion(java.lang.Integer sysVersion){
this.sysVersion = sysVersion;
}
}
\ No newline at end of file
package cn.com.poc.meeting.entity;
import cn.com.poc.thirdparty.resource.simultanous_interpretation.entity.Translation;
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import com.fasterxml.jackson.annotation.JsonInclude;
import java.util.List;
import java.util.Map;
import java.util.Set;
public class AnalysisTaskDetailEntity {
/**
* analysis_status
* 内容分析总状态 generate-生成中 completed-完成 failed-失败
*/
private String analysisStatus;
public String getAnalysisStatus() {
return this.analysisStatus;
}
public void setAnalysisStatus(String analysisStatus) {
this.analysisStatus = analysisStatus;
}
/**
* theme_content
* 会议主题
*/
private String themeContent;
public String getThemeContent() {
return this.themeContent;
}
public void setThemeContent(String themeContent) {
this.themeContent = themeContent;
}
/**
* theme_generate_status
* 会议主题生成状态
*/
private String themeGenerateStatus;
public String getThemeGenerateStatus() {
return this.themeGenerateStatus;
}
public void setThemeGenerateStatus(String themeGenerateStatus) {
this.themeGenerateStatus = themeGenerateStatus;
}
/**
* key_word_content
* 关键词
*/
private List<String> keyWordContent;
public List<String> getKeyWordContent() {
return keyWordContent;
}
public void setKeyWordContent(List<String> keyWordContent) {
this.keyWordContent = keyWordContent;
}
/**
* key_word_generate_status
* 关键词生成状态
*/
private String keyWordGenerateStatus;
public String getKeyWordGenerateStatus() {
return this.keyWordGenerateStatus;
}
public void setKeyWordGenerateStatus(String keyWordGenerateStatus) {
this.keyWordGenerateStatus = keyWordGenerateStatus;
}
/**
* 关键词计数
*/
private Map<String, Integer> keyWordCount;
public Map<String, Integer> getKeyWordCount() {
return keyWordCount;
}
public void setKeyWordCount(Map<String, Integer> keyWordCount) {
this.keyWordCount = keyWordCount;
}
/**
* meeting_summary_content
* 会议摘要
*/
private String meetingSummaryContent;
public String getMeetingSummaryContent() {
return this.meetingSummaryContent;
}
public void setMeetingSummaryContent(String meetingSummaryContent) {
this.meetingSummaryContent = meetingSummaryContent;
}
/**
* meeting_summary_generate_status
* 会议摘要生成状态
*/
private String meetingSummaryGenerateStatus;
public String getMeetingSummaryGenerateStatus() {
return this.meetingSummaryGenerateStatus;
}
public void setMeetingSummaryGenerateStatus(String meetingSummaryGenerateStatus) {
this.meetingSummaryGenerateStatus = meetingSummaryGenerateStatus;
}
/**
* featured_questions_generate_status
* 推荐问生成状态
*/
private String featuredQuestionsGenerateStatus;
public String getFeaturedQuestionsGenerateStatus() {
return this.featuredQuestionsGenerateStatus;
}
public void setFeaturedQuestionsGenerateStatus(String featuredQuestionsGenerateStatus) {
this.featuredQuestionsGenerateStatus = featuredQuestionsGenerateStatus;
}
/**
* featured_questions
* 推荐问
*/
private List<String> featuredQuestions;
public List<String> getFeaturedQuestions() {
return featuredQuestions;
}
public void setFeaturedQuestions(List<String> featuredQuestions) {
this.featuredQuestions = featuredQuestions;
}
/**
* asr_status
* 语音识别任务状态
*/
private String asrStatus;
public String getAsrStatus() {
return asrStatus;
}
public void setAsrStatus(String asrStatus) {
this.asrStatus = asrStatus;
}
/**
* spk_sets
* 说话人列表
*/
private Set<Long> spkSets;
public Set<Long> getSpkSets() {
return spkSets;
}
public void setSpkSets(Set<Long> spkSets) {
this.spkSets = spkSets;
}
/**
* 语音识别内容
* translation
*/
private List<Translation> translations;
public List<Translation> getTranslations() {
return translations;
}
public void setTranslations(List<Translation> translations) {
this.translations = translations;
}
}
package cn.com.poc.meeting.entity;
public class BizMeetingAssistantAnalysisTaskEntity {
private static final long serialVersionUID = 1L;
/** id
*
*/
private java.lang.Long id;
public java.lang.Long getId(){
return this.id;
}
public void setId(java.lang.Long id){
this.id = id;
}
/** member_id
*用户id
*/
private java.lang.Long memberId;
public java.lang.Long getMemberId(){
return this.memberId;
}
public void setMemberId(java.lang.Long memberId){
this.memberId = memberId;
}
/** diagues_id
*会话id
*/
private java.lang.String diaguesId;
public java.lang.String getDiaguesId(){
return this.diaguesId;
}
public void setDiaguesId(java.lang.String diaguesId){
this.diaguesId = diaguesId;
}
/** analysis_status
*内容分析总状态 generate-生成中 completed-完成 failed-失败
*/
private java.lang.String analysisStatus;
public java.lang.String getAnalysisStatus(){
return this.analysisStatus;
}
public void setAnalysisStatus(java.lang.String analysisStatus){
this.analysisStatus = analysisStatus;
}
/** theme_content
*会议主题
*/
private java.lang.String themeContent;
public java.lang.String getThemeContent(){
return this.themeContent;
}
public void setThemeContent(java.lang.String themeContent){
this.themeContent = themeContent;
}
/** theme_generate_status
*会议主题生成状态
*/
private java.lang.String themeGenerateStatus;
public java.lang.String getThemeGenerateStatus(){
return this.themeGenerateStatus;
}
public void setThemeGenerateStatus(java.lang.String themeGenerateStatus){
this.themeGenerateStatus = themeGenerateStatus;
}
/** key_word_content
*关键词
*/
private java.lang.String keyWordContent;
public java.lang.String getKeyWordContent(){
return this.keyWordContent;
}
public void setKeyWordContent(java.lang.String keyWordContent){
this.keyWordContent = keyWordContent;
}
/** key_word_generate_status
*关键词生成状态
*/
private java.lang.String keyWordGenerateStatus;
public java.lang.String getKeyWordGenerateStatus(){
return this.keyWordGenerateStatus;
}
public void setKeyWordGenerateStatus(java.lang.String keyWordGenerateStatus){
this.keyWordGenerateStatus = keyWordGenerateStatus;
}
/** meeting_summary_content
*会议摘要
*/
private java.lang.String meetingSummaryContent;
public java.lang.String getMeetingSummaryContent(){
return this.meetingSummaryContent;
}
public void setMeetingSummaryContent(java.lang.String meetingSummaryContent){
this.meetingSummaryContent = meetingSummaryContent;
}
/** meeting_summary_generate_status
*会议摘要生成状态
*/
private java.lang.String meetingSummaryGenerateStatus;
public java.lang.String getMeetingSummaryGenerateStatus(){
return this.meetingSummaryGenerateStatus;
}
public void setMeetingSummaryGenerateStatus(java.lang.String meetingSummaryGenerateStatus){
this.meetingSummaryGenerateStatus = meetingSummaryGenerateStatus;
}
/** featured_questions_generate_status
*推荐问生成状态
*/
private java.lang.String featuredQuestionsGenerateStatus;
public java.lang.String getFeaturedQuestionsGenerateStatus(){
return this.featuredQuestionsGenerateStatus;
}
public void setFeaturedQuestionsGenerateStatus(java.lang.String featuredQuestionsGenerateStatus){
this.featuredQuestionsGenerateStatus = featuredQuestionsGenerateStatus;
}
/** featured_questions
*推荐问
*/
private java.lang.String featuredQuestions;
public java.lang.String getFeaturedQuestions(){
return this.featuredQuestions;
}
public void setFeaturedQuestions(java.lang.String featuredQuestions){
this.featuredQuestions = featuredQuestions;
}
/** is_deleted
*是否删除 Y 是 N 否
*/
private java.lang.String isDeleted;
public java.lang.String getIsDeleted(){
return this.isDeleted;
}
public void setIsDeleted(java.lang.String isDeleted){
this.isDeleted = isDeleted;
}
/** CREATOR
*创建人
*/
private java.lang.String creator;
public java.lang.String getCreator(){
return this.creator;
}
public void setCreator(java.lang.String creator){
this.creator = creator;
}
/** CREATED_TIME
*创建时间
*/
private java.util.Date createdTime;
public java.util.Date getCreatedTime(){
return this.createdTime;
}
public void setCreatedTime(java.util.Date createdTime){
this.createdTime = createdTime;
}
/** MODIFIER
*修改人
*/
private java.lang.String modifier;
public java.lang.String getModifier(){
return this.modifier;
}
public void setModifier(java.lang.String modifier){
this.modifier = modifier;
}
/** MODIFIED_TIME
*修改时间
*/
private java.util.Date modifiedTime;
public java.util.Date getModifiedTime(){
return this.modifiedTime;
}
public void setModifiedTime(java.util.Date modifiedTime){
this.modifiedTime = modifiedTime;
}
/** SYS_VERSION
*乐观锁,版本号
*/
private java.lang.Integer sysVersion;
public java.lang.Integer getSysVersion(){
return this.sysVersion;
}
public void setSysVersion(java.lang.Integer sysVersion){
this.sysVersion = sysVersion;
}
@Override
public String toString() {
return "BizMeetingAssistantAnalysisTaskEntity{" +
"id=" + id +
", memberId=" + memberId +
", diaguesId='" + diaguesId + '\'' +
", analysisStatus='" + analysisStatus + '\'' +
", themeContent='" + themeContent + '\'' +
", themeGenerateStatus='" + themeGenerateStatus + '\'' +
", keyWordContent='" + keyWordContent + '\'' +
", keyWordGenerateStatus='" + keyWordGenerateStatus + '\'' +
", meetingSummaryContent='" + meetingSummaryContent + '\'' +
", meetingSummaryGenerateStatus='" + meetingSummaryGenerateStatus + '\'' +
", featuredQuestionsGenerateStatus='" + featuredQuestionsGenerateStatus + '\'' +
", featuredQuestions='" + featuredQuestions + '\'' +
", isDeleted='" + isDeleted + '\'' +
", creator='" + creator + '\'' +
", createdTime=" + createdTime +
", modifier='" + modifier + '\'' +
", modifiedTime=" + modifiedTime +
", sysVersion=" + sysVersion +
'}';
}
}
\ No newline at end of file
package cn.com.poc.meeting.entity;
public class BizMeetingAssistantAsrTaskEntity {
private static final long serialVersionUID = 1L;
/** id
*主键ID
*/
private java.lang.Long id;
public java.lang.Long getId(){
return this.id;
}
public void setId(java.lang.Long id){
this.id = id;
}
/** member_id
*用户id
*/
private java.lang.Long memberId;
public java.lang.Long getMemberId(){
return this.memberId;
}
public void setMemberId(java.lang.Long memberId){
this.memberId = memberId;
}
/** diagues_id
*会话id
*/
private java.lang.String diaguesId;
public java.lang.String getDiaguesId(){
return this.diaguesId;
}
public void setDiaguesId(java.lang.String diaguesId){
this.diaguesId = diaguesId;
}
/** session_id
*语音识别任务ID
*/
private java.lang.String sessionId;
public java.lang.String getSessionId(){
return this.sessionId;
}
public void setSessionId(java.lang.String sessionId){
this.sessionId = sessionId;
}
/** generate_status
*任务状态 generate-生成中 completed-完成 failed-异常
*/
private java.lang.String generateStatus;
public java.lang.String getGenerateStatus(){
return this.generateStatus;
}
public void setGenerateStatus(java.lang.String generateStatus){
this.generateStatus = generateStatus;
}
/** message
*异常信息
*/
private java.lang.String message;
public java.lang.String getMessage(){
return this.message;
}
public void setMessage(java.lang.String message){
this.message = message;
}
/** is_deleted
*是否删除 Y 是 N 否
*/
private java.lang.String isDeleted;
public java.lang.String getIsDeleted(){
return this.isDeleted;
}
public void setIsDeleted(java.lang.String isDeleted){
this.isDeleted = isDeleted;
}
/** CREATOR
*创建人
*/
private java.lang.String creator;
public java.lang.String getCreator(){
return this.creator;
}
public void setCreator(java.lang.String creator){
this.creator = creator;
}
/** CREATED_TIME
*创建时间
*/
private java.util.Date createdTime;
public java.util.Date getCreatedTime(){
return this.createdTime;
}
public void setCreatedTime(java.util.Date createdTime){
this.createdTime = createdTime;
}
/** MODIFIER
*修改人
*/
private java.lang.String modifier;
public java.lang.String getModifier(){
return this.modifier;
}
public void setModifier(java.lang.String modifier){
this.modifier = modifier;
}
/** MODIFIED_TIME
*修改时间
*/
private java.util.Date modifiedTime;
public java.util.Date getModifiedTime(){
return this.modifiedTime;
}
public void setModifiedTime(java.util.Date modifiedTime){
this.modifiedTime = modifiedTime;
}
/** SYS_VERSION
*乐观锁,版本号
*/
private java.lang.Integer sysVersion;
public java.lang.Integer getSysVersion(){
return this.sysVersion;
}
public void setSysVersion(java.lang.Integer sysVersion){
this.sysVersion = sysVersion;
}
}
\ No newline at end of file
package cn.com.poc.meeting.model;
import java.io.Serializable;
import cn.com.yict.framemax.data.model.BaseModelClass;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Table;
import javax.persistence.Id;
import org.hibernate.annotations.DynamicInsert;
import org.hibernate.annotations.DynamicUpdate;
import javax.persistence.Version;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
/**
* Model class for biz_meeting_assistant_analysis_task
* 会议助手-会议内容分析任务表
*/
@Entity
@Table(name = "biz_meeting_assistant_analysis_task")
@DynamicInsert
@DynamicUpdate
public class BizMeetingAssistantAnalysisTaskModel extends BaseModelClass implements Serializable {
private static final long serialVersionUID = 1L;
/** id
*
*/
private java.lang.Long id;
@Column(name = "id",length = 19)
@Id @GeneratedValue(strategy = GenerationType.AUTO)
public java.lang.Long getId(){
return this.id;
}
public void setId(java.lang.Long id){
this.id = id;
super.addValidField("id");
}
/** member_id
*用户id
*/
private java.lang.Long memberId;
@Column(name = "member_id",length = 19)
public java.lang.Long getMemberId(){
return this.memberId;
}
public void setMemberId(java.lang.Long memberId){
this.memberId = memberId;
super.addValidField("memberId");
}
/** diagues_id
*会话id
*/
private java.lang.String diaguesId;
@Column(name = "diagues_id",length = 120)
public java.lang.String getDiaguesId(){
return this.diaguesId;
}
public void setDiaguesId(java.lang.String diaguesId){
this.diaguesId = diaguesId;
super.addValidField("diaguesId");
}
/** analysis_status
*内容分析总状态 generate-生成中 completed-完成 failed-失败
*/
private java.lang.String analysisStatus;
@Column(name = "analysis_status",length = 15)
public java.lang.String getAnalysisStatus(){
return this.analysisStatus;
}
public void setAnalysisStatus(java.lang.String analysisStatus){
this.analysisStatus = analysisStatus;
super.addValidField("analysisStatus");
}
/** theme_content
*会议主题
*/
private java.lang.String themeContent;
@Column(name = "theme_content",length = 2147483647)
public java.lang.String getThemeContent(){
return this.themeContent;
}
public void setThemeContent(java.lang.String themeContent){
this.themeContent = themeContent;
super.addValidField("themeContent");
}
/** theme_generate_status
*会议主题生成状态
*/
private java.lang.String themeGenerateStatus;
@Column(name = "theme_generate_status",length = 15)
public java.lang.String getThemeGenerateStatus(){
return this.themeGenerateStatus;
}
public void setThemeGenerateStatus(java.lang.String themeGenerateStatus){
this.themeGenerateStatus = themeGenerateStatus;
super.addValidField("themeGenerateStatus");
}
/** key_word_content
*关键词
*/
private java.lang.String keyWordContent;
@Column(name = "key_word_content",length = 1073741824)
public java.lang.String getKeyWordContent(){
return this.keyWordContent;
}
public void setKeyWordContent(java.lang.String keyWordContent){
this.keyWordContent = keyWordContent;
super.addValidField("keyWordContent");
}
/** key_word_generate_status
*关键词生成状态
*/
private java.lang.String keyWordGenerateStatus;
@Column(name = "key_word_generate_status",length = 15)
public java.lang.String getKeyWordGenerateStatus(){
return this.keyWordGenerateStatus;
}
public void setKeyWordGenerateStatus(java.lang.String keyWordGenerateStatus){
this.keyWordGenerateStatus = keyWordGenerateStatus;
super.addValidField("keyWordGenerateStatus");
}
/** meeting_summary_content
*会议摘要
*/
private java.lang.String meetingSummaryContent;
@Column(name = "meeting_summary_content",length = 2147483647)
public java.lang.String getMeetingSummaryContent(){
return this.meetingSummaryContent;
}
public void setMeetingSummaryContent(java.lang.String meetingSummaryContent){
this.meetingSummaryContent = meetingSummaryContent;
super.addValidField("meetingSummaryContent");
}
/** meeting_summary_generate_status
*会议摘要生成状态
*/
private java.lang.String meetingSummaryGenerateStatus;
@Column(name = "meeting_summary_generate_status",length = 15)
public java.lang.String getMeetingSummaryGenerateStatus(){
return this.meetingSummaryGenerateStatus;
}
public void setMeetingSummaryGenerateStatus(java.lang.String meetingSummaryGenerateStatus){
this.meetingSummaryGenerateStatus = meetingSummaryGenerateStatus;
super.addValidField("meetingSummaryGenerateStatus");
}
/** featured_questions_generate_status
*推荐问生成状态
*/
private java.lang.String featuredQuestionsGenerateStatus;
@Column(name = "featured_questions_generate_status",length = 15)
public java.lang.String getFeaturedQuestionsGenerateStatus(){
return this.featuredQuestionsGenerateStatus;
}
public void setFeaturedQuestionsGenerateStatus(java.lang.String featuredQuestionsGenerateStatus){
this.featuredQuestionsGenerateStatus = featuredQuestionsGenerateStatus;
super.addValidField("featuredQuestionsGenerateStatus");
}
/** featured_questions
*推荐问
*/
private java.lang.String featuredQuestions;
@Column(name = "featured_questions",length = 1073741824)
public java.lang.String getFeaturedQuestions(){
return this.featuredQuestions;
}
public void setFeaturedQuestions(java.lang.String featuredQuestions){
this.featuredQuestions = featuredQuestions;
super.addValidField("featuredQuestions");
}
/** is_deleted
*是否删除 Y 是 N 否
*/
private java.lang.String isDeleted;
@Column(name = "is_deleted",length = 1)
public java.lang.String getIsDeleted(){
return this.isDeleted;
}
public void setIsDeleted(java.lang.String isDeleted){
this.isDeleted = isDeleted;
super.addValidField("isDeleted");
}
/** CREATOR
*创建人
*/
private java.lang.String creator;
@Column(name = "CREATOR",length = 50)
public java.lang.String getCreator(){
return this.creator;
}
public void setCreator(java.lang.String creator){
this.creator = creator;
super.addValidField("creator");
}
/** CREATED_TIME
*创建时间
*/
private java.util.Date createdTime;
@Column(name = "CREATED_TIME",length = 19)
public java.util.Date getCreatedTime(){
return this.createdTime;
}
public void setCreatedTime(java.util.Date createdTime){
this.createdTime = createdTime;
super.addValidField("createdTime");
}
/** MODIFIER
*修改人
*/
private java.lang.String modifier;
@Column(name = "MODIFIER",length = 50)
public java.lang.String getModifier(){
return this.modifier;
}
public void setModifier(java.lang.String modifier){
this.modifier = modifier;
super.addValidField("modifier");
}
/** MODIFIED_TIME
*修改时间
*/
private java.util.Date modifiedTime;
@Column(name = "MODIFIED_TIME",length = 19)
public java.util.Date getModifiedTime(){
return this.modifiedTime;
}
public void setModifiedTime(java.util.Date modifiedTime){
this.modifiedTime = modifiedTime;
super.addValidField("modifiedTime");
}
/** SYS_VERSION
*乐观锁,版本号
*/
private java.lang.Integer sysVersion;
@Column(name = "SYS_VERSION",length = 10)
@Version
public java.lang.Integer getSysVersion(){
return this.sysVersion;
}
public void setSysVersion(java.lang.Integer sysVersion){
this.sysVersion = sysVersion;
super.addValidField("sysVersion");
}
}
\ No newline at end of file
package cn.com.poc.meeting.model;
import java.io.Serializable;
import cn.com.yict.framemax.data.model.BaseModelClass;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Table;
import javax.persistence.Id;
import org.hibernate.annotations.DynamicInsert;
import org.hibernate.annotations.DynamicUpdate;
import javax.persistence.Version;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
/**
* Model class for biz_meeting_assistant_asr_task
* 会议助手-语音识别任务表
*/
@Entity
@Table(name = "biz_meeting_assistant_asr_task")
@DynamicInsert
@DynamicUpdate
public class BizMeetingAssistantAsrTaskModel extends BaseModelClass implements Serializable {
private static final long serialVersionUID = 1L;
/** id
*主键ID
*/
private java.lang.Long id;
@Column(name = "id",length = 19)
@Id @GeneratedValue(strategy = GenerationType.AUTO)
public java.lang.Long getId(){
return this.id;
}
public void setId(java.lang.Long id){
this.id = id;
super.addValidField("id");
}
/** member_id
*用户id
*/
private java.lang.Long memberId;
@Column(name = "member_id",length = 19)
public java.lang.Long getMemberId(){
return this.memberId;
}
public void setMemberId(java.lang.Long memberId){
this.memberId = memberId;
super.addValidField("memberId");
}
/** diagues_id
*会话id
*/
private java.lang.String diaguesId;
@Column(name = "diagues_id",length = 120)
public java.lang.String getDiaguesId(){
return this.diaguesId;
}
public void setDiaguesId(java.lang.String diaguesId){
this.diaguesId = diaguesId;
super.addValidField("diaguesId");
}
/** session_id
*语音识别任务ID
*/
private java.lang.String sessionId;
@Column(name = "session_id",length = 200)
public java.lang.String getSessionId(){
return this.sessionId;
}
public void setSessionId(java.lang.String sessionId){
this.sessionId = sessionId;
super.addValidField("sessionId");
}
/** generate_status
*任务状态 generate-生成中 completed-完成 failed-异常
*/
private java.lang.String generateStatus;
@Column(name = "generate_status",length = 15)
public java.lang.String getGenerateStatus(){
return this.generateStatus;
}
public void setGenerateStatus(java.lang.String generateStatus){
this.generateStatus = generateStatus;
super.addValidField("generateStatus");
}
/** message
*异常信息
*/
private java.lang.String message;
@Column(name = "message",length = 2147483647)
public java.lang.String getMessage(){
return this.message;
}
public void setMessage(java.lang.String message){
this.message = message;
super.addValidField("message");
}
/** is_deleted
*是否删除 Y 是 N 否
*/
private java.lang.String isDeleted;
@Column(name = "is_deleted",length = 1)
public java.lang.String getIsDeleted(){
return this.isDeleted;
}
public void setIsDeleted(java.lang.String isDeleted){
this.isDeleted = isDeleted;
super.addValidField("isDeleted");
}
/** CREATOR
*创建人
*/
private java.lang.String creator;
@Column(name = "CREATOR",length = 50)
public java.lang.String getCreator(){
return this.creator;
}
public void setCreator(java.lang.String creator){
this.creator = creator;
super.addValidField("creator");
}
/** CREATED_TIME
*创建时间
*/
private java.util.Date createdTime;
@Column(name = "CREATED_TIME",length = 19)
public java.util.Date getCreatedTime(){
return this.createdTime;
}
public void setCreatedTime(java.util.Date createdTime){
this.createdTime = createdTime;
super.addValidField("createdTime");
}
/** MODIFIER
*修改人
*/
private java.lang.String modifier;
@Column(name = "MODIFIER",length = 50)
public java.lang.String getModifier(){
return this.modifier;
}
public void setModifier(java.lang.String modifier){
this.modifier = modifier;
super.addValidField("modifier");
}
/** MODIFIED_TIME
*修改时间
*/
private java.util.Date modifiedTime;
@Column(name = "MODIFIED_TIME",length = 19)
public java.util.Date getModifiedTime(){
return this.modifiedTime;
}
public void setModifiedTime(java.util.Date modifiedTime){
this.modifiedTime = modifiedTime;
super.addValidField("modifiedTime");
}
/** SYS_VERSION
*乐观锁,版本号
*/
private java.lang.Integer sysVersion;
@Column(name = "SYS_VERSION",length = 10)
@Version
public java.lang.Integer getSysVersion(){
return this.sysVersion;
}
public void setSysVersion(java.lang.Integer sysVersion){
this.sysVersion = sysVersion;
super.addValidField("sysVersion");
}
}
\ No newline at end of file
package cn.com.poc.meeting.repository;
import cn.com.yict.framemax.data.repository.Repository;
import cn.com.poc.meeting.model.BizMeetingAssistantAnalysisTaskModel;
public interface BizMeetingAssistantAnalysisTaskRepository extends Repository<BizMeetingAssistantAnalysisTaskModel,java.lang.Long> {
}
\ No newline at end of file
package cn.com.poc.meeting.repository;
import cn.com.yict.framemax.data.repository.Repository;
import cn.com.poc.meeting.model.BizMeetingAssistantAsrTaskModel;
public interface BizMeetingAssistantAsrTaskRepository extends Repository<BizMeetingAssistantAsrTaskModel,java.lang.Long> {
}
\ No newline at end of file
package cn.com.poc.meeting.rest;
import cn.com.poc.meeting.dto.AiMeetingAssistantDto;
import cn.com.poc.meeting.dto.AnalysisTaskDetailDto;
import cn.com.yict.framemax.core.rest.BaseRest;
import cn.com.yict.framemax.web.permission.Access;
import cn.com.yict.framemax.web.permission.Permission;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestParam;
/**
* AI会议助手接口
*/
@Permission(Access.Safety)
public interface AiMeetingAssistantRest extends BaseRest {
/**
* 创建语音文件解析任务
*
* @param fileUrl 语音文件地址
* @param dialoguesId 会话ID
* @return 任务创建状态
*/
String createTask(@RequestParam String fileUrl, @RequestParam String dialoguesId);
/**
* 查询会议内容分析详情
*
* @param dialoguesId 会话ID
* @return 任务执行状态
*/
AnalysisTaskDetailDto getTaskDetail(@RequestParam String dialoguesId);
/**
* 会议助手对话
*
* @param dto
* @throws Exception
*/
void call(@RequestBody AiMeetingAssistantDto dto) throws Exception;
}
package cn.com.poc.meeting.rest.impl;
import cn.com.poc.common.utils.Assert;
import cn.com.poc.common.utils.BlContext;
import cn.com.poc.meeting.aggregate.AiMeetingAssistantService;
import cn.com.poc.meeting.dto.AiMeetingAssistantDto;
import cn.com.poc.meeting.dto.AnalysisTaskDetailDto;
import cn.com.poc.meeting.entity.AnalysisTaskDetailEntity;
import cn.com.poc.meeting.rest.AiMeetingAssistantRest;
import cn.com.poc.support.security.oauth.entity.UserBaseEntity;
import cn.com.yict.framemax.core.exception.BusinessException;
import org.springframework.beans.BeanUtils;
import org.springframework.stereotype.Component;
import javax.annotation.Resource;
@Component
public class AiMeetingAssistantRestImpl implements AiMeetingAssistantRest {
@Resource
private AiMeetingAssistantService aiMeetingAssistantService;
@Override
public AnalysisTaskDetailDto getTaskDetail(String dialoguesId) {
Assert.notBlank(dialoguesId, "会话ID不能为空");
UserBaseEntity userBaseEntity = BlContext.getCurrentUserNotException();
if (userBaseEntity == null) {
throw new BusinessException("用户未登录");
}
AnalysisTaskDetailDto result = new AnalysisTaskDetailDto();
AnalysisTaskDetailEntity analysisTaskDetailEntity = aiMeetingAssistantService.getTaskDetail(dialoguesId, userBaseEntity.getUserId());
BeanUtils.copyProperties(analysisTaskDetailEntity, result);
return result;
}
@Override
public String createTask(String fileUrl, String dialoguesId) {
Assert.notBlank(fileUrl, "文件不能为空");
Assert.notBlank(dialoguesId, "会话ID不能为空");
UserBaseEntity userBaseEntity = BlContext.getCurrentUserNotException();
if (userBaseEntity == null) {
throw new BusinessException("用户未登录");
}
return aiMeetingAssistantService.createTask(fileUrl, dialoguesId, userBaseEntity.getUserId());
}
@Override
public void call(AiMeetingAssistantDto dto) throws Exception {
Assert.notBlank(dto.getDialoguesId(), "会话ID不能为空");
Assert.notBlank(dto.getInput(), "输入内容不能为空");
UserBaseEntity userBaseEntity = BlContext.getCurrentUserNotException();
if (userBaseEntity == null) {
throw new BusinessException("用户未登录");
}
aiMeetingAssistantService.call(dto.getDialoguesId(), dto.getFileUrl(), dto.getInput(), dto.getKnowledgeIds(), userBaseEntity.getUserId());
}
}
package cn.com.poc.meeting.scheduler;
import cn.com.poc.common.constant.CommonConstant;
import cn.com.poc.common.utils.DateUtils;
import cn.com.poc.meeting.constants.MeetingAssistantConstantEnum;
import cn.com.poc.meeting.entity.BizMeetingAssistantAnalysisTaskEntity;
import cn.com.poc.meeting.entity.BizMeetingAssistantAsrTaskEntity;
import cn.com.poc.meeting.service.BizMeetingAssistantAnalysisTaskService;
import cn.com.poc.meeting.service.BizMeetingAssistantAsrTaskService;
import cn.com.poc.message.entity.meeting.MeetingAssistantAnalysisMessage;
import cn.com.poc.message.service.MeetingAssistantAnalysisProducerService;
import cn.com.poc.thirdparty.resource.simultanous_interpretation.entity.AsrOfflineDetailResult;
import cn.com.poc.thirdparty.resource.simultanous_interpretation.entity.GetDetailResult;
import cn.com.poc.thirdparty.resource.simultanous_interpretation.service.ASRService;
import org.apache.commons.collections4.CollectionUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;
import javax.annotation.Resource;
import java.util.Date;
import java.util.List;
/**
* 会议助手-定时任务
*/
@Component
public class MeetingAssistantScheduler {
private final Logger logger = LoggerFactory.getLogger(MeetingAssistantScheduler.class);
@Resource
private MeetingAssistantAnalysisProducerService meetingAssistantAnalysisProducerService;
@Resource
private BizMeetingAssistantAsrTaskService bizMeetingAssistantAsrTaskService;
@Resource
private BizMeetingAssistantAnalysisTaskService bizMeetingAssistantAnalysisTaskService;
@Resource
private ASRService asrService;
/**
* 语音识别任务状态查询
*/
@Scheduled(fixedDelay = 15000)
public void taskStatusUpdate() {
logger.info("------- 执行[语音识别任务状态查询]定时任务 -------");
BizMeetingAssistantAsrTaskEntity bizMeetingAssistantAsrTaskEntity = new BizMeetingAssistantAsrTaskEntity();
bizMeetingAssistantAsrTaskEntity.setGenerateStatus(MeetingAssistantConstantEnum.GENERATE.getStatus());
bizMeetingAssistantAsrTaskEntity.setIsDeleted(CommonConstant.IsDeleted.N);
List<BizMeetingAssistantAsrTaskEntity> taskEntities = bizMeetingAssistantAsrTaskService.findByExample(bizMeetingAssistantAsrTaskEntity, null);
if (CollectionUtils.isEmpty(taskEntities)) {
return;
}
for (BizMeetingAssistantAsrTaskEntity taskEntity : taskEntities) {
String sessionId = taskEntity.getSessionId();
GetDetailResult getDetailResult = asrService.getDetailByFullInformation(sessionId);
if (getDetailResult == null) {
logger.error("--------- 查询语音识别任务异常,响应结果为空,sessionId:{}---------", sessionId);
continue;
}
if (0 != getDetailResult.getCode()) {
logger.error("------ 查询语音识别任务异常,sessionId:{},code:{} ,message:{}", sessionId, getDetailResult.getCode(), getDetailResult.getMessage());
continue;
}
if (null == getDetailResult.getData()) {
logger.error("---------- 查询语音识别任务异常,data为空 -----------");
continue;
}
AsrOfflineDetailResult data = getDetailResult.getData();
if (data != null) {
if (MeetingAssistantConstantEnum.COMPLETED.getStatus().equals(data.getGenerateStatus())) {
if (CollectionUtils.isEmpty(data.getTranslation())) {
logger.warn("-------- 语音识别任务已完成,但 Translation 内容为空 ----------");
taskEntity.setGenerateStatus(MeetingAssistantConstantEnum.FAILED.getStatus());
taskEntity.setMessage("translation is null");
bizMeetingAssistantAsrTaskService.update(taskEntity);
} else {
taskEntity.setGenerateStatus(MeetingAssistantConstantEnum.COMPLETED.getStatus());
bizMeetingAssistantAsrTaskService.update(taskEntity);
//执行内容分析任务
MeetingAssistantAnalysisMessage meetingAssistantAnalysisMessage = new MeetingAssistantAnalysisMessage();
meetingAssistantAnalysisMessage.setDiaguesId(taskEntity.getDiaguesId());
meetingAssistantAnalysisMessage.setTranslations(data.getTranslation());
meetingAssistantAnalysisProducerService.analysisTask(meetingAssistantAnalysisMessage);
}
} else if (MeetingAssistantConstantEnum.FAILED.getStatus().equals(data.getGenerateStatus())) {
taskEntity.setGenerateStatus(MeetingAssistantConstantEnum.FAILED.getStatus());
bizMeetingAssistantAsrTaskService.update(taskEntity);
// 更新会议内容分析任务状态
updateAnalysisTaskToFailed(taskEntity);
} else {
//判断执行时长,若超过15分钟则判断为失败.
Date now = new Date();
long diffTwoDate = DateUtils.diffTwoDate(now, taskEntity.getCreatedTime());
if (diffTwoDate > 15 * 60 * 1000){
taskEntity.setGenerateStatus(MeetingAssistantConstantEnum.FAILED.getStatus());
taskEntity.setMessage("Time Out");
bizMeetingAssistantAsrTaskService.update(taskEntity);
// 更新会议内容分析任务状态
updateAnalysisTaskToFailed(taskEntity);
}
}
}
}
}
private void updateAnalysisTaskToFailed(BizMeetingAssistantAsrTaskEntity taskEntity) {
BizMeetingAssistantAnalysisTaskEntity bizMeetingAssistantAnalysisTaskEntity = new BizMeetingAssistantAnalysisTaskEntity();
bizMeetingAssistantAnalysisTaskEntity.setDiaguesId(taskEntity.getDiaguesId());
bizMeetingAssistantAnalysisTaskEntity.setMemberId(taskEntity.getMemberId());
bizMeetingAssistantAnalysisTaskEntity.setIsDeleted(CommonConstant.IsDeleted.N);
bizMeetingAssistantAnalysisTaskEntity.setAnalysisStatus(MeetingAssistantConstantEnum.GENERATE.getStatus());
List<BizMeetingAssistantAnalysisTaskEntity> bizMeetingAssistantAnalysisTaskEntities = bizMeetingAssistantAnalysisTaskService.findByExample(bizMeetingAssistantAnalysisTaskEntity, null);
if (CollectionUtils.isNotEmpty(bizMeetingAssistantAnalysisTaskEntities)) {
logger.info("---------- 更新会议内容分析任务为 failed 状态, diaguesId:{}----------", taskEntity.getDiaguesId());
BizMeetingAssistantAnalysisTaskEntity analysisTaskEntity = bizMeetingAssistantAnalysisTaskEntities.get(0);
analysisTaskEntity.setAnalysisStatus(MeetingAssistantConstantEnum.FAILED.getStatus());
bizMeetingAssistantAnalysisTaskService.update(analysisTaskEntity);
} else {
logger.warn("------------ 无法找到对应的内容分析任务数据,diaguesId:{} -----------", taskEntity.getDiaguesId());
}
}
}
package cn.com.poc.meeting.service;
import cn.com.yict.framemax.core.service.BaseService;
import cn.com.poc.meeting.entity.BizMeetingAssistantAnalysisTaskEntity;
import cn.com.yict.framemax.data.model.PagingInfo;
import java.util.List;
public interface BizMeetingAssistantAnalysisTaskService extends BaseService {
BizMeetingAssistantAnalysisTaskEntity get(java.lang.Long id) ;
List<BizMeetingAssistantAnalysisTaskEntity> findByExample(BizMeetingAssistantAnalysisTaskEntity example,PagingInfo pagingInfo) ;
BizMeetingAssistantAnalysisTaskEntity save(BizMeetingAssistantAnalysisTaskEntity entity) throws Exception;
BizMeetingAssistantAnalysisTaskEntity update(BizMeetingAssistantAnalysisTaskEntity entity) ;
void deletedById(java.lang.Long id) ;
}
\ No newline at end of file
package cn.com.poc.meeting.service;
import cn.com.yict.framemax.core.service.BaseService;
import cn.com.poc.meeting.entity.BizMeetingAssistantAsrTaskEntity;
import cn.com.yict.framemax.data.model.PagingInfo;
import java.util.Collection;
import java.util.List;
public interface BizMeetingAssistantAsrTaskService extends BaseService {
BizMeetingAssistantAsrTaskEntity get(java.lang.Long id) throws Exception;
List<BizMeetingAssistantAsrTaskEntity> findByExample(BizMeetingAssistantAsrTaskEntity example, PagingInfo pagingInfo);
BizMeetingAssistantAsrTaskEntity save(BizMeetingAssistantAsrTaskEntity entity) throws Exception;
BizMeetingAssistantAsrTaskEntity update(BizMeetingAssistantAsrTaskEntity entity) ;
void deletedById(java.lang.Long id) throws Exception;
}
\ No newline at end of file
package cn.com.poc.meeting.service.impl;
import cn.com.yict.framemax.core.service.impl.BaseServiceImpl;
import cn.com.poc.meeting.service.BizMeetingAssistantAnalysisTaskService;
import cn.com.poc.meeting.model.BizMeetingAssistantAnalysisTaskModel;
import cn.com.poc.meeting.entity.BizMeetingAssistantAnalysisTaskEntity;
import cn.com.poc.meeting.convert.BizMeetingAssistantAnalysisTaskConvert;
import cn.com.poc.meeting.repository.BizMeetingAssistantAnalysisTaskRepository;
import cn.com.yict.framemax.data.model.PagingInfo;
import org.springframework.stereotype.Service;
import org.apache.commons.collections4.CollectionUtils;
import java.util.ArrayList;
import java.util.stream.Collectors;
import java.util.List;
import javax.annotation.Resource;
import org.springframework.util.Assert;
@Service
public class BizMeetingAssistantAnalysisTaskServiceImpl extends BaseServiceImpl
implements BizMeetingAssistantAnalysisTaskService {
@Resource
private BizMeetingAssistantAnalysisTaskRepository repository;
public BizMeetingAssistantAnalysisTaskEntity get(java.lang.Long id) {
Assert.notNull(id);
BizMeetingAssistantAnalysisTaskModel model = this.repository.get(id);
if (model == null) {
return null;
}
if ("Y".equals(model.getIsDeleted())) {
return null;
}
return BizMeetingAssistantAnalysisTaskConvert.modelToEntity(model);
}
public List<BizMeetingAssistantAnalysisTaskEntity> findByExample(BizMeetingAssistantAnalysisTaskEntity example, PagingInfo pagingInfo) {
List<BizMeetingAssistantAnalysisTaskEntity> result = new ArrayList<BizMeetingAssistantAnalysisTaskEntity>();
BizMeetingAssistantAnalysisTaskModel model = new BizMeetingAssistantAnalysisTaskModel();
if (example != null) {
model = BizMeetingAssistantAnalysisTaskConvert.entityToModel(example);
}
model.setIsDeleted("N");
List<BizMeetingAssistantAnalysisTaskModel> models = this.repository.findByExample(model, pagingInfo);
if (CollectionUtils.isNotEmpty(models)) {
result = models.stream().map(BizMeetingAssistantAnalysisTaskConvert::modelToEntity).collect(Collectors.toList());
}
return result;
}
public BizMeetingAssistantAnalysisTaskEntity save(BizMeetingAssistantAnalysisTaskEntity entity) throws Exception {
Assert.notNull(entity);
entity.setId(null);
entity.setIsDeleted("N");
BizMeetingAssistantAnalysisTaskModel model = BizMeetingAssistantAnalysisTaskConvert.entityToModel(entity);
BizMeetingAssistantAnalysisTaskModel saveModel = this.repository.save(model);
return BizMeetingAssistantAnalysisTaskConvert.modelToEntity(saveModel);
}
public BizMeetingAssistantAnalysisTaskEntity update(BizMeetingAssistantAnalysisTaskEntity entity) {
Assert.notNull(entity);
Assert.notNull(entity.getId(), "update pk can not be null");
BizMeetingAssistantAnalysisTaskModel model = this.repository.get(entity.getId());
if (entity.getDiaguesId() != null) {
model.setDiaguesId(entity.getDiaguesId());
}
if (entity.getAnalysisStatus() != null) {
model.setAnalysisStatus(entity.getAnalysisStatus());
}
if (entity.getThemeContent() != null) {
model.setThemeContent(entity.getThemeContent());
}
if (entity.getThemeGenerateStatus() != null) {
model.setThemeGenerateStatus(entity.getThemeGenerateStatus());
}
if (entity.getKeyWordContent() != null) {
model.setKeyWordContent(entity.getKeyWordContent());
}
if (entity.getKeyWordGenerateStatus() != null) {
model.setKeyWordGenerateStatus(entity.getKeyWordGenerateStatus());
}
if (entity.getMeetingSummaryContent() != null) {
model.setMeetingSummaryContent(entity.getMeetingSummaryContent());
}
if (entity.getMeetingSummaryGenerateStatus() != null) {
model.setMeetingSummaryGenerateStatus(entity.getMeetingSummaryGenerateStatus());
}
if (entity.getFeaturedQuestions() != null) {
model.setFeaturedQuestions(entity.getFeaturedQuestions());
}
if (entity.getFeaturedQuestionsGenerateStatus() != null) {
model.setFeaturedQuestionsGenerateStatus(entity.getFeaturedQuestionsGenerateStatus());
}
if (entity.getMemberId() != null) {
model.setMemberId(entity.getMemberId());
}
if (entity.getIsDeleted() != null) {
model.setIsDeleted(entity.getIsDeleted());
}
if (entity.getCreator() != null) {
model.setCreator(entity.getCreator());
}
if (entity.getCreatedTime() != null) {
model.setCreatedTime(entity.getCreatedTime());
}
if (entity.getModifier() != null) {
model.setModifier(entity.getModifier());
}
if (entity.getModifiedTime() != null) {
model.setModifiedTime(entity.getModifiedTime());
}
if (entity.getSysVersion() != null) {
model.setSysVersion(entity.getSysVersion());
}
BizMeetingAssistantAnalysisTaskModel saveModel = this.repository.save(model);
return BizMeetingAssistantAnalysisTaskConvert.modelToEntity(saveModel);
}
public void deletedById(java.lang.Long id) {
Assert.notNull(id);
BizMeetingAssistantAnalysisTaskModel model = this.repository.get(id);
if (model != null) {
if ("N".equals(model.getIsDeleted())) {
model.setIsDeleted("Y");
this.repository.save(model);
}
}
}
}
\ No newline at end of file
package cn.com.poc.meeting.service.impl;
import cn.com.yict.framemax.core.service.impl.BaseServiceImpl;
import cn.com.poc.meeting.service.BizMeetingAssistantAsrTaskService;
import cn.com.poc.meeting.model.BizMeetingAssistantAsrTaskModel;
import cn.com.poc.meeting.entity.BizMeetingAssistantAsrTaskEntity;
import cn.com.poc.meeting.convert.BizMeetingAssistantAsrTaskConvert;
import cn.com.poc.meeting.repository.BizMeetingAssistantAsrTaskRepository;
import cn.com.yict.framemax.data.model.PagingInfo;
import org.springframework.stereotype.Service;
import org.apache.commons.collections4.CollectionUtils;
import java.util.ArrayList;
import java.util.stream.Collectors;
import java.util.List;
import javax.annotation.Resource;
import org.springframework.util.Assert;
@Service
public class BizMeetingAssistantAsrTaskServiceImpl extends BaseServiceImpl
implements BizMeetingAssistantAsrTaskService {
@Resource
private BizMeetingAssistantAsrTaskRepository repository;
public BizMeetingAssistantAsrTaskEntity get(java.lang.Long id) throws Exception {
Assert.notNull(id);
BizMeetingAssistantAsrTaskModel model = this.repository.get(id);
if (model == null) {
return null;
}
if ("Y".equals(model.getIsDeleted())) {
return null;
}
return BizMeetingAssistantAsrTaskConvert.modelToEntity(model);
}
public List<BizMeetingAssistantAsrTaskEntity> findByExample(BizMeetingAssistantAsrTaskEntity example, PagingInfo pagingInfo) {
List<BizMeetingAssistantAsrTaskEntity> result = new ArrayList<BizMeetingAssistantAsrTaskEntity>();
BizMeetingAssistantAsrTaskModel model = new BizMeetingAssistantAsrTaskModel();
if (example != null) {
model = BizMeetingAssistantAsrTaskConvert.entityToModel(example);
}
model.setIsDeleted("N");
List<BizMeetingAssistantAsrTaskModel> models = this.repository.findByExample(model, pagingInfo);
if (CollectionUtils.isNotEmpty(models)) {
result = models.stream().map(BizMeetingAssistantAsrTaskConvert::modelToEntity).collect(Collectors.toList());
}
return result;
}
public BizMeetingAssistantAsrTaskEntity save(BizMeetingAssistantAsrTaskEntity entity) throws Exception {
Assert.notNull(entity);
entity.setId(null);
entity.setIsDeleted("N");
BizMeetingAssistantAsrTaskModel model = BizMeetingAssistantAsrTaskConvert.entityToModel(entity);
BizMeetingAssistantAsrTaskModel saveModel = this.repository.save(model);
return BizMeetingAssistantAsrTaskConvert.modelToEntity(saveModel);
}
public BizMeetingAssistantAsrTaskEntity update(BizMeetingAssistantAsrTaskEntity entity) {
Assert.notNull(entity);
Assert.notNull(entity.getId(), "update pk can not be null");
BizMeetingAssistantAsrTaskModel model = this.repository.get(entity.getId());
if (entity.getMemberId() != null) {
model.setMemberId(entity.getMemberId());
}
if (entity.getDiaguesId() != null) {
model.setDiaguesId(entity.getDiaguesId());
}
if (entity.getSessionId() != null) {
model.setSessionId(entity.getSessionId());
}
if (entity.getGenerateStatus() != null) {
model.setGenerateStatus(entity.getGenerateStatus());
}
if (entity.getMessage() != null) {
model.setMessage(entity.getMessage());
}
if (entity.getIsDeleted() != null) {
model.setIsDeleted(entity.getIsDeleted());
}
if (entity.getCreator() != null) {
model.setCreator(entity.getCreator());
}
if (entity.getCreatedTime() != null) {
model.setCreatedTime(entity.getCreatedTime());
}
if (entity.getModifier() != null) {
model.setModifier(entity.getModifier());
}
if (entity.getModifiedTime() != null) {
model.setModifiedTime(entity.getModifiedTime());
}
if (entity.getSysVersion() != null) {
model.setSysVersion(entity.getSysVersion());
}
BizMeetingAssistantAsrTaskModel saveModel = this.repository.save(model);
return BizMeetingAssistantAsrTaskConvert.modelToEntity(saveModel);
}
public void deletedById(java.lang.Long id) throws Exception {
Assert.notNull(id);
BizMeetingAssistantAsrTaskModel model = this.repository.get(id);
if (model != null) {
if ("N".equals(model.getIsDeleted())) {
model.setIsDeleted("Y");
this.repository.save(model);
}
}
}
}
\ No newline at end of file
package cn.com.poc.message.entity.meeting;
public class AnalysisTaskUpdateMessage {
/**
* id
*
*/
private java.lang.Long id;
public java.lang.Long getId() {
return this.id;
}
public void setId(java.lang.Long id) {
this.id = id;
}
/**
* member_id
* 用户id
*/
private java.lang.Long memberId;
public java.lang.Long getMemberId() {
return this.memberId;
}
public void setMemberId(java.lang.Long memberId) {
this.memberId = memberId;
}
/**
* diagues_id
* 会话id
*/
private java.lang.String diaguesId;
public java.lang.String getDiaguesId() {
return this.diaguesId;
}
public void setDiaguesId(java.lang.String diaguesId) {
this.diaguesId = diaguesId;
}
/**
* analysis_status
* 内容分析总状态 generate-生成中 completed-完成 failed-失败
*/
private java.lang.String analysisStatus;
public java.lang.String getAnalysisStatus() {
return this.analysisStatus;
}
public void setAnalysisStatus(java.lang.String analysisStatus) {
this.analysisStatus = analysisStatus;
}
/**
* theme_content
* 会议主题
*/
private java.lang.String themeContent;
public java.lang.String getThemeContent() {
return this.themeContent;
}
public void setThemeContent(java.lang.String themeContent) {
this.themeContent = themeContent;
}
/**
* theme_generate_status
* 会议主题生成状态
*/
private java.lang.String themeGenerateStatus;
public java.lang.String getThemeGenerateStatus() {
return this.themeGenerateStatus;
}
public void setThemeGenerateStatus(java.lang.String themeGenerateStatus) {
this.themeGenerateStatus = themeGenerateStatus;
}
/**
* key_word_content
* 关键词
*/
private java.lang.String keyWordContent;
public java.lang.String getKeyWordContent() {
return this.keyWordContent;
}
public void setKeyWordContent(java.lang.String keyWordContent) {
this.keyWordContent = keyWordContent;
}
/**
* key_word_generate_status
* 关键词生成状态
*/
private java.lang.String keyWordGenerateStatus;
public java.lang.String getKeyWordGenerateStatus() {
return this.keyWordGenerateStatus;
}
public void setKeyWordGenerateStatus(java.lang.String keyWordGenerateStatus) {
this.keyWordGenerateStatus = keyWordGenerateStatus;
}
/**
* meeting_summary_content
* 会议摘要
*/
private java.lang.String meetingSummaryContent;
public java.lang.String getMeetingSummaryContent() {
return this.meetingSummaryContent;
}
public void setMeetingSummaryContent(java.lang.String meetingSummaryContent) {
this.meetingSummaryContent = meetingSummaryContent;
}
/**
* meeting_summary_generate_status
* 会议摘要生成状态
*/
private java.lang.String meetingSummaryGenerateStatus;
public java.lang.String getMeetingSummaryGenerateStatus() {
return this.meetingSummaryGenerateStatus;
}
public void setMeetingSummaryGenerateStatus(java.lang.String meetingSummaryGenerateStatus) {
this.meetingSummaryGenerateStatus = meetingSummaryGenerateStatus;
}
/**
* featured_questions_generate_status
* 推荐问生成状态
*/
private java.lang.String featuredQuestionsGenerateStatus;
public java.lang.String getFeaturedQuestionsGenerateStatus() {
return this.featuredQuestionsGenerateStatus;
}
public void setFeaturedQuestionsGenerateStatus(java.lang.String featuredQuestionsGenerateStatus) {
this.featuredQuestionsGenerateStatus = featuredQuestionsGenerateStatus;
}
/**
* featured_questions
* 推荐问
*/
private java.lang.String featuredQuestions;
public java.lang.String getFeaturedQuestions() {
return this.featuredQuestions;
}
public void setFeaturedQuestions(java.lang.String featuredQuestions) {
this.featuredQuestions = featuredQuestions;
}
/**
* is_deleted
* 是否删除 Y 是 N 否
*/
private java.lang.String isDeleted;
public java.lang.String getIsDeleted() {
return this.isDeleted;
}
public void setIsDeleted(java.lang.String isDeleted) {
this.isDeleted = isDeleted;
}
@Override
public String toString() {
return "AnalysisTaskUpdateMessage{" +
"id=" + id +
", memberId=" + memberId +
", diaguesId='" + diaguesId + '\'' +
", analysisStatus='" + analysisStatus + '\'' +
", themeContent='" + themeContent + '\'' +
", themeGenerateStatus='" + themeGenerateStatus + '\'' +
", keyWordContent='" + keyWordContent + '\'' +
", keyWordGenerateStatus='" + keyWordGenerateStatus + '\'' +
", meetingSummaryContent='" + meetingSummaryContent + '\'' +
", meetingSummaryGenerateStatus='" + meetingSummaryGenerateStatus + '\'' +
", featuredQuestionsGenerateStatus='" + featuredQuestionsGenerateStatus + '\'' +
", featuredQuestions='" + featuredQuestions + '\'' +
", isDeleted='" + isDeleted + '\'' +
'}';
}
}
package cn.com.poc.message.entity.meeting;
import cn.com.poc.thirdparty.resource.simultanous_interpretation.entity.Translation;
import java.util.List;
public class MeetingAssistantAnalysisMessage {
/**
* 会话id
*/
private String diaguesId;
/**
* 会议识别内容
*/
private List<Translation> translations;
public String getDiaguesId() {
return diaguesId;
}
public void setDiaguesId(String diaguesId) {
this.diaguesId = diaguesId;
}
public List<Translation> getTranslations() {
return translations;
}
public void setTranslations(List<Translation> translations) {
this.translations = translations;
}
}
package cn.com.poc.message.entity.meeting;
public class MeetingAssistantGenerateAnalysisContentMessage {
private String diaguesId;
private String content;
public String getDiaguesId() {
return diaguesId;
}
public void setDiaguesId(String diaguesId) {
this.diaguesId = diaguesId;
}
public String getContent() {
return content;
}
public void setContent(String content) {
this.content = content;
}
}
package cn.com.poc.message.service;
import cn.com.poc.message.entity.meeting.AnalysisTaskUpdateMessage;
import cn.com.poc.message.entity.meeting.MeetingAssistantAnalysisMessage;
import cn.com.poc.message.entity.meeting.MeetingAssistantGenerateAnalysisContentMessage;
import cn.com.yict.framemax.core.service.BaseService;
public interface MeetingAssistantAnalysisConsumerService extends BaseService {
/**
* 执行会议内容分析任务
*/
void analysisTask(MeetingAssistantAnalysisMessage meetingAssistantAnalysisMessage) throws Exception;
/**
* 更新会议内容分析任务状态
*/
void analysisTaskUpdate(AnalysisTaskUpdateMessage message);
/**
* 生成主题
*/
void generateTheme(MeetingAssistantGenerateAnalysisContentMessage message);
/**
* 获取关键词
*/
void keyWord(MeetingAssistantGenerateAnalysisContentMessage message);
/**
* 生成摘要
*/
void generateSummry(MeetingAssistantGenerateAnalysisContentMessage message);
/**
* 生成推荐问
*/
void generateFeaturedQuestion(MeetingAssistantGenerateAnalysisContentMessage message);
}
package cn.com.poc.message.service;
import cn.com.poc.message.entity.meeting.AnalysisTaskUpdateMessage;
import cn.com.poc.message.entity.meeting.MeetingAssistantAnalysisMessage;
import cn.com.poc.message.entity.meeting.MeetingAssistantGenerateAnalysisContentMessage;
import cn.com.yict.framemax.core.service.BaseService;
public interface MeetingAssistantAnalysisProducerService extends BaseService {
/**
* 会议内容分析
*
*/
MeetingAssistantAnalysisMessage analysisTask(MeetingAssistantAnalysisMessage meetingAssistantAnalysisMessage);
/**
* 更新会议内容分析任务状态
*/
AnalysisTaskUpdateMessage analysisTaskUpdate(AnalysisTaskUpdateMessage message);
/**
* 生成主题
*/
MeetingAssistantGenerateAnalysisContentMessage generateTheme(MeetingAssistantGenerateAnalysisContentMessage message);
/**
* 获取关键词
*/
MeetingAssistantGenerateAnalysisContentMessage keyWord(MeetingAssistantGenerateAnalysisContentMessage message);
/**
* 生成摘要
*/
MeetingAssistantGenerateAnalysisContentMessage generateSummry(MeetingAssistantGenerateAnalysisContentMessage message);
/**
* 生成推荐问
*/
MeetingAssistantGenerateAnalysisContentMessage generateFeaturedQuestion(MeetingAssistantGenerateAnalysisContentMessage message);
}
package cn.com.poc.message.service.impl;
import cn.com.poc.ai_dialogues.constant.AiDialoguesTypeEnum;
import cn.com.poc.ai_dialogues.entity.BizAiDialoguesEntity;
import cn.com.poc.ai_dialogues.service.BizAiDialoguesService;
import cn.com.poc.common.constant.CommonConstant;
import cn.com.poc.common.utils.JsonUtils;
import cn.com.poc.common.utils.StringUtils;
import cn.com.poc.meeting.analysis.FeaturedQuestionAnalyzer;
import cn.com.poc.meeting.analysis.KeyWordAnalyzer;
import cn.com.poc.meeting.analysis.SummaryAnalyzer;
import cn.com.poc.meeting.analysis.ThemeAnalyzer;
import cn.com.poc.meeting.cache.KeyWordCounter;
import cn.com.poc.meeting.constants.MeetingAssistantConstantEnum;
import cn.com.poc.meeting.entity.BizMeetingAssistantAnalysisTaskEntity;
import cn.com.poc.meeting.service.BizMeetingAssistantAnalysisTaskService;
import cn.com.poc.message.entity.meeting.AnalysisTaskUpdateMessage;
import cn.com.poc.message.entity.meeting.MeetingAssistantAnalysisMessage;
import cn.com.poc.message.entity.meeting.MeetingAssistantGenerateAnalysisContentMessage;
import cn.com.poc.message.service.MeetingAssistantAnalysisConsumerService;
import cn.com.poc.message.service.MeetingAssistantAnalysisProducerService;
import cn.com.poc.message.topic.MeetingAssistantTopic;
import cn.com.poc.thirdparty.resource.simultanous_interpretation.entity.Translation;
import cn.com.yict.framemax.core.exception.BusinessException;
import cn.com.yict.framemax.tumbleweed.client.annotation.Consumer;
import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.bean.copier.CopyOptions;
import org.apache.commons.collections4.CollectionUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import java.util.List;
import java.util.Map;
@Service
public class MeetingAssistantAnalysisConsumerServiceImpl implements MeetingAssistantAnalysisConsumerService {
private final Logger logger = LoggerFactory.getLogger(MeetingAssistantAnalysisConsumerServiceImpl.class);
@Resource
private BizMeetingAssistantAnalysisTaskService bizMeetingAssistantAnalysisTaskService;
@Resource
private MeetingAssistantAnalysisProducerService meetingAssistantAnalysisProducerService;
@Resource
private BizAiDialoguesService bizAiDialoguesService;
@Override
@Consumer(topic = MeetingAssistantTopic.CONTENT_ANALYSIS, scale = 2)
public void analysisTask(MeetingAssistantAnalysisMessage meetingAssistantAnalysisMessage) {
//更新状态
BizMeetingAssistantAnalysisTaskEntity bizMeetingAssistantAnalysisTaskEntity = new BizMeetingAssistantAnalysisTaskEntity();
bizMeetingAssistantAnalysisTaskEntity.setDiaguesId(meetingAssistantAnalysisMessage.getDiaguesId());
bizMeetingAssistantAnalysisTaskEntity.setIsDeleted(CommonConstant.IsDeleted.N);
List<BizMeetingAssistantAnalysisTaskEntity> taskEntities = bizMeetingAssistantAnalysisTaskService.findByExample(bizMeetingAssistantAnalysisTaskEntity, null);
if (CollectionUtils.isEmpty(taskEntities)) {
throw new BusinessException("无法找到对应的会议内容分析任务");
}
BizMeetingAssistantAnalysisTaskEntity taskEntity = taskEntities.get(0);
if (MeetingAssistantConstantEnum.COMPLETED.getStatus().equals(taskEntity.getAnalysisStatus())) {
logger.info("------------ 任务已完成,无需重复生成 ,diaguesId:{}------------", meetingAssistantAnalysisMessage.getDiaguesId());
return;
}
StringBuilder contentsBuilder = new StringBuilder();
List<Translation> translations = meetingAssistantAnalysisMessage.getTranslations();
for (Translation translation : translations) {
Long spk = translation.getSpk();
String content = translation.getContent();
contentsBuilder.append(spk).append(":").append(content).append(StringUtils.LF);
}
MeetingAssistantGenerateAnalysisContentMessage analysisContentMessage = new MeetingAssistantGenerateAnalysisContentMessage();
analysisContentMessage.setContent(contentsBuilder.toString());
analysisContentMessage.setDiaguesId(meetingAssistantAnalysisMessage.getDiaguesId());
if (StringUtils.isBlank(taskEntity.getFeaturedQuestionsGenerateStatus())
|| MeetingAssistantConstantEnum.FAILED.getStatus().equals(taskEntity.getFeaturedQuestionsGenerateStatus())) {
meetingAssistantAnalysisProducerService.generateFeaturedQuestion(analysisContentMessage);
taskEntity.setFeaturedQuestionsGenerateStatus(MeetingAssistantConstantEnum.GENERATE.getStatus());
}
// if (StringUtils.isBlank(taskEntity.getThemeGenerateStatus())
// || MeetingAssistantConstantEnum.FAILED.getStatus().equals(taskEntity.getThemeGenerateStatus())) {
// meetingAssistantAnalysisProducerService.generateTheme(analysisContentMessage);
// taskEntity.setThemeGenerateStatus(MeetingAssistantConstantEnum.GENERATE.getStatus());
// }
if (StringUtils.isBlank(taskEntity.getMeetingSummaryGenerateStatus())
|| MeetingAssistantConstantEnum.FAILED.getStatus().equals(taskEntity.getMeetingSummaryGenerateStatus())) {
meetingAssistantAnalysisProducerService.generateSummry(analysisContentMessage);
taskEntity.setMeetingSummaryGenerateStatus(MeetingAssistantConstantEnum.GENERATE.getStatus());
}
if (StringUtils.isBlank(taskEntity.getKeyWordGenerateStatus())
|| MeetingAssistantConstantEnum.FAILED.getStatus().equals(taskEntity.getKeyWordGenerateStatus())) {
meetingAssistantAnalysisProducerService.keyWord(analysisContentMessage);
taskEntity.setKeyWordGenerateStatus(MeetingAssistantConstantEnum.GENERATE.getStatus());
}
logger.info("---- 更新会议内容分析任务状态 ,entity:{}------", JsonUtils.serialize(bizMeetingAssistantAnalysisTaskEntity));
taskEntity.setAnalysisStatus(MeetingAssistantConstantEnum.GENERATE.getStatus());
bizMeetingAssistantAnalysisTaskService.update(taskEntity);
}
@Override
@Consumer(topic = MeetingAssistantTopic.UPDATE_ANALYSIS, retry = true)
public void analysisTaskUpdate(AnalysisTaskUpdateMessage message) {
logger.info("-------- update meeting assistant analysis task , message:{} ", message);
Long id = message.getId();
BizMeetingAssistantAnalysisTaskEntity bizMeetingAssistantAnalysisTaskEntity = bizMeetingAssistantAnalysisTaskService.get(id);
if (bizMeetingAssistantAnalysisTaskEntity == null) {
logger.error("------------- can not find meeting assistant analysis task , id:{} -------------", id);
return;
}
CopyOptions copyOptions = new CopyOptions();
copyOptions.setIgnoreNullValue(true);
BeanUtil.copyProperties(message, bizMeetingAssistantAnalysisTaskEntity, copyOptions);
logger.info("-------- update meeting meeting assistant analysis , entity:{}----------", bizMeetingAssistantAnalysisTaskEntity);
if (checkAllIsCompleted(bizMeetingAssistantAnalysisTaskEntity)) {
bizMeetingAssistantAnalysisTaskEntity.setAnalysisStatus(MeetingAssistantConstantEnum.COMPLETED.getStatus());
} else if (checkExistFaild(bizMeetingAssistantAnalysisTaskEntity)) {
bizMeetingAssistantAnalysisTaskEntity.setAnalysisStatus(MeetingAssistantConstantEnum.FAILED.getStatus());
}
bizMeetingAssistantAnalysisTaskService.update(bizMeetingAssistantAnalysisTaskEntity);
//更新会话标题
logger.info("-------- update dialogues title -------------");
BizAiDialoguesEntity bizAiDialoguesEntity = new BizAiDialoguesEntity();
bizAiDialoguesEntity.setDialoguesId(bizMeetingAssistantAnalysisTaskEntity.getDiaguesId());
bizAiDialoguesEntity.setDialoguesType(AiDialoguesTypeEnum.MEETING_ASSISTANT.getType());
bizAiDialoguesEntity.setIsDeleted(CommonConstant.IsDeleted.N);
List<BizAiDialoguesEntity> aiDialoguesEntities = bizAiDialoguesService.findByExample(bizAiDialoguesEntity, null);
if (CollectionUtils.isNotEmpty(aiDialoguesEntities)) {
BizAiDialoguesEntity updateAiDialoguesEntity = aiDialoguesEntities.get(0);
if (StringUtils.isNotBlank(bizMeetingAssistantAnalysisTaskEntity.getThemeContent())
&& !bizMeetingAssistantAnalysisTaskEntity.getThemeContent().equals(updateAiDialoguesEntity.getTitle())) {
updateAiDialoguesEntity.setTitle(bizMeetingAssistantAnalysisTaskEntity.getThemeContent());
bizAiDialoguesService.update(updateAiDialoguesEntity);
logger.info("------- update dialogues title success , title:{} -----------", updateAiDialoguesEntity.getTitle());
}
}
}
@Override
@Consumer(topic = MeetingAssistantTopic.GENERATE_FEATURED_QUESTION, retry = true, scale = 2)
public void generateFeaturedQuestion(MeetingAssistantGenerateAnalysisContentMessage message) {
// 执行处理器
FeaturedQuestionAnalyzer featuredQuestionAnalyzer = new FeaturedQuestionAnalyzer();
List<String> featuredQuestionList = featuredQuestionAnalyzer.run(message.getContent());
// 更新状态
BizMeetingAssistantAnalysisTaskEntity bizMeetingAssistantAnalysisTaskEntity = new BizMeetingAssistantAnalysisTaskEntity();
bizMeetingAssistantAnalysisTaskEntity.setDiaguesId(message.getDiaguesId());
bizMeetingAssistantAnalysisTaskEntity.setIsDeleted(CommonConstant.IsDeleted.N);
List<BizMeetingAssistantAnalysisTaskEntity> taskEntities = bizMeetingAssistantAnalysisTaskService.findByExample(bizMeetingAssistantAnalysisTaskEntity, null);
if (CollectionUtils.isEmpty(taskEntities)) {
throw new BusinessException("无法找到对应的会议内容分析任务");
}
BizMeetingAssistantAnalysisTaskEntity taskEntity = taskEntities.get(0);
// 发送更新消息
AnalysisTaskUpdateMessage updateMessage = new AnalysisTaskUpdateMessage();
updateMessage.setId(taskEntity.getId());
if (CollectionUtils.isNotEmpty(featuredQuestionList)) {
updateMessage.setFeaturedQuestionsGenerateStatus(MeetingAssistantConstantEnum.COMPLETED.getStatus());
updateMessage.setFeaturedQuestions(JsonUtils.serialize(featuredQuestionList));
} else {
updateMessage.setFeaturedQuestionsGenerateStatus(MeetingAssistantConstantEnum.FAILED.getStatus());
}
meetingAssistantAnalysisProducerService.analysisTaskUpdate(updateMessage);
}
@Override
@Consumer(topic = MeetingAssistantTopic.GENERATE_SUMMARY, scale = 2)
public void generateSummry(MeetingAssistantGenerateAnalysisContentMessage message) {
SummaryAnalyzer summaryAnalyzer = new SummaryAnalyzer();
String summary = summaryAnalyzer.run(message.getContent());
// 更新状态
BizMeetingAssistantAnalysisTaskEntity bizMeetingAssistantAnalysisTaskEntity = new BizMeetingAssistantAnalysisTaskEntity();
bizMeetingAssistantAnalysisTaskEntity.setDiaguesId(message.getDiaguesId());
bizMeetingAssistantAnalysisTaskEntity.setIsDeleted(CommonConstant.IsDeleted.N);
List<BizMeetingAssistantAnalysisTaskEntity> taskEntities = bizMeetingAssistantAnalysisTaskService.findByExample(bizMeetingAssistantAnalysisTaskEntity, null);
if (CollectionUtils.isEmpty(taskEntities)) {
throw new BusinessException("无法找到对应的会议内容分析任务");
}
BizMeetingAssistantAnalysisTaskEntity taskEntity = taskEntities.get(0);
// 发送更新消息
AnalysisTaskUpdateMessage updateMessage = new AnalysisTaskUpdateMessage();
updateMessage.setId(taskEntity.getId());
if (StringUtils.isNotBlank(summary)) {
updateMessage.setMeetingSummaryGenerateStatus(MeetingAssistantConstantEnum.COMPLETED.getStatus());
updateMessage.setMeetingSummaryContent(summary);
} else {
updateMessage.setMeetingSummaryGenerateStatus(MeetingAssistantConstantEnum.FAILED.getStatus());
}
meetingAssistantAnalysisProducerService.analysisTaskUpdate(updateMessage);
if (StringUtils.isBlank(taskEntity.getThemeGenerateStatus())
|| MeetingAssistantConstantEnum.FAILED.getStatus().equals(taskEntity.getThemeGenerateStatus())) {
MeetingAssistantGenerateAnalysisContentMessage meetingAssistantGenerateAnalysisContentMessage = new MeetingAssistantGenerateAnalysisContentMessage();
meetingAssistantGenerateAnalysisContentMessage.setContent(summary);
meetingAssistantGenerateAnalysisContentMessage.setDiaguesId(message.getDiaguesId());
meetingAssistantAnalysisProducerService.generateTheme(meetingAssistantGenerateAnalysisContentMessage);
taskEntity.setThemeGenerateStatus(MeetingAssistantConstantEnum.GENERATE.getStatus());
}
}
@Override
@Consumer(topic = MeetingAssistantTopic.GENERATE_KEYWORD, scale = 2)
public void keyWord(MeetingAssistantGenerateAnalysisContentMessage message) {
KeyWordAnalyzer keyWordAnalyzer = new KeyWordAnalyzer();
List<String> keyWords = keyWordAnalyzer.run(message.getContent());
BizMeetingAssistantAnalysisTaskEntity bizMeetingAssistantAnalysisTaskEntity = new BizMeetingAssistantAnalysisTaskEntity();
bizMeetingAssistantAnalysisTaskEntity.setDiaguesId(message.getDiaguesId());
bizMeetingAssistantAnalysisTaskEntity.setIsDeleted(CommonConstant.IsDeleted.N);
List<BizMeetingAssistantAnalysisTaskEntity> taskEntities = bizMeetingAssistantAnalysisTaskService.findByExample(bizMeetingAssistantAnalysisTaskEntity, null);
if (CollectionUtils.isEmpty(taskEntities)) {
throw new BusinessException("无法找到对应的会议内容分析任务");
}
BizMeetingAssistantAnalysisTaskEntity taskEntity = taskEntities.get(0);
// 发送更新消息
AnalysisTaskUpdateMessage updateMessage = new AnalysisTaskUpdateMessage();
updateMessage.setId(taskEntity.getId());
if (CollectionUtils.isNotEmpty(keyWords)) {
// 关键词计数
Map<String, Integer> countMap = KeyWordCounter.keywordCount(message.getContent(), keyWords);
KeyWordCounter.cacheKeyWordCount(message.getDiaguesId(), countMap);
updateMessage.setKeyWordGenerateStatus(MeetingAssistantConstantEnum.COMPLETED.getStatus());
updateMessage.setKeyWordContent(JsonUtils.serialize(countMap.entrySet()));
} else {
updateMessage.setKeyWordGenerateStatus(MeetingAssistantConstantEnum.FAILED.getStatus());
}
meetingAssistantAnalysisProducerService.analysisTaskUpdate(updateMessage);
}
@Override
@Consumer(topic = MeetingAssistantTopic.GENERATE_THEME, scale = 2)
public void generateTheme(MeetingAssistantGenerateAnalysisContentMessage message) {
ThemeAnalyzer themeAnalyzer = new ThemeAnalyzer();
String theme = themeAnalyzer.run(message.getContent());
// 更新状态
BizMeetingAssistantAnalysisTaskEntity bizMeetingAssistantAnalysisTaskEntity = new BizMeetingAssistantAnalysisTaskEntity();
bizMeetingAssistantAnalysisTaskEntity.setDiaguesId(message.getDiaguesId());
bizMeetingAssistantAnalysisTaskEntity.setIsDeleted(CommonConstant.IsDeleted.N);
List<BizMeetingAssistantAnalysisTaskEntity> taskEntities = bizMeetingAssistantAnalysisTaskService.findByExample(bizMeetingAssistantAnalysisTaskEntity, null);
if (CollectionUtils.isEmpty(taskEntities)) {
throw new BusinessException("无法找到对应的会议内容分析任务");
}
BizMeetingAssistantAnalysisTaskEntity taskEntity = taskEntities.get(0);
// 发送更新消息
AnalysisTaskUpdateMessage updateMessage = new AnalysisTaskUpdateMessage();
updateMessage.setId(taskEntity.getId());
if (StringUtils.isNotBlank(theme)) {
updateMessage.setThemeGenerateStatus(MeetingAssistantConstantEnum.COMPLETED.getStatus());
updateMessage.setThemeContent(theme);
} else {
updateMessage.setThemeGenerateStatus(MeetingAssistantConstantEnum.FAILED.getStatus());
}
meetingAssistantAnalysisProducerService.analysisTaskUpdate(updateMessage);
}
/**
* 检查是否全部已经完成
*
* @param taskEntity
* @return
*/
private boolean checkAllIsCompleted(BizMeetingAssistantAnalysisTaskEntity taskEntity) {
// 所有皆完成
return MeetingAssistantConstantEnum.COMPLETED.getStatus().equals(taskEntity.getFeaturedQuestionsGenerateStatus())
&& MeetingAssistantConstantEnum.COMPLETED.getStatus().equals(taskEntity.getMeetingSummaryGenerateStatus())
&& MeetingAssistantConstantEnum.COMPLETED.getStatus().equals(taskEntity.getKeyWordGenerateStatus())
&& MeetingAssistantConstantEnum.COMPLETED.getStatus().equals(taskEntity.getThemeGenerateStatus());
}
/**
* 检查是否存在失败任务
*
* @param taskEntity
* @return
*/
private boolean checkExistFaild(BizMeetingAssistantAnalysisTaskEntity taskEntity) {
return MeetingAssistantConstantEnum.FAILED.getStatus().equals(taskEntity.getFeaturedQuestionsGenerateStatus())
|| MeetingAssistantConstantEnum.FAILED.getStatus().equals(taskEntity.getMeetingSummaryGenerateStatus())
|| MeetingAssistantConstantEnum.FAILED.getStatus().equals(taskEntity.getKeyWordGenerateStatus())
|| MeetingAssistantConstantEnum.FAILED.getStatus().equals(taskEntity.getThemeGenerateStatus());
}
}
package cn.com.poc.message.service.impl;
import cn.com.poc.message.entity.meeting.AnalysisTaskUpdateMessage;
import cn.com.poc.message.entity.meeting.MeetingAssistantAnalysisMessage;
import cn.com.poc.message.entity.meeting.MeetingAssistantGenerateAnalysisContentMessage;
import cn.com.poc.message.service.MeetingAssistantAnalysisProducerService;
import cn.com.poc.message.topic.MeetingAssistantTopic;
import cn.com.yict.framemax.tumbleweed.client.annotation.Producer;
import org.springframework.stereotype.Service;
@Service
public class MeetingAssistantAnalysisProducerServiceImpl implements MeetingAssistantAnalysisProducerService {
@Override
@Producer(topic = MeetingAssistantTopic.CONTENT_ANALYSIS)
public MeetingAssistantAnalysisMessage analysisTask(MeetingAssistantAnalysisMessage meetingAssistantAnalysisMessage) {
return meetingAssistantAnalysisMessage;
}
@Override
@Producer(topic = MeetingAssistantTopic.UPDATE_ANALYSIS)
public AnalysisTaskUpdateMessage analysisTaskUpdate(AnalysisTaskUpdateMessage message) {
return message;
}
@Override
@Producer(topic = MeetingAssistantTopic.GENERATE_FEATURED_QUESTION)
public MeetingAssistantGenerateAnalysisContentMessage generateFeaturedQuestion(MeetingAssistantGenerateAnalysisContentMessage message) {
return message;
}
@Override
@Producer(topic = MeetingAssistantTopic.GENERATE_SUMMARY)
public MeetingAssistantGenerateAnalysisContentMessage generateSummry(MeetingAssistantGenerateAnalysisContentMessage message) {
return message;
}
@Override
@Producer(topic = MeetingAssistantTopic.GENERATE_KEYWORD)
public MeetingAssistantGenerateAnalysisContentMessage keyWord(MeetingAssistantGenerateAnalysisContentMessage message) {
return message;
}
@Override
@Producer(topic = MeetingAssistantTopic.GENERATE_THEME)
public MeetingAssistantGenerateAnalysisContentMessage generateTheme(MeetingAssistantGenerateAnalysisContentMessage message) {
return message;
}
}
package cn.com.poc.message.topic;
/**
* 会议助手-消息主题
*/
public interface MeetingAssistantTopic {
/**
* 更新分析任务状态
*/
String UPDATE_ANALYSIS = "UPDATE_ANALYSIS";
/**
* 会议内容分析任务
*/
String CONTENT_ANALYSIS = "MEETING_ASSISTANT_CONTENT_ANALYSIS";
/**
* 生成主题
*/
String GENERATE_THEME = "GENERATE_THEME";
/**
* 提取关键词
*/
String GENERATE_KEYWORD = "GENERATE_KEYWORD";
/**
* 生成会议摘要
*/
String GENERATE_SUMMARY = "GENERATE_SUMMARY";
/**
* 生成推荐问
*/
String GENERATE_FEATURED_QUESTION = "GENERATE_FEATURED_QUESTION";
}
...@@ -28,12 +28,12 @@ public class PortalDialoguesDto { ...@@ -28,12 +28,12 @@ public class PortalDialoguesDto {
/** /**
* 是否启用搜索引擎 * 是否启用搜索引擎
*/ */
private Boolean enableSearchEngine; private boolean enableSearchEngine;
/** /**
* 是否开启深度思考 * 是否开启深度思考
*/ */
private Boolean enableDeepThinking; private boolean enableDeepThinking;
/** /**
* 文件地址 * 文件地址
...@@ -69,11 +69,11 @@ public class PortalDialoguesDto { ...@@ -69,11 +69,11 @@ public class PortalDialoguesDto {
this.dialoguesId = dialoguesId; this.dialoguesId = dialoguesId;
} }
public Boolean getEnableSearchEngine() { public boolean getEnableSearchEngine() {
return enableSearchEngine; return enableSearchEngine;
} }
public void setEnableSearchEngine(Boolean enableSearchEngine) { public void setEnableSearchEngine(boolean enableSearchEngine) {
this.enableSearchEngine = enableSearchEngine; this.enableSearchEngine = enableSearchEngine;
} }
......
...@@ -53,7 +53,6 @@ public class BaiduTextDiffApi implements BaiduBaseApi { ...@@ -53,7 +53,6 @@ public class BaiduTextDiffApi implements BaiduBaseApi {
.addFormDataPart("baseFileURL", response.getBaseFileURL()) .addFormDataPart("baseFileURL", response.getBaseFileURL())
.addFormDataPart("compareFileURL", response.getCompareFileURL()); .addFormDataPart("compareFileURL", response.getCompareFileURL());
} else { } else {
;
RequestBody baseFile = RequestBody.create(MediaType.parse(Objects.requireNonNull(Files.probeContentType(response.getBaseFile().toPath()))), response.getBaseFile()); RequestBody baseFile = RequestBody.create(MediaType.parse(Objects.requireNonNull(Files.probeContentType(response.getBaseFile().toPath()))), response.getBaseFile());
RequestBody compareFile = RequestBody.create(MediaType.parse(Objects.requireNonNull(Files.probeContentType(response.getBaseFile().toPath()))), response.getCompareFile()); RequestBody compareFile = RequestBody.create(MediaType.parse(Objects.requireNonNull(Files.probeContentType(response.getBaseFile().toPath()))), response.getCompareFile());
builder = builder.addFormDataPart("baseFile", response.getBaseFile().getName(), baseFile) builder = builder.addFormDataPart("baseFile", response.getBaseFile().getName(), baseFile)
......
package cn.com.poc.thirdparty.resource.simultanous_interpretation.api;
import cn.com.poc.common.utils.Assert;
import cn.com.poc.common.utils.http.LocalHttpClient;
import cn.com.poc.thirdparty.resource.simultanous_interpretation.entity.AsrOfflineDetailResult;
import cn.com.poc.thirdparty.resource.simultanous_interpretation.entity.GetDetailResult;
import cn.com.poc.thirdparty.resource.simultanous_interpretation.entity.SpeechToTextResult;
import cn.com.yict.framemax.core.exception.BusinessException;
import com.google.gson.Gson;
import okhttp3.*;
import org.apache.http.HttpHeaders;
import org.apache.http.client.methods.HttpUriRequest;
import org.apache.http.client.methods.RequestBuilder;
import org.apache.http.entity.ContentType;
import org.apache.http.message.BasicHeader;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
import java.io.File;
import java.io.IOException;
import java.nio.file.Files;
import java.util.Objects;
import java.util.concurrent.TimeUnit;
/**
* 语音识别接口
*/
@Component
public class ASRApi {
private final Logger logger = LoggerFactory.getLogger(ASRApi.class);
@Value("${simultanous_interpretation.endpoint}")
private String ENDPOINT;
private String SPEECH_TO_TEXT_API = "/api/rest/asrRest/speechToText.json";
private String GET_DETAIL_API = "/api/rest/asrRest/getDetail.json";
public final OkHttpClient HTTP_CLIENT = new OkHttpClient().newBuilder()
.readTimeout(15, TimeUnit.SECONDS)
.build();
/**
* 语音识别 / 离线文件
*
* @param sessionId 唯一主键ID 长度不超过200位字符
* @param file 音频文件 不超过500M
* @return "success"提交成功
*/
public SpeechToTextResult speechToText(String sessionId, File file) {
Assert.notBlank(sessionId);
Assert.notNull(file);
MultipartBody.Builder builder = new MultipartBody.Builder().setType(MultipartBody.FORM);
try {
RequestBody baseFile = RequestBody.create(MediaType.parse(Objects.requireNonNull(Files.probeContentType(file.toPath()))), file);
builder.addFormDataPart("sessionId", sessionId);
builder.addFormDataPart("audio", file.getName(), baseFile);
MultipartBody body = builder.build();
Request request = new Request.Builder()
.url(ENDPOINT + SPEECH_TO_TEXT_API)
.method("POST", body)
.addHeader("Content-Type", "multipart/form-data")
.build();
String result = Objects.requireNonNull(HTTP_CLIENT.newCall(request).execute().body()).string();
Gson gson = new Gson();
return gson.fromJson(result, SpeechToTextResult.class);
} catch (IOException e) {
logger.error("调用ASR失败", e);
throw new BusinessException("调用ASR失败");
}
}
/**
* 获取离线语音识别状态
*
* @param sessionId 唯一主键
* @return
*/
public GetDetailResult getDetail(String sessionId) {
Assert.notBlank(sessionId);
HttpUriRequest httpUriRequest = RequestBuilder.post()
.setUri(ENDPOINT + GET_DETAIL_API)
// .addHeader(new BasicHeader(HttpHeaders.CONTENT_TYPE, ContentType.APPLICATION_JSON.toString()))
.addParameter("sessionId", sessionId)
.build();
return LocalHttpClient.executeJsonResult(httpUriRequest, GetDetailResult.class);
}
}
package cn.com.poc.thirdparty.resource.simultanous_interpretation.entity;
import java.util.List;
/**
* 离线语音识别状态
*
* @author alex.yao
* @date 2025/7/22
*/
public class AsrOfflineDetailResult {
private String sessionId;
/**
* 生成状态
* MeetingAssistantConstantEnum
*/
private String generateStatus;
private List<Translation> translation;
public String getSessionId() {
return sessionId;
}
public void setSessionId(String sessionId) {
this.sessionId = sessionId;
}
public String getGenerateStatus() {
return generateStatus;
}
public void setGenerateStatus(String generateStatus) {
this.generateStatus = generateStatus;
}
public List<Translation> getTranslation() {
return translation;
}
public void setTranslation(List<Translation> translation) {
this.translation = translation;
}
}
package cn.com.poc.thirdparty.resource.simultanous_interpretation.entity;
public class BaseResult {
private Long code;
private String message;
public Long getCode() {
return code;
}
public void setCode(Long code) {
this.code = code;
}
public String getMessage() {
return message;
}
public void setMessage(String message) {
this.message = message;
}
}
package cn.com.poc.thirdparty.resource.simultanous_interpretation.entity;
public class GetDetailResult extends BaseResult {
private AsrOfflineDetailResult data;
public AsrOfflineDetailResult getData() {
return data;
}
public void setData(AsrOfflineDetailResult data) {
this.data = data;
}
}
package cn.com.poc.thirdparty.resource.simultanous_interpretation.entity;
public class SpeechToTextResult extends BaseResult {
private String data;
public String getData() {
return data;
}
public void setData(String data) {
this.data = data;
}
}
package cn.com.poc.thirdparty.resource.simultanous_interpretation.entity;
/**
* @author alex.yao
* @date 2025/7/22
*/
public class Translation {
private Long number;
private Long startTime;
private Long endTime;
private Long spk;
private String content;
public Long getNumber() {
return number;
}
public void setNumber(Long number) {
this.number = number;
}
public Long getStartTime() {
return startTime;
}
public void setStartTime(Long startTime) {
this.startTime = startTime;
}
public Long getEndTime() {
return endTime;
}
public void setEndTime(Long endTime) {
this.endTime = endTime;
}
public Long getSpk() {
return spk;
}
public void setSpk(Long spk) {
this.spk = spk;
}
public String getContent() {
return content;
}
public void setContent(String content) {
this.content = content;
}
}
package cn.com.poc.thirdparty.resource.simultanous_interpretation.service;
import cn.com.poc.thirdparty.resource.simultanous_interpretation.entity.AsrOfflineDetailResult;
import cn.com.poc.thirdparty.resource.simultanous_interpretation.entity.GetDetailResult;
/**
* 语音识别服务
*/
public interface ASRService {
/**
* 语音识别 / 离线文件
*
* @param sessionId 唯一主键ID 长度不超过200位字符
* @param fileUrl 音频文件地址 文件不超过500M
* @return "success"提交成功
*/
String speechToText(String sessionId, String fileUrl);
/**
* 获取离线语音识别状态
*
* @param sessionId 唯一主键
* @return
*/
AsrOfflineDetailResult getDetail(String sessionId);
/**
* 获取离线语音识别状态 - 响应所有信息 [code,message,data]
*
* @param sessionId 唯一主键
* @return
*/
GetDetailResult getDetailByFullInformation(String sessionId);
}
package cn.com.poc.thirdparty.resource.simultanous_interpretation.service.impl;
import cn.com.poc.common.utils.DocumentLoad;
import cn.com.poc.thirdparty.resource.simultanous_interpretation.api.ASRApi;
import cn.com.poc.thirdparty.resource.simultanous_interpretation.entity.AsrOfflineDetailResult;
import cn.com.poc.thirdparty.resource.simultanous_interpretation.entity.GetDetailResult;
import cn.com.poc.thirdparty.resource.simultanous_interpretation.entity.SpeechToTextResult;
import cn.com.poc.thirdparty.resource.simultanous_interpretation.service.ASRService;
import cn.com.yict.framemax.core.exception.BusinessException;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import java.io.File;
@Service
public class ASRServiceImpl implements ASRService {
private final Logger logger = LoggerFactory.getLogger(ASRServiceImpl.class);
@Resource
private ASRApi asrApi;
@Override
public AsrOfflineDetailResult getDetail(String sessionId) {
GetDetailResult detail = asrApi.getDetail(sessionId);
if (detail == null) {
logger.error("---- 查询语音识别任务异常,响应结果为空 --------");
throw new BusinessException("查询语音识别任务异常");
}
if (0 != detail.getCode()) {
logger.error("---- 查询语音识别任务异常,message:{} -----", detail.getMessage());
throw new BusinessException("查询语音识别任务异常");
}
return detail.getData();
}
@Override
public GetDetailResult getDetailByFullInformation(String sessionId) {
return asrApi.getDetail(sessionId);
}
@Override
public String speechToText(String sessionId, String fileUrl) {
File file = DocumentLoad.downloadURLDocument(fileUrl);
SpeechToTextResult speechToTextResult = asrApi.speechToText(sessionId, file);
if (speechToTextResult == null) {
logger.error("-------- 语音识别任务异常,响应结果为空 ---------");
throw new BusinessException("语音识别任务异常");
}
if (0 != speechToTextResult.getCode()) {
logger.error("---- 语音识别任务异常,message:{} -----", speechToTextResult.getMessage());
throw new BusinessException("语音识别任务异常");
}
return speechToTextResult.getData();
}
}
...@@ -22,8 +22,10 @@ public interface AiWritingService { ...@@ -22,8 +22,10 @@ public interface AiWritingService {
* @param input * @param input
* @param knowledgeIds * @param knowledgeIds
* @param userId * @param userId
* @param enableSearchEngine
* @param enableDeepThinking
*/ */
void call(String dialoguesId, String fileUrl, String input, Integer[] knowledgeIds, Long userId) throws Exception; void call(String dialoguesId, String fileUrl, String input, Integer[] knowledgeIds, Long userId, Boolean enableSearchEngine, Boolean enableDeepThinking) throws Exception;
/** /**
......
package cn.com.poc.writing.aggregate.impl; package cn.com.poc.writing.aggregate.impl;
import cn.com.poc.agent_application.entity.CheckPluginUseEntity;
import cn.com.poc.agent_application.utils.AgentApplicationTools;
import cn.com.poc.expose.dto.DialoguesContextDto; import cn.com.poc.expose.dto.DialoguesContextDto;
import cn.com.poc.thirdparty.resource.demand.ai.entity.dialogue.FunctionCall;
import cn.com.poc.thirdparty.resource.demand.ai.entity.dialogue.Tool;
import cn.com.poc.thirdparty.resource.demand.ai.entity.dialogue.ToolFunction;
import cn.com.poc.thirdparty.resource.demand.ai.entity.function.FunctionCallResult;
import cn.com.poc.thirdparty.resource.demand.ai.function.AbstractFunctionResult;
import cn.com.poc.thirdparty.resource.demand.ai.function.web_seach.WebSearchFunction;
import cn.com.poc.thirdparty.resource.demand.ai.function.web_seach.WebSearchFunctionResult;
import cn.com.poc.writing.dto.AiWritingDialoguesContextDto; import cn.com.poc.writing.dto.AiWritingDialoguesContextDto;
import cn.com.poc.writing.entity.BizAiWritingDialoguesRecordEntity; import cn.com.poc.writing.entity.BizAiWritingDialoguesRecordEntity;
import cn.com.poc.writing.query.AiWritingDialoguesRecordQueryItem; import cn.com.poc.writing.query.AiWritingDialoguesRecordQueryItem;
...@@ -42,6 +51,7 @@ import cn.com.poc.writing.service.BizAiWritingExampleTypeService; ...@@ -42,6 +51,7 @@ import cn.com.poc.writing.service.BizAiWritingExampleTypeService;
import cn.com.yict.framemax.core.exception.BusinessException; import cn.com.yict.framemax.core.exception.BusinessException;
import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.collections4.CollectionUtils;
import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.StringUtils;
import org.jetbrains.annotations.Nullable;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
...@@ -92,9 +102,12 @@ public class AiWritingServiceImpl implements AiWritingService { ...@@ -92,9 +102,12 @@ public class AiWritingServiceImpl implements AiWritingService {
@Resource @Resource
private BizAiWritingExampleTypeService bizAiWritingExampleTypeService; private BizAiWritingExampleTypeService bizAiWritingExampleTypeService;
@Resource
private WebSearchFunction webSearchFunction;
@Override @Override
public void call(String dialoguesId, String fileUrl, String input, Integer[] knowledgeIds, Long userId) throws Exception { public void call(String dialoguesId, String fileUrl, String input, Integer[] knowledgeIds, Long userId, Boolean enableSearchEngine, Boolean enableDeepThinking) throws Exception {
BizAiDialoguesEntity bizAiDialoguesEntity = new BizAiDialoguesEntity(); BizAiDialoguesEntity bizAiDialoguesEntity = new BizAiDialoguesEntity();
bizAiDialoguesEntity.setDialoguesId(dialoguesId); bizAiDialoguesEntity.setDialoguesId(dialoguesId);
bizAiDialoguesEntity.setMemberId(userId); bizAiDialoguesEntity.setMemberId(userId);
...@@ -168,10 +181,14 @@ public class AiWritingServiceImpl implements AiWritingService { ...@@ -168,10 +181,14 @@ public class AiWritingServiceImpl implements AiWritingService {
sseUtil.send(JsonUtils.serialize(aiWritingTitleGenerationDto)); sseUtil.send(JsonUtils.serialize(aiWritingTitleGenerationDto));
} }
// 插件调用
ToolFunction toolFunction = getToolFunction(dialoguesId, input, enableSearchEngine, sseUtil);
//组装请求参数 //组装请求参数
List<Message> messages = buildMessages(dialoguesId, userId, input, fileUrl, knowledgeResult, aiWritingTitleGenerationDto); List<Message> messages = buildMessages(dialoguesId, userId, input, fileUrl, knowledgeResult, aiWritingTitleGenerationDto, toolFunction);
LargeModelResponse largeModelResponse = new LargeModelResponse(); LargeModelResponse largeModelResponse = new LargeModelResponse();
largeModelResponse.setModel("deepseek-chat"); largeModelResponse.setModel(enableDeepThinking ? "deepseek-chat" : "deepseek-v3");
largeModelResponse.setMessages(messages.toArray(new Message[0])); largeModelResponse.setMessages(messages.toArray(new Message[0]));
largeModelResponse.setStream(true); largeModelResponse.setStream(true);
BufferedReader bufferedReader = llmService.chatChunk(largeModelResponse); BufferedReader bufferedReader = llmService.chatChunk(largeModelResponse);
...@@ -205,6 +222,46 @@ public class AiWritingServiceImpl implements AiWritingService { ...@@ -205,6 +222,46 @@ public class AiWritingServiceImpl implements AiWritingService {
bizAiWritingDialoguesRecordService.save(assistantRecord); bizAiWritingDialoguesRecordService.save(assistantRecord);
} }
private ToolFunction getToolFunction(String dialoguesId, String input, Boolean enableSearchEngine, SSEUtil sseUtil) throws IOException {
ToolFunction toolFunction = null;
if (enableSearchEngine) {
List<Message> messages = new ArrayList<>();
Message message = new Message();
message.setRole("user");
message.setContent(input);
messages.add(message);
String[] unitIds = new String[1];
unitIds[0] = "web_search";
List<Tool> tools = AgentApplicationTools.buildFunctionConfig(null, "N", dialoguesId, dialoguesId, unitIds, "N");
CheckPluginUseEntity checkPluginUseEntity = AgentApplicationTools.checkPluginUse(messages, tools, null);
FunctionCallResult functionCallResult = checkPluginUseEntity.getFunctionCallResult();
if (functionCallResult != null) {
FunctionCall functionCall = functionCallResult.getFunctionCall();
if (functionCallResult.isNeed() && functionCall != null && "web_search".equals(functionCall.getName())) {
AbstractFunctionResult<List<WebSearchFunctionResult>> functionResult = webSearchFunction.doFunction(functionCall.getArguments(), dialoguesId, null, null);
if (functionResult != null && CollectionUtils.isNotEmpty(functionResult.getFunctionResult())) {
List<WebSearchFunctionResult> webSearchFunctionResults = functionResult.getFunctionResult();
if (CollectionUtils.isNotEmpty(webSearchFunctionResults)) {
toolFunction = new ToolFunction();
toolFunction.setResult(JsonUtils.serialize(webSearchFunctionResults));
toolFunction.setName("web_search");
toolFunction.setArguments(functionCall.getArguments());
toolFunction.setDisplayFormat("json");
LargeModelDemandResult result = new LargeModelDemandResult();
result.setCode("0");
result.setFunction(toolFunction);
result.setDbChainResult(null);
result.setKnowledgeContentResult(null);
sseUtil.send(JsonUtils.serialize(result));
}
}
}
}
}
return toolFunction;
}
@Override @Override
public List<AiWritingExampleDto> example(String type) throws Exception { public List<AiWritingExampleDto> example(String type) throws Exception {
...@@ -295,7 +352,7 @@ public class AiWritingServiceImpl implements AiWritingService { ...@@ -295,7 +352,7 @@ public class AiWritingServiceImpl implements AiWritingService {
return aiWritingTitleGenerationDto; return aiWritingTitleGenerationDto;
} }
private List<Message> buildMessages(String dialogsId, Long userId, String input, String fileUrl, List<KnowledgeContentResult> knowledgeContentResults, AiWritingTitleGenerationDto aiWritingTitleGenerationDto) throws Exception { private List<Message> buildMessages(String dialogsId, Long userId, String input, String fileUrl, List<KnowledgeContentResult> knowledgeContentResults, AiWritingTitleGenerationDto aiWritingTitleGenerationDto, ToolFunction toolFunction) throws Exception {
// 获取对话提示词 // 获取对话提示词
String promptCode = "AiWritingPrompt"; String promptCode = "AiWritingPrompt";
BizAgentApplicationGcConfigEntity documentDialoguePrompt = bizAgentApplicationGcConfigService.getByConfigCode(promptCode); BizAgentApplicationGcConfigEntity documentDialoguePrompt = bizAgentApplicationGcConfigService.getByConfigCode(promptCode);
...@@ -325,6 +382,9 @@ public class AiWritingServiceImpl implements AiWritingService { ...@@ -325,6 +382,9 @@ public class AiWritingServiceImpl implements AiWritingService {
} else { } else {
prompt = prompt.replace("${title}", StringUtils.EMPTY); prompt = prompt.replace("${title}", StringUtils.EMPTY);
} }
if (toolFunction != null) {
prompt = prompt.replace("${toolFunction}", JsonUtils.serialize(toolFunction));
}
prompt = prompt.replace("${fileContent}", fileContent); prompt = prompt.replace("${fileContent}", fileContent);
......
...@@ -26,6 +26,34 @@ public class AiWritingDto { ...@@ -26,6 +26,34 @@ public class AiWritingDto {
*/ */
private Integer[] knowledgeIds; private Integer[] knowledgeIds;
/**
* 是否启用搜索引擎
*/
private boolean enableSearchEngine;
/**
* 是否开启深度思考
*/
private boolean enableDeepThinking;
public boolean getEnableSearchEngine() {
return enableSearchEngine;
}
public void setEnableSearchEngine(boolean enableSearchEngine) {
this.enableSearchEngine = enableSearchEngine;
}
public boolean getEnableDeepThinking() {
return enableDeepThinking;
}
public void setEnableDeepThinking(boolean enableDeepThinking) {
this.enableDeepThinking = enableDeepThinking;
}
public String getDialoguesId() { public String getDialoguesId() {
return dialoguesId; return dialoguesId;
} }
......
...@@ -33,7 +33,8 @@ public class AiWritingRestImpl implements AiWritingRest { ...@@ -33,7 +33,8 @@ public class AiWritingRestImpl implements AiWritingRest {
throw new BusinessException("用户未登录"); throw new BusinessException("用户未登录");
} }
aiWritingService.call(aiWritingDto.getDialoguesId(), aiWritingDto.getFileUrl(), aiWritingService.call(aiWritingDto.getDialoguesId(), aiWritingDto.getFileUrl(),
aiWritingDto.getInput(), aiWritingDto.getKnowledgeIds(), userBaseEntity.getUserId()); aiWritingDto.getInput(), aiWritingDto.getKnowledgeIds(), userBaseEntity.getUserId(),
aiWritingDto.getEnableSearchEngine(), aiWritingDto.getEnableDeepThinking());
} }
......
simultanous_interpretation.endpoint=http://192.168.21.102:48100
\ No newline at end of file
simultanous_interpretation.endpoint=http://192.168.21.102:48100
\ No newline at end of file
simultanous_interpretation.endpoint=http://192.168.21.102:48100
\ No newline at end of file
simultanous_interpretation.endpoint=http://192.168.21.102:48100
\ No newline at end of file
package cn.com.poc.meeting;
import cn.com.poc.common.utils.JsonUtils;
import cn.com.poc.common.utils.UUIDTool;
import cn.com.poc.thirdparty.resource.simultanous_interpretation.entity.AsrOfflineDetailResult;
import cn.com.poc.thirdparty.resource.simultanous_interpretation.service.ASRService;
import cn.com.yict.framemax.core.spring.SingleContextInitializer;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import org.springframework.test.context.web.WebAppConfiguration;
import javax.annotation.Resource;
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(initializers = SingleContextInitializer.class)
@WebAppConfiguration
public class ASRTest {
@Resource
private ASRService asrService;
@Test
public void test_speechToText() {
String fileUrl = "https://gsst-poe-sit.gz.bcebos.com/data/20250811/1754897064286.wav";
String uuid = UUIDTool.getUUID();
System.out.println("sessionId : " + uuid);
String result = asrService.speechToText(uuid, fileUrl);
System.out.println(result);
}
@Test
public void test_asrGetDetail() {
String sessionId = "meeting_assistant_c9c7021dd0db4ecda6bf7eb3a325e745_4";
AsrOfflineDetailResult asrServiceDetail = asrService.getDetail(sessionId);
System.out.println(JsonUtils.serialize(asrServiceDetail));
}
}
package cn.com.poc.meeting;
import cn.com.poc.meeting.analysis.FeaturedQuestionAnalyzer;
import cn.com.poc.meeting.analysis.KeyWordAnalyzer;
import cn.com.poc.meeting.analysis.SummaryAnalyzer;
import cn.com.poc.meeting.analysis.ThemeAnalyzer;
import cn.com.poc.meeting.cache.KeyWordCounter;
import cn.com.yict.framemax.core.spring.SingleContextInitializer;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import org.springframework.test.context.web.WebAppConfiguration;
import java.util.List;
import java.util.Map;
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(initializers = SingleContextInitializer.class)
@WebAppConfiguration
public class AnalysisTest {
@Test
public void test_summaryAnalysis() {
String content = "要帮忙讲一下啊。哎,好,哎,吴老师你好,,就我大概给您介绍一下。\uD83D\uDE0A呃,那个就是我们其实需要用训练的那个数据,主要是两部分啊,一部分是呃咱们现在的那个录音的音频啊,另外一部分是这个基于这个录音音频转的那个文本啊,然后拿这个两部分的数据呢,其实那个模型它在训练的时候,它会提取其中的一些特征啊,主要是发音和识别的结果。因为我们其实是有base的模型的,然后需要去拿这个数据去在这个base模型上啊做进一步的用。优化,所以其实并不会用到这个呃数据里面的真实的数据啊啊,如果咱们自己有这个呃音频或者是转好了文本,我们也可以只提取这个特征,然后呃拿来做训练的这样的一个过程。嗯。这个是技术上,其实我们是不会去保证这个呃数据会泄露出去的这个问题啊。然后我们训练完了,其实并不需要留存这个数据。然后这因为它那个模型基于这个特征学完了之后,它自己就能具备这样识别的能力啊,只有当咱们还需要需要优化的时候,才还在会去做这个进一步的新一轮的训练啊。如果不需要优化的情况下,那么咱们就不需要再去训练它,也不需要依赖于原有的训练数据。啊,是这样的一个情况。\uD83C\uDFBC然后那个第二个就是刚才这那个张宇跟我沟通的时候,也提到了,咱们可能希望能签署保密协议啊,我们拿到这个数据之后,肯定会可以跟他们去配合签这个保密协议啊。然后我们整体的这个工就是处理这个数据的流程,就是我们拿到音频,然后会呃先给到我们自己的这个标注团队去标注这个语音转文本。然后就进入刚才说的这个训练的过程。训练了之后,我们就可以把这个数据给删除了。大概是这样的一个过程,就是整个的数据也不会出百度,都在百度的范围内。所以我们可以以百度的名义来签这个保密协议,来保证您们的这个数据安全。大概是这样的一个呃流程。您看有没有什么问题。呃老师我了解一下说如果签保密协议的话,咱这个流程大概要走多久啊。就咱们百度内部的话。啊,我们可以尽快推,就是我们其实也挺着急的对,但是呃我之前没走过,所以我也不太清楚大概要走多久啊。咱们有保密协议吗?就是呃我刚刚听张宇说,好像之前是有签过了。如果咱们有现成的保密协议,可能我们这边就是去走一下那个呃签署跟盖章的流程,应该就可以了。之前客户是跟我们签的,然后。可能不太一样,我们得跟客户再再讨论一下,说他们有没有针对于语音这一块的呃,之前签的不是语音的是吧,对,是整个整个数据保护的嗯嗯可能是针对语音。Oh.嗯嗯,那我这边大概对是这样,就是对,您可以先先问问客户,他们是不是有现成的一些保密协议。如果没有的话,我们也可以看看嗯,给一个模板或者怎么样的。行啊行啊,没问题啊。这里可以跟客户沟通一下。好嘞,哎,贾俊,我再问一下,就是他现在准备了多少个小时来着。然后刚才尹雪也跟我沟通,他说好像比如说一两百的话,不知道会不会我们模型的效果会不会好。所以这个他有跟我们讲说夫期可以给多少吗?\uD83D\uDE0A呃,目前还没有,就我们期望是说一两百还是太少是吧?嗯,对我们前面是说的要1500,后面好像要那六说有点难度,1500收据起嗯。然后银雪,咱们这边有一个最小值吗?是如果那个没有那个就是测试题的情况下,我们现在很难评估那个大概的量子是多少。因为这个结构呢。对以就是。看看能不能也和客户沟通一下,就是如果他能先找一些就是不含那个客户的这些敏感信息,像他的那个身份啊,然后他的业务的一些什么呃核心数据的那种。然后就看能不能先给我们两个小时的那个嗯就是这种脱敏的数据,然后我们先去摸一下那个base的模型的效果,如果我们大概知道这个再看那个业务上的表现是什么样的,然后我们大概能评估一些量级。区分明白就是老师我再问一下说呃你们对这个。音频有什么比较特别的要求吗?就类似于说呃一些呃音轨呀,或者说一些别的参数之类块嗯,嗯,应该就是那个8K的,然后就是咱们拿出来应该是。。什么格式我还忘了,就是呃可以是双轨的啊,就是我不知道咱们现在是双轨还是单轨,对应该嗯应该应该问题不太大啊,就是双轨还是单轨,主要是8K的这个数据就是没什么问题的那老师那里面如果夹杂一些呃英文呢。因为呃香港那边很多都是粤语和英文去夹杂着说的这种嗯,这这种没有影响。对我们这次其实也是希望因为。其实是那个实际的用户的交互情况本身就是会有这样很多的情况。所以我们也希望能够去正常识别,可以直接把这个数据给过来。然后我们在标注的时候也会对应的去标注,然后让这个模型能够去学习这种加答的问法。尽量把这个效果做上去的。嗯,好,明白了。嗯,就是说呃刚才您是提到说先有两个小时的一个素材给你们去评估一下,说后续大概是需要多。真正的粤语对对,是的,就如果现在咱如果要同步走保密流程,可能也还需要一点时间嘛。就是看能不能他先给出来两个小时脱敏的这样或者量就比较小,他是不是容易走这个流程,我们可以先评估。对要不然这样能比较准的给到这个数据,他可能就后续只有一次流程嘛。如果第一次拿了不够,后续还得再有第二次可能也比较麻烦。。哎,老师,那我理解一下,说,其实如果是普通的粤语素材,呃,在公网上其实有很多这种。这种素材的这种有什么不一样呢?就一定是要客户那边提供嘛哦,因为场景不一样,就是你最终实现的那个效果会差异还挺大的。就是呃我举一下就是非粤语的例子,就是普通话的例子哈,就是我们其实最开始有的那个呃语音的模型也是基于公网,包括像百度自身一些自己的业务。就是百度APP上也有很多那种呃语音搜索的场景的这样的数据,我们其实是会有一个大的这个模型的b的版本的。但是我们一开始去做这个客服业务的场景的时候,他因为像客服的业务里面会有一些专词。然后呃他的那个。大K的数据的一些表现可能还都会不一样。所以我们其实在呃一开始也是先在国内的这个运营商的行业先去做的这个训练,然后再迁移到比如说像金融的行业的时候,呃,就是量级会小很多。然后我们会也还会再去优化一个经营的版本出来。就是你如果希望在这个行业的这个场景下,它的效果能够能够达到比较好的这样的效果,还是需要它的这个实际的业务数据去做迭代和优化的这样一个过。就如果是那种通用的大模型,他可能只能打一个就是基本分及格分,这很难做到比较好。对像我们现在都要求这个自主在80%到85%这样的一个呃效果的指标上面。.哦,明白了,那他需不需要有一些呃,比如说一些客服行业的一些词汇的的素材啊,就是要材呃,对,这个最好是能有了,就是呃我们那个模型,就是训练完了之后,它其实在上层还有一个IDG的模块那个模块其实就是做一些热词。就比如说我们把一些这个行业里面的专词放进去。呃,你可以去相当于一个词。权重的作用,就是他会在这个权重这个词的权重上加强。然后再遇到这个query识别的时候,就会倾向于往这个词上面的这个识别的结果,就是会有一些这样的调优给到客户。但这个就就可以是部署到他那以后,他自己来作优化,就是可以不走这个b的基础模型。对,明白了嗯。好的,那我那我大概明白老师的意思这边的话就呃我们再去跟用户沟通一下,说他前期能提供一些什么样的素材出来。然后方便我们后期的预估啊或者说后期的训练。对,我们我们还是希望这个数据能尽快拿到。就是就是按刚才说的,如果大批量的数据,他们可能会流程或者周期比较长,我可以先看看能不能先给一点,你们先去看看效果。嗯,好的好的,这边我再跟用户沟通一下,就包括已知协议,我们也跟用户再沟通一下,看他什么样的方式是比较方便的。好嘞好嘞嗯,好的。好的,那谢谢需要,谢谢佳俊啊。问题再聊啊。好拜拜拜拜嗯嗯。";
SummaryAnalyzer summaryAnalyzer = new SummaryAnalyzer();
String summary = summaryAnalyzer.run(content);
System.out.println(summary);
}
@Test
public void test_themeAnalysis() {
String content = "数据训练及保密流程说明 \n" +
"(一)训练数据需求 \n" +
"需要两部分数据:录音音频和对应的转写文本。模型训练时仅提取发音特征和识别结果,不会使用真实数据内容。若有现成的音频或文本数据,可直接提取特征用于训练。 \n" +
"\n" +
"(二)数据安全与保密 \n" +
"训练完成后不保留原始数据,模型仅基于学到的特征进行识别。百度内部全程处理数据,可签署保密协议保障数据安全。若需优化模型,需重新训练但无需依赖旧数据。 \n" +
"\n" +
"(三)保密协议签署流程 \n" +
"需确认客户是否有现成保密协议模板(尤其是语音相关条款)。若没有,可提供百度模板或协商新协议。签署周期未明确,但会优先推进。 \n" +
"\n" +
"(四)数据量评估与测试 \n" +
"当前期望1500小时数据,但客户提供难度较大。建议先提供2小时脱敏数据(不含敏感信息)用于测试模型效果,再评估实际需求量。若数据不足可能需多次流程。 \n" +
"\n" +
"(五)音频技术要求 \n" +
"要求8K采样率,单轨/双轨均可。接受粤语与英文混杂的真实场景语音,标注时将保留混合表达以优化模型识别能力。 \n" +
"\n" +
"(六)行业数据特殊性 \n" +
"公网通用数据无法满足特定场景(如客服行业)效果,需客户提供实际业务数据。行业专词可通过独立模块(IDG)后期优化,但基础模型仍需行业数据训练以达到80%-85%准确率。";
ThemeAnalyzer themeAnalyzer = new ThemeAnalyzer();
String theme = themeAnalyzer.run(content);
System.out.println(theme);
}
@Test
public void test_keywordAnalysis() {
String content = "要帮忙讲一下啊。哎,好,哎,吴老师你好,,就我大概给您介绍一下。\uD83D\uDE0A呃,那个就是我们其实需要用训练的那个数据,主要是两部分啊,一部分是呃咱们现在的那个录音的音频啊,另外一部分是这个基于这个录音音频转的那个文本啊,然后拿这个两部分的数据呢,其实那个模型它在训练的时候,它会提取其中的一些特征啊,主要是发音和识别的结果。因为我们其实是有base的模型的,然后需要去拿这个数据去在这个base模型上啊做进一步的用。优化,所以其实并不会用到这个呃数据里面的真实的数据啊啊,如果咱们自己有这个呃音频或者是转好了文本,我们也可以只提取这个特征,然后呃拿来做训练的这样的一个过程。嗯。这个是技术上,其实我们是不会去保证这个呃数据会泄露出去的这个问题啊。然后我们训练完了,其实并不需要留存这个数据。然后这因为它那个模型基于这个特征学完了之后,它自己就能具备这样识别的能力啊,只有当咱们还需要需要优化的时候,才还在会去做这个进一步的新一轮的训练啊。如果不需要优化的情况下,那么咱们就不需要再去训练它,也不需要依赖于原有的训练数据。啊,是这样的一个情况。\uD83C\uDFBC然后那个第二个就是刚才这那个张宇跟我沟通的时候,也提到了,咱们可能希望能签署保密协议啊,我们拿到这个数据之后,肯定会可以跟他们去配合签这个保密协议啊。然后我们整体的这个工就是处理这个数据的流程,就是我们拿到音频,然后会呃先给到我们自己的这个标注团队去标注这个语音转文本。然后就进入刚才说的这个训练的过程。训练了之后,我们就可以把这个数据给删除了。大概是这样的一个过程,就是整个的数据也不会出百度,都在百度的范围内。所以我们可以以百度的名义来签这个保密协议,来保证您们的这个数据安全。大概是这样的一个呃流程。您看有没有什么问题。呃老师我了解一下说如果签保密协议的话,咱这个流程大概要走多久啊。就咱们百度内部的话。啊,我们可以尽快推,就是我们其实也挺着急的对,但是呃我之前没走过,所以我也不太清楚大概要走多久啊。咱们有保密协议吗?就是呃我刚刚听张宇说,好像之前是有签过了。如果咱们有现成的保密协议,可能我们这边就是去走一下那个呃签署跟盖章的流程,应该就可以了。之前客户是跟我们签的,然后。可能不太一样,我们得跟客户再再讨论一下,说他们有没有针对于语音这一块的呃,之前签的不是语音的是吧,对,是整个整个数据保护的嗯嗯可能是针对语音。Oh.嗯嗯,那我这边大概对是这样,就是对,您可以先先问问客户,他们是不是有现成的一些保密协议。如果没有的话,我们也可以看看嗯,给一个模板或者怎么样的。行啊行啊,没问题啊。这里可以跟客户沟通一下。好嘞,哎,贾俊,我再问一下,就是他现在准备了多少个小时来着。然后刚才尹雪也跟我沟通,他说好像比如说一两百的话,不知道会不会我们模型的效果会不会好。所以这个他有跟我们讲说夫期可以给多少吗?\uD83D\uDE0A呃,目前还没有,就我们期望是说一两百还是太少是吧?嗯,对我们前面是说的要1500,后面好像要那六说有点难度,1500收据起嗯。然后银雪,咱们这边有一个最小值吗?是如果那个没有那个就是测试题的情况下,我们现在很难评估那个大概的量子是多少。因为这个结构呢。对以就是。看看能不能也和客户沟通一下,就是如果他能先找一些就是不含那个客户的这些敏感信息,像他的那个身份啊,然后他的业务的一些什么呃核心数据的那种。然后就看能不能先给我们两个小时的那个嗯就是这种脱敏的数据,然后我们先去摸一下那个base的模型的效果,如果我们大概知道这个再看那个业务上的表现是什么样的,然后我们大概能评估一些量级。区分明白就是老师我再问一下说呃你们对这个。音频有什么比较特别的要求吗?就类似于说呃一些呃音轨呀,或者说一些别的参数之类块嗯,嗯,应该就是那个8K的,然后就是咱们拿出来应该是。。什么格式我还忘了,就是呃可以是双轨的啊,就是我不知道咱们现在是双轨还是单轨,对应该嗯应该应该问题不太大啊,就是双轨还是单轨,主要是8K的这个数据就是没什么问题的那老师那里面如果夹杂一些呃英文呢。因为呃香港那边很多都是粤语和英文去夹杂着说的这种嗯,这这种没有影响。对我们这次其实也是希望因为。其实是那个实际的用户的交互情况本身就是会有这样很多的情况。所以我们也希望能够去正常识别,可以直接把这个数据给过来。然后我们在标注的时候也会对应的去标注,然后让这个模型能够去学习这种加答的问法。尽量把这个效果做上去的。嗯,好,明白了。嗯,就是说呃刚才您是提到说先有两个小时的一个素材给你们去评估一下,说后续大概是需要多。真正的粤语对对,是的,就如果现在咱如果要同步走保密流程,可能也还需要一点时间嘛。就是看能不能他先给出来两个小时脱敏的这样或者量就比较小,他是不是容易走这个流程,我们可以先评估。对要不然这样能比较准的给到这个数据,他可能就后续只有一次流程嘛。如果第一次拿了不够,后续还得再有第二次可能也比较麻烦。。哎,老师,那我理解一下,说,其实如果是普通的粤语素材,呃,在公网上其实有很多这种。这种素材的这种有什么不一样呢?就一定是要客户那边提供嘛哦,因为场景不一样,就是你最终实现的那个效果会差异还挺大的。就是呃我举一下就是非粤语的例子,就是普通话的例子哈,就是我们其实最开始有的那个呃语音的模型也是基于公网,包括像百度自身一些自己的业务。就是百度APP上也有很多那种呃语音搜索的场景的这样的数据,我们其实是会有一个大的这个模型的b的版本的。但是我们一开始去做这个客服业务的场景的时候,他因为像客服的业务里面会有一些专词。然后呃他的那个。大K的数据的一些表现可能还都会不一样。所以我们其实在呃一开始也是先在国内的这个运营商的行业先去做的这个训练,然后再迁移到比如说像金融的行业的时候,呃,就是量级会小很多。然后我们会也还会再去优化一个经营的版本出来。就是你如果希望在这个行业的这个场景下,它的效果能够能够达到比较好的这样的效果,还是需要它的这个实际的业务数据去做迭代和优化的这样一个过。就如果是那种通用的大模型,他可能只能打一个就是基本分及格分,这很难做到比较好。对像我们现在都要求这个自主在80%到85%这样的一个呃效果的指标上面。.哦,明白了,那他需不需要有一些呃,比如说一些客服行业的一些词汇的的素材啊,就是要材呃,对,这个最好是能有了,就是呃我们那个模型,就是训练完了之后,它其实在上层还有一个IDG的模块那个模块其实就是做一些热词。就比如说我们把一些这个行业里面的专词放进去。呃,你可以去相当于一个词。权重的作用,就是他会在这个权重这个词的权重上加强。然后再遇到这个query识别的时候,就会倾向于往这个词上面的这个识别的结果,就是会有一些这样的调优给到客户。但这个就就可以是部署到他那以后,他自己来作优化,就是可以不走这个b的基础模型。对,明白了嗯。好的,那我那我大概明白老师的意思这边的话就呃我们再去跟用户沟通一下,说他前期能提供一些什么样的素材出来。然后方便我们后期的预估啊或者说后期的训练。对,我们我们还是希望这个数据能尽快拿到。就是就是按刚才说的,如果大批量的数据,他们可能会流程或者周期比较长,我可以先看看能不能先给一点,你们先去看看效果。嗯,好的好的,这边我再跟用户沟通一下,就包括已知协议,我们也跟用户再沟通一下,看他什么样的方式是比较方便的。好嘞好嘞嗯,好的。好的,那谢谢需要,谢谢佳俊啊。问题再聊啊。好拜拜拜拜嗯嗯。";
KeyWordAnalyzer keyWordAnalyzer = new KeyWordAnalyzer();
List<String> keywords = keyWordAnalyzer.run(content);
keywords.forEach(System.out::println);
Map<String, Integer> map = KeyWordCounter.keywordCount(content, keywords);
System.out.println("计数:" + map);
}
@Test
public void test_featuredQuestionAnalysis() {
String content = "要帮忙讲一下啊。哎,好,哎,吴老师你好,,就我大概给您介绍一下。\uD83D\uDE0A呃,那个就是我们其实需要用训练的那个数据,主要是两部分啊,一部分是呃咱们现在的那个录音的音频啊,另外一部分是这个基于这个录音音频转的那个文本啊,然后拿这个两部分的数据呢,其实那个模型它在训练的时候,它会提取其中的一些特征啊,主要是发音和识别的结果。因为我们其实是有base的模型的,然后需要去拿这个数据去在这个base模型上啊做进一步的用。优化,所以其实并不会用到这个呃数据里面的真实的数据啊啊,如果咱们自己有这个呃音频或者是转好了文本,我们也可以只提取这个特征,然后呃拿来做训练的这样的一个过程。嗯。这个是技术上,其实我们是不会去保证这个呃数据会泄露出去的这个问题啊。然后我们训练完了,其实并不需要留存这个数据。然后这因为它那个模型基于这个特征学完了之后,它自己就能具备这样识别的能力啊,只有当咱们还需要需要优化的时候,才还在会去做这个进一步的新一轮的训练啊。如果不需要优化的情况下,那么咱们就不需要再去训练它,也不需要依赖于原有的训练数据。啊,是这样的一个情况。\uD83C\uDFBC然后那个第二个就是刚才这那个张宇跟我沟通的时候,也提到了,咱们可能希望能签署保密协议啊,我们拿到这个数据之后,肯定会可以跟他们去配合签这个保密协议啊。然后我们整体的这个工就是处理这个数据的流程,就是我们拿到音频,然后会呃先给到我们自己的这个标注团队去标注这个语音转文本。然后就进入刚才说的这个训练的过程。训练了之后,我们就可以把这个数据给删除了。大概是这样的一个过程,就是整个的数据也不会出百度,都在百度的范围内。所以我们可以以百度的名义来签这个保密协议,来保证您们的这个数据安全。大概是这样的一个呃流程。您看有没有什么问题。呃老师我了解一下说如果签保密协议的话,咱这个流程大概要走多久啊。就咱们百度内部的话。啊,我们可以尽快推,就是我们其实也挺着急的对,但是呃我之前没走过,所以我也不太清楚大概要走多久啊。咱们有保密协议吗?就是呃我刚刚听张宇说,好像之前是有签过了。如果咱们有现成的保密协议,可能我们这边就是去走一下那个呃签署跟盖章的流程,应该就可以了。之前客户是跟我们签的,然后。可能不太一样,我们得跟客户再再讨论一下,说他们有没有针对于语音这一块的呃,之前签的不是语音的是吧,对,是整个整个数据保护的嗯嗯可能是针对语音。Oh.嗯嗯,那我这边大概对是这样,就是对,您可以先先问问客户,他们是不是有现成的一些保密协议。如果没有的话,我们也可以看看嗯,给一个模板或者怎么样的。行啊行啊,没问题啊。这里可以跟客户沟通一下。好嘞,哎,贾俊,我再问一下,就是他现在准备了多少个小时来着。然后刚才尹雪也跟我沟通,他说好像比如说一两百的话,不知道会不会我们模型的效果会不会好。所以这个他有跟我们讲说夫期可以给多少吗?\uD83D\uDE0A呃,目前还没有,就我们期望是说一两百还是太少是吧?嗯,对我们前面是说的要1500,后面好像要那六说有点难度,1500收据起嗯。然后银雪,咱们这边有一个最小值吗?是如果那个没有那个就是测试题的情况下,我们现在很难评估那个大概的量子是多少。因为这个结构呢。对以就是。看看能不能也和客户沟通一下,就是如果他能先找一些就是不含那个客户的这些敏感信息,像他的那个身份啊,然后他的业务的一些什么呃核心数据的那种。然后就看能不能先给我们两个小时的那个嗯就是这种脱敏的数据,然后我们先去摸一下那个base的模型的效果,如果我们大概知道这个再看那个业务上的表现是什么样的,然后我们大概能评估一些量级。区分明白就是老师我再问一下说呃你们对这个。音频有什么比较特别的要求吗?就类似于说呃一些呃音轨呀,或者说一些别的参数之类块嗯,嗯,应该就是那个8K的,然后就是咱们拿出来应该是。。什么格式我还忘了,就是呃可以是双轨的啊,就是我不知道咱们现在是双轨还是单轨,对应该嗯应该应该问题不太大啊,就是双轨还是单轨,主要是8K的这个数据就是没什么问题的那老师那里面如果夹杂一些呃英文呢。因为呃香港那边很多都是粤语和英文去夹杂着说的这种嗯,这这种没有影响。对我们这次其实也是希望因为。其实是那个实际的用户的交互情况本身就是会有这样很多的情况。所以我们也希望能够去正常识别,可以直接把这个数据给过来。然后我们在标注的时候也会对应的去标注,然后让这个模型能够去学习这种加答的问法。尽量把这个效果做上去的。嗯,好,明白了。嗯,就是说呃刚才您是提到说先有两个小时的一个素材给你们去评估一下,说后续大概是需要多。真正的粤语对对,是的,就如果现在咱如果要同步走保密流程,可能也还需要一点时间嘛。就是看能不能他先给出来两个小时脱敏的这样或者量就比较小,他是不是容易走这个流程,我们可以先评估。对要不然这样能比较准的给到这个数据,他可能就后续只有一次流程嘛。如果第一次拿了不够,后续还得再有第二次可能也比较麻烦。。哎,老师,那我理解一下,说,其实如果是普通的粤语素材,呃,在公网上其实有很多这种。这种素材的这种有什么不一样呢?就一定是要客户那边提供嘛哦,因为场景不一样,就是你最终实现的那个效果会差异还挺大的。就是呃我举一下就是非粤语的例子,就是普通话的例子哈,就是我们其实最开始有的那个呃语音的模型也是基于公网,包括像百度自身一些自己的业务。就是百度APP上也有很多那种呃语音搜索的场景的这样的数据,我们其实是会有一个大的这个模型的b的版本的。但是我们一开始去做这个客服业务的场景的时候,他因为像客服的业务里面会有一些专词。然后呃他的那个。大K的数据的一些表现可能还都会不一样。所以我们其实在呃一开始也是先在国内的这个运营商的行业先去做的这个训练,然后再迁移到比如说像金融的行业的时候,呃,就是量级会小很多。然后我们会也还会再去优化一个经营的版本出来。就是你如果希望在这个行业的这个场景下,它的效果能够能够达到比较好的这样的效果,还是需要它的这个实际的业务数据去做迭代和优化的这样一个过。就如果是那种通用的大模型,他可能只能打一个就是基本分及格分,这很难做到比较好。对像我们现在都要求这个自主在80%到85%这样的一个呃效果的指标上面。.哦,明白了,那他需不需要有一些呃,比如说一些客服行业的一些词汇的的素材啊,就是要材呃,对,这个最好是能有了,就是呃我们那个模型,就是训练完了之后,它其实在上层还有一个IDG的模块那个模块其实就是做一些热词。就比如说我们把一些这个行业里面的专词放进去。呃,你可以去相当于一个词。权重的作用,就是他会在这个权重这个词的权重上加强。然后再遇到这个query识别的时候,就会倾向于往这个词上面的这个识别的结果,就是会有一些这样的调优给到客户。但这个就就可以是部署到他那以后,他自己来作优化,就是可以不走这个b的基础模型。对,明白了嗯。好的,那我那我大概明白老师的意思这边的话就呃我们再去跟用户沟通一下,说他前期能提供一些什么样的素材出来。然后方便我们后期的预估啊或者说后期的训练。对,我们我们还是希望这个数据能尽快拿到。就是就是按刚才说的,如果大批量的数据,他们可能会流程或者周期比较长,我可以先看看能不能先给一点,你们先去看看效果。嗯,好的好的,这边我再跟用户沟通一下,就包括已知协议,我们也跟用户再沟通一下,看他什么样的方式是比较方便的。好嘞好嘞嗯,好的。好的,那谢谢需要,谢谢佳俊啊。问题再聊啊。好拜拜拜拜嗯嗯。";
FeaturedQuestionAnalyzer featuredQuestionAnalyzer = new FeaturedQuestionAnalyzer();
List<String> featuredQuestions = featuredQuestionAnalyzer.run(content);
featuredQuestions.forEach(System.out::println);
}
}
package cn.com.poc.meeting;
import cn.com.yict.framemax.core.spring.SingleContextInitializer;
import org.junit.runner.RunWith;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import org.springframework.test.context.web.WebAppConfiguration;
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(initializers = SingleContextInitializer.class)
@WebAppConfiguration
public class MeetingTest {
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment