glm.py 6.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190
  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 image_response(self, query, image_url1, image_url2):
  58. """单图像问答"""
  59. response = self.client.chat.completions.create(
  60. model="glm-4v-plus-0111",
  61. messages=[
  62. {
  63. "role": "user",
  64. "content": [
  65. {
  66. "type": "text",
  67. "text": query
  68. },
  69. {
  70. "type": "image_url",
  71. "image_url": {"url": image_url1}
  72. },
  73. {
  74. "type": "image_url",
  75. "image_url": {"url": image_url2}
  76. }
  77. ]
  78. }
  79. ],
  80. response_format = {
  81. "type": "json_object"
  82. }
  83. )
  84. return response.choices[0].message
  85. def multi_epoch_image_response(self, logo_path, image_url, query):
  86. """多轮图像问答"""
  87. image_base = image_to_base(logo_path)
  88. response = self.client.chat.completions.create(
  89. model=self.model_name,
  90. messages=[
  91. {
  92. "content": [
  93. {
  94. "image_url": {"url": image_base},
  95. "type": "image_url"
  96. },
  97. {
  98. "text": "这是李宁的logo",
  99. "type": "text"
  100. }
  101. ],
  102. "role": "user"
  103. },
  104. {
  105. "content": [
  106. {
  107. "image_url": {"url": image_url},
  108. "type": "image_url"
  109. },
  110. {
  111. "text": query,
  112. "type": "text"
  113. }
  114. ],
  115. "role": "user"
  116. }
  117. ],
  118. response_format = {
  119. "type": "json_object"
  120. }
  121. )
  122. return response.choices[0].message
  123. def web_search_in_chat(self, search_prompt, content):
  124. """网络搜索工具"""
  125. tools = [{
  126. "type": "web_search",
  127. "web_search": {
  128. "enable": True,
  129. "search_engine": "search_pro_sogou", # 选择搜索引擎
  130. "search_result": True,
  131. "search_prompt": search_prompt,
  132. }
  133. }]
  134. messages = [{
  135. "role": "user",
  136. "content": content
  137. }]
  138. response = self.client.chat.completions.create(
  139. model=self.model_name,
  140. messages=messages,
  141. tools=tools,
  142. response_format={
  143. "type": "json_object"
  144. }
  145. )
  146. return response.choices[0].message
  147. def set_modelname(self, modelname):
  148. self.model_name = modelname
  149. if __name__ == '__main__':
  150. glm = Glm()
  151. glm.set_modelname("glm-4v-plus-0111")
  152. query = f"""
  153. 你是一个产品图像分析助手,你的任务是判断第二张图像中的产品上是否包含logo,并与第一张logo图像做对比,判断第二张图像中的logo是否与第一张的一致。
  154. 判断思路:
  155. 1. 首先判断第二张图像中是否包含logo。
  156. 2. 如果包含logo的话,再进行判断,是否与第一张的logo一致。
  157. 3. 如果与第一张的logo不一致,请根据你的经验判断图像中的logo是什么品牌,如果不知道返回'未知'
  158. 最终结果返回为以下给出的json格式
  159. 输出结果示例:
  160. {{
  161. "is_contain_logo": false
  162. }}
  163. {{
  164. "is_contain_logo": true,
  165. "is_jugement_logo": true,
  166. "brand_name": "李宁"
  167. }}
  168. """
  169. 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)
  170. print(response.content)