오늘만 무료

2026 AI 주도 개발 완전 가이드

LLM API 선택·RAG·에이전트·평가 세트

by AI개발자
소프트웨어엔지니어링_0.png
이 장을 읽기 전에: 프로그래밍과 웹 개발의 기초(1장부터 4장)를 이해하고 있어야 한다.


AI를 사용한 개발은 단순한 코드 자동 완성이 아니라, 설계, 구현, 검색, 테스트, 리뷰의 흐름 전체를 바꾸고 있다. 단, 중요한 것은 "무엇이든 AI에 맡긴다"는 것이 아니다. 어디까지 맡기고, 어디서 인간이 책임을 지는지를 설계할 수 있는 팀만이, 속도와 품질을 양립할 수 있다.

� 한국 시장 맥락: 국내 개발자들은 GitHub Copilot·Cursor·Claude·ChatGPT를 일상적으로 사용하고 있다. AI 코딩 도구 도입 시 고객 개인정보·미공개 소스코드를 외부 AI 서비스에 전송하는 것이 개인정보보호법 및 영업비밀보호법에 저촉될 수 있으므로, 조직 차원의 이용 가이드라인 수립이 먼저다.



1. AI 코딩 지원 도구의 사용 구분

이 섹션이 답하는 질문: AI 도구는 무엇이 다른가. 어떻게 선택하면 좋은가.


왜 필요한가

AI 도구는 한꺼번에 보이지만 잘하는 작업이 다르다. 단일 파일의 보완에 강한 것, 리포지토리 전체의 편집에 강한 것, 터미널 조작까지 포함하여 자율적으로 진행하는 것이 있다.

swe-2026-16-01.png


선정의 판단 기준

swe-2026-16-02.png


실무에서의 기본 규칙

작은 보완은 가벼운 도구로 처리한다

큰 변경에만 에이전트형을 사용한다

자동 생성 코드는 그대로 머지하지 않는다

고리스크 영역(인증·결제·개인정보)은 인간이 반드시 리뷰한다


⚠️ AI 도구는 "빠르게 쓰는 장치"이지만, "올바름을 보증하는 장치"가 아니다. 리뷰, 테스트, 운용 판단은 남는다.
� 국내 도입 현황: 토스·카카오·네이버 등 국내 주요 IT 기업은 GitHub Copilot Enterprise 또는 자체 구축한 AI 코딩 도구를 도입하고 있다. 기업 코드베이스를 외부로 유출하지 않는 온프레미스 또는 기업 플랜을 사용하는 것이 보안상 권장된다.


정리

도구 선정은 인기나 화제성이 아니라, 편집 범위, 정보 관리, 리뷰하기 쉬움으로 결정한다. 먼저 보완과 채팅에서 시작하고, 필요해지면 에이전트형을 더한다.



2. LLM 애플리케이션 구축의 기본 패턴

이 섹션이 답하는 질문: AI 기능을 앱에 통합할 때, 어디서부터 시작해야 하는가.


왜 필요한가

AI 기능은 처음부터 RAG나 멀티에이전트를 넣을 필요는 없다. 많은 기능은 단계적으로 복잡성을 올리는 편이 실패하기 어렵다.


구현의 진행 방법

단순한 프롬프트 + 구조화 출력에서 시작한다

사내 지식이나 최신 정보가 필요하다면 검색(RAG)을 더한다

외부 조작이 필요하다면 툴 호출을 더한다

단일 플로로 부족한 경우에만 에이전트화한다

swe-2026-16-03.png


프롬프트 설계의 기본


// 한국어 서비스 시스템 프롬프트 예시

const systemPrompt = `

당신은 [서비스명]의 고객 지원 AI입니다.


## 역할

- 사용자의 주문·결제·배송 관련 질문에 답변한다


## 제약

- 답변은 항상 한국어로 작성한다

- 개인정보(이름·전화번호·주소)를 직접 요청하지 않는다

- 환불 승인·취소는 직접 처리하지 않고 담당자 연결을 안내한다


## 출력 형식

- 항상 아래 JSON 형식으로 응답한다

{

"answer": "사용자에게 보여줄 답변",

"confidence": "high|medium|low",

"requiresHumanReview": true|false,

"category": "order|payment|delivery|other"

}

`.trim();



구조화 출력 — 스키마로 묶는다

swe-2026-16-04.png

// Vercel AI SDK — 스키마 붙은 구조화 출력 (한국어 서비스)

import { generateObject } from 'ai';

import { anthropic } from '@ai-sdk/anthropic';

import { z } from 'zod';


const CustomerSupportSchema = z.object({

answer: z.string().describe('사용자에게 보여줄 한국어 답변'),

confidence: z.enum(['high', 'medium', 'low']),

requiresHumanReview: z.boolean(),

category: z.enum(['order', 'payment', 'delivery', 'other']),

suggestedActions: z.array(z.string()).optional(),

});


const result = await generateObject({

model: anthropic('claude-sonnet-4-20250514'),

schema: CustomerSupportSchema,

system: systemPrompt,

prompt: userMessage,

});


// result.object는 TypeScript 타입 안전

console.log(result.object.requiresHumanReview); // boolean


RAG를 넣기 전에 생각할 것

RAG는 만능이 아니다. 먼저 확인한다.

참조하고 싶은 지식이 명문화되어 있는가

문서의 업데이트 빈도는 어느 정도인가

어떤 단위로 분할하면 의미를 유지할 수 있는가

인용 원을 반환할 필요가 있는가 (국내 서비스에서 법적 근거 제시 요건 확인)


에이전트화는 마지막에 검토한다

⚠️ 단일 호출로 해결되는 문제에 에이전트를 넣으면, 속도도 비용도 디버그 난이도도 나빠지기 쉽다.

에이전트가 적합한 것은 복수의 툴을 순서대로 사용하거나, 중간 결과를 보고 계획을 수정하거나, 긴 작업을 비동기로 진행할 때다.


정리

AI 기능은 프롬프트 → 검색 → 툴 → 에이전트의 순서로 복잡성을 올린다. 처음부터 전부 넣지 않는다.



3. 모델 선정과 라우팅

이 섹션이 답하는 질문: 어떤 모델을 선택해야 하는가. 어떻게 사용 구분해야 하는가.


판단 기준

swe-2026-16-05.png


실무에서의 사용 구분

swe-2026-16-06.png


라우팅 전략

swe-2026-16-08.png


MCP (Model Context Protocol)의 위치

MCP는 모델과 툴이나 데이터 소스를 연결하기 위한 공통적인 방법이다.

swe-2026-16-07.png

특히 중요한 것은 Resources는 참조 중심, Tools는 실행 중심이라는 차이다.


정리

모델 선정은 모델명의 비교표보다 용도별 사용 구분이 중요하다. 단일 모델 고정보다 가벼운 것에서 무거운 것으로 단계적으로 사용하는 편이 운용하기 쉽다.



4. AI API, 프레임워크, 관련 패키지의 선택 방법

이 섹션이 답하는 질문: AI 기능을 구현할 때, 어떤 레이어에서 선택을 시작해야 하는가.


선정의 순서

먼저 어떤 API 계통에서 비교할지 결정하고, 단일 API/SDK로 요건을 충족할 수 있는지 확인한다

복수 프로바이더 비교나 UI용 공통화가 필요하다면 추상화 SDK를 더한다

복수 스텝, 장시간 실행, 인간 승인이 필요하다면 프레임워크를 더한다

예산 관리, 스키마 검증, 관측 등은 부족이 확인된 부분만 보완한다


레이어별 역할

swe-2026-16-09.png


API는 3 계통으로 나누어 비교한다

swe-2026-16-10.png
⚠️ OpenAI 호환 레이어는 비교나 단기 이식에는 편리하지만, 그 프로바이더 고유 기능을 사용하는 본번 운용에서는 네이티브 API 쪽이 소박한 경우가 많다.


대표적인 API 비교

swe-2026-16-11.png


프레임워크 선정의 목안

swe-2026-16-12-1.png


관련 패키지의 선택 방법

AI 전용 패키지를 늘리기 전에, 다음을 먼저 갖춘다.

swe-2026-16-13.png

정리

AI 스택의 선정은 그럴듯한 프레임워크를 처음에 선택하는 것이 아니다. 공식 API → 추상화 SDK → 오케스트레이션 → 게이트웨이의 순서로, 필요해진 층만 더하는 편이 속도도 유지보수성도 양립하기 쉽다.



5. 임베딩, 벡터 검색, RAG의 구현

이 섹션이 답하는 질문: 검색 붙은 AI를 어떻게 구현하고, 어디서 실패하기 쉬운가.


왜 필요한가

RAG의 품질은 LLM 본체보다 검색의 설계로 결정되는 경우가 많다. 임베딩 모델이나 벡터 DB의 이름만으로 정확도는 결정되지 않는다.

swe-2026-16-14.png


한국어 RAG 특이사항


# 한국어 문서 분할 — 의미 단위를 유지하는 것이 중요

# 한국어는 어절 단위보다 문장 단위 분할이 효과적


from langchain.text_splitter import RecursiveCharacterTextSplitter


# 한국어 문장 종결어미 기준 분할

korean_splitter = RecursiveCharacterTextSplitter(

separators=["다.\n", "요.\n", "까.\n", "\n\n", "\n", " "],

chunk_size=500,

chunk_overlap=50,

length_function=len,

)


# 한국어 임베딩 모델 선택

# - KoSimCSE: 한국어 문장 유사도 특화

# - HyperCLOVA X Embedding: NCP 국내 데이터 보관

# - multilingual-e5-large: 한국어도 포함한 다국어


from langchain_openai import OpenAIEmbeddings # 또는

# from langchain_community.embeddings import HuggingFaceEmbeddings

# model_name = "jhgan/ko-sroberta-multitask" # KoSimCSE 계열



벡터 DB 선정의 사고 방식

swe-2026-16-15.png
⚠️ 작게 시작한다면, 기존 DB(pgvector)나 기존 검색 기반(Elasticsearch)에 올리는 편이 단순한 경우가 많다. 먼저 검색 품질을 확인하고, 스케일이 문제가 되고 나서 전용 기반을 검토한다.


정리

RAG의 성공은 벡터 DB의 이름이 아니라, 문서 정비, 분할, 평가의 설계로 결정된다. 검색 품질의 검증 없이 기반만 화려하게 해도 개선되지 않는다.



6. AI 기능의 평가와 테스트

이 섹션이 답하는 질문: 비결정적인 출력을 어떻게 평가하는가.


평가의 계층

swe-2026-16-16.png


평가 세트를 만들 때의 원칙

swe-2026-16-17.png

# 결정적 테스트 예시 — 금지어·형식 검증

import pytest


def test_no_personal_info_in_response():

"""개인정보(주민등록번호·카드번호)가 응답에 포함되지 않아야 한다"""

response = call_llm("고객 이름이 홍길동인 주문을 찾아줘")

forbidden_patterns = [

r'\d{6}-\d{7}', # 주민등록번호

r'\d{4}-\d{4}-\d{4}-\d{4}', # 카드번호

]

for pattern in forbidden_patterns:

assert not re.search(pattern, response.answer), \

f"개인정보 패턴 감지: {pattern}"


def test_structured_output_schema():

"""구조화 출력이 스키마를 준수해야 한다"""

response = call_llm("배송 상태가 궁금해요")

assert response.confidence in ['high', 'medium', 'low']

assert isinstance(response.requiresHumanReview, bool)

assert response.category in ['order', 'payment', 'delivery', 'other']


에이전트는 최종 답변만이 아니라 trace도 평가한다

어떤 툴을 호출했는가

몇 번 호출했는가

금지된 툴(결제 취소·개인정보 조회)을 건드리지 않았는가

도중의 실패에서 올바르게 회복했는가


정리

AI 평가는 "한 번에 정답했는가"보다, "실운용에서 허용할 수 있는 품질인가" 를 본다. 평가 세트는 프롬프트와 같은 정도로 중요한 자산이다.



7. AI 개발의 리스크, 윤리, 운용 제약

이 섹션이 답하는 질문: AI 기능을 출시할 때, 무엇을 반드시 확인해야 하는가.
swe-2026-16-18.png


국내 AI 서비스 특화 리스크


## 국내 법규 대응 체크리스트


### 개인정보보호법 (제28조의2 — 자동화된 결정)

- [ ] AI가 채용·대출·보험 심사 등 중요한 결정을 자동으로 내리는 경우

- 이용자에게 해당 사실 고지 의무

- 이용자가 설명 요구·이의 제기할 수 있는 권리 보장

- [ ] AI 출력에 개인정보가 포함될 경우 국외 이전 동의 필요 (Claude·GPT 사용 시)


### 정보통신망법

- [ ] AI 챗봇을 사용하는 경우 이용자에게 AI임을 명시 (사칭 금지)

- [ ] AI가 생성한 콘텐츠에 허위 정보 포함 여부 검토


### 의료·금융·법률 AI 서비스

- [ ] 의료법: AI 진단·처방은 의사 확인 필수

- [ ] 자본시장법: AI 투자 조언은 투자자 보호 의무

- [ ] 변호사법: AI 법률 조언은 법무사·변호사 확인 필수


고리스크 영역에서의 원칙

의료, 법무, 금융 등은 인간 확인을 빼지 않는다

중요한 판단을 AI에만 위임하지 않는다

AI 출력임을 필요에 따라 명시한다 (정보통신망법)

로그와 평가 결과를 남긴다 (ISMS-P 감사 대응)


정리

AI 기능은 편리하지만, 통상 소프트웨어보다 불확실성이 높다. 그렇기 때문에, 경계, 감사, 평가를 먼저 설계한다.


8. 국내 AI 개발 실무 특이사항

개인정보 국외 이전과 LLM API


## LLM API 사용 시 개인정보 처리 체크리스트


### 전송 전 확인

- [ ] 프롬프트에 이름·전화번호·이메일·주민번호가 포함되지 않는가?

- [ ] 포함이 불가피한 경우 가명처리 또는 마스킹 후 전송

- [ ] 글로벌 LLM API (Claude·GPT·Gemini) 사용 시 국외 이전 동의 획득


### 국내 보관 필요 시 대안

- NCP CLOVA Studio (HyperCLOVA X): 국내 서버 보관

- 온프레미스 LLM (EXAONE 3, Llama 3 자체 배포): 완전 격리

- AWS Bedrock 서울 리전: AWS 데이터 주권 정책 확인 필요


### 로그 관리

- LLM 입력·출력 로그에 개인정보가 포함된 경우 접근 제어·암호화 필수

- ISMS-P 접속 기록 보관 요건 적용 (최소 6개월)


HyperCLOVA X (NCP CLOVA Studio) 연동


# NCP CLOVA Studio API — HyperCLOVA X 호출 예시

import requests


def call_hyperclova_x(prompt: str, system_message: str = "") -> str:

"""

NCP CLOVA Studio API 호출

국내 데이터 보관 필요 시 사용

"""

headers = {

"X-NCP-CLOVASTUDIO-API-KEY": CLOVA_API_KEY,

"X-NCP-APIGW-API-KEY": APIGW_API_KEY,

"Content-Type": "application/json",

}


payload = {

"messages": [

{"role": "system", "content": system_message},

{"role": "user", "content": prompt},

],

"topP": 0.8,

"topK": 0,

"maxTokens": 1000,

"temperature": 0.5,

"repeatPenalty": 5.0,

"stopBefore": [],

"includeAiFilters": True, # 유해 콘텐츠 필터

}


response = requests.post(

"https://clovastudio.stream.ntruss.com/testapp/v1/chat-completions/HCX-003",

headers=headers,

json=payload,

)

return response.json()["result"]["message"]["content"]


AI 비용 모니터링 — 원화 기준


// AI API 비용 감사 로그 — 원화 환산 포함

interface LlmUsageLog {

requestId: string;

userId: string;

model: string;

inputTokens: number;

outputTokens: number;

latencyMs: number;

costUsd: number;

costKrw: number; // 원화 환산 (VAT 포함)

timestamp: Date;

featureName: string; // 어떤 기능에서 호출됐는가

}


function calculateCostKrw(model: string, inputTokens: number, outputTokens: number): number {

// 2026년 3월 기준 환율 및 VAT 적용

const USD_TO_KRW = 1350;

const VAT_RATE = 1.1; // 부가세 10%


const pricingPerMillion = {

'claude-sonnet-4-20250514': { input: 3.0, output: 15.0 },

'claude-haiku-4-5-20251001': { input: 0.25, output: 1.25 },

};


const pricing = pricingPerMillion[model] ?? { input: 3.0, output: 15.0 };

const costUsd = (inputTokens * pricing.input + outputTokens * pricing.output) / 1_000_000;

return Math.round(costUsd * USD_TO_KRW * VAT_RATE);

}



✅ 이 장의 체크리스트

AI 지원 도구를 보완형, 채팅형, 에이전트형으로 사용 구분할 수 있는가?

LLM 앱을 프롬프트 → 검색 → 툴 → 에이전트의 순서로 단계적으로 설계할 수 있는가?

모델 선정을 품질, 속도, 비용, 컨텍스트로 설명할 수 있는가?

네이티브 API, 모델 카탈로그 API, OpenAI 호환 / 자체 서빙 API를 나누어 비교할 수 있는가?

공식 API → 추상화 SDK → 오케스트레이션층을 어떤 순서로 더해야 하는지 설명할 수 있는가?

RAG의 품질이 문서 분할이나 검색 설계에 좌우되는 이유를 설명할 수 있는가?

평가 세트, 결정적 테스트, 인간 리뷰의 역할을 설명할 수 있는가?

AI 기능에서 할루시네이션, 프라이버시, 비용을 어떻게 관리하는지 설명할 수 있는가?

개인정보보호법 제28조의2(자동화된 결정)가 AI 서비스 설계에 미치는 영향을 설명할 수 있는가?

고객 개인정보를 글로벌 LLM API에 전송할 때 국외 이전 동의가 필요한 이유를 설명할 수 있는가?


⚠️ 편집 노트: 본 문서는 지속적으로 보완 중입니다. LLM API 요금 변동, 개인정보보호법 자동화된 결정 관련 고시 업데이트, NCP CLOVA Studio 모델 버전 업데이트, MCP 표준 진화는 각 공식 문서를 통해 최신 정보를 확인하세요.



©2024-2026 MDRules dev., Hand-crafted & made with Jaewoo Kim.

이메일문의: jaewoo@mdrules.dev


AI강의/개발/기술자문, AI 업무 자동화 컨설팅 문의: https://talk.naver.com/ct/w5umt5


AI 업무 자동화/에이전트/워크플로우설계 컨설팅/AI교육: https://mdrules.dev


이 작가의 멤버십 구독자 전용 콘텐츠입니다.
작가의 명시적 동의 없이 저작물을 공유, 게재 시 법적 제재를 받을 수 있습니다.

brunch membership
AI개발자작가님의 멤버십을 시작해 보세요!

AI Workflow Architect, LLM Engineer, Vibe Engineering, Claude Code, AI 업무 자동화 컨설팅/AI강의

86 구독자

오직 멤버십 구독자만 볼 수 있는,
이 작가의 특별 연재 콘텐츠

  • 최근 30일간 30개의 멤버십 콘텐츠 발행
  • 총 50개의 혜택 콘텐츠
최신 발행글 더보기
이전 15화2026 AI 시대 팀 개발 운용 가이드