ソースを参照

修改推荐路径的判断条件

Sherlock 1 日 前
コミット
aceea8cf27
3 ファイル変更24 行追加10 行削除
  1. 10 5
      api/recommend.py
  2. 2 2
      api_test.py
  3. 12 3
      utils/report_utils.py

+ 10 - 5
api/recommend.py

@@ -1,4 +1,4 @@
-from database import MySqlDao
+from database import MySqlDao, RedisDatabaseHelper
 from fastapi import APIRouter, BackgroundTasks, HTTPException, status
 from .request_body import RecommendRequest
 from core import get_logger
@@ -9,9 +9,14 @@ from utils import FileStreamUtils, ReportUtils
 
 logger = get_logger("api.recommend")
 dao = MySqlDao()
+redis_client = RedisDatabaseHelper().redis
 router = APIRouter()
 
 
+def _get_itemcf_key(city_uuid, product_code):
+    return f"fc:{city_uuid}:{product_code}"
+
+
 @router.post("/recommend")
 async def recommend(request: RecommendRequest, backgroundTasks: BackgroundTasks):
     """推荐接口"""
@@ -27,14 +32,14 @@ async def recommend(request: RecommendRequest, backgroundTasks: BackgroundTasks)
 
     recommend_model = Recommend(request.city_uuid)
 
-    products_in_order = dao.get_product_from_order(request.city_uuid)["product_code"].unique().tolist()
-    if request.product_code in products_in_order:
-        logger.info(f"Using GBDT-LR model for existing product {request.product_code}")
+    itemcf_key = _get_itemcf_key(request.city_uuid, request.product_code)
+    if redis_client.exists(itemcf_key):
+        logger.info(f"Using GBDT-LR model for product {request.product_code}, itemcf_key={itemcf_key}")
         recommend_list = recommend_model.get_recommend_list_by_gbdtlr(
             request.product_code, cust_code_list=request.cust_code_list
         )
     else:
-        logger.info(f"Using Item2Vec model for new product {request.product_code}")
+        logger.info(f"Using Item2Vec model for product {request.product_code}, itemcf_key not found: {itemcf_key}")
         recommend_list = recommend_model.get_recommend_list_by_item2vec(
             request.product_code, cust_code_list=request.cust_code_list
         )

+ 2 - 2
api_test.py

@@ -4,8 +4,8 @@ import json
 url = "http://127.0.0.1:7960/brandcultivation/api/v1/recommend"
 payload = {
     "city_uuid": "00000000000000000000000011445301",
-    "product_code": "700234",
-    "cust_code_list": ["445300108802", "445300108803", "445300104219"],
+    "product_code": "130133",
+    "cust_code_list": [],
     "cultivacation_id": "10000003",
     "limit_cycle_name": "202606W1(06.01-06.07)"
 }

+ 12 - 3
utils/report_utils.py

@@ -1,3 +1,4 @@
+from database import RedisDatabaseHelper
 from database.dao.mysql_dao import MySqlDao
 from models import Recommend
 from models.rank.data.config import CustConfig, ImportanceFeaturesMap, ProductConfig, DeliveryConfig
@@ -11,12 +12,18 @@ from utils.reports_process import feats_relation_process, build_recommend_report
 
 logger = get_logger("utils.report")
 
+
+def _get_itemcf_key(city_uuid, product_code):
+    return f"fc:{city_uuid}:{product_code}"
+
+
 class ReportUtils:
     def __init__(self, city_uuid, product_id):
         self._recommend_model = Recommend(city_uuid)
         self._city_uuid = city_uuid
         self._product_id = product_id
         self._dao = MySqlDao()
+        self._redis = RedisDatabaseHelper().redis
         self._product_data =  self._dao.get_product_by_id(self._city_uuid, self._product_id)[ProductConfig.FEATURE_COLUMNS]
         self._save_dir = os.path.join("./data/reports", city_uuid, product_id)
         
@@ -25,12 +32,14 @@ class ReportUtils:
         
     def _get_recommend_data(self, cust_code_list):
         """获取推荐商户列表"""
-        products_in_order = self._dao.get_product_from_order(self._city_uuid)["product_code"].unique().tolist()
-        if self._product_id in products_in_order:
+        itemcf_key = _get_itemcf_key(self._city_uuid, self._product_id)
+        if self._redis.exists(itemcf_key):
+            logger.info(f"Using GBDT-LR model for report product {self._product_id}, itemcf_key={itemcf_key}")
             recommend_data = self._recommend_model.get_recommend_list_by_gbdtlr(
                 self._product_id, cust_code_list=cust_code_list
             )
         else:
+            logger.info(f"Using Item2Vec model for report product {self._product_id}, itemcf_key not found: {itemcf_key}")
             recommend_data = self._recommend_model.get_recommend_list_by_item2vec(
                 self._product_id, cust_code_list=cust_code_list
             )
@@ -158,4 +167,4 @@ if __name__ == "__main__":
     report = ReportUtils(city_uuid, product_id)
     
     report.generate_eval_data(start_time, end_time)
-    
+