난수 추출 타로 점 요약

2026. 4. 10. 11:12ㆍtaro

. chat.py - AI API 스트리밍 처리

📖 배운 점: 스트리밍 응답 처리 패턴

# OpenAI API에서 스트리밍 응답받기
stream = client.responses.create(
    model="gpt-5.4-nano",
    input=[{"role": "user", "content": prompt}],
    stream=True,  # 스트리밍 활성화
)

# 청크(chunk) 단위로 실시간 처리
for chunk in stream:
    if chunk.type == "response.output_text.delta":
        print(chunk.delta, end="", flush=True)  # 버퍼링 없이 즉시 출력

핵심 개념:

  • stream=True : 전체 응답을 기다리지 않고 실시간으로 받음
  • chunk.type : 청크의 타입을 확인하여 필요한 데이터만 처리
  • flush=True : 버퍼를 즉시 비워서 사용자가 실시간으로 응답을 볼 수 있음

📌 2. crawl.py - 상태 머신 패턴으로 복잡한 데이터 파싱

📖 배운 점: 계층적 상태 관리로 구조화된 데이터 추출

핵심 구조

current_mode = "공통"      # 상위 상태: 공통 → 정방향 → 역방향
current_sub = None        # 하위 상태: 해석, 사랑, 커리어, 금전, 건강

상태 전환 흐름

# 1단계: 상위 상태 전환
if "1. 정방향" in text:
    current_mode = "정방향"
    current_sub = None

# 2단계: 하위 상태 전환 (정방향/역방향 모드일 때만)
if current_mode in ["정방향", "역방향"]:
    if "① 해석" in text: 
        current_sub = "해석"

# 3단계: 데이터 저장 (현재 상태에 따라)
if current_mode == "공통":
    result["공통해석"] += text + " "
elif current_mode in ["정방향", "역방향"] and current_sub:
    result[current_mode][current_sub] += text + " "

왜 이 패턴이 좋은가?

  • HTML 구조가 불규칙할 때, 트리거 키워드로 상태를 관리
  • 각 상태에서 다른 처리 로직을 간결하게 분기 가능
  • 복잡한 중첩 if문 대신 명확한 상태 머신으로 가독성 향상

📖 BeautifulSoup Selector 활용

# Fallback selector - 여러 선택자를 순차 시도
title_tag = soup.select_one('.tt_article_useless_p_margin h2 b') or \
            soup.select_one('h2 b') or \
            soup.select_one('h2')

실무 팁: 웹사이트의 HTML 구조는 언제든 변할 수 있으므로, OR 연산자로 여러 선택자를 연결하면 유연한 크롤러 작성 가능


📌 3. main.py - 프롬프트 엔지니어링과 모듈 조율

📖 배운 점: 효과적인 AI 프롬프트 작성

prompt = f"""사용자의 고민: {concern}

사용자가 뽑은 타로 카드:
카드명: {reading['card_name']}
방향: {direction_text}

카드 해석 정보:
- 기본 해석: {reading['basic']}
- 사랑 운: {reading['love']}
...

[구체적인 지시사항]
사용자의 고민을 고려하여 이 카드가 의미하는 바와 연결해서...
중요: 해석을 마친 후 추가 질문이나 "원하시면" 같은 확장 유도는 하지 말고, 
결론으로 깔끔하게 끝내세요.
"""

프롬프트 작성 베스트 프랙티스:

  1. 구조화된 형식 - ## 섹션으로 정보를 명확히 구분
  2. 컨텍스트 제공 - AI가 필요한 모든 정보를 한 곳에 제시
  3. 명시적 제약 - "~하지 말고", "두 줄 이하" 같은 명확한 지시

📌 4. 전체 아키텍처 흐름

main.py (사용자 입력) 
    ↓
chat.py (AI 스트리밍)
    ↓
database.py (카드 데이터 조회)
    ↓
crawl.py (크롤러: 데이터 수집)

분리의 장점:

  • 관심사의 분리 - 각 모듈이 한 가지 책임만 담당
  • 재사용성 - chat.py는 아무 곳에서나 import해서 사용 가능
  • 테스트 용이 - 각 모듈을 독립적으로 테스트 가능

💡 실무 적용 팁

  1. 크롤링 할 때 - 항상 time.sleep() 추가해서 서버 부하 고려
  2. API 호출 - 스트리밍이 있으면 UX가 훨씬 나음 (응답 대기 감소)
  3. 상태 관리 - 복잡한 파싱은 상태 머신으로 생각하면 디버깅이 쉬움
  4. 프롬프트 - 자연어로 자세히 쓸수록 AI 응답 품질 ↑
반응형

'taro' 카테고리의 다른 글

타로 개발 스탭  (0) 2026.04.10
database 구현 요약  (1) 2026.04.09
crawl.py  (1) 2026.04.09