remove report and old output format

feature-youtube-upload
jaehwang 2026-01-30 00:34:38 +00:00
parent 2e27eb5742
commit abd098e4c0
2 changed files with 112 additions and 19 deletions

View File

@ -24,8 +24,8 @@ from app.home.schemas.home_schema import (
ImageUploadResponse, ImageUploadResponse,
ImageUploadResultItem, ImageUploadResultItem,
ImageUrlItem, ImageUrlItem,
MarketingAnalysis,
ProcessedInfo, ProcessedInfo,
# MarketingAnalysis,
) )
from app.home.services.naver_search import naver_search_client from app.home.services.naver_search import naver_search_client
from app.utils.upload_blob_as_request import AzureBlobUploader 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()}" f"structured_report = {structured_report.model_dump()}"
) )
marketing_analysis = MarketingAnalysis( marketing_analysis = structured_report
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'])
step3_4_elapsed = (time.perf_counter() - step3_4_start) * 1000 step3_4_elapsed = (time.perf_counter() - step3_4_start) * 1000
logger.debug( logger.debug(
f"[crawling] Step 3-4: 응답 파싱 완료 ({step3_4_elapsed:.1f}ms)" f"[crawling] Step 3-4: 응답 파싱 완료 ({step3_4_elapsed:.1f}ms)"

View File

@ -195,10 +195,10 @@ class ProcessedInfo(BaseModel):
# summary : str = Field(..., description="비즈니스 한 줄 요약") # summary : str = Field(..., description="비즈니스 한 줄 요약")
# details : list[MarketingAnalysisDetail] = Field(default_factory=list, 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="추천 태그 목록") # tags: list[str] = Field(default_factory=list, description="추천 태그 목록")
# selling_points: 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" "detail_region_info": "전북특별자치도 군산시 절골길 18"
}, },
"marketing_analysis": { "marketing_analysis": {
"report": "마케팅 분석 리포트...", "brand_identity": {
"tags": ["힐링", "감성숙소"], "location_feature_analysis": "전북 군산시 절골길 일대는 도시의 편의성과 근교의 한적함을 동시에 누릴 수 있어 ‘조용한 재충전’ 수요에 적합합니다. 군산의 레트로 감성과 주변 관광 동선 결합이 쉬워 1~2박 체류형 여행지로 매력적입니다.",
"facilities": ["조식", "주차"] "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( processed_info: Optional[ProcessedInfo] = Field(
None, description="가공된 장소 정보 (customer_name, region, detail_region_info)" None, description="가공된 장소 정보 (customer_name, region, detail_region_info)"
) )
marketing_analysis: Optional[MarketingAnalysis] = Field( marketing_analysis: Optional[MarketingPromptOutput] = Field(
None, description="마케팅 분석 결과 (report, tags, facilities). 실패 시 null" None, description="마케팅 분석 결과 . 실패 시 null"
) )