utils.py 6.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233
  1. #!/usr/bin/env python
  2. # -*- coding: utf-8 -*-
  3. '''
  4. @Project : lq-agent-api
  5. @File : utils.py
  6. @IDE : VsCode
  7. @Author :
  8. @Date : 2025-12-04 10:13:12
  9. =================================
  10. 📋 方法总览 (Method Overview)
  11. 🏗️ 核心模型管理:
  12. ├── ModelHandler() # 模型处理器类
  13. ├── get_models() # 获取模型的全局函数
  14. └── model_handler # 全局模型处理器实例
  15. 🔍 模型获取方法:
  16. ├── _get_doubao_model() # 获取豆包模型
  17. ├── _get_qwen_model() # 获取通义千问模型
  18. ├── _get_deepseek_model() # 获取DeepSeek模型
  19. ├── _get_gemini_model() # 获取Gemini模型
  20. ├── _get_lq_qwen3_8b_model() # 获取本地Qwen3-8B模型
  21. └── _get_qwen_local_14b_model() # 获取本地Qwen3-14B模型
  22. '''
  23. from langchain_openai import ChatOpenAI
  24. from langchain_core.messages import HumanMessage
  25. from foundation.base.config import config_handler
  26. from foundation.logger.loggering import server_logger as logger
  27. class ModelHandler:
  28. """
  29. AI模型处理器类,用于管理多种AI模型的创建和配置
  30. 支持的模型类型:
  31. - doubao: 豆包模型
  32. - qwen: 通义千问模型
  33. - deepseek: DeepSeek模型
  34. - gemini: Gemini模型
  35. - lq_qwen3_8b: 本地Qwen3-8B模型
  36. - qwen_local_14b: 本地Qwen3-14B模型
  37. """
  38. def __init__(self):
  39. """
  40. 初始化模型处理器
  41. 加载配置处理器,用于后续读取各种模型的配置信息
  42. """
  43. self.config = config_handler
  44. def get_models(self):
  45. """
  46. 获取AI模型实例
  47. Returns:
  48. ChatOpenAI: 配置好的AI模型实例
  49. Note:
  50. 根据配置文件中的MODEL_TYPE参数选择对应模型
  51. 支持的模型类型:doubao, qwen, deepseek, lq_qwen3_8b, qwen_local_14b
  52. 默认返回豆包模型
  53. """
  54. model_type = self.config.get("model", "MODEL_TYPE")
  55. logger.info(f"正在初始化AI模型,模型类型: {model_type}")
  56. if model_type == "doubao":
  57. model = self._get_doubao_model()
  58. if model_type == "gemini":
  59. model = self._get_gemini_model()
  60. elif model_type == "qwen":
  61. model = self._get_qwen_model()
  62. elif model_type == "deepseek":
  63. model = self._get_deepseek_model()
  64. elif model_type == "lq_qwen3_8b":
  65. model = self._get_lq_qwen3_8b_model()
  66. elif model_type == "qwen_local_14b":
  67. model = self._get_qwen_local_14b_model()
  68. else:
  69. # 默认返回豆包
  70. logger.warning(f"未知的模型类型 '{model_type}',使用默认gemini模型")
  71. model = model = self._get_gemini_model()
  72. logger.info(f"AI模型初始化完成: {model_type}")
  73. return model
  74. def _get_doubao_model(self):
  75. """
  76. 获取豆包模型
  77. Returns:
  78. ChatOpenAI: 配置好的豆包模型实例
  79. """
  80. doubao_url = self.config.get("doubao", "DOUBAO_SERVER_URL")
  81. doubao_model_id = self.config.get("doubao", "DOUBAO_MODEL_ID")
  82. doubao_api_key = self.config.get("doubao", "DOUBAO_API_KEY")
  83. llm = ChatOpenAI(
  84. base_url=doubao_url,
  85. model=doubao_model_id,
  86. api_key=doubao_api_key,
  87. temperature=0.7,
  88. extra_body={
  89. "enable_thinking": False,
  90. })
  91. return llm
  92. def _get_qwen_model(self):
  93. """
  94. 获取通义千问模型
  95. Returns:
  96. ChatOpenAI: 配置好的通义千问模型实例
  97. """
  98. qwen_url = self.config.get("qwen", "QWEN_SERVER_URL")
  99. qwen_model_id = self.config.get("qwen", "QWEN_MODEL_ID")
  100. qwen_api_key = self.config.get("qwen", "QWEN_API_KEY")
  101. llm = ChatOpenAI(
  102. base_url=qwen_url,
  103. model=qwen_model_id,
  104. api_key=qwen_api_key,
  105. temperature=0.7,
  106. extra_body={
  107. "enable_thinking": False,
  108. })
  109. return llm
  110. def _get_deepseek_model(self):
  111. """
  112. 获取DeepSeek模型
  113. Returns:
  114. ChatOpenAI: 配置好的DeepSeek模型实例
  115. """
  116. deepseek_url = self.config.get("deepseek", "DEEPSEEK_SERVER_URL")
  117. deepseek_model_id = self.config.get("deepseek", "DEEPSEEK_MODEL_ID")
  118. deepseek_api_key = self.config.get("deepseek", "DEEPSEEK_API_KEY")
  119. llm = ChatOpenAI(
  120. base_url=deepseek_url,
  121. model=deepseek_model_id,
  122. api_key=deepseek_api_key,
  123. temperature=0.7,
  124. extra_body={
  125. "enable_thinking": False,
  126. })
  127. return llm
  128. def _get_gemini_model(self):
  129. """
  130. 获取Gemini模型
  131. Returns:
  132. ChatOpenAI: 配置好的Gemini模型实例
  133. """
  134. gemini_url = self.config.get("gemini", "GEMINI_SERVER_URL")
  135. gemini_model_id = self.config.get("gemini", "GEMINI_MODEL_ID")
  136. gemini_api_key = self.config.get("gemini", "GEMINI_API_KEY")
  137. llm = ChatOpenAI(
  138. base_url=gemini_url,
  139. model=gemini_model_id,
  140. api_key=gemini_api_key,
  141. temperature=0.7,
  142. # extra_body={
  143. # "enable_thinking": False,
  144. # }
  145. )
  146. return llm
  147. def _get_lq_qwen3_8b_model(self):
  148. """
  149. 获取本地Qwen3-8B-Instruct模型
  150. Returns:
  151. ChatOpenAI: 配置好的本地Qwen3-8B模型实例
  152. """
  153. llm = ChatOpenAI(
  154. base_url="http://192.168.91.253:9000/v1",
  155. model="/mnt/Qwen3-8B",
  156. api_key="dummy", # 本地模型使用虚拟API key
  157. temperature=0.7,
  158. )
  159. return llm
  160. def _get_qwen_local_14b_model(self):
  161. """
  162. 获取本地Qwen3-14B模型
  163. Returns:
  164. ChatOpenAI: 配置好的本地Qwen3-14B模型实例
  165. """
  166. llm = ChatOpenAI(
  167. base_url="http://172.16.35.50:8003/v1",
  168. model="Qwen3-14B",
  169. api_key="sk-dummy", # 本地模型使用虚拟API key
  170. temperature=0.7,
  171. )
  172. return llm
  173. # 创建全局实例
  174. model_handler = ModelHandler()
  175. def get_models():
  176. """
  177. 获取模型的全局函数
  178. Returns:
  179. tuple: (llm, chat, embed) - LLM模型、聊天模型和嵌入模型实例
  180. 注意:当前llm和chat使用相同模型实例,embed暂时返回None
  181. Note:
  182. 这是一个便捷函数,直接使用全局model_handler实例获取模型
  183. """
  184. llm = model_handler.get_models()
  185. # 暂时返回相同的模型作为chat和embed
  186. return llm, llm, None