2025-09-23 13:07:50 +08:00
|
|
|
from src.knowledge.base import KBNotFoundError, KnowledgeBase
|
2025-07-21 18:18:47 +08:00
|
|
|
from src.utils import logger
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class KnowledgeBaseFactory:
|
|
|
|
|
"""知识库工厂类,负责创建不同类型的知识库实例"""
|
|
|
|
|
|
|
|
|
|
# 注册的知识库类型映射 {kb_type: kb_class}
|
2025-07-26 03:36:54 +08:00
|
|
|
_kb_types: dict[str, type[KnowledgeBase]] = {}
|
2025-07-21 18:18:47 +08:00
|
|
|
|
|
|
|
|
# 每种类型的默认配置
|
2025-07-26 03:36:54 +08:00
|
|
|
_default_configs: dict[str, dict] = {}
|
2025-07-21 18:18:47 +08:00
|
|
|
|
|
|
|
|
@classmethod
|
2025-09-01 22:37:03 +08:00
|
|
|
def register(cls, kb_type: str, kb_class: type[KnowledgeBase], default_config: dict = None):
|
2025-07-21 18:18:47 +08:00
|
|
|
"""
|
|
|
|
|
注册知识库类型
|
|
|
|
|
|
|
|
|
|
Args:
|
|
|
|
|
kb_type: 知识库类型标识
|
|
|
|
|
kb_class: 知识库类
|
|
|
|
|
default_config: 默认配置
|
|
|
|
|
"""
|
|
|
|
|
if not issubclass(kb_class, KnowledgeBase):
|
2025-07-26 03:36:54 +08:00
|
|
|
raise ValueError("Knowledge base class must inherit from KnowledgeBase")
|
2025-07-21 18:18:47 +08:00
|
|
|
|
|
|
|
|
cls._kb_types[kb_type] = kb_class
|
|
|
|
|
cls._default_configs[kb_type] = default_config or {}
|
2025-08-31 00:34:26 +08:00
|
|
|
# logger.info(f"Registered knowledge base type: {kb_type}")
|
2025-07-21 18:18:47 +08:00
|
|
|
|
|
|
|
|
@classmethod
|
|
|
|
|
def create(cls, kb_type: str, work_dir: str, **kwargs) -> KnowledgeBase:
|
|
|
|
|
"""
|
|
|
|
|
创建知识库实例
|
|
|
|
|
|
|
|
|
|
Args:
|
|
|
|
|
kb_type: 知识库类型
|
|
|
|
|
work_dir: 工作目录
|
|
|
|
|
**kwargs: 其他初始化参数
|
|
|
|
|
|
|
|
|
|
Returns:
|
|
|
|
|
知识库实例
|
|
|
|
|
|
|
|
|
|
Raises:
|
|
|
|
|
KBNotFoundError: 未知的知识库类型
|
|
|
|
|
"""
|
|
|
|
|
if kb_type not in cls._kb_types:
|
|
|
|
|
available_types = list(cls._kb_types.keys())
|
2025-09-01 22:37:03 +08:00
|
|
|
raise KBNotFoundError(f"Unknown knowledge base type: {kb_type}. Available types: {available_types}")
|
2025-07-21 18:18:47 +08:00
|
|
|
|
|
|
|
|
kb_class = cls._kb_types[kb_type]
|
|
|
|
|
|
|
|
|
|
# 合并默认配置和用户配置
|
|
|
|
|
config = cls._default_configs[kb_type].copy()
|
|
|
|
|
config.update(kwargs)
|
|
|
|
|
|
|
|
|
|
try:
|
|
|
|
|
# 创建实例
|
|
|
|
|
instance = kb_class(work_dir, **config)
|
|
|
|
|
logger.info(f"Created {kb_type} knowledge base instance at {work_dir}")
|
|
|
|
|
return instance
|
|
|
|
|
except Exception as e:
|
|
|
|
|
logger.error(f"Failed to create {kb_type} knowledge base: {e}")
|
|
|
|
|
raise
|
|
|
|
|
|
|
|
|
|
@classmethod
|
2025-07-26 03:36:54 +08:00
|
|
|
def get_available_types(cls) -> dict[str, dict]:
|
2025-07-21 18:18:47 +08:00
|
|
|
"""
|
|
|
|
|
获取所有可用的知识库类型
|
|
|
|
|
|
|
|
|
|
Returns:
|
|
|
|
|
知识库类型信息字典
|
|
|
|
|
"""
|
|
|
|
|
result = {}
|
|
|
|
|
for kb_type, kb_class in cls._kb_types.items():
|
|
|
|
|
result[kb_type] = {
|
|
|
|
|
"class_name": kb_class.__name__,
|
|
|
|
|
"description": kb_class.__doc__ or "",
|
2025-09-01 22:37:03 +08:00
|
|
|
"default_config": cls._default_configs[kb_type],
|
2025-07-21 18:18:47 +08:00
|
|
|
}
|
|
|
|
|
return result
|
|
|
|
|
|
|
|
|
|
@classmethod
|
|
|
|
|
def is_type_supported(cls, kb_type: str) -> bool:
|
|
|
|
|
"""
|
|
|
|
|
检查是否支持指定的知识库类型
|
|
|
|
|
|
|
|
|
|
Args:
|
|
|
|
|
kb_type: 知识库类型
|
|
|
|
|
|
|
|
|
|
Returns:
|
|
|
|
|
是否支持
|
|
|
|
|
"""
|
|
|
|
|
return kb_type in cls._kb_types
|
|
|
|
|
|
|
|
|
|
@classmethod
|
2025-07-26 03:36:54 +08:00
|
|
|
def get_default_config(cls, kb_type: str) -> dict:
|
2025-07-21 18:18:47 +08:00
|
|
|
"""
|
|
|
|
|
获取指定类型的默认配置
|
|
|
|
|
|
|
|
|
|
Args:
|
|
|
|
|
kb_type: 知识库类型
|
|
|
|
|
|
|
|
|
|
Returns:
|
|
|
|
|
默认配置字典
|
|
|
|
|
"""
|
2025-07-26 03:36:54 +08:00
|
|
|
return cls._default_configs.get(kb_type, {}).copy()
|