单例模式管理模型客户端的几种实现方式
使用大模型的时候,模型客户端只需要创建一个,这就要用到单例模式。
1. 使用类变量存储实例
通过类变量保存唯一的实例对象,确保全局只有一个实例。
class ModelClientManager:
_instance = None # 类变量,用于存储唯一实例
def __new__(cls):
if cls._instance is None:
cls._instance = super().__new__(cls)
cls._instance.client = cls._create_model_client()
return cls._instance
@staticmethod
def _create_model_client():
# 创建模型客户端的逻辑
return OpenAIChatCompletionClient(
model=os.getenv("MODEL", "glm-4.7"),
base_url=os.getenv("BASE_URL", "https://open.bigmodel.cn/api/paas/v4/"),
api_key=os.getenv("API_KEY"),
)
def get_client(self):
return self.client
说明:
- __new__ 方法控制实例的创建过程,确保只创建一次
- _create_model_client 是静态方法,用于初始化模型客户端
- cls._instance.client = cls._create_model_client(),表示为这个新实例初始化 client 属性,值为 _create_model_client() 方法创建的模型客户端
2. 线程安全的单例实现
如果需要支持多线程环境,可以引入锁机制保证线程安全。
import threading
class ThreadSafeModelClientManager:
_instance = None
_lock = threading.Lock() # 线程锁
def __new__(cls):
if cls._instance is None:
with cls._lock:
if cls._instance is None:
cls._instance = super().__new__(cls)
cls._instance.client = cls._create_model_client()
return cls._instance
@staticmethod
def _create_model_client():
return OpenAIChatCompletionClient(
model=os.getenv("MODEL", "glm-4.7"),
base_url=os.getenv("BASE_URL", "https://open.bigmodel.cn/api/paas/v4/"),
api_key=os.getenv("API_KEY"),
)
def get_client(self):
return self.client
说明:
- 使用 threading.Lock() 确保在多线程环境下实例创建的原子性。
3. 装饰器实现单例
通过装饰器简化单例模式的实现
def singleton(cls):
instances = {}
def get_instance(*args, **kwargs):
if cls not in instances:
instances[cls] = cls(*args, **kwargs)
return instances[cls]
return get_instance
@singleton
class DecoratorModelClientManager:
def __init__(self):
self.client = self._create_model_client()
@staticmethod
def _create_model_client():
return OpenAIChatCompletionClient(
model=os.getenv("MODEL", "glm-4.7"),
base_url=os.getenv("BASE_URL", "https://open.bigmodel.cn/api/paas/v4/"),
api_key=os.getenv("API_KEY"),
)
def get_client(self):
return self.client
说明:
- 装饰器 singleton 统一管理实例的创建和访问。
- 适用于希望以更简洁方式实现单例的场景。
4. 模块级单例
将实例定义在模块级别,天然具备单例特性。
# model_client_manager.py
import os
from autogen_ext.models.openai import OpenAIChatCompletionClient
class ModelClientManager:
def __init__(self):
self.client = self._create_model_client()
@staticmethod
def _create_model_client():
return OpenAIChatCompletionClient(
model=os.getenv("MODEL", "glm-4.7"),
base_url=os.getenv("BASE_URL", "https://open.bigmodel.cn/api/paas/v4/"),
api_key=os.getenv("API_KEY"),
)
def get_client(self):
return self.client
# 模块级单例实例
model_client = ModelClientManager()
说明:
- 在模块中直接创建实例 manager,其他模块导入时共享同一实例。
- 简单直观,适合小型项目或无需复杂控制的场景。
5. 使用示例
无论采用哪种方式,调用时均通过单例获取客户端:
# 获取模型客户端 client = ModelClientManager().get_client() # 或者(模块级单例) from model_client_manager import model_client client = model_client.get_client()
__EOF__
本文作者:持之以恒(韧)
关于博主:擅长性能、全链路、自动化、企业级自动化持续集成(DevTestOps)、测开等
面试必备:项目实战(性能、自动化)、简历笔试,https://www.cnblogs.com/uncleyong/p/15777706.html
测试提升:从测试小白到高级测试修炼之路,https://www.cnblogs.com/uncleyong/p/10530261.html
欢迎分享:如果您觉得文章对您有帮助,欢迎转载、分享,也可以点击文章右下角【推荐】一下!
关于博主:擅长性能、全链路、自动化、企业级自动化持续集成(DevTestOps)、测开等
面试必备:项目实战(性能、自动化)、简历笔试,https://www.cnblogs.com/uncleyong/p/15777706.html
测试提升:从测试小白到高级测试修炼之路,https://www.cnblogs.com/uncleyong/p/10530261.html
欢迎分享:如果您觉得文章对您有帮助,欢迎转载、分享,也可以点击文章右下角【推荐】一下!

浙公网安备 33010602011771号