난수 추출 타로 점 요약
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']}
...
[구체적인 지시사항]
사용자의 고민을 고려하여 이 카드가 의미하는 바와 연결해서...
중요: 해석을 마친 후 추가 질문이나 "원하시면" 같은 확장 유도는 하지 말고,
결론으로 깔끔하게 끝내세요.
"""
프롬프트 작성 베스트 프랙티스:
- 구조화된 형식 - ## 섹션으로 정보를 명확히 구분
- 컨텍스트 제공 - AI가 필요한 모든 정보를 한 곳에 제시
- 명시적 제약 - "~하지 말고", "두 줄 이하" 같은 명확한 지시
📌 4. 전체 아키텍처 흐름
main.py (사용자 입력)
↓
chat.py (AI 스트리밍)
↓
database.py (카드 데이터 조회)
↓
crawl.py (크롤러: 데이터 수집)
분리의 장점:
- 관심사의 분리 - 각 모듈이 한 가지 책임만 담당
- 재사용성 - chat.py는 아무 곳에서나 import해서 사용 가능
- 테스트 용이 - 각 모듈을 독립적으로 테스트 가능
💡 실무 적용 팁
- 크롤링 할 때 - 항상 time.sleep() 추가해서 서버 부하 고려
- API 호출 - 스트리밍이 있으면 UX가 훨씬 나음 (응답 대기 감소)
- 상태 관리 - 복잡한 파싱은 상태 머신으로 생각하면 디버깅이 쉬움
- 프롬프트 - 자연어로 자세히 쓸수록 AI 응답 품질 ↑
반응형
'taro' 카테고리의 다른 글
| 타로 개발 스탭 (0) | 2026.04.10 |
|---|---|
| database 구현 요약 (1) | 2026.04.09 |
| crawl.py (1) | 2026.04.09 |