组件系统架构
组件系统架构
相关源文件
本章引用的主要源码文件:
agent/canvas.pyagent/component/__init__.pyagent/component/agent_with_tools.pyagent/component/base.pyagent/component/categorize.pyagent/component/llm.pyagent/tools/base.pycommon/mcp_tool_call_conn.pyrag/prompts/generator.pyweb/src/constants/agent.tsxweb/src/pages/agent/canvas/index.tsxweb/src/pages/agent/canvas/node/dropdown/accordion-operators.tsxweb/src/pages/agent/canvas/node/dropdown/operator-item-list.tsxweb/src/pages/agent/canvas/node/extractor-node.tsxweb/src/pages/agent/constant/index.tsxweb/src/pages/agent/context.tsweb/src/pages/agent/form-sheet/form-config-map.tsxweb/src/pages/agent/hooks/use-add-node.tsweb/src/pages/agent/hooks/use-show-drawer.tsxweb/src/pages/agent/log-sheet/index.tsxweb/src/pages/agent/operator-icon.tsx
目的与范围
本文档描述了构成 RAGFlow 的 Agent 和工作流系统基础的组件系统架构。组件是 Canvas 工作流的构建块——它们是自包含、可配置的单元,用于执行特定任务,例如大语言模型(LLM)调用、检索、分类和文档生成。本页面涵盖基类、参数校验、组件工厂模式和动态注册。
有关组件在工作流中如何编排的信息,请参阅 Canvas 引擎与 DSL。有关特定内置组件的详细信息,请参阅 内置组件。
组件类层次结构
组件系统建立在 agent/component/base.py 中定义的两个基础抽象类之上,所有组件都继承自这两个类:用于配置的 ComponentParamBase 和用于执行逻辑的 ComponentBase。
类层次结构图
来源: agent/component/base.py:40-365, agent/component/llm.py:34-83, agent/component/agent_with_tools.py:39-73, agent/component/categorize.py:30-98, agent/tools/base.py:29-136
ComponentParamBase:参数校验与配置
ComponentParamBase 定义了参数模式和校验规则。每个组件都有一个关联的参数类,用于处理运行时配置与默认值的合并。
核心属性
| 属性 | 描述 | 定义位置 |
|---|---|---|
inputs | 字典,定义预期的输入参数及其类型。 | agent/component/base.py:43 |
outputs | 字典,存储执行后的输出值和类型。 | agent/component/base.py:44 |
max_retries | 失败时的重试次数(默认值:0)。 | agent/component/base.py:46 |
delay_after_error | 重试之间的等待秒数(默认值:2.0)。 | agent/component/base.py:47 |
参数更新与校验
agent/component/base.py 中的 update(conf) 方法执行从配置字典到参数对象的递归更新 agent/component/base.py:127-187。它会跟踪哪些参数是"用户提供的",哪些是默认值,并处理已废弃的参数 agent/component/base.py:130-141。
每个参数类都必须实现 check() 方法来强制执行约束。例如:
LLMParam.check()校验temperature、presence_penalty和max_tokens是否为有效的数值,并且llm_id不为空agent/component/llm.py:53-61。CategorizeParam.check()确保提供了category_description,并且为每个类别定义了"To"目标agent/component/categorize.py:42-49。AgentParam继承自LLMParam和ToolParamBase,结合了大语言模型(LLM)设置和工具元数据的校验agent/component/agent_with_tools.py:39-71。
来源: agent/component/base.py:40-187, agent/component/llm.py:53-61, agent/component/categorize.py:42-49, agent/component/agent_with_tools.py:39-71
组件工厂模式与动态注册
RAGFlow 使用动态发现机制在运行时注册和加载组件。这避免了硬编码导入,并允许通过向 agent/component/ 目录添加新文件来轻松扩展系统。
动态发现过程
agent/component/__init__.py 文件会自动扫描目录以查找组件模块并提取类:
_import_submodules():遍历agent/component/中的文件,跳过base.py和私有文件agent/component/__init__.py:25-35。_extract_classes_from_module():使用inspect.getmembers()查找模块中的所有类,并将它们添加到全局__all_classes注册表中agent/component/__init__.py:37-42。component_class(class_name):一个工厂函数,用于在三个模块中搜索类名:agent.component、agent.tools和rag.flowagent/component/__init__.py:51-59。
DSL 加载与组件实例化
agent/canvas.py 中的 Graph.load() 方法使用此工厂从 DSL 实例化组件:
来源: agent/component/__init__.py:22-59, agent/canvas.py:96-109
可视化发现到代码实体的映射
此图桥接了高层 DSL 概念与实现它们的具体 Python 类之间的差距。
来源: agent/canvas.py:43-109, agent/component/__init__.py:51-59, agent/component/base.py:40-365, agent/component/agent_with_tools.py:73, agent/component/categorize.py:98
ComponentBase:执行与数据流
ComponentBase 是所有可执行组件的抽象基类。它提供了同步和异步执行、变量解析和状态管理的框架。
执行框架
组件在 _invoke()(同步)或 _invoke_async()(异步)中实现逻辑。基类提供了处理计时、错误日志记录和输出存储的包装器:
invoke(**kwargs):包装同步执行agent/component/base.py:407-419。invoke_async(**kwargs):包装异步执行,对非协程函数使用thread_pool_exec以防止阻塞事件循环agent/component/base.py:421-447。
变量解析与数据流
组件通过 Graph(Canvas)对象与全局状态交互。agent/canvas.py 中的 get_value_with_variable(value) 方法使用正则表达式模式(如 {{sys.query}} 或 {{component_id@variable}})解析字符串中的变量引用 agent/canvas.py:168-193。
变量使用 Graph.get_variable_value(exp) 解析 agent/canvas.py:195-240,该方法支持:
- 系统变量:
sys.query、sys.user_id等agent/canvas.py:198 - 环境变量:
env.VAR_NAMEagent/canvas.py:169。 - 组件输出:
component_id@variable_nameagent/canvas.py:199。 - 嵌套路径:通过点符号访问深层字段(例如
agent_0@structured.answer)agent/canvas.py:209-236。
数据流图
来源: agent/component/base.py:407-447, agent/canvas.py:168-240
智能体与大语言模型(LLM)集成
Agent 组件通过将大语言模型(LLM)能力与工具执行相结合,展示了高级组件架构。
- 工具绑定:
Agent组件从其参数初始化工具,通过component_class解析它们agent/component/agent_with_tools.py:133-145。它将这些工具绑定到LLMBundle以启用函数调用agent/component/agent_with_tools.py:112-113。 - MCP 集成:通过创建
MCPToolCallSession对象并将其工具绑定到大语言模型(LLM),支持模型上下文协议(MCP)服务器agent/component/agent_with_tools.py:101-109。 - 消息格式化:使用
message_fit_in确保提示词和历史记录适合模型的 Token 限制agent/component/agent_with_tools.py:115-120,rag/prompts/generator.py:68-125。
来源: agent/component/agent_with_tools.py:73-145, rag/prompts/generator.py:68-125
错误处理与取消
组件架构包含用于任务管理和故障恢复的内置机制。
取消检查
长时间运行的组件必须定期调用 check_if_canceled() agent/component/base.py:396-405。此方法检查:
_canvas.is_canceled()标志agent/canvas.py:270-271。has_canceled(task_id)服务,该服务在 Redis 中查找取消标志agent/canvas.py:35。
异常处理
如果在 _invoke 期间发生异常,基类会:
- 记录异常
agent/component/base.py:416。 - 使用错误消息设置
_ERROR输出键agent/component/base.py:414。 - 支持
exception_goto参数,用于在失败时重定向工作流执行agent/component/base.py:50。
来源: agent/component/base.py:393-419, agent/canvas.py:270-271, api/db/services/task_service.py:35