문서 작업 조종석
채팅, 방향을 고르는 옵션 카드, 보고서 미리보기, 표 양식 보관함을 보여준다. 손님이 주문하고 확인하는 매장이다.
실전 사례 02 · 보고서 제작 라인
“보고서 만들어줘” 한마디를 바로 문서로 찍어내지 않는다. 보고서 종류, 예시 문서, 분량 규칙, 지금까지의 작성 상태를 블록처럼 조립해 AI 책상 위에 올리고, AI가 쓴 원고를 코드가 DOCX로 인쇄한다. AI는 작가, Renderer는 인쇄소다.
부품은 수업에서 본 그대로다. 화면(매장), 주방(백엔드), 장부(DB)가 각자 역할을 맡는다.
채팅, 방향을 고르는 옵션 카드, 보고서 미리보기, 표 양식 보관함을 보여준다. 손님이 주문하고 확인하는 매장이다.
채팅 접수 → 프롬프트 조립 → Agent 초안 → 정리 → 렌더링이 정해진 순서로 돌아가는 주방이다.
작업 세션, 보고서 JSON, RAG 예시 조각, 표 템플릿, AI 호출 로그가 PostgreSQL 장부에 남는다.
보고서 생성은 “AI 한 번 호출”이 아니라 작업자가 이어받는 제작 라인이다. 수업의 색 약속 그대로, 파랑=자료, 주황=AI, 초록=저장, 회색=사람·코드다.
“이 자료로 임원 프로필 보고서를 만들어줘” 같은 요청과 현재 보고서 상태를 접수한다.
역할 규칙, 출입증 검사를 통과한 RAG 예시, 보고서 종류 설명, 분량 예산을 순서대로 붙인다.
기획자(Outline), 작가(FullDraft), 편집자(Patch), 표 담당(Table) Agent가 나눠서 초안 JSON을 쓴다.
AI가 쓴 JSON을 인쇄소가 읽을 수 있는 깨끗한 구조로 다듬는다. 오탈자 난 원고를 교정하는 손이다.
Renderer 코드가 DOCX와 미리보기를 찍어내고, 보고서 JSON과 호출 로그가 장부에 남는다.
카드를 누르면 해당 교시로 돌아가 복습할 수 있다.
과거 보고서 조각이 참고자료다. 지금 만드는 보고서 종류와 맞는 예시만 골라 책상에 올린다.
2교시 · LLM 초안을 쓰는 작가본문과 표 설명을 만든다. 하지만 최종 파일 배치는 Renderer라는 코드가 맡는다.
2교시 · 컨텍스트 현재 보고서 상태 유지이전 초안과 사용자의 선택지가 다음 요청 때 책상에 다시 올라간다. 그래서 대화가 이어진다.
1교시 · 토큰 분량 예산 (budget)글자 수, 문단 수를 예산표로 정해준다. 예산이 없으면 AI는 분량도 비용도 마음대로 쓴다.
5교시 · API 채팅 요청 통로화면이 주방에 “이 세션에서 이 메시지를 처리해줘”라는 주문서를 보내는 창구다.
6교시 · DB 보고서 JSON·호출 로그중간 저장이 있어야 수정과 재시도가 가능하다. 호출 로그는 작업 과정의 녹화본이다.
이 프로젝트의 핵심은 “프롬프트를 길게 쓴다”가 아니라 “필요한 블록을 정해진 순서로 조립한다”는 것이다.
1. 역할 규칙 (role gate)
지금 Agent가 기획자인지 작가인지
표 담당인지, 절대 규칙은 무엇인지.
2. RAG 예시 (retrieved examples)
출입증 검사를 통과한
과거 보고서 조각.
3. 보고서 종류 설명 (preset pack)
프로필 보고서란 무엇이고
어떤 구조를 갖는지.
4. 분량 예산 (budget)
글자 수, 문단 수, 스타일 수치.
5. 현재 보고서 상태 (current report)
지금까지 만든 outline과 본문.
6. 최종 출력 규칙 (final instruction)
JSON 형식과 금지 사항을 마지막에 잠근다.
검색 질문:
"프로필 보고서 리드박스와 인적사항 표 구조"
후보 예시가 붙으려면 하나는 통과해야 한다:
- 모든 보고서 공용 예시(tag: common)이거나
- 지금 만드는 종류(preset: profile)와 같거나
- 같은 계열(family/tag)이거나
- 같은 자리(slot)에 들어가는 예시여야 한다.
비유:
예시마다 출입증을 확인해서
다른 보고서 스타일이 섞여 들어오지 않게 한다.
검색만 믿으면 “비슷해 보이는” 엉뚱한
예시가 끼어든다.
5교시에서 본 API 주문 창구 그대로다. 화면이 주방에 주문서를 보내면, 주방이 AI 초안과 인쇄 준비 결과를 응답서로 돌려준다.
{
"session_id": "session_42",
"target_preset": "profile",
"agent": "full_draft",
"message": "이 자료로 임원 프로필 보고서를 만들어줘",
"current_report": {
"outline_ready": true,
"selected_option": "B"
}
}
{
"draft_json": {
"title": "임원 프로필 보고서",
"sections": ["리드박스", "경력", "핵심 평가"],
"table_briefs": ["인적사항 표"]
},
"retrieved_examples": 6,
"render_job_id": "job_771",
"usage_log_id": "llm_call_903"
}
2교시의 책상 그대로다. 색을 보면 어떤 종이가 자료(파랑)이고 어떤 종이가 AI의 답(주황)인지 보인다.
지금 Agent가 기획자인지 작가인지 정하고, 마지막에 JSON 출력 형식을 잠근다. 형식이 흔들리지 않게 하는 안전벨트다.
“이 자료로 임원 프로필 보고서를 만들어줘”와 화면에서 고른 옵션 B.
출입증 검사를 통과한 과거 보고서 조각. 복붙용이 아니라 스타일 학습용이다.
보고서 종류 설명, 글자 수 예산, 지금까지 만든 outline과 본문.
제목, 섹션, 표 브리프가 담긴 초안 JSON — 그리고 호출 로그 한 장.
6교시에서 배운 “역할별 장부 나누기”가 실전에서는 이렇게 된다.
| 장부 | 역할 | 비유 |
|---|---|---|
| chat_sessions | 작업 대화와 현재 상태 저장 | 작업 폴더 |
| drafts / saved_reports | 보고서 JSON과 저장본 | 문서 원고 |
| example_chunk_pools | RAG용 예시 보고서 조각 | 참고문헌 서랍 |
| table_library | 사용자 표 템플릿 저장 | 표 양식 보관함 |
| chat_llm_calls | 프롬프트와 응답 원문 로그 | 작업 녹화본 |
AI는 원고(JSON)를 만들고, Renderer 코드가 그 원고를 실제 DOCX 페이지로 찍어낸다. 둘을 섞어 생각하면 어디가 고장났는지 찾기 어렵다.
큰 프롬프트 하나보다 역할, 예시, 예산, 현재 상태, 출력 규칙을 나눠 붙이는 구조가 고치기도 운영하기도 쉽다.
검색으로 “비슷한 것”을 찾은 뒤에도 종류·계열·자리를 확인한다. 검사 없는 예시는 다른 스타일을 섞어 넣는 오염원이 된다.