Jihoon Kim
ProjectsArchivesContact
Jihoon Kim © 2026 · Built with Codex & Claude Code.
  1. Key Accomplishment
  2. Architecture
  3. Technical Challenges
  4. Details

Project · 2026 · Development

ERP AI 어시스턴트

ERP AI 어시스턴트 (1/3)
ERP AI 어시스턴트 (2/3)
ERP AI 어시스턴트 (3/3)
1/3
Duration
2026.07 — 2026.08
Role
기획·설계 주도, AI 에이전트 협업 구현
Skills / Tools
LLMRAGReactAstryx Design SystemTypeScriptStreaming UXFactory PatternMySQLEmbeddings

Key Accomplishment

  • —사용자 질문을 알려준다·찾아준다·만들어준다 세 유형으로 나누고 유형별 답변 형태와 UI 패턴을 규정 — 대화가 자유서술로 흩어지지 않는 구조 확보
  • —등록·지시 계열은 대화 중 실행하지 않고 확인 카드에서 멈추도록 설계 — 확인 없이 실행되는 경로를 전 기능에서 제거
  • —어시스턴트 권한을 화면 권한에 종속시키고 개인정보를 답변에서 제외 — 대화가 권한 우회 경로가 되지 않도록 설계
  • —창 닫기와 생성 중지를 분리한 스트리밍 UX — 닫아도 서버는 끝까지 생성하고 완료 시 플로팅 버튼 뱃지로 알림

Architecture

사용자 요청을 안전한 실행 제안으로 바꾸고, 스트리밍 응답으로 다시 전달하는 세 단계 구조입니다.

Architecture: 사용자 요청을 안전한 실행 제안으로 바꾸고, 스트리밍 응답으로 다시 전달하는 세 단계 구조입니다.

Technical Challenges

  • —한 턴을 트리거·RAG·펑션콜링 세 레이어로 분리했습니다. 워커가 수명과 예산을 관리하고, RAG가 근거를 찾고, 펑션콜링이 조회나 변이 제안으로 바꾸도록 경계를 나눠 한 레이어의 실패가 전체 턴 실패로 번지지 않게 했습니다.
  • —스트리밍은 meta → block_start → block_delta → tool_status/block → 완성 block → done 순서의 SSE 계약으로 고정했습니다. 15초 heartbeat와 버퍼링 방지 헤더를 적용하고, 화면을 닫는 detach와 생성을 멈추는 cancel을 분리했습니다.
  • —검색 레이어는 전용 벡터 DB나 Redis 같은 인프라를 추가하지 않고 MySQL 8 의 ngram FULLTEXT 와 인메모리 코사인이라는 두 검색 축을 rank 기반 RRF로 융합했습니다.
  • —문서 외부 전송은 allowlist 기반 fail-closed 정책으로 제한하고, 임베딩 워커는 모델·차원·task type·조성 버전 fingerprint가 바뀐 청크만 재처리하도록 구성했습니다.

Details

화면을 찾아 들어가 하던 일을 문장으로 요청하는 것을 제품 정의로 잡았습니다. 기능 범위와 상호작용 패턴, 아키텍처 방향과 운영 경계를 정의하고 구현은 AI 에이전트와의 협업으로 진행했습니다.

UI는 Astryx Design System을 기반으로 구현하여 공통 컴포넌트와 디자인 규칙을 일관되게 적용했습니다.

조회 결과는 표와 엑셀 내보내기, 등록 요청은 확인 카드, 값이 빠진 요청은 선택지 되묻기로 답변 형태를 고정했습니다. 확인 카드에 적힌 값만 실행 값으로 인정하고, 수정 요청 시 이전 카드는 자동 취소되며, 다건에 영향을 주는 작업은 대상 건수를 필수로 표기하고 대상이 0건이면 카드를 생성하지 않습니다.

진입점은 홈 입력칸·플로팅 버튼·추천 작업 칩 세 곳으로 나누되 하나의 대화 상태를 공유하도록 했습니다. 홈 입력은 새 대화를 시작하고, 플로팅 버튼은 마지막 대화를 이어받으며, 어시스턴트 권한이 없으면 진입점 자체를 렌더링하지 않습니다.

모델·벤더 교체를 전제로 어시스턴트 클래스 구조를 팩토리 패턴으로 지정해 생성 지점을 한 곳으로 모았습니다. 답할 수 없는 주제는 서버가 고정 문구로 담당 화면을 안내하고, 사용량은 화면 표시값과 차단 판정 기준을 일치시켰습니다.