Commit 2908e0d9 authored by R10's avatar R10

法律文书ai写作

parent a3a96294
......@@ -18,6 +18,8 @@ public enum AiDialoguesTypeEnum {
LEGAL_AFFAIRS("legal_affairs", "法务问答"),
AI_LEGAL_DOCUMENT_WRITING("ai_legal_document_writing", "法律文书写作"),
TRAVEL_BUSINESS("travel_business", "旅游业务"),
;
......
package cn.com.poc.law.dto;
/**
* @author alex.yao
* @date 2025/6/20
*/
public class AiLawDialoguesDto {
/**
* 对话id
*/
private String dialoguesId;
/**
* 问题
*/
private String input;
/**
* 文件地址
*/
private String fileUrl;
/**
* 知识库ids
*/
private Integer[] knowledgeIds;
/**
* 数据库ids
*/
private Integer[] databaseIds;
public String getDialoguesId() {
return dialoguesId;
}
public void setDialoguesId(String dialoguesId) {
this.dialoguesId = dialoguesId;
}
public String getInput() {
return input;
}
public void setInput(String input) {
this.input = input;
}
public String getFileUrl() {
return fileUrl;
}
public void setFileUrl(String fileUrl) {
this.fileUrl = fileUrl;
}
public Integer[] getKnowledgeIds() {
return knowledgeIds;
}
public void setKnowledgeIds(Integer[] knowledgeIds) {
this.knowledgeIds = knowledgeIds;
}
public Integer[] getDatabaseIds() {
return databaseIds;
}
public void setDatabaseIds(Integer[] databaseIds) {
this.databaseIds = databaseIds;
}
}
package cn.com.poc.law.rest;
import cn.com.poc.ai_finance.dto.AiFinanceDialoguesDto;
import cn.com.poc.law.dto.LegalFileDto;
import cn.com.yict.framemax.core.rest.BaseRest;
import cn.com.yict.framemax.web.permission.Access;
......@@ -21,5 +22,10 @@ public interface LegalRest extends BaseRest {
*/
String legalFileQuery(@RequestBody LegalFileDto legalFileDto);
/**
* ai对话
*/
void call(@RequestBody AiFinanceDialoguesDto dto) throws Exception;
}
package cn.com.poc.law.rest.impl;
import cn.com.poc.ai_finance.aggregate.AiFinanceService;
import cn.com.poc.ai_finance.dto.AiFinanceDialoguesDto;
import cn.com.poc.common.utils.Assert;
import cn.com.poc.common.utils.BlContext;
import cn.com.poc.law.dto.LegalFileDto;
import cn.com.poc.law.rest.LegalRest;
import cn.com.poc.support.security.oauth.entity.UserBaseEntity;
import cn.com.poc.thirdparty.resource.demand.ai.aggregate.LegalService;
import cn.com.poc.thirdparty.resource.demand.ai.entity.legal.LegalFileResponse;
import cn.com.poc.thirdparty.resource.demand.ai.entity.legal.LegalFileResult;
......@@ -37,4 +41,19 @@ public class LegalRestImpl implements LegalRest {
}
return legalFileResult.getFilePath();
}
@Resource
private AiFinanceService aiFinanceService;
@Override
public void call(AiFinanceDialoguesDto dto) throws Exception {
cn.hutool.core.lang.Assert.notNull(dto.getDialoguesId(), "对话id不能为空");
cn.hutool.core.lang.Assert.notNull(dto.getInput(), "问题不能为空");
UserBaseEntity userBaseEntity = BlContext.getCurrentUserNotException();
if (userBaseEntity == null) {
throw new BusinessException("用户未登录");
}
aiFinanceService.call(dto.getDialoguesId(), dto.getInput(), dto.getFileUrl(), dto.getKnowledgeIds(), dto.getDatabaseIds(), userBaseEntity.getUserId());
}
}
package cn.com.poc.law.service;
/**
* AI财务
*
* @author alex.yao
* @date 2025/6/20
*/
public interface AiLawService {
/**
* 调用AI财务服务
*
* @param dialoguesId 对话id
* @param input 问题
* @param fileUrl 文件地址
* @param knowledgeIds 知识库ids
* @param databaseIds 数据库ids
* @param userId 用户id
*/
void call(String dialoguesId, String input, String fileUrl, Integer[] knowledgeIds, Integer[] databaseIds, Long userId) throws Exception;
}
package cn.com.poc.law.service.impl;
import cn.com.poc.agent_application.aggregate.AgentApplicationService;
import cn.com.poc.agent_application.constant.AgentApplicationDialoguesRecordConstants;
import cn.com.poc.agent_application.entity.*;
import cn.com.poc.agent_application.service.BizAgentApplicationDialoguesRecordService;
import cn.com.poc.agent_application.service.BizAgentApplicationPublishService;
import cn.com.poc.agent_application.utils.AgentApplicationTools;
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.knowledge.aggregate.KnowledgeService;
import cn.com.poc.law.service.AiLawService;
import cn.com.poc.thirdparty.resource.demand.ai.constants.KnowledgeSearchTypeEnum;
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.function.FunctionCallResult;
import cn.com.yict.framemax.core.exception.BusinessException;
import cn.com.yict.framemax.frame.service.FmxParamConfigService;
import org.apache.commons.collections4.CollectionUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Service;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;
import javax.annotation.Resource;
import javax.servlet.http.HttpServletResponse;
import java.util.ArrayList;
import java.util.List;
/**
* @author alex.yao
* @date 2025/6/20
*/
@Service
public class AiLawServiceImpl implements AiLawService {
private final Logger logger = LoggerFactory.getLogger(AiLawServiceImpl.class);
private final String FMX_PARAM_AGENT_ID_CODE = "ai_legal_document_writing.agent_id";
@Resource
private FmxParamConfigService fmxParamConfigService;
@Resource
private BizAiDialoguesService bizAiDialoguesService;
@Resource
private AgentApplicationService agentApplicationService;
@Resource
private KnowledgeService knowledgeService;
@Resource
private BizAgentApplicationPublishService bizAgentApplicationPublishService;
@Resource
private BizAgentApplicationDialoguesRecordService bizAgentApplicationDialoguesRecordService;
@Override
public void call(String dialoguesId, String input, String fileUrl, Integer[] knowledgeIds, Integer[] databaseIds, Long userId) throws Exception {
String agentId = fmxParamConfigService.getParam(FMX_PARAM_AGENT_ID_CODE);
if (StringUtils.isBlank(agentId)) {
logger.error("获取AI财务对话agentId失败");
throw new BusinessException("对话异常");
}
// 获取Agent基本信息
BizAgentApplicationPublishEntity infoEntity = bizAgentApplicationPublishService.getByAgentId(agentId);
if (infoEntity == null) {
logger.error("获取AI财务对话agent信息失败");
throw new BusinessException("对话异常");
}
// 保存对话基础信息
BizAiDialoguesEntity bizAiDialoguesEntity = new BizAiDialoguesEntity();
bizAiDialoguesEntity.setMemberId(userId);
bizAiDialoguesEntity.setDialoguesId(dialoguesId);
bizAiDialoguesEntity.setIsDeleted(CommonConstant.IsDeleted.N);
List<BizAiDialoguesEntity> bizAiDialoguesEntities = bizAiDialoguesService.findByExample(bizAiDialoguesEntity, null);
if (CollectionUtils.isEmpty(bizAiDialoguesEntities)) {
logger.error("dialogues id 不存在,请重新创建");
throw new BusinessException("对话异常");
}
// 保存标题信息
if (StringUtils.isBlank(bizAiDialoguesEntities.get(0).getTitle())) {
BizAiDialoguesEntity portalDialoguesEntity = bizAiDialoguesEntities.get(0);
portalDialoguesEntity.setTitle(input);
bizAiDialoguesService.update(portalDialoguesEntity);
}
// 获取对话配置
String largeModel = infoEntity.getLargeModel();//获取模型
String agentSystem = infoEntity.getAgentSystem();//获取Agent角色词
List<Integer> kdIds = knowledgeService.getKdIdsByKnowledgeInfoIds(knowledgeIds);//获取知识库ids
List<Message> messages = AgentApplicationTools.buildMessage(dialoguesId, agentId, userId, input);//构建消息
List<Tool> tools = AgentApplicationTools.buildFunctionConfig(infoEntity.getVariableStructure(), infoEntity.getIsLongMemory(), dialoguesId, agentId, infoEntity.getUnitIds(), infoEntity.getIsDocumentParsing());//构建函数配置
List<String> fileUrls = new ArrayList<>();//构建文件链接
if (StringUtils.isNotBlank(fileUrl)) {
fileUrls.add(fileUrl);
}
CheckPluginUseEntity checkPluginUseEntity = AgentApplicationTools.checkPluginUse(messages, tools, fileUrls);//检查插件使用
FunctionCallResult functionCallResult = checkPluginUseEntity.getFunctionCallResult();//函数调用结果
boolean stream = true;//是否流式输出
KnowledgeSearchTypeEnum knowledgeSearchTypeEnum = KnowledgeSearchTypeEnum.valueOf(infoEntity.getKnowledgeSearchType());//知识库检索方式
KnowledgeSuperclassProblemConfig knowledgeSuperclassProblemConfig = new KnowledgeSuperclassProblemConfig();//知识库超纲配置
knowledgeSuperclassProblemConfig.setKnowledgeResponseType(infoEntity.getKnowledgeResponseType());//知识库回复类型
knowledgeSuperclassProblemConfig.setKnowledgeCustomResponse(infoEntity.getKnowledgeCustomResponse());//知识库自定义回复
// 记录用户输入时间戳
Long inputTimestamp = System.currentTimeMillis();
// 调用对话Agent
ServletRequestAttributes servletRequestAttributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
HttpServletResponse response = servletRequestAttributes.getResponse();
AgentResultEntity agentResultEntity = agentApplicationService.callAgentApplication(agentId,
dialoguesId,
largeModel,
agentSystem,
kdIds.toArray(new Integer[0]),
databaseIds,
infoEntity.getCommunicationTurn(),
infoEntity.getTopP(),
infoEntity.getTemperature(),
messages,
tools,
functionCallResult,
stream,
infoEntity.getKnowledgeSimilarity(),
infoEntity.getKnowledgeNResult(),
knowledgeSearchTypeEnum,
knowledgeSuperclassProblemConfig,
response
);
//保存对话记录
//用户输入记录
BizAgentApplicationDialoguesRecordEntity inputRecord = new BizAgentApplicationDialoguesRecordEntity();
inputRecord.setAgentId(agentId);
inputRecord.setMemberId(userId);
inputRecord.setContent(input);
inputRecord.setDialogsId(dialoguesId);
inputRecord.setRole(AgentApplicationDialoguesRecordConstants.ROLE.USER);
inputRecord.setTimestamp(inputTimestamp);
bizAgentApplicationDialoguesRecordService.save(inputRecord);
//AI输出记录
BizAgentApplicationDialoguesRecordEntity outputRecord = new BizAgentApplicationDialoguesRecordEntity();
outputRecord.setRole(AgentApplicationDialoguesRecordConstants.ROLE.ASSISTANT);
outputRecord.setAgentId(infoEntity.getAgentId());
outputRecord.setDialogsId(dialoguesId);
outputRecord.setMemberId(userId);
if (agentResultEntity.getFunction() != null) {
outputRecord.setFunction(JsonUtils.serialize(agentResultEntity.getFunction()));
}
outputRecord.setTimestamp(System.currentTimeMillis());
outputRecord.setContent(agentResultEntity.getMessage());
outputRecord.setReasoningContent(agentResultEntity.getReasoningContent());
bizAgentApplicationDialoguesRecordService.save(outputRecord);
}
}
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