glm.py 5.2 KB

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