20260331_수업

heeyoung_1023·2026년 3월 31일

멋부사_기록

목록 보기
5/13

13번

디렉토리(directory)는 컴퓨터 파일 시스템에서 파일들을 체계적으로 정리하고 관리하기 위한 저장 공간의 구조입니다. 흔히 "폴더(folder)"라고도 부릅니다.

쉽게 비유하면, 서류를 정리하는 서랍장과 같습니다. 서랍 안에 관련된 서류들을 모아두고, 서랍 안에 또 다른 작은 칸(하위 디렉토리)을 만들 수도 있죠.

핵심 특징을 정리하면 이렇습니다. 디렉토리는 파일과 다른 디렉토리(하위 디렉토리)를 담을 수 있고, 트리(나무) 형태의 계층 구조를 이룹니다. 최상위 디렉토리를 "루트(root) 디렉토리"라고 부르며, Windows에서는 C:\, Linux/macOS에서는 /로 표현합니다.

예를 들어 /home/user/documents/report.pdf라는 경로가 있다면, home, user, documents는 모두 디렉토리이고 report.pdf가 그 안에 들어있는 파일입니다.


백엔드 파트 데이터 흐름구조를 잘짜서 빠르게 잘전달 하는 역할 어떻게 들어와서 어떤로직 어떻게 나가나 ?"

병목? 현상인가?
전반적인흐름처리파악을 알아야한다. -->설계 핵심적역할

제일 먼저 어떤데이터를 어떻게 전달할까 ? 를 먼저 생각해야하는데

  1. 타겟층에게 어떤 플랫폼으로 전달할것인지가 중요

  2. 데이터가 어디에서 들어오나?

  3. 어떻게 처리되나

  4. 어디로 출력될것인지?

  5. drf fast ai 배우는이유

  6. 핵심 --> 어떤데이터를 수집해서 어떤고객층해서 어떤처리(속도 병목 현상 버그 에러 어떻게 처리되나?) 어디로 보낼까 ?

  7. 레스트프레임워크가 확장 유니티 언리얼 안경으로 확장된다.


md 파일 이게 생성형ai 랭귀지파일이여서 잘 읽고 분석하는데 빠르다
우리는 코드나온것에 체크와 잘못된점 경로 변경 지시 간단하게!!

코드를 눈으로 하는게 아니라 . f12번 검수방식이지 눈으로 읽는거아니고
먼저 해야할것은 13번과 전체 흐름처리구조 파일별로 봐라 .

어떤 클래스와 라우터로 움직이고 있는지 파악하기


13번에서 분석 한뒤 정량적 데이터로 이야기하기

14번

ai 모델정의중에서 작은ㅂ분연결
http 통해 json 로 딕션어리 view


══════════════════════════════════════════════════════════════
  AI 서버 전체 로직 흐름  (파일 + 클래스/함수 기준)
══════════════════════════════════════════════════════════════

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
  [서버 시작 시점]  — 이 파일이 import 되는 순간 자동 실행.
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

models/embedding_model.py
  ├── SentenceTransformer("upskyy/e5-small-korean") 로드
  └── embedding_model 전역 객체 생성 (471MB 모델 메모리 적재)
       ↓  이 파일이 import 되는 순간 자동 실행됨

main.py
  ├── FastAPI(title="AI Recommendation Server") 앱 생성
  ├── include_router(recommend_router) 라우터 등록
  │     → /api/v1/recommend/embed      (POST)
  │     → /api/v1/recommend/similarity (POST)
  └── GET / → root() → {"message": "AI server is running"}


━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
  [요청 흐름 1]  POST /api/v1/recommend/embed
  "여러 문장을 임베딩 벡터로 변환해줘"
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

DRF (Django, port 8000)
  ↓  POST /api/v1/recommend/embed
  ↓  body: {"texts": ["문장1", "문장2", "문장3"]}

─────────────────────────────────────────────────────
  api/recommend.py
  └── router = APIRouter(prefix="/api/v1/recommend")
        ↓
      @router.post("/embed")
      def embed_texts(payload: EmbeddingRequest)
        ↓  payload → Pydantic이 JSON을 EmbeddingRequest 객체로 자동 변환
        ↓  검증 실패 시 422 자동 반환 (코드 없이 자동)
─────────────────────────────────────────────────────
  schemas/recommend_schema.py
  └── class EmbeddingRequest(BaseModel)
        ├── texts: List[str]   ← ["문장1", "문장2", "문장3"] 검증
        └── 검증 통과 → payload 객체로 확정

  └── class EmbeddingResponse(BaseModel)
        └── embeddings: List[List[float]]  ← 응답 형식 고정
─────────────────────────────────────────────────────
  services/recommend_service.py
  └── make_embeddings(texts: List[str]) → List[List[float]]
        ↓  embedding_model.encode(texts) 호출
        ↓  numpy 배열 반환
        ↓  [vector.tolist() for vector in vectors]
        └── numpy.ndarray → Python List[float] 변환 완료
─────────────────────────────────────────────────────
  models/embedding_model.py
  └── embedding_model (전역 객체)
        └── .encode(["문장1", "문장2", "문장3"])
              ↓  토크나이징 → 트랜스포머 추론
              └── shape: (3, 384) numpy 배열 반환
─────────────────────────────────────────────────────
  api/recommend.py (복귀)
  └── {"embeddings": [[0.12, ...], [0.14, ...], [0.55, ...]]}
        ↓  EmbeddingResponse 스키마 형식으로 직렬화
        └── JSON 응답 반환

DRF (Django, port 8000)
  └── 응답 수신 → embeddings 벡터 배열 → DB 저장 또는 추가 처리


━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
  [요청 흐름 2]  POST /api/v1/recommend/similarity
  "두 문장이 얼마나 비슷한지 점수로 줘"
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

DRF (Django, port 8000)
  ↓  POST /api/v1/recommend/similarity
  ↓  body: {"text1": "보습력이 좋아요", "text2": "수분감이 오래가요"}

─────────────────────────────────────────────────────
  api/recommend.py
  └── @router.post("/similarity")
      def similarity(payload: SimilarityRequest)
        ↓  JSON → SimilarityRequest 객체 변환
─────────────────────────────────────────────────────
  schemas/recommend_schema.py
  └── class SimilarityRequest(BaseModel)
        ├── text1: str
        └── text2: str

  └── class SimilarityResponse(BaseModel)
        └── similarity: float  ← 응답 형식 고정
─────────────────────────────────────────────────────
  services/recommend_service.py
  └── calculate_similarity(text1, text2) → float
        ↓  embedding_model.encode([text1, text2])
        ↓  vectors[0], vectors[1] 각각 추출
        ↓  cosine_similarity([vectors[0]], [vectors[1]])[0][0]
        │    → sklearn이 내적/크기 계산 → numpy.float32 반환
        └── float(score) → Python float 변환
─────────────────────────────────────────────────────
  models/embedding_model.py
  └── embedding_model.encode([text1, text2])
        ↓  두 문장을 각각 384차원 벡터로 변환
        └── shape: (2, 384) numpy 배열 반환
─────────────────────────────────────────────────────
  api/recommend.py (복귀)
  └── {"similarity": 0.3605}
        ↓  SimilarityResponse 스키마로 직렬화
        └── JSON 응답 반환

DRF (Django, port 8000)
  └── 유사도 점수 수신 → 추천 로직 처리 또는 DB 저장


━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
  [파일 간 의존 관계]
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

main.py
  └── import → api/recommend.py (router 등록)

api/recommend.py
  ├── import → schemas/recommend_schema.py (EmbeddingRequest 등 4개 클래스)
  └── import → services/recommend_service.py (make_embeddings, calculate_similarity)

services/recommend_service.py
  ├── import → models/embedding_model.py (embedding_model 전역 객체)
  └── import → sklearn.metrics.pairwise (cosine_similarity)

models/embedding_model.py
  └── import → sentence_transformers (SentenceTransformer)

schemas/recommend_schema.py
  └── import → pydantic (BaseModel), typing (List)

profile
개발언어를 배우는 과정 기록

0개의 댓글