mirror of
https://gitcode.com/ageerle/ruoyi-ai.git
synced 2026-04-09 17:57:32 +00:00
Merge branch 'main' of https://github.com/ageerle/ruoyi-ai
This commit is contained in:
@@ -17,10 +17,7 @@ public interface VectorStoreService {
|
|||||||
|
|
||||||
void createSchema(String kid,String modelName);
|
void createSchema(String kid,String modelName);
|
||||||
|
|
||||||
void removeByKid(String kid,String modelName);
|
void removeById(String id,String modelName);
|
||||||
|
|
||||||
void removeByDocId(String kid,String docId,String modelName);
|
|
||||||
|
|
||||||
void removeByKidAndFid(String kid, String fid,String modelName);
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -9,8 +9,6 @@ import dev.langchain4j.model.openai.OpenAiEmbeddingModel;
|
|||||||
import dev.langchain4j.store.embedding.EmbeddingMatch;
|
import dev.langchain4j.store.embedding.EmbeddingMatch;
|
||||||
import dev.langchain4j.store.embedding.EmbeddingSearchRequest;
|
import dev.langchain4j.store.embedding.EmbeddingSearchRequest;
|
||||||
import dev.langchain4j.store.embedding.EmbeddingStore;
|
import dev.langchain4j.store.embedding.EmbeddingStore;
|
||||||
import dev.langchain4j.store.embedding.filter.Filter;
|
|
||||||
import dev.langchain4j.store.embedding.filter.comparison.IsEqualTo;
|
|
||||||
import dev.langchain4j.store.embedding.weaviate.WeaviateEmbeddingStore;
|
import dev.langchain4j.store.embedding.weaviate.WeaviateEmbeddingStore;
|
||||||
import lombok.RequiredArgsConstructor;
|
import lombok.RequiredArgsConstructor;
|
||||||
import lombok.SneakyThrows;
|
import lombok.SneakyThrows;
|
||||||
@@ -22,9 +20,7 @@ import org.ruoyi.service.VectorStoreService;
|
|||||||
import org.springframework.stereotype.Service;
|
import org.springframework.stereotype.Service;
|
||||||
|
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.HashMap;
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Map;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 向量库管理
|
* 向量库管理
|
||||||
@@ -40,6 +36,7 @@ public class VectorStoreServiceImpl implements VectorStoreService {
|
|||||||
|
|
||||||
private EmbeddingStore<TextSegment> embeddingStore;
|
private EmbeddingStore<TextSegment> embeddingStore;
|
||||||
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void createSchema(String kid, String modelName) {
|
public void createSchema(String kid, String modelName) {
|
||||||
String protocol = configService.getConfigValue("weaviate", "protocol");
|
String protocol = configService.getConfigValue("weaviate", "protocol");
|
||||||
@@ -48,7 +45,7 @@ public class VectorStoreServiceImpl implements VectorStoreService {
|
|||||||
embeddingStore = WeaviateEmbeddingStore.builder()
|
embeddingStore = WeaviateEmbeddingStore.builder()
|
||||||
.scheme(protocol)
|
.scheme(protocol)
|
||||||
.host(host)
|
.host(host)
|
||||||
.objectClass(className + kid)
|
.objectClass(className+kid)
|
||||||
.scheme(protocol)
|
.scheme(protocol)
|
||||||
.avoidDups(true)
|
.avoidDups(true)
|
||||||
.consistencyLevel("ALL")
|
.consistencyLevel("ALL")
|
||||||
@@ -61,14 +58,9 @@ public class VectorStoreServiceImpl implements VectorStoreService {
|
|||||||
EmbeddingModel embeddingModel = getEmbeddingModel(storeEmbeddingBo.getEmbeddingModelName(),
|
EmbeddingModel embeddingModel = getEmbeddingModel(storeEmbeddingBo.getEmbeddingModelName(),
|
||||||
storeEmbeddingBo.getApiKey(), storeEmbeddingBo.getBaseUrl());
|
storeEmbeddingBo.getApiKey(), storeEmbeddingBo.getBaseUrl());
|
||||||
List<String> chunkList = storeEmbeddingBo.getChunkList();
|
List<String> chunkList = storeEmbeddingBo.getChunkList();
|
||||||
for (int i = 0; i < chunkList.size(); i++) {
|
for (String s : chunkList) {
|
||||||
Map<String, Object> dataSchema = new HashMap<>();
|
Embedding embedding = embeddingModel.embed(s).content();
|
||||||
dataSchema.put("kid", storeEmbeddingBo.getKid());
|
TextSegment segment = TextSegment.from(s);
|
||||||
dataSchema.put("docId", storeEmbeddingBo.getDocId());
|
|
||||||
dataSchema.put("fid", storeEmbeddingBo.getFids().get(i));
|
|
||||||
Embedding embedding = embeddingModel.embed(chunkList.get(i)).content();
|
|
||||||
TextSegment segment = TextSegment.from(chunkList.get(i));
|
|
||||||
segment.metadata().putAll(dataSchema);
|
|
||||||
embeddingStore.add(embedding, segment);
|
embeddingStore.add(embedding, segment);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -78,13 +70,10 @@ public class VectorStoreServiceImpl implements VectorStoreService {
|
|||||||
createSchema(queryVectorBo.getKid(), queryVectorBo.getVectorModelName());
|
createSchema(queryVectorBo.getKid(), queryVectorBo.getVectorModelName());
|
||||||
EmbeddingModel embeddingModel = getEmbeddingModel(queryVectorBo.getEmbeddingModelName(),
|
EmbeddingModel embeddingModel = getEmbeddingModel(queryVectorBo.getEmbeddingModelName(),
|
||||||
queryVectorBo.getApiKey(), queryVectorBo.getBaseUrl());
|
queryVectorBo.getApiKey(), queryVectorBo.getBaseUrl());
|
||||||
// Filter simpleFilter = new IsEqualTo("kid", queryVectorBo.getKid());
|
|
||||||
Embedding queryEmbedding = embeddingModel.embed(queryVectorBo.getQuery()).content();
|
Embedding queryEmbedding = embeddingModel.embed(queryVectorBo.getQuery()).content();
|
||||||
EmbeddingSearchRequest embeddingSearchRequest = EmbeddingSearchRequest.builder()
|
EmbeddingSearchRequest embeddingSearchRequest = EmbeddingSearchRequest.builder()
|
||||||
.queryEmbedding(queryEmbedding)
|
.queryEmbedding(queryEmbedding)
|
||||||
.maxResults(queryVectorBo.getMaxResults())
|
.maxResults(queryVectorBo.getMaxResults())
|
||||||
// 添加过滤条件
|
|
||||||
// .filter(simpleFilter)
|
|
||||||
.build();
|
.build();
|
||||||
List<EmbeddingMatch<TextSegment>> matches = embeddingStore.search(embeddingSearchRequest).matches();
|
List<EmbeddingMatch<TextSegment>> matches = embeddingStore.search(embeddingSearchRequest).matches();
|
||||||
List<String> results = new ArrayList<>();
|
List<String> results = new ArrayList<>();
|
||||||
@@ -94,29 +83,10 @@ public class VectorStoreServiceImpl implements VectorStoreService {
|
|||||||
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void removeByKid(String kid, String modelName) {
|
public void removeById(String id, String modelName) {
|
||||||
createSchema(kid, modelName);
|
createSchema(id, modelName);
|
||||||
// 根据条件删除向量数据
|
// 根据条件删除向量数据
|
||||||
Filter simpleFilter = new IsEqualTo("kid", kid);
|
embeddingStore.remove(id);
|
||||||
embeddingStore.removeAll(simpleFilter);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void removeByDocId(String kid, String docId, String modelName) {
|
|
||||||
createSchema(kid, modelName);
|
|
||||||
// 根据条件删除向量数据
|
|
||||||
Filter simpleFilterByDocId = new IsEqualTo("docId", docId);
|
|
||||||
embeddingStore.removeAll(simpleFilterByDocId);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void removeByKidAndFid(String kid, String fid, String modelName) {
|
|
||||||
createSchema(kid, modelName);
|
|
||||||
// 根据条件删除向量数据
|
|
||||||
Filter simpleFilterByKid = new IsEqualTo("kid", kid);
|
|
||||||
Filter simpleFilterFid = new IsEqualTo("fid", fid);
|
|
||||||
Filter simpleFilterByAnd = Filter.and(simpleFilterFid, simpleFilterByKid);
|
|
||||||
embeddingStore.removeAll(simpleFilterByAnd);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
@@ -40,7 +40,6 @@ public class ChatMessageController extends BaseController {
|
|||||||
/**
|
/**
|
||||||
* 查询聊天消息列表
|
* 查询聊天消息列表
|
||||||
*/
|
*/
|
||||||
@SaCheckPermission("system:message:list")
|
|
||||||
@GetMapping("/list")
|
@GetMapping("/list")
|
||||||
public TableDataInfo<ChatMessageVo> list(ChatMessageBo bo, PageQuery pageQuery) {
|
public TableDataInfo<ChatMessageVo> list(ChatMessageBo bo, PageQuery pageQuery) {
|
||||||
return chatMessageService.queryPageList(bo, pageQuery);
|
return chatMessageService.queryPageList(bo, pageQuery);
|
||||||
@@ -49,7 +48,6 @@ public class ChatMessageController extends BaseController {
|
|||||||
/**
|
/**
|
||||||
* 导出聊天消息列表
|
* 导出聊天消息列表
|
||||||
*/
|
*/
|
||||||
@SaCheckPermission("system:message:export")
|
|
||||||
@Log(title = "聊天消息", businessType = BusinessType.EXPORT)
|
@Log(title = "聊天消息", businessType = BusinessType.EXPORT)
|
||||||
@PostMapping("/export")
|
@PostMapping("/export")
|
||||||
public void export(ChatMessageBo bo, HttpServletResponse response) {
|
public void export(ChatMessageBo bo, HttpServletResponse response) {
|
||||||
@@ -62,7 +60,6 @@ public class ChatMessageController extends BaseController {
|
|||||||
*
|
*
|
||||||
* @param id 主键
|
* @param id 主键
|
||||||
*/
|
*/
|
||||||
@SaCheckPermission("system:message:query")
|
|
||||||
@GetMapping("/{id}")
|
@GetMapping("/{id}")
|
||||||
public R<ChatMessageVo> getInfo(@NotNull(message = "主键不能为空")
|
public R<ChatMessageVo> getInfo(@NotNull(message = "主键不能为空")
|
||||||
@PathVariable Long id) {
|
@PathVariable Long id) {
|
||||||
@@ -72,7 +69,6 @@ public class ChatMessageController extends BaseController {
|
|||||||
/**
|
/**
|
||||||
* 新增聊天消息
|
* 新增聊天消息
|
||||||
*/
|
*/
|
||||||
@SaCheckPermission("system:message:add")
|
|
||||||
@Log(title = "聊天消息", businessType = BusinessType.INSERT)
|
@Log(title = "聊天消息", businessType = BusinessType.INSERT)
|
||||||
@RepeatSubmit()
|
@RepeatSubmit()
|
||||||
@PostMapping()
|
@PostMapping()
|
||||||
@@ -84,7 +80,6 @@ public class ChatMessageController extends BaseController {
|
|||||||
/**
|
/**
|
||||||
* 修改聊天消息
|
* 修改聊天消息
|
||||||
*/
|
*/
|
||||||
@SaCheckPermission("system:message:edit")
|
|
||||||
@Log(title = "聊天消息", businessType = BusinessType.UPDATE)
|
@Log(title = "聊天消息", businessType = BusinessType.UPDATE)
|
||||||
@RepeatSubmit()
|
@RepeatSubmit()
|
||||||
@PutMapping()
|
@PutMapping()
|
||||||
@@ -97,7 +92,6 @@ public class ChatMessageController extends BaseController {
|
|||||||
*
|
*
|
||||||
* @param ids 主键串
|
* @param ids 主键串
|
||||||
*/
|
*/
|
||||||
@SaCheckPermission("system:message:remove")
|
|
||||||
@Log(title = "聊天消息", businessType = BusinessType.DELETE)
|
@Log(title = "聊天消息", businessType = BusinessType.DELETE)
|
||||||
@DeleteMapping("/{ids}")
|
@DeleteMapping("/{ids}")
|
||||||
public R<Void> remove(@NotEmpty(message = "主键不能为空")
|
public R<Void> remove(@NotEmpty(message = "主键不能为空")
|
||||||
|
|||||||
@@ -41,7 +41,6 @@ public class ChatSessionController extends BaseController {
|
|||||||
/**
|
/**
|
||||||
* 查询会话管理列表
|
* 查询会话管理列表
|
||||||
*/
|
*/
|
||||||
@SaCheckPermission("system:session:list")
|
|
||||||
@GetMapping("/list")
|
@GetMapping("/list")
|
||||||
public TableDataInfo<ChatSessionVo> list(ChatSessionBo bo, PageQuery pageQuery) {
|
public TableDataInfo<ChatSessionVo> list(ChatSessionBo bo, PageQuery pageQuery) {
|
||||||
if(!LoginHelper.isLogin()){
|
if(!LoginHelper.isLogin()){
|
||||||
@@ -56,7 +55,6 @@ public class ChatSessionController extends BaseController {
|
|||||||
/**
|
/**
|
||||||
* 导出会话管理列表
|
* 导出会话管理列表
|
||||||
*/
|
*/
|
||||||
@SaCheckPermission("system:session:export")
|
|
||||||
@Log(title = "会话管理", businessType = BusinessType.EXPORT)
|
@Log(title = "会话管理", businessType = BusinessType.EXPORT)
|
||||||
@PostMapping("/export")
|
@PostMapping("/export")
|
||||||
public void export(ChatSessionBo bo, HttpServletResponse response) {
|
public void export(ChatSessionBo bo, HttpServletResponse response) {
|
||||||
@@ -69,7 +67,6 @@ public class ChatSessionController extends BaseController {
|
|||||||
*
|
*
|
||||||
* @param id 主键
|
* @param id 主键
|
||||||
*/
|
*/
|
||||||
@SaCheckPermission("system:session:query")
|
|
||||||
@GetMapping("/{id}")
|
@GetMapping("/{id}")
|
||||||
public R<ChatSessionVo> getInfo(@NotNull(message = "主键不能为空")
|
public R<ChatSessionVo> getInfo(@NotNull(message = "主键不能为空")
|
||||||
@PathVariable Long id) {
|
@PathVariable Long id) {
|
||||||
@@ -79,7 +76,6 @@ public class ChatSessionController extends BaseController {
|
|||||||
/**
|
/**
|
||||||
* 新增会话管理
|
* 新增会话管理
|
||||||
*/
|
*/
|
||||||
@SaCheckPermission("system:session:add")
|
|
||||||
@Log(title = "会话管理", businessType = BusinessType.INSERT)
|
@Log(title = "会话管理", businessType = BusinessType.INSERT)
|
||||||
@RepeatSubmit()
|
@RepeatSubmit()
|
||||||
@PostMapping()
|
@PostMapping()
|
||||||
@@ -92,7 +88,6 @@ public class ChatSessionController extends BaseController {
|
|||||||
/**
|
/**
|
||||||
* 修改会话管理
|
* 修改会话管理
|
||||||
*/
|
*/
|
||||||
@SaCheckPermission("system:session:edit")
|
|
||||||
@Log(title = "会话管理", businessType = BusinessType.UPDATE)
|
@Log(title = "会话管理", businessType = BusinessType.UPDATE)
|
||||||
@RepeatSubmit()
|
@RepeatSubmit()
|
||||||
@PutMapping()
|
@PutMapping()
|
||||||
@@ -105,7 +100,6 @@ public class ChatSessionController extends BaseController {
|
|||||||
*
|
*
|
||||||
* @param ids 主键串
|
* @param ids 主键串
|
||||||
*/
|
*/
|
||||||
@SaCheckPermission("system:session:remove")
|
|
||||||
@Log(title = "会话管理", businessType = BusinessType.DELETE)
|
@Log(title = "会话管理", businessType = BusinessType.DELETE)
|
||||||
@DeleteMapping("/{ids}")
|
@DeleteMapping("/{ids}")
|
||||||
public R<Void> remove(@NotEmpty(message = "主键不能为空")
|
public R<Void> remove(@NotEmpty(message = "主键不能为空")
|
||||||
|
|||||||
@@ -177,13 +177,11 @@ public class KnowledgeInfoServiceImpl implements IKnowledgeInfoService {
|
|||||||
@Transactional(rollbackFor = Exception.class)
|
@Transactional(rollbackFor = Exception.class)
|
||||||
public void removeKnowledge(String id) {
|
public void removeKnowledge(String id) {
|
||||||
Map<String,Object> map = new HashMap<>();
|
Map<String,Object> map = new HashMap<>();
|
||||||
map.put("kid",id);
|
KnowledgeInfo knowledgeInfo = baseMapper.selectById(id);
|
||||||
List<KnowledgeInfoVo> knowledgeInfoList = baseMapper.selectVoByMap(map);
|
check(knowledgeInfo);
|
||||||
check(knowledgeInfoList);
|
map.put("kid",knowledgeInfo.getKid());
|
||||||
// 删除向量库信息
|
// 删除向量数据
|
||||||
// knowledgeInfoList.forEach(knowledgeInfoVo -> {
|
vectorStoreService.removeById(String.valueOf(knowledgeInfo.getId()),knowledgeInfo.getVectorModelName());
|
||||||
// vectorStoreService.removeByKid(String.valueOf(knowledgeInfoVo.getId()),knowledgeInfoVo.getVectorModelName());
|
|
||||||
// });
|
|
||||||
// 删除附件和知识片段
|
// 删除附件和知识片段
|
||||||
fragmentMapper.deleteByMap(map);
|
fragmentMapper.deleteByMap(map);
|
||||||
attachMapper.deleteByMap(map);
|
attachMapper.deleteByMap(map);
|
||||||
@@ -256,14 +254,12 @@ public class KnowledgeInfoServiceImpl implements IKnowledgeInfoService {
|
|||||||
/**
|
/**
|
||||||
* 检查用户是否有删除知识库权限
|
* 检查用户是否有删除知识库权限
|
||||||
*
|
*
|
||||||
* @param knowledgeInfoList 知识库列表
|
* @param knowledgeInfo 知识库
|
||||||
*/
|
*/
|
||||||
public void check(List<KnowledgeInfoVo> knowledgeInfoList) {
|
public void check( KnowledgeInfo knowledgeInfo) {
|
||||||
LoginUser loginUser = LoginHelper.getLoginUser();
|
LoginUser loginUser = LoginHelper.getLoginUser();
|
||||||
for (KnowledgeInfoVo knowledgeInfoVo : knowledgeInfoList) {
|
if (!knowledgeInfo.getUid().equals(loginUser.getUserId())) {
|
||||||
if (!knowledgeInfoVo.getUid().equals(loginUser.getUserId())) {
|
throw new SecurityException("权限不足");
|
||||||
throw new SecurityException("权限不足");
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user