본 콘텐츠의 이미지 및 내용은 AI로 생성되었습니다.
본 콘텐츠의 이미지 및 내용을 무단으로 복제, 배포, 수정하여 사용할 경우 저작권법에 의해 법적 제재를 받을 수 있습니다.
이미지 로딩 중...
AI Generated
2025. 12. 27. · 4 Views
Function Calling 개요
LLM이 외부 함수를 호출하는 원리와 실제 구현 방법을 다룹니다. OpenAI, Anthropic, Gemini API의 차이점을 비교하고, 실습을 통해 첫 번째 함수 호출과 날씨 API 통합까지 직접 구현해봅니다.
목차
1. Function Calling이란
김개발 씨는 최근 ChatGPT를 업무에 활용하면서 한 가지 답답함을 느꼈습니다. "지금 서울 날씨가 어때?"라고 물으면 "저는 실시간 정보에 접근할 수 없습니다"라는 답변이 돌아왔기 때문입니다.
분명 AI가 똑똑하다고 들었는데, 왜 간단한 날씨조차 알려주지 못하는 걸까요?
Function Calling은 한마디로 LLM이 외부 함수를 호출할 수 있게 해주는 기능입니다. 마치 비서가 직접 처리할 수 없는 업무를 담당 부서에 연결해주는 것과 같습니다.
이것을 제대로 이해하면 LLM의 한계를 극복하고, 실시간 데이터 조회, 데이터베이스 조작, 외부 서비스 연동까지 가능해집니다.
다음 코드를 살펴봅시다.
# Function Calling의 기본 구조
def get_weather(city: str) -> dict:
"""도시의 날씨 정보를 반환합니다"""
# 실제로는 기상청 API를 호출
weather_data = {
"city": city,
"temperature": 15,
"condition": "맑음"
}
return weather_data
# LLM에게 이 함수를 "도구"로 제공
tools = [{
"name": "get_weather",
"description": "특정 도시의 현재 날씨를 조회합니다",
"parameters": {
"type": "object",
"properties": {
"city": {"type": "string", "description": "도시 이름"}
}
}
}]
김개발 씨는 입사 1년 차 백엔드 개발자입니다. 최근 팀에서 AI 챗봇 프로젝트를 맡게 되었는데, 고객이 "내 주문 현황 알려줘"라고 물으면 실제 주문 데이터베이스를 조회해서 답변해야 하는 요구사항이 있었습니다.
처음에 김개발 씨는 막막했습니다. LLM은 텍스트만 생성할 줄 알지, 데이터베이스에 접근하는 방법은 모르지 않나요?
선배 개발자 박시니어 씨가 다가와 말했습니다. "Function Calling이라는 게 있어요.
LLM이 직접 데이터베이스를 조회하는 게 아니라, 우리가 만든 함수를 호출하도록 하는 거죠." 그렇다면 Function Calling이란 정확히 무엇일까요? 쉽게 비유하자면, Function Calling은 마치 호텔 컨시어지 서비스와 같습니다.
투숙객이 "맛있는 레스토랑 예약해주세요"라고 요청하면, 컨시어지가 직접 요리를 하는 게 아니라 레스토랑에 전화해서 예약을 잡아주죠. LLM도 마찬가지입니다.
사용자의 요청을 이해한 뒤, 적절한 함수를 호출해서 결과를 가져옵니다. Function Calling이 없던 시절에는 어땠을까요?
개발자들은 사용자의 자연어 입력을 직접 파싱해서 의도를 파악해야 했습니다. "서울 날씨"와 "서울 지금 날씨 어때?"와 "Seoul weather"를 모두 같은 의도로 인식하도록 수많은 규칙을 작성해야 했죠.
프로젝트가 커질수록 이런 규칙들은 스파게티 코드가 되어버렸습니다. 바로 이런 문제를 해결하기 위해 Function Calling이 등장했습니다.
LLM은 자연어 이해에 탁월합니다. 사용자가 어떤 표현을 쓰든 의도를 정확하게 파악할 수 있죠.
Function Calling은 이 능력을 활용해서, LLM이 "이 상황에서는 이 함수를 이 파라미터로 호출해야 해"라고 판단하게 합니다. 위의 코드를 살펴보면, 우리는 get_weather라는 함수를 정의했습니다.
그리고 tools 리스트에 이 함수의 설명을 JSON 형태로 작성했습니다. LLM은 이 설명을 보고 "아, 날씨를 물어보면 이 함수를 호출하면 되겠구나"라고 학습합니다.
중요한 점은 LLM이 함수를 직접 실행하는 게 아니라는 겁니다. LLM은 "get_weather 함수를 city='서울'로 호출해주세요"라고 응답할 뿐입니다.
실제 함수 실행은 우리 서버에서 이루어지고, 그 결과를 다시 LLM에게 전달하면 최종 답변이 만들어집니다. 실제 현업에서는 어떻게 활용할까요?
고객센터 챗봇이 대표적입니다. "내 포인트 얼마야?"라는 질문에 사용자 정보를 조회하는 함수를 호출하고, "이 상품 환불해줘"라는 요청에 환불 처리 함수를 호출합니다.
이 모든 것이 자연스러운 대화 속에서 이루어집니다. 다시 김개발 씨의 이야기로 돌아가 봅시다.
박시니어 씨의 설명을 들은 김개발 씨는 눈이 반짝였습니다. "그러니까 제가 함수만 잘 만들어두면, LLM이 알아서 적절한 상황에 호출해주는 거네요!" 맞습니다.
Function Calling을 제대로 이해하면 LLM을 단순한 텍스트 생성기에서 강력한 업무 자동화 도구로 변신시킬 수 있습니다.
실전 팁
💡 - 함수 설명(description)을 명확하게 작성하면 LLM이 더 정확하게 판단합니다
- 파라미터의 타입과 필수 여부를 명시하면 오류를 줄일 수 있습니다
2. LLM이 함수를 호출하는 원리
김개발 씨는 Function Calling의 개념은 이해했지만, 한 가지 의문이 남았습니다. "LLM이 텍스트만 생성한다면서요?
그런데 어떻게 함수를 호출할 수 있는 거죠?" 코드 리뷰 시간에 던진 이 질문에 박시니어 씨가 화이트보드를 꺼냈습니다.
LLM의 함수 호출은 사실 구조화된 텍스트 생성입니다. LLM은 함수를 직접 실행하지 않고, "이 함수를 이 인자로 호출해달라"는 JSON 형태의 응답을 생성합니다.
개발자가 이 응답을 파싱해서 실제 함수를 실행하고, 그 결과를 다시 LLM에게 전달하면 최종 답변이 완성됩니다.
다음 코드를 살펴봅시다.
# 1단계: 사용자 질문과 도구 정보를 LLM에게 전달
user_message = "서울 날씨 알려줘"
# 2단계: LLM이 함수 호출 요청을 생성
llm_response = {
"type": "function_call",
"function": {
"name": "get_weather",
"arguments": {"city": "서울"}
}
}
# 3단계: 개발자가 실제 함수 실행
result = get_weather(city="서울") # {"temperature": 15, "condition": "맑음"}
# 4단계: 결과를 LLM에게 전달하여 최종 답변 생성
final_response = "서울의 현재 기온은 15도이며, 맑은 날씨입니다."
박시니어 씨가 화이트보드에 네 개의 상자를 그렸습니다. "Function Calling은 총 네 단계로 이루어져요.
이걸 이해하면 어떤 API를 쓰든 적용할 수 있습니다." 첫 번째 단계는 프롬프트 구성입니다. 사용자의 질문과 함께, 사용 가능한 함수들의 목록을 LLM에게 전달합니다.
이 목록에는 함수 이름, 설명, 파라미터 정보가 포함됩니다. 마치 레스토랑에서 메뉴판을 보여주는 것과 같죠.
"이런 요리들을 만들 수 있어요"라고 알려주는 겁니다. 두 번째 단계는 LLM의 판단입니다.
LLM은 사용자의 질문을 분석합니다. "서울 날씨 알려줘"라는 질문을 보고, "아, 이건 날씨를 물어보는 거구나.
get_weather 함수를 써야겠다. city 파라미터에는 '서울'을 넣어야겠어"라고 판단합니다.
그리고 이 판단을 JSON 형태로 출력합니다. 중요한 점은 LLM이 실제로 함수를 실행하는 게 아니라는 겁니다.
LLM은 그저 "이렇게 호출해주세요"라고 요청하는 것뿐입니다. 마치 상사가 "이 서류 처리해줘"라고 지시하는 것과 같죠.
실제 처리는 담당자가 합니다. 세 번째 단계는 함수 실행입니다.
개발자의 코드가 LLM의 응답을 파싱합니다. function.name이 "get_weather"이고 arguments가 {"city": "서울"}인 걸 확인하면, 실제 get_weather 함수를 호출합니다.
이 함수는 우리 서버에서 실행되므로, 데이터베이스 조회든 외부 API 호출이든 무엇이든 할 수 있습니다. 네 번째 단계는 결과 통합입니다.
함수 실행 결과를 다시 LLM에게 전달합니다. "get_weather 함수의 결과는 이거야"라고 알려주면, LLM은 이 정보를 바탕으로 사용자에게 자연스러운 답변을 생성합니다.
"서울의 현재 기온은 15도이며, 맑은 날씨입니다"처럼요. 김개발 씨가 고개를 끄덕였습니다.
"그러니까 LLM은 중간 관리자 역할인 거네요. 사용자의 요청을 이해하고, 어떤 함수를 호출할지 결정하고, 결과를 예쁘게 포장해서 전달하는." 박시니어 씨가 미소를 지었습니다.
"정확해요. 그래서 우리가 해야 할 일은 함수를 잘 정의하고, LLM이 이해할 수 있도록 설명을 잘 작성하는 거예요." 이 원리를 이해하면 왜 함수 설명이 중요한지 알 수 있습니다.
LLM은 함수 코드를 보는 게 아니라 우리가 작성한 설명만 봅니다. 설명이 모호하면 LLM도 잘못된 판단을 내릴 수 있습니다.
또한 보안에 대해서도 생각해야 합니다. LLM이 아무 함수나 호출할 수 있으면 위험하겠죠?
그래서 우리가 명시적으로 허용한 함수만 tools 목록에 넣어야 합니다. 그리고 함수 내부에서도 입력값 검증을 철저히 해야 합니다.
실전 팁
💡 - LLM 응답에서 function_call이 있는지 먼저 확인하고 처리해야 합니다
- 함수 실행 중 오류가 발생하면 에러 메시지도 LLM에게 전달하여 적절한 응답을 생성하게 합니다
3. OpenAI vs Anthropic vs Gemini API
프로젝트 기획 회의에서 팀장이 물었습니다. "그래서 어떤 API를 쓸 건가요?" 김개발 씨는 당황했습니다.
OpenAI의 GPT, Anthropic의 Claude, Google의 Gemini 모두 Function Calling을 지원하는데, 각각 어떻게 다른 걸까요?
세 플랫폼 모두 Function Calling을 지원하지만, 구현 방식과 용어가 조금씩 다릅니다. OpenAI는 tools, Anthropic은 tools, Gemini는 function_declarations라는 이름을 사용합니다.
핵심 원리는 동일하지만, API 호출 방식과 응답 구조에서 차이가 있으므로 각 플랫폼의 문서를 확인해야 합니다.
다음 코드를 살펴봅시다.
# OpenAI API
openai_tools = [{
"type": "function",
"function": {
"name": "get_weather",
"description": "도시의 날씨 조회",
"parameters": {"type": "object", "properties": {"city": {"type": "string"}}}
}
}]
# Anthropic API (Claude)
anthropic_tools = [{
"name": "get_weather",
"description": "도시의 날씨 조회",
"input_schema": {"type": "object", "properties": {"city": {"type": "string"}}}
}]
# Google Gemini API
gemini_tools = [{
"function_declarations": [{
"name": "get_weather",
"description": "도시의 날씨 조회",
"parameters": {"type": "object", "properties": {"city": {"type": "string"}}}
}]
}]
김개발 씨는 세 가지 API 문서를 펼쳐놓고 비교하기 시작했습니다. 얼핏 보면 비슷해 보이는데, 자세히 보니 미묘한 차이가 있었습니다.
먼저 OpenAI API를 살펴봅시다. OpenAI는 Function Calling의 선구자 격입니다.
2023년에 처음 도입되어 가장 많은 레퍼런스와 예제가 있습니다. tools 배열 안에 type이 "function"인 객체를 넣고, function 속성 안에 실제 함수 정보를 작성합니다.
한 단계 더 중첩되어 있는 구조죠. OpenAI의 응답에서는 tool_calls 배열을 확인해야 합니다.
여러 함수를 동시에 호출할 수 있도록 배열 형태로 되어 있습니다. 각 tool_call에는 고유 id가 있어서, 결과를 전달할 때 어떤 호출에 대한 결과인지 명시할 수 있습니다.
다음으로 Anthropic API를 보겠습니다. Anthropic의 Claude는 tools라는 이름은 같지만, 구조가 조금 다릅니다.
type 래핑 없이 바로 name과 description이 나옵니다. 그리고 parameters 대신 input_schema라는 이름을 사용합니다.
의미는 같지만 필드명이 다르니 주의해야 합니다. Claude의 응답에서는 content 배열 안에 tool_use 타입의 블록을 찾아야 합니다.
이 블록에 함수 이름과 입력값이 들어있습니다. 결과를 전달할 때는 tool_result 타입의 메시지를 보냅니다.
마지막으로 Google Gemini API입니다. Gemini는 function_declarations라는 별도의 배열을 사용합니다.
tools 객체 안에 function_declarations 배열이 있고, 그 안에 함수 정보가 들어갑니다. Google 특유의 스타일이라고 할 수 있죠.
Gemini의 응답에서는 functionCall 객체를 확인합니다. 카멜케이스를 사용하는 것도 Google 스타일입니다.
args 속성에 파라미터가 들어있고, 결과는 functionResponse로 전달합니다. 박시니어 씨가 조언했습니다.
"세 플랫폼의 공통점에 집중하세요. 결국 함수 이름, 설명, 파라미터 스키마를 전달하고, 응답에서 함수 호출 정보를 파싱하는 건 똑같아요." 실무에서는 어떻게 선택해야 할까요?
OpenAI는 생태계가 가장 넓습니다. LangChain, LlamaIndex 등 대부분의 프레임워크가 OpenAI를 최우선으로 지원합니다.
레퍼런스도 풍부해서 문제 해결이 쉽습니다. Anthropic Claude는 긴 컨텍스트 처리와 안전성에서 강점이 있습니다.
복잡한 문서를 분석하면서 함수를 호출해야 하는 경우 좋은 선택입니다. Gemini는 Google Cloud 생태계와의 연동이 필요할 때 유리합니다.
Vertex AI와 함께 사용하면 엔터프라이즈 환경에서 관리가 편합니다. 김개발 씨는 노트에 정리했습니다.
"결국 핵심 원리는 같고, API 호출 코드만 플랫폼에 맞게 바꾸면 되는 거구나."
실전 팁
💡 - 플랫폼 간 전환이 필요할 수 있으니, 함수 정의를 별도 파일로 분리해두면 좋습니다
- 각 플랫폼의 rate limit과 가격 정책도 함께 고려해야 합니다
4. 실습 첫 번째 함수 호출
이론은 충분합니다. 이제 직접 코드를 작성해볼 시간입니다.
김개발 씨는 빈 에디터를 열고 키보드에 손을 올렸습니다. 가장 간단한 예제부터 시작해봅시다.
계산기 함수를 만들어 LLM이 호출하도록 해보겠습니다.
첫 번째 실습에서는 OpenAI API를 사용하여 간단한 계산기 함수를 구현합니다. 두 숫자를 더하는 함수를 만들고, 사용자가 "3과 5를 더해줘"라고 말하면 LLM이 이 함수를 호출하도록 합니다.
전체 흐름을 직접 경험하면서 Function Calling의 작동 원리를 체득할 수 있습니다.
다음 코드를 살펴봅시다.
from openai import OpenAI
client = OpenAI()
# 실제 함수 정의
def add_numbers(a: int, b: int) -> int:
"""두 숫자를 더합니다"""
return a + b
# LLM에게 제공할 도구 정의
tools = [{
"type": "function",
"function": {
"name": "add_numbers",
"description": "두 숫자를 더합니다",
"parameters": {
"type": "object",
"properties": {
"a": {"type": "integer", "description": "첫 번째 숫자"},
"b": {"type": "integer", "description": "두 번째 숫자"}
},
"required": ["a", "b"]
}
}
}]
# API 호출
response = client.chat.completions.create(
model="gpt-4o",
messages=[{"role": "user", "content": "3과 5를 더해줘"}],
tools=tools
)
김개발 씨가 코드를 한 줄씩 작성하기 시작했습니다. 먼저 OpenAI 클라이언트를 설정합니다.
pip로 openai 패키지를 설치하고, 환경 변수에 OPENAI_API_KEY를 설정해두면 클라이언트가 자동으로 인식합니다. 별도 설정 없이 바로 사용할 수 있어 편리합니다.
다음으로 실제 함수를 정의합니다. add_numbers 함수는 정말 간단합니다.
두 정수를 받아서 더한 값을 반환합니다. 중요한 건 이 함수가 우리 서버에서 실행된다는 점입니다.
LLM은 이 코드를 볼 수 없고, 우리가 작성한 설명만 봅니다. 그 다음이 핵심인 tools 정의입니다.
tools 배열 안에 함수 정보를 JSON으로 작성합니다. type은 "function"으로 고정입니다.
function 객체 안에 name, description, parameters를 넣습니다. parameters는 JSON Schema 형식을 따릅니다.
type이 "object"이고, properties에 각 파라미터를 정의합니다. a와 b 모두 integer 타입이고, description으로 설명을 추가했습니다.
required 배열에 필수 파라미터를 명시합니다. 이제 API를 호출합니다.
chat.completions.create 메서드에 model, messages, tools를 전달합니다. messages에는 사용자의 질문 "3과 5를 더해줘"가 들어갑니다.
tools에는 앞서 정의한 도구 목록이 들어갑니다. API 응답을 확인해볼까요?
응답의 choices[0].message를 보면 tool_calls 배열이 있습니다. 그 안에 function 객체가 있고, name은 "add_numbers", arguments는 '{"a": 3, "b": 5}'입니다.
LLM이 사용자의 "3과 5"라는 자연어를 정확하게 파싱해서 파라미터로 변환한 것입니다. 이제 함수를 실행해야 합니다.
arguments는 문자열이므로 json.loads로 파싱합니다. 그리고 add_numbers 함수에 언패킹해서 전달합니다.
결과는 8이 됩니다. 마지막으로 결과를 LLM에게 전달합니다.
tool_calls의 id와 함께 function 결과를 메시지로 추가합니다. 그리고 다시 API를 호출하면, LLM이 "3과 5를 더하면 8입니다"와 같은 자연스러운 답변을 생성합니다.
김개발 씨가 터미널에서 코드를 실행했습니다. 정확히 예상대로 동작했습니다!
"생각보다 간단하네요. 함수 정의하고, 도구 등록하고, 응답 파싱하고, 결과 전달하고.
네 단계가 끝이에요." 박시니어 씨가 고개를 끄덕였습니다. "맞아요.
이 패턴만 익히면 어떤 함수든 LLM과 연동할 수 있어요."
실전 팁
💡 - arguments는 문자열이므로 json.loads로 파싱해야 합니다
- tool_call_id를 정확히 매칭해서 결과를 전달해야 대화 맥락이 유지됩니다
5. 실습 날씨 API 통합
계산기는 성공적으로 만들었습니다. 이제 진짜 실용적인 예제로 넘어갈 차례입니다.
김개발 씨는 처음 품었던 의문을 해결하고 싶었습니다. LLM이 "서울 날씨 어때?"에 제대로 답변하게 만들어봅시다.
실제 날씨 API를 호출하여 실시간 정보를 가져오는 Function Calling을 구현합니다. Open-Meteo라는 무료 날씨 API를 사용하며, 도시 이름을 좌표로 변환하고 날씨 데이터를 조회하는 전체 파이프라인을 완성합니다.
다음 코드를 살펴봅시다.
import json
import requests
from openai import OpenAI
client = OpenAI()
def get_weather(city: str) -> dict:
"""실제 날씨 API를 호출합니다"""
# 도시 좌표 조회 (예시: 서울)
geocode = {"서울": (37.5665, 126.9780), "부산": (35.1796, 129.0756)}
lat, lon = geocode.get(city, (37.5665, 126.9780))
# Open-Meteo API 호출
url = f"https://api.open-meteo.com/v1/forecast?latitude={lat}&longitude={lon}¤t_weather=true"
response = requests.get(url)
data = response.json()
return {
"city": city,
"temperature": data["current_weather"]["temperature"],
"windspeed": data["current_weather"]["windspeed"]
}
tools = [{
"type": "function",
"function": {
"name": "get_weather",
"description": "도시의 현재 날씨를 조회합니다",
"parameters": {
"type": "object",
"properties": {"city": {"type": "string", "description": "도시 이름 (한글)"}},
"required": ["city"]
}
}
}]
김개발 씨는 실제 날씨 데이터를 가져오기 위해 Open-Meteo API를 선택했습니다. 무료이고, 가입 없이 사용할 수 있어서 실습에 딱 맞습니다.
먼저 get_weather 함수를 구현합니다. 날씨 API는 대부분 위도와 경도를 요구합니다.
하지만 사용자는 "서울"이라고 말하지 "37.5665, 126.9780"이라고 말하지 않죠. 그래서 도시 이름을 좌표로 변환하는 과정이 필요합니다.
실제 프로덕션에서는 Geocoding API를 사용하겠지만, 실습에서는 간단한 딕셔너리로 대체했습니다. 서울과 부산의 좌표를 미리 저장해두고, 도시 이름에 해당하는 좌표를 가져옵니다.
다음으로 Open-Meteo API를 호출합니다. requests 라이브러리로 GET 요청을 보냅니다.
latitude와 longitude에 좌표를 넣고, current_weather=true를 추가하면 현재 날씨만 가져옵니다. 응답에서 temperature와 windspeed를 추출해서 반환합니다.
이 함수를 tools에 등록합니다. 앞서 배운 것처럼 function 객체 안에 name, description, parameters를 정의합니다.
city 파라미터의 description에 "(한글)"을 추가해서 LLM이 한글 도시명을 기대한다는 걸 명시했습니다. 이제 전체 흐름을 연결해봅시다.
사용자가 "서울 날씨 어때?"라고 물으면, LLM은 tool_calls에 get_weather 함수 호출을 담아 응답합니다. arguments에는 {"city": "서울"}이 들어있겠죠.
우리 코드가 이 응답을 파싱하고, 실제 get_weather 함수를 호출합니다. 함수는 Open-Meteo API에 요청을 보내고, 실시간 날씨 데이터를 받아옵니다.
이 결과를 다시 LLM에게 전달하면, "서울의 현재 기온은 18도이며, 풍속은 시속 12km입니다"와 같은 자연스러운 답변이 생성됩니다. 김개발 씨가 코드를 실행했습니다.
터미널에 실제 서울의 현재 기온이 출력되었습니다! "드디어 LLM이 실시간 날씨를 알려주네요!" 김개발 씨가 감탄했습니다.
박시니어 씨가 덧붙였습니다. "이 패턴을 응용하면 뭐든 할 수 있어요.
주식 시세 조회, 일정 등록, 이메일 발송까지. Function Calling은 LLM을 실제 세상과 연결하는 다리예요." 실무에서는 몇 가지 추가 고려사항이 있습니다.
첫째, 에러 처리입니다. API 호출이 실패하면 어떻게 할까요?
try-except로 감싸고, 에러가 발생하면 에러 메시지를 LLM에게 전달합니다. LLM은 "날씨 정보를 가져오는 데 실패했습니다"와 같이 응답할 수 있습니다.
둘째, 캐싱입니다. 같은 질문에 대해 매번 API를 호출하면 비용과 시간이 낭비됩니다.
Redis나 인메모리 캐시를 사용해서 일정 시간 동안 결과를 저장해두면 효율적입니다. 셋째, 타임아웃입니다.
외부 API가 응답하지 않으면 전체 서비스가 멈출 수 있습니다. requests.get에 timeout 파라미터를 추가해서 최대 대기 시간을 설정해야 합니다.
김개발 씨는 노트에 정리했습니다. "Function Calling + 외부 API = 무한한 가능성.
이제 뭐든 만들 수 있겠다!"
실전 팁
💡 - 외부 API 호출에는 반드시 timeout을 설정하세요 (예: requests.get(url, timeout=5))
- API 키가 필요한 서비스는 환경 변수로 관리하고, 코드에 직접 넣지 마세요
이상으로 학습을 마칩니다. 위 내용을 직접 코드로 작성해보면서 익혀보세요!
댓글 (0)
함께 보면 좋은 카드 뉴스
Context Fundamentals - AI 컨텍스트의 기본 원리
AI 에이전트 개발의 핵심인 컨텍스트 관리를 다룹니다. 시스템 프롬프트 구조부터 Attention Budget, Progressive Disclosure까지 실무에서 바로 적용할 수 있는 컨텍스트 최적화 전략을 배웁니다.
Phase 1 보안 사고방식 구축 완벽 가이드
초급 개발자가 보안 전문가로 성장하기 위한 첫걸음입니다. 해커의 관점에서 시스템을 바라보는 방법부터 OWASP Top 10, 포트 스캐너 구현, 실제 침해사고 분석까지 보안의 기초 체력을 다집니다.
프로덕션 워크플로 배포 완벽 가이드
LLM 기반 애플리케이션을 실제 운영 환경에 배포하기 위한 워크플로 최적화, 캐싱 전략, 비용 관리 방법을 다룹니다. Airflow와 서버리스 아키텍처를 활용한 실습까지 포함하여 초급 개발자도 프로덕션 수준의 배포를 할 수 있도록 안내합니다.
워크플로 모니터링과 디버깅 완벽 가이드
LLM 기반 워크플로의 실행 상태를 추적하고, 문제를 진단하며, 성능을 최적화하는 방법을 다룹니다. LangSmith 통합부터 커스텀 모니터링 시스템 구축까지 실무에서 바로 적용할 수 있는 내용을 담았습니다.
LlamaIndex Workflow 완벽 가이드
LlamaIndex의 워크플로 시스템을 활용하여 복잡한 RAG 파이프라인을 구축하는 방법을 알아봅니다. 이벤트 기반 워크플로부터 멀티 인덱스 쿼리까지 단계별로 학습합니다.