跳转至

SAGE Libs 设计哲学

概述

SAGE Libs 是 SAGE 框架的核心算法库层(L3),其设计遵循"分层解耦、组合优先"的核心理念。本文档阐述了 SAGE Libs 的设计哲学和架构原则。


核心设计原则

1. 分层架构 (Layered Architecture)

SAGE Libs 位于 L3 层,严格遵循依赖方向规则:

L5: sage-cli, sage-tools                            # 接口层 (CLI、开发工具)
L4: sage-middleware                                  # 中间件层 (算子与编排)
L3: sage-kernel, sage-libs  ← 我们在这里           # 核心层 (执行引擎与算法)
L2: sage-platform                                    # 平台层 (队列、存储)
L1: sage-common                                      # 基础层 (配置、日志)

独立仓库 (不在 SAGE 核心): - sage-benchmark: 评估框架 (PyPI: isage-benchmark) - sage-examples: 教程和应用示例 - sage-studio: 可视化工作流 - sageLLM: LLM 推理引擎 (PyPI: isagellm)

关键规则

  • SAGE Libs 只能依赖 L1 (sage-common) 和 L2 (sage-platform)
  • 上层模块(L4-L5)可以导入 SAGE Libs,反之不行
  • 这确保了算法的独立性和可复用性

2. 纯算法分离 (Pure Algorithm Separation)

SAGE Libs 专注于纯算法实现,不包含:

  • Pipeline 编排逻辑(属于 L4)
  • 分布式调度(属于 L2/L4)
  • 用户界面(属于独立仓库 sage-studio)
  • 外部服务依赖(通过接口抽象)
# ✅ SAGE Libs 风格:纯算法类
class CharacterSplitter:
    """纯文本分块算法,不依赖任何 SAGE 算子"""
    def __init__(self, chunk_size: int = 512, overlap: int = 128):
        self.chunk_size = chunk_size
        self.overlap = overlap

    def split(self, text: str) -> list[str]:
        # 纯 Python 实现
        ...

3. 组合优先于继承 (Composition over Inheritance)

SAGE Libs 中的组件设计为可组合的积木:

# 组合使用多个组件
from sage.libs.rag import CharacterSplitter, LoaderFactory
from sage.libs.foundation.tools import BaseTool

# 加载 → 分块 → 处理
loader = LoaderFactory.create("pdf")
splitter = CharacterSplitter(chunk_size=800)

text = loader.load("document.pdf")
chunks = splitter.split(text)

模块组织

SAGE Libs 按功能域组织为以下模块:

模块 功能 层级定位
foundation 基础工具、IO、上下文管理 最底层工具
agentic Agent 框架、工作流优化 高级编排
rag RAG 构建块(加载器、分块器) 检索增强生成
integrations 第三方服务适配器 外部集成
privacy 机器遗忘、隐私保护算法 隐私计算
finetune 模型微调工具 模型训练

设计模式

工厂模式 (Factory Pattern)

统一创建接口,隐藏实现细节:

from sage.libs.rag import LoaderFactory

# 根据文件类型自动选择加载器
loader = LoaderFactory.create("pdf")  # 返回 PDFLoader
loader = LoaderFactory.create("md")   # 返回 MarkdownLoader

策略模式 (Strategy Pattern)

可插拔的算法实现:

from sage.libs.rag import CharacterSplitter, SentenceTransformersTokenTextSplitter

# 根据需求选择分块策略
splitter = CharacterSplitter(chunk_size=512)  # 字符级分块
splitter = SentenceTransformersTokenTextSplitter(chunk_size=256)  # Token 级分块

注册表模式 (Registry Pattern)

动态注册和发现组件:

from sage.libs.foundation.tools import ToolRegistry

# 注册自定义工具
registry = ToolRegistry()
registry.register("my_tool", MyCustomTool)

# 按名称获取工具
tool = registry.get("my_tool")

与其他层的交互

与 L4 (sage-middleware) 的关系

  • SAGE Libs 提供算法实现
  • sage-middleware 提供Pipeline 封装
# L3: 纯算法
from sage.libs.rag import CharacterSplitter

# L4: Pipeline 算子封装
from sage.middleware.operators.rag import ChunkerOperator  # 封装 CharacterSplitter

与 L1 (sage-common) 的关系

  • sage-common 提供基础设施(日志、配置、工具函数)
  • SAGE Libs 在此基础上构建领域算法
# L1: 基础工具
from sage.common.utils.document_processing import chunk_text

# L3: 基于 L1 构建的高级分块器
from sage.libs.rag import CharacterSplitter  # 内部可能使用 L1 工具

最佳实践

  1. 保持算法纯净:避免在算法类中引入 IO、网络等副作用
  2. 使用依赖注入:通过参数传入外部依赖,而非硬编码
  3. 编写单元测试:每个算法都应有独立的单元测试
  4. 文档先行:每个公开 API 都应有清晰的文档字符串
  5. 类型注解:使用 Python 类型提示提高代码可读性

参考资料