
엔지니어링 노트 · 설계 원칙과 아키텍처
권한은 코드로 막고, 판단은 모델에 맡긴다
OwlAI의 에이전트는 사내 DB와 문서를 읽고, 웹 페이지와 커넥터(MCP 서버처럼 회사가 OwlAI에 연결한 외부 서비스)의 결과도 읽습니다.
블로그
설치형 업무 AI를 만들며 내린 설계 결정과 실측을 기록합니다. 결정론으로 막고, 지침으로 이끌고, 감사로 확인한다는 원칙이 코드에서 어떻게 구현되는지 다룹니다.
1부
연재 전체를 관통하는 설계 원칙과, 모든 AI 기능이 함께 쓰는 실행 구조를 다룹니다.

엔지니어링 노트 · 설계 원칙과 아키텍처
OwlAI의 에이전트는 사내 DB와 문서를 읽고, 웹 페이지와 커넥터(MCP 서버처럼 회사가 OwlAI에 연결한 외부 서비스)의 결과도 읽습니다.

엔지니어링 노트 · 설계 원칙과 아키텍처
OwlAI에서 모델이 도구를 부르며 일하는 기능은 다섯입니다.

엔지니어링 노트 · 설계 원칙과 아키텍처
「30일 넘게 처리되지 않은 주문이 몇 건인가」를 문서 검색(RAG)으로 풀면, 모델은 검색에 걸린 조각 몇 개 안의 주문만 세고 그 수를 총계로 답합니다.
2부
업무 DB에서 자연어 질문을 정확한 SQL로 바꾸는 방법을 다룹니다.

엔지니어링 노트 · 정형 데이터와 NL2SQL
테이블이 수천 개인 업무 DB에는 주문 테이블 옆에 ORDMSTBAK, ORDMST202312 같은 백업·작업용 사본이 흔히 함께 남아 있습니다.

엔지니어링 노트 · 정형 데이터와 NL2SQL
주문 테이블의 STATUSCODE CHAR(1)에는 S, D, C가 들어 있습니다. 모델이 C를 완료(complete)로 짐작하면 「지난달 완료 주문 매출」에 취소 주문이 섞여 나옵니다.

엔지니어링 노트 · 정형 데이터와 NL2SQL
「지난달 매출」을 물으면 영업팀은 수주 금액을, 재무팀은 반품을 뺀 세금계산서 발행 금액을 떠올립니다.

엔지니어링 노트 · 정형 데이터와 NL2SQL
OwlAI의 SQL 실행 도구는 모델이 쓴 SQL을 고객의 운영 DB에서 실행합니다. 이때 클라이언트 쪽에서 건 제한은 걸린 것처럼 보여도 DB 서버에 닿지 않는 경우가 있습니다.

엔지니어링 노트 · 정형 데이터와 NL2SQL
스키마 분석(「컬럼의 뜻은 DDL에 없다, 질문 전에 값을 읽어 둔다」)이 끝난 뒤 주문 테이블에 반품 여부 컬럼 RETURNYN이 추가됐다고 해 봅시다.

엔지니어링 노트 · 정형 데이터와 NL2SQL
사용자가 「방금 조회한 결과를 CSV 파일로 받아 줘」라고 하면, 모델은 이미 받은 행을 파일 쓰는 도구의 인자로 다시 써야 합니다.
3부
고객 DB까지 가는 연결을 어떻게 열고 지키는지 다룹니다. 배스천을 거치는 SSH 터널, 전송 암호화와 인증서 확인, SaaS의 Amazon RDS·Supabase 가져오기, 그리고 OwlDB로 연결한 DB에서 실행이 어떻게 도는지를 한곳에 모았습니다.

엔지니어링 노트 · DB 연결과 OwlDB
운영 DB가 사설망 안에 있고 그 앞에 배스천 호스트(사설망으로 들어가는 SSH 서버)가 있으면, OwlAI는 배스천을 거치는 SSH 터널로 DB에 붙습니다.

엔지니어링 노트 · DB 연결과 OwlDB
기업망에 설치한 OwlAI가 클라우드 LLM이나 고객 DB에 TLS로 붙을 때, 인증서 오류가 나는 경우는 크게 둘입니다.

엔지니어링 노트 · DB 연결과 OwlDB
OwlAI SaaS에서 고객의 Amazon RDS·Aurora를 연결하려면 엔드포인트·포트·엔진과 함께 DB가 공개 서브넷에 있는지, 어느 VPC·보안 그룹에 속하는지 같은 망 정보가 필요합니다.

엔지니어링 노트 · DB 연결과 OwlDB
Supabase 대시보드에는 같은 DB로 가는 주소가 셋 있습니다.

엔지니어링 노트 · DB 연결과 OwlDB
AI에게 사내 DB를 열어 주려면 관리자가 호스트·포트·계정·비밀번호를 OwlAI에 입력합니다.

엔지니어링 노트 · DB 연결과 OwlDB
관리자가 영업팀 역할에 고객·주문 테이블만 열고, 같은 DB에 있는 연봉 테이블은 닫았다고 합시다. AI가 쓴 SQL에서 테이블 이름을 뽑아 허용 목록과 대조하는 검사는 SQL 글자만 봅니다.

엔지니어링 노트 · DB 연결과 OwlDB
AI가 쓴 SQL이 운영 DB를 오래 붙잡으면 같은 DB를 쓰는 주문 화면과 정산 배치가 함께 느려집니다.

엔지니어링 노트 · DB 연결과 OwlDB
AI 조회를 주 노드에서 떼어 내려고 연결을 스탠바이 주소로 등록하면, 실행할 노드는 등록하는 순간에 정해집니다. 그 뒤 노드 역할이 바뀌어도 연결은 같은 주소를 읽습니다.

엔지니어링 노트 · DB 연결과 OwlDB
OwlAI가 고객 DB에서 SQL을 실행하는 길은 둘입니다.
4부
개인과 팀의 지식이 쌓여 답이 나아지는 메모리 설계와, 문서 검색·딥 리서치·출처 설계를 다룹니다.

엔지니어링 노트 · 메모리와 검색
사용자가 「이슈 트래커에서 제 계정은 이 ID예요. 앞으로 내 이슈는 이걸로 찾아 주세요」라고 하면 모델은 「기억하겠습니다」라고 답합니다.

엔지니어링 노트 · 메모리와 검색
고객 테이블의 상태 컬럼 STATCD 에는 1, 2, 9가 들어 있습니다. 스키마만 봐서는 9가 해지라는 것을 알 수 없어서, 「활성 고객 수」를 물으면 모델은 해지 고객까지 세어 보고서에 올립니다.

엔지니어링 노트 · 메모리와 검색
테이블 메모에 「반품 주문은 ORDRTN 테이블에 따로 쌓인다」라고 적혀 있고, 사용자가 「지난달 반품 주문 건수를 알려 줘」라고 묻습니다.

엔지니어링 노트 · 메모리와 검색
에이전트가 모델을 부를 때마다 요청에는 도구 정의, 시스템 프롬프트, 그때까지의 대화 맥락이 이 순서로 실립니다.

엔지니어링 노트 · 메모리와 검색
OwlAI SaaS에서는 여러 조직이 PostgreSQL DB 하나를 나눠 씁니다. 한 사람이 두 조직에 속할 수도 있습니다. 이 구조에서 조직을 가르는 일을 쿼리마다 맡기면 두 군데서 깨집니다.

엔지니어링 노트 · 메모리와 검색
「연차는 다음 해로 며칠까지 넘길 수 있나요?」를 사내 규정 문서에서 임베딩으로만 찾으면 연차 신청 절차, 휴가 종류 안내, 작년 공지가 위에 섭니다. 셋 다 연차를 다루니 질문 벡터와 가깝습니다.

엔지니어링 노트 · 메모리와 검색
"제품 세 개의 지난 분기 장애 원인을 정리하고, 원인마다 업계가 어떻게 대응했는지 비교해 달라"는 질문은 한 번 검색해서 끝나지 않습니다. 사내 DB 세 곳과 문서, 웹을 따로 뒤져야 합니다.

엔지니어링 노트 · 메모리와 검색
한 답에 웹 페이지, 사내 문서, DB에서 조회한 레코드, 커넥터(MCP)가 돌려준 티켓이 함께 실리면 출처를 어떻게 달지가 문제가 됩니다.

엔지니어링 노트 · 메모리와 검색
사용자가 300행짜리 단가표가 든 한글 문서를 올리고 「품목군별 평균 단가를 알려 줘」라고 물으면, 문서 검색(RAG)은 질문과 비슷한 청크 몇 개를 돌려줍니다.
5부
멀티턴, 캐시, 압축, 턴 도중 메시지처럼 대화가 돌아가는 내부 구조를 다룹니다.

엔지니어링 노트 · 대화 엔진
모델 API는 호출 사이에 아무것도 기억하지 않습니다. 그래서 에이전트는 모델을 부를 때마다 시스템 프롬프트, 도구 정의, 그때까지의 대화 맥락을 전부 다시 보냅니다.

엔지니어링 노트 · 대화 엔진
OpenAI Responses API는 store를 따로 정하지 않은 응답을 프로바이더 서버에 저장하고, 공식 문서는 그 응답이 적어도 30일 남는다고 밝힙니다(2026-11-03 확인).

엔지니어링 노트 · 대화 엔진
사용자가 「지난달 거래처별 매출 상위 10곳」을 물었는데, 모델이 국내 거래처만 담긴 테이블을 조회해 답했다고 해 보겠습니다.

엔지니어링 노트 · 대화 엔진
딥 리서치는 한 턴이 기본 한 시간까지 돕니다. 턴은 질문 하나를 받아 답을 내기까지의 한 번의 질의응답입니다.

엔지니어링 노트 · 대화 엔진
모델 API는 호출 사이에 아무것도 기억하지 않아서 에이전트는 라운드마다 대화 맥락 전체를 다시 보냅니다. 라운드는 모델을 한 번 부르고 그 응답에 든 도구 호출을 실행하기까지를 말합니다.

엔지니어링 노트 · 대화 엔진
대화가 길어지면 요청은 언젠가 모델이 받을 수 있는 입력 상한에 닿습니다. 그 전에 오래된 턴을 요약하거나 덜어 내야 하는데, 이 일을 대화 압축(compaction)이라고 부릅니다.

엔지니어링 노트 · 대화 엔진
수십만 행을 돌려준 조회나 MCP 서버가 보낸 거대한 JSON처럼, 도구 결과 하나가 모델의 입력 상한을 한 번에 넘을 때가 있습니다.

엔지니어링 노트 · 대화 엔진
에이전트가 부르는 도구가 매번 성공하는데도 일이 나아가지 않을 때가 있습니다. 문서 검색 도구에 검색어를 조금씩 바꿔 넣으면 인자는 매번 다르지만 돌아오는 문서는 같습니다.
6부
업무 자동화, 데이터 이동, 도구 설계, 문서·다이어그램 생성, 서브에이전트를 다룹니다.

엔지니어링 노트 · 도구와 실행
지난주 매출을 DB에서 뽑아 부서별로 묶고 엑셀로 만드는 일이 채팅에서 한 번 잘 풀렸다고 해 보겠습니다. 그 대화에는 결과만 있지 않습니다.

엔지니어링 노트 · 도구와 실행
「지난주에 열린 이슈마다 고객사 계약을 조회해서, 계약이 끝난 고객사의 이슈에만 담당자에게 메일을 보내 줘」라는 일은 앞 결과로 다음 인자를 만드는 호출이 사슬로 이어집니다.

엔지니어링 노트 · 도구와 실행
사내 양식으로 견적서를 만드는 일은 두 단계입니다. 양식을 새 경로로 복사하고, 그 사본에 값을 채웁니다. 복사를 모델이 따로 부르는 도구로 두면 모델은 이 단계를 자주 건너뜁니다.

엔지니어링 노트 · 도구와 실행
모델이 코드로 엑셀 파일을 만들면 실행은 종료 코드 0으로 끝나고 모델은 「완성했습니다」라고 답하는데, 정작 Excel은 그 파일을 열지 못할 수 있습니다.

엔지니어링 노트 · 도구와 실행
에이전트에게 도구를 주려면 도구마다 이름, 설명, 인자 스키마로 된 정의를 요청에 실어야 합니다. 고객사가 MCP 서버를 연결할수록 이 정의가 불어납니다.

엔지니어링 노트 · 도구와 실행
모델에게 막대 차트를 SVG로 그리게 하면, 모델은 막대마다 값을 눈금에 맞춰 높이로 바꾸고 그 좌표를 씁니다.

엔지니어링 노트 · 도구와 실행
서브에이전트를 붙이는 흔한 방법은 부모 모델에게 서브에이전트를 띄우는 도구를 주고, 프롬프트와 도구와 모델을 띄울 때마다 부모가 정하게 하는 것입니다.
7부
회의 녹음, 음성 인식, 회의 용어집, 회의록 정리, 음성 보관을 다룹니다.

엔지니어링 노트 · 음성과 회의
회의 녹음을 받아쓰면 사내 시스템 이름과 제품명이 소리가 비슷한 흔한 낱말로 적힙니다. 협업 도구 「노션」이 「로션」이 되는 식입니다.

엔지니어링 노트 · 음성과 회의
구축형에서는 여러 회의가 GPU 한 대에서 도는 음성 인식 모델을 나눠 씁니다. 10시 정각에 회의 여덟 개가 함께 시작하면 5분이 지날 때마다 거의 같은 시각에 구간 요약 여덟 건이 생깁니다.

엔지니어링 노트 · 음성과 회의
회의를 끝내는 순간에도 아직 받아쓰지 못한 소리가 남아 있습니다.

엔지니어링 노트 · 음성과 회의
회의 녹음은 브라우저 탭 하나에서 한 시간 넘게 돕니다.

엔지니어링 노트 · 음성과 회의
회의 음성 인식 서비스를 글자 오류율 표 하나로 고르면 두 곳에서 탈이 납니다.
8부
결정론으로 막고, 지침으로 이끌고, 감사로 확인한다는 원칙이 보안에서 어떻게 구현되는지 다룹니다. 반출 통제, 인젝션 방어, 개인정보 마스킹, 공통 출력 경계, 자격증명, 실행 격리, 승인 게이트, 외부 도구 정책, 권한과 감사를 한곳에 모았습니다.

엔지니어링 노트 · 보안과 감사
고객사 망 안에 띄운 모델과 외부 API 모델을 한 설치에 함께 두면, 쓸 모델을 정해 두는 것만으로는 사내 데이터가 밖으로 나가는 일을 막지 못합니다.

엔지니어링 노트 · 보안과 감사
웹 페이지를 읽거나 주소에서 파일을 받는 도구는 대화에 먼저 나온 주소만 엽니다(「권한은 코드로 막고, 판단은 모델에 맡긴다」).

엔지니어링 노트 · 보안과 감사
「지난주에 환불을 세 번 넘게 요청한 고객을 찾아 문의 내용을 정리해 줘」라는 질문은 숫자 하나로 끝나지 않습니다.

엔지니어링 노트 · 보안과 감사
고객 문의를 분석하는 대화에서, 원문 열람 권한이 없는 사람이 보는 답변에는 전화번호가 [전화번호-1]로 가려져 있습니다(「답변에서 지운 전화번호도 모델은 이미 읽었다, 도구 결과에서 가린다」).

엔지니어링 노트 · 보안과 감사
클라우드 파일 서비스의 커넥터(MCP 서버처럼 회사가 OwlAI에 연결한 외부 서비스)는 파일을 내려받을 주소를 사전 인증 URL(presigned URL)로 돌려줍니다.

엔지니어링 노트 · 보안과 감사
OwlAI의 메타데이터 DB에는 고객 DB 비밀번호, LLM 프로바이더의 API 키, 커넥터(MCP 서버처럼 회사가 OwlAI에 연결한 외부 서비스)의 OAuth 토큰, DB 연결에 쓰는 SSH 개인 키가 들어 있습니다.

엔지니어링 노트 · 보안과 감사
OwlAI에서 엑셀·워드·파워포인트·한글 문서는 모델이 쓴 python·node 스크립트가 만들고, 조회 결과의 후처리도 스크립트가 맡습니다. 이 스크립트는 사람이 검토하지 않고 실행됩니다.

엔지니어링 노트 · 보안과 감사
시스템 프롬프트에 「메일을 보내기 전에 사용자에게 확인하라」고 적어 두어도, 모델은 확인 없이 메일 도구를 부를 수 있습니다(「권한은 코드로 막고, 판단은 모델에 맡긴다」).

엔지니어링 노트 · 보안과 감사
OwlAI에서 커넥터(MCP 서버처럼 회사가 OwlAI에 연결한 외부 서비스)를 OAuth로 붙이면, 사용자는 각자 자기 계정으로 한 번 로그인하고 OwlAI는 그때 받은 액세스 토큰으로 도구를 부릅니다.

엔지니어링 노트 · 보안과 감사
OwlAI의 사용자별 커넥터(MCP 서버처럼 회사가 OwlAI에 연결한 외부 서비스)는 OAuth로 붙습니다.

엔지니어링 노트 · 보안과 감사
한 고객사가 사내 전자결재 시스템을 MCP 서버로 만들어 OwlAI에 커넥터(MCP 서버처럼 회사가 OwlAI에 연결한 외부 서비스)로 붙였다고 해 봅시다.

엔지니어링 노트 · 보안과 감사
AI 에이전트에게 사내 DB와 문서를 열어 주면 보안 담당자는 사고가 난 뒤에 이렇게 묻습니다. 지난달 영업팀의 누가 AI로 고객 테이블을 조회했는가, 그 사람에게 그 테이블을 볼 권한이 있었는가.
9부
설치, 반입, 업데이트, 운영 점검까지 구축형 도입에 필요한 기술 레퍼런스와, 설치형 AI 제품의 품질을 지키는 원칙을 다룹니다.

엔지니어링 노트 · 설치·운영과 품질
구축형 OwlAI는 고객이 고른 호스트 한 대에 Docker Compose로 올라갑니다. 배포판과 커널, 도커 판, 보안 모듈, 인증서는 고객마다 다릅니다.

엔지니어링 노트 · 설치·운영과 품질
구축형 OwlAI를 기업망 호스트에 설치하고 몇 주 뒤, 어제까지 붙던 사내 DB나 추론 서버에 컨테이너에서 닿지 않는 날이 올 수 있습니다. 같은 호스트의 셸에서도 닿지 않습니다.

엔지니어링 노트 · 설치·운영과 품질
사내 프록시로만 밖에 나갈 수 있는 기업망에 구축형 OwlAI를 설치하면, 클라우드 LLM으로 가는 호출은 HTTPSPROXY를 따라 프록시로 나가야 합니다.

엔지니어링 노트 · 설치·운영과 품질
구축형 OwlAI는 고객 호스트에서 컨테이너 이미지 아홉 종으로 뜹니다. 시험 환경에서 통과한 이미지와 고객 호스트에서 뜨는 이미지가 같은 바이트여야 시험 결과가 고객 설치에도 통합니다.

엔지니어링 노트 · 설치·운영과 품질
구축형 제품의 저장소에는 고객에게 줄 파일과 사내에만 둘 파일이 함께 있습니다.

엔지니어링 노트 · 설치·운영과 품질
회의를 녹음하면 브라우저는 5초마다 녹음 조각을 웹 백엔드로 올리고, 다른 컨테이너에서 도는 워커가 그 조각을 받아씁니다.

엔지니어링 노트 · 설치·운영과 품질
자체 호스팅 모델을 vLLM으로 서빙할 때 1.1K 토큰짜리 프롬프트로 벤치를 돌리면, 동시에 처리할 요청 수(maxnumseqs)를 4에서 32로 올리라는 결론이 나옵니다.

엔지니어링 노트 · 설치·운영과 품질
구축형 제품의 관리 화면에 업데이트 버튼을 달면 누군가는 컨테이너를 내리고 새 이미지로 다시 띄워야 하고, 웹 서버가 그 일을 직접 하려면 docker 소켓이 필요합니다.

엔지니어링 노트 · 설치·운영과 품질
업데이트가 실패하면 운영자는 먼저 이전 이미지로 다시 배포하려고 합니다. 이미지 재배포는 이미지만 되돌리고 DB 스키마는 그대로 둡니다.

엔지니어링 노트 · 설치·운영과 품질
OwlAI에서 채팅 턴(질문 하나에 답 하나가 끝나기까지)은 웹 서버가 아니라 워커가 돌립니다. 웹 서버는 질문을 받아 작업 큐에 넣기만 합니다.

엔지니어링 노트 · 설치·운영과 품질
/health가 200을 돌려주고 컨테이너가 모두 healthy여도 배포는 깨져 있을 수 있습니다.

엔지니어링 노트 · 설치·운영과 품질
구축형 제품은 고객사 서버에서 돕니다. 장애가 나면 개발사가 볼 수 있는 것은 고객사가 모아 둔 로그뿐인 경우가 많습니다.

엔지니어링 노트 · 설치·운영과 품질
화면이 설치본 안에 들어 있는 데스크톱 앱은 버튼 문구 하나를 고쳐도 설치본을 새로 내야 합니다. Windows 사용자는 릴리스마다 설치본을 받고 재시작 안내를 봅니다.

엔지니어링 노트 · 설치·운영과 품질
구축형 제품의 설정 파일에 기능을 켜고 끄는 불리언 칸을 두면, 그 값은 고객사 서버마다 따로 정해집니다.

엔지니어링 노트 · 설치·운영과 품질
OwlAI는 구축형 제품이라 설치 하나가 언어 하나로 돕니다. 지원 언어는 한국어와 영어입니다.

엔지니어링 노트 · 설치·운영과 품질
LLM이 들어간 제품에서 답 문장을 기대값과 글자로 비교하는 E2E 테스트는 아무 결함이 없어도 실패합니다.

엔지니어링 노트 · 설치·운영과 품질
OwlAI의 관리자는 사용자마다 사용 한도를 걸 수 있고, OwlAI SaaS는 호출마다 구성원의 크레딧을 줄입니다. 둘 다 제품이 스스로 기록한 LLM 비용을 읽습니다.