[{"data":1,"prerenderedAt":868},["ShallowReactive",2],{"navigation_docs_ko":3,"-ko-project-brolog-ai-assistant-application-process":181,"-ko-project-brolog-ai-assistant-application-process-surround":863},[4,114,167],{"title":5,"icon":6,"path":7,"stem":8,"children":9,"page":27},"Note (개발 지식)","emojione-v1:note-pad","\u002Fko\u002Fnote","ko\u002F1.note",[10,28,42,68,78,88,104],{"title":11,"icon":12,"path":13,"stem":14,"children":15,"page":27},"Spring","logos:spring-icon","\u002Fko\u002Fnote\u002Fspring","ko\u002F1.note\u002F0.spring",[16],{"title":17,"icon":18,"path":19,"stem":20,"children":21,"page":27},"Spring Ai","custom:ai","\u002Fko\u002Fnote\u002Fspring\u002Fspring-ai","ko\u002F1.note\u002F0.spring\u002F1.spring-ai",[22],{"title":23,"path":24,"stem":25,"icon":26},"Spring AI 핵심 개념과 LLM 애플리케이션 구조 이해","\u002Fko\u002Fnote\u002Fspring\u002Fspring-ai\u002Fspring-ai","ko\u002F1.note\u002F0.spring\u002F1.spring-ai\u002F1.spring-ai","lucide:file-text",false,{"title":29,"icon":30,"path":31,"stem":32,"children":33,"page":27},"Javascript","skill-icons:javascript","\u002Fko\u002Fnote\u002Fjavascript","ko\u002F1.note\u002F1.javascript",[34,38],{"title":35,"path":36,"stem":37,"icon":26},"Promise.all과 구조 분해 할당을 활용한 데이터 처리 패턴","\u002Fko\u002Fnote\u002Fjavascript\u002Fdestructuring","ko\u002F1.note\u002F1.javascript\u002F1.destructuring",{"title":39,"path":40,"stem":41,"icon":26},"JavaScript 배열 고차 함수와 데이터 처리 패턴 이해","\u002Fko\u002Fnote\u002Fjavascript\u002Ffilter","ko\u002F1.note\u002F1.javascript\u002F2.filter",{"title":43,"icon":44,"path":45,"stem":46,"children":47,"page":27},"Nuxt4","logos:nuxt-icon","\u002Fko\u002Fnote\u002Fnuxt4","ko\u002F1.note\u002F2.nuxt4",[48,52,56,60,64],{"title":49,"path":50,"stem":51,"icon":26},"Nuxt 4를 선택한 이유와 아키텍처 및 실무 가이드","\u002Fko\u002Fnote\u002Fnuxt4\u002Fnuxt-info","ko\u002F1.note\u002F2.nuxt4\u002F1.nuxt-info",{"title":53,"path":54,"stem":55,"icon":26},"Nuxt useAsyncData 동작 원리와 SSR 데이터 페칭 최적화","\u002Fko\u002Fnote\u002Fnuxt4\u002Fnuxt-use_async_data","ko\u002F1.note\u002F2.nuxt4\u002F2.nuxt-use_async_data",{"title":57,"path":58,"stem":59,"icon":26},"Nuxt Content v3 데이터 모델과 Query 시스템 이해","\u002Fko\u002Fnote\u002Fnuxt4\u002Fnuxt-content-v3","ko\u002F1.note\u002F2.nuxt4\u002F3.nuxt-content-v3",{"title":61,"path":62,"stem":63,"icon":26},"Nuxt Auto-imports 내부 동작과 컴파일 과정 분석","\u002Fko\u002Fnote\u002Fnuxt4\u002Fnuxt-auto-import","ko\u002F1.note\u002F2.nuxt4\u002F4.nuxt-auto-import",{"title":65,"path":66,"stem":67,"icon":26},"Nuxt 렌더링 방식 이해: SSR, SSG, ISR, CSR 구현 방법","\u002Fko\u002Fnote\u002Fnuxt4\u002Fnuxt-rendering-strategy","ko\u002F1.note\u002F2.nuxt4\u002F5.nuxt-rendering-strategy",{"title":69,"icon":70,"path":71,"stem":72,"children":73,"page":27},"Nitro","unjs:nitro","\u002Fko\u002Fnote\u002Fnitro","ko\u002F1.note\u002F3.nitro",[74],{"title":75,"path":76,"stem":77,"icon":26},"Nitro 아키텍처와 서버 엔진 구조","\u002Fko\u002Fnote\u002Fnitro\u002Fnitro","ko\u002F1.note\u002F3.nitro\u002Fnitro",{"title":79,"icon":80,"path":81,"stem":82,"children":83,"page":27},"Devops","vscode-icons:file-type-pipeline","\u002Fko\u002Fnote\u002Fdevops","ko\u002F1.note\u002F4.devops",[84],{"title":85,"path":86,"stem":87,"icon":26},"서버사이드 WebAssembly(Wasm)와 차세대 실행 환경","\u002Fko\u002Fnote\u002Fdevops\u002Fwebassembly","ko\u002F1.note\u002F4.devops\u002F1.webAssembly",{"title":89,"icon":90,"path":91,"stem":92,"children":93,"page":27},"Tooling","lucide:wrench","\u002Fko\u002Fnote\u002Ftooling","ko\u002F1.note\u002F4.tooling",[94],{"title":95,"icon":96,"path":97,"stem":98,"children":99,"page":27},"Package Manager","devicon:npm","\u002Fko\u002Fnote\u002Ftooling\u002Fpackage-manager","ko\u002F1.note\u002F4.tooling\u002F1.package-manager",[100],{"title":101,"path":102,"stem":103,"icon":26},"Package Lock 파일의 역할과 의존성 관리 원리","\u002Fko\u002Fnote\u002Ftooling\u002Fpackage-manager\u002Fpackage-lock","ko\u002F1.note\u002F4.tooling\u002F1.package-manager\u002F1.package-lock",{"title":105,"icon":106,"path":107,"stem":108,"children":109,"page":27},"Web","streamline-plump:web","\u002Fko\u002Fnote\u002Fweb","ko\u002F1.note\u002F4.web",[110],{"title":111,"path":112,"stem":113,"icon":26},"웹 애플리케이션 렌더링 아키텍처 이해","\u002Fko\u002Fnote\u002Fweb\u002Frendering-modes","ko\u002F1.note\u002F4.web\u002F2.rendering-modes",{"title":115,"icon":116,"path":117,"stem":118,"children":119,"page":27},"Project (개발일지)","icon-park-solid:branch-two","\u002Fko\u002Fproject","ko\u002F2.project",[120],{"title":121,"icon":122,"path":123,"stem":124,"children":125,"page":27},"Brolog","custom:symbol","\u002Fko\u002Fproject\u002Fbrolog","ko\u002F2.project\u002F1.brolog",[126,130,134,138,142,146,150,154,159,163],{"title":127,"path":128,"stem":129,"icon":26},"Brolog 프로젝트 개요","\u002Fko\u002Fproject\u002Fbrolog\u002Foutline","ko\u002F2.project\u002F1.brolog\u002F1.outline",{"title":131,"path":132,"stem":133,"icon":26},"[Brolog] Nuxt Multi Layer 프로젝트 Vercel 배포 (3) - Runtime 기능 문제 분석과 AI Assistant 전환","\u002Fko\u002Fproject\u002Fbrolog\u002Fvercel-deploy3-ai-integration","ko\u002F2.project\u002F1.brolog\u002F10.vercel-deploy3-ai-integration",{"title":135,"path":136,"stem":137,"icon":26},"[Brolog] AI Assistant 적용 과정 - Agent 구조와 API 사용량 관리 시 고려사항","\u002Fko\u002Fproject\u002Fbrolog\u002Fai-assistant-application-process","ko\u002F2.project\u002F1.brolog\u002F11.ai-assistant-application-process",{"title":139,"path":140,"stem":141,"icon":26},"Brolog 프로젝트 구조","\u002Fko\u002Fproject\u002Fbrolog\u002Fstructure","ko\u002F2.project\u002F1.brolog\u002F2.structure",{"title":143,"path":144,"stem":145,"icon":26},"[Nuxt Content] 네비게이션 아이콘 커스텀 빌드","\u002Fko\u002Fproject\u002Fbrolog\u002Fcustom-icon","ko\u002F2.project\u002F1.brolog\u002F3.custom-icon",{"title":147,"path":148,"stem":149,"icon":26},"[Nuxt 4] Auto-imports 동작 원리와 자동 import 시스템 이해","\u002Fko\u002Fproject\u002Fbrolog\u002Fnuxt-auto-import","ko\u002F2.project\u002F1.brolog\u002F4.nuxt-auto-import",{"title":151,"path":152,"stem":153,"icon":26},"[Brolog] 개발 블로그 메인 페이지 구현","\u002Fko\u002Fproject\u002Fbrolog\u002Fdevelop-main","ko\u002F2.project\u002F1.brolog\u002F5.develop-main",{"title":155,"path":156,"stem":157,"icon":158},"[Brolog] 브랜드 아이덴티티 적용 - Custom 404 페이지와 Default No Image 구현","\u002Fko\u002Fproject\u002Fbrolog\u002Fcustom-error-and-default-thumbnail","ko\u002F2.project\u002F1.brolog\u002F6.custom-error-and-default-thumbnail","lucide:image",{"title":160,"path":161,"stem":162,"icon":26},"[Brolog] Nuxt Multi Layer 프로젝트 Vercel 배포 (1)","\u002Fko\u002Fproject\u002Fbrolog\u002Fvercel-deploy1","ko\u002F2.project\u002F1.brolog\u002F8.vercel-deploy1",{"title":164,"path":165,"stem":166,"icon":26},"[Brolog] Nuxt Multi Layer 프로젝트 Vercel 배포 (2) - Build Pipeline 오류 분석과 Nuxt 실행 구조 이해","\u002Fko\u002Fproject\u002Fbrolog\u002Fvercel-deploy2-error-analyze","ko\u002F2.project\u002F1.brolog\u002F9.vercel-deploy2-error-analyze",{"title":168,"icon":169,"path":170,"stem":171,"children":172,"page":27},"Error (트러블슈팅)","emojione:stop-sign","\u002Fko\u002Ftrouble-shooting","ko\u002F3.trouble-shooting",[173],{"title":121,"icon":122,"path":174,"stem":175,"children":176,"page":27},"\u002Fko\u002Ftrouble-shooting\u002Fbrolog","ko\u002F3.trouble-shooting\u002F1.brolog",[177],{"title":178,"path":179,"stem":180,"icon":26},"[Nuxt Content] Nuxt Icon 오류 해결과 Custom Collection 기반 오프라인 아이콘 구성","\u002Fko\u002Ftrouble-shooting\u002Fbrolog\u002Fnuxt-icon-restricted-network-troubleshooting","ko\u002F3.trouble-shooting\u002F1.brolog\u002F1.nuxt-icon-restricted-network-troubleshooting",{"id":182,"title":135,"body":183,"date":846,"description":847,"extension":848,"links":849,"meta":850,"navigation":858,"path":136,"seo":859,"stem":137,"__hash__":862},"docs_ko\u002Fko\u002F2.project\u002F1.brolog\u002F11.ai-assistant-application-process.md",{"type":184,"value":185,"toc":838},"minimark",[186,834],[187,188,190,195,199,202,205,208,211,214,217,221,224,227,239,242,245,248,255,258,261,264,267,269,273,276,283,286,289,292,295,298,301,304,307,309,313,316,319,326,329,336,339,346,349,352,354,358,361,364,400,403,406,413,416,423,426,429,455,457,461,464,469,484,487,490,493,500,503,506,508,512,526,529,531,538,541,544,547,559,561,565,568,571,615,617,621,624,626,633,636,639,646,649,652,658,661,663,667,670,673,675,682,685,688,690,694,697,699,706,709,712,719,722,724,728,731,734,741,744,751,754,757,759,763,766,773,776,779,786,789,791,794,797,800,803,810,813,816,819,822,825,828,831],"u-page-card",{":spotlight":189},"true",[191,192,194],"h1",{"id":193},"ai-assistant-적용-이후-확인한-agent-실행-구조와-api-사용량-문제","🧩 AI Assistant 적용 이후 확인한 Agent 실행 구조와 API 사용량 문제",[196,197,198],"p",{},"이전 글에서는 Brolog 프로젝트에 AI Assistant 기능을 적용하면서 발생했던 문제와 해결 과정을 정리했다.",[196,200,201],{},"Vercel AI Gateway 대신 Google AI Studio API를 사용하도록 변경했고, AI SDK Provider 버전 충돌 문제까지 해결하면서 기본적인 AI 요청 흐름을 구성할 수 있었다.",[196,203,204],{},"하지만 실제 테스트 과정에서 예상하지 못한 부분을 발견했다.",[196,206,207],{},"사용자는 질문 하나만 입력했지만, 내부적으로는 여러 번의 AI API 요청이 발생하고 있었다.",[196,209,210],{},"처음에는 API 호출 로직이나 설정 문제라고 생각했지만, 원인은 MCP와 Tool을 사용하는 Agent 구조 자체에 있었다.",[196,212,213],{},"이번 글에서는 MCP 기반 Agent 환경에서 하나의 질문이 어떻게 여러 LLM 호출로 처리되는지, 그리고 무료 API 환경에서 사용량을 어떻게 관리해야 하는지 정리한다.",[215,216],"hr",{},[191,218,220],{"id":219},"실제-로그에서-확인한-ai-agent-api-호출-구조","🔍 실제 로그에서 확인한 AI Agent API 호출 구조",[196,222,223],{},"MCP 기반 AI Assistant를 적용한 이후 실제 동작을 확인하기 위해 Google AI Studio 사용량과 Vercel Function 로그를 함께 확인했다.",[196,225,226],{},"처음 예상했던 것은:",[228,229,236],"pre",{"className":230,"code":232,"filename":233,"language":234,"meta":235},[231],"language-text","사용자 질문 1회\n\n↓\n\nAI API 요청 1회\n","Expected Flow","text","",[237,238,232],"code",{"__ignoreMap":235},[196,240,241],{},"와 비슷한 구조였다.",[196,243,244],{},"하지만 실제 로그를 확인해보니 하나의 질문에서도 여러 번의 모델 호출이 발생하고 있었다.",[196,246,247],{},"예를 들어:",[228,249,253],{"className":250,"code":251,"filename":252,"language":234,"meta":235},[231],"사용자 질문\n\n↓\n\nLLM 판단\n\n↓\n\nMCP Tool 실행\n\n↓\n\n추가 LLM 호출\n\n↓\n\n최종 답변 생성\n","Agent Execution Flow",[237,254,251],{"__ignoreMap":235},[196,256,257],{},"과 같은 과정이 진행되면서,",[196,259,260],{},"사용자가 입력한 질문 수보다 실제 API 요청 수와 Token 사용량이 더 크게 발생했다.",[196,262,263],{},"이 과정을 통해 AI Agent 환경에서는 단순히 \"몇 번 질문했는가\"가 아니라,",[196,265,266],{},"하나의 요청이 내부적으로 몇 단계의 모델 호출을 발생시키는지까지 고려해야 한다는 점을 확인했다.",[215,268],{},[191,270,272],{"id":271},"️-일반적인-ai-호출-방식과-agent-실행-구조의-차이","🛠️ 일반적인 AI 호출 방식과 Agent 실행 구조의 차이",[196,274,275],{},"일반적인 AI API 호출 구조는 다음과 같다.",[228,277,281],{"className":278,"code":279,"filename":280,"language":234,"meta":235},[231],"사용자 질문\n\n↓\n\nLLM 요청\n\n↓\n\nAI 답변 반환\n","Simple AI Flow",[237,282,279],{"__ignoreMap":235},[196,284,285],{},"사용자 입장에서는 질문 하나에 답변 하나가 반환되기 때문에 하나의 API 요청만 발생한다고 생각하기 쉽다.",[196,287,288],{},"하지만 MCP(Model Context Protocol)와 Tool을 사용하는 Agent 구조에서는 처리 과정이 달라진다.",[196,290,291],{},"Agent는 단순히 답변을 생성하는 것이 아니라,",[196,293,294],{},"사용자의 요청을 분석하고,",[196,296,297],{},"필요한 데이터를 검색하고,",[196,299,300],{},"검색 결과를 다시 판단한 뒤,",[196,302,303],{},"최종 답변을 생성한다.",[196,305,306],{},"즉 하나의 질문이 여러 단계의 LLM 호출 과정으로 처리될 수 있다.",[215,308],{},[191,310,312],{"id":311},"mcp-tool-기반-문서-검색-agent-실행-흐름","🔄 MCP Tool 기반 문서 검색 Agent 실행 흐름",[196,314,315],{},"Brolog의 AI Assistant는 문서 기반 질문 답변을 위해 MCP Tool을 활용한다.",[196,317,318],{},"예를 들어 사용자가 다음과 같은 질문을 입력한다고 가정한다.",[228,320,324],{"className":321,"code":322,"filename":323,"language":234,"meta":235},[231],"\"Nuxt 설치 방법 알려줘\"\n","User Prompt",[237,325,322],{"__ignoreMap":235},[196,327,328],{},"내부적으로는 다음과 같은 과정이 진행될 수 있다.",[228,330,334],{"className":331,"code":332,"filename":333,"language":234,"meta":235},[231],"\n1. LLM 호출\n\n사용자 질문 분석\n\n↓\n\n문서 검색 필요 여부 판단\n\n\n2. MCP Tool 호출\n\nlist-pages 실행\n\n↓\n\n관련 문서 목록 탐색\n\n\n3. LLM 호출\n\nTool 결과 확인\n\n↓\n\n필요한 문서 판단\n\n\n4. MCP Tool 호출\n\nget-page 실행\n\n↓\n\n실제 문서 내용 조회\n\n\n5. LLM 호출\n\n검색 결과 기반 최종 답변 생성\n","MCP Agent Flow",[237,335,332],{"__ignoreMap":235},[196,337,338],{},"사용자는 질문 한 번만 했지만 내부적으로는:",[228,340,344],{"className":341,"code":342,"filename":343,"language":234,"meta":235},[231],"\n사용자 질문 1회\n\n=\n\nLLM 요청 여러 번\n\n+\n\nTool 실행 여러 번\n","API Usage",[237,345,342],{"__ignoreMap":235},[196,347,348],{},"이 발생할 수 있다.",[196,350,351],{},"따라서 AI 서비스 사용량을 관리할 때는 단순히 사용자 질문 개수만 보는 것이 아니라 Agent 내부에서 발생하는 모델 호출 횟수까지 고려해야 한다.",[215,353],{},[191,355,357],{"id":356},"️-mcp-agent-실행-과정과-step-제한의-필요성","⚙️ MCP Agent 실행 과정과 Step 제한의 필요성",[196,359,360],{},"AI SDK에서는 Agent 실행 단계를 제한할 수 있다.",[196,362,363],{},"예:",[228,365,370],{"className":366,"code":367,"filename":368,"language":369,"meta":235,"style":235},"language-ts shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","stopWhen: stepCountIs(5)\n","Agent Config","ts",[237,371,372],{"__ignoreMap":235},[373,374,377,381,385,389,393,397],"span",{"class":375,"line":376},"line",1,[373,378,380],{"class":379},"sBMFI","stopWhen",[373,382,384],{"class":383},"sMK4o",":",[373,386,388],{"class":387},"s2Zo4"," stepCountIs",[373,390,392],{"class":391},"sTEyZ","(",[373,394,396],{"class":395},"sbssI","5",[373,398,399],{"class":391},")\n",[196,401,402],{},"여기서 Step은 단순히 답변 횟수를 의미하지 않는다.",[196,404,405],{},"Agent 내부에서는 다음 과정들이 포함된다.",[228,407,411],{"className":408,"code":409,"filename":410,"language":234,"meta":235},[231],"\nLLM 판단\n\n↓\n\nTool 호출\n\n↓\n\nTool 결과 확인\n\n↓\n\n추가 판단\n","Agent Step",[237,412,409],{"__ignoreMap":235},[196,414,415],{},"Step 제한을 너무 높게 설정하면 다음 문제가 발생할 수 있다.",[228,417,421],{"className":418,"code":419,"filename":420,"language":234,"meta":235},[231],"\n불필요한 LLM 호출 증가\n\n↓\n\nAPI 사용량 증가\n\n↓\n\n응답 시간 증가\n\n↓\n\n무료 Tier 한도 빠른 소모\n","Problem",[237,422,419],{"__ignoreMap":235},[196,424,425],{},"문서 검색 기반 AI Assistant에서는 무한한 탐색보다 제한된 검색 과정이 더 적합하기 때문에 적절한 Step 제한이 필요하다.",[196,427,428],{},"Brolog에서는 다음과 같은 기준으로 관리하는 것이 적합하다고 판단했다.",[228,430,432],{"className":366,"code":431,"filename":368,"language":369,"meta":235,"style":235},"const MAX_STEPS = 4 ~ 5\n",[237,433,434],{"__ignoreMap":235},[373,435,436,440,443,446,449,452],{"class":375,"line":376},[373,437,439],{"class":438},"spNyl","const",[373,441,442],{"class":391}," MAX_STEPS ",[373,444,445],{"class":383},"=",[373,447,448],{"class":395}," 4",[373,450,451],{"class":383}," ~",[373,453,454],{"class":395}," 5\n",[215,456],{},[191,458,460],{"id":459},"️-token과-retry-설정을-통한-api-사용량-관리","🎛️ Token과 Retry 설정을 통한 API 사용량 관리",[196,462,463],{},"Agent 실행 과정에서는 Step뿐 아니라 출력량과 재시도 횟수도 API 사용량에 영향을 준다.",[465,466,468],"h2",{"id":467},"maxoutputtokens","maxOutputTokens",[228,470,473],{"className":366,"code":471,"filename":472,"language":369,"meta":235,"style":235},"maxOutputTokens: 2048\n","AI Config",[237,474,475],{"__ignoreMap":235},[373,476,477,479,481],{"class":375,"line":376},[373,478,468],{"class":379},[373,480,384],{"class":383},[373,482,483],{"class":395}," 2048\n",[196,485,486],{},"AI 모델이 생성할 수 있는 최대 출력 Token 수를 의미한다.",[196,488,489],{},"높게 설정하면 긴 답변 생성이 가능하지만,",[196,491,492],{},"반대로:",[228,494,498],{"className":495,"code":496,"filename":497,"language":234,"meta":235},[231],"\n더 많은 Token 사용\n\n↓\n\n비용 증가 가능\n\n↓\n\n응답 시간 증가\n","Token Usage",[237,499,496],{"__ignoreMap":235},[196,501,502],{},"문제가 발생할 수 있다.",[196,504,505],{},"문서 기반 Q&A 서비스에서는 일반적으로 1024~2048 정도면 충분하다고 판단했다.",[215,507],{},[465,509,511],{"id":510},"maxretries","maxRetries",[228,513,515],{"className":366,"code":514,"filename":472,"language":369,"meta":235,"style":235},"maxRetries: 1\n",[237,516,517],{"__ignoreMap":235},[373,518,519,521,523],{"class":375,"line":376},[373,520,511],{"class":379},[373,522,384],{"class":383},[373,524,525],{"class":395}," 1\n",[196,527,528],{},"API 요청 실패 시 재시도 횟수를 의미한다.",[196,530,363],{},[228,532,536],{"className":533,"code":534,"filename":535,"language":234,"meta":235},[231],"\n첫 요청 실패\n\n↓\n\n재시도\n\n↓\n\n성공\n","Retry Flow",[237,537,534],{"__ignoreMap":235},[196,539,540],{},"형태로 동작한다.",[196,542,543],{},"하지만 무료 API 환경에서는 재시도 역시 추가 요청으로 계산된다.",[196,545,546],{},"Brolog 환경에서는 다음과 같은 기준으로 관리하는 것이 적합하다고 판단했다.",[228,548,549],{"className":366,"code":514,"filename":472,"language":369,"meta":235,"style":235},[237,550,551],{"__ignoreMap":235},[373,552,553,555,557],{"class":375,"line":376},[373,554,511],{"class":379},[373,556,384],{"class":383},[373,558,525],{"class":395},[215,560],{},[191,562,564],{"id":563},"google-ai-studio-api-제한과-사용량-관리-이해","📊 Google AI Studio API 제한과 사용량 관리 이해",[196,566,567],{},"Google AI Studio에서 제공하는 모델들은 무료 사용 범위가 존재하지만 API 호출 제한이 존재한다.",[196,569,570],{},"대표적인 제한 항목은 다음과 같다.",[572,573,574,587],"table",{},[575,576,577],"thead",{},[578,579,580,584],"tr",{},[581,582,583],"th",{},"항목",[581,585,586],{},"의미",[588,589,590,599,607],"tbody",{},[578,591,592,596],{},[593,594,595],"td",{},"RPM",[593,597,598],{},"Requests Per Minute",[578,600,601,604],{},[593,602,603],{},"TPM",[593,605,606],{},"Tokens Per Minute",[578,608,609,612],{},[593,610,611],{},"RPD",[593,613,614],{},"Requests Per Day",[215,616],{},[465,618,620],{"id":619},"rpm-requests-per-minute","RPM (Requests Per Minute)",[196,622,623],{},"분당 API 요청 수 제한이다.",[196,625,363],{},[228,627,631],{"className":628,"code":629,"filename":630,"language":234,"meta":235},[231],"RPM 15\n","RPM Example",[237,632,629],{"__ignoreMap":235},[196,634,635],{},"이라면 1분 동안 최대 15개의 API 요청이 가능하다.",[196,637,638],{},"중요한 점은:",[228,640,644],{"className":641,"code":642,"filename":643,"language":234,"meta":235},[231],"\n사용자 질문 횟수 != API 요청 횟수\n","Agent Request Count",[237,645,642],{"__ignoreMap":235},[196,647,648],{},"라는 것이다.",[196,650,651],{},"Agent 구조에서는:",[228,653,656],{"className":654,"code":655,"language":234,"meta":235},[231],"질문 1회\n\n↓\n\nLLM 호출 4회\n",[237,657,655],{"__ignoreMap":235},[196,659,660],{},"가 발생하면 RPM 기준으로 4개의 요청을 사용한다.",[215,662],{},[465,664,666],{"id":665},"tpm-tokens-per-minute","TPM (Tokens Per Minute)",[196,668,669],{},"분당 처리 가능한 Token 양이다.",[196,671,672],{},"입력 Token과 출력 Token을 모두 포함한다.",[196,674,363],{},[228,676,680],{"className":677,"code":678,"filename":679,"language":234,"meta":235},[231],"\n사용자 질문\n1000 Token\n\n+\n\n검색 문서\n5000 Token\n\n+\n\nAI 답변\n1000 Token\n\n=\n\n7000 Token\n","Token Calculation",[237,681,678],{"__ignoreMap":235},[196,683,684],{},"을 사용할 수 있다.",[196,686,687],{},"문서 검색 AI에서는 긴 문서를 Context로 전달하는 경우가 많기 때문에 RPM보다 TPM 제한이 먼저 문제가 될 수도 있다.",[215,689],{},[465,691,693],{"id":692},"rpd-requests-per-day","RPD (Requests Per Day)",[196,695,696],{},"하루 API 요청 제한이다.",[196,698,363],{},[228,700,704],{"className":701,"code":702,"filename":703,"language":234,"meta":235},[231],"RPD 1500\n","Daily Limit",[237,705,702],{"__ignoreMap":235},[196,707,708],{},"이면 하루 동안 최대 1500번의 API 요청이 가능하다.",[196,710,711],{},"하지만 Agent 구조에서는:",[228,713,717],{"className":714,"code":715,"filename":716,"language":234,"meta":235},[231],"\n사용자 질문 1회\n\n↓\n\n여러 API 요청 발생\n","Daily Usage",[237,718,715],{"__ignoreMap":235},[196,720,721],{},"하기 때문에 실제 사용자 질문 가능 수는 더 적다.",[215,723],{},[191,725,727],{"id":726},"무료-api-환경에서-고려해야-할-비용-관리-요소","💰 무료 API 환경에서 고려해야 할 비용 관리 요소",[196,729,730],{},"웹 서비스에서 ChatGPT나 Gemini를 사용하는 것과 API를 사용하는 것은 다르다.",[196,732,733],{},"웹 서비스:",[228,735,739],{"className":736,"code":737,"filename":738,"language":234,"meta":235},[231],"\n서비스 제공자가 비용 관리\n\n↓\n\n사용자는 서비스 이용\n","Service Model",[237,740,737],{"__ignoreMap":235},[196,742,743],{},"API:",[228,745,749],{"className":746,"code":747,"filename":748,"language":234,"meta":235},[231],"\n개발자가 직접 모델 호출\n\n↓\n\n사용량 제한과 비용 관리 필요\n","API Model",[237,750,747],{"__ignoreMap":235},[196,752,753],{},"구조다.",[196,755,756],{},"따라서 Google AI Studio, OpenAI API, Vercel AI Gateway 모두 API 사용량 관리 관점으로 접근해야 한다.",[215,758],{},[191,760,762],{"id":761},"ai-기능-구현-과정에서-확인한-운영-고려사항","🚀 AI 기능 구현 과정에서 확인한 운영 고려사항",[196,764,765],{},"현재 Brolog에서는 다음 기준으로 AI 사용량을 관리할 예정이다.",[228,767,771],{"className":768,"code":769,"filename":770,"language":234,"meta":235},[231],"\nStep 제한\n\n+\n\nmaxOutputTokens 제한\n\n+\n\nRetry 제한\n\n+\n\n무료 Tier 모델 활용\n\n+\n\n환경 변수 기반 Model 관리\n","Management Strategy",[237,772,769],{"__ignoreMap":235},[196,774,775],{},"특히 MCP 기반 문서 챗봇은 일반적인 Chat API보다 내부 AI 호출 횟수가 증가할 수 있다.",[196,777,778],{},"따라서 비용 기준은:",[228,780,784],{"className":781,"code":782,"filename":783,"language":234,"meta":235},[231],"\n사용자 질문 개수\n\n×\n\nAgent 내부 실행 Step\n","Cost Consideration",[237,785,782],{"__ignoreMap":235},[196,787,788],{},"관점으로 접근해야 한다.",[215,790],{},[191,792,793],{"id":793},"마무리",[196,795,796],{},"AI Assistant를 추가하면서 단순히 API Key를 연결하면 끝날 것이라고 생각했지만,",[196,798,799],{},"실제 Agent 구조에서는 하나의 질문도 여러 단계의 AI 판단 과정으로 처리된다는 것을 확인하며 고려해야 할 것이 많다는 것을 확인했다.",[196,801,802],{},"특히 MCP와 Tool을 사용하는 구조에서는:",[228,804,808],{"className":805,"code":806,"filename":807,"language":234,"meta":235},[231],"\n사용자 질문\n\n↓\n\nLLM 판단\n\n↓\n\nTool 실행\n\n↓\n\n추가 판단\n\n↓\n\n최종 답변\n","Agent Flow",[237,809,806],{"__ignoreMap":235},[196,811,812],{},"이라는 흐름이 발생한다.",[196,814,815],{},"따라서 AI 기능을 운영할 때는 단순히 \"몇 명의 사용자가 몇 번 질문했는가\"가 아니라,",[196,817,818],{},"내부적으로 몇 번의 모델 호출이 발생하는지를 기준으로 사용량과 비용을 관리해야 한다.",[196,820,821],{},"이번 과정을 통해 AI Assistant를 적용할 때는 단순히 모델을 연결하고 답변을 생성하는 것만 고려해서는 안 된다는 점을 확인했다.",[196,823,824],{},"Agent 구조에서는 Tool 호출과 추가 LLM 실행 과정으로 인해 예상보다 많은 API 요청이 발생할 수 있으며,\n이러한 호출 구조와 사용량 제한까지 함께 고려해야 한다는 것을 알게 되었다.",[196,826,827],{},"이번 경험을 통해 AI 기능 구현은 단순히 API를 연결하는 것으로 끝나는 작업이 아니라,",[196,829,830],{},"Agent가 어떤 방식으로 동작하고,\n내부적으로 얼마나 많은 모델 호출이 발생하며,\n이를 어떻게 제어할 것인지까지 설계해야 하는 영역이라는 점을 알게 되었다.",[196,832,833],{},"앞으로 Brolog뿐만 아니라 다른 AI 기반 프로젝트를 구현할 때도\n기능 구현 과정에서 이러한 운영 요소들을 함께 고려하며 설계해 나갈 예정이다.",[835,836,837],"style",{},"html pre.shiki code .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html pre.shiki code .s2Zo4, html code.shiki .s2Zo4{--shiki-light:#6182B8;--shiki-default:#82AAFF;--shiki-dark:#82AAFF}html pre.shiki code .sTEyZ, html code.shiki .sTEyZ{--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8}html pre.shiki code .sbssI, html code.shiki .sbssI{--shiki-light:#F76D47;--shiki-default:#F78C6C;--shiki-dark:#F78C6C}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .spNyl, html code.shiki .spNyl{--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA}",{"title":235,"searchDepth":839,"depth":839,"links":840},2,[841,842,843,844,845],{"id":467,"depth":839,"text":468},{"id":510,"depth":839,"text":511},{"id":619,"depth":839,"text":620},{"id":665,"depth":839,"text":666},{"id":692,"depth":839,"text":693},"2026-07-24","AI Assistant를 적용하면서 확인한 Agent 구조의 API 호출 흐름과 MCP Tool 사용 과정에서 발생하는 API 사용량 증가, 무료 API 환경에서 고려해야 할 운영 요소를 정리합니다.","md",null,{"tags":851,"image":857},[121,852,853,854,855,856],"AI","MCP","AI SDK","Google AI Studio","Agent","\u002Fimages\u002Fbro-ai-thumbnail2.png",{"icon":26},{"title":860,"description":861},"MCP 기반 AI Assistant Agent 구조와 API 사용량 관리 방법","MCP 기반 AI Agent에서 하나의 질문이 여러 LLM 호출로 처리되는 이유와 RPM, TPM, RPD 제한 및 API 사용량 관리 방법을 정리합니다.","-yM37PazvKEXHgd5zET5IzMkG44gFffQ1fUcN5qtNMo",[864,866],{"title":131,"path":132,"stem":133,"description":865,"icon":26,"children":-1},"Nuxt Multi Layer 프로젝트를 Vercel에 배포한 이후 발생한 Nuxt OG Image와 AI Assistant 문제를 분석하고 Build 방식 전환, Google AI Studio 적용 과정과 SDK 버전 충돌 해결 과정을 기록합니다.",{"title":139,"path":140,"stem":141,"description":867,"icon":26,"children":-1},"개발 기록을 위한 개인 블로그 프로젝트의 정보 및 기술스택",1785297529298]