glm.py 6.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198
  1. from config import load_config
  2. from utils import image_to_base, pil_image_to_base64, load_image_from_cos
  3. from zhipuai import ZhipuAI
  4. class Glm:
  5. _instance = None
  6. def __new__(cls):
  7. if not cls._instance:
  8. cls._instance = super(Glm, cls).__new__(cls)
  9. cls._instance._initialized = False
  10. return cls._instance
  11. def __init__(self):
  12. if not self._initialized:
  13. self.cfg = load_config()['glm']
  14. self.client = ZhipuAI(api_key=self.cfg["api_key"])
  15. self._initialized = True
  16. self.model_name = "glm-4-plus"
  17. def text_response(self, query):
  18. """文字问答"""
  19. resonse = self.client.chat.completions.create(
  20. model=self.model_name,
  21. messages=[
  22. {"role": "user", "content": query}
  23. ],
  24. response_format= {
  25. 'type': 'json_object'
  26. }
  27. )
  28. return resonse.choices[0].message
  29. def images_response(self, query, image_url_list):
  30. """多图像单轮问答"""
  31. content = [
  32. {
  33. "type": "text",
  34. "text": query
  35. }
  36. ]
  37. for image_url in image_url_list:
  38. # image = load_image_from_cos(image_url)
  39. # image_base = pil_image_to_base64(image)
  40. content.append(
  41. {
  42. "type": "image_url",
  43. "image_url": {"url": image_url}
  44. }
  45. )
  46. response = self.client.chat.completions.create(
  47. model="glm-4v-plus-0111",
  48. messages=[
  49. {
  50. "role": "user",
  51. "content": content
  52. }
  53. ],
  54. response_format={
  55. "type": "json_object"
  56. }
  57. )
  58. return response.choices[0].message
  59. def multi_images_similarity_judge(self, image_url_list1, image_url_list2, query):
  60. """多组图像中的产品图像相似度对比"""
  61. content1 = [
  62. {
  63. "text": '这是第一组图像,商品信息中的产品图像',
  64. "type": "text"
  65. }
  66. ]
  67. for image_url in image_url_list1:
  68. image = load_image_from_cos(image_url)
  69. image_base = pil_image_to_base64(image)
  70. content1.append(
  71. {
  72. "type": "image_url",
  73. "image_url": {"url": image_base}
  74. }
  75. )
  76. content2 = [
  77. {
  78. "text": query,
  79. "type": "text"
  80. }
  81. ]
  82. for image_url in image_url_list2:
  83. image = load_image_from_cos(image_url)
  84. image_base = pil_image_to_base64(image)
  85. content2.append(
  86. {
  87. "type": "image_url",
  88. "image_url": {"url": image_base}
  89. }
  90. )
  91. response = self.client.chat.completions.create(
  92. model=self.model_name,
  93. messages=[
  94. {
  95. "content": content1,
  96. "role": "user"
  97. },
  98. {
  99. "content": content2,
  100. "role": "user"
  101. }
  102. ],
  103. response_format = {
  104. "type": "json_object"
  105. }
  106. )
  107. return response.choices[0].message
  108. def image_response(self, query, image_url1, image_url2):
  109. """单图像问答"""
  110. image1 = load_image_from_cos(image_url1)
  111. image1_base = pil_image_to_base64(image1)
  112. image2 = load_image_from_cos(image_url2)
  113. image2_base = pil_image_to_base64(image2)
  114. response = self.client.chat.completions.create(
  115. model="glm-4v-plus-0111",
  116. messages=[
  117. {
  118. "role": "user",
  119. "content": [
  120. {
  121. "type": "text",
  122. "text": query
  123. },
  124. {
  125. "type": "image_url",
  126. "image_url": {"url": image1_base}
  127. },
  128. {
  129. "type": "image_url",
  130. "image_url": {"url": image2_base}
  131. }
  132. ]
  133. }
  134. ],
  135. response_format = {
  136. "type": "json_object"
  137. }
  138. )
  139. return response.choices[0].message
  140. def multi_epoch_image_response(self, logo_path, image_url, query):
  141. """多轮图像问答"""
  142. image_base = image_to_base(logo_path)
  143. response = self.client.chat.completions.create(
  144. model=self.model_name,
  145. messages=[
  146. {
  147. "content": [
  148. {
  149. "image_url": {"url": image_base},
  150. "type": "image_url"
  151. },
  152. {
  153. "text": "这是李宁的logo",
  154. "type": "text"
  155. }
  156. ],
  157. "role": "user"
  158. },
  159. {
  160. "content": [
  161. {
  162. "image_url": {"url": image_url},
  163. "type": "image_url"
  164. },
  165. {
  166. "text": query,
  167. "type": "text"
  168. }
  169. ],
  170. "role": "user"
  171. }
  172. ],
  173. response_format = {
  174. "type": "json_object"
  175. }
  176. )
  177. return response.choices[0].message
  178. def set_modelname(self, modelname):
  179. self.model_name = modelname