知识库的创建(4) - KBServiceFactory:获取不同类型知识库服务的工厂类


前言

上一篇我们在update_docs里看到了 KBServiceFactory.get_service_by_name(knowledge_base_name),这一篇我们一起来看看KBServiceFactory
KBServiceFactory 是一个用于获取不同类型知识库服务的工厂类。该类提供了静态方法,根据传入的知识库名称和向量存储类型,返回对应的知识库服务实例。以下是对该类及其方法的详细介绍。
在这里插入图片描述


提示:以下是本篇文章正文内容,下面案例可供参考

一、 方法详解

1. get_service

@staticmethod
def get_service(kb_name: str,
                vector_store_type: Union[str, SupportedVSType],
                embed_model: str = EMBEDDING_MODEL,
                ) -> KBService:

功能: 根据知识库名称和向量存储类型获取相应的知识库服务实例。

参数:

  • kb_name (str): 知识库名称。
  • vector_store_type (Union[str, SupportedVSType]): 向量存储类型,可以是字符串或 SupportedVSType 枚举类型。
  • embed_model (str): 嵌入模型名称,默认为 EMBEDDING_MODEL

返回: 返回对应的知识库服务实例 KBService

实现逻辑:

  1. 如果 vector_store_type 是字符串,则将其转换为 SupportedVSType 枚举类型。
  2. 根据 vector_store_type 的值,导入相应的知识库服务模块并返回其实例:
    • FAISS: 返回 FaissKBService 实例。
    • PG: 返回 PGKBService 实例。
    • MILVUS: 返回 MilvusKBService 实例。
    • ZILLIZ: 返回 ZillizKBService 实例。
    • DEFAULT: 返回默认的 MilvusKBService 实例。
    • ES: 返回 ESKBService 实例。
    • CHROMADB: 返回 ChromaKBService 实例。
    • 再次判断 DEFAULT,返回 DefaultKBService 实例。

2. get_service_by_name

@staticmethod
def get_service_by_name(kb_name: str) -> KBService:

功能: 根据知识库名称从数据库中加载相应的知识库服务。

参数:

  • kb_name (str): 知识库名称。

返回: 返回对应的知识库服务实例 KBService,如果知识库不存在则返回 None

实现逻辑:

  1. 调用 load_kb_from_db 函数从数据库中加载知识库信息,获取向量存储类型和嵌入模型名称。
  2. 如果知识库不存在于数据库中,则返回 None
  3. 调用 get_service 方法获取相应的知识库服务实例并返回。

3. get_default

@staticmethod
def get_default():
    return KBServiceFactory.get_service("default", SupportedVSType.DEFAULT)

功能: 获取默认的知识库服务。

返回: 返回默认的知识库服务实例 KBService

实现逻辑: 调用 get_service 方法,传入默认的知识库名称 “default” 和向量存储类型 SupportedVSType.DEFAULT,获取默认的知识库服务实例并返回。

二、 代码注释

class KBServiceFactory:

    @staticmethod
    def get_service(kb_name: str,
                    vector_store_type: Union[str, SupportedVSType],
                    embed_model: str = EMBEDDING_MODEL,
                    ) -> KBService:
        # 如果vector_store_type是字符串,则将其转换为SupportedVSType枚举类型
        if isinstance(vector_store_type, str):
            vector_store_type = getattr(SupportedVSType, vector_store_type.upper())
        
        # 根据向量存储类型返回对应的知识库服务实例
        if SupportedVSType.FAISS == vector_store_type:
            from server.knowledge_base.kb_service.faiss_kb_service import FaissKBService
            return FaissKBService(kb_name, embed_model=embed_model)
        elif SupportedVSType.PG == vector_store_type:
            from server.knowledge_base.kb_service.pg_kb_service import PGKBService
            return PGKBService(kb_name, embed_model=embed_model)
        elif SupportedVSType.MILVUS == vector_store_type:
            from server.knowledge_base.kb_service.milvus_kb_service import MilvusKBService
            return MilvusKBService(kb_name, embed_model=embed_model)
        elif SupportedVSType.ZILLIZ == vector_store_type:
            from server.knowledge_base.kb_service.zilliz_kb_service import ZillizKBService
            return ZillizKBService(kb_name, embed_model=embed_model)
        elif SupportedVSType.DEFAULT == vector_store_type:
            from server.knowledge_base.kb_service.milvus_kb_service import MilvusKBService
            return MilvusKBService(kb_name,
                                   embed_model=embed_model)  # other milvus parameters are set in model_config.kbs_config
        elif SupportedVSType.ES == vector_store_type:
            from server.knowledge_base.kb_service.es_kb_service import ESKBService
            return ESKBService(kb_name, embed_model=embed_model)
        elif SupportedVSType.CHROMADB == vector_store_type:
            from server.knowledge_base.kb_service.chromadb_kb_service import ChromaKBService
            return ChromaKBService(kb_name, embed_model=embed_model)
        elif SupportedVSType.DEFAULT == vector_store_type:  # kb_exists of default kbservice is False, to make validation easier.
            from server.knowledge_base.kb_service.default_kb_service import DefaultKBService
            return DefaultKBService(kb_name)

    @staticmethod
    def get_service_by_name(kb_name: str) -> KBService:
        # 从数据库中加载知识库信息
        _, vs_type, embed_model = load_kb_from_db(kb_name)
        # 如果知识库不存在于数据库中,返回None
        if _ is None:  # kb not in db, just return None
            return None
        # 获取对应的知识库服务实例并返回
        return KBServiceFactory.get_service(kb_name, vs_type, embed_model)

    @staticmethod
    def get_default():
        # 获取默认的知识库服务实例并返回
        return KBServiceFactory.get_service("default", SupportedVSType.DEFAULT)

总结

KBServiceFactory 类通过静态方法 get_serviceget_service_by_nameget_default,提供了一种灵活且统一的方式来获取不同类型的知识库服务实例。根据向量存储类型和知识库名称,KBServiceFactory 可以创建并返回合适的知识库服务,为知识库的管理和使用提供了极大的便利。
另外,它实际的返回值是根据 vector_store_type 的不同而不同的,例如

if SupportedVSType.FAISS == vector_store_type:
    from server.knowledge_base.kb_service.faiss_kb_service import FaissKBService
    return FaissKBService(kb_name, embed_model=embed_model)

下一节,我们会一起来看看FaissKBService

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值