【无标题】
一种经典设计模式——工厂模式(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 分散 | ❌ | ✅ |
| 可扩展(新模型) | ⚠️ | ✅ |
| 支持复杂逻辑 | ❌ | ✅ |
最后总结(最重要一句)
👉 工厂模式的意义不是“少改代码”,而是:
把“对象创建的复杂性”彻底隔离出去,让系统具备可扩展性
AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。
更多推荐



所有评论(0)