AI 4

[기술선택근거] LLM 모델 및 추론 강도 선정을 위한 성능 평가

Zelo(제로클릭 커머스)는 채팅 한 줄로 장보기를 끝내는 서비스다. 이 글은 그 안에서 사용자의 말을 "메뉴 계획"으로 정리하는 LLM을 어떤 모델로, 어떤 설정으로 쓸지를 어떻게 정했는지 기록한 것이다. 결론보다 왜 그렇게 측정했는지를 남기는 데 목적이 있다.1. 왜 모델 테스트를 다시 하게 되었나1-1. 서비스에서 LLM이 하는 일사용자가 이렇게 말한다고 하자.토요일에 초등학생 둘이랑 넷이 먹을 건데, 김치볶음밥 재료 3만 원 안에서 준비해 줘LLM은 이 말을 아래처럼 정해진 칸이 있는 객체(MenuPlan) 로 정리한다. 가격과 상품은 정하지 않는다. 그건 서버가 DB를 보고 계산한다.intent = SHOPPING_REQUEST (장보기 요청)menuName ..

AI/LLM 2026.10.23

팀 프로젝트(Zelo) - 리뷰 모델 변경 테스트 및 결정

LLM 모델 설정 변경 근거결론용도모델 · 추론 강도설정 위치일반 (메뉴 계획 · 채팅 설명)gpt-6-luna · lowspring.ai.openai.chat.model, spring.ai.openai.chat.reasoning-effort리뷰 한 줄 요약gpt-5-mini · medium (기존 그대로)zelo.llm.review-summary.model, zelo.llm.review-summary.reasoning-effort리뷰 요약의 medium은 gpt-5-mini의 기본값이다. 일반 설정의 low가 모든 요청에 섞이기 때문에, 예전과 같은 조건으로 보내려고 직접 적었다.시간 제한(zelo.llm.timeout)은 두 용도가 같이 쓴다. 12s로 올리는 것을 함께 제안한다 (아래 3장).1. ..

AI/LLM 2026.10.22

[Troubleshooting] Spring AI 2.0에서 OpenAI 타임아웃이 적용되지 않았던 이유

application.yaml에 OpenAI 타임아웃을 5초로 적어 두었는데, 실제 요청은 60초까지 기다리고 있었다. Spring AI 2.0.1이 요청을 보낼 때마다 타임아웃을 기본값 60초로 다시 덮어쓰기 때문이었고, 요청 옵션에 타임아웃을 직접 넣어 해결했다. 고친 뒤에는 1초로 설정하면 정확히 1.01초에 요청이 끊긴다.배경: 타임아웃이 왜 필요한가식당에서 주문하면서 "15분 안에 안 나오면 취소할게요"라고 정해 두는 것과 같다. 우리 서버가 OpenAI에 질문을 보내면 답이 올 때까지 기다리는데, OpenAI가 느리거나 장애가 나면 무한정 기다릴 수는 없다.사용자는 채팅창에서 계속 빈 화면을 본다.기다리는 동안 서버의 일꾼(요청 스레드)이 하나씩 묶인다. 이런 요청이 쌓이면 주문·결제 같은 다..

AI/Spring AI 2026.10.22

서킷 브레이커 이해하기: 외부 LLM API의 장애가 우리 서비스로 번지지 않도록

Zelo의 장보기 도우미 채팅은 사용자의 메시지를 받아 OpenAI(gpt-5-mini)를 호출하고, 그 결과를 AI 메시지로 저장해 응답한다. 그런데 OpenAI에 장애가 발생하면 어떻게 될까?사용자는 답변을 기다리고, 서버는 응답이 오지 않는 요청을 계속 처리해야 한다. 여기에 재시도까지 더해지면 장애가 발생한 외부 서비스에 요청이 반복해서 전달된다.이때 필요한 것이 서킷 브레이커(Circuit Breaker)이다.이 글에서는 서킷 브레이커가 언제 호출을 차단하고 어떻게 다시 허용하는지 개념을 먼저 정리하고, 각 개념이 우리 프로젝트 코드에서 어떻게 구현되었는지, 왜 그렇게 했는지를 함께 살펴본다.사용 기술: Spring Boot, Spring AI 2.0.1(OpenAI), Resilience4j ..

AI/Spring AI 2026.10.21