feat: 支持多租户多模型对话及文档去重优化

This commit is contained in:
2026-04-16 15:47:37 +08:00
parent 4ead3f82cf
commit 27b1dd3c27
34 changed files with 2188 additions and 315 deletions

132
consts/model/config_type.go Normal file
View File

@@ -0,0 +1,132 @@
package model
import (
"github.com/gogf/gf/v2/util/gconv"
)
var (
ModelConfigTypeVectorArk = newModelConfigType(gconv.PtrString("ark"), "字节跳动火山引擎方舟大模型服务")
ModelConfigTypeVectorOllama = newModelConfigType(gconv.PtrString("ollama"), "Ollama 本地大模型运行工具")
ModelConfigTypeVectorOpenAI = newModelConfigType(gconv.PtrString("openAI"), "OpenAI 官方大模型服务")
ModelConfigTypeVectorQianfan = newModelConfigType(gconv.PtrString("qianfan"), "百度文心一言千帆大模型平台")
ModelConfigTypeVectorTencentCloud = newModelConfigType(gconv.PtrString("tencentCloud"), "腾讯云大模型服务")
ModelConfigTypeVectorDashScope = newModelConfigType(gconv.PtrString("dashScope"), "阿里云通义千问 DashScope 平台")
ModelConfigTypeChatArk = newModelConfigType(gconv.PtrString("ark"), "字节跳动火山引擎方舟大模型服务")
ModelConfigTypeChatArkBot = newModelConfigType(gconv.PtrString("arkBot"), "火山引擎 ARK Bot 智能体服务")
ModelConfigTypeChatClaude = newModelConfigType(gconv.PtrString("claude"), "Anthropic Claude 系列大模型")
ModelConfigTypeChatDeepSeek = newModelConfigType(gconv.PtrString("deepSeek"), "DeepSeek 深度求索大模型")
ModelConfigTypeChatOllama = newModelConfigType(gconv.PtrString("ollama"), "Ollama 本地大模型运行工具")
ModelConfigTypeChatOpenAI = newModelConfigType(gconv.PtrString("openAI"), "OpenAI 官方大模型服务")
ModelConfigTypeChatQianfan = newModelConfigType(gconv.PtrString("qianfan"), "百度文心一言千帆大模型平台")
ModelConfigTypeChatQwen = newModelConfigType(gconv.PtrString("qwen"), "腾讯文心千问大模型平台")
)
type ModelConfigType *string
type modelConfigType struct {
code ModelConfigType
desc string
}
func (s modelConfigType) Code() ModelConfigType {
return s.code
}
func (s modelConfigType) Desc() string {
return s.desc
}
func newModelConfigType(code ModelConfigType, desc string) modelConfigType {
return modelConfigType{code: code, desc: desc}
}
func GetVectorDescByCode(code ModelConfigType) string {
switch *code {
case *ModelConfigTypeVectorArk.Code():
return ModelConfigTypeVectorArk.Desc()
case *ModelConfigTypeVectorOllama.Code():
return ModelConfigTypeVectorOllama.Desc()
case *ModelConfigTypeVectorOpenAI.Code():
return ModelConfigTypeVectorOpenAI.Desc()
case *ModelConfigTypeVectorQianfan.Code():
return ModelConfigTypeVectorQianfan.Desc()
case *ModelConfigTypeVectorTencentCloud.Code():
return ModelConfigTypeVectorTencentCloud.Desc()
case *ModelConfigTypeVectorDashScope.Code():
return ModelConfigTypeVectorDashScope.Desc()
}
return "未知类型"
}
func GetChatDescByCode(code ModelConfigType) string {
switch *code {
case *ModelConfigTypeChatArk.Code():
return ModelConfigTypeChatArk.Desc()
case *ModelConfigTypeChatArkBot.Code():
return ModelConfigTypeChatArkBot.Desc()
case *ModelConfigTypeChatClaude.Code():
return ModelConfigTypeChatClaude.Desc()
case *ModelConfigTypeChatDeepSeek.Code():
return ModelConfigTypeChatDeepSeek.Desc()
case *ModelConfigTypeChatOllama.Code():
return ModelConfigTypeChatOllama.Desc()
case *ModelConfigTypeChatOpenAI.Code():
return ModelConfigTypeChatOpenAI.Desc()
case *ModelConfigTypeChatQianfan.Code():
return ModelConfigTypeChatQianfan.Desc()
case *ModelConfigTypeChatQwen.Code():
return ModelConfigTypeChatQwen.Desc()
}
return "未知类型"
}
type GetModelConfigTypeEnumRes struct {
Options []ConfigTypeKeyValue `json:"options"`
}
type ConfigTypeKeyValue struct {
Key interface{} `json:"key"` // 对应原有常量值
Value interface{} `json:"value"` // 对应描述信息
}
func GetAllModelConfigTypeEnums(modelType ModelType) *GetModelConfigTypeEnumRes {
// 枚举列表
var list []modelConfigType
if *modelType == *ModelTypeVector.Code() {
list = []modelConfigType{
ModelConfigTypeVectorArk,
ModelConfigTypeVectorOllama,
ModelConfigTypeVectorOpenAI,
ModelConfigTypeVectorQianfan,
ModelConfigTypeVectorTencentCloud,
ModelConfigTypeVectorDashScope,
}
}
if *modelType == *ModelTypeChat.Code() {
list = []modelConfigType{
ModelConfigTypeChatArk,
ModelConfigTypeChatArkBot,
ModelConfigTypeChatClaude,
ModelConfigTypeChatDeepSeek,
ModelConfigTypeChatOllama,
ModelConfigTypeChatOpenAI,
ModelConfigTypeChatQianfan,
ModelConfigTypeChatQwen,
}
}
// 组装返回格式
options := make([]ConfigTypeKeyValue, 0, len(list))
for _, item := range list {
options = append(options, ConfigTypeKeyValue{
Key: *item.Code(),
Value: item.Desc(),
})
}
return &GetModelConfigTypeEnumRes{
Options: options,
}
}

66
consts/model/type.go Normal file
View File

@@ -0,0 +1,66 @@
package model
import "github.com/gogf/gf/v2/util/gconv"
var (
ModelTypeVector = newModelType(gconv.PtrString("vector"), "向量")
ModelTypeChat = newModelType(gconv.PtrString("chat"), "对话")
)
type ModelType *string
type modelType struct {
code ModelType
desc string
}
func (s modelType) Code() ModelType {
return s.code
}
func (s modelType) Desc() string {
return s.desc
}
func newModelType(code ModelType, desc string) modelType {
return modelType{code: code, desc: desc}
}
func GetModelTypeDescByCode(code ModelType) string {
switch *code {
case *ModelTypeVector.Code():
return ModelTypeVector.Desc()
case *ModelTypeChat.Code():
return ModelTypeChat.Desc()
}
return "未知类型"
}
type GetModelTypeEnumRes struct {
Options []TypeKeyValue `json:"options"`
}
type TypeKeyValue struct {
Key interface{} `json:"key"` // 对应原有常量值
Value interface{} `json:"value"` // 对应描述信息
}
func GetAllModelTypeEnums() *GetModelTypeEnumRes {
// 枚举列表
list := []modelType{
//ModelTypeVector,
ModelTypeChat,
}
// 组装返回格式
options := make([]TypeKeyValue, 0, len(list))
for _, item := range list {
options = append(options, TypeKeyValue{
Key: *item.Code(),
Value: item.Desc(),
})
}
return &GetModelTypeEnumRes{
Options: options,
}
}

View File

@@ -2,17 +2,10 @@ package public
const GmqMsgPluginsName = "gmq_msg"
const KnowledgeLockEsKey = "rag_binary:knowledge:lock:knowledgeIdEs-%v"
const KnowledgeLockSqlKey = "rag_binary:knowledge:lock:knowledgeIdSql-%v"
const KnowledgeContentHashEsKey = "rag_binary:knowledge:knowledgeId:contentHashEs-%v"
const KnowledgeContentHashSqlKey = "rag_binary:knowledge:knowledgeId:contentHashSql-%v"
const (
KnowledgeDocumentVectorStatusTopic = "knowledge:document:vector:status:stream"
KnowledgeDocumentVectorStatusConsumer = "knowledge-document-vector-status-consumer"
KnowledgeDocumentVectorStatusBatchSize = 1
KnowledgeDocumentVectorStatusAutoAck = false
)
const KnowledgeLockEsKey = "knowledge:lock:knowledgeIdEs-%v"
const KnowledgeLockSqlKey = "knowledge:lock:knowledgeIdSql-%v"
const KnowledgeContentHashEsKey = "knowledge:knowledgeId:contentHashEs-%v"
const KnowledgeContentHashSqlKey = "knowledge:knowledgeId:contentHashSql-%v"
const (
KnowledgeDocumentVectorTopic = "knowledge:document:vector:stream" // 请求 Stream 键名与发消息的key一致

View File

@@ -12,6 +12,7 @@ const (
TableNameDataset = "dataset"
TableNameKeyword = "keyword"
TableNameTask = "task"
TableNameModel = "model"
TableNameDatasetIndex = "dataset_index"
TableNameDocumentVector = "document_vector"
)