fos-blog/study
01 / 홈02 / 카테고리03 / 시리즈
01 / 홈02 / 카테고리03 / 시리즈

카테고리

  • AI 페이지로 이동
    • RAG 페이지로 이동
    • agent 페이지로 이동
    • claude-code 페이지로 이동
    • harness 페이지로 이동
    • llm 페이지로 이동
    • ops 페이지로 이동
    • practice 페이지로 이동
  • algorithm 페이지로 이동
    • Alias Method: 가중치 랜덤 선택을 전처리 O(n), 추출 O(1)로 바꾸기
    • Welford's Online Algorithm: 값을 저장하지 않고 평균과 분산 계산하기
  • architecture 페이지로 이동
    • distributed-systems 페이지로 이동
    • domain 페이지로 이동
    • evolution 페이지로 이동
    • patterns 페이지로 이동
  • database 페이지로 이동
    • milvus 페이지로 이동
    • mysql 페이지로 이동
    • opensearch 페이지로 이동
    • postgresql 페이지로 이동
    • qdrant 페이지로 이동
    • redis 페이지로 이동
    • vespa 페이지로 이동
    • DB Connection Pool Saturation과 Thread Pool 격리
    • 커넥션 풀 크기는 얼마나 조정해야 할까?
    • MyBatis 기본기 — XML Mapper, resultMap, 동적 SQL, 운영 패턴 정리
    • MyBatis와 JPA/Hibernate 트레이드오프 — 레거시 백엔드를 다루는 시니어 관점
    • 한국어 형태소 분석기 Nori vs Lindera — OpenSearch에서 Milvus로 갈 때 어휘 검색은 유지되나
    • 정규화와 역정규화: 무결성과 조회 비용 사이의 선택
    • 벡터 DB 5종, 아키텍처는 어떻게 다른가
    • 벡터 DB 5종을 실제로 벤치마크했다 — 같은 recall에서 QPS는 얼마나 갈리나
    • 벡터 DB 어떻게 고를까 — OpenSearch · Milvus · Qdrant · Vespa · pgvector 비교
    • 벡터 DB를 실제로 도입한 사례 — 빅테크 프로덕션
  • devops 페이지로 이동
    • docker 페이지로 이동
    • k8s 페이지로 이동
    • Envoy Proxy
    • Graceful Shutdown
    • 종료 신호는 어디서 멈추는가
  • http 페이지로 이동
    • HTTP Connection Pool
    • HTTPS와 TLS: 핸드셰이크, 인증서, 종료 지점
  • java 페이지로 이동
    • concurrency 페이지로 이동
    • jdbc 페이지로 이동
    • spring 페이지로 이동
    • spring-batch 페이지로 이동
    • testing 페이지로 이동
    • Alpine 이미지의 Java 에서 링크 바꿔치기(TOCTOU)를 막지 못하는 이유
    • Java 동시성 락 정리 — 커머스 메뉴/프로모션 정책 캐시 갱신 관점
    • JVM 튜닝 실전: 메모리 구조부터 Virtual Threads, GC 튜닝, 프로파일링까지
    • 로그에 traceId 남기기 — MDC 부터 OpenTelemetry 까지
    • Java StampedLock — 읽기 폭주에도 쓰기가 밀리지 않는 락
    • Virtual Thread와 Project Loom
  • javascript 페이지로 이동
    • typescript 페이지로 이동
    • AbortController
    • Async Iterator와 제너레이터
    • CommonJS와 ECMAScript Modules
    • 제너레이터(Generator)
    • Http Client
    • Node 백엔드 운영 패턴 — Streams 백프레셔, pipe/pipeline, 멱등성 vs 분산 락
    • Node.js
    • `setImmediate()`
  • kafka 페이지로 이동
    • Kafka 클러스터 아키텍처: Broker, KRaft Controller와 복제
    • Kafka 기본 개념: Topic, Partition, Offset과 Segment
    • Kafka 실전 설계: 파티션 전략, 컨슈머 그룹, 전달 보장, 재시도, 순서 보장 트레이드오프
    • Kafka 파티션·리밸런스·컨슈머 지연 운영
    • Kafka를 로그로 이해하기: 복제, 재처리, 상태와 데이터 통합
    • Spring Kafka 컨슈머 오프셋 커밋과 트랜잭션 정렬: AckMode, manual ack, 멱등 처리
  • linux 페이지로 이동
    • fsync — 리눅스 파일 동기화 시스템 콜
    • SSH forced command 로 배포 키가 실행할 수 있는 명령 제한하기
  • mlops 페이지로 이동
    • llm-serving 페이지로 이동
    • model-router 페이지로 이동
    • Python CUDA 버전 생태계 — nvidia-smi, nvcc, pip, conda가 다 다른 버전을 말하는 이유
    • GPU 컨테이너의 CUDA 버전 호환성 — nvidia-smi부터 이미지 다이어트까지
    • Kubernetes GPU 노드에서 /run tmpfs가 꽉 차서 Pod가 안 뜰 때
    • GPU·CUDA·MPS 기초 — 자바 백엔드 개발자가 처음 만나는 그림
    • Multi-process GPU 워크로드 — 자바 ThreadPool 사용자가 만나는 모델 차이
    • ML 서비스 성능 분석 워크플로 — 자바 백엔드 트러블슈팅과 다른 점
    • 한 GPU 를 여러 프로세스가 나눠 쓰기 — Time-Slicing 과 MPS
  • network 페이지로 이동
    • Connection reset by peer는 누가 보낸 걸까 — 리버스 프록시 홉마다 TCP 연결은 따로 논다
    • L2(스위치)와 L3(라우터)의 역할 차이
    • L4와 VIP(Virtual IP Address)
    • IP Subnet
  • observability 페이지로 이동
    • Observability 입문: 시니어 백엔드가 장애를 탐지하고 대응하는 방식
    • K8s 위 Spring Boot 앱의 메트릭 수집
  • python 페이지로 이동
    • Python async/await — CompletableFuture·Reactor 와 다른 점, 그리고 blocking I/O 함정
    • Python 의존성 관리 — Java Maven/Gradle 사용자가 만나는 첫 충격
    • FastAPI 기초 — Spring Boot 사용자가 빠르게 익히는 법
    • Java 개발자를 위한 Python 심화 — OOP·데코레이터·컨텍스트 매니저
    • PyTorch 기초 — 텐서, 디바이스, 그리고 모델 로딩이 무거운 이유
    • Java 개발자를 위한 Python 문법 핵심
    • ThreadLocal 에서 contextvars 로 — Python 의 요청 컨텍스트 전파
    • OCR 동작 원리 — Layout · Text · Post-process 3단계
    • Python 서버의 RSS가 줄지 않는 이유: CPython, gc.collect(), malloc_trim
  • rabbitmq 페이지로 이동
    • RabbitMQ Basics — 실전 백엔드 관점에서 정리하는 메시지 브로커 기본기
    • RabbitMQ vs Kafka — 백엔드 메시징 선택 기준과 실전 운영 관점
  • resume 페이지로 이동
    • 경험 및 경력기술서
    • 김병태 경력기술서
    • 김병태 포트폴리오
  • task 페이지로 이동
    • ai-service-team 페이지로 이동
    • nsc-slot 페이지로 이동
    • personal-projects 페이지로 이동
    • sb-dev-team 페이지로 이동
    • the-future-company 페이지로 이동
  • thinking 페이지로 이동
    • 자기주도 학습: 질문에서 시작해 글로 검증하기
    • 좋은 일을 넘어 중요한 일을 하는 법
FOS-BLOG · FOOTERall systems normal·v0.1 · 2026.04.27·seoul, kr
Ffos-blog/study

개발 학습 기록을 정리하는 블로그입니다. 공부하면서 기록하고, 기록하면서 다시 배웁니다.

visitors
01site
  • Home↗
  • Posts↗
  • Categories↗
  • Glossary↗
  • About↗
02policy
  • 소개/about
  • 개인정보처리방침/privacy
  • 연락처/contact
03categories
  • AI↗
  • Algorithm↗
  • DB↗
  • DevOps↗
  • Java/Spring↗
  • JS/TS↗
  • React↗
  • Next.js↗
  • System↗
04connect
  • GitHub@jon890↗
  • Source repositoryjon890/fos-study↗
  • RSS feed/rss.xml↗
  • Newsletter매주 1 회 · 한 편의 글→
© 2026 FOS Study. All posts MIT-licensed.
built with·Next.js·Tailwind v4·Geist·Pretendard·oklch
fos-blog/task/개인 AI 비서의 문맥 구성과 도구 승인 경…
task

개인 AI 비서의 문맥 구성과 도구 승인 경계

진행 기간: 2026.09–2026.10 (이번에 확인한 관련 커밋 범위) 개인용 AI 비서 FOS Assistant와 업무별 도구 모음 FOS Agents를 개발하면서, 모델에 보낼 기억과 도구를 실행할 권한을 애플리케이션에서 관리했다. 회사 업무와 별개의 개인 프로젝트이며, 오픈소스 Hermes를 실행 엔진으로 활용한다. Hermes core의 추론과...

2026.10.25·2 min read·0 views

진행 기간: 2026.09–2026.10 (이번에 확인한 관련 커밋 범위)

개인용 AI 비서 FOS Assistant와 업무별 도구 모음 FOS Agents를 개발하면서, 모델에 보낼 기억과 도구를 실행할 권한을 애플리케이션에서 관리했다. 회사 업무와 별개의 개인 프로젝트이며, 오픈소스 Hermes를 실행 엔진으로 활용한다. Hermes core의 추론과 기본 도구 실행을 직접 만든 기능으로 세지 않는다.

기억 본문을 채워도 추가 조회 경로가 남아야 했다

ContextAssembler.assemble은 요청자의 접근권한과 에이전트가 받을 수 있는 기억 범위를 확인한 뒤 문맥을 구성한다. 공통 지침, 개인 사실, 질문 관련 기억과 제목 색인을 각 용도에 맞게 담는다. 긴 본문이 전체 예산을 차지하면 다른 기억의 번호까지 사라지므로 제목 색인 몫을 먼저 남긴다. 본문을 넣지 못해도 에이전트가 memory_read로 추가 조회할 수 있게 하려는 선택이다.

이 예산은 maxChars에 따른 문자 수 기준이다. 모델별 실제 토큰 수를 정밀하게 제한하는 기능으로 해석하지 않는다. ContextAssemblerTest와 ContextAssemblerHybridTest 등에서 조립과 선택 경로의 검사 소스를 확인했으며, 이번 문서 보강에서는 Java 테스트를 재실행하지 않았다.

승인 요청을 저장하는 경로와 실행하는 경로를 나눴다

ConnectorPolicyService는 도구의 연결·실행 소유권과 정책을 확인하고 승인이 필요한 호출을 PENDING으로 저장한다. ConnectorActionService가 승인 후 별도 경로에서 실행을 진행한다. Python 플러그인의 hermes/plugins/fos-ctx/connector_policy.py도 정책 질의가 정상 응답을 주지 않거나 실행 맥락을 확인할 수 없으면 호출을 차단한다. 모델이 승인 문구를 생성했다는 사실만으로 외부 실행을 허용하지 않는 구조다.

FOS Agents의 커리어 도구에서는 결과를 알 수 없는 실행을 재전송할 때 새 승인을 받을 수 있도록 재시도 식별자를 응답 계약에 포함했다. career-os/plugin/src/interview.test.ts는 설명 문구에 식별자 이름이 있는지만 보던 검사를 실제 오류 응답 필드 검사로 바꿨다(c134bb94, 2026.10.13). 테스트 이름과 설명이 맞아도 실제 데이터 계약을 검사하지 않으면 결함을 놓칠 수 있다는 사례다.

여러 에이전트와 선제 확인의 구현 범위

AgentDelegationService에는 요청자·기준 실행 확인, 같은 호출 판별과 동시 실행 한도를 검사하는 경로가 있다. AgentDelegationServiceRaceTest는 경합을 다루는 테스트이고, 현재 루트별 잠금은 JVM 안에서 동작한다. 서버 여러 대에서 같은 제한을 보장한다고 주장하지 않는다.

선제 확인 기능은 ProactiveCheckService와 시간 제한·복구·준비 상태를 다루는 테스트 소스에서 확인했다. 이 사실만으로 사용자에게 필요한 개입을 정확히 선별하거나 실제 생활에서 유용성을 검증했다고 말할 수는 없다. 이번 확인에서는 실제 모델 호출과 장기 사용자 평가를 수행하지 않았다.

기여와 확인 근거

본인 명의 커밋 30c6e5a3c, e5330e3e9, 33369b040(2026.10.17)에서 승인·대화·선제 확인 기능의 구조 정리를 확인했다. 구조 정리 커밋만으로 각 기능의 최초 설계와 전체 구현을 본인이 단독 수행했다고 단정하지 않는다. 30c6e5a3c와 FOS Agents의 c134bb94에는 AI 에이전트 공동 작성 표기가 있다. 제품의 문맥·승인 경계와 연결 도구를 개발한 개인 프로젝트 기록이며, 오픈소스 기여와 AI의 구현 보조를 구분해 읽어야 한다.

기억을 많이 보내는 것보다 필요한 기억에 접근할 길을 남기고, 도구 호출을 잘 생성하는 것과 호출 권한을 판정하는 일을 분리하는 데 초점을 뒀다.

on this page
  • 01기억 본문을 채워도 추가 조회 경로가 남아야 했다
  • 02승인 요청을 저장하는 경로와 실행하는 경로를 나눴다
  • 03여러 에이전트와 선제 확인의 구현 범위
  • 04기여와 확인 근거
tags
#tasks#insights

이런 글도

  • task

    에이전트가 탐색하고 실패를 판단할 수 있는 CLI

    2026.10.25
  • task

    AI 돌봄 분석의 실행 경계와 그래프 기반 평가

    2026.10.25
  • task

    HTTP 200 응답 안의 OCR 오류를 운영 지표로 만들기

    2026.09.03
  • task

    운영 지표와 주간 오류 분류 루프

    2026.09.02

댓글 (0)