model_handler.py 7.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269
  1. #!/usr/bin/env python
  2. # -*- coding: utf-8 -*-
  3. """
  4. AI模型处理器
  5. 用于管理生成、与嵌入模型的创建和配置
  6. 支持的模型类型:
  7. - doubao: 豆包模型
  8. - qwen: 通义千问模型
  9. - deepseek: DeepSeek模型
  10. - gemini: Gemini模型
  11. - lq_qwen3_8b: 本地Qwen3-8B模型
  12. - lq_qwen3_8b_lq_lora: 本地Qwen3-8B-lq-lora模型
  13. - lq_qwen3_4b: 本地Qwen3-4B模型
  14. - qwen_local_14b: 本地Qwen3-14B模型
  15. - lq_qwen3_8b_emd: 本地Qwen3-Embedding-8B嵌入模型
  16. - lq_bge_reranker_v2_m3: 本地BGE-reranker-v2-m3重排序模型
  17. """
  18. from langchain_openai import ChatOpenAI, OpenAIEmbeddings
  19. from foundation.infrastructure.config.config import config_handler
  20. from foundation.observability.logger.loggering import server_logger as logger
  21. class ModelHandler:
  22. """
  23. AI模型处理器类,用于管理多种AI模型的创建和配置
  24. """
  25. def __init__(self):
  26. """
  27. 初始化模型处理器
  28. 加载配置处理器,用于后续读取各种模型的配置信息
  29. """
  30. self.config = config_handler
  31. def get_models(self):
  32. """
  33. 获取AI模型实例
  34. Returns:
  35. ChatOpenAI: 配置好的AI模型实例
  36. Note:
  37. 根据配置文件中的MODEL_TYPE参数选择对应模型
  38. 支持的模型类型:doubao, qwen, deepseek, lq_qwen3_8b, lq_qwen3_8b_lora, lq_qwen3_4b, qwen_local_14b
  39. 默认返回豆包模型
  40. """
  41. model_type = self.config.get("model", "MODEL_TYPE")
  42. logger.info(f"正在初始化AI模型,模型类型: {model_type}")
  43. if model_type == "doubao":
  44. model = self._get_doubao_model()
  45. elif model_type == "gemini":
  46. model = self._get_gemini_model()
  47. elif model_type == "qwen":
  48. model = self._get_qwen_model()
  49. elif model_type == "deepseek":
  50. model = self._get_deepseek_model()
  51. elif model_type == "lq_qwen3_8b":
  52. model = self._get_lq_qwen3_8b_model()
  53. elif model_type == "lq_qwen3_8b_lq_lora":
  54. model = self._get_lq_qwen3_8b_lora_model()
  55. elif model_type == "lq_qwen3_4b":
  56. model = self._get_lq_qwen3_4b_model()
  57. elif model_type == "qwen_local_14b":
  58. model = self._get_qwen_local_14b_model()
  59. else:
  60. # 默认返回gemini
  61. logger.warning(f"未知的模型类型 '{model_type}',使用默认gemini模型")
  62. model = self._get_gemini_model()
  63. logger.info(f"AI模型初始化完成: {model_type}")
  64. return model
  65. def _get_doubao_model(self):
  66. """
  67. 获取豆包模型
  68. Returns:
  69. ChatOpenAI: 配置好的豆包模型实例
  70. """
  71. doubao_url = self.config.get("doubao", "DOUBAO_SERVER_URL")
  72. doubao_model_id = self.config.get("doubao", "DOUBAO_MODEL_ID")
  73. doubao_api_key = self.config.get("doubao", "DOUBAO_API_KEY")
  74. llm = ChatOpenAI(
  75. base_url=doubao_url,
  76. model=doubao_model_id,
  77. api_key=doubao_api_key,
  78. temperature=0.7,
  79. extra_body={
  80. "enable_thinking": False,
  81. })
  82. return llm
  83. def _get_qwen_model(self):
  84. """
  85. 获取通义千问模型
  86. Returns:
  87. ChatOpenAI: 配置好的通义千问模型实例
  88. """
  89. qwen_url = self.config.get("qwen", "QWEN_SERVER_URL")
  90. qwen_model_id = self.config.get("qwen", "QWEN_MODEL_ID")
  91. qwen_api_key = self.config.get("qwen", "QWEN_API_KEY")
  92. llm = ChatOpenAI(
  93. base_url=qwen_url,
  94. model=qwen_model_id,
  95. api_key=qwen_api_key,
  96. temperature=0.7,
  97. extra_body={
  98. "enable_thinking": False,
  99. })
  100. return llm
  101. def _get_deepseek_model(self):
  102. """
  103. 获取DeepSeek模型
  104. Returns:
  105. ChatOpenAI: 配置好的DeepSeek模型实例
  106. """
  107. deepseek_url = self.config.get("deepseek", "DEEPSEEK_SERVER_URL")
  108. deepseek_model_id = self.config.get("deepseek", "DEEPSEEK_MODEL_ID")
  109. deepseek_api_key = self.config.get("deepseek", "DEEPSEEK_API_KEY")
  110. llm = ChatOpenAI(
  111. base_url=deepseek_url,
  112. model=deepseek_model_id,
  113. api_key=deepseek_api_key,
  114. temperature=0.7,
  115. extra_body={
  116. "enable_thinking": False,
  117. })
  118. return llm
  119. def _get_gemini_model(self):
  120. """
  121. 获取Gemini模型
  122. Returns:
  123. ChatOpenAI: 配置好的Gemini模型实例
  124. """
  125. gemini_url = self.config.get("gemini", "GEMINI_SERVER_URL")
  126. gemini_model_id = self.config.get("gemini", "GEMINI_MODEL_ID")
  127. gemini_api_key = self.config.get("gemini", "GEMINI_API_KEY")
  128. llm = ChatOpenAI(
  129. base_url=gemini_url,
  130. model=gemini_model_id,
  131. api_key=gemini_api_key,
  132. temperature=0.7,
  133. )
  134. return llm
  135. def _get_lq_qwen3_8b_model(self):
  136. """
  137. 获取本地Qwen3-8B-Instruct模型
  138. Returns:
  139. ChatOpenAI: 配置好的本地Qwen3-8B模型实例
  140. """
  141. llm = ChatOpenAI(
  142. base_url="http://192.168.91.253:9002/v1",
  143. model="Qwen3-8B",
  144. api_key="dummy", # 本地模型使用虚拟API key
  145. temperature=0.7,
  146. )
  147. return llm
  148. def _get_lq_qwen3_8b_lora_model(self):
  149. """
  150. 获取本地Qwen3-8B-lq-lora模型
  151. Returns:
  152. ChatOpenAI: 配置好的本地Qwen3-8B-lq-lora模型实例
  153. """
  154. server_url = self.config.get("lq_qwen3_8B_lora", "LQ_QWEN3_8B_LQ_LORA_SERVER_URL")
  155. model_id = self.config.get("lq_qwen3_8B_lora", "LQ_QWEN3_8B_LQ_LORA_MODEL_ID")
  156. api_key = self.config.get("lq_qwen3_8B_lora", "LQ_QWEN3_8B_LQ_LORA_API_KEY")
  157. llm = ChatOpenAI(
  158. base_url=server_url,
  159. model=model_id,
  160. api_key=api_key,
  161. temperature=0.7,
  162. )
  163. return llm
  164. def _get_lq_qwen3_4b_model(self):
  165. """
  166. 获取本地Qwen3-4B-Instruct模型
  167. Returns:
  168. ChatOpenAI: 配置好的本地Qwen3-4B模型实例
  169. """
  170. llm = ChatOpenAI(
  171. base_url="http://192.168.91.253:9001/v1",
  172. model="Qwen3-4B",
  173. api_key="dummy", # 本地模型使用虚拟API key
  174. temperature=0.7,
  175. )
  176. return llm
  177. def _get_qwen_local_14b_model(self):
  178. """
  179. 获取本地Qwen3-14B-Instruct模型
  180. Returns:
  181. ChatOpenAI: 配置好的本地Qwen3-14B模型实例
  182. """
  183. llm = ChatOpenAI(
  184. base_url="http://192.168.91.253:9003/v1",
  185. model="Qwen3-14B",
  186. api_key="dummy", # 本地模型使用虚拟API key
  187. temperature=0.7,
  188. )
  189. return llm
  190. def _get_lq_qwen3_8b_emd(self):
  191. """
  192. 获取本地Qwen3-Embedding-8B嵌入模型
  193. Returns:
  194. OpenAIEmbeddings: 配置好的本地Qwen3-Embedding-8B嵌入模型实例
  195. """
  196. embeddings = OpenAIEmbeddings(
  197. base_url="http://192.168.91.253:9003/v1",
  198. model="Qwen3-Embedding-8B",
  199. api_key="dummy", # 本地模型使用虚拟API key
  200. )
  201. return embeddings
  202. # 创建全局实例
  203. model_handler = ModelHandler()
  204. def get_models():
  205. """
  206. 获取模型的全局函数
  207. Returns:
  208. tuple: (llm, chat, embed) - LLM模型、聊天模型和嵌入模型实例
  209. 注意:当前llm和chat使用相同模型实例,embed暂时返回None
  210. Note:
  211. 这是一个便捷函数,直接使用全局model_handler实例获取模型
  212. """
  213. llm = model_handler.get_models()
  214. # 暂时返回相同的模型作为chat和embed
  215. return llm, llm, None