경력기술서 · 2025.10 – 2026.05 · 디포커스

SeedAI Agent 개발

토큰 미터링 · 문서 분석 · RAG / LLM-WIKI

사내 Agent 플랫폼에서 비용 측정, 문서 읽기, 지식 검색을 맡아 개발했습니다. 작업마다 왜 그렇게 나눴는지와 실제로 도는 순서를 그렸습니다. 파란 칸이 직접 구현한 부분입니다.

Python LangChain LangGraph Spring MSSQL Qdrant Docker
00

배경 및 플랫폼 구조

프로젝트 목적

SeedAI는 개발자가 코드를 매번 작성하지 않고 Agent를 구성해 실행하는 사내 플랫폼입니다. 사용자는 포탈에서 대화하고, 요청은 게이트웨이를 거쳐 Agent로 들어가며, 설정과 이력은 API와 DB에 남습니다. 이 실행 구간에 비용 측정, 문서 분석, 지식 검색을 붙였습니다.

플랫폼 구조 파란 칸이 직접 구현
화면 사용자 포탈 · 어드민 콘솔 대화 · Agent 관리
게이트웨이 :8010 · :8040 로그인 확인 후 서버로 전달 Keycloak 로그인 · 대화 스트리밍 중계
설정 · 이력
API :8030 · :8050 Agent 설정 · 대화 이력 · 사용량
답변 생성
Agent :8000 01 미터링 · 02 문서 분석 · 03 위키
메타
MSSQL 설정 · 이력 · 사용량
문단
Qdrant RAG 청크
개인 지식
wiki/ OKF 묶음
범위: 화면, 게이트웨이, 로그인, DB는 기존 플랫폼입니다. 직접 구현한 것은 Agent 실행에 붙인 비용 측정, 문서 분석, 지식 검색과 그 저장입니다.
01

토큰 사용량 미터링

설계 관점

컨텍스트를 줄이려고 세던 추정 토큰은 비용과 한도에 쓸 수 없었습니다. 한 요청 안에도 본 답변, 도구 결과를 들고 다시 부른 호출, 서브에이전트가 섞여 있어 호출마다 저장하면 건수가 부풉니다. 그래서 실제 사용량은 호출이 끝날 때 모으고, 비용 계산과 저장은 요청이 끝난 뒤 한 번만 하게 했습니다. 진행 중인 답을 끊지 않으려고 한도는 다음 요청에서 봅니다.

기존 · 추정치를 호출마다 건수가 부풂
입력 사용자 요청 1건
LLM 호출 N번 본 답변 · 도구 재호출 · 서브에이전트 세는 값은 추정 토큰
문제 요청 1건이 여러 건으로 비용과 한도를 판단할 수 없음
개선 · 실측을 모아 한 번 요청당 1건
입력 사용자 요청 1건
Agent 실측 토큰만 모아 둠 이 동안에는 저장하지 않음
저장 요청 1행 + 호출 N행 비용은 이때 한 번 계산
미터링 동작 한도 확인 → 실측 → 1회 저장
Step 1 · 요청 시작 · Agent → API 이번 달 사용 비용을 먼저 확인 사용자 × 앱 기준 · 넘으면 대화는 QUOTA_EXCEEDED, REST는 429
본 답변
사용자에게 가는 답
도구 재호출
도구 결과를 들고 다시
서브에이전트
그 안의 LLM 호출
보조 LLM
요약 · 압축 등
Step 2 · 비용 확정 · API 입력 · 출력 토큰에만 단가를 곱함 100만 토큰당 USD · 캐시 · 추론 토큰은 기록만
Step 3 · MSSQL 요청 1행 + 호출 N행 같은 요청 번호로 최초 1건만 · 재시도가 건수를 늘리지 않음
핵심: 호출 중에는 모으기만 하고, 저장과 비용 계산은 요청이 끝날 때 한 번입니다. 모델이 사용량을 주지 않으면 추정값을 남기고 “추정” 표시를 붙여 실측과 섞이지 않게 했습니다.
요청당 1회호출 수와 관계없이 저장 한 번
호출 4종본 답변 · 재호출 · 서브 · 보조
단가입력 · 출력만 USD
월 한도다음 요청부터 차단
02

문서 분석·요약

설계 관점

요약만 필요한 Agent에 지식 등록까지 붙으면 권한이 넓어집니다. 긴 문서를 통째로 넣으면 토큰만 늘고 어느 구간에서 답을 냈는지 흐려집니다. 그래서 파싱, 추출, 요약을 다른 호출로 두고, 분석가는 목차를 본 다음 필요한 구간만 읽게 했습니다. 등록 도구는 지식을 남기는 흐름에만 둡니다.

문서 분석 동작 추출과 요약을 다른 호출로
Step 1 · 업로드 파싱 워커가 텍스트로 변환 이 단계에서는 요약하지 않음
Step 2 · 부모 Agent 문서 일을 서브에이전트에 맡김 문서 전체를 자기 컨텍스트에 올리지 않음
본문이 필요하면
파서 본문만 추출 해석 · 요약 없이 원문 구조
요약 · 질문이면
분석가 목차를 보고 구간만 읽음 등록 도구 없음
Step 3 · 부모 Agent 받은 본문 · 요약으로 답변
파서 안 답하지 않고 본문만
1 · 스캔 글자 레이어부터 읽음 표 · 차트 · 그림은 보류 목록에
글자 있음
그대로 사용
스캔 · 빈 표
그 부분만 비전
2 · 반환 마크다운 합본 아이콘은 [검색]처럼 한글로 남김
분석가 안 숲을 보고 나무로
1 · 숲 전체 요약과 목차 먼저 특정 페이지부터 열지 않음
2 · 나무 요약에 없는 숫자 · 조항만 그 절 · 페이지 범위만 다시 읽음
3 · 반환 요약 + 그 구간만 요약에 없는 값은 추측하지 않음
파서본문만 · 요약 안 함
비전스캔본 · 빈 표 부분만
분석가목차 → 필요한 구간
등록 도구 3종지식을 남기는 흐름에만
03

LLM-WIKI · RAG

설계 관점

청크 검색은 비슷한 문단은 찾지만, 개념이 문서를 넘어 이어지면 출처가 끊깁니다. 개인 문서를 매번 통째로 넣는 것도 쌓일수록 불가능합니다. 그래서 개인 지식은 OKF로 정리하고, 목차를 입구로 필요한 카드만 읽게 했습니다. 문단이 필요한 전사 검색은 RAG에 남겼습니다.

RAG · 이번 답변의 문단 전사 문서
입력 문서 등록
적재 청크 나누기 · 임베딩
Qdrant 키워드 + 벡터 색인
RAG 검색 도구 두 순위를 합쳐 상위 문단
LLM-WIKI · 이어서 보는 지식 개인 지식
입력 원문 반입
쓰는 Agent 목차 · 개념 · 카드 · 이력
OKF 묶음 사용자 1명당 하나
찾는 Agent 목차 → 개념 → 카드만 읽음
저장과 검색이 다름 OKF는 목차부터 필요한 카드만
구분 RAG LLM-WIKI
쓰는 곳 이번 답변에 넣을 문단 개인 지식을 이어서 읽기
가공 1,000토큰 청크, 100토큰 겹침, 임베딩 목차 · 개념 페이지 · 카드 · 갱신 이력
저장 RDB 메타 + Qdrant 원문 폴더 + 위키 폴더
찾는 법 키워드와 벡터 순위를 합침 목차 → 개념 → 카드. 고른 파일만 읽음
범위 워크스페이스 문서, 전사 검색 사용자 1명당 위키 1개
OKF(Open Knowledge Format)는 지식을 벡터가 아니라 마크다운 묶음으로 둡니다. index.md가 목차, 개념 페이지가 허브, log.md가 갱신 이력이고, 카드끼리는 위키 링크로 잇습니다. 실제로 있는 파일 목록을 먼저 보고 연 파일만 근거로 남깁니다.
04

핵심성과

사용량 요청이 끝난 뒤에만 비용을 확정
한 일

호출이 끝날 때마다 실측 토큰을 모으고, 요청이 끝나면 한 번에 넘겨 입력·출력 단가만 USD로 남겼습니다.

개선

추정 토큰과 스트리밍의 빈 사용량으로는 한도를 걸 수 없었습니다. 월 쿼터는 이 비용으로 다음 요청을 판단합니다.

문서 추출과 요약을 다른 호출로
한 일

파서는 본문만 만들고, 분석가는 목차를 본 다음 필요한 구간만 읽어 부모 Agent에게 돌려줍니다.

개선

요약만 필요한 Agent에 등록 권한이 붙지 않습니다. 긴 문서 전체를 컨텍스트에 올리지 않아도 답이 나옵니다.

지식 한 답에 문단과 개념 경로
한 일

같은 질문에 RAG 문단과 OKF 카드를 같이 붙여, 부모 Agent가 둘을 한 답으로 합치게 했습니다.

개선

가까운 문단은 청크로, 개념이 이어지는 경로와 근거 파일은 OKF로 남습니다. 둘 중 하나만 넣을 때 빠지던 쪽이 답에 같이 들어갑니다.