glm.py 7.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241
  1. from config import load_config
  2. from utils import image_to_base
  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. content.append(
  39. {
  40. "type": "image_url",
  41. "image_url": {"url": image_url}
  42. }
  43. )
  44. response = self.client.chat.completions.create(
  45. model="glm-4v-plus-0111",
  46. messages=[
  47. {
  48. "role": "user",
  49. "content": content
  50. }
  51. ],
  52. response_format={
  53. "type": "json_object"
  54. }
  55. )
  56. return response.choices[0].message
  57. def multi_images_similarity_judge(self, image_url_list1, image_url_list2, query):
  58. """多组图像中的产品图像相似度对比"""
  59. content1 = [
  60. {
  61. "text": '这是第一组图像,商品信息中的产品图像',
  62. "type": "text"
  63. }
  64. ]
  65. for image_url in image_url_list1:
  66. content1.append(
  67. {
  68. "type": "image_url",
  69. "image_url": {"url": image_url}
  70. }
  71. )
  72. content2 = [
  73. {
  74. "text": query,
  75. "type": "text"
  76. }
  77. ]
  78. for image_url in image_url_list2:
  79. content2.append(
  80. {
  81. "type": "image_url",
  82. "image_url": {"url": image_url}
  83. }
  84. )
  85. response = self.client.chat.completions.create(
  86. model=self.model_name,
  87. messages=[
  88. {
  89. "content": content1,
  90. "role": "user"
  91. },
  92. {
  93. "content": content2,
  94. "role": "user"
  95. }
  96. ],
  97. response_format = {
  98. "type": "json_object"
  99. }
  100. )
  101. return response.choices[0].message
  102. def image_response(self, query, image_url1, image_url2):
  103. """单图像问答"""
  104. response = self.client.chat.completions.create(
  105. model="glm-4v-plus-0111",
  106. messages=[
  107. {
  108. "role": "user",
  109. "content": [
  110. {
  111. "type": "text",
  112. "text": query
  113. },
  114. {
  115. "type": "image_url",
  116. "image_url": {"url": image_url1}
  117. },
  118. {
  119. "type": "image_url",
  120. "image_url": {"url": image_url2}
  121. }
  122. ]
  123. }
  124. ],
  125. response_format = {
  126. "type": "json_object"
  127. }
  128. )
  129. return response.choices[0].message
  130. def multi_epoch_image_response(self, logo_path, image_url, query):
  131. """多轮图像问答"""
  132. image_base = image_to_base(logo_path)
  133. response = self.client.chat.completions.create(
  134. model=self.model_name,
  135. messages=[
  136. {
  137. "content": [
  138. {
  139. "image_url": {"url": image_base},
  140. "type": "image_url"
  141. },
  142. {
  143. "text": "这是李宁的logo",
  144. "type": "text"
  145. }
  146. ],
  147. "role": "user"
  148. },
  149. {
  150. "content": [
  151. {
  152. "image_url": {"url": image_url},
  153. "type": "image_url"
  154. },
  155. {
  156. "text": query,
  157. "type": "text"
  158. }
  159. ],
  160. "role": "user"
  161. }
  162. ],
  163. response_format = {
  164. "type": "json_object"
  165. }
  166. )
  167. return response.choices[0].message
  168. def web_search_in_chat(self, search_prompt, content):
  169. """网络搜索工具"""
  170. tools = [{
  171. "type": "web_search",
  172. "web_search": {
  173. "enable": True,
  174. "search_engine": "search_pro_sogou", # 选择搜索引擎
  175. "search_result": True,
  176. "search_prompt": search_prompt,
  177. }
  178. }]
  179. messages = [{
  180. "role": "user",
  181. "content": content
  182. }]
  183. response = self.client.chat.completions.create(
  184. model=self.model_name,
  185. messages=messages,
  186. tools=tools,
  187. response_format={
  188. "type": "json_object"
  189. }
  190. )
  191. return response.choices[0].message
  192. def set_modelname(self, modelname):
  193. self.model_name = modelname
  194. if __name__ == '__main__':
  195. glm = Glm()
  196. glm.set_modelname("glm-4v-plus-0111")
  197. query = f"""
  198. 你是一个产品图像分析助手,你的任务是判断第二张图像中的产品上是否包含logo,并与第一张logo图像做对比,判断第二张图像中的logo是否与第一张的一致。
  199. 判断思路:
  200. 1. 首先判断第二张图像中是否包含logo。
  201. 2. 如果包含logo的话,再进行判断,是否与第一张的logo一致。
  202. 3. 如果与第一张的logo不一致,请根据你的经验判断图像中的logo是什么品牌,如果不知道返回'未知'
  203. 最终结果返回为以下给出的json格式
  204. 输出结果示例:
  205. {{
  206. "is_contain_logo": false
  207. }}
  208. {{
  209. "is_contain_logo": true,
  210. "is_jugement_logo": true,
  211. "brand_name": "李宁"
  212. }}
  213. """
  214. response = glm.multi_epoch_image_response("./logo/lining.jpg", "http://h2.appsimg.com/a.appsimg.com/upload/merchandise/pdcvis/613214/2024/1120/88/9b9027dd-95b7-4024-b71e-fb7cbfde16a1.jpg", query)
  215. print(response.content)