一种经典设计模式——工厂模式(Factory Pattern),而且是偏“抽象工厂”的写法。

本文探讨了工厂模式在模型初始化中的应用价值。通过抽象工厂模式(BaseModelFactory)和具体实现(ChatModelFactory/EmbeddingsFactory),系统能够集中管理不同模型(如ChatTongyi、DashScopeEmbeddings)的复杂初始化逻辑。相比单纯使用配置文件,工厂模式具有三大优势:1)统一创建接口避免if/else分散;2)通过抽象类强制规范实现;3)支持未来扩展多态性。其核心价值在于将对象创建的复杂性隔离,使系统只需调用factory.generator()即可获得所需模型,无需关心具体实现细节,从而显著提升代码的可维护性和扩展性。

为什么需要去构建出一个工厂模式(Factory Pattern)呢?

例如:

from abc import ABC, abstractmethod
from typing import Optional
from langchain_core.embeddings import Embeddings
from langchain_community.chat_models.tongyi import BaseChatModel
from langchain_community.embeddings import DashScopeEmbeddings
from langchain_community.chat_models.tongyi import ChatTongyi
from utils.config_handler import rag_conf


class BaseModelFactory(ABC):
    @abstractmethod
    def generator(self) -> Optional[Embeddings | BaseChatModel]:
        pass
class ChatModelFactory(BaseModelFactory):
    def generator(self) -> Optional[Embeddings | BaseChatModel]:
        return ChatTongyi(model=rag_conf["chat_model_name"])

class EmbeddingsFactory(BaseModelFactory):
    def generator(self) -> Optional[Embeddings | BaseChatModel]:
        return DashScopeEmbeddings(model=rag_conf["embedding_model_name"])


chat_model = ChatModelFactory().generator()
embed_model = EmbeddingsFactory().generator()

减少多处修改的配置文件能做什么??和工厂模式有什么区别?

{
"chat_model": "tongyi",
"embedding_model": "dashscope"
}

👉 它只能告诉你:

📝 “我要用哪个模型”

但问题是:

不同模型的初始化方式完全不一样


❗举个真实差异(核心点)

ChatTongyi(
model="qwen-max",
api_key="xxx"
)


2️⃣ OpenAI

ChatOpenAI(
model="gpt-4",
temperature=0.7
)

❌ 参数不同
❌ 类名不同
❌ 初始化方式不同
❌ 依赖环境不同


🚨 二、如果你只用“配置文件”会发生什么?

你最终还是要写:


if config["chat_model"] == "tongyi":
model = ChatTongyi(...)
elif config["chat_model"] == "openai":
model = ChatOpenAI(...)

👉 这段代码必须存在,而且会:

  • 出现在多个地方 ❌
  • 越写越多 ❌
  • 难维护 ❌

 三、工厂模式真正解决的问题

核心一句话

把所有“if/else 创建逻辑”集中到一个地方


用工厂之后

chat_model = ChatModelFactory().generator()

👉 外部代码:

❌ 不关心模型类型
❌ 不关心初始化细节
❌ 不写 if/else


✔ 工厂内部才处理复杂逻辑

class ChatModelFactory:
def generator(self):
if config["chat_model"] == "tongyi":
return ChatTongyi(...)
elif config["chat_model"] == "openai":
return ChatOpenAI(...)


 四、为什么还要加 BaseModelFactory(抽象类)?

你问的重点在这

class BaseModelFactory(ABC):
@abstractmethod
def generator(self):
pass


作用 1:强制规范(很关键)

 它规定:

所有工厂必须实现 generator()

否则直接报错


✔ 有抽象类后

factory.generator()

👉 所有工厂统一接口:


作用 2:支持“多态”(高级但重要)

你可以这样写:

def init_model(factory: BaseModelFactory):
return factory.generator()

👉 不管传入:

  • ChatModelFactory
  • EmbeddingsFactory

👉 都能用


作用 3:为扩展做准备(你现在可能还没感觉到)

未来你可能会有:

class OpenAIModelFactory
class TongyiModelFactory
class LocalModelFactory
class MultiModalFactory

👉 有统一基类之后:

  • 可以注册
  • 可以动态加载
  • 可以插件化

🔥 五、配置 vs 工厂(终极对比)

能力 配置文件 工厂模式
指定模型
控制初始化逻辑
统一创建入口
避免 if/else 分散
可扩展(新模型) ⚠️
支持复杂逻辑

最后总结(最重要一句)

👉 工厂模式的意义不是“少改代码”,而是:
把“对象创建的复杂性”彻底隔离出去,让系统具备可扩展性

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐