범용성을 다소 희생하는 대신, 특정 도메인에 집중하여 더 복잡한 작업을 높은 정확도로 수행하기 위해 LLM 워크플로우를 도입합니다.
큰 작업을 작고 명확하게 정의된 세부 작업들로 분해하고, 관리자 프로세스가 이를 조정 및 분배하여 원하는 결과를 도출합니다.
9.1 대화형 에이전트로 충분할까 ?
이렇게 각각 모든 쇼피파이를 사용하는 온라인 매장을 가져와서, 각각 맞는 니즈를 파악해서 메일로 다시 제안한다 ?
LLM 이라면 가능하다. 어떻게 대화형 에이전트만으로 수행이 되는걸까?
"여러 쇼피파이 온라인 매장을 수집하고, 각 매장에 어울릴 새로운 플러그인 아이디어를 생각한 뒤 각 매장 운영자에게 마케팅 이메일을 보내줘" -> 이건 말도안된다. 별로 도움이 되지 않는다.
하지만, 더 나은 결과를 얻는 것을 돕기 위해 에이전트에 도구를 제공하면 된다.
search_web, browse_site, send_email 같은 ..
9.2 기본 LLM 워크플로
목표 정의하기
워크플로의 목적과 최종적으로 달성하고자 하는 결과물 또는 변화를 명확히 파악합니다.
작업 구체화하기
워크플로를 일련의 작업으로 나누고 순서대로 실행되도록 설계합니다.
LLM 기반 작업의 경우 필요한 도구, 입력 및 출력을 파악합니다.
작업 구현하기
입력과 출력이 명확히 정의되도록 작업을 구성합니다.
각 작업이 독립적으로 올바르게 작동하는지 확인합니다.
워크플로 구현하기
작업들을 서로 연결하여 완전한 워크플로를 구성합니다.
전체적인 맥락에서 원활하게 작동하는지 조율합니다.
워크플로 최적화하기
품질, 성능, 비용을 개선하기 위해 작업을 지속적으로 최적화합니다.
9.2.1 작업
두번쨰 작업은, 명세화 하는 것이다.
Shopify 플러그인 프로모터 예시에서 워크플로우를 구성하는 5가지 하위 작업은 다음과 같습니다.
인기 있는 Shopify 스토어 목록 생성 및 웹사이트 HTML 코드 가져오기
각 매장의 제품 구성, 브랜딩, 스타일, 가치관 등 세부 정보 추출
각 매장을 검토하여 비즈니스에 도움이 될 만한 플러그인 고안
각 매장 소유주에게 플러그인 개념을 홍보하는 마케팅 이메일 생성
이메일 전송
세번째 작업을 구현하는 단계로 넘어가서.
전반적인 목표의 하위 단계를 말한다.
작업들이 서로 연결되어 매끄럽게 실행되려면 명확한 데이터 구조(스키마)가 정의되어야 합니다.
LLM을 활용한 작업 구현 방식은 크게 두 가지다.
프롬프트 템플릿: 입력 정보를 템플릿에 넣고, 작업에 맞는 결과를 생성한다. 여러 번 실행해 결과를 살펴보며 지침과 맥락을 다듬는다. 생성 결과에서 필요한 부분만 추출해 다음 단계로 전달한다.(랭체인이 권장하는 접근법)
도구 호출: HTML 같은 자유 형식 자료에서 이름·주소·전화번호처럼 구조화된 정보를 뽑을 때, 원하는 데이터 형식에 맞는 도구를 정의해 모델이 그 형식으로 결과를 반환하게 한다. 결과 구조가 복잡하면 작은 단위로 나눠 추출한다.
* 작업을 정교하게 다듬기 *
첫 프롬프트의 결과가 기대에 못 미치면 먼저 요구사항을 사람이 읽어도 분명하게 이해할 수 있도록 다듬는다. 그래도 문제가 남으면 다음 방법을 적용할 수 있다.
단계별 추론 유도: 모델이 도구를 부르기 전에 먼저 계획하고 생각하게 한다. OpenAI API에서는 도구 사양은 제공하되 tool_choice: "none"으로 당장 도구를 호출하지 못하게 할 수 있다.
자기 교정(Reflexion): 결과를 형식 검사, 코드 실행·테스트, LLM 검토 등으로 평가한다. 실패하면 오류 보고서와 이전 시도를 프롬프트에 넣어 다시 생성한다. 품질은 높일 수 있지만 비용과 시간이 늘어난다.
에이전트 협업: 개방형·복잡한 문제는 도구를 갖춘 전문가 에이전트와 이를 안내하는 사용자 프록시 에이전트가 협력하게 할 수 있다. AutoGen이 이런 구조를 지원한다.
모든 작업에 LLM을 쓸 필요는 없다.
웹 페이지 수집이나 데이터 저장처럼 규칙적인 작업은 크롤러·일반 코드로 처리한다.
분류처럼 가벼운 작업은 BERT 같은 전통적 머신러닝 모델이 더 빠르고 저렴할 수 있다.
비용이 크거나 되돌리기 어려운 작업, 사람의 판단이 필요한 작업에는 사람의 승인·검토 단계를 둔다.
LLM이 필요한 경우에도 간단한 작업은 저렴한 모델로, 어려운 작업은 성능 높은 모델로 나눠 맡긴다.
핵심: 작업마다 가장 적합한 방식을 고르고, 결과 검증과 사람의 감독을 워크플로에 포함하면 품질과 안전성을 높일 수 있다.
9.2.2 워크플로 구성하기
이제 워크플로우를 한개로 조립하면된다. 여러 방법들이 있다.
파이프라인 (Pipeline):
작업들이 순차적으로 연결되어 각 작업의 출력이 최대 하나의 작업에만 입력으로 사용되는 가장 단순한 구조입니다.
장단점: 단순하지만 유연성이 떨어져, 특정 정보를 여러 곳에서 재사용하기 어렵습니다.
방향성 비순환 그래프 (DAG, Directed Acyclic Graph):
하나의 작업이 여러 하위 작업으로 출력을 보내거나 여러 상위 작업의 입력을 받을 수 있는 구조입니다.
상위 종속 작업이 모두 성공해야만 다음 작업이 실행되며, Airflow나 Luigi 같은 널리 쓰이는 자동화 플랫폼에서 활용됩니다.
순환 그래프 (Cyclic Graph):
출력된 정보가 상위 작업으로 되돌아가 루프(Loop)를 형성하는 네트워크입니다.
LLM의 오류를 수정하기 위한 품질 관리(품질이 부족할 경우 상위 단계로 되돌려 보내는 등)에 유용할 수 있습니다.
주의점: 복잡성이 크게 증가하며, 오류 정보 재결합 처리, 실패 정보 처리, 무한 순환 방지(시도 횟수 제한) 등의 복잡한 예외 처리가 필요합니다. 가급적 재귀 호출은 작업 내부에 숨기는 것이 좋습니다.
* 그 외 *
일괄 워크플로 (Batch Workflow): 알려져 있고 유한한 작업 항목 집합을 처리하며, 설정 및 유지 관리가 간단하고 대용량 데이터 처리에 유리합니다.
스트리밍 워크플로 (Streaming Workflow): 프로세스 도중 생성되거나 검색되는 임의의 작업 항목을 처리하며, 실시간 저지연 작업에 적합하지만 상대적으로 더 복잡합니다.
워크플로 최적화
워크플로를 만든 뒤에는 단순히 프롬프트를 고치는 데 그치지 말고,
작업 자체가 목표에 맞는지 먼저 점검해야 한다.
작업 결과를 평가해 개선점을 제시하는 작업 단계의 피드백을 넣거나, 실패한 항목을 워크플로 앞단으로 돌려보내는 전체 흐름의 피드백을 설계할 수도 있다.
또한 각 작업의 입력과 출력 예시를 모아 오프라인 테스트를 만들면, 프롬프트를 바꿀 때 결과가 나빠지는지 배포 전에 확인할 수 있다. DSPy와 TextGrad는 이런 예시와 평가 기준을 이용해 프롬프트를 자동으로 최적화하는 프레임워크다.
운영을 시작한 뒤에는 실제 입력·출력 데이터를 기록하고 샘플링해 품질을 살핀다. 실제 트래픽에서 A/B 테스트를 진행하면 서로 다른 구현 방식을 비교할 수 있다.
핵심: 작업 설계, 피드백, 오프라인 테스트, 운영 데이터와 A/B 테스트를 반복해 워크플로의 품질을 지속적으로 개선한다.
9.3 고급 LLM 워크플로
기본 워크플로는 작업과 순서가 정해져 있어 안정적이고 디버깅하기 쉽지만, 미리 설계한 범위를 벗어나는 상황에는 유연하게 대응하기 어렵다. 고급 워크플로는 LLM에 더 많은 자율성을 주어 개방적인 문제를 다룰 수 있지만, 그만큼 예측과 통제가 어려워진다.
1. LLM이 워크플로를 주도
워크플로 자체를 에이전트로 만들어, 상황에 따라 작업을 선택하고 순서를 정하게 할 수 있다. 더 나아가 필요한 작업 에이전트를 즉석에서 만들거나, 여러 작업의 우선순위를 계속 조정하게 할 수도 있다. 이때 에이전트가 대화를 끝없이 이어가지 않도록, 완료 결과를 제출하는 finish 같은 명확한 종료 방식이 필요하다.
2. 상태를 유지하는 작업 에이전트
일반적인 작업은 입력을 받으면 처리한 뒤 끝나지만, 상태 저장 에이전트는 특정 파일이나 자산을 계속 관리한다. 다른 에이전트나 사용자가 변경을 요청하면 해당 내용을 수정하고, 관련 에이전트에 변경 사실을 알릴 수 있다. 다만 서로 의존하는 작업이 순환하며 무한 반복되지 않도록 의존성 관리를 해야 한다.
3. 역할과 위임
각 에이전트에 역할·목표·도구를 부여하고 팀처럼 협력시킬 수 있다. AutoGen은 여러 에이전트를 관리하는 그룹 채팅 구조를 지원하고, CrewAI는 역할과 작업을 가진 에이전트들을 순차적 또는 계층적으로 구성하는 방식을 제공한다. 이런 프레임워크는 편리하지만, 사용 목적에 꼭 필요한지 먼저 따져봐야 한다.
핵심 결론
복잡한 목표는 여러 작은 작업으로 나누고, 가능하면 LLM 없이 일반 코드나 전통적인 머신러닝으로 처리하는 것이 더 안정적이다. LLM이 필요한 단계만 에이전트로 만들고 나머지는 정해진 워크플로로 연결하면 문제를 찾고 개선하기 쉽다. 더 많은 유연성이 꼭 필요할 때 고급 구조를 시도하되, 자율성이 커질수록 신뢰성과 통제는 어려워진다는 점을 고려해야 한다.
4단계 (실행): 도구 사용이 필요하다면, AI가 지정한 함수 이름과 인자(arguments)를 추출해서 실제 파이썬 함수를 직접 실행합니다.(전에 우리가 만든 리모콘을 실행한다.)
5단계 (결과 추가): 함수를 실행해서 얻은 결과값을 role: "tool" 메시지 형태로 만들어 대화 내역 끝에 붙여줍니다.
자 이제 다음은 사용자가 온도 몇도 조절해줄래 ? 했을때 과정이다.
이제 role system user 를 정의하고, process_message 를 호출한다.
process_message는 우리가 도구 호출, 평가, 도작을 정의했던, 함수이다.
그러면 message 리스트에 2개의 메시지가 추가된다.
1. assistant 가 온도 조절하는 리모콘을 눌러달라는 tool call
2. 실제로 눌렀더니, 74도인 것
하지만 온도를 아는것이 다가 아니다, 실제로 세팅을 해야한다.
다시 메세지 client 를 세팅하고 process_messages 를 호출(아래)
그럼
1. assistant : 아까 74도였으니까 2도 높여서 76도로 실행해줘.
2. 76도 설정완료.
하지만 설정 완료하고 끝이 아니다.
하지만 시스템 내부에서 혼자 처리하고 끝내면 사용자 입장에서는 무슨 일이 일어났는지 알 수 없기 때문에, 사용자에게 결과를 알려주기 위해 마지막으로 process_messages를 한 번 더 호출
2. 내부 작동 원리
겉으로 보기에는 모델이 진짜로 코드를 실행하거나 외부 데이터베이스를 직접 조회하는 대단하고 복잡한 기술처럼 보이지만, LLM 내부에서 일어나는 일은 100% '다음 단어(토큰) 예측' 하나뿐.
( OpenAI는 이 내부 프롬프트 형식을 공식 공개하지 않았습니다.)
우리가 어떤 내용을 호출하면 위처럼 변환이 된다.
우리가 제공한 코드도 있고, tool, functions 다양한 내용이 있다.
OpenAI API 서버는 개발자가 보낸 위 JSON을 받아서, 모델이 가장 잘 이해할 수 있는 TypeScript 형태의 텍스트로 변환한 뒤 시스템 프롬프트 맨 뒤에 합쳐서 모델에게 전달한다.
즉, 모델에맞춰서 TypeScript 형태로 바꾸어야 하는 가장큰 이유는 :
토큰 절약: JSON 전체 구조를 그대로 주입하는 것보다 TypeScript 인터페이스 형태의 텍스트로 변환하는 것이 토큰 길이가 더 짧습니다.
이해도 향상: 모델은 사전 학습(Pre-training) 때 TypeScript 코드와 주석을 수없이 많이 읽었기 때문에, 이 구문을 만나면 "아, 내가 어떤 인자(Key)와 데이터 타입(Value)을 써서 함수를 불러야 하는구나!"를 훨씬 더 명확하게 파악합니다.(우리가 어셈블러 언어를 배우는 것도 동일한 이치)
우리가 위에서 핑퐁한 대화들의 내용이 여기 있다.
LLM이 assistant to=functions.set_room_temp {"temp": 77}라는 글자를 적을 때, 속으로는
"1. 어시스턴트로 ➔ 2. 도구를 쓰자 ➔ 3. 온도 설정 함수로 ➔ 4. temp 파라미터에 ➔ 5. 77이라는 값을 넣어서 ➔ 6. 끝!"
이라는 6단계 의사결정을 순간적으로 거치며 단어를 하나씩 이어 쓴다는 뜻입니다.
[대화형 AI(LLM)에 사용할 도구(Function/Tool)를 설계할 때 지켜야 할 가이드라인]
. 핵심 전제 (대원칙)
사람이 이해하기 쉬운 것이 LLM에게도 쉽다.
모델이 이미 대량의 학습 데이터로 알고 있는 형식이나 명명법을 그대로 활용하는 것이 가장 효과적
적절한 도구 선택 (Selecting the right tools)
한 번에 제공하는 도구 개수를 최소화하고, 기능이 중첩되지 않도록 역할을 명확히 분리해야 모델의 혼란을 막습니다.
복잡하고 거대한 백엔드 REST API를 그대로 주입하지 말고, LLM 전용으로 단순화된 도구를 만들어 전달하세요.
도구 및 인수 명명 (Naming tools and arguments)
사람이 읽어도 한눈에 의도를 파악할 수 있도록 의미가 명확하고 자가 설명적인 이름을 지정해야 합니다.
retrieveemail처럼 구분 없이 붙여 쓴 소문자 단어는 파싱이 어려우므로 camelCase 같은 명확한 관례를 따르세요.
도구 정의 (Defining tools)
법률 문서처럼 복잡한 용어는 피하고, 모델이 사용법을 직관적으로 이해할 수 있게 가볍고 명확하게 정의하세요.
이미 모델이 잘 알고 있는 공공 API(예: GitHub API 등)를 연동할 때는 기존 문서의 명칭과 스타일을 그대로 따르는 것이 좋습니다.
인수 처리 (Dealing with arguments)
파라미터는 기본 타입(string, number, boolean, enum) 위주로 가급적 적고 단순하게 유지하세요.
대화 맥락에 없는 정보로 모델이 임의의 값을 지어내는 환각을 막으려면 필수 인자를 아예 제거하거나 애플리케이션 기본값을 활용하세요.
출력 처리 (Dealing with tool outputs)
도구의 실행 결과는 모델이 다음에 무엇을 할지 예측할 수 있도록 정형화되거나 깔끔한 텍스트로 전달하세요.
"혹시 몰라 넣은" 불필요한 정보는 모델의 주의를 산만하게 만들어 환각이나 오류를 유발하므로 과감히 제외하세요.
오류 처리 (Dealing with tool errors)
도구 실행 중 에러가 발생하면 내부 시스템 로그를 그대로 던지지 말고, 모델이 이해할 수 있는 형태의 에러 정보로 변환하세요.
유효성 검사 실패 등 모델이 직접 수정 가능한 에러는 무엇이 틀렸는지 알려주어 스스로 재시도할 수 있게 유도해야 합니다.
위험한 도구 실행 (Executing "dangerous" tools)
실제 데이터 삭제나 송금처럼 파급력이 큰 작업은 "사용자 확인을 받으라"는 프롬프트 지시문만으로 안전을 보장할 수 없습니다.
모델이 자유롭게 요청을 보내도록 두되, 실제 외부 API가 호출되기 전 애플리케이션 레이어에서 이를 가로채 사용자 승인을 받는 안전장치를 만드세요.
8.2 추론
LLM은 원래 머릿속으로 생각하는 기능이 없이 단어를 이어 붙일 뿐이므로, 프롬프트를 통해 '단계별로 생각하는 과정(내적 독백)'을 출력하도록 강제해야 답변의 수준이 올라간다.
8.2.1 생각의 사슬
-> 필요한 정보를 넣으면서 질문해보면 성능향상에 도움이 된다.
햄스터 예시: "답하기 전에 이유부터 써라"라고 모델을 훈련시키기 위한 교재(Example)
엑소시스트 답변: 그 교재대로 학습해서 이유를 먼저 적다 보니 찍지 않고 정답을 맞춰낸 실전 결과입니다.
-> 즉, 틀릴만한 문제도 이유를 먼저 서술하면서 가는 느낌으로 가면 정답으로 유도될 수 있다.(환각 없어짐)
또한 , 중요한 개념은, 모델이 여러번 요청을 거칠수록 답변의 품질은 올라가고, 모델이 문제에 대해 생각할 시간을 갖도록 조건을 설정하는게 좋다.(품질 향상의 개념에서)
8.2.2 ReAct: 반복 추론 및 행동
사람도 자기 머릿속 지식만으로 바로 답하지 못하고 아래처럼 행동합니다:
생각 (Reasoning): "두 잡지의 창간일을 각각 검색해서 비교해야겠네."
행동 (Action): 구글에 Arthur's Magazine 검색 ➔ 결과 확인
행동 (Action): 구글에 First for Women 검색 ➔ 결과 확인
생각 (Reasoning): "A 잡지는 1844년, B 잡지는 1989년이네. A가 더 빠르다."
결론 (Finish): 최종 대답 출력
이렇게 '생각(Reason)'과 '도구 사용/행동(Act)'을 번갈아 반복하며 다단계 문제(Multistep Problem)를 푸는 패턴을 ReAct라고 부릅니다.
LLM도 똑같다.
Search[entity] = 책장에 가서 책 한 권 뽑아 펼치기
역할: 원하는 주제를 검색해서 위키피디아의 가장 첫 5문장(개요)을 읽어옵니다.
쉽게 말해: "위키피디아에서 Arthur's Magazine 책 좀 찾아와서 맨 첫 페이지 읽어봐!" 하는 것입니다.
Lookup[string] = 책 안에서 특정 단어 찾기 (Ctrl + F)
역할: 방금 펼쳐둔 책 안에서, 내가 찾고 싶은 특정 단어(예: "창간일", "출판")가 들어간 다음 문장을 찾아 읽습니다.
쉽게 말해: "책 내용은 너무 길니까, 그 책 안에서 1844년이나 출판이라는 단어가 들어간 부분만 바로 찾아서 읽어봐!" 하는 것입니다.
Finish[answer] = 정답지에 답 적고 제출하기
역할: 정보를 충분히 모아서 답을 알게 되었을 때, 검색을 멈추고 최종 답을 사용자에게 내놓습니다.
쉽게 말해: "이제 답 찾았으니까 검색 그만하고, *'Arthur's Magazine이 더 먼저 나왔습니다'*라고 정답 제출하자!" 하는 것입니다.
8.2.3 ReAct를 넘어
ReAct 가 LLM 애플리케이션에서 추론 능력을 개선하는 데, 매우 중요한 진전을 이룬건 맞지만 마지막은 아님.
1. Plan-and-Solve (먼저 계획부터 세우기)
방식: 다짜고짜 문제 해결(검색/행동)에 뛰어들지 않고, 전체적인 계획부터 먼저 세운 뒤 단계별로 문제를 풀게 만듭니다.
핵심 프롬프트: "먼저 문제를 이해하고 해결 계획을 수립하자. 그다음 그 계획에 따라 단계별로 문제를 풀어보자."
특징: 도구(검색)를 쓰기 전에 전체 그림을 그려보게 하여 논리적 실수를 줄이는 방법입니다.
2. Reflexion (자기 반성 및 피드백)
방식: 일이 끝난 뒤 자신이 한 작업 결과를 되돌아보고(Review), 어디가 잘못되었는지 반성하여 다음번 계획을 수정하게 만듭니다.
실제 활용 예시 (코드 작성):
모델이 코드를 작성합니다.
단이 테스트(Unit Test)를 돌렸는데 에러가 발생합니다.
실패 메시지를 모델에게 다시 보여주면, 모델이 반성하고 코드를 수정하여 재시도합니다.
3. Branch-solve-merge 작동 방식
Branch (가지치기): 하나의 문제를 $N$개의 서로 독립된 LLM 대화 세션(Solvers)으로 나눕니다.
Solve (해결하기):
높은 Temperature(창의성 수치)를 주어 각자 다르게 시도하게 만들거나, 서로 다른 관점(Perspective)에서 문제를 해결하도록 프롬프트로 지시합니다.
Merge (병합하기): 모든 AI가 답을 내놓으면, 이를 병합 전담 AI(Merging Agent)에게 전달하여 3개의 결과물을 종합한 더 뛰어나고 완성도 높은 최종 해결책을 만듭니다.
-> 계획-해결 프롬프트가 ReAct에 선제적인 계획 단계를 추가해 보완하는 방식이라면, Reflxion 방식은 정반대의 접근법을 취한다.
1. "Plan-and-Solve는 외부 도구를 쓰는 기법이 아니라, CoT처럼 내부 추론만 이용하되 '실제 문제를 풀기 전 전체 계획부터 먼저 세우도록' 강제하는 프롬프팅 기법"
2. "Reflexion"은 ReAct처럼 작업을 수행한 뒤, "내가 방금 한 작업의 결과물을 평가(Review)하고, 틀린 이유를 스스로 반성(Self-Reflection)하여 다음 시도에 반영하는 피드백 루프 방식"입니다.
3. "Branch-solve-merge는 여러 AI에게 다양한 관점으로 풀어보게 한 뒤 종합하는 방식이며, 지금까지 나온 모든 기법은 AI에게 '생각하는 시간(내적 독백)'을 주기 위한 도구들"
8.3 작업 기반 상호작용을 위한 콘텍스트
프롬프트를 만드기 위해 콘텍스트를 선택하고 구성할때 고려해야할 사항
1. 어떤 도구(Tool)가 필요한가?
대화 맥락상 지금 쓰이지 않을 도구 정의는 프롬프트에서 제외(Drop)하여 AI가 딴길로 새지 않게 주의를 줄여줍니다.
2. 어떤 데이터(Artifacts)를 포함할 것인가?
모두 포함하기: 정보는 완벽하지만, 불필요한 데이터가 많아져 AI가 혼란을 느낄 수 있습니다.
AI에게 선택하게 하기: AI에게 필요한 데이터만 고르게 만드는 별도 요청 과정을 거칩니다 (시스템 복잡도 증가).
3. 데이터를 어떤 형식으로 보여줄 것인가?
<artifact> 같은 XML 태그나 ## Attached Data 같은 마크다운 구획을 활용해 텍스트/JSON 형태로 직접 넣습니다.
또는, 도구 호출 기록(Function Call history) 자체를 대화 기록에 그대로 보존하여 자연스럽게 전달하는 방법도 있습니다.
4. 데이터 양은 얼마나 넣어야 하는가?
책 전체 내용을 다 넣을 수 없듯, 필요한 핵심만 추출해야 합니다.
요약 + 상세 조회 도구: Bullet 요약만 보여주고, 더 필요한 부분은 details('section 5')처럼 함수를 호출해 펼쳐보게(Unfurl) 만듭니다.
RAG(검색) 활용: 큰 데이터는 전통적인 RAG 방식을 통해 필요한 부분만 검색해서 주입합니다.
5. 이전 대화 기록은 얼마나 과거까지 유지할 것인가?
주제가 바꼈거나 일정 시간 반응이 없으면(Timeout) 과거 대화를 잘라냅니다.
작은 모델을 별도로 학습시켜 관련 있는 과거 대화만 골라내도록 선별할 수도 있습니다.
8-4. 대화형 에이전트 구축
8.4.2 사용자 경험
왜 이 이름들이 나왔는지 딱 3초 요약
Dave(데이브) & HAL(할): 영화 《2001 스페이스 오디세이》에 나오는 사람(Dave)과 우주선 AI(HAL)입니다. 영화에서 AI가 고장 나서 사람을 우주선에 안 들여보내주는 유명한 장면이 있습니다.
McCoy(맥코이): 영화 《스타트렉》에 나오는 의사 캐릭터 이름입니다.
아무튼, 사용자를, 데이브, 맥코이로 사용자가 변경했을때, 결과가 달라진다.라는걸 보여주는것 이다.
즉, "AI가 함부로 사고 치지 않게 UI로 안전장치를 만들어라"
위험한 작업은 꼭 승인받기
AI가 결제, 예약, 데이터 삭제처럼 실제 돈이나 시스템을 건드리는 작업을 할 때는 실행 전 사용자에게 [승인 / 취소] 팝업을 띄워 확인을 받아야 합니다.
AI가 보고 있는 화면 보여주기
AI가 내 화면의 어떤 문서나 데이터를 읽고 답변 중인지 사용자가 볼 수 있게 해줘야 합니다.
AI가 엉뚱한 문서를 참고하고 있으면 사용자가 해당 문서를 닫아서 대화가 딴길로 새는 걸 막을 수 있습니다.
완성 결과이든 대화의 응답이든 그 결과가 어떻게 나타나는지 확인하며, 불필요한 레이턴시나 혼란스러운 세부 사항 같은 문제를 피하면서 명확하고 효과적인 해결책을 보장하기 위해 우리가 이 출력을 어떤 형태로 만들고 싶은지 다룬다.
LLM의 답변은 서문, 핵심 답변, 후기로 나뉘며, 필요한 부분의 시작과 끝을 명확히 하면 답변을 쉽게 추출하고 불필요한 생성을 줄일 수 있다.
LLM 응답 결과 (구성)
7.1.1 서문
서문 : 결과 콘텍스트에서 생성된 텍스트 초반부로, 핵심 내용이 나오기 전 배경을 설정해주는 부분
# 예시 새로운 일을 시작할 때는 누구나 막막함을 느낍니다. → 주제 제시: 새로운 일을 시작할 때의 어려움 오늘은 제가 직접 시도하며 배운 작은 실천 방법들을 나누려 합니다. → 글의 목적·내용 소개: 무엇을 이야기할지 알려줌 이 글이 여러분의 첫걸음에 도움이 되길 바랍니다. → 글을 쓰는 의도: 독자에게 어떤 도움이 되길 원하는지 제시
텍스트의 낭비로 보는 측면도 있지만, 필요한 경우도 있으니 이율배반적이라 표현하기도 한다.
서문의 세가지 유형 정리
1. 구조적 상용구(structural boilerplate)
출력 형식을 유도하는 고정 문구는 모델이 생성하게 하기보다 프롬프트에 미리 넣는 편이 효율적이다.
# 구조적 상용구 예시 > 결과가 어떤 구조로 나와야 하는지 뼈대를 미리 만들어 놓은 것. 다음 구조에 맞춰 제품 리뷰를 작성하세요. ## 제품 소개 {제품에 대한 간단한 소개} ## 장점 {장점} ## 단점 {단점} ## 총평 {최종 평가}
2. 추론형 서문
바로 답하게 하기보다 문제를 작은 단계로 나누고 조건을 차례로 검증하게 하면 오류를 줄이고 정확도를 높일 수 있다.
추론은 정답을 장황하게 꾸미는 설명이 아니라, 답을 내기 전에 문제와 조건을 점검하는 과정이다.
CoT 프롬프트는 이러한 단계적 추론을 유도하며,
이때 생성되는 추론 서문은 길더라도 단순한 군더더기가 아니라, 복잡한 문제의 정확도를 높이는 유용한 과정일 수 있다.
# 추론형 서문 예씨 다음 조건을 모두 만족하는 동물을 찾아라.1. 새끼를 낳는다.2. 다리가 네 개이다.3. 검고 흰 줄무늬가 있다.4. 말과 비슷하게 생겼다. 각 조건을 확인한 뒤 정답을 제시하라.정답: 얼룩말
3. 무의미한 서문(fluff preamble)
없어도 정답을 이해하는 데 문제가 없는 앞부분을 뜻함
RLHF로 학습된 모델은 무의미한 서문을 포함할 가능성이 높다.
▶ RLHF 모델은 사람들이 선호하는 친절하고 안전한 답변을 생성하려다 보니, 핵심 답변 앞뒤에 쿠션어·부연·주의사항을 덧붙이는 경향이 있음.
# 예시 1.질문: 프랑스의 수도는 어디인가?2. 무의미한 서문이 포함된 답변 좋은 질문이다. 프랑스는 역사와 문화가 풍부한 나라이다. 질문에 답하자면 프랑스의 수도는 파리이다.3. 간결한 답변 : 프랑스 수도는 파리이다.
이를 해결하기 위해 few-shot 예시를 포함한 지시문을 제공하거나 주요 답변과 추가 설명을 분리하는 프롬프트 재구성 같은 기법을 사용.
but, 그만큼 비용이 많이 듬.
7.1.2 명확한 시작부와 종료부
LLM의 응답에서 주요 답변을 추출하고 싶다면 시작과 종료를 명확하게 인식할 수 있어야한다.
LLM의 답변을 프로그램에서 사용할 때는 내용뿐 아니라 시작과 끝을 쉽게 찾을 수 있는 출력 형식을 설계해야 한다.
※ 문자열 종료부 테스트 가능 여부에 따른 의미
예 : ##, 2., 닫는 백틱처럼 특정 문자열을 찾으면 된다.
아니요 : 들여쓰기, 괄호 짝, 이스케이프 여부 등 구조를 해석해야 한다.
# 아니요 예시 -> explanation 이놈의 들여쓰기가 있나 없나 주변 문맥 구조 파악까지 해야함 answer:city: Paris country: France explanation:text:...
7.1.3 마무리 부분
질문과 관련 없는 마무리 부분(postscript)을 걸러낼 수 있어야 명확히 인식할 수 있다.
LLM 답변의 ‘식별 가능한 시작과 끝’을 설계하는 것에 대한 두 가지 고려 사항.
답변을 분석하기 위한 고려 사항 : 시작과 끝을 명확히 구분해 핵심 답변만 추출하고, 불필요한 서론과 결론을 걸러내는 것.
2. 답변 생성을 제어하기 위한 고려 사항 : 핵심 답변의 끝을 인식하는 순간 토큰 생성을 중단해 응답 시간·연산량·비용을 줄이는 것.
토큰 생성을 중단하는 두 가지 주요 방법
종료 문자열(stop sequence) : 지정한 문자열이 나오면 서버에서 생성을 즉시 중단
# 마크다운 종료 문자열 : ₩n#
2. 스트리밍 모드(streaming mode) : 토큰을 실시간으로 받아 끝을 감지한 뒤 생성을 취소
※ 스트리밍 모드는 특정 문자열 방법을 추가하여 강화 가능함.
1. 종료 문자열 개발자가 지정 \nclass \nif \ndef 2. 사용자 요청 질문: dog의 울음 소리를 출력하는 function 성생해줘.3.LLM이 답변 생성 중 classDog: def bark(self):print("멍멍") def main(): # 줄 맨 앞의 def → 여기서 생성 중단 4. 답변 반환 classDog: def bark(self):print("멍멍")
7.2 텍스트를 넘어서 : 로그 확률 (Logprobs)
로그 확률(Logprob) : 모델이 각 토큰을 얼마나 가능성 높은 선택으로 판단했는지 나타내는 값.
0에 가까울수록 확신이 높고, 더 큰 음수일수록 가능성이 낮다.
▶ 일부 상용 모델은 API 중 로그 확률을 제공하는 기능을 비활성하고 있음.
모델의 내부 동작이 과도하게 노출되어 역공학의 대상이 될 가능성이 우려되기 때문.
7.2.1 응질 품질 평가
로그 확률 : 각 토큰 선택에 대한 모델의 확신도를 나타냄.
답변 전체의 품질을 추정할 때는 토큰별 로그 확률의 평균을 활용할 수 있다.
평균값은 절대적인 품질 기준은 아니지만, 애플리케이션의 기능별 동작을 결정하는 임계값으로 활용할 수 있다.
# 기능별 동작 예시 1. 모델의 확신이 높을 때만 교정 결과를 보여줘라.2. 모델이 평소보다 불확실해하는 경우 경고 메시지를 띄워라.3. 모델이 불확실해하는 경우 콘텍스트를 추가하거나 재시도해라.4. 더 나은 결과가 필요한 경우 성능이 좋으면서 비용이 더 많이 드는 LLM으로 전환해라.5. 모델이 사용자에게 도움이 필요하다는 확신이 높을 때만 개입한다. 즉, 확신이 낮으면 경고, 재시도, 추가 맥락 제공 또는 더 강력한 모델 전환을 적용할 수 있다.
7.2.2 LLM을 분류에 활용하는 방법
분류(classification) : 어떤 사례가 사전 정의된 여러 범주 중 어디에 속하는지 결정하는 기본 머신러닝 작업.
정해진 범주 내에서 모델은 정답을 고르고 그 선택에 대한 확신 정도를 평가하는 것이 핵심
▶ 프롬프트 엔지니어는 모델이 여러 대안 중 정확히 하나를 선택할 수 있도록 프롬프트를 잘 설계해야한다.
잘 설계하는 방법은 LLM에게 직접 질문 하는 것!
LLM에 긍정·부정·중립처럼 고정된 선택지 중 하나를 고르게 하는 것.
모델의 응답에서 최대한 애매모호한 답변은 피하며 어떤 범주가 등장했는지 파악한다.
추가로, 보다 정제된 형태로 질문하는 것이 좋다.
# 형식 지정 또는 구조화된 출력 지시 이 문장은 긍정, 부정, 중립인가? 다음 형식으로 답해라.1.[부정 | 긍정 | 중립]> # 명확한 시작 지점 2.[설명] 명확한 시작 지점인 '1'번만 보면 해당 질문의 분류 결과를 알 수 있따. 명확한 시작 지점 :LLM 답변에서 실제 답이 어디서 시작하는지 프로그램이 쉽게 찾을 수 있도록 만든 표시
보정(calibration) : 분류 결과에 대한 확신도를 실제 기준에 더 가깝게 맞추는 작업
사전 예측의 확신도는 로그 확률이며, 모델은 로그 확률이 가장 높은 토큰을 생성함.
모델의 분류 기준이 서비스 기준과 다르면 logprob에 상수를 더해 판단 임계점을 조정한다.
# 보정 예시 이메일을 차단하는 애플리케이션이 있고, 분류를 통해 예, 아니요의 로그 확률 차이를 기반으로하여 차단을 진행한다. 차단 기준 : 로그 확률이 0에 가까운 값을 기준 예:-0.5아니요:-0.3 but, 너무 많은 차단이 있어났을 경우, 보정을 통하여 차단 조건을 지정 차단 조건 : 아니요의 로그 확률이 예의 로그 확률보다 0.3 이상 높을 때 위의 예는 0.2 이므로 차단 하지 않음 즉, 보정은 로그 확률에 기준값을 적용해 모델의 분류 기준을 실제 사용 목적에 맞추는 과정.
7.2.3 프롬프트 내 핵심 지점
프롬프트의 logprob를 확인하면 오타나 모델이 예상하지 못한 표현을 찾을 수 있다.
echo 파라미터를 true로 설정 했을 시, 프롬프트에 대한 로그 확률을 반환한다(대부분의 API)
응답 토큰을 전혀 생성하지 않고, 사용자가 모델에 전송한 텍스트를 더 잘 이해할 수 있다.
매우 낮은 값은 문장에서 낯설거나 정보 밀도가 높은 지점을 나타낼 수 있다.
정상 단어인 completion 대신 오타인 complution이 등장하자, 모델은 이를 예상하기 어려운 표현으로 판단한다.
그 결과 해당 부분의 로그 확률이 -13 미만으로 크게 낮아져 눈에 띄게 나타난다.
즉, 모델에게 직접 “오타를 찾아라”라고 질문하지 않아도, 로그 확률이 비정상적으로 낮은 지점을 확인해 오타나 특이한 표현의 위치를 찾을 수 있다.
7.3 모델 선택
모델은 특정 순위보다 애플리케이션의 요구사항을 기준으로 선택해야 한다.
주요 선택 기준
지능: 복잡한 추론과 정확한 답변 능력이다.
속도: 응답을 기다리는 시간이다.
비용: API 또는 GPU 사용 비용이다.
사용 편의성: 배포·운영·캐싱 등의 부담이다.
기능성: 채팅, 도구 사용, 이미지 처리, logprob 지원 여부이다.
특수 요건: 오픈소스, 데이터 위치, 보안, 라이선스 등의 조건이다.
일반적으로 작업을 안정적으로 수행할 수 있는 가장 작은 모델을 선택한다.
단순하고 요청량이 많으면 작은 모델이 적합하고, 요청량이 적지만 난도가 높다면 고성능 모델이 유리하다.
다음 순서로 모델을 선택한다.
서비스 제공자를 선택한다.
필요한 기능을 제공하는 모델을 추린다.
작업을 안정적으로 수행하는 가장 작은 모델을 선택한다.
오픈 모델을 직접 호스팅하면 통제 범위가 넓지만 많은 운영 노력이 필요하다.
애플리케이션 규모가 충분히 크거나 데이터·라이선스 조건상 상용 서비스가 부적합할 때 고려하는 편이 좋다.
모델 교체 가능성도 고려해야 한다. 특정 모델 API를 코드 전체에 고정하기보다 여러 모델을 같은 방식으로 호출할 수 있는 구조를 사용해야 한다.
파인튜닝 : 기존 모델에 각자의 애플리케이션 용도에 맞게 직접 학습시키는 것
정확하고 성공적인 상호작용 사례를 학습 자료로 준비해야 함.
예시 데이터 수집 여부에 따라 파인튜닝을 할 가치가 있는지 여부를 결정하는데 큰 핵심 기준이 된다.
파인튜닝을 해야하는지 확인하는 다이어그램
Loss masking : 모델을 학습할 때, 특정 토큰의 실수는 손실값(loss) 계산에서 제외하는 방법이다.
모든 파인튜닝에서 필수인 것은 아니고, 학습 목적에 따라 달라진다.(대화형 모델의 지도 파인튜닝 등등)
# Loss masking 예시 사용자: 대한민국의 수도는 어디인가? → 읽고 참고하지만 손실 계산 제외 모델: 대한민국의 수도는 서울이다. → 손실을 계산해 학습 즉, 질문은 조건으로 참고하되, 그대로 따라 출력하도록 학습하지 않는 것
학습 문서를 얼마나 확보하는냐에 따라 파인튜닝 방식이 달라진다.
1. 전체 파인튜닝 and 지속적인 사전 학습
모든 파라미터를 조정해 새로운 지식이나 분야를 학습시킨다. 수만 개의 문서와 많은 시간·연산 자원이 필요하다.
2. LoRA(low-rank adaptation)
일부 파라미터의 차이만 학습하는 효율적인 방식이다. 새로운 지식보다는 형식, 스타일, 정보 해석법, 분야별 선호도를 익히는 데 적합하다.
3. 소프트 프롬프팅
원하는 출력을 만드는 모델 내부 상태를 학습한다. 적은 자료와 짧은 시간이 들지만 모든 모델 환경에서 지원되지는 않는다.
파인튜닝 유형
파인튜닝된 모델에선 빨간 모자 원칙이 다르게 적용된다.
※ 빨간 모자 원칙 : LLM이 프롬프트를 보고 “이 문서는 앞으로 어떤 형태로 이어질 것인가?”를 예측해, 익숙한 경로를 따라간다는 의미
파인튜닝으로 학습된 모델은 두 가지 경로가 만들어짐.
1. 기존 경로: 원래 사전 학습에서 익힌 형식과 행동
2. 새로운 경로: 파인튜닝 데이터로 새롭게 익힌 형식과 행동
따라서 파인튜닝을 했더라도 프롬프트가 기존 학습 문서와 비슷하면 모델은 기존 행동으로 돌아갈 수 있다(파인튜닝 효과 악화시킴).
그렇기에, 변형된 빨간 모자 원칙을 적용해야한다.
프롬프트는 파인튜닝에서 사용한 문서의 시작처럼 보이게 구성해야한다.
절대 기존 학습에 사용된 문서처럼 보이지 않도록 주의해야 한다.
# 파인튜닝 예시 리뷰: 배송이 빠르고 제품의 품질도 좋다.판정: 긍정 리뷰: 포장이 훼손된 상태로 도착했다.판정: 부정 즉, 리뷰 입력이 있으면,판정: 다음에 긍정 또는 부정 값이 들어오도록 학습 # 파인튜닝 경로를 따르는 프롬프트 리뷰: 배송이 빠르고 제품의 품질도 좋다.판정: # 모델 답변 → 정해진 입력 형식에 따라 특정 형식으로 답변한다. 긍정 # 기존 학습 경로를 따르는 프롬프트 가격은 비싸지만 성능은 만족스럽다는 리뷰를 읽고, 고객의 감정과 평가를 자세히 설명해 줘. # 기존 학습된 답변 → 일반적인 질문에 자연어로 자세히 답변한다. 고객은 제품 가격에는 부담을 느끼고 있지만, 성능에 대해서는 전반적으로 만족하고 있다. 따라서 긍정과 부정이 함께 나타나는 복합적인 평가로 볼 수 있다.
즉, 프롬프트의 모양이 어느 학습 패턴과 더 닮았는가에 따라 모델의 답변 방식이 달라질 수 있다
7.4 요약
모델을 길들이려면 답변의 시작과 끝을 통제하고, logprob로 확신과 이상 지점을 분석하며, 목적에 맞는 모델을 선택해야 한다.
전처리·후처리에서는 Gemini Flash 같은 빠른 LLM으로 질문 작성과 요약을 처리하고, Jev로 정보 충족 여부나 다음 행동을 판단한다. 디자인 추천·설계·코드 생성처럼 결과물의 품질이 중요한 핵심 단계에는 고성능 프론티어 모델을 사용한다. 이를 통해 품질을 유지하면서 전체 처리 시간과 비용을 줄이는 것을 목표로 한다.
너희에게 추천하는 순서는 이거야.
지금: DeepEval + 일반 코드 검사 ASK/READY는 기대값과 비교하고, 추가 질문의 적절성은 평가 기준으로 채점해.
여러 모델을 연결한 뒤: 필요하면 Langfuse 추가 Flash 단독과 Jev + Flash 중 무엇이 더 정확하고 빠른지 비교해.
두 도구를 함께 쓰는 공식 가이드도 있어서, 나중에 DeepEval의 평가 점수를 Langfuse에 기록할 수 있어. 처음부터 둘 다 구축할 필요는 없어.
네 Python 프로그램이 이 요청을 받아 인자를 검증하고, 실제 검색 함수를 실행하고, 결과를 모델에 돌려줘. 모델은 그 결과를 바탕으로 답변을 만드는 거야.
Spring으로 비유하면 모델은 호출할 Service와 인자를 제안하고, 실제 실행 권한과 검증은 애플리케이션에 남아 있는 구조야.
1-2. 가장 먼저 막히는 것은 Vector DB보다 영화 데이터야
다음 질문부터 해결해야 해.
영화 제목·줄거리·장르·러닝타임은 어디서 가져올까?
한국어 제목과 원제가 다른 영화를 어떻게 같은 작품으로 인식할까?
동일 제목의 리메이크는 어떻게 구분할까?
한국에서 현재 볼 수 있는 OTT 정보가 있을까?
영화 정보 조회와 실제 대여·예매가 가능한 API는 같은가?
예를 들어 아래 데이터는 서로 성격이 달라.
데이터특성
관리
방법
제목·개봉연도·감독
상대적으로 안정적
영화 기본 테이블
줄거리·주제·분위기
의미 검색에 유용
텍스트와 임베딩
OTT 제공 여부
국가·시점별로 변경
조회 시점과 출처 저장
대여 가격·상영 시간·좌석
빠르게 변경
구매 직전에 재조회
사용자가 본 영화
개인별 데이터
사용자별 별도 저장
영화 정보를 제공하는 API가 있다고 해서 그 서비스에서 영화를 구매할 수 있는 것은 아니야.
TMDB 같은 데이터 제공처를 사용한다면 사용 목적에 따른 라이선스와 표시 의무도 확인해야 해. 공식 FAQ는 비상업적 사용과 상업적 사용을 구분하고 있어. developer.themoviedb.org
첫 실습은 권한이 확인된 영화 데이터 수십~수백 건만 있어도 충분해. 최신 OTT 여부는 아직 확인하지 않는다고 범위를 정해도 돼.
1-3. Vector DB는 무엇이고 왜 필요한가
일반 검색은 정확한 조건에 강해.
SELECT *
FROM movies
WHERE runtime_minutes <= 120
AND release_year >= 2010;
하지만 다음 요청은 SQL 조건으로 바로 바꾸기 어렵지.
“퇴근하고 편하게 볼 수 있는데, 보고 나면 조금 따뜻해지는 영화.”
이런 문장의 의미를 숫자 배열로 바꾸는 것이 임베딩이야.
cf)
1. 토큰 (Token)
개념: LLM이 문장을 이해하기 위해 텍스트를 쪼개는 최소한의 단위입니다.
역할: 컴퓨터는 글자 그대로를 이해하지 못하기 때문에, 각 토큰에 번호(ID)를 붙여서 처리합니다. (예: "안녕"이라는 단어가 토큰 ID 105번 식인 것과 같습니다.)
핵심: 텍스트를 쪼개는 물리적 단위에 가깝습니다.
2. 임베딩 (Embedding)
개념: 토큰화된 단어들이나 문장 전체를 수백~수천 차원의 숫자(좌표)로 변환하는 것입니다.
역할: 의미가 비슷한 단어들이나 문장끼리는 숫자 공간상에서 서로 가까운 위치에 모이도록 만들어 줍니다.
예를 들어, "따뜻한 커피"와 "아이스 라떼"는 의미가 비슷하므로 임베딩 공간에서 서로 가까운 좌표 값을 가집니다.
핵심: 텍스트가 가진 '의미와 맥락'을 수학적 공간에 배치하는 과정입니다.
영화 소개도 숫자 배열로 바꾸고 사용자 요청도 같은 임베딩 모델로 바꿔서, 서로 가까운 영화를 찾는 거지. Vector DB는 이런 벡터를 저장하고 검색하는 데 도움을 줘.
단, 벡터 유사도는 사용자가 좋아할 확률도 아니고, 조건을 만족한다는 보증도 아니야.
“슬프지 않은 가족 영화”를 검색했는데 가족의 죽음을 다룬 영화가 나올 수 있어. 의미적으로는 가족·감정이라는 주제가 비슷하기 때문이야.
그래서 다음 조합이 필요해.
요청 요소
처리 방법
“따뜻하고 잔잔한”
의미 검색
“120분 이하”
숫자 필터
“이미 본 영화 제외”
사용자 이력 필터
“봉준호 감독”
감독 ID 또는 정확한 이름 검색
“한국에서 시청 가능”
지역별 제공 정보 확인
“폭력적인 장면은 싫어”
신뢰할 수 있는 콘텐츠 정보 확인, 불확실하면 표시
이렇게 의미 검색과 정확한 조건 검색을 결합해야 해.
PostgreSQL에 pgvector를 붙이면 기존 관계형 데이터와 벡터를 함께 다룰 수 있어. 처음에는 정확 검색으로 시작하고, 데이터가 커졌을 때 근사 검색 인덱스를 검토하면 돼. 근사 검색에서는 필터와 인덱스 설정에 따라 후보가 충분히 안 나오는 문제도 살펴봐야 해. GitHub
1-4. 벡터 검색에서 실제로 생기는 문제
문제발생
이유
처음 적용할 해결책
엉뚱한 영화가 나옴
줄거리는 비슷하지만 취향은 다름
검색 후 별도 순위 조정
특정 제목 검색이 약함
의미 검색이 정확한 제목 매칭을 대체하지 못함
제목·별칭 검색 병행
같은 영화가 여러 번 나옴
리뷰나 줄거리를 여러 조각으로 저장
영화 ID 기준 중복 제거
한국어 검색 품질이 떨어짐
모델·데이터의 언어 특성
한국어 질의 평가셋으로 비교
모델 변경 후 품질 이상
기존 벡터와 새 벡터의 공간이 다름
임베딩 버전 관리와 재생성
검색 결과가 오래됨
원본만 수정하고 벡터를 갱신하지 않음
원본 변경 시 재임베딩
결과는 비슷하지만 단조로움
비슷한 작품만 상위에 모임
장르·감독·시대 다양성 고려
영화 한 편의 설명이 짧다면 일단 영화 한 편을 검색 단위 하나로 만드는 것을 권해. 긴 문서 RAG에서 쓰는 청킹을 처음부터 그대로 적용할 필요는 없어.
또 “힐링”, “우울함”, “잔인함” 같은 태그를 LLM으로 생성한다면 원본 사실과 구분해야 해. 자동 생성 태그가 틀릴 수도 있으니까.
1-5. 검색과 추천은 다르다
검색은 후보를 찾는 일, 추천은 후보 중 누구에게 무엇을 먼저 보여줄지 정하는 일이야.
예를 들어 비슷한 영화 30편을 찾았더라도 다음을 고려해 최종 3편을 골라야 해.
사용자가 본 영화인지
사용자의 선호 장르와 맞는지
요청한 러닝타임을 만족하는지
비슷한 감독의 작품만 몰려 있지는 않은지
추천 이유를 실제 데이터로 설명할 수 있는지
초기에는 학습형 추천 모델까지 만들 필요 없어.
조건 필터 → 의미 검색 → 간단한 점수 정렬 → LLM의 설명 작성만으로도 배울 것이 충분해.
LLM이 최종 후보를 고르게 한다면 반환된 영화 ID가 실제 후보 안에 있는지 코드로 확인해. 후보에 없는 영화를 새로 만들어내지 못하도록 하는 거야.
첫 실습의 완료 기준
요청에서 조건을 뽑아 실제 DB에 있는 영화 3편을 추천하고, 조건에 맞는 작품이 없으면 없다고 말한다.
2. 결제 Agent 구현 시 문제점: x402를 중심으로
2-1. 먼저 무엇을 결제할지 구분해야 해
영화추천 서비스에서는 적어도 세 가지가 가능해.
결제 대상
예시
필요한 연동
추천 서비스 자체
프리미엄 추천 리포트 구매
네 서비스의 과금·접근 권한
외부 유료 데이터
상세 영화 분석 API 호출
해당 API의 결제 방식
실제 영화 이용
영화 대여·구매·극장 예매
판매처의 주문·재고·결제 API
x402 실습에는 유료 API나 유료 리포트 접근이 가장 직접적이야.
실제 영화 예매까지 가려면 상영 정보, 좌석 확보, 주문 취소, 티켓 발급 같은 별도의 업무가 필요해. x402를 붙였다고 이 기능들이 생기는 것은 아니야.
cf)
영화 추천 실습용 무료 데이터 (가장 추천)
TMDB API (The Movie Database):
영화 제목, 줄거리, 포스터, 장르, 평점 등을 무료로 제공하는 대표적인 오픈 API입니다.
회원가입만 하면 테스트용으로 충분하고도 남을 만큼의 영화 데이터(줄거리 포함)를 가져올 수 있어서, 영화 추천 시스템이나 의미 검색(Vector DB) 실습용으로 전 세계 개발자들이 가장 많이 씁니다.
Kaggle (캐글)의 영화 데이터셋:
Kaggle에 들어가서 movies dataset이나 Netflix movies 등으로 검색하면, 전 세계 개발자들이 미리 정제해 둔 CSV 파일 형태의 영화 데이터(줄거리, 감독, 배우 등)를 무료로 다운로드할 수 있습니다. 이걸 그대로 파이썬으로 읽어서 벡터 DB에 넣어보면 실습용으로 완벽합니다.
2-2. 스테이블코인과 x402는 같은 것이 아니다
스테이블코인: 특정 자산의 가치에 연동되도록 설계된 토큰.
스테이블코인 결제: 해당 토큰을 이용해 대금을 지급하는 방식.
x402: 유료 자원을 요청할 때 결제 조건과 결제 정보를 주고받는 프로토콜.
비유하면 스테이블코인은 지불 수단, x402는 서비스 이용과 결제를 연결하는 약속에 가까워.
또 x402는 AI 없이 일반 프로그램에서도 사용할 수 있어. Agent는 어떤 유료 기능이 필요한지 판단하는 쪽이고, x402는 그 기능에 접근하기 위한 결제 교환을 담당해.
2-3. x402의 기본 흐름
유료 영화 분석 API를 예로 들면 다음과 같아.
클라이언트가 분석 API를 요청한다.
서버가 402 Payment Required와 결제 조건을 반환한다.
클라이언트가 가격·수취인·네트워크·자산을 확인한다.
허용된 조건이면 지갑 측에서 결제용 서명 데이터를 만든다.
결제 정보를 첨부해 요청한다.
서버가 검증·정산을 수행하고 결과를 반환한다.
HTTP v2 규격에는 결제 조건·서명·결과를 전달하는 PAYMENT-REQUIRED, PAYMENT-SIGNATURE, PAYMENT-RESPONSE 헤더가 정의되어 있어. 검증과 정산은 facilitator라는 보조 서비스를 이용할 수 있어. 서명 검증 성공과 실제 정산 성공은 구분해야 해.GitHub
cf)
요약하자면:x402는 특정 회사의 유료 프로그램이 아니라 "웹에서 AI가 돈을 내고 데이터를 사게 만드는 공통 규칙"이며, 이걸 지원하는 오픈소스 라이브러리를 가져다 서버에 붙이거나, 이미 x402를 지원하는 외부 API(주식 데이터, 날씨, 통계 등)를 골라서 내 AI 에이전트가 호출해 쓰게 되는 구조입니다.
2-4. 결제 Agent의 핵심은 말솜씨보다 실행 통제야
다음처럼 모델이 결제 조건을 자유롭게 정하게 만들면 위험해.
“좋아 보이는 서비스니까 이 주소로 적당한 금액을 보내.”
권장 구조는 역할을 나누는 거야.
역할
담당
유료 기능이 필요한지 판단
LLM 또는 업무 로직
판매처의 견적 조회
도구·서버
금액·네트워크·수취인 검증
코드
사용자 승인 확인
인증된 애플리케이션
서명 생성
지갑·서명 서비스
결제 상태 확인
결제 서비스
결과 설명
LLM
개인키는 프롬프트·대화 기록·그래프 상태에 넣지 않아. 모델은 필요한 작업을 요청하고, 서명 서비스가 승인 범위 안에서 실행하도록 만들어야 해.
2-5. 반드시 처리해야 하는 실패 상황
① 중복 결제
결제 요청을 보냈는데 응답이 끊겼다고 해보자.
실제로 결제되지 않았을 수도 있고,
결제는 됐는데 응답만 유실됐을 수도 있어.
여기서 새 결제를 보내면 두 번 결제될 수 있어.
필요한 개념은 멱등성이야.
같은 업무 요청이 반복되어도 결제 효과는 한 번만 발생하도록 설계한다.
주문 ID와 결제 의도를 저장하고, 재요청에서는 기존 상태를 확인해야 해. x402나 블록체인의 재사용 방지 기능만으로 네 서비스의 모든 중복 주문 문제가 해결되지는 않아.
② 결제 성공 후 결과 제공 실패
돈은 냈는데 리포트 생성이 실패할 수 있어.
이 경우 결제 상태와 결과 제공 상태를 분리해야 해.
결제: 정산 완료
결과: 생성 실패
후속 처리: 같은 주문으로 결과 생성 재시도
단순히 결제부터 다시 실행하면 안 돼.
③ 승인한 조건이 바뀜
사용자가 0.01 USDC를 승인했는데 재조회한 견적이 0.02 USDC가 되면?
기존 승인은 새 견적에 자동 적용하면 안 돼. 승인을 견적 ID·금액·자산·수취인·유효기간에 묶어야 해.
④ 잘못된 자산·네트워크
같은 토큰 이름이라도 네트워크나 컨트랙트가 다를 수 있어.
"USDC"라는 문자열만 확인하지 말고, 지원하는 네트워크와 자산 식별자를 검증해야 해. 금액은 부동소수점 대신 정수 최소 단위나 정확한 소수 자료형을 사용해.
⑤ 응답 대기 중 취소
취소 요청이 왔어도 이미 정산됐을 수 있어.
“작업 취소”와 “돈 되돌리기”는 다른 작업이야. 이미 정산된 지급은 별도의 환불 흐름이 필요해.
첫 실습의 완료 기준
모의 결제에서 승인 없는 요청·예산 초과 요청을 차단하고, 같은 주문을 두 번 요청해도 한 번만 처리한다.
A2A는 서로 독립된 Agent가 능력을 알리고, 작업을 위임하고, 진행 상황과 결과를 교환하는 표준이야. 다른 프레임워크·팀·서비스 사이의 연동에 의미가 커져. 공식 문서에서는 Agent Card, Message, Task, Artifact 같은 개념을 정의해. A2A Protocol
A2A 개념
쉬운 설명
프로젝트 예시
Agent Card
제공 기능과 접속·인증 정보
“이 Agent는 결제 견적·상태 조회를 지원”
Message
서로 주고받는 입력
특정 주문의 결제 요청
Task
상태를 추적하는 작업
승인 대기 → 처리 → 완료
Artifact
작업 결과물
구조화된 처리 결과·영수증 정보
cf)
결제 기능이 정해진 검증·서명·조회만 한다면, 처음에는 LLM이 없는 결제 서비스여도 돼. “결제 Agent”라는 이름 때문에 모델을 하나 더 넣을 필요는 없어.
3-2. MCP·A2A·x402는 서로 다른 축이다
질문
해당 기술
“영화 검색 도구를 어떻게 연결하지?”
MCP 또는 직접 함수/API
“다른 Agent에게 일을 어떻게 맡기지?”
A2A
“유료 API 비용을 어떻게 지불하지?”
x402
“우리 애플리케이션의 작업 순서는?”
LangGraph
A2A 요청 안에 결제 관련 업무 데이터를 넣을 수는 있지만, A2A가 결제 규칙·사용자 승인·환불 정책을 대신 만들어주지는 않아.
결제 서비스는 approval_id를 받아 서버에 저장된 승인 기록을 직접 검증해야 해. 추천 Agent가 보낸 "approved": true만 믿으면 안 돼.
사용자 신원과 권한도 인증된 요청 문맥에서 확인해야지, 모델이 만들어낸 user_id를 그대로 신뢰하면 안 돼.
cf)
내가 조종하거나 내 서비스를 총괄하는 '메인 AI(오케스트레이터/주인공 에이전트)'가 있고, 그 AI가 직접 처리하기 어려운 전문적인 일(예: 결제, 외부 데이터 조회 등)이 생겼을 때 다른 역할을 하는 전문 AI 에이전트에게 일을 시키거나 요청(API 호출)을 보내는 구조가 바로 A2A(Agent-to-Agent) 통신입니다.
3-4. 연동 시 주요 문제
문제
실제 상황
대응
권한 위임
추천 기능이 다른 사용자의 지갑을 사용
사용자·호출 서비스·승인 범위 검증
중복 작업
네트워크 재시도로 같은 결제 Task 생성
주문 단위 멱등성
상태 불일치
A2A 작업 완료, 결제는 미정산
작업 상태와 결제 상태 별도 확인
무한 위임
추천 A와 결제 A가 계속 서로 호출
위임 횟수·시간·비용 제한
오류 전파
한 Agent의 추측을 다른 Agent가 사실로 사용
출처·구조화 데이터·검증
버전 불일치
금액 필드의 단위가 서로 다름
스키마·프로토콜 버전 고정
취소 경쟁
취소와 정산이 동시에 발생
현재 결제 상태 기준 처리
추적 단절
어느 추천에서 결제가 시작됐는지 모름
요청·Task·주문·결제 ID 연결
영화 ID, A2A Task ID, 주문 ID, 결제 거래 ID는 서로 다른 역할을 해. 하나로 뭉치지 않는 게 좋아.
추천 결과에서 결제로 넘어가는 구조는 이렇게 생각하면 돼.
A2A는 이 그림에서 독립된 추천 Agent와 결제 Agent 사이의 통신 방식으로 선택할 수 있어.
4. Eval과 OpenInference
둘은 함께 쓰지만 목적이 달라.
Eval: 잘했는가? OpenInference 기반 추적: 어떤 과정을 거쳤는가?
4-1. Eval은 AI 애플리케이션의 평가 체계야
기존 테스트에서는 보통 정답이 명확하지.
assert add(2, 3) == 5
하지만 “따뜻한 영화 3편 추천”에는 유일한 정답이 없어.
그래서 평가를 나눠야 해.
평가 대상
확인할 내용
방법
조건 해석
“2시간 이하”를 120분으로 해석했나
정답 필드 비교
검색
적절한 후보를 찾아왔나
관련도 라벨·검색 지표
추천
후보 중 요청에 잘 맞는 작품을 골랐나
사람·평가 모델
사실성
제목·연도·설명을 지어내지 않았나
DB·출처 대조
도구 사용
불필요한 검색·결제를 반복하지 않나
실행 기록 검사
결제
승인·예산·멱등성을 지켰나
코드 기반 테스트
운영
응답 시간과 비용이 적절한가
측정값
평가에는 규칙 기반 검사, 사람 평가, LLM 평가 등을 조합할 수 있고, 개발 중 고정 데이터셋으로 하는 오프라인 평가와 운영 중 평가를 구분할 수 있어. Docs by LangChain
4-2. 추천 평가를 구체적으로 만드는 방법
처음에는 다음처럼 다양한 요청 20~30개를 직접 만들어봐.
요청
평가 기준
“90분 이하 영화 3편”
추천작 모두 러닝타임 조건 만족
“이미 본 영화는 빼줘”
시청 이력과 중복 없음
“조건에 맞는 영화가 없으면 알려줘”
후보를 꾸며내지 않음
“한국어 제목으로 찾아줘”
원제·한국 제목을 같은 작품으로 연결
“이번에는 좀 더 밝은 걸로”
이전 요청을 적절히 수정
“결제하지 말고 가격만 알려줘”
견적 조회만 수행
검색 지표도 차근차근 배우면 돼.(아래는 추천 시스템이나 검색 엔진의 성능을 평가할때 쓰는 대표적인 평가지표 3가지 이다.)
Precision@K: 상위 K개 중 관련 있는 영화의 비율.
Recall@K: 평가셋에서 관련 있다고 표시한 영화 중 상위 K개에서 찾은 비율.
NDCG@K: 관련성이 높은 영화가 앞에 배치됐는지 평가.
추천은 관련 영화의 정답 목록을 완벽하게 만들기 어렵기 때문에, 작은 데이터셋에서는 조건 준수율과 사람의 선호 비교부터 시작해도 좋아.
4-3. LLM 평가도 틀릴 수 있다
다른 LLM에게 “추천 잘했는지 채점해줘”라고 하면 편하지만 다음 문제가 있어.
긴 설명을 좋은 답변으로 착각.
영화에 대한 자체 지식이 틀림.
같은 답변의 점수가 달라짐.
평가 대상 답변 속 지시문에 영향받음.
따라서 이렇게 분리해.
러닝타임·영화 ID·결제 금액: 코드로 검사.
취향 적합성·설명 이해도: 구체적인 기준으로 사람 또는 LLM 평가.
결제 승인·중복 결제: 결제 상태와 실행 기록으로 검사.
“전체적으로 8점”보다 어떤 조건을 위반했는지가 개선에 더 도움이 돼.
그리고 프롬프트를 개선할 때 사용한 문제와 최종 검증 문제를 일부 분리해야 해. 평가 문제에만 잘 맞추는 상황을 피하려는 거야.
4-4. OpenInference는 실행 기록에 공통 의미를 붙인다
OpenInference는 OpenTelemetry 기반으로 AI 애플리케이션의 실행을 기록하기 위한 의미 규약과 계측 도구를 제공해. 추적 데이터는 호환되는 관측 백엔드로 보낼 수 있어. 자체적으로 추천을 평가하거나 모델을 실행하는 엔진은 아니야.openinference
기본 용어는 두 개부터 알면 돼.
Trace: 사용자 요청 한 건의 전체 실행 흐름.
Span: 그 안의 개별 작업 하나.
예를 들어 추천 응답이 8초 걸렸다면 다음을 볼 수 있어.
작업 예시
소요 시간
알 수 있는 것
조건 추출 LLM
0.8초
모델 호출이 느린가
영화 검색
0.1초
검색 DB에 문제가 있는가
외부 제공처 조회
4.0초
외부 API가 병목인가
추천 설명 생성
3.1초
답변 생성 시간이 큰가
이 기록을 Eval과 연결하면:
“추천 점수가 낮다” → “검색 후보가 부적절했다” → “임베딩 입력에서 분위기 정보가 빠졌다”
처럼 원인을 좁힐 수 있어.
다만 기록되는 것은 호출·입출력·측정 가능한 실행 정보이지, 모델 내부 생각을 완전히 들여다보는 것이 아니야.
또 개인키·인증 토큰·민감한 사용자 정보는 기록하지 않도록 마스킹해야 해. 결제의 최종 원장은 관측 로그가 아니라 결제 DB와 실제 정산 기록이어야 해.
cf)
OpenInference는 한 마디로 "AI 애플리케이션(LLM, 에이전트 등)의 내부 동작을 투명하게 들여다보기 위한 표준 규격(공통 언어)"입니다.
개발자들이 AI 앱을 만들 때, AI가 왜 이런 답변을 냈는지, 어떤 툴을 호출했고, 어떤 문서를 검색(RAG)했는지 추적(Tracing)하고 모니터링해야 하는데, 이를 통일된 방식으로 기록할 수 있게 만든 오픈소스 표준입니다.
1. 왜 이런 게 필요할까요? (문제점)
일반 웹 서버는 에러가 나면 로그가 깔끔하게 남지만, LLM 기반 AI 앱은 속이 너무 복잡합니다.
유저가 질문 ➔ 프롬프트 가공 ➔ 벡터 DB 검색(RAG) ➔ LLM 호출 ➔ 툴(Tool) 사용 ➔ 최종 답변의 복잡한 과정을 거치는데, 각 프레임워크(LangChain, LlamaIndex 등)마다 로그를 남기는 방식이 다 달랐습니다.
이걸 하나의 공통된 규격으로 깔끔하게 기록할 수 있게 만든 것이 바로 OpenInference입니다.
2. 무엇을 기록하나요? (추적 단위)
오픈소스 표준에 따라 AI가 일하는 과정을 다음과 같은 단위로 쪼개서(Trace/Span) 기록합니다:
LLM 호출: 모델에 입력된 프롬프트, 토큰 사용량, 출력 결과
Retriever (검색기): 벡터 DB나 검색 엔진에서 어떤 문서를 찾아왔는지
Tool (도구): 외부 API나 함수를 어떻게 호출하고 실행했는지
Agent (에이전트): 자율 에이전트가 어떤 생각의 흐름(Reasoning)으로 단계를 거쳤는지
5. LangGraph: loop, 핵심 철학, LangChain과의 관계
5-1. 핵심 철학은 ‘상태를 가진 실행 흐름을 명시적으로 관리한다’야
Spring에서 요청 하나가 여러 Service를 호출하는 경우를 생각해봐.
Agent는 여기에 다음 상황이 추가돼.
검색 결과가 부족해 다시 검색.
사용자에게 추가 질문.
결제 승인까지 실행 중단.
서버 재시작 후 작업 재개.
외부 API 실패 후 일부 단계 재시도.
LangGraph는 이런 흐름을 State·Node·Edge로 표현해. 각 Node는 LLM 호출일 수도 있고 일반 Python 함수일 수도 있어. Docs by LangChain
구성 요소
의미
영화추천 예시
State
현재 작업의 데이터
취향·후보·선택 영화·재시도 횟수
Node
작업을 수행하는 함수
조건 추출·검색·검증·추천
Edge
다음 실행 위치
검색 후 검증
Conditional edge
조건에 따른 분기
후보 부족이면 재검색
Reducer
State 갱신을 합치는 규칙
메시지 누적·검색 결과 병합
Checkpointer
실행 상태 저장
중단한 작업 재개
Interrupt
외부 입력까지 실행 중단
사용자 승인 대기
모든 Node에 LLM을 넣는 게 아니야. 숫자 비교, 권한 확인, 결제 상태 전이는 일반 코드가 더 적합해.
5-2. Loop는 모델을 다시 학습시키는 과정이 아니다
Agent loop는 대략 다음과 같아.
모델 호출 → 도구 실행 요청 → 도구 실행 → 결과를 모델에 제공 → 다음 행동 판단.
예를 들어:
“90분 이하의 잔잔한 영화”를 검색.
후보가 한 편만 나옴.
표현을 바꿔 추가 검색.
충분한 후보를 찾음.
추천 작성 후 종료.
여기서 모델의 가중치가 바뀌는 게 아니라, 새로 얻은 결과를 문맥에 추가해서 다시 호출하는 것이야.
주의할 점은 Agent가 검색에 실패했다고 사용자의 필수 조건을 멋대로 바꾸면 안 된다는 것이야.
“90분 이하”를 “120분 이하”로 바꾸는 것은 검색 표현 수정이 아니라 사용자 조건 변경이야.
5-3. Loop에는 종료 조건이 있어야 해
처음부터 다음을 명시하는 게 좋아.
검색 재시도 최대 횟수.
전체 도구 호출 횟수.
요청 전체 시간 제한.
모델 사용 비용 한도.
같은 인자 반복 호출 감지.
조건을 만족하지 못했을 때의 종료 응답.
LangGraph의 실행 단계 제한도 활용할 수 있지만, 프레임워크 제한과 업무상 재검색 횟수는 별도로 관리하는 게 이해하기 쉬워.
또 다음 두 재시도는 구분해야 해.
기술적 재시도: API 일시 오류 → 같은 요청 재시도.
업무적 재시도: 후보 부족 → 검색 표현이나 검색 방법 변경.
결제 요청에서는 기술적 재시도조차 상태 조회와 멱등성 설계가 먼저야.
5-4. State는 대화 기록만 뜻하지 않는다
다음은 설계 예시야.
처음에는 이렇게 단순하게 시작하고, 이후 필드별 타입과 상태값을 구체화하면 돼.
특히 세 가지 저장소를 구분해야 해.
저장 대상
예시
역할
실행 상태
현재 후보·현재 단계
진행 중 작업 재개
장기 사용자 정보
선호 장르·본 영화
다음 대화에서도 활용
업무 원장
주문·승인·결제 결과
거래의 정확성 유지
그래프 체크포인트가 결제 원장을 대신하지는 않아.
LangGraph의 persistence는 작업 상태 보존·재개를 지원하고, interrupt는 외부 입력을 기다리는 흐름을 지원해. 재개 과정에서는 Node 일부가 다시 실행될 수 있으므로, 외부 효과가 있는 작업은 재실행을 고려해 설계해야 해. Docs by LangChain
5-5. LangChain과 LangGraph는 경쟁 제품인가?
둘은 역할과 추상화 수준이 달라.
LangChain: 모델·도구 등 공통 인터페이스와 Agent 구성을 편리하게 제공.
LangGraph: 실행 상태·분기·반복·중단·재개를 직접 설계하는 실행 기반.
현재 LangChain의 Agent 구성은 LangGraph 기반 실행 기능을 활용해. 따라서 “LangChain은 직선 실행만 되고 LangGraph만 Agent를 만들 수 있다”는 설명은 부정확해. 공식 문서도 LangChain의 Agent 구성과 LangGraph의 저수준 오케스트레이션을 구분하고 있어. Docs by LangChain
함께 활용하는 대표 구성은 다음과 같아.
구성
쓰임
메시지 타입
사용자·모델·도구 결과 전달
모델 인터페이스
모델 호출·도구 연결
도구 추상화
함수 이름·설명·입력 스키마 정의
Runnable 실행 규약
invoke, ainvoke, stream 방식 활용
모델 제공사 연동 패키지
특정 모델 API 연결
Retriever·Vector store 연동
그래프 안의 검색 Node에서 활용
보통 langchain-core의 공통 추상화와 제공사별 패키지를 함께 쓰지만, LangGraph Node 안에서 모델 제공사의 SDK나 일반 함수를 직접 호출하는 것도 가능해.
6. 이외에 추가로 공부해야 하는 것
네 목록에 다음 내용이 들어가면 실제 구현까지 훨씬 잘 이어져.
추가 주제
필요한 이유
최소 학습 범위
구조화 출력·스키마 검증
자연어를 실행 가능한 데이터로 변환
JSON Schema·Pydantic·허용값 검증
Tool calling 실행 구조
모델 요청과 실제 실행의 경계
도구 선언·인자 검증·결과 반환
데이터 수집·갱신
추천 품질의 기반
영화 ID·중복·출처·업데이트
인증·인가
누구의 데이터를 보고 돈을 쓰는가
로그인·사용자 격리·권한
프롬프트 인젝션
영화 설명·외부 응답에 악성 지시 가능
외부 텍스트를 명령으로 취급하지 않기
상태 머신·멱등성
결제 실패·재시도 처리
상태 전이·중복 방지·정합성 복구
비동기 처리·타임아웃
여러 외부 API를 기다려야 함
async/await·제한된 병렬 호출
비용·캐시
Agent loop가 비용을 증폭
요청별 예산·캐시 만료·호출 수
사용자 기억 관리
취향 변화·이전 대화 처리
이번 요청과 장기 취향 구분
버전 관리
변경 원인과 품질 비교
모델·프롬프트·임베딩·SDK 버전
특히 “프롬프트에 하지 말라고 써두기”와 “코드로 실행을 막기”는 다르다는 점을 기억하면 좋아.
결제 승인, 권한, 금액 제한은 코드로 강제해야 해.
7. 너에게 권하는 학습·구현 순서
아래는 고정 일정이 아니라, 각 단계의 결과를 확인하고 넘어가는 순서야.
순서
학습·구현할 것
완료 기준
1
영화 데이터 + 검색 함수
영화 ID·조건으로 정확하게 검색
2
구조화 출력 + tool calling
자연어 요청으로 검색 도구 실행
3
기본 Eval + 실행 로그
조건 누락·허구 영화 검출
4
임베딩·벡터 검색
분위기 검색이 기존 검색보다 개선됐는지 비교
5
LangGraph
검색·검증·제한된 재검색 구현
6
OpenInference
모델·검색·도구의 지연과 실패 추적
7
모의 결제 서비스
승인·예산·중복 방지 검증
8
x402 테스트넷 실습
결제 요구 → 검증 → 정산 → 결과 제공
9
A2A 연동
별도 Agent에 작업 위임·상태 조회·실패 복구
첫 번째 구현 범위는 “영화 데이터 100건 정도에서, 취향과 러닝타임을 반영해 3편을 추천하는 Python 프로그램”으로 잡는 게 좋아.
PyCharm에서 시작하고, 검색 함수·조건 검증·추천 설명을 먼저 연결해. 이후 같은 기능을 LangGraph로 옮기면 왜 State와 loop가 필요한지 직접 체감할 수 있어.
결제는 그다음에 **“유료 영화 분석 리포트 하나를 모의 구매한다”**로 붙이면, 실제 극장 예매 인프라 없이도 승인·x402·A2A·실패 복구를 단계적으로 공부할 수 있어.
펀드는 여러 투자자의 돈을 모아서, 미리 정해 놓은 투자 규칙에 따라 운용하고, 그 결과인 수익과 손실을 투자자들이 나눠 갖는 투자기구야.
그리고 주식투자자에게 가장 먼저 알려주고 싶은 사실이 있어.
ETF도 펀드야. 따라서 ETF에 투자하는 사람은 이미 펀드투자자이기도 해.
1. 펀드를 산다는 건 정확히 무엇을 사는 걸까?
네가 삼성전자 주식을 사면 삼성전자라는 기업의 지분을 갖게 되지.
반면 주식형 펀드를 사면 그 펀드가 보유한 투자자산 전체에 대한 몫을 갖게 돼. 법적 형태에 따라 수익증권이나 주식 등으로 표시되지만, 처음에는 ‘공동 투자 바구니에 대한 내 몫’으로 이해하면 충분해.
예를 들어 100명이 각각 100만 원을 넣었다고 하자.
모인 돈: 1억 원
펀드가 투자한 자산: 삼성전자, 현대차, 여러 해외주식과 현금
네 투자금: 100만 원
처음 네 몫: 전체의 1%
그 뒤 투자자들의 추가 가입이나 환매가 없다고 가정해 보자.
펀드 전체의 순자산
네 몫의 평가금액
손익
1억 원
100만 원
0
1억 2,000만 원
120만 원
+20만 원
8,000만 원
80만 원
-20만 원
돈을 굴리는 사람은 매니저지만, 투자 결과는 네 것이야.일반적인 투자손실을 매니저가 자기 돈으로 메워주지는 않아.
다만 투자손실과 별개로, 사기·불완전판매·운용 의무 위반 등은 책임 문제가 생길 수 있어.
미국 SEC의 투자자 교육자료도 펀드 지분을 공동 포트폴리오와 그 소득에 대한 투자자의 몫으로 설명해.
2. 펀드매니저에게 정말 돈을 직접 맡기는 걸까?
일반적인 펀드는 매니저 개인 계좌에 돈을 보내는 구조가 아니야. 여러 기관이 역할을 나눠.
참여자
하는 일
쉽게 이해하면
투자자
돈을 투자하고 손익을 부담
너
판매회사
펀드 가입·환매 창구, 상품 설명
은행·증권사 등
자산운용회사
투자전략을 정하고 자산을 운용
투자 판단을 맡는 회사
펀드매니저
운용회사 안에서 종목·비중 등을 결정
실제 포트폴리오 책임자
수탁회사
펀드재산 보관·관리, 운용 지시 집행·감시 등
자산을 보관하는 기관
일반사무관리회사
기준가격 계산 등 사무처리
회계·계산 담당
세부 구조는 펀드마다 다르지만, 운용과 자산 보관을 분리하는 것이 중요한 원칙이야.
여기서 흔한 오해 두 가지를 바로잡자.
첫째, 은행에서 가입했다고 예금이 되는 건 아니야.
은행이 판매창구일 뿐, 네 돈은 주식이나 채권 등에 투자될 수 있어. 일반적인 투자펀드는 예금처럼 원금을 보장받는 상품이 아니야.
둘째, 운용회사와 펀드 자체는 구분해야 해.
운용회사의 사업이 어려워졌다는 것과 펀드가 보유한 주식·채권의 가치가 사라졌다는 것은 다른 사건이야. 다만 재산이 별도로 보관된다고 해서 투자손실이나 모든 운영상 위험이 없어지는 것은 아니고.
주식투자와 연결하면 이렇게 생각하면 돼.
증권사에서 주식을 샀다고 그 증권사에 투자한 것이 아닌 것처럼, 특정 운용사의 펀드를 샀다고 그 운용회사 자체에 투자한 것은 아니야.
3. 펀드매니저는 마음대로 투자할 수 있을까?
보통은 못 해. 펀드마다 투자설명서와 규약에 정해진 운용 범위가 있어.
예를 들어 ‘국내 주식에 주로 투자하는 펀드’를 운용한다면, 매니저가 갑자기 미국 부동산에 대부분의 돈을 투자하기는 어려워.
규칙에는 이런 내용이 들어가.
어떤 자산에 투자하는가?
어느 국가와 업종에 투자하는가?
특정 종목에 얼마나 집중할 수 있는가?
현금을 어느 정도 보유할 수 있는가?
파생상품이나 차입을 사용할 수 있는가?
투자자가 언제 돈을 돌려받을 수 있는가?
그래서 이런 일이 생길 수 있어.
“매니저가 주식시장이 떨어질 것 같다고 생각하는데, 왜 주식을 다 팔고 현금으로 안 바꾸지?”
해당 펀드가 주식 비중을 일정 수준 이상 유지해야 하거나, 주식시장에 계속 투자하는 상품으로 설계됐기 때문일 수 있어.
투자자는 그 펀드를 통해 주식시장에 투자하려고 가입했는데, 매니저가 마음대로 현금 상품으로 바꿔버리는 것도 문제겠지.
펀드를 고른다는 것은 사람뿐 아니라 그 사람이 따라야 하는 규칙도 고르는 일이야.
4. 펀드 종류가 헷갈리는 이유: 분류 기준이 서로 다르기 때문이야.
‘주식형 펀드, 사모펀드, 인덱스펀드, ETF, 헤지펀드’가 모두 같은 기준으로 나뉜 이름 같지만, 실제로는 그렇지 않아.
분류 기준
질문
대표적인 구분
투자 대상
무엇에 투자하는가?
주식형·채권형·혼합형·부동산 등
모집 방식
누구에게 투자금을 모으는가?
공모·사모
운용 방식
어떻게 투자하는가?
액티브·패시브
거래 방식
어디서 어떻게 사고파는가?
거래소 상장 ETF·일반 가입형 펀드 등
환매 구조
펀드에 돈을 돌려달라고 할 수 있는가?
개방형·폐쇄형
투자전략
어떤 방식으로 수익을 추구하는가?
가치주·성장주·롱숏·매크로 등
한 펀드는 여러 설명을 동시에 가질 수 있어.
“일반 투자자를 대상으로 모집하고, 미국 주식에 투자하며, 특정 지수를 따라가고, 거래소에서 거래되는 펀드”
이 펀드는 동시에 공모펀드·주식형 펀드·인덱스펀드·ETF인 거야.
‘투자펀드’는 대체로 이런 투자기구를 넓게 부르는 말이고, 헤지펀드와 서로 대등한 하나의 세부 종류라고 생각할 필요는 없어.
5. 무엇에 투자하느냐에 따라 위험이 달라져.
펀드는 일종의 그릇이야. 그릇 안에 무엇을 담았는지가 위험을 크게 결정해.
종류
주로 담는 자산
수익의 주요 원천
주의할 위험
주식형
기업의 주식
주가 상승, 배당
시장 하락, 기업 실적 악화
채권형
국채·회사채 등
이자, 채권가격 상승
금리 상승, 부도, 신용 악화
혼합형
주식과 채권 등
여러 자산의 수익
자산배분 실패, 동반 하락
MMF
단기 금융상품
단기 이자수익
신용·유동성 위험, 원금손실 가능성
부동산
건물·부동산 관련 자산 등
임대료, 매각차익
공실, 차입 부담, 매각 지연
인프라
도로·발전소 등 관련 자산
사업 현금흐름
사업·정책·금리 위험
재간접
다른 펀드
편입 펀드들의 투자성과
중첩 비용, 실제 투자내용 파악의 어려움
주식투자자는 여기서 두 가지를 기억하면 좋아.
① 종목 수가 많다고 무조건 안전한 것은 아니야.
반도체 기업 30개에 투자하는 펀드는 한 기업의 사고에는 덜 취약할 수 있어. 하지만 반도체 업황 전체가 꺾이면 함께 떨어질 수 있지.
② 채권형 펀드는 예금이 아니야.
채권가격이 떨어지면 펀드가격도 내려갈 수 있어. 특히 일반적인 채권형 펀드는 채권을 계속 교체하기 때문에, 개별 채권처럼 “내가 정한 만기까지 기다리면 정해진 액면금액을 받는다”는 구조와 달라.
만기매칭형 상품도 있지만, 그 경우에도 원금보장 여부는 별도로 봐야 해.
6. 액티브펀드와 패시브펀드: 매니저의 판단을 살까, 정해진 규칙을 살까?
액티브펀드는 매니저가 종목과 비중을 적극적으로 판단해 운용하는 펀드야.
예를 들면:
“반도체 중에서는 A가 저평가돼 있고, B는 기대가 과하다. A를 더 사고 B는 줄이겠다.”
판단에는 기업 분석, 경기 전망, 밸류에이션, 산업 변화 등이 들어갈 수 있어.
패시브펀드는 정해진 지수 등을 추종하는 데 초점을 맞춰.
예를 들면:
“S&P 500 지수의 움직임을 최대한 가깝게 따라가겠다.”
여기서 인덱스펀드는 특정 지수를 추종하는 펀드야. 지수 구성종목을 모두 보유하거나, 일부를 표본으로 선택하거나, 다른 수단을 활용할 수 있어. 비용과 운용 방식 때문에 지수 수익률과 완전히 같지는 않을 수 있고.
구분
액티브펀드
패시브·인덱스펀드
핵심
매니저의 판단
지수 등 정해진 규칙 추종
주된 평가 질문
목표에 맞게 좋은 성과를 냈나?
목표 지수를 충실하게 따라갔나?
비용
상대적으로 높은 경우가 많음
상대적으로 낮은 경우가 많음
주요 위험
판단 실패, 스타일 변화
추종 시장 자체의 하락
투자자가 이해할 것
운용 철학과 매니저
지수 구성과 편입 규칙
패시브라고 안전한 것은 아니야.
위험한 시장이나 특정 업종을 추종하면 그 위험을 그대로 갖게 돼.
또한 패시브 운용에도 전문성이 필요해. 지수 변경을 반영하고, 거래비용을 줄이고, 현금과 배당을 관리해야 하거든.
7. 펀드와 ETF는 무엇이 다를까?
정확히 말하면 일반 가입형 펀드와 ETF를 비교하는 것이야. ETF 자체가 펀드니까.
ETF는 Exchange-Traded Fund, 즉 거래소에서 거래되는 펀드야.
항목
일반적인 가입형 공모펀드
ETF
매수 방법
은행·증권사 등에서 가입 신청
주식처럼 거래소에서 매수
거래가격
약관에 따른 기준가격
장중 시장가격
매도·회수
환매 신청
거래소에서 매도
장중 지정가 주문
일반적으로 불가능
가능
운용 방식
액티브·패시브 모두 가능
액티브·패시브 모두 가능
추가 확인 사항
환매 일정, 클래스별 비용
괴리율, 호가 차이, 거래비용
일반 펀드는 신청 시점에 최종 적용가격을 확정해서 알지 못하는 경우가 많아. 해외자산에 투자하는 펀드는 기준가격 적용과 대금 지급까지 시간이 더 걸릴 수 있고.
ETF는 장중 시장가격으로 거래하지만, 매도했다고 현금을 즉시 출금할 수 있는지는 별도의 결제 일정에 달려 있어.
여기서 꼭 구분해.
인덱스는 운용 방식이고, ETF는 거래 방식이야.
그래서 인덱스펀드 중 ETF가 아닌 것도 있고, ETF 중 액티브로 운용하는 것도 있어.
8. 기준가격과 NAV: 펀드의 ‘한 몫’은 얼마일까?
주식에 주가가 있듯이, 펀드에는 기준가격이 있어.
먼저 **순자산가치(NAV)**를 이해하자.
순자산가치 = 펀드가 가진 자산의 가치 − 펀드가 부담하는 부채
이걸 투자자들이 가진 전체 몫의 수로 나누면 단위당 가치가 돼.
국내 일반 펀드는 보통 1,000좌당 기준가격을 표시해. ‘좌’는 펀드의 몫을 세는 단위라고 보면 돼.
가령 기준가격이 1,000원인 펀드에 100만 원을 투자하면, 비용을 무시할 때 100만 좌를 취득해.
그 뒤 기준가격이 1,100원이 되면:
기준가격이 900원이 되면 90만 원이고.
기준가격이 낮다고 싼 펀드는 아니야.
펀드 A의 기준가격이 800원이고 B가 2,000원이라고 해서 A가 더 저평가됐다고 볼 수 없어.
설정 시점, 과거 성과, 분배금 지급 등이 다르기 때문이야. 투자 매력은 실제 편입자산과 가격, 전략을 봐야 판단할 수 있어.
또 하나 중요한 점이 있어.
신규 투자자가 들어온다고 기존 투자자의 수익이 자동으로 희석되지는 않아.
예를 들어 순자산이 100억 원인 펀드에 누군가 10억 원을 넣으면, 펀드 자산이 늘어나는 동시에 그에 해당하는 좌수가 새로 생겨. 적정 기준가격으로 처리된다면 기존 투자자의 몫의 가치가 이유 없이 줄어들지는 않아.
다만 실제 운용에서는 자금 유출입에 따른 거래비용 등이 영향을 줄 수 있지.
9. ETF에는 가격이 두 개 있다는 점이 중요해.
ETF에는 크게 두 가지 가격 개념이 있어.
순자산가치: 안에 든 자산을 계산한 한 주의 가치
시장가격: 거래소에서 실제로 사고파는 가격
가령 ETF 한 주에 해당하는 자산가치가 10,000원인데, 시장에서는 10,200원에 거래될 수 있어.
이 경우 순자산가치보다 2% 비싼 가격이야.
이를 프리미엄, 반대로 더 싸게 거래되는 경우를 디스카운트라고 해. 이 차이를 비율로 나타내는 것이 괴리율이야. ETF 시장가격은 순자산가치보다 높거나 낮을 수 있어.
주식투자자에게 유용한 구분은 다음과 같아.
용어
비교하는 것
의미
괴리율
ETF 시장가격과 순자산가치
안의 자산에 비해 비싸거나 싸게 거래되는 정도
추적차이
일정 기간 펀드 수익률과 지수 수익률
결과적으로 얼마나 차이 났는가
추적오차
펀드와 지수 간 수익률 차이의 변동성
지수를 얼마나 일관되게 따라가는가
호가 스프레드
최우선 매도호가와 매수호가
사고팔 때 부담하는 거래상 간격
ETF 가격을 순자산가치에 가깝게 만드는 데에는 대규모 설정·환매를 수행하는 지정참가회사(AP)와 시장의 차익거래가 역할을 해.
다만 해외시장 휴장, 시차, 급변장 등에서는 괴리가 커질 수 있어. 화면에 표시된 순자산가치가 최신 시장 상황을 충분히 반영하지 못할 수도 있으니, 숫자만 보고 무조건 ‘싸다’고 판단하면 안 돼.
10. 공모펀드와 사모펀드: 무엇에 투자하는지보다 돈을 어떻게 모으는지의 차이야.
공모펀드는 일반 대중을 대상으로 투자금을 모집하는 펀드야.
사모펀드는 법이 정한 범위의 제한된 투자자들을 대상으로 사적으로 자금을 모집하는 펀드야. 투자자 자격, 인원, 최소 투자금 등의 조건은 국가와 펀드 유형에 따라 달라.
구분
공모펀드
사모펀드
투자자 접근
일반 대중에게 비교적 열려 있음
투자자 범위·자격 등에 제한
정보 제공
표준화된 공시·설명 체계
공개 정보가 상대적으로 제한적일 수 있음
투자전략
상품별 규제와 운용 제한 적용
상대적으로 유연한 전략 가능
자금 회수
상품별로 다르며 환매 가능한 상품이 많음
장기 제한이나 특정 기간 환매 가능 구조가 많음
핵심 확인
투자 대상, 비용, 운용성과
위 내용에 더해 계약 조건·유동성·평가 방식
사모라고 무조건 좋은 펀드도, 무조건 위험한 펀드도 아니야.
공모·사모는 일차적으로 모집 구조의 구분이지, 성적표나 위험등급이 아니거든.
한국은 2021년 제도개편에서 사모펀드 체계를 일반 사모펀드와 기관전용 사모펀드로 재편했어. 예전 자료에 나오는 ‘전문투자형·경영참여형’ 구분과 현재 체계를 혼동하지 않는 게 좋아. 여기서 ‘일반’이라는 단어가 누구나 소액으로 가입할 수 있다는 뜻은 아니야.
11. 헤지펀드란 무엇일까?
헤지펀드는 보통 제한된 투자자에게 돈을 모아, 공매도·레버리지·파생상품 등 다양한 수단과 전략을 활용하는 사적 투자펀드를 말해.
전통적인 주식형 펀드보다 운용의 자유도가 큰 경우가 많아. 다만 ‘헤지펀드’가 전 세계에서 완전히 동일한 법적 상품 유형을 뜻하는 것은 아니야.
이름의 **헤지(Hedge)**는 위험을 줄이거나 상쇄한다는 뜻이야.
그런데 현대의 헤지펀드는 전략이 매우 다양해서, 이름에 헤지가 붙었다고 안전하거나 손실을 방지하는 상품은 아니야. 레버리지는 손익을 확대하고, 환매 제한도 있을 수 있어.
가장 이해하기 쉬운 롱숏 전략으로 살펴보자.
**롱(Long)**은 주식을 사서 보유하는 것이야. 가격이 오르면 이익이지.
**숏(Short)**은 보통 주식을 빌려서 먼저 판 뒤, 나중에 사서 돌려주는 공매도 포지션이야. 가격이 내리면 이익을 볼 수 있어.
주식 한 주를 빌려 10만 원에 팔고, 나중에 8만 원에 사서 돌려주면 비용 전 2만 원 이익이야. 반대로 13만 원에 사서 돌려주면 3만 원 손실이지.
롱숏펀드는 이런 생각을 할 수 있어.
“반도체 업종 전체의 방향은 모르겠지만, A기업이 B기업보다 잘할 것 같다. A는 사고 B는 공매도하자.”
각각 100만 원어치 포지션을 잡았다고 해보자.
상황
A 매수 포지션 손익
B 공매도 포지션 손익
합계
A +20%, B +5%
+20만 원
-5만 원
+15만 원
A -5%, B -20%
-5만 원
+20만 원
+15만 원
A -20%, B -5%
-20만 원
+5만 원
-15만 원
두 번째 줄이 중요해.
주식시장이 내려가도, 산 종목이 공매도한 종목보다 덜 떨어지면 돈을 벌 수 있어.
반대로 세 번째처럼 상대적인 방향을 틀리면 손실이 나.
여기서 15만 원은 포지션 손익이지, 펀드 수익률이 자동으로 15%라는 뜻은 아니야. 펀드가 투입한 자기자본과 담보, 레버리지 구조에 따라 수익률 계산이 달라지고, 공매도 비용과 배당 보전 등의 비용도 있어.
12. 헤지펀드의 전략은 롱숏 하나가 아니야.
대표적인 전략을 개념적으로 보면 다음과 같아.
전략
주로 판단하는 것
예시
잘못될 수 있는 부분
주식 롱숏
기업 간 상대적 매력
저평가 기업 매수, 고평가 기업 공매도
종목 판단 실패
시장중립
시장 방향 노출을 최대한 줄이는 조합
매수·매도 포지션의 시장 민감도 조정
예상한 상쇄 관계 붕괴
글로벌 매크로
금리·환율·경기·정책
국채·통화·주가지수 포지션
거시 전망 실패
이벤트 드리븐
인수합병·분할·구조조정
인수 대상 기업 투자
거래 무산·조건 변경
상대가치
관련 자산 간 가격 차이
비슷한 채권의 가격 차이 활용
가격 차이 확대, 강제 청산
추세추종
가격 추세의 지속
여러 선물시장의 상승·하락 추세 추종
잦은 방향 전환
부실자산
회생·구조조정 후 회수 가치
어려운 기업의 채권 투자
회수율 예상 실패
핵심은 ‘언제 무엇을 맞혀야 돈을 버는가’가 전략마다 다르다는 거야.
또 순노출이 작다고 전체 위험도 작은 것은 아니야.
자기자본 100억 원으로:
150억 원어치를 매수하고
150억 원어치를 공매도했다면
단순 금액 기준 순노출은 0이지만, 총노출은 300억 원이야.
매수 종목이 10% 떨어지고 공매도 종목이 10% 오르면 각각 15억 원씩, 총 30억 원을 잃을 수 있어.
금액상 매수와 매도가 같아도 시장 민감도까지 완벽하게 상쇄되는 것은 아니고.
‘헤지했다’는 말보다 무엇을 얼마나 상쇄했는지를 봐야 해.
13. 뉴스에 나오는 ‘사모펀드가 회사를 인수했다’는 무슨 뜻일까?
여기서는 용어를 한 번 더 구분해야 해.
Private Fund: 사적으로 자금을 모집하는 펀드를 넓게 가리킴
Private Equity Fund: 기업 지분 투자, 기업가치 제고와 회수 등에 초점을 맞추는 펀드
한국 뉴스에서는 기업을 인수하는 PE펀드를 흔히 ‘사모펀드’라고 부르기 때문에, 사모펀드는 모두 기업을 사들이는 것처럼 느껴질 수 있어.
하지만 사모펀드에는 헤지펀드처럼 주식시장에서 다양한 전략을 쓰는 펀드도 있어.
전형적인 기업 인수형 PE펀드는 다음처럼 움직여.
기관투자자 등에게 투자 약정을 받는다.
투자할 기업을 찾는다.
지분을 인수한다.
경영 개선·사업 재편·성장 투자 등을 추진한다.
몇 년 뒤 매각하거나 상장하는 등의 방법으로 투자금을 회수한다.
가령 회사를 인수한 뒤 이익을 늘리고 부채를 줄여 더 높은 가치에 매각하려는 거야.
하지만 수익이 모두 경영 개선에서만 나오는 것은 아니야. 인수 가격, 매각 당시 시장의 평가, 차입 규모 등도 큰 영향을 미쳐. 차입을 활용한 인수는 잘되면 자기자본 수익률을 높이지만, 잘못되면 손실과 재무 부담도 커지고.
PE펀드는 투자 대상의 매각에 시간이 걸려 투자자의 돈이 장기간 묶일 수 있어.
함께 나오는 용어도 알아두자.
용어
뜻
GP
펀드를 이끌고 투자·운용하는 주체
LP
펀드에 출자하는 투자자
출자약정
필요할 때 정해진 한도까지 돈을 내기로 약속
캐피털콜
약정한 돈 중 실제로 필요한 금액을 납입하라는 요청
엑시트
매각·상장 등으로 투자금을 회수하는 것
VC, 즉 벤처캐피털 펀드는 초기·성장 단계의 비상장 기업에 투자하는 경우가 많아. 기업 인수형 PE와 달리 소수 지분을 투자하는 경우가 흔하고, 소수의 큰 성공이 여러 실패를 상쇄하는 구조가 나타날 수 있어. 다만 VC와 PE의 범위는 일부 겹치며, PE가 반드시 경영권 인수만 하는 것은 아니야.
14. 펀드는 언제든 돈을 뺄 수 있을까? ‘유동성’을 꼭 봐야 해.
주식을 거래해 온 사람은 “팔고 싶으면 팔면 되지”라고 생각하기 쉬워.
하지만 펀드에는 환매 조건이 있어.
개방형 펀드는 정해진 조건에 따라 펀드에 환매를 요청할 수 있는 구조야.
폐쇄형 펀드는 원칙적으로 펀드에 중도 환매를 요청할 수 없는 구조야. 다만 거래소에 상장되어 있다면 다른 투자자에게 팔 수 있는 경우가 있어.
여기서 중요한 구분은:
펀드에 돈을 돌려달라고 하는 것과, 내 지분을 다른 사람에게 파는 것은 달라.
확인해야 할 항목은 다음과 같아.
환매 신청이 가능한가?
신청 마감 시각은 언제인가?
어느 날의 기준가격이 적용되는가?
실제 지급일까지 얼마나 걸리는가?
일정 기간 환매를 제한하는 락업이 있는가?
특정 상황에서 환매를 연기하거나 제한할 수 있는가?
왜 이런 조건이 필요할까?
펀드가 건물에 투자했는데 투자자들이 내일 당장 돈을 달라고 하면, 건물을 하루 만에 제값에 팔기는 어렵겠지.
이것이 자산의 유동성과 투자자에게 약속한 환매 유동성 사이의 불일치 문제야.
잘 팔리지 않는 자산에 투자하면서 언제든 돈을 돌려줄 수 있다고 기대하게 만드는 구조는 주의 깊게 봐야 해.
좋은 자산이어도 내가 돈이 필요한 시점에 회수할 수 없으면 내게 맞지 않는 투자일 수 있어.
15. 펀드 비용은 어떻게 빠져나갈까?
펀드 비용은 단순히 “매니저에게 주는 수수료” 하나가 아니야.
비용
의미
판매수수료
가입·환매 등 특정 시점에 부과되는 판매 관련 비용
운용보수
자산을 운용하는 대가
판매보수
판매·계좌 관리 등에 대한 지속적 대가
수탁·사무관리보수
자산 보관과 계산·관리 등의 비용
매매비용
펀드 내부에서 주식 등을 사고팔며 발생하는 비용
성과보수
일정한 조건을 충족한 성과에 대해 지급하는 비용
환매수수료
특정 환매 조건에 따라 부과될 수 있는 비용
모든 펀드에 모든 항목이 있는 것은 아니야.
여기서 수수료와 보수를 구분하면 이해가 쉬워.
수수료: 특정 거래나 시점에 발생하는 비용
보수: 운용 기간에 걸쳐 지속적으로 발생하는 비용
연 보수가 1%인 펀드라면 일반적으로 펀드재산에서 기간에 걸쳐 비용이 반영돼. 매년 네 통장에서 별도로 1%를 한 번 빼가는 방식이라고만 생각하면 안 돼.
그리고 공시된 기준가격 수익률에는 통상 펀드재산에서 차감된 보수가 이미 반영돼 있어. 그 수익률에서 보수를 다시 빼면 중복 계산이 될 수 있어. 다만 개인에게 부과되는 판매수수료나 세금까지 모두 포함됐는지는 별도로 확인해야 해.
표시된 총보수만으로 모든 비용을 파악하지 못할 수도 있어. 매매비용 등 추가 비용도 투자성과를 줄일 수 있거든.
비용이 장기에 얼마나 차이를 만드는지 단순 계산해 보자.
초기 1,000만 원을 넣고, 운용 자체의 수익률이 매년 7%로 같다고 가정할게. 편의상 비용을 연 수익률에서 차감하면:
가정
비용 차감 후 연 수익률
20년 뒤 금액
연 비용 0.2%
6.8%
약 3,728만 원
연 비용 1.5%
5.5%
약 2,918만 원
약 810만 원 차이가 나.
실제 보수 차감 방식과 수익률 변동은 더 복잡하지만, 매년의 비용 차이가 복리로 누적된다는 원리는 같아.
비싼 펀드가 무조건 나쁘다는 뜻은 아니야. 그 비용을 감당하고도 더 나은 성과나 필요한 위험관리를 제공하는지가 핵심이지.
16. 펀드 이름 뒤의 A, C, e와 성과보수는 어떻게 읽을까?
같은 펀드인데 이름 끝에 A, C, A-e, C-e 같은 표시가 붙을 수 있어. 이것을 클래스라고 해.
주로 같은 투자 포트폴리오를 공유하면서 판매 경로, 가입 자격, 비용 구조가 달라지는 거야.
국내에서 흔히 보이는 방식으로는:
A 계열: 선취 판매수수료가 있고, 지속 보수는 상대적으로 낮을 수 있음
C 계열: 선취 판매수수료가 없고, 지속 보수는 상대적으로 높을 수 있음
e 표시: 온라인 가입용 클래스인 경우가 많음
다만 정확한 내용은 해당 펀드 설명서를 확인해야 해. 표기만으로 모든 상품을 단정하면 안 돼.
단순 예를 들어보자.
A: 처음 1% + 매년 0.7%
C: 처음 0% + 매년 1.2%
투자금 변동 등을 무시하면 지속 비용 차이는 연 0.5%포인트니까, 처음 낸 1%를 상쇄하는 데 약 2년이 걸려.
따라서 오래 보유할지, 짧게 보유할지에 따라 유리한 클래스가 달라질 수 있어. 실제 국내 투자설명서도 이런 비용의 교차 시점을 설명하고 있어.
헤지펀드 등에서는 운용보수와 성과보수를 함께 받는 구조가 흔해. 자주 언급되는 ‘2 and 20’은 연 운용보수 2%, 성과보수 20%를 뜻하지만, 모든 펀드가 이 조건은 아니야.
성과보수에서는 다음 두 가지가 중요해.
하이워터마크: 과거 성과보수 산정에 사용된 최고 가치 등을 기준으로, 이미 보수를 받은 성과에 중복해서 보수를 매기지 않도록 하는 장치.
예를 들어 100이 120으로 올라 성과보수를 지급한 뒤 90으로 떨어졌다가 다시 120으로 회복했다고 해보자. 해당 조건이 적용된다면 단순히 이전 고점까지 회복한 부분에 다시 성과보수를 매기는 것을 막는 취지야.
허들레이트: 성과보수를 받을 수 있는 기준 수익률.
다만 기준 초과분에만 보수를 매기는지, 기준을 넘으면 더 넓은 수익에 매기는지 등 계산 방식이 다를 수 있어.
‘성과보수 20%’라는 숫자만 보지 말고 무엇의 20%인지 봐야 해.
17. 펀드에서 돈을 벌면 분배금으로 받는 걸까?
반드시 그렇지는 않아.
펀드 안에서 주가가 오르거나 배당·이자가 들어오면 펀드의 자산가치에 반영돼. 그 돈을 계속 재투자할 수도 있고, 일부를 분배금으로 지급할 수도 있어.
여기서 주식투자자들이 특히 많이 착각해.
“분배금이 많이 나오는 펀드는 그만큼 수익률도 높은 것 아닌가?”
그렇지 않아. 분배금은 지급 방식이고, 수익률은 투자성과야.
네 펀드 평가금액이 100만 원인데 5만 원을 분배했다고 해보자. 다른 변동이 없다면:
펀드에 남은 평가금액: 95만 원
받은 현금: 5만 원
합계: 100만 원
5만 원이 새로 생긴 것이 아니야.
분배금은 자산의 배당·이자뿐 아니라 실현이익이나 자본의 반환 성격을 포함할 수도 있어. 분배금을 지급하면 다른 조건이 같을 때 그만큼 순자산가치가 낮아져.
한 번의 투자와 중간 분배금만 있는 단순한 경우라면:
예를 들어:
처음 100만 원 투자
분배금 10만 원 수령
남은 펀드 가치 85만 원
이라면 총수익률은 **-5%**야.
분배금을 10% 받았다는 말과 수익률이 10%라는 말은 전혀 달라.
18. 펀드 수익률이 10%면 잘한 것일까? 비교 기준이 있어야 해.
펀드 평가에서 중요한 단어가 벤치마크야. 성과를 판단할 때 비교하는 기준이지.
투자 성격
비교 대상으로 생각할 수 있는 것
한국 대형주 펀드
해당 시장을 잘 대표하는 한국 주가지수
미국 대형주 펀드
미국 대형주 지수
글로벌 채권 펀드
투자 범위와 환위험이 비슷한 채권지수
주식·채권 혼합형
자산배분 비중을 반영한 혼합지수
시장중립 전략
현금금리, 목표 위험수준 등 전략에 맞는 기준
가령 미국 대형주에 투자하는 펀드가 10% 올랐는데 비교지수는 20% 올랐다면, 이익은 났지만 상대적인 성과는 아쉬울 수 있어.
반대로 시장이 20% 떨어졌는데 펀드는 8%만 떨어졌다면, 절대적으로 손실이지만 상대적으로 방어를 잘했을 수 있지.
다만 벤치마크보다 잘했다고 무조건 투자자에게 적합한 것은 아니야. 네가 감당할 수 없는 손실이었다면 다른 문제니까.
관련 용어도 알아두자.
용어
쉬운 뜻
절대수익률
실제로 얼마를 벌고 잃었는가
상대수익률
비교 기준보다 얼마나 잘했는가
베타
시장이 움직일 때 얼마나 민감하게 움직이는가
알파
모형상 시장·위험요인으로 설명되는 부분을 넘는 성과
변동성
수익률이 얼마나 크게 흔들리는가
최대낙폭·MDD
관찰기간에 고점에서 저점까지 가장 크게 떨어진 폭
샤프지수
변동성 대비 현금금리 이상의 수익을 얼마나 냈는가
엄밀한 알파는 단순히 ‘펀드 수익률−지수 수익률’과 항상 같지는 않아. 시장 위험이나 다른 요인에 얼마나 노출됐는지 고려한 개념이야.
예를 들어 시장이 10% 오를 때 20% 올랐다고 해도, 사실상 위험을 두 배로 키운 결과라면 전부를 매니저 실력이라고 볼 수 없겠지.
또 연평균 수익률도 조심해야 해.
첫해 +50%, 둘째 해 -50%면:
100만 원 → 150만 원 → 75만 원
수익률의 산술평균은 0%지만, 실제 누적손실은 25%야. 투자성과를 볼 때는 누적수익률과 복리 연환산 수익률을 구분해야 해.
19. 좋은 펀드매니저는 어떻게 구분할까?
최근 1년 수익률 1등이라는 정보만으로는 부족해.
내가 펀드를 평가한다면 다음 순서로 질문할 거야.
① 무엇을 해서 수익을 냈는가?
기업을 잘 골랐는지, 특정 업종이 크게 오른 덕인지, 레버리지 때문인지 구분해야 해.
② 투자 철학이 실제 보유종목과 맞는가?
가치주 펀드라고 했는데 최근 유행하는 고평가 성장주로 가득하다면 설명이 필요하겠지. 반대로 가치주 전략이 잠시 부진하다고 무조건 잘못 운용한 것도 아니고.
③ 같은 사람이 같은 전략으로 낸 성과인가?
10년 성과가 좋아도 현재 매니저가 몇 달 전에 바뀌었다면 그대로 이어질 거라고 보기 어려워.
④ 하락장에서 어떤 일이 있었는가?
연말 수익률이 같아도 중간에 -15%까지 하락한 펀드와 -50%까지 하락한 펀드는 투자자가 겪는 경험이 달라.
⑤ 규모가 전략에 맞는가?
소형주 전략은 운용규모가 너무 커지면 원하는 종목을 사고팔기 어려워질 수 있어. 반대로 너무 작은 펀드는 운영 효율이나 지속성에 문제가 있을 수 있고.
⑥ 비용을 뺀 뒤에도 투자할 이유가 있는가?
운용 전 성과가 훌륭해도 투자자가 받는 결과가 중요하니까.
⑦ 좋은 시기만 골라 보여주는 것은 아닌가?
유리한 출발점의 수익률, 사라진 부진 펀드를 제외한 평균, 실제 운용이 아닌 백테스트를 조심해서 구분해야 해.
특히 백테스트는 과거 자료에 전략을 대입한 결과야. 실제 돈으로 운용하면서 발생하는 매매비용, 시장 충격, 행동상의 어려움까지 그대로 검증한 것은 아니지.
20. 전문가는 왜 개인투자자보다 항상 잘하지 못할까?
펀드매니저는 분석 인력, 데이터, 기업 접촉, 거래 시스템 등의 장점이 있어.
하지만 어려움도 있어.
다른 전문투자자들과 경쟁한다.
운용 규모가 커서 작은 기회를 활용하기 어렵다.
투자자들의 환매 때문에 원치 않는 시점에 팔 수 있다.
펀드 규칙 때문에 투자 비중을 자유롭게 바꾸지 못한다.
단기 성과평가와 사업상 압박을 받는다.
비용을 부담한 뒤에도 성과를 내야 한다.
가령 매니저는 어떤 기업이 싸다고 확신하는데, 투자자들이 대거 환매를 요청할 수 있어.
그러면 주식을 더 사고 싶은 시점에 오히려 팔아서 현금을 마련해야 할 수 있지.
반면 개인투자자는 생활자금과 투자금을 잘 분리했다면 기다릴 수 있어. 다른 투자자의 환매 요청도 없고, 소액이어서 매매하기 쉬운 경우도 많아.
그렇다고 개인이 무조건 유리하다는 뜻은 아니야. 개인은 정보 부족, 과도한 집중, 감정적 매매라는 어려움이 있어.
전문가의 강점과 개인의 강점이 서로 다르기 때문에, 직접투자와 펀드투자를 어떤 역할로 조합할지가 중요해.
21. 주식투자자라면 알아둘 만한 특수 펀드도 있어.
종류
핵심 아이디어
꼭 확인할 점
배당주 펀드
배당을 지급하는 기업 중심 투자
높은 배당률이 실적 악화나 주가 하락 때문인지
가치주 펀드
기업가치 대비 저렴한 주식 투자
실제 저평가인지, 사업이 악화되는 가치함정인지
성장주 펀드
높은 성장 기대 기업에 투자
성장 둔화와 높은 가격 부담
섹터·테마 펀드
특정 산업이나 변화에 집중
산업 전망이 이미 가격에 과도하게 반영됐는지
팩터 펀드
가치·퀄리티·모멘텀 등 특성을 체계적으로 선택
해당 특성이 오랫동안 부진할 가능성
TDF
목표 시점에 맞춰 자산배분을 변화
같은 목표연도라도 위험과 운용 방식이 다름
커버드콜 펀드
자산 보유와 콜옵션 매도를 결합
상승 여력 일부를 내주는 대신 프리미엄을 받는 구조
레버리지·인버스 펀드
기준 수익률의 배수·역방향 등을 추구
목표 기간과 복리 효과
커버드콜 하기전에, 풋옵션과 콜옵션을 알아야한다.
풋옵션은 팔수있는 권리, 콜옵션은 살수 있는 권리이다.
예를들어 삼성전자가 7만원에 콜옵션 1000원 권리를 샀다(3년 뒤 살수있는 권리라고 가정). 옵션의 가격을 옵션 프리미엄이라고
그러면 3년뒤 삼성전자를 7만원에 살수있는 권리이다. 물론 중간에 포기해도되며, 3년뒤 권리를 실행하지 않아도 된다. 그러면 1000원만 손해를 보는 것이다.
풋옵션은 팔수 있는 권리이다. 삼성전자가 7만원에 풋옵션 1000원 권리를 샀다.(3년뒤 팔수 있는 권리라고 가정).
그러면 3년뒤 삼성전자를 7만원에 팔수 있는 권리이다. 이것 또한 중간에 포기해도 된다.
만약 3년뒤에 삼성전자가 5만원이 갔다면, 삼성전자를 7만원에 팔수 있게된다. 그러면 앉아서 돈을 벌고, 보통 숏포지션이다.
팩터펀드는 “싸거나, 수익성이 좋거나, 최근 강한 주식을 일정 규칙으로 선별한다”처럼 이해하면 돼. 지수를 활용하더라도 그 지수 자체에 특정 투자 판단이 들어간 것이야. SEC도 비전통적 지수펀드의 구성 규칙과 복잡성을 확인하도록 설명해.
커버드콜은 옵션 프리미엄을 받지만, 그 대신 특정 조건에서 상승 이익이 제한돼. 기초자산 하락 위험은 여전히 상당 부분 남을 수 있어. 따라서 분배금이 많다는 이유만으로 예금 대용처럼 생각하면 안 돼.
레버리지에서는 기간이 중요해.
많은 레버리지 ETF는 장기 누적수익률의 배수가 아니라 일간 수익률의 배수를 목표로 해.
예를 들어 지수가:
첫날 100 → 110: +10%
둘째 날 110 → 100: 약 -9.09%
이라면 지수는 제자리야.
하지만 일간 2배 상품은 비용과 오차를 무시해도:
100 → 120
120 → 약 98.18
이 돼.
횡보·등락 과정에서도 결과가 달라질 수 있는 거야. 반대로 일정한 추세가 이어지면 누적 결과가 단순 배수보다 커지는 경우도 있어. 핵심은 장기 성과가 경로에 의존한다는 점이야.
또 ETF와 비슷하게 거래되는 ETN은 펀드가 아니라 발행회사가 수익률 지급을 약속하는 채무증권이야. 따라서 발행회사 신용위험이라는 차이도 봐야 해.
22. 해외 펀드는 투자 대상과 환율을 함께 봐야 해.
미국 주식 펀드에 투자하는 한국 투자자의 수익은 주가만으로 정해지지 않아.
환헤지를 하지 않고 다른 비용을 무시하면 대략:
미국 주식이 10% 올랐는데 달러의 원화 가치가 10% 떨어졌다면:
미국 주식이 올라도 원화 기준으로는 손실일 수 있어.
반대로 미국 주식이 10% 오르고 달러 가치도 10% 오르면 21% 수익이고.
환헤지형 펀드는 환율 영향을 줄이려는 거래를 해. 다만 헤지 비용이나 손익이 발생하고, 환위험이 완벽하게 제거되지 않을 수도 있어.
국내 상품명의 (H)는 환헤지를 나타내는 경우가 많지만 실제 헤지 대상과 비율은 설명서를 확인해야 해.
또 원화로 거래한다고 환위험이 없는 것은 아니야. 국내 거래소에서 원화로 사는 해외주식 ETF도 환율에 노출될 수 있어.
세금도 펀드 선택의 일부야. 다만 여기서는 특정 세율을 외우기보다 다음을 먼저 구분하는 게 좋아.
국내에 설정·상장된 상품인가, 해외 상품인가?
어떤 자산에서 발생한 소득인가?
매매차익인가, 분배금인가?
일반계좌인가, ISA·연금계좌 등인가?
이 조합에 따라 과세 방식과 적용 조건이 달라질 수 있으니, 실제 상품을 고를 때 해당 시점의 세후 수익을 비교해야 해.
23. 펀드를 여러 개 사면 분산투자가 잘된 걸까?
펀드 개수보다 그 안의 자산이 중요해.
예를 들어 네가 다음을 모두 샀다고 해보자.
미국 대형주 펀드
미국 성장주 펀드
글로벌 AI 펀드
미국 기술주 펀드
별도로 미국 대형 기술주 직접투자
계좌에는 상품이 여러 개지만, 실제로는 같은 기업과 같은 성장 기대에 집중할 수 있어.
가상 예시로:
A펀드에 100만 원 투자, X기업 비중 10%
B펀드에 100만 원 투자, X기업 비중 20%
X기업 직접투자 30만 원
이라면 네 X기업 노출은:
이야.
총투자금 230만 원 중 약 26%가 X기업에 연결돼 있는 셈이지.
그래서 직접투자와 펀드를 함께 보유한다면 펀드 안의 종목까지 합쳐서 내 전체 포트폴리오를 봐야 해.
분산투자는 이름표를 늘리는 일이 아니라, 손실을 일으키는 원인이 얼마나 겹치는지 줄이는 일이야.
24. 펀드는 주식시장 가격에도 영향을 줘.
펀드를 공부하면 투자상품뿐 아니라 주식시장 수급도 이해하기 쉬워져.
첫째, 환매에 따른 매도가 생길 수 있어.
기업의 실적이 그대로여도 펀드 투자자들이 돈을 빼면 매니저가 주식을 팔아야 할 수 있어.
둘째, 지수 변경에 따른 매매가 생길 수 있어.
지수를 추종하는 펀드는 편입·편출과 비중 변경을 반영해야 해. 이런 매매는 기업의 절대적인 저평가·고평가 판단만으로 이뤄지는 것이 아니야.
셋째, 자산배분 때문에 오르는 자산을 팔기도 해.
주식 60%, 채권 40%를 유지하는 펀드에서 주가가 크게 오르면, 비중을 맞추려고 주식을 일부 팔 수 있어. 기업 전망이 나빠졌다고 판단해서 파는 것과 다르지.
넷째, 헤지·차익거래 포지션의 일부일 수 있어.
어떤 기관이 A주식을 샀다는 사실만으로 강한 상승 확신을 가졌다고 단정할 수 없어. 다른 종목을 공매도하거나 선물로 위험을 상쇄한 포지션의 한쪽일 수도 있으니까.
따라서 주식투자자에게 중요한 질문은:
“기관이 샀나?”에 더해 “어떤 전략과 제약 때문에 샀나?”야.
25. 실제 펀드를 볼 때는 이 순서로 읽으면 돼.
상품명이나 최근 수익률부터 보면 눈에 띄는 숫자에 끌리기 쉬워. 나는 다음 순서로 확인하는 편을 권해.
순서
질문
볼 자료
1
이 펀드는 내게 어떤 역할을 하는가?
투자 목적, 내 보유자산
2
무엇을 사서 돈을 버는가?
투자전략, 편입자산
3
어떤 상황에서 크게 손실 나는가?
주요 위험, 집중도, 파생상품·차입
4
언제 현금으로 회수할 수 있는가?
환매·매매·결제 조건
5
총비용이 얼마나 드는가?
보수·비용·판매수수료
6
무엇과 비교해야 하는가?
벤치마크와 위험수준
7
누가 어떤 방식으로 운용하는가?
매니저, 운용 철학, 변경 이력
8
실제 성과는 어땠는가?
비용 반영 수익률, 하락장 성과
9
내 다른 투자와 얼마나 겹치는가?
종목·업종·국가·환율 노출
10
세후에도 적합한가?
상품과 계좌에 따른 세금
자료도 역할이 달라.
간이투자설명서: 핵심 구조와 위험을 먼저 파악
투자설명서·규약: 자세한 운용 범위와 조건 확인
자산운용보고서: 실제로 어떻게 운용했는지 확인
월간 보고서·팩트시트: 최근 비중과 성과 확인
ETF 상품 페이지: 지수, 보유자산, 비용, 괴리 등 확인
과거 수익률과 편입종목을 볼 때는 반드시 기준일도 확인해야 해. 자료가 뒤늦게 공개되거나 과거 비중을 보여줄 수 있거든.
26. 마지막으로 가상의 펀드 하나를 직접 해석해 보자.
다음 상품을 봤다고 가정하자.
가상 글로벌 AI 성장 주식펀드 C-e 최근 1년 수익률 +35% 총보수 연 1.4% 상위 10개 종목 비중 65% 환헤지 미실시 환매대금 지급까지 수 영업일 소요
처음 보면 “AI에 투자하고 35%나 벌었으니 좋은 펀드네”라고 생각할 수 있어.
하지만 지금까지 배운 내용으로는 이렇게 읽어야 해.
‘글로벌’ 여러 나라에 고르게 투자한다는 뜻인지는 실제 국가 비중을 봐야 해. 대부분이 한 나라에 집중될 수도 있어.
‘AI 성장’ AI 산업 성장뿐 아니라 현재 주가에 반영된 기대가 중요해. 산업이 성장해도 너무 비싸게 산 주식은 부진할 수 있어.
‘주식펀드’ 시장 하락에 상당 부분 노출될 수 있어. 매니저가 하락을 예상해도 투자 규칙상 주식을 모두 처분하지 않을 수 있고.
‘C-e’ 온라인 클래스의 비용 구조를 확인해야 해. 같은 펀드의 다른 가입 가능 클래스와 비교할 필요가 있어.
‘최근 1년 +35%’ 비교지수가 +45%였다면 상대성과는 뒤졌어. 반대로 비교지수가 +15%였다면 좋은 성과일 수 있지만, 위험을 얼마나 더 부담했는지 확인해야 해.
‘총보수 1.4%’ 최종 투자비용이 이것으로 끝나는지, 다른 비용이 있는지 봐야 해. 표시된 과거 수익률에 이미 반영된 보수를 또 차감하면 안 되고.
‘상위 10개 종목 65%’ 종목이 수십 개 있어도 실제 수익률은 몇몇 기업에 크게 좌우될 수 있어.
‘환헤지 미실시’ 외화 가치의 상승·하락이 원화 기준 성과에 영향을 줄 수 있어.
‘환매까지 수 영업일’ 오늘 보이는 수익률로 즉시 현금화된다고 생각하면 안 돼.
여기에 네가 같은 AI·기술주를 직접 보유하고 있다면, 이 펀드가 새로운 분산투자가 아니라 이미 가진 위험을 더 늘리는 투자일 수도 있어.
이 펀드에 투자할지 판단하려면 결국 이렇게 설명할 수 있어야 해.
“나는 이 펀드가 어떤 자산과 전략으로 돈을 버는지 알고, 어떤 상황에서 손실이 날지 이해하며, 그 비용과 환매 조건을 감수할 이유가 있다.”