1. 스프링 ai 와 rag
PostgreSQL과 pgvector를 활용하여 고성능 Vector Database를 직접 구축, 최신 기술 매뉴얼 같은 '비정형 데이터'를 AI가 읽을 수 있는 형태로 변환하는 과정.
기업 내부의 기밀 문서나 최신 기술 매뉴얼 같은 '비정형 데이터'를 AI가 읽을 수 있는 형태로 변환하는 과정으로 텍스트를 수치화하는 임베딩(Embedding)의 원리를 이해해야 한다. 그리고 대용량 문서를 효율적으로 관리하기 위한 문서 분할(Chunking) 전략이 또한 중요하다.ㅣ
docker run -d --name local-postgres --restart always -e POSTGRES_PASSWORD=postgres -e POSTGRES_DB=sparta -p 5432:5432 pgvector/pgvector:pg16
-- 벡터 기능을 이 데이터베이스에서 활성화합니다.
CREATE EXTENSION IF NOT EXISTS vector;
SELECT * FROM pg_extension WHERE extname = 'vector';
자 정리하니 이렇다. 4일과정을 들어보니 rag정도는 빙산의 일각에 불과했다. 여기까지는 챗봇으로서.. 돈이 안되는 녀석이다. 비개발자 녀석이 취미로 이것을 만든것을 본적이 있다. 바이브만으로 쉽게 되는 것이니.. 궂이 파이썬을 쓸필요도 없다. 파인튜닝 할거 아니면...
2. 스프링 ai 와 vector db
Vector DB를 기반으로, AI 서비스의 표준 모델인 RAG(Retrieval-Augmented Generation) 패턴을 본격적으로 구현
유사도 검색(Similarity Search) 기법과 LLM의 프롬프트와 결합하여 환각 현상(Hallucination)이 억제된 정확한 답변
SCENARIO 1: 단순 지식 검색 (Fact Retrieval)
SCENARIO 2: 조건부 질문 (Conditional Logic)
SCENARIO 3: 복합 조건 추론 (Complex Reasoning)
SCENARIO 4: 검색 결과 요약 (Search Summary)
성능 모니터링: AOP를 활용한 지연 시간 측정( RagPerformanceMonitor)
역시 챗봇을 만들수 있는 rag를 한번 더 다뤘다. 지피티, 제미나이, 클로드 등이 모르는 사내 내규 같은 것을 학습시켜 적절한 답변을 생성하게 하는 것이다. 학습시킨 데이터를 검색해서, 질문하고 , 복합조건도 추론해서 고도화된 질문에 답하고 대답하는것. 역시 이정도 단계는 아무것도 아닌것이었다. 그 친구가 너무 쉽게 만들었다.
3. Advisor와 FunctionCalling
비즈니스 로직과 AI 공통 관심사를 명확하게 분리해 주는 Advisor 패턴을 학습
AI가 외부 시스템과 직접 상호작용하게 만드는 Function Calling을 마스터
Advisor는 Spring AI에서 ChatClient의 요청(Request)과 응답(Response) 사이를 가로채어 추가적인 로직을 수행하는 미들웨어(Middleware)이자 인터셉터(Interceptor) 패턴의 구현체
Context(공유 저장소)는 Advisor 체인을 따라 흐르는 공유 바구니와 같습니다. (Map<String, Object>)
Spring AI의 Advisor 시스템을 깊이 있게 이해하려면 그 근간이 되는 BaseAdvisor 인터페이스와 데이터를 주고받는 객체 구조를 파악해야 합니다.
BaseAdvisor는 동기(Call) 방식과 비동기(Stream) 방식 모두를 지원하며, 개발자가 복잡한 흐름 제어 대신 비즈니스 로직(Before/After)에만 집중할 수 있도록 설계되었습니다.
: LLM에 전달되기 전의 메시지, 옵션, 컨텍스트를 수정합니다. (예: 시스템 프롬프트 추가)
: LLM이 반환한 결과값을 검증하거나 저장합니다. (예: 대화 기록 DB 저장)
🔹 ChatClientRequest (요청 데이터) : LLM을 호출하기 위해 필요한 모든 '재료'가 담겨 있습니다.
대화형 AI를 개발할 때, 단순 텍스트 결합보다 더 정교한 관리가 필요할 때가 있습니다.MessageChatMemoryAdvisor
는 대화 내역을 단순한 문자열이 아닌 구조화된 객체(Message Object) 단위로 다루는 진화된 방식의 메모리 Advisor입니다.
AI 서비스가 실제 사용자에게 노출될 때 가장 중요한 것은 안전성(Safety)입니다. 모델이 부적절한 질문에 답변하거나, 예기치 않게 편향되거나 유해한 내용을 출력하는 것을 방지해야 합니다. SafeGuardAdvisor 는 이러한 안전 가드레일(Safety Guardrails) 역할을 수행합니다.
SafeGuardAdvisor로 할 수 있는 일들
- 욕설 및 혐오 표현 차단: 커뮤니티 가이드라인 준수.
- 개인정보 유출 방지: 주민등록번호, 전화번호 등이 답변에 포함될 경우 마스킹(**) 처리.
- 정치/종교 편향 방지: 민감한 주제에 대해 중립적인 답변을 하도록 유도하거나 답변 거부.
프롬프트 인젝션 방어: "이전 지시사항을 무시하고..."와 같은 해킹 시도 감지 및 차단.
ChatMemoryAdvisor
이 Advisor는 챗봇이 "방금 뭐라고 하셨죠?"라는 질문에 당황하지 않게 만드는 '단기 기억 장치' 역할을 합니다.
LLM의 손과 발: Function Calling (현실 세계 연결)
- 연쇄 호출 (Chaining): 복합 질문 시 LLM이 한 번의 요청으로 두 번 이상의 Tool을 호출하는가?
- 자연어 생성 품질: Tool에서 반환된 날씨/계산기 데이터를 바탕으로 사용자 친화적인 문장을 생성하는가?
- 에러 핸들링: "0으로 나누기" 같은 잘못된 요청 시 Advisor나 Tool에서 발생한 예외를 AI가 어떻게 설명하는가?
4. Agenticd Workflow

Thought(what) - > Action -> Observation -> Final Answe
시나리오별 API 호출
Scenario 1: 기본 ReAct 패턴
Scenario 2: 도구 제한 (Guardrail) => 보안과 비용 제어
Scenario 3: 계획-실행 (Plan-and-Execute) => 전략 수립과 결과의 정확도의 상관관계파악
Scenario 4: 자기 반성 (Self-Reflection) => 할루시네이션감소
[패턴 1] 전략적 계획 및 단계별 실행 (Plan-and-Execute)
패턴 1: 기본 Plan-and-Execute (전략가형) : 동작 원리: 목표 분석 → 전체 계획 수립 → 계획 일괄 실행 → 최종 요약
패턴 2: 상세 추적형 (투명성 강조형) : 동작 원리: 계획 수립 → 단계별 개별 호출 → 단계별 결과 저장 및 컨텍스트 전달 → 최종 결과 조립
패턴 3: 적응형 계획 (회복 탄력성형) : 동작 원리: 계획 수립 → 실행 → 결과 검증(Success/Fail) → 실패 시 피드백 반영 후 재계획(Re-planning)
[패턴 2] 협업형 멀티 에이전트
패턴 1: 순차적 협업 (Sequential Chain)
- 흐름: 연구원(데이터 수집) → 분석가(인사이트 도출) → 작성자(보고서 완성)
- 특징: 상위 에이전트의 결과가 하위 에이전트의 입력값(Context)이 됩니다.
패턴 2: 동적 파이프라인 (Dynamic Orchestration)
- 핵심: analyzeProblemType 메서드가 중재자(Router) 역할을 수행합니다.
- 장점: 불필요한 에이전트 호출을 줄여 비용과 시간을 최적화합니다.
패턴 3: 피드백 루프 (Iterative Review)
결과물의 품질이 중요할 때 사용합니다. 검토자(Reviewer) 에이전트가 승인할 때까지 작업을 반복합니다.
- 핵심: 분석 결과가 미흡하면 "APPROVED"를 받지 못하고 다시 연구 단계로 되돌아갑니다.
- 장점: 에이전트의 환각(Hallucination)을 최소화하고 높은 신뢰도를 보장합니다.
에이전트의 손과 발: CustomerSupportTools
@Tool :어노테이션이 붙은 메서드들은 에이전트가 필요할 때 직접 실행할 수 있는 기능을 제공합니다.
에이전트의 두뇌: CustomerSupportAgent : 이 서비스는 상황에 따라 서로 다른 '페르소나'를 생성하여 고객에게 최적화된 응답을 제공합니다.
- 표준 응대 (handleCustomerRequest): 기본적인 질문에 대해 도구를 사용하여 답변합니다.
- 우선순위 응대 (handlePrioritizedRequest): VIP 고객에게는 더 정중한 페르소나를, 긴급 고객에게는 신속한 해결 중심의 페르소나를 적용합니다.
- 감정 지능 (handleCustomerRequestWithSentiment): 에이전트가 내부적으로 analyzeSentiment 메서드를 먼저 실행합니다.
- 고객이 ANGRY 상태라면 시스템은 자동으로 상급자에게 보고(escalateToSupervisor)하는 가드레일을 작동시킵니다.
- 글로벌 지원 (handleMultilingualRequest): 요청된 언어에 맞춰 시스템 프롬프트를 동적으로 변경합니다.
agent 까지 오니까 이녀석들이 무엇을 해야하는지 생각하고 실행하고 , 검토하고 결과를 내놓는다.
뭐 클로드에 있는 agent 녀석들 보명 무엇을 해야하는지 적혀 있다. 그렇게 생각하면 단순해 보인다. 대리인적으로 그냥 무엇을 하는 동료랄지... 그런것들이 있는것이다. 뭐 페르소나라고 해서 정체성 부여를 통해 agent에 화룡점정을 찍는다. 이런부분들이 코드에 미세하게 조정되는 것을 보면서... 어떻게 agent 빌더들이 생기는지 조금 알것 같다.
자바 25로 오면서 동시성 처리가 워낙 좋아서, 비동기 노드에 전혀 밀리지 않는.. 성능을 자랑한다. 메모리나 cpu가 부족한 상황이 아닌 엔터프라이즈 서비스는 자바가 더 안정적인듯하다. 역시 스프링은 자바 25를 통해 노드만의 강점을 따라잡았다.
'Software > Architecture' 카테고리의 다른 글
| Java Spring 성능 최적화 4계층 — 언어·DB·프레임워크·애플리케이션으로 나눠서 생각하기 (3) | 2026.03.24 |
|---|---|
| Spring Boot 4 + Virtual Thread 아키텍처 설계 (0) | 2026.03.21 |
| Keycloak 토큰 설계 실수 7가지와 실무 보안 아키텍처 정리 (JWT, Scope, Audience, RBAC) (0) | 2026.03.19 |
| Monolith vs MSA 아키텍처 비교 (0) | 2026.03.17 |
| 좋은 아키텍처는 기술이 아니라 ‘변경 비용’을 줄이는 것이다 (0) | 2026.03.12 |
