Explorar el Código

完善关键词引流流程

yangzeyu hace 9 meses
padre
commit
8cf9cfff68
Se han modificado 5 ficheros con 123 adiciones y 22 borrados
  1. 8 0
      agent/agent.py
  2. 19 1
      agent/config.py
  3. 51 0
      agent/glm.py
  4. 11 6
      api_test.py
  5. 34 15
      utils/api_service.py

+ 8 - 0
agent/agent.py

@@ -82,6 +82,14 @@ class Agent:
         response = response.content
         
         return response
+    
+    def multi_products_images_similarity_judgement(self, product_image_url_list, basic_product_image_url_list):
+        self.glm.set_modelname("glm-4v-plus-0111")
+        prompt = Prompt.MULTI_PRODUCT_JUDGEMENT
+        response = self.glm.multi_images_similarity_judge(product_image_url_list, basic_product_image_url_list, prompt)
+        response = response.content
+        
+        return response
         
 
 if __name__ == "__main__":

+ 19 - 1
agent/config.py

@@ -88,7 +88,7 @@ class Prompt:
     # 从产品图像中获取商标
     LOGO_FROM_PRODUCTS = f"""
         你是一个产品图像分析助手,需要从给定的图像中提取出包含的商标信息名称,请按照以下步骤进行分析:
-        1. 分析每张图像中是否包含商标名称信息,注意不要将店铺名称识别为商标名称,如果包含的话,请提取出商标名称。
+        1. 分析每张图像中是否包含商标logo名称信息,如果包含的话,请提取出商标名称,注意请不要将店铺名称或代理商名称错认为是商标名称,比如“京牌体育”等
         2. 如果从不同图像中提取出不同的商标名称,请先对比提取出的商标名称是否代表同一个商标,比如adidas和阿迪达斯、lining和李宁,如果代表相同的商标,则合并为一个商标名称,如果不代表同一个商标,则以列表的形式返回多个商标名称。
         最终结果返回为以下给出的json格式
         输出结果示例:
@@ -110,6 +110,24 @@ class Prompt:
         }}
     """
     
+    MULTI_PRODUCT_JUDGEMENT = f"""
+        以上是第二组图像,是授权生产的产品图像
+        你现在是一个产品图像分析助手,需要严格的判断第一组图像的产品图像中的产品是否存在与第二组图像中的产品一样的产品。
+        1. 定位产品位置,请只分析图像中产品图像的部分
+        2. 核心特征对比:首先确认两者是否属于同一类产品。其次从形状/结构、颜色/图案(注意光照导致的色差)、品牌标识(LOGO、商标细节等)等细致特征。如果颜色不一致,其他特征一致也判断为一致产品。
+        最终结果按照以下的示例给出标准的json格式
+        输出结果示例:
+        如果判断第一组图像中的产品与第二组图像中的产品有一样的
+        {{
+            'is_similarity_product': true
+        }}
+        如果没有则返回:
+        {{
+            'is_similarity_product': false
+        }}
+        最终结果一定要严格的按照json格式输出
+    """
+    
     
     
 if __name__ == "__main__":

+ 51 - 0
agent/glm.py

@@ -60,6 +60,57 @@ class Glm:
         
         return response.choices[0].message
     
+    def multi_images_similarity_judge(self, image_url_list1, image_url_list2, query):
+        """多组图像中的产品图像相似度对比"""
+        content1 = [
+            {
+                "text": '这是第一组图像,商品信息中的产品图像',
+                "type": "text"
+            }
+        ]
+        
+        for image_url in image_url_list1:
+            content1.append(
+                {
+                    "type": "image_url",
+                    "image_url": {"url": image_url}
+                }
+            )
+        
+        content2 = [
+            {
+                "text": query,
+                "type": "text"
+            }
+        ]
+        
+        for image_url in image_url_list2:
+            content2.append(
+                {
+                    "type": "image_url",
+                    "image_url": {"url": image_url}
+                }
+            )
+            
+        response = self.client.chat.completions.create(
+            model=self.model_name,
+            messages=[
+                {
+                    "content": content1,
+                    "role": "user"
+                },
+                {
+                    "content": content2,
+                    "role": "user"
+                }
+            ],
+            response_format = {
+                "type": "json_object"
+            }
+        )
+        
+        return response.choices[0].message
+    
     def image_response(self, query, image_url1, image_url2):
         """单图像问答"""
         response = self.client.chat.completions.create(

+ 11 - 6
api_test.py

@@ -35,14 +35,19 @@ import json
 # response = requests.post(url, data=json.dumps(payload), headers=headers)
 # print(response.json())
 
-url = "https://670813644644357-http-7860.northwest1.gpugeek.com:8443/brandanalysis/api/v1/infringe_judgement"
+# url = "https://670813644644357-http-7860.northwest1.gpugeek.com:8443/brandanalysis/api/v1/infringe_judgement"
+url = "http://172.18.1.189:7860/brandanalysis/api/v1/infringe_judgement"
 url_data = {
-    'title': '李宁男子运动卫衣舒适套头圆领长袖休闲运动卫衣',
+    'title': '李宁云缓震跑步鞋男鞋2025新款春夏季网面透气休闲运动鞋男慢跑鞋',
     'brand_name': '李宁',
     'product_images': [
-        'http://h2.appsimg.com/a.appsimg.com/upload/merchandise/pdcvis/613214/2024/0902/118/27466cf6-fb28-4580-9009-95a3763e06bf.jpg',
-        'http://h2.appsimg.com/a.appsimg.com/upload/merchandise/pdcvis/613214/2024/1120/169/8ca15632-9cb9-40e7-8915-e6773e17a05e.jpg'  
-    ],
+            "https://gw.alicdn.com/imgextra/O1CN01rMR0141uTSU983635_!!2145866038.jpg_q95.jpg_.webp",
+            "https://img.alicdn.com/imgextra/i4/2145866038/O1CN01ZM1xNI1uTSTGvavrL_!!2145866038.jpg_q75.jpg_.webp",
+            "https://img.alicdn.com/imgextra/i4/2145866038/O1CN01QaaAgt1uTSTFOdQGD_!!2145866038.jpg_q75.jpg_.webp",
+            "https://img.alicdn.com/imgextra/i4/2145866038/O1CN01dPZcPe1uTSSEBeiwS_!!2145866038.jpg_q75.jpg_.webp",
+            "https://img.alicdn.com/imgextra/i3/2145866038/O1CN018tszjT1uTSNbo83rm_!!2145866038.jpg_q75.jpg_.webp",
+            "https://img.alicdn.com/imgextra/i3/2145866038/O1CN017JGmX21uTSPqUQmQ8_!!2145866038.jpg_q75.jpg_.webp"
+        ],
     'price': 19.9
 }
 
@@ -66,7 +71,7 @@ basic_data = {
 payload = {
     'url_data': url_data,
     'basic_data': basic_data,
-    'judgement_type': [1, 2, 3, 7]
+    'judgement_type': [1]
 }
 headers = {'Content-Type': 'application/json'}
 

+ 34 - 15
utils/api_service.py

@@ -9,7 +9,7 @@ class ApiService:
     @staticmethod
     def keyword_judgement(url_data, basic_data):
         """关键词引流判断"""
-        if url_data['title'] == None or url_data['brand_name'] == None or basic_data['brand_name'] == None:
+        if url_data['title'] == None or url_data['brand_name'] == None or basic_data['brand_name'] == None or len(url_data['product_images']) == 0:
             return '信息不全,无法判定'
         
         # 标题判定
@@ -17,11 +17,21 @@ class ApiService:
             # 当产品名称中包含与判定商标一致的品牌名称,且详情页中的品牌名称与判定的品牌名称不一致时判定为关键词引流
             return True
 
-        elif url_data['brand_name'] == basic_data['brand_name'] or basic_data['brand_name'] not in url_data['title']:
-            return False
-        else:
-            # 图像判定
-            pass
+        if url_data['brand_name'] == basic_data['brand_name'] and basic_data['brand_name'] in url_data['title']:
+            """商品信息中的商品名称、品牌名称于基础数据中的商标名称完全一致时,使用图像判定"""
+            # 判断商标
+            logos_info = json.loads(ApiService.agent.get_log_from_product_images(url_data['product_images']))
+            if logos_info['is_contained_logo']:
+                for log_name in logos_info['logo_infos']:
+                    if log_name.strip() != basic_data['brand_name'] and log_name.strip() != 'LI-NING':
+                        return True
+            
+            # 与授权商品对比
+            similarity_judgement = json.loads(ApiService.agent.multi_products_images_similarity_judgement(url_data['product_images'], basic_data['product_images']))
+            if similarity_judgement['is_similarity_product']:
+                return False
+            else:
+                return True
         
         # 图像判定
         return "无法判定"
@@ -140,13 +150,22 @@ if __name__ == '__main__':
     # }
     # result = ApiService.low_price_judgement(url_data, basic_data)
     # print(result)
-    image_url_list = [
-        "https://gw.alicdn.com/imgextra/O1CN01mDNtUa1uTSNizl8CS_!!2145866038.jpg_q95.jpg_.webp",
-        "https://img.alicdn.com/imgextra/i3/2145866038/O1CN01HMNblk1uTSPJszeS0_!!2145866038.jpg_q75.jpg_.webp",
-        "https://img.alicdn.com/imgextra/i4/2145866038/O1CN01dPZcPe1uTSSEBeiwS_!!2145866038.jpg_q75.jpg_.webp",
-        "https://img.alicdn.com/imgextra/i3/2145866038/O1CN018tszjT1uTSNbo83rm_!!2145866038.jpg_q75.jpg_.webp",
-        "https://img.alicdn.com/imgextra/i1/2145866038/O1CN01cWdXAM1uTSPoM4aUG_!!2145866038.jpg_q75.jpg_.webp",
-        "https://img.alicdn.com/imgextra/i1/2145866038/O1CN01Chj95b1uTSPo2MbWn_!!2145866038.jpg_q75.jpg_.webp"
+    product_list = [
+            "https://gw.alicdn.com/imgextra/O1CN01SRLgJ11JdrhxIPXGd_!!3378851052.jpg_q95.jpg_.webp",
+            "https://img.alicdn.com/imgextra/i2/3378851052/O1CN01UpWwyY1JdrUq6MJvu_!!3378851052.jpg_q75.jpg_.webp",
+            "https://img.alicdn.com/imgextra/i2/3378851052/O1CN01qRzu8W1JdraPoEnyK_!!3378851052.jpg_q75.jpg_.webp",
+            "https://img.alicdn.com/imgextra/i2/3378851052/O1CN0150gjbG1JdrUplO3bP_!!3378851052.jpg_q75.jpg_.webp",
+            "https://img.alicdn.com/imgextra/i4/3378851052/O1CN01Cw6aaG1Jdra8AwqW7_!!3378851052.jpg_q75.jpg_.webp",
+            "https://img.alicdn.com/imgextra/i1/3378851052/O1CN01PMPzQN1JdrUoKrsqo_!!3378851052.jpg_q75.jpg_.webp"
+        ]
+    
+    basic_product_list = [
+        "https://gw.alicdn.com/imgextra/O1CN01EFpxoy1JdrhyyD8Gp_!!3378851052.jpg_q95.jpg_.webp",
+        "https://img.alicdn.com/imgextra/i2/3378851052/O1CN01N1VBKz1JdriDQ7v3s_!!3378851052.jpg_q75.jpg_.webp",
+        "https://img.alicdn.com/imgextra/i4/3378851052/O1CN01d1T16h1JdriBxQW8j_!!3378851052.jpg_q75.jpg_.webp",
+        "https://img.alicdn.com/imgextra/i4/3378851052/O1CN01O5Gb861JdriAyGLo0_!!3378851052.jpg_q75.jpg_.webp",
+        "https://img.alicdn.com/imgextra/i1/3378851052/O1CN01WT8Kg81JdriDTZ4lq_!!3378851052.jpg_q75.jpg_.webp",
+        "https://img.alicdn.com/imgextra/i2/3378851052/O1CN01v4KL0D1JdriCrG3SH_!!3378851052.jpg_q75.jpg_.webp"
     ]
-    response = ApiService.agent.get_log_from_product_images(image_url_list)
-    print(response)
+    response = ApiService.agent.multi_products_images_similarity_judgement(product_list, basic_product_list)
+    print(response)