28. 에이전트 루프와 MCP, 실패 복구
복습 음성 · 23분 18초 · 에이전트 루프와 MCP와 실패 복구 · 24장 · 파일에 1.1배속 적용
에이전트는 도구를 실행한 결과를 다음 판단의 입력으로 삼는다. 질문을 읽고 조회할 대상을 정한 뒤, 받은 정보로 계산하거나 다시 조회한다. 이 반복에서 모델이 고르는 행동과 프로그램이 실제로 실행하는 행동을 나눠 보면 각각의 역할을 이해하기 쉽다.
복습 음성은 원리와 실습에서 수행할 일을 24장으로 풀어 설명한다. 기술 용어와 코드명은 영어 발음으로 읽으며 파일에 1.1배속을 적용했다. 플레이어는 1.0배속으로 두면 된다.
경로를 정하는 시점
Workflow(워크플로)는 개발자가 작업 경로를 미리 정한다. 매월 같은 데이터를 집계해 정해진 양식의 보고서를 만드는 업무라면 조회, 계산, 작성 순서를 코드로 연결할 수 있다.
Agent loop(에이전트 루프)는 실행 중 모델이 다음 행동을 고른다. 처음 받은 질문에 무엇이 부족한지 살펴보고 도구를 요청한다. 실행 결과가 대화에 추가되면 결과를 읽고 다음 행동을 선택한다. 필요한 조회 횟수가 입력에 따라 달라지는 작업에 이 구조를 쓸 수 있다.
실습의 매출 분석 루프를 말로 풀면 다음 순서다.
- 사용자 질문과 사용할 도구 목록을 모델에 전달한다.
- 모델이 도구 이름과 인자를 반환한다.
- 프로그램이 그 도구를 실행한다.
- 요청과 실행 결과를 대화 기록에 넣는다.
- 모델을 다시 호출하고, 도구 요청 목록이 빈 응답을 받으면 답변을 반환한다.
서울과 부산의 3월 매출 합계를 묻는다면 각 지역의 수치를 조회하고 계산 도구로 더하는 경로를 확인한다. 한 응답에서 도구를 여러 개 요청할 수도 있으므로 모델 호출 수와 도구 실행 수는 따로 세야 한다.
자율성과 실행 상한
모델에게 맡기는 판단의 범위는 시스템마다 다르다. 분기만 고르게 할 수도 있고, 필요한 도구나 작업 계획까지 고르게 할 수도 있다. 개발자는 사용할 도구, 접근 권한, 실행 상한, 승인 조건을 코드에 두고 그 안에서 선택하도록 연결한다.
루프에는 반복 횟수, 누적 토큰, 경과 시간을 각각 제한하는 기준이 필요하다. 한 번의 호출이 길어지는 상황과 짧은 호출을 계속 반복하는 상황은 서로 다르다. 로컬 모델도 계산 자원을 점유하므로 요청이 길어지면 다른 사용자의 대기 시간이 늘어난다.
이번 기본 코드에는 반복 횟수 상한이 들어 있다. 토큰과 시간 상한까지 구현됐는지는 별도로 확인해야 한다. 설정값이 존재하는 것과 실행 경로에서 실제로 적용되는 것은 구분해서 읽는다.
계획과 검토와 분해
Plan and Act(계획과 실행)는 수행할 단계를 명시적으로 남긴다. 계획이 있으면 사람이 내용을 검토하고 실제 호출 경로와 비교할 수 있다. 실습 코드는 JSON(구조화 데이터)으로 만든 계획을 모델의 대화에 넣는다. 각 도구를 고정 순서로 강제하기보다는 계획을 참고해 도구를 요청하게 하는 구조에 가깝다.
Reflection(반추)은 검토 결과를 다음 시도에 반영한다. 코드를 실행한 결과, 형식 검사, 규칙 검사, 검색 근거와의 대조처럼 확인할 기준이 필요하다. 형식 검사에서 통과한 답도 사실 관계는 따로 평가한다. 같은 모델이 작성과 검토를 맡으면 두 단계가 같은 오류를 공유할 수 있다.
재귀 분해는 큰 일을 하위 과제로 나누고 필요하면 다시 나눈다. 결과를 합치는 규칙과 분해를 멈추는 조건이 함께 있어야 한다. 문서를 정해진 개수로 한 번 나누는 방식과 하위 과제의 크기에 따라 반복해서 나누는 방식도 구별한다.
도구 설명도 평가 대상이다
모델은 도구 이름과 설명, 입력 스키마를 보고 선택한다. 설명에는 도구의 기능, 사용할 상황, 비슷한 도구와의 구분 기준, 인자 예시를 적는다.
매출 조회 도구는 실제 매출액과 고객수를 확보하는 역할이다. 계산 도구는 이미 확보한 수치로 합계나 평균을 구한다. 이 구분을 설명에 넣으면 숫자가 등장하는 질문에서도 먼저 조회할지 바로 계산할지 판단할 단서가 생긴다.
실습은 12개 질문에 대해 첫 번째 도구 선택 정확도를 비교한다. 한 문제의 차이는 약 8.3%p다. 이 지표가 확인하는 범위는 최초 선택이다. 조회된 숫자의 정확성, 계산 결과, 최종 답변의 충실도는 각각 다른 평가가 필요하다.
설명을 바꿨다는 사실과 성능이 좋아졌다는 판단도 구분한다. 같은 질문과 생성 조건으로 측정한 뒤 틀린 항목을 읽어야 어떤 설명이 효과가 있었는지 볼 수 있다. 도구 개수 실험에서는 기본 목록에 무엇을 넣었는지도 기록한다. 제공된 참고 답안은 매출 도구 2개에 더미 도구를 추가한다.
MCP가 연결하는 역할
MCP(모델 컨텍스트 프로토콜)는 모델 애플리케이션과 도구 제공 서버가 통신하는 규격이다. 호스트는 사용자 요청과 모델 호출, 도구 사용 정책을 관리한다. 클라이언트는 호스트 안에서 서버와 연결하고 메시지를 교환한다. 서버는 실제 기능과 자료를 제공한다.
| 서버가 제공하는 기능 | 주된 사용 주체 | 실습에서의 역할 |
|---|---|---|
| Tool(도구) | 모델의 선택을 처리하는 호스트 | 관련 규정 검색과 장 목록 조회 |
| Resource(리소스) | 호스트 | 필요한 규정 전문을 읽어 문맥에 추가 |
| Prompt(프롬프트) | 사용자 | 규정 안내에 사용할 지시문 틀 선택 |
호스트는 받은 도구 목록에서 요청에 필요한 도구를 골라 모델에 노출한다. 리소스도 읽은 뒤 모델의 문맥에 넣는 연결이 필요하다. 목록 조회와 실제 사용을 각각 확인해야 한다.
연결을 시작할 때에는 프로토콜 버전과 Capability(지원 기능)를 확인한다. 그다음 도구 목록을 조회하고 실행한다. 구독과 변경 알림은 상대가 선언하고 구현한 기능 범위에서 사용할 수 있다.
stdio(표준 입출력 전송)는 같은 환경의 자식 프로세스와 통신하는 구성이다. 별도 서버를 여러 호스트가 공유한다면 Streamable HTTP(HTTP 기반 전송)를 사용할 수 있다. 전송 방식은 MCP 메시지가 오가는 경로를 설명하며 서버 내부의 파일 접근과 외부 통신은 따로 검토한다.
규정 검색 서버와 세션 재사용
규정 검색 서버는 문서를 장과 조항으로 나누고 조항이 있는 조각을 검색 대상으로 삼는다. 문서와 질문을 임베딩하고 정규화한 벡터의 내적으로 유사도를 계산한다. 기본 설정은 상위 2개 조항을 돌려준다. 모델은 반환된 근거로 답을 작성한다.
서버를 시작할 때에는 규정 파일과 임베딩 모델을 읽고 검색 벡터를 만든다. 호출마다 서버를 다시 시작하면 이 준비 비용이 반복된다. 연결 세션을 유지하면 준비된 서버를 재사용할 수 있다.
실습의 시간 비교는 유지된 세션을 한 번 예비 호출한 뒤 3회 평균을 측정한다. 세션 유지 방식과 재기동 방식의 초기화 비용 차이를 보는 실험이다. 속도 차이의 크기는 환경에서 측정해야 한다.
서버 파일 수정 뒤에는 기존 세션을 닫고 다시 연결한다. 살아 있는 프로세스가 읽은 코드와 파일에 저장된 코드가 같은지 확인하는 과정이다. 모델 파일을 준비하는 다운로드 단계와 준비된 파일로 검색하는 추론 단계도 나눠 살펴본다.
실패를 감지한 뒤에 복구한다
MCP 도구는 호출 결과 안에 isError: true로 실행 오류를 표시할 수 있다. 응답을 받았다는 사실만으로 성공을 판단하면 오류 문장을 정상 검색 결과로 사용할 수 있다. 실행 상태를 읽어 복구 경로로 넘겨야 한다. MCP 도구 명세는 입력 검증과 업무 규칙 오류도 이 범주로 설명한다.
| 상황 | 다음 행동 |
|---|---|
| 일시적인 서버 장애 | 기다렸다 같은 요청 재시도 |
| 인자 형식이나 허용 범위 오류 | 고칠 내용을 모델에 전달 |
| 주 검색 경로 실패 | 대체 검색이나 안내 경로 사용 |
| 같은 요청 반복 | 재실행을 제어하고 다른 접근을 안내 |
| 승인 필요한 작업 | 승인 결과에 따라 실행 또는 거절 사실 전달 |
제공된 재시도 예시는 기본 설정에서 총 3회 시도한다. 첫 실패 뒤 0.5초, 두 번째 실패 뒤 1초를 기다린다. 함수의 이름에 retry가 있어도 횟수는 실제 반복문의 범위로 읽어야 한다.
반복 감지는 도구 이름과 정렬한 인자를 묶어 센다. 같은 요청이 세 번째 나타나면 도구 실행 대신 안내를 반환한다. 그 뒤에도 모델은 다른 접근을 선택할 수 있고 전체 루프는 모델 응답이나 최대 단계 조건으로 끝난다. 도구 내부의 재시도와 모델의 반복 요청은 각각 다른 횟수다.
폴백은 임베딩 검색, 키워드 검색, 장 목록 안내처럼 대체 경로를 이어 둔다. 결과에 사용한 단계를 표시하면 어느 품질 수준의 답을 받았는지 알 수 있다. 이 경로가 동작하려면 앞 단계의 실패부터 정확히 감지해야 한다.
코드에서 따로 확인한 부분
검토 함수는 JSON 해석 실패를 pass=True로 반환한다. 검토 결과를 읽는 데 성공했는지와 답변이 기준을 통과했는지 구분할 필요가 있다. 수정 반복의 마지막 답변이 새 검토를 거쳤는지도 확인한다.
로컬 경로는 온도 0을 전달하면 그리디 생성으로 진행한다. 원격 경로는 그때 온도 항목을 요청에서 생략하므로 서버의 기본 설정을 확인해야 한다. 두 백엔드에서 비교 조건이 같다고 판단하려면 실제 요청과 서버 설정을 대조해야 한다.
보고서 도구와 삭제 도구는 실습에서 완료 문자열을 반환하는 모의 함수다. 문자열을 받은 결과와 실제 파일 생성이나 데이터 삭제가 일어난 결과는 구별한다. 이번 공부 정리는 코드를 읽어 확인한 동작을 설명하며 모델과 MCP 서버를 새로 실행한 성능 결과를 포함하지 않는다.
권한과 자료의 신뢰
도구의 Annotation(주석)은 읽기 전용이나 파괴적 동작 같은 성질을 알려주는 힌트다. 서버가 붙인 설명이므로 실제 동작과 서버의 신뢰 수준을 함께 검토한다. 모델에 도구가 노출되는 단계와 실제 실행 권한을 부여하는 단계도 구분한다.
Roots(작업 범위)는 서버에 관련 파일 경로를 알려준다. 접근 제한은 경로 검증과 파일 권한, 격리 환경 등으로 실제로 적용해야 한다. Roots 명세도 서버가 범위를 존중하고 경로를 검증하도록 안내한다.
문서 내용과 도구 설명은 모델의 문맥에 들어간다. 자료 안의 문장을 업무 지시와 구분해 다루고 서버에는 호출에 필요한 정보만 전달한다. 권한 확인과 호출 기록을 함께 두면 어떤 요청이 어떤 기능을 실행했는지 추적할 수 있다.
전문 서비스의 도구와 사용 지시문을 가져와 호스트의 모델이 판단하게 하는 설계도 있다. Microsoft의 사례는 서비스 경계를 유지하면서 모델 실행 위치를 조정하는 방식을 다룬다. 이때 필요한 지시문을 고르는 과정과 문맥 사용량도 관리해야 한다.
실습과 마무리 과제
기본 실습에서는 매출 루프, 도구 설명 비교, 계획을 넣은 실행, 규정 검색 MCP 연결과 복구를 확인한다. 심화 트랙은 반추, 도구 개수, 사람 승인, 리소스와 프롬프트, 폴백 중 2개를 선택한다.
마무리 과제는 업무 영역 하나를 정하고 도구 3개 이상을 가진 MCP 서버를 만드는 것이다. 최소 한 도구는 실패 상황을 재현할 수 있어야 한다. 자율 루프나 계획 실행을 선택해 이유를 적고 복구 장치를 최소 2가지 적용한다.
평가 질문은 정상 6개와 실패를 유발하는 4개로 만든다. 도구 선택과 근거, 복구 과정, 종료 이유를 기록한다. 리포트에는 도구 설명 수정 전후의 실제 결과, 실패에서 복구로 이동한 로그, 해결이 남은 실패의 원인 추정과 대응을 담는다.
답변을 받았을 때에는 필요한 정보가 충분히 모였는지까지 확인한다. 정상 종료 여부와 내용의 정확성을 함께 보려면 실행 기록과 질문의 요구 항목, 근거를 대조해야 한다.
참고 자료
개인 학습 자료를 바탕으로 개념과 코드 흐름을 다시 정리했다. 규격과 실제 라이브러리의 표기는 나눠 확인한다. Python SDK의 설치와 이관 안내는 공식 저장소에서 확인할 수 있다.