高级教程:使用注册器#
注册器 Register 是 FlexRAG 框架中整合配置文件,加载各个 RAG 组件的一个重要模块。注册器可以将多个同类型的组件收集到一起,并生成统一的配置结构帮助您配置和使用这些组件。本教程将会向您展示如何使用 FlexRAG 中的注册器。
使用 FlexRAG 内置的注册器#
FlexRAG 中提供了一组事先定义好的注册器,这些注册器被用于注册各类 RAG 系统组件。下面的列表展示了 FlexRAG 中内置的注册器。
ASSISTANTS
REFINERS
CHUNKERS
DOCUMENTPARSERS
PROCESSORS
METRICS
GENERATORS
ENCODERS
RANKERS
DENSE_INDEX
RETRIEVERS
WEB_DOWNLOADERS
WEB_READERS
备注
如果您希望通过修改 FlexRAG 源码来开发您的项目,所有的注册器都可以被当作装饰器来注册您新增的组件。然而如果您使用 FlexRAG 的 run_assistant 或 run_interactive 入口点,那么仅有 ASSISTANTS 注册器可用于注册新的组件。
注册新的组件#
您可以通过使用注册器来装饰您的组件从而将您的组件注册到已有的注册器中。举例来说,您可以通过下面的代码来将您的 RAG 助手注册到 ASSISTANTS 注册器中:
from flexrag.assistant import AssistantBase, ASSISTANTS
from flexrag.utils import configure
@configure
class MyAssistantConfig:
# Define your assistant configuration here
pass
@ASSISTANTS("my_assistant", config_class=MyAssistantConfig)
class MyAssistant(AssistantBase):
# Define your assistant here
def answer(self, question: str) -> str:
return "MyAssistant: " + question
注册器在注册新组件时可以接受两个参数,分别是 shortnames 和 condig_class。
shortnames可以接受一个字符串列表,用于作为当前组件的简化名称,方便您在加载时使用。所有简化名称中的第一个将被作为这个组件的默认名称。config_class则接受一个dataclass类,用于作为当前组件的配置结构。config_class这个参数是可选的,如果您没有提供,那么这个组件将不使用配置。
生成配置结构#
在注册组件后,您就可以通过 make_config 方法为所有组件生成一个公用的配置结构。该配置结构可被用于加载任意一个组件并向其传递配置信息。举例来说,您通过如下代码来为所有已注册的 RAG 助手生成一个配置文件:
AssistantConfig = ASSISTANTS.make_config()
新生成的配置结构将如下所示:
# configure is a special decorator that helps to define the configuration dataclass in FlexRAG
from flexrag.utils import configure
@configure
class AssistantConfig:
# The shortname of the assistant
assistant_type: str
# The name of the configuration is the first shortname + "_config"
my_assistant_config: MyAssistantConfig
modular_config: ModularAssistantConfig
# Other registered assistant configurations
...
小技巧
在 FlexRAG 内置的入口点程序中,许多配置文件都是使用这样的方式生成的。这将使得您能够非常灵活地通过配置文件来改变工作流程中的组件及其配置。
加载组件#
您也可以通过注册器的 load 方法来加载任意以注册的组件。举例来说,您可以通过下面的代码来加载 MyAssistant 这一组件:
AssistantConfig.assistant_type = "my_assistant"
my_assistant = ASSISTANTS.load(AssistantConfig)
定义新的注册器#
您也可以定义新的注册来注册您全新的组件。举例来说,如果您想定义一些类型为 Searcher 的组件,您就可以使用下面的代码来定义一个新的注册器来注册这些组件:
from flexrag.utils import Register
SEARCHERS = Register("searcher")
利用类型提示#
注册器是一个泛型类,因此您可以通过类型实例化来优化类型提示。比如,您在定义 Searcher 这一类组件时,可以使用如下方式来创建注册器:
from abc import ABC
from flexrag.utils import Register
class Searcher(ABC):
pass
SEARCHERS = Register[Searcher]("searcher")