From abd098e4c087d41c1f49ad92852a05d61ef11711 Mon Sep 17 00:00:00 2001 From: jaehwang Date: Fri, 30 Jan 2026 00:34:38 +0000 Subject: [PATCH] remove report and old output format --- app/home/api/routers/v1/home.py | 14 +--- app/home/schemas/home_schema.py | 117 +++++++++++++++++++++++++++++--- 2 files changed, 112 insertions(+), 19 deletions(-) diff --git a/app/home/api/routers/v1/home.py b/app/home/api/routers/v1/home.py index d5bb7c1..2cc351a 100644 --- a/app/home/api/routers/v1/home.py +++ b/app/home/api/routers/v1/home.py @@ -24,8 +24,8 @@ from app.home.schemas.home_schema import ( ImageUploadResponse, ImageUploadResultItem, ImageUrlItem, - MarketingAnalysis, ProcessedInfo, + # MarketingAnalysis, ) from app.home.services.naver_search import naver_search_client from app.utils.upload_blob_as_request import AzureBlobUploader @@ -306,16 +306,8 @@ async def _crawling_logic(url:str): f"structured_report = {structured_report.model_dump()}" ) - marketing_analysis = MarketingAnalysis( - report = structured_report - # report = structured_report["report"], - # tags=structured_report["tags"], - # selling_points = structured_report["selling_points"]# list([sp['keywords'] for sp in structured_report["selling_points"]])# [json.dumps(structured_report["selling_points"])] # 나중에 Selling Points로 변수와 데이터구조 변경할 것 - ) - # Selling Points 구조 - # print(sp['category']) - # print(sp['keywords']) - # print(sp['description']) + marketing_analysis = structured_report + step3_4_elapsed = (time.perf_counter() - step3_4_start) * 1000 logger.debug( f"[crawling] Step 3-4: 응답 파싱 완료 ({step3_4_elapsed:.1f}ms)" diff --git a/app/home/schemas/home_schema.py b/app/home/schemas/home_schema.py index b2d6bbf..6eb3245 100644 --- a/app/home/schemas/home_schema.py +++ b/app/home/schemas/home_schema.py @@ -195,10 +195,10 @@ class ProcessedInfo(BaseModel): # summary : str = Field(..., description="비즈니스 한 줄 요약") # details : list[MarketingAnalysisDetail] = Field(default_factory=list, description="개별 디테일") -class MarketingAnalysis(BaseModel): - """마케팅 분석 결과 스키마""" +# class MarketingAnalysis(BaseModel): +# """마케팅 분석 결과 스키마""" - report: MarketingPromptOutput = Field(..., description = "마케팅 분석 결과")# MarketingAnalysisReport = Field(..., description="마케팅 분석 리포트") +# # report: MarketingAnalysisReport = Field(..., description="마케팅 분석 리포트") # tags: list[str] = Field(default_factory=list, description="추천 태그 목록") # selling_points: list[str] = Field(default_factory=list, description="추천 부대시설 목록") @@ -218,9 +218,110 @@ class CrawlingResponse(BaseModel): "detail_region_info": "전북특별자치도 군산시 절골길 18" }, "marketing_analysis": { - "report": "마케팅 분석 리포트...", - "tags": ["힐링", "감성숙소"], - "facilities": ["조식", "주차"] + "brand_identity": { + "location_feature_analysis": "전북 군산시 절골길 일대는 도시의 편의성과 근교의 한적함을 동시에 누릴 수 있어 ‘조용한 재충전’ 수요에 적합합니다. 군산의 레트로 감성과 주변 관광 동선 결합이 쉬워 1~2박 체류형 여행지로 매력적입니다.", + "concept_scalability": "‘머뭄’이라는 네이밍을 ‘잠시 멈춰 머무는 시간’으로 확장해, 느린 체크인·명상/독서 큐레이션·로컬 티/다과 등 체류 경험형 서비스로 고도화가 가능합니다. 로컬 콘텐츠(군산 빵/커피, 근대문화 투어)와 결합해 패키지화하면 재방문 명분을 만들 수 있습니다." + }, + "market_positioning": { + "category_definition": "군산 감성 ‘슬로우 스테이’ 프라이빗 숙소", + "core_value": "아무것도 하지 않아도 회복되는 ‘멈춤의 시간’" + }, + "target_persona": [ + { + "persona": "번아웃 회복형 직장인 커플: 주말에 조용히 쉬며 리셋을 원하는 2인 여행자", + "age": { + "min_age": 27, + "max_age": 39 + }, + "favor_target": [ + "조용한 동네 분위기", + "미니멀/내추럴 인테리어", + "편안한 침구와 숙면 환경", + "셀프 체크인 선호", + "카페·맛집 연계 동선" + ], + "decision_trigger": "‘조용히 쉬는 데 최적화’된 프라이빗함과 숙면 컨디션(침구/동선/소음 차단) 확신" + }, + { + "persona": "감성 기록형 친구 여행: 사진과 무드를 위해 공간을 선택하는 2~3인 여성 그룹", + "age": { + "min_age": 23, + "max_age": 34 + }, + "favor_target": [ + "자연광 좋은 공간", + "감성 소품/컬러 톤", + "포토존(거울/창가/테이블)", + "와인·디저트 페어링", + "야간 무드 조명" + ], + "decision_trigger": "사진이 ‘그대로 작품’이 되는 포토 스팟과 야간 무드 연출 요소" + }, + { + "persona": "로컬 탐험형 소도시 여행자: 군산의 레트로/로컬 콘텐츠를 깊게 즐기는 커플·솔로", + "age": { + "min_age": 28, + "max_age": 45 + }, + "favor_target": [ + "근대문화/레트로 감성", + "로컬 맛집·빵집 투어", + "동선 효율(차로 이동 용이)", + "체크아웃 후 관광 연계", + "조용한 밤" + ], + "decision_trigger": "‘군산 로컬 동선’과 결합하기 좋은 위치 + 숙소 자체의 휴식 완성도" + } + ], + "selling_points": [ + { + "category": "LOCATION", + "description": "군산 감성 동선", + "score": 88 + }, + { + "category": "HEALING", + "description": "멈춤이 되는 쉼", + "score": 92 + }, + { + "category": "PRIVACY", + "description": "방해 없는 머뭄", + "score": 86 + }, + { + "category": "NIGHT MOOD", + "description": "밤이 예쁜 조명", + "score": 84 + }, + { + "category": "PHOTO SPOT", + "description": "자연광 포토존", + "score": 83 + }, + { + "category": "SHORT GETAWAY", + "description": "주말 리셋 스테이", + "score": 89 + }, + { + "category": "HOSPITALITY", + "description": "세심한 웰컴감", + "score": 80 + } + ], + "target_keywords": [ + "군산숙소", + "군산감성숙소", + "전북숙소추천", + "군산여행", + "커플스테이", + "주말여행", + "감성스테이", + "조용한숙소", + "힐링스테이", + "스테이머뭄" + ] } } } @@ -235,8 +336,8 @@ class CrawlingResponse(BaseModel): processed_info: Optional[ProcessedInfo] = Field( None, description="가공된 장소 정보 (customer_name, region, detail_region_info)" ) - marketing_analysis: Optional[MarketingAnalysis] = Field( - None, description="마케팅 분석 결과 (report, tags, facilities). 실패 시 null" + marketing_analysis: Optional[MarketingPromptOutput] = Field( + None, description="마케팅 분석 결과 . 실패 시 null" )