作者 dong

智能助手配置界面

正在显示 13 个修改的文件 包含 326 行增加89 行删除
package org.jeecg.modules.airag.airagchatsetting.controller;
import java.util.*;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.commons.lang3.StringUtils;
import org.jeecg.common.api.vo.Result;
import org.jeecg.common.system.query.QueryGenerator;
import org.jeecg.modules.airag.airagchatsetting.entity.AiragChatsetting;
import org.jeecg.modules.airag.airagchatsetting.service.IAiragChatsettingService;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import lombok.extern.slf4j.Slf4j;
import org.jeecg.common.system.base.controller.JeecgController;
import org.jeecg.modules.airag.app.entity.AiragButton;
import org.jeecg.modules.airag.app.service.IAiragButtonService;
import org.jeecg.modules.airag.llm.entity.AiragKnowledge;
import org.jeecg.modules.airag.llm.entity.AiragModel;
import org.jeecg.modules.airag.llm.service.IAiragKnowledgeService;
import org.jeecg.modules.airag.llm.service.IAiragModelService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.servlet.ModelAndView;
import io.swagger.v3.oas.annotations.tags.Tag;
import io.swagger.v3.oas.annotations.Operation;
import org.jeecg.common.aspect.annotation.AutoLog;
import org.apache.shiro.authz.annotation.RequiresPermissions;
/**
* @Description: 智能助手配置
* @Author: jeecg-boot
* @Date: 2025-06-27
* @Version: V1.0
*/
@Tag(name="智能助手配置")
@RestController
@RequestMapping("/airagchatsetting/airagChatsetting")
@Slf4j
public class AiragChatsettingController extends JeecgController<AiragChatsetting, IAiragChatsettingService> {
@Autowired
private IAiragChatsettingService airagChatsettingService;
@Autowired
private IAiragModelService airagModelService;
@Autowired
private IAiragKnowledgeService airagKnowledgeService;
@Autowired
private IAiragButtonService airagButtonService;
/**
* 获取字段数据
*
* @param airagChatsetting
* @return
*/
//@AutoLog(value = "智能助手配置-分页列表查询")
@Operation(summary="智能助手配置-获取字段数据")
@GetMapping(value = "/getConfigData")
public Result<Map<String, Object>> getConfigData(AiragChatsetting airagChatsetting) {
Map<String, Object> result = new HashMap<>();
// 获取配置数据(只取第一条)
AiragChatsetting airagChatsettingConfig = airagChatsettingService.getOne(new QueryWrapper<>());
if (airagChatsettingConfig == null) {
airagChatsettingConfig = new AiragChatsetting();
}
// 处理按钮ID为数组
if (StringUtils.isNotBlank(airagChatsettingConfig.getButtonId())) {
airagChatsettingConfig.setButtonIds(Arrays.asList(airagChatsettingConfig.getButtonId().split(",")));
}
// 直接查询选项数据
result.put("airagChatsettingConfig", airagChatsettingConfig);
result.put("embeddingOptions", getModelOptions("EMBED"));
result.put("llmOptions", getModelOptions("LLM"));
result.put("knowledgeOptions", getKnowledgeOptions());
result.put("buttonOptions", getButtonOptions());
return Result.OK(result);
}
/**
* 获取模型名称
* @params modelType 根据对应的type来获取对应的模型名称
*/
private List<Map<String, Object>> getModelOptions (String modelType) {
List<AiragModel> modelList = airagModelService.list(
new QueryWrapper<AiragModel>().
eq("model_type", modelType));
List<Map<String, Object>> options = new ArrayList<>();
for(AiragModel airagModel : modelList) {
Map<String, Object> option = new HashMap<>();
option.put("value", airagModel.getId());
option.put("label", airagModel.getModelName());
options.add(option);
}
return options;
}
/**
* 获取知识库名称
*/
private List<Map<String, Object>> getKnowledgeOptions () {
List<AiragKnowledge> knowledgeList = airagKnowledgeService.list();
List<Map<String, Object>> options = new ArrayList<>();
for(AiragKnowledge airagKnowledge : knowledgeList) {
Map<String, Object> option = new HashMap<>();
option.put("value", airagKnowledge.getId());
option.put("label", airagKnowledge.getName());
options.add(option);
}
return options;
}
/**
* 获取按钮名称
*/
private List<Map<String, Object>> getButtonOptions () {
List<AiragButton> buttonList = airagButtonService.list();
List<Map<String, Object>> options = new ArrayList<>();
for(AiragButton airagButton : buttonList) {
Map<String, Object> option = new HashMap<>();
option.put("value", airagButton.getId());
option.put("label", airagButton.getButtonName());
options.add(option);
}
return options;
}
/**
* 编辑
*
* @param config
* @return
*/
@AutoLog(value = "智能助手配置-编辑")
@Operation(summary="智能助手配置-编辑")
@RequiresPermissions("airagchatsetting:airag_chatsetting:saveConfig")
@RequestMapping(value = "/saveConfig", method = {RequestMethod.PUT,RequestMethod.POST})
public Result<String> saveConfig(@RequestBody AiragChatsetting config) {
// 处理多选按钮ID
if (config.getButtonIds() != null && !config.getButtonIds().isEmpty()) {
config.setButtonId(String.join(",", config.getButtonIds()));
} else {
config.setButtonId(null);
}
if(StringUtils.isNotBlank(config.getId())){
airagChatsettingService.updateById(config);
return Result.OK("更新成功!");
}else{
if(airagChatsettingService.list().isEmpty()){
return Result.OK("只需要一条配置信息");
}
config.setId(UUID.randomUUID().toString());
airagChatsettingService.save(config);
return Result.OK("创建成功!");
}
}
}
... ...
package org.jeecg.modules.airag.airagchatsetting.entity;
import java.io.Serializable;
import java.io.UnsupportedEncodingException;
import java.util.Date;
import java.math.BigDecimal;
import java.util.List;
import com.baomidou.mybatisplus.annotation.*;
import org.jeecg.common.constant.ProvinceCityArea;
import org.jeecg.common.util.SpringContextUtils;
import lombok.Data;
import com.fasterxml.jackson.annotation.JsonFormat;
import org.springframework.format.annotation.DateTimeFormat;
import org.jeecgframework.poi.excel.annotation.Excel;
import org.jeecg.common.aspect.annotation.Dict;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.EqualsAndHashCode;
import lombok.experimental.Accessors;
/**
* @Description: 智能助手配置
* @Author: jeecg-boot
* @Date: 2025-06-27
* @Version: V1.0
*/
@Data
@TableName("airag_chatsetting")
@Accessors(chain = true)
@EqualsAndHashCode(callSuper = false)
@Schema(description="智能助手配置")
public class AiragChatsetting implements Serializable {
private static final long serialVersionUID = 1L;
/**主键*/
@TableId(type = IdType.ASSIGN_ID)
@Schema(description = "主键")
private java.lang.String id;
/**创建人*/
@Schema(description = "创建人")
private java.lang.String createBy;
/**创建日期*/
@JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd HH:mm:ss")
@DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss")
@Schema(description = "创建日期")
private java.util.Date createTime;
/**更新人*/
@Schema(description = "更新人")
private java.lang.String updateBy;
/**更新日期*/
@JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd HH:mm:ss")
@DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss")
@Schema(description = "更新日期")
private java.util.Date updateTime;
/**所属部门*/
@Schema(description = "所属部门")
private java.lang.String sysOrgCode;
/**向量模型id*/
@Excel(name = "向量模型id", width = 15)
@Schema(description = "向量模型id")
private java.lang.String embeddingId;
/**大语言模型id*/
@Excel(name = "大语言模型id", width = 15)
@Schema(description = "大语言模型id")
private java.lang.String llmId;
/**知识库id*/
@Excel(name = "知识库id", width = 15)
@Schema(description = "知识库id")
private java.lang.String knowledgeId;
/**头像*/
@Excel(name = "头像", width = 15)
@Schema(description = "头像")
private java.lang.String image;
/**按钮id*/
@Excel(name = "按钮id", width = 15)
@Schema(description = "按钮id")
private java.lang.String buttonId;
/**按钮id*/
@Excel(name = "提示词", width = 15)
@Schema(description = "提示词")
private java.lang.String prompt;
// 新增:临时字段(非数据库字段)
@TableField(exist = false)
private List<String> buttonIds;
}
... ...
package org.jeecg.modules.airag.airagchatsetting.mapper;
import org.jeecg.modules.airag.airagchatsetting.entity.AiragChatsetting;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
/**
* @Description: 智能助手配置
* @Author: jeecg-boot
* @Date: 2025-06-27
* @Version: V1.0
*/
public interface AiragChatsettingMapper extends BaseMapper<AiragChatsetting> {
}
... ...
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="org.jeecg.modules.airag.airagchatsetting.mapper.AiragChatsettingMapper">
</mapper>
\ No newline at end of file
... ...
package org.jeecg.modules.airag.airagchatsetting.service;
import org.jeecg.modules.airag.airagchatsetting.entity.AiragChatsetting;
import com.baomidou.mybatisplus.extension.service.IService;
/**
* @Description: 智能助手配置
* @Author: jeecg-boot
* @Date: 2025-06-27
* @Version: V1.0
*/
public interface IAiragChatsettingService extends IService<AiragChatsetting> {
}
... ...
package org.jeecg.modules.airag.airagchatsetting.service.impl;
import org.jeecg.modules.airag.airagchatsetting.entity.AiragChatsetting;
import org.jeecg.modules.airag.airagchatsetting.mapper.AiragChatsettingMapper;
import org.jeecg.modules.airag.airagchatsetting.service.IAiragChatsettingService;
import org.springframework.stereotype.Service;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
/**
* @Description: 智能助手配置
* @Author: jeecg-boot
* @Date: 2025-06-27
* @Version: V1.0
*/
@Service
public class AiragChatsettingServiceImpl extends ServiceImpl<AiragChatsettingMapper, AiragChatsetting> implements IAiragChatsettingService {
}
... ...
... ... @@ -55,7 +55,6 @@ public class AiragButtonController extends JeecgController<AiragButton, IAiragBu
QueryWrapper<AiragButton> queryWrapper = QueryGenerator.initQueryWrapper(airagButton, req.getParameterMap());
Page<AiragButton> page = new Page<AiragButton>(pageNo, pageSize);
IPage<AiragButton> pageList = airagButtonService.page(page, queryWrapper);
// pageList.setRecords(airagButtonService. findAll(airagButton));
return Result.OK(pageList);
}
... ...
... ... @@ -50,13 +50,12 @@ import java.util.stream.Collectors;
@RequestMapping("/airaglog/airagLog")
@Slf4j
public class AiragLogController extends JeecgController<AiragLog, IAiragLogService> {
@Autowired
private IAiragLogService airagLogService;
@Autowired
private IAiragLogService airagLogService;
@Autowired
private IAiragModelService airagModelService;
@Autowired
private DataSourceConfig dataSourceConfig;
private IAiragModelService airagModelService;
@Autowired
private IQuestionEmbeddingService questionEmbeddingService;
... ...
... ... @@ -94,20 +94,17 @@ public class EmbeddingsController {
@RequiresPermissions("embeddings:embeddings:add")
@PostMapping(value = "/add")
public Result<String> add(@RequestBody Embeddings embeddings) {
// embeddingsService.save(Embeddings);
// 1. 构建完整的metadata
Map<String, Object> metadata = embeddings.getMetadata();
SnowflakeGenerator snowflakeGenerator = new SnowflakeGenerator();
metadata.put("docName", embeddings.getDocName());
String docId = String.valueOf(snowflakeGenerator.next());
metadata.put("docId", docId); // 自动生成唯一文档ID
metadata.put("index", "0"); // 默认索引位置为0
metadata.put("index", "0"); // 默认索引位置为0
// 2. 设置到embeddings对象
embeddings.setMetadata(metadata);
/*// 3. 生成向量嵌入(实际项目中应调用嵌入模型API)
embeddings.setEmbedding(generateEmbedding(embeddings.getText()));
*/
System.out.println(new SnowflakeGenerator().next());
embeddingsService.insert(embeddings);
... ... @@ -125,15 +122,6 @@ public class EmbeddingsController {
@RequiresPermissions("embeddings:embeddings:edit")
@RequestMapping(value = "/edit", method = {RequestMethod.PUT, RequestMethod.POST})
public Result<String> edit(@RequestBody Embeddings embeddings) {
// embeddingsService.updateById(Embeddings);
// Map<String, Object> metadata = embeddings.getMetadata();
// SnowflakeGenerator snowflakeGenerator = new SnowflakeGenerator();
// metadata.put("docName", embeddings.getDocName());
// String docId = String.valueOf(snowflakeGenerator.next());
// metadata.put("docId", docId); // 自动生成唯一文档ID
// metadata.put("index", "0");
// // 2. 设置到embeddings对象
// embeddings.setMetadata(metadata);
embeddingsService.update(embeddings);
return Result.OK("编辑成功!");
}
... ... @@ -149,7 +137,6 @@ public class EmbeddingsController {
@RequiresPermissions("embeddings:embeddings:delete")
@DeleteMapping(value = "/delete")
public Result<String> delete(@RequestParam(name = "id", required = true) String id) {
//embeddingsService.removeById(id);
embeddingsService.deleteById(id);
return Result.OK("删除成功!");
}
... ... @@ -179,10 +166,6 @@ public class EmbeddingsController {
@Operation(summary = "Embeddings-通过id查询")
@GetMapping(value = "/queryById")
public Result<Embeddings> queryById(@RequestParam(name = "id", required = true) String id) {
// Embeddings Embeddings = embeddingsService.getById(id);
// if(Embeddings==null) {
// return Result.error("未找到对应数据");
// }
embeddingsService.findById(id);
return Result.OK();
}
... ...
... ... @@ -151,7 +151,7 @@ public class PgVectorMapper {
List<Object> params = new ArrayList<>();
if(StringUtils.isNotBlank(embeddings.getText())){
sql.append(" AND text = ?"); // 使用 ILIKE 进行不区分大小写的模糊匹配
sql.append(" AND text = ?");
params.add(embeddings.getText());
}
... ... @@ -185,7 +185,6 @@ public class PgVectorMapper {
PreparedStatement stmt = conn.prepareStatement(sql)) {
stmt.setString(1, UUID.randomUUID().toString());
// stmt.setObject(2, new PGvector(record.getEmbedding()));
Response<Embedding> embedding = aiModelUtils.getEmbedding(embedId, record.getText());
stmt.setObject(2, embedding.content().vector());
stmt.setObject(3, record.getText());
... ... @@ -211,7 +210,7 @@ public class PgVectorMapper {
//获取record数据中的docId
Map<String, Object> map = record.getMetadata();
System.out.println("map = " + map);
mataData.put("docId", record.getDocId()); // 自动生成唯一文档ID
mataData.put("docId", record.getDocId());
mataData.put("index", "0");
System.out.println("原始数据: " + mataData);
... ...
... ... @@ -128,7 +128,7 @@ public class QuestionEmbeddingMapper {
List<Object> params = new ArrayList<>();
if(StringUtils.isNotBlank(questionEmbedding.getQuestion())){
sql.append(" AND question = ?"); // 使用 ILIKE 进行不区分大小写的模糊匹配
sql.append(" AND question = ?");
params.add(questionEmbedding.getQuestion());
}
... ... @@ -208,13 +208,6 @@ public class QuestionEmbeddingMapper {
stmt.setString(1, record.getText());
stmt.setString(2, record.getQuestion());
stmt.setString(3, record.getAnswer());
/* PGobject jsonObject = new PGobject();
jsonObject.setType("json");
JSONObject mataData = new JSONObject();
// mataData.put("knowledgeId",record.getKnowledgeId());
jsonObject.setValue(mataData.toJSONString());*/
stmt.setObject(4, record.getMetadata());
Response<Embedding> embedding = aiModelUtils.getEmbedding(embedId, record.getQuestion());
... ... @@ -401,48 +394,4 @@ public class QuestionEmbeddingMapper {
}
}
// 获取知识库名称映射
private Map<String, String> getKnowledgeNameMap(List<QuestionEmbedding> records) {
// 提取所有知识库ID
Set<String> knowledgeIds = records.stream()
.map(QuestionEmbedding::getKnowledgeId)
.filter(Objects::nonNull)
.collect(Collectors.toSet());
if (knowledgeIds.isEmpty()) {
return Collections.emptyMap();
}
// 从 MySQL 查询知识库名称
Map<String, String> knowledgeNameMap = new HashMap<>();
try (Connection mysqlConn = getMysqlConnection()) {
String placeholders = String.join(",", Collections.nCopies(knowledgeIds.size(), "?"));
String sql = String.format("SELECT id, name FROM airag_knowledge WHERE id IN (%s)", placeholders);
try (PreparedStatement stmt = mysqlConn.prepareStatement(sql)) {
int index = 1;
for (String id : knowledgeIds) {
stmt.setString(index++, id);
}
try (ResultSet rs = stmt.executeQuery()) {
while (rs.next()) {
knowledgeNameMap.put(rs.getString("id"), rs.getString("name"));
}
}
}
} catch (SQLException e) {
log.error("查询知识库名称失败", e);
}
return knowledgeNameMap;
}
// 获取 MySQL 连接
private Connection getMysqlConnection() throws SQLException {
String url = "jdbc:mysql://localhost:3306/jeecg-boot-dev?characterEncoding=UTF-8&useUnicode=true&useSSL=false&tinyInt1isBit=false&allowPublicKeyRetrieval=true&serverTimezone=Asia/Shanghai";
String user = "root";
String password = "123456";
return DriverManager.getConnection(url, user, password);
}
}
\ No newline at end of file
... ...
... ... @@ -18,7 +18,6 @@ import java.util.Map;
* @Version: V1.0
*/
public interface IAiragLogService extends IService<AiragLog> {
// List<AiragLog> getLogListWithModelName();
void saveToQuestionLibrary(AiragLog log) throws JsonProcessingException;
void saveToEmbeddingLibrary(AiragLog log) throws JsonProcessingException;
... ... @@ -26,6 +25,4 @@ public interface IAiragLogService extends IService<AiragLog> {
IPage<AiragLog> pageList(AiragLog airagLog, Page<AiragLog> page);
Map<String, Object> getStatistics(String rangeType, String startTime, String endTime);
// List<T> list(Page<AiragLog> page, QueryWrapper<AiragLog> queryWrapper);
}
... ...
... ... @@ -60,7 +60,7 @@ public class AiragLogServiceImpl extends ServiceImpl<AiragLogMapper, AiragLog> i
SnowflakeGenerator snowflakeGenerator = new SnowflakeGenerator();
metadata.put("docName", "");
String docId = String.valueOf(snowflakeGenerator.next());
metadata.put("docId", docId); // 自动生成唯一文档ID
metadata.put("docId", docId);
metadata.put("knowledgeId", questionEmbedding.getKnowledgeId());
// 使用 Jackson 序列化 Map 到 JSON
ObjectMapper mapper = new ObjectMapper();
... ... @@ -74,8 +74,6 @@ public class AiragLogServiceImpl extends ServiceImpl<AiragLogMapper, AiragLog> i
@Override
public void saveToEmbeddingLibrary(AiragLog log) throws JsonProcessingException {
// 这里实现将问题和回答存入问题库数据表的逻辑
// 假设问题库数据表的实体类为 QuestionLibrary,Mapper 接口为 QuestionLibraryMapper
Embeddings embeddings = new Embeddings();
embeddings.setText(log.getAnswer());
embeddings.setKnowledgeId(log.getKnowledgeId());
... ... @@ -144,13 +142,12 @@ public class AiragLogServiceImpl extends ServiceImpl<AiragLogMapper, AiragLog> i
startTime,
endTime
);
// 8.对按钮进行今日本周本月本年的实时查询和根据选定日期范围内的查询
// 9. 获取最近12个月的月度数据
// 8. 获取最近12个月的月度数据
List<Map<String, Object>> monthlyData = airagLogMapper.getMonthlyCount();
// 10. 添加前一天数据
// 9. 添加数据
result.put("yesterdayCount", yesterdayCount);
result.put("growthRate", Math.round(growthRate * 100.0) / 100.0); // 保留两位小数
result.put("todayCount", todayCount);
... ...