반응형

Core와 ORM의 차이점 정리

항목 Core 방식 ORM 방식
선언 방식 Table(...) 객체로 직접 정의 Python 클래스(class)로 선언
쿼리 스타일 SQL과 유사한 스타일 객체지향적으로 표현
사용 목적 SQL에 가까운 제어 필요할 때 모델 중심의 개발에 적합
가독성 SQL처럼 보임 도메인 객체처럼 읽힘
자동완성 / IDE 지원 거의 없음 매우 좋음 (클래스 기반)
마이그레이션 연동 자동 불가 (수동 필요) Alembic 자동 인식 가능

 


Core 방식 - 테이블 중심, SQL 중심

Core는 SQLAlchemy의 "기본 레벨"로,

직접 테이블을 정의하고 SQL처럼 쿼리를 구성한다.

 

from sqlalchemy import Table, Column, Integer, String, MetaData, select

metadata = MetaData(schema="my_schema")
user_table = Table(
    "user", metadata,
    Column("id", Integer, primary_key=True),
    Column("name", String)
)

stmt = select(user_table).where(user_table.c.name == "Alice")

 

  • 스키마를 동적으로 바꿔야 할 때
  • 복잡한 SQL 문을 직접 짜야할 때
  • ORM 쓰기 어려운 메타 프로그래밍 상황

ORM 방식 – 객체 중심, 유지보수 중심

ORM은 Core 위에서 동작하는 상위 추상화

Python 클래스 기반으로 선언하고 객체처럼 다를 수 있어 유지보수가 쉽다.

 

from sqlalchemy.orm import DeclarativeBase
from sqlalchemy import Column, Integer, String, select

class Base(DeclarativeBase):
    pass

class User(Base):
    __tablename__ = "user"
    id = Column(Integer, primary_key=True)
    name = Column(String)

stmt = select(User).where(User.name == "Alice")

 

  • 모델 중심 개발이 필요할 때
  • 자동 마이그레이션(Alembic)연동 할 때
  • FastAPI, Pydantic, IDE와의 통합이 중요할 때
  • 협업/대규모 유지보수 환경

선택 기준

상황 추천 방식
단순 앱, 유지보수 중심 ✅ ORM
테이블 이름/스키마가 동적으로 바뀜 ✅ Core
복잡한 JOIN, 윈도우 함수 자주 사용 ✅ Core
FastAPI + Alembic 조합 ✅ ORM
자동 마이그레이션 필요 ✅ ORM
DB 구조를 코드에서 유연하게 제어해야 함 ✅ Core

 


현실적인 전략: 둘 다 써도 된다

대부분의 실무에서는 ORM으로 전체를 구성하고,
복잡한 일부 쿼리만 Core로 처리하는 혼합 전략이 가장 실용적이다.

 

# ORM으로 조회
user = await session.get(User, 1)

# Core로 복잡한 SQL 직접 작성
stmt = select(my_table).where(my_table.c.some_func("column") > 5)

 


요약

  • ORM은 유지보수에 강하고 생산성이 높다
  • Core는 유연성과 복잡 쿼리에 강하다
  • 둘 다 SQLAlchemy의 일부이며, 혼용도 가능하다
  • 설계는 ORM, 세부 제어는 Core로 접근하자
반응형
반응형

WebSocket이란?

  • WebSocket은 웹 브라우저와 서버가 실시간으로 데이터를 주고받을 수 있게 해주는 통신 규약.
  • 한 번 연결되면, 서버와 클라이언트가 언제든 자유롭게 메시지를 주고받을 수 있다.
  • 주로 채팅, 게임, 실시간 알림, 주식 시세 등 즉각적인 반응이 필요한 서비스에서 많이 사용된다.
  • 하지만 WebSocket은 단순히 "실시간 통로" 역할만 할 뿐, 그 위에서 어떤 데이터를 주고받고, 어떤 규칙으로 동작할지는 개발자가 직접 설계해야한다.

MCP란 무엇인가?

  • **MCP(Model Context Protocol)**는 AI 모델이 외부 데이터, 도구, 서비스와 안전하게 연결될 수 있도록 만들어진 AI 특화 통합 프로토콜.
  • 예를 들어, AI 챗봇이 일정 관리, 파일 검색, 사내 시스템 조회 등 다양한 외부 서비스를 한 번에 연결해 쓸 수 있게 해준다.
  • MCP는 단순한 통신을 넘어, 도구 자동 노출, 컨텍스트(문맥) 관리, 보안, 권한 관리, 표준화된 인터페이스까지 제공한다.
  • 내부적으로 WebSocket이나 HTTP 등 다양한 통신 방식을 활용할 수 있지만, 그 위에 AI와 서비스 통합을 위한 표준화된 규칙과 기능을 올려놓은 것이 차별점.

 

MCP와 WebSocket의 차이점

 

구분MCP (Model Context Protocol)WebSocket

 

정의 AI 모델이 외부 데이터·도구와 상호작용할 수 있도록 설계된 표준 프로토콜 클라이언트와 서버 간의 실시간 양방향 통신 프로토콜
주요 목적 AI와 다양한 데이터 소스·도구의 통합 및 표준화, 문맥 제공 실시간 메시지 송수신, 채팅·알림 등 즉시성 서비스
구성 MCP 호스트, MCP 서버, MCP 클라이언트 등 아키텍처적 구성 클라이언트와 서버 간의 단일 연결
통신 방식 실시간 양방향 통신(내부적으로 WebSocket 등 활용 가능) 실시간 양방향 통신(전이중, 상태 유지)
기능 도구/리소스/프롬프트 자동 노출, AI 컨텍스트 관리, 보안·권한 내장 메시지 송수신, 연결 유지, 상태 기반 통신
표준화 AI 친화적 표준 프로토콜(JSON-RPC 등 기반, 기능 협상·진행 추적 지원) 통신 자체만 표준화, 상위 비즈니스 로직 없음
확장성 플러그 앤 플레이, 다양한 서버·도구와 동적 연결 통신 채널 확장 필요, 비즈니스 로직 직접 구현
사용 예시 AI가 일정 조회, 파일 접근, 외부 API 호출 등 복합 작업 채팅, 게임, 실시간 알림, 데이터 스트리밍 등
 

핵심 차이 설명

  • WebSocket은 실시간 양방향 통신을 위한 네트워크 프로토콜로, 클라이언트와 서버가 지속적으로 메시지를 주고받을 수 있게 해준다. 하지만 WebSocket 자체는 비즈니스 로직이나 AI 컨텍스트 관리, 도구 연결 등 상위 기능을 제공하지 않습니다. 즉, "통로" 역할에 집중한다.
  • MCP는 AI 모델이 외부 데이터·도구와 상호작용할 수 있도록 설계된 상위 레벨의 표준 프로토콜이다. 실시간 양방향 통신을 지원하며, 내부적으로 WebSocket 같은 기술을 활용할 수 있지만, 그 위에서 도구/리소스 자동 노출, 컨텍스트 관리, 보안, 기능 협상 등 AI 친화적이고 복합적인 기능을 제공한다.

요약하면, WebSocket은 실시간 데이터 송수신을 위한 파이프이고, MCP는 AI와 외부 세계를 연결하는 표준화된 통합 게이트웨이이다. MCP는 WebSocket 등 다양한 통신 기술을 활용할 수 있지만, 그 자체로 AI 서비스에 특화된 구조와 표준을 갖고 있다.

Citations:

  1. https://apidog.com/kr/blog/mcp-vs-api-kr/
  2. https://digitalbourgeois.tistory.com/875
  3. https://apidog.com/kr/blog/mcp-servers-explained-kr/
  4. https://sendbird.com/ko/developer/tutorials/websocket-vs-http-communication-protocols
  5. https://news.hada.io/topic?id=19673
  6. https://digitalbourgeois.tistory.com/478
  7. https://theinnovators.zone/archives/4185
  8. https://leadspot.co.kr/blog/genai/%EC%9A%94%EC%A6%98-%EB%82%9C%EB%A6%AC%EB%82%9C-mcp-%EA%B0%84%EB%8B%A8%EC%A0%95%EB%A6%AC/

 

반응형
반응형

MCP와 기존 API의 차이점

구분MCP (Model Context Protocol)기존 API
아키텍처 마이크로서비스 기반, 독립적 모듈의 조합 모놀리식(단일 시스템), 모든 기능이 한 곳에 집중
통합 방식 한 번의 표준 통합으로 다양한 도구·서비스와 연결 가능 각 서비스별 별도 통합 필요, API별로 커스텀 개발
통신 방식 실시간 양방향 통신(지속적 연결, WebSocket 유사) 요청-응답(단방향), 한 번 요청에 한 번 응답
데이터 접근 AI가 동적으로 도구·데이터를 검색·활용(동적 발견) 사전에 정해진 API만 호출 가능, 동적 검색 어려움
확장성 플러그 앤 플레이, 개별 서비스만 확장 가능 전체 시스템 확장 필요, 유연성 낮음
유지보수 표준화된 프로토콜로 유지보수 간편 API별로 별도 유지보수 필요
보안 표준화된 인증·접근제어 내장, 일관성 유지 API마다 보안 구현 방식 다름, 추가 조치 필요
컨텍스트 관리 AI가 문맥(Context) 정보를 효율적으로 공유·관리 컨텍스트 정보 직접 관리 필요, 모델 간 공유 어려움
생태계 개방형, 다양한 AI·데이터 소스와 상호운용성 서비스별로 폐쇄적, 플랫폼 종속적
 

핵심 요약

  • MCP는 AI 모델이 여러 데이터 소스와 실시간·양방향으로 상호작용할 수 있는 표준화된 인터페이스를 제공합니다. 기존 API는 각 서비스마다 별도 개발이 필요하고, 주로 단방향 요청-응답 구조에 머무른다.
  • MCP는 한 번의 통합으로 다양한 도구와 연결되고, AI가 동적으로 필요한 정보를 검색·활용할 수 있어 확장성과 유연성이 뛰어나다.
  • 보안, 유지보수, 확장성, 컨텍스트 관리 등에서 표준화와 자동화가 잘 되어 있어 기존 API 방식보다 AI 서비스에 더 적합하다.

쉽게 말해, 기존 API가 각각의 서비스에 맞춰 따로 로그인해야 하는 방식이라면, MCP는 한 번의 통합으로 다양한 서비스에 AI가 자유롭게 접근할 수 있도록 해주는 표준화된 관문이다.

 

Citations:

  1. https://apidog.com/kr/blog/mcp-vs-api-kr/
  2. https://news.hada.io/topic?id=19673
  3. https://digitalbourgeois.tistory.com/875
  4. https://apidog.com/kr/blog/mcp-servers-explained-kr/
  5. https://jjaegii.tistory.com/53
  6. https://www.claudemcp.com/ko/blog/mcp-vs-api
  7. https://tilnote.io/pages/67ce65d92a14e2a1ab230497
  8. https://blog.pages.kr/3326

 

반응형
반응형

보안 및 규정 준수

  • 민감 데이터 처리: 사용자 컨텍스트 데이터(대화 기록, 개인 설정 등)에 개인정보가 포함될 수 있어 암호화 및 접근 제어 필수.
  • GDPR/SOC2/ISO 인증 대응: 데이터 전송·저장 시 국제 규정 준수 필요.
  • AI 모델 출력 검증: 생성된 결과가 개인정보 유출 또는 편향성을 포함하지 않도록 감시 체계 구축.

기술적 통합

  • 레거시 시스템 호환성: 기존 API·데이터베이스와 MCP 프로토콜 연동을 위한 어댑터 개발 필요.
  • 실시간 성능 최적화: 대규모 컨텍스트 처리 시 지연 시간(latency) 관리.
  • 에러 핸들링: 외부 데이터 소스 연결 실패 시 대체 로직 또는 사용자 알림 시스템 설계.

조직·운영 측면

  • 표준화 부족: MCP 버전 업데이트에 따른 하위 호환성 리스크.
  • 벤더 종속성: 특정 MCP 서버(예: Anthropic, OpenAI)에 과도하게 의존할 경우 유연성 저하.
  • 교육·문서화: 개발팀의 MCP 이해도 향상을 위한 학습 리소스 투입.

2. 주요 한계

프로토콜 자체의 제약

  • 컨텍스트 크기 제한: 일부 MCP 서버는 128K 토큰 이상 처리 시 성능 저하 발생.
  • 다중 모델 지원 미흡: 단일 MCP 연결로 다양한 LLM(GPT, Claude 등)을 동시에 활용하기 어려움.

실제 적용 시 문제점

  • 데이터 소스 다양성: MCP 미지원 시스템(예: 구형 ERP)과의 연동 추가 개발 필요
  • 비용 증가 가능성: 대규모 컨텍스트 처리 시 API 호출 비용 급증
  • 개인정보 재식별 위험: AI 출력을 역추적해 사용자 정보 노출 가능성

3. 완화 방안

문제 영역해결 전략
보안 리스크 E2E 암호화 적용 + 출력 검증 레이어 추가
성능 저하 캐싱 메커니즘 도입 + 컨텍스트 압축 알고리즘 사용
호환성 문제 MCP-API 변환 게이트웨이 개발
비용 관리 요청 배치 처리 + 중요도 기반 컨텍스트 필터링
 

결론: MCP는 AI-외부 시스템 통합 효율성을 혁신적으로 개선하지만, 보안·성능·유지보수 측면에서 신중한 검토가 필요합니다. 특히 금융·의료 등 규제 산업에서는 PoC(Proof of Concept) 단계부터 리스크 평가를 권장합니다

반응형
반응형

 


 

모델명 Organization 입력 토큰 비용 (1M당) 출력 토킨 비용 (1M당) Context Window 최대 출력 토큰
GPT-4o OpenAI $2.50 $10.00 128,000 4,096
GPT-4 Turbo OpenAI $10.00 $30.00 128,000 4,096
GPT-4o mini OpenAI $0.15 $0.60 128,000 16,384
GPT-o3-mini OpenAI $1.10 $4.40 200,000 100,000
DeepSeek-V3 DeepSeek $0.14 $0.28 128,000 8,000
DeepSeek-R1 DeepSeek $0.55 $2.19 64,000 8,000
Claude 3.5 Sonnet Anthropic $3.00 $15.00 200,000 4,096
Claude 3.7 Sonnet Anthropic $3.00 $15.00 200,000 128,000*
클로드 3.0 오푸스(Opus) Anthropic $15.00 $75.00 200,000 4,096
클로드 3.0 하이쿠(Haiku) Anthropic $0.25 $1.25 200,000 4,096
 

비고

  • Claude 3.7 Sonnet의 최대 출력 토큰 128,000은 베타 기능(output-128k-2025-02-19 헤더) 적용 시 한정.
  • DeepSeek-R1의 컨텍스트 윈도우는 공식적으로 64K이나, 일부 문서에는 16K 이상 지원으로 표기된 경우도 있음.
  • 모든 가격은 2024년 6월 기준, 1M(백만) 토큰당 USD 단위.

 

반응형
반응형

https://www.youtube.com/watch?v=8JEbrboSumg

 

 

Self Feedback Learning

  • 👍 / 👎 버튼을 통해 결과에 대한 피드백을 남김

 

  • langsmith에 피드백으로 쌓임

 

  • few shot 예제로 사용하기 위해 마음에 드는 답변을 Add to Dataset 에 추가

 

 

  • 좋았던 피드백을 이용하여 few shot 예제로 만들고, 더 좋은 결과를 내게 형식을 강제화함

 

 

  • 결과 - 피드백을 주었던 답변과 같은 형식으로 답변함

반응형
반응형

https://www.youtube.com/watch?v=ckHAvm-L6Sc

 

 

 

cosine similarity만 했을 때: 45%

→ prompt engineering + tool use + query expansion: 98%

(Openai 입장)


가장 좋은 RAG 모듈은?

→ 문서에 따라 달라진다.

 

 

  • 한국어 금융 문서에서는 BM25가 5배가 더 좋음
  • 한국 대학교 학칙에서는 VectorDB(일반 cos. similarity)가 4.5배 더 좋음

추천 retriever: BM25

(llamaIndex BM25를 뜯어보면 한국어는 잘 나올 수가 없음

대신에 한국어 형태소 분석기를 적용하면 한국어도 잘됨

elasticsearch에서도 BM25가 있고, 한국어 형태소도 같이 쓰는 방법도 있음)

한국어 잘하기 위해서는 한국어 Embedding model을 반드시 사용해야할까?

Embedding model 성능이 한국어에서 좋으면 좋으나,

딱히 성능이 잘 안나올 때는 BM25가 더 좋을 수 있다.

반응형
반응형

어느날 재밌는 짤을 봤다.
AI가 와인이 가득 찬 그림을 학습한 적이 없어서 그리지 못한다는 글

과연 AI가 생성하지 못할까 궁금해서 도전해봤다.

 

첫 도전

역시나 평소보다는 와인 양이 많지만, 와인이 꽉 차 있는 이미지는 아니다.

 

두번째 도전

와인잔에 가득 따른 와인 이미지 생성 성공

 


팀장님이 항상 하시는 소리가 있다.
스마트폰이 왜 스마트폰인가.
사용하는 사람이 스마트하게 사용해서 스마트폰이다.

이와 같이 AI가 아무리 발전했다고 하더라도
사용하는 사람이 정확한 지시를 내려주지 않으면, 생성형 AI도 이해할 수 없다.

물론 "와인잔에 와인 가득 따른 이미지를 생성해줘"는 정확한 지시라고 생각하기는 하지만..., 아직 한계가 있는 것으로 확인이 됐다. (gpt는 와인을 가득 채워 먹는다는거는 말도 안된다고 생각하나봄)

이를 극복하기 위해, 사용하는 사람이 더 자세히 지시해준다면 생성형 AI를 200% 활용할 수 있을 것이다.


재밌는 실험 끝!

반응형
반응형

https://ko.wikipedia.org/wiki/%EC%B9%B4%EB%93%9C_%EB%B2%88%ED%98%B8%EC%9D%98_%EA%B5%AC%EC%84%B1

 

→ 여기서 카드 번호의 구성 확인 가능

 


1. 주 산업 식별번호 (MII, Master Industry Identifier)

  • 카드번호 첫 번째 자리
숫자 산업
0 ISO/TC 68 및 기타
1 항공/교통
2 멤버십
3 여행/엔터 (JCB, 아멕스, 다이너스 클럽 등)
4 VISA
5 Mastercard/마에스트로
6 디스커버, 은련
7 석유 등 기타
8 헬스케어/통신
9 해외결제 불가

 

 

2. 발급자 식별번호 (IIN/BIN, Issuer Identification Number)

 

  • 카드번호 앞 6자리
  • 카드사와 카드 종류 구분 가능
카드사 IIN 범위 전체 자릿수
아멕스 34, 37 15
VISA 4 16
마에스트로, 시러스 50, 56~59 16
마스터카드 51~55(2221~2720 2017년부터~) 16
은련 622126~622925, 624~626, 6282~6288 16
다이너스 클럽 300~305, 3095, 36, 38, 39 14
디스커버 60110, 60112~60114, 601174~601179, 601186~601199, 644~649, 65(60,61,64,65) 16
JCB 3528, 3589 16

 


 

3. 룬 알고리즘(Luhn Algorithm)으로 카드번호 유효성 검사

def luhn_check(card_number):
    card_number = [int(x) for x in str(card_number)]
    check_sum = 0

    # 역순으로 순회하며 홀짝 구분
    for i, num in enumerate(reversed(card_number)):
        if i % 2 == 1:
            num *= 2
            if num > 9:
                num -= 9
        check_sum += num

    return check_sum % 10 == 0


# 예시
print(luhn_check("4539578763621486"))  # True
print(luhn_check("4539578763621485"))  # False

 

 


룬 알고리즘 (Luhn Algorithm) 이란?

신용카드, 주민번호, IMEI 같은 숫자 코드가 유효한지 검증하는 방법
1954년에 IBM의 한 과학자 Hans Peter Luhn이 고안

쉽게 말하면, 카드번호가 실수로 틀린 번호인지 빠르게 확인하는 간단한 수학 공식

 


작동 방법

카드번호가 4539 5787 6362 1486라면

오른쪽부터 하나씩 숫자를 순서대로:

  1. 짝수 번째 자리의 숫자는 그대로 두고
  2. 홀수 번째 자리의 숫자는 2배를 곱하기
  3. 만약 2배한 값이 9보다 크면 9를 뺌 (또는 각 자리수 합)
  4. 이렇게 변환된 값들을 전부 더해서
  5. 그 합이 10으로 나누어떨어지면 유효한 번호

예시

카드번호: 4539 5787 6362 1486

오른쪽부터

자리 숫자 위치 처리
6 6 홀수 6×2=12 → 12-9=3
8 8 짝수 8
4 4 홀수 4×2=8
1 1 짝수 1
2 2 홀수 2×2=4
6 6 짝수 6
3 3 홀수 3×2=6
6 6 짝수 6
7 7 홀수 7×2=14 → 14-9=5
8 8 짝수 8
7 7 홀수 7×2=14 → 14-9=5
5 5 짝수 5
9 9 홀수 9×2=18 → 18-9=9
3 3 짝수 3
5 5 홀수 5×2=10 → 10-9=1
4 4 짝수 4

합계 = 3+8+8+1+4+6+6+6+5+8+5+5+9+3+1+4 = 82

82 % 10 == 2 → 2이므로 유효하지 않음

반응형
반응형

가상환경 생성

기본적으로 .venv 디렉토리에 가상환경이 생성된다.

uv venv

 

특정 이름이나 경로로 가상환경을 생성하려면 다음과 같이 실행한다.

uv venv my-env

 

특정 Python 버전을 지정하여 가상환경을 생성할 수도 있다.

uv venv --python 3.11

이 명령어는 지정한 버전의 Python을 설치하고 해당 버전으로 가상환경을 생성


가상환경 활성화

생성된 가상환경을 활성화하려면 아래의 명령어를 사용

  • macOS/Linux
source .venv/bin/activate

 

  • Windows
.venv\Scripts\activate

 


가상환경 내에서 패키지 설치

가상환경이 활성화된 상태에서 패키지를 설치하려면 uv pip 명령어를 사용한다.

uv pip install requests

 

또는 uv add 명령어를 사용하여 의존성을 추가할 수 있다.

uv add requests

 

이렇게 하면 pyproject.toml 파일에 의존성이 추가되고, 가상환경에 해당 패키지가 설치된다.


uv 가상환경 관리 장점

  • 속도: uv venvpyhton -m venv보다 최대 80배, virtualenv보다 7배 빠르게 가상환경을 생성한다.
  • 통합 관리: 가상환경 생성, 패키지 설치, Python 버전 관리 등을 하나의 도구로 통합하여 관리할 수 있다.​
  • 자동 감지: uv run, uv sync 등의 명령어를 사용할 때, .venv 디렉토리가 존재하면 자동으로 해당 가상환경을 사용한다.​

추가 팁: VSCode에서 사용하기

VSCode에서 uv로 생성한 가상환경을 사용하려면 다음과 같이 설정할 수 있다.

  1. VSCode의 명령 팔레트를 열고 (Ctrl+Shift+P), Python: 인터프리터 선택
  2. 목록에서 .venv 디렉토리의 Python 인터프리터를 선택한다.​
  3. 만약 목록에 나타나지 않는다면, 인터프리터 경로 입력을 선택하고 .venv/bin/python (Windows의 경우 .venv\Scripts\python.exe) 경로를 직접 입력한다.

 

 

 

반응형

+ Recent posts