✨ Update 02. Prompts with the latest refined prompts from D:\_Geulbeot
This commit is contained in:
@@ -1,13 +0,0 @@
|
||||
def format_date(date_str, source):
|
||||
try:
|
||||
if source in ["국토일보", "한건신문"]:
|
||||
# 기자 이름과 함께 있는 날짜 형식 처리
|
||||
date_obj = re.search(r'\d{4}-\d{2}-\d{2}', date_str)
|
||||
if date_obj:
|
||||
return date_obj.group(0)
|
||||
elif source in ["엔지니어링데일리", "건설이코노미뉴스", "공학저널"]:
|
||||
# 기자 이름과 함께 있는 날짜 형식 처리
|
||||
date_obj = re.search(r'\d{4}-\d{2}-\d{2}', date_str)
|
||||
if date_obj:
|
||||
return date_obj.group(0)
|
||||
elif source == "연합
|
||||
@@ -1,11 +0,0 @@
|
||||
def format_date(date_str: str, source: str) -> str:
|
||||
"""날짜 형식을 YYYY-MM-DD 로 변환"""
|
||||
try:
|
||||
match = re.search(r'\d{4}-\d{2}-\d{2}', date_str)
|
||||
if match:
|
||||
return match.group(0)
|
||||
if source == '연합뉴스':
|
||||
return datetime.strptime(date_str, '%m-%d %H:%M').strftime('2024-%m-%d')
|
||||
return date_str
|
||||
except Exception:
|
||||
return date_str
|
||||
@@ -1,13 +0,0 @@
|
||||
def summarize_data_for(section: str):
|
||||
texts = []
|
||||
for path in sorted(os.listdir(DATA_DIR)):
|
||||
with open(path, encoding="utf-8", errors="ignore") as f:
|
||||
texts.append(f.read())
|
||||
prompt = (
|
||||
f"다음 로우데이터를 바탕으로 ‘{section}’ 섹션에 들어갈 핵심 사실과 수치를 200~300자로 요약해주세요.\n\n"
|
||||
+ "\n\n".join(texts)
|
||||
)
|
||||
return call_claude(prompt)
|
||||
|
||||
|
||||
# ─── 4) 이미지 자동 매핑 ─────────────────────────
|
||||
@@ -1,20 +0,0 @@
|
||||
def is_likely_unit(cell_val):
|
||||
"""단위일 가능성 판별 (사용자 제안 로직)"""
|
||||
if not cell_val:
|
||||
return False
|
||||
val = str(cell_val).strip()
|
||||
|
||||
# 1. 빈 값 또는 너무 긴 텍스트 (단위는 보통 6자 이내)
|
||||
if not val or len(val) > 6:
|
||||
return False
|
||||
|
||||
# 2. 순수 숫자는 제외
|
||||
cleaned = val.replace('.', '').replace(',', '').replace('-', '').replace(' ', '')
|
||||
if cleaned.isdigit():
|
||||
return False
|
||||
|
||||
# 3. 수식은 제외
|
||||
if val.startswith('='):
|
||||
return False
|
||||
|
||||
# 4. 일반적인 계산 기호 및 정크 기호 제외
|
||||
@@ -1,12 +0,0 @@
|
||||
def fetch_article_content(url: str, source: str) -> str:
|
||||
"""단일 기사 본문 추출"""
|
||||
try:
|
||||
resp = requests.get(url, verify=False, timeout=10)
|
||||
resp.encoding = 'utf-8'
|
||||
resp.raise_for_status()
|
||||
soup = BeautifulSoup(resp.text, 'html.parser')
|
||||
paragraphs = soup.find_all('p')
|
||||
content = ' '.join(clean_text(p.get_text()) for p in paragraphs)
|
||||
content = content.replace('\n', ' ')
|
||||
if not content.strip():
|
||||
logging.warning(f'No content for
|
||||
@@ -1,8 +0,0 @@
|
||||
def analyze_references():
|
||||
files = sorted(os.listdir(REF_DIR))
|
||||
sys = "당신은 보고서 전문가입니다. 아래 파일명들을 보고, 이 프로젝트에 어울리는 보고서 스타일과 목차 구조를 요약해 주세요."
|
||||
usr = "파일 목록:\n" + "\n".join(files)
|
||||
return call_gpt(sys, usr)
|
||||
|
||||
|
||||
# ─── 2) 가이드라인에서 필수 섹션 추출 ───────────
|
||||
@@ -1,13 +0,0 @@
|
||||
def run_global_reconstruction(input_file):
|
||||
print("로그: 전체 시트 통합 데이터를 분석 중입니다...")
|
||||
df = pd.read_excel(input_file)
|
||||
|
||||
# 1. 전역 주소록 생성: (시트명, 셀위치) -> 값
|
||||
# 예: { ('A1', 'G105'): 30.901, ('철근집계', 'C47'): 159.263 }
|
||||
global_map = {}
|
||||
for _, row in df.iterrows():
|
||||
global_map[(str(row['시트명']), str(row['셀위치']))] = row['현재값']
|
||||
|
||||
def trace_logic(formula, current_sheet):
|
||||
if not isinstance(formula, str) or not formula.startswith("'="):
|
||||
return formula
|
||||
@@ -1,17 +0,0 @@
|
||||
def extract_all_contents(file_path):
|
||||
print(f"로그: 파일을 읽는 중입니다 (전체 내용 모드)...")
|
||||
# 수식과 값을 동시에 비교하기 위해 data_only=False로 로드
|
||||
wb = openpyxl.load_workbook(file_path, data_only=False)
|
||||
|
||||
all_content_data = []
|
||||
|
||||
for sheet_name in wb.sheetnames:
|
||||
ws = wb[sheet_name]
|
||||
print(f"\n" + "="*60)
|
||||
print(f"▶ 시트 탐색 중: [ {sheet_name} ]")
|
||||
print("="*60)
|
||||
|
||||
# 시트의 모든 셀을 하나하나 검사
|
||||
for row in ws.iter_rows():
|
||||
for cell in row:
|
||||
value = ce
|
||||
@@ -1,18 +0,0 @@
|
||||
def fetch_articles(
|
||||
base_url: str,
|
||||
article_sel: str,
|
||||
title_sel: str,
|
||||
date_sel: str,
|
||||
start_page: int,
|
||||
end_page: int,
|
||||
source: str,
|
||||
url_prefix: str = '',
|
||||
date_fmt_func=None
|
||||
) -> list:
|
||||
"""리스트 페이지 순회하며 메타데이터 및 본문 수집"""
|
||||
results = []
|
||||
for page in range(start_page, end_page + 1):
|
||||
try:
|
||||
page_url = f"{base_url}{page}"
|
||||
resp = requests.get(page_url, verify=False, timeout=10)
|
||||
soup = BeautifulSoup(resp.text, 'html.parser
|
||||
@@ -1,11 +0,0 @@
|
||||
def get_item_id_with_lookback(ws, row, col, section_start_row):
|
||||
"""멀티라인 대응 상향 번호 탐색 - 섹션 경계 존중"""
|
||||
for r in range(row, section_start_row - 1, -1):
|
||||
# 새로운 섹션을 만나면 탐색 중단
|
||||
f_val_check = str(ws.cell(row=r, column=6).value or "").strip()
|
||||
if r != row and re.match(r'^\(.*\)$|^\[.*\]$', f_val_check):
|
||||
break
|
||||
|
||||
# F열에서 번호 탐색
|
||||
if re.search(ID_MARKER_PATTERN, f_val_check):
|
||||
return re.search(ID_MARKER_PATTERN, f_val_check).group()
|
||||
@@ -1,14 +0,0 @@
|
||||
def collect_app_usage(days_back):
|
||||
server = 'localhost'
|
||||
log_type = 'Security'
|
||||
hand = win32evtlog.OpenEventLog(server, log_type)
|
||||
flags = win32evtlog.EVENTLOG_BACKWARDS_READ | win32evtlog.EVENTLOG_SEQUENTIAL_READ
|
||||
|
||||
usage_records = []
|
||||
cutoff_date = datetime.datetime.now() - datetime.timedelta(days=days_back)
|
||||
|
||||
events = True
|
||||
while events:
|
||||
events = win32evtlog.ReadEventLog(hand, flags, 0)
|
||||
for ev_obj in events:
|
||||
event_time = ev_obj.TimeGenerated
|
||||
@@ -1,11 +0,0 @@
|
||||
def extract_must_have_sections():
|
||||
texts = []
|
||||
for path in sorted(os.listdir(GUIDELINE_DIR)):
|
||||
with open(path, encoding="utf-8", errors="ignore") as f:
|
||||
texts.append(f.read())
|
||||
sys = "법령·지침 문서를 바탕으로, 보고서에 반드시 들어가야 할 섹션(목차)을 순서대로 나열해 주세요."
|
||||
usr = "\n\n---\n\n".join(texts)
|
||||
return call_gpt(sys, usr).splitlines()
|
||||
|
||||
|
||||
# ─── 3) 로우데이터에서 섹션별 내용 뽑기 ───────────
|
||||
@@ -1,16 +0,0 @@
|
||||
def pick_images_for(section: str):
|
||||
names = sorted(os.listdir(IMAGE_DIR))
|
||||
prompt = (
|
||||
f"보고서 ‘{section}’ 섹션에 적합한 이미지를 아래 목록에서 1~2개 추천해 파일명만 리턴하세요:\n"
|
||||
+ "\n".join(names)
|
||||
)
|
||||
resp = call_gpt("당신은 디자인 어시스턴트입니다.", prompt)
|
||||
picked = []
|
||||
for line in resp.splitlines():
|
||||
fn = line.strip()
|
||||
if fn in names:
|
||||
picked.append(fn)
|
||||
return picked
|
||||
|
||||
|
||||
# ─── 5) 디자인 템플릿 선택 ───────────────────────
|
||||
@@ -1,13 +0,0 @@
|
||||
class SslAdapter(HTTPAdapter):
|
||||
def init_poolmanager(self, *args, **kwargs):
|
||||
ctx = ssl.create_default_context()
|
||||
ctx.set_ciphers('DEFAULT:@SECLEVEL=1')
|
||||
self.poolmanager = PoolManager(*args, ssl_context=ctx, **kwargs)
|
||||
|
||||
session = requests.Session()
|
||||
session.mount('https://', SslAdapter())
|
||||
headers = {'User-Agent': 'Mozilla/5.0', 'Accept-Language': 'ko-KR,ko;q=0.9'}
|
||||
|
||||
# -------------------------------------------------
|
||||
# 사이트별 함수 (대한경제 제외)
|
||||
# -----------------------------------
|
||||
@@ -1,7 +0,0 @@
|
||||
def get_detail_content(detail_url):
|
||||
res = requests.get(detail_url)
|
||||
soup = BeautifulSoup(res.text, 'html.parser')
|
||||
div = soup.find('div', {'data-v-5cb2d9fe': True})
|
||||
if div and div.find('h2'):
|
||||
return div.find('h2').text.strip()
|
||||
return "설명이 없습니다."
|
||||
@@ -1,11 +0,0 @@
|
||||
def fetch_dnews_articles(base_url, start_page, end_page):
|
||||
# Selenium WebDriver 설정
|
||||
options = webdriver.ChromeOptions()
|
||||
options.add_argument('--headless') # 브라우저가 뜨지 않게 설정
|
||||
options.add_argument('--no-sandbox')
|
||||
options.add_argument('--disable-dev-shm-usage')
|
||||
|
||||
# ChromeDriver 경로 설정
|
||||
chromedriver_path = 'D:/python_for crawling/webdriver/chromedriver-win64/chromedriver.exe' # ChromeDriver 경로 설정
|
||||
service = ChromeService(executable_path=chromedriver_path)
|
||||
driver = webdr
|
||||
@@ -1,17 +0,0 @@
|
||||
def extract_raw_constants(file_path):
|
||||
# 수식 자체가 아닌 입력된 값을 확인하기 위해 로드
|
||||
print(f"로그: 파일을 읽는 중입니다...")
|
||||
wb = openpyxl.load_workbook(file_path, data_only=False)
|
||||
|
||||
raw_data = []
|
||||
|
||||
for sheet_name in wb.sheetnames:
|
||||
ws = wb[sheet_name]
|
||||
print(f"\n" + "="*50)
|
||||
print(f"▶ [ {sheet_name} ] 시트의 원천 데이터(상수) 추출 시작")
|
||||
print("="*50)
|
||||
|
||||
for row in ws.iter_rows():
|
||||
for cell in row:
|
||||
value = cell.value
|
||||
coord = cell.coordin
|
||||
@@ -1,11 +0,0 @@
|
||||
def reconstruct_formula(formula, wb_v, sheet_name):
|
||||
"""수식 내 셀 주소를 실제 값으로 치환 및 기호 가독화"""
|
||||
if not formula or not str(formula).startswith('='): return str(formula)
|
||||
ref_pattern = r"(?:'([^']+)'|([a-zA-Z0-9가-힣]+))?!([A-Z]+\d+)|([A-Z]+\d+)"
|
||||
|
||||
def replace_with_value(match):
|
||||
s_name = match.group(1) or match.group(2) or sheet_name
|
||||
coord = match.group(3) or match.group(4)
|
||||
try:
|
||||
val = wb_v[s_name][coord].value
|
||||
if val is None: return "0"
|
||||
@@ -1,14 +0,0 @@
|
||||
def extract_excel_logic(file_path):
|
||||
# 1. 수식을 가져오기 위한 로드 (data_only=False)
|
||||
print(f"로그: 파일을 읽는 중입니다 (수식 모드)...")
|
||||
wb_formula = openpyxl.load_workbook(file_path, data_only=False)
|
||||
|
||||
# 2. 결과값을 가져오기 위한 로드 (data_only=True)
|
||||
print(f"로그: 파일을 읽는 중입니다 (데이터 모드)...")
|
||||
wb_value = openpyxl.load_workbook(file_path, data_only=True)
|
||||
|
||||
extraction_data = []
|
||||
|
||||
for sheet_name in wb_formula.sheetnames:
|
||||
ws_f = wb_formula[sheet_name]
|
||||
ws_v = wb_value[sheet_name]
|
||||
@@ -1,11 +0,0 @@
|
||||
def choose_design_template():
|
||||
samples = sorted(os.listdir(DESIGN_DIR))
|
||||
prompt = (
|
||||
"아래 디자인 샘플 파일들 중 이 보고서에 어울리는 상위 3안(1안,2안,3안)을 "
|
||||
"순서대로 파일명만으로 알려주세요:\n" + "\n".join(samples)
|
||||
)
|
||||
lines = call_gpt("디자인 전문가입니다.", prompt).splitlines()
|
||||
return [ln.strip() for ln in lines if ln.strip() in samples][:3]
|
||||
|
||||
|
||||
# ─── PPT 생성 ────────────────────────────────────
|
||||
@@ -1,13 +0,0 @@
|
||||
def clean_text(text):
|
||||
replacements = {
|
||||
' ': ' ', '‘': "'", '’': "'", '“': '"', '”': '"',
|
||||
'&': '&', '<': '<', '>': '>', ''': "'",
|
||||
'"' : "'", '·': "'"
|
||||
}
|
||||
|
||||
for entity, replacement in replacements.items():
|
||||
text = text.replace(entity, replacement)
|
||||
|
||||
text = re.sub(r'<[^>]+>', '', text)
|
||||
text = re.sub(r'\(엔지니어링데일리\).*?기자=', '', text) # (엔지니어링데일리) *** 기자= 패턴 삭제
|
||||
text = re.sub(r'\[국토일보\s.*?
|
||||
@@ -1,9 +0,0 @@
|
||||
def clean_text(text: str) -> str:
|
||||
"""HTML 엔티티 및 불필요한 태그 제거"""
|
||||
reps = {
|
||||
' ': ' ', '‘': "'", '’': "'", '“': '"', '”': '"',
|
||||
'&': '&', '<': '<', '>': '>', ''': "'", '"': "'", '·': "'"
|
||||
}
|
||||
for key, val in reps.items():
|
||||
text = text.replace(key, val)
|
||||
return re.sub(r'<[^>]+>', '', text).strip()
|
||||
@@ -1,11 +0,0 @@
|
||||
def fetch_article_content(article_url, source):
|
||||
try:
|
||||
response = requests.get(article_url, verify=False, timeout=10) # SSL 인증서 검증 비활성화 및 타임아웃 설정
|
||||
response.encoding = 'utf-8' # 인코딩 설정
|
||||
response.raise_for_status()
|
||||
soup = BeautifulSoup(response.text, 'html.parser')
|
||||
paragraphs = soup.find_all('p')
|
||||
content = ' '.join([clean_text(p.get_text()) for p in paragraphs])
|
||||
|
||||
# 텍스트 내의 엔터키를 스페이스로 대체
|
||||
content = content.replace('\n', ' ')
|
||||
@@ -1,14 +0,0 @@
|
||||
def get_category_and_content(detail_url):
|
||||
res = requests.get(detail_url)
|
||||
soup = BeautifulSoup(res.text, 'html.parser')
|
||||
|
||||
# 카테고리
|
||||
category_tags = soup.select('ul.flex.flex-row.flex-wrap.gap-2 li a')
|
||||
categories = [tag['href'].split('/')[-2] for tag in category_tags]
|
||||
|
||||
# 내용
|
||||
content_div = soup.select_one('div.content-base.workflow-description.text-md')
|
||||
if content_div:
|
||||
content_text = content_div.get_text(separator=' ', strip=True)
|
||||
else:
|
||||
content_text =
|
||||
@@ -1,14 +0,0 @@
|
||||
def build_ppt(sections, images_map, templates):
|
||||
prs = Presentation()
|
||||
prs.slide_width, prs.slide_height = Inches(8.27), Inches(11.69) # A4
|
||||
|
||||
# 커버 슬라이드
|
||||
slide = prs.slides.add_slide(prs.slide_layouts[6])
|
||||
tb = slide.shapes.add_textbox(Inches(1), Inches(2), Inches(6.27), Inches(2))
|
||||
p = tb.text_frame.paragraphs[0]
|
||||
p.text = "🚀 자동 보고서"
|
||||
p.font.size = Pt(26); p.font.bold = True
|
||||
|
||||
# 본문 슬라이드
|
||||
for sec in sections:
|
||||
slide = prs.slides.add_slide(prs.slide_layouts[6]
|
||||
@@ -1,15 +0,0 @@
|
||||
def find_unit_from_sum_cell(ws, sum_row, max_col):
|
||||
"""
|
||||
합계 셀 기준 단위 탐색
|
||||
- 오른쪽 열 우선, 위쪽 방향 탐색
|
||||
- 대분류 경계 무시 (합계 기준으로만 판단)
|
||||
"""
|
||||
# 오른쪽 열부터 왼쪽으로
|
||||
for c in range(max_col, 0, -1):
|
||||
# 합계 행부터 위쪽으로
|
||||
for r in range(sum_row, 0, -1):
|
||||
cell_val = ws.cell(row=r, column=c).value
|
||||
if is_likely_unit(cell_val):
|
||||
return str(cell_val).strip()
|
||||
|
||||
return ""
|
||||
@@ -1,7 +0,0 @@
|
||||
<h3>3-2. 가계: 고금리 피크아웃, 하지만 체감 회복은 느리다</h3>
|
||||
<p>기준금리는 정점을 지나 완만히 낮아지는 방향이지만, 과거 초저금리 시대와 비교하면 여전히 높은 수준이다.</p>
|
||||
<ul>
|
||||
<li>물가는 2022~2023년 고점에 비해 안정되었지만, 체감 물가는 여전히 높다.</li>
|
||||
<li>임금 상승률은 개선되고 있지만, 금리와 물가를 감안한 실질소득 개선 속도는 빠르지 않다.</li>
|
||||
<li>부동산은 급등기와 급락기를 지나 재조정 국면에 있으나, 지역·유형별 격차가 크다.</li>
|
||||
</ul>
|
||||
@@ -1,10 +0,0 @@
|
||||
|
||||
<!DOCTYPE html>
|
||||
<html lang="ko">
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
<title>경제 진단 보고서</title>
|
||||
|
||||
<style>
|
||||
@import url('https://fonts.googleapis.com/css2?family=Noto+Sans+KR:wght@300;400;700&display=swap');
|
||||
@@ -1,7 +0,0 @@
|
||||
<h3>2-4. 구조적 요인: 인구, 생산성, 부동산, 가계부채</h3>
|
||||
<p>한국 경제의 장기 과제를 요약하면 인구, 생산성, 자산, 부채 네 가지 키워드로 정리할 수 있다.</p>
|
||||
<p>첫째, 인구. 한국의 합계출산율은 0.7명 안팎으로 세계 최저 수준이다.</p>
|
||||
<p>둘째, 생산성. 제조업 상위 기업들은 세계 최고 수준의 경쟁력을 유지하고 있지만, 중소기업, 서비스업, 지방 경제의 생산성은 상대적으로 정체되어 있다.</p>
|
||||
<p>셋째, 부동산. 주택 가격은 일부 조정을 거쳤지만, 장기적으로 여전히 소득에 비해 높은 수준이다.</p>
|
||||
<p>넷째, 가계부채. GDP 대비 가계부채 비율은 여전히 주요국 상위권이다.</p>
|
||||
</section>
|
||||
@@ -1,5 +0,0 @@
|
||||
<div class="shortcut-hint" id="shortcutHint">
|
||||
<div><kbd>Ctrl</kbd>+<kbd>B</kbd> 굵게 | <kbd>Ctrl</kbd>+<kbd>I</kbd> 기울임 | <kbd>Ctrl</kbd>+<kbd>U</kbd> 밑줄</div>
|
||||
<div><kbd>Ctrl</kbd>+<kbd>+</kbd> 자간↑ | <kbd>Ctrl</kbd>+<kbd>-</kbd> 자간↓ | <kbd>Ctrl</kbd>+<kbd>S</kbd> 저장</div>
|
||||
<div style="margin-top: 5px; color: #00C853;">💡 본문 <kbd>Enter</kbd> → 새 문단 | <kbd>Backspace</kbd> → 병합</div>
|
||||
</div>
|
||||
@@ -1,6 +0,0 @@
|
||||
<div class="b-figure"></div>
|
||||
<div class="b-caption">[그림] [캡션]</div>
|
||||
</div>
|
||||
</div>
|
||||
`;
|
||||
}
|
||||
@@ -1,12 +0,0 @@
|
||||
/* 표, 그림은 전체폭이며 잘리지 않게 */
|
||||
.sheet .body-content table,
|
||||
.sheet .body-content figure{
|
||||
width: 100%;
|
||||
}
|
||||
.sheet .body-content table th{
|
||||
background: var(--b-light) !important;
|
||||
color: var(--b-accent) !important;
|
||||
}
|
||||
`;
|
||||
doc.head.appendChild(style);
|
||||
}
|
||||
@@ -1,8 +0,0 @@
|
||||
<section id="global-overview">
|
||||
<h2>1. 글로벌 경제: 위기는 피했지만, 활력도 제한적인 “완만한 성장”</h2>
|
||||
<h3>1-1. 성장률: 3%대 초반의 ‘애매한 회복’</h3>
|
||||
<p>국제통화기금(IMF)은 2025년 세계 경제 성장률을 약 3.0~3.2% 수준으로 전망한다. 2024년 3.3%에서 2025년 3.2%, 2026년 3.1%로 완만하게 둔화되는 그림이다. 선진국은 1.5% 내외, 신흥국은 4%를 조금 웃도는 수준으로 양극화된 성장 구조가 이어질 것으로 평가된다.</p>
|
||||
<p>큰 틀에서 보면 팬데믹 이후 “심각한 글로벌 침체” 시나리오는 피했지만, 세계은행이 지적하듯 향후 몇 년간의 성장률은 글로벌 금융위기 이후 평균보다도 낮은, “장기 저성장 트렌드”에 가까운 모습을 보이고 있다.</p>
|
||||
|
||||
<h3>1-2. 물가와 금리: 인플레이션은 진정, 그러나 금리는 과거보다 높은 수준에서 고착</h3>
|
||||
<
|
||||
@@ -1,6 +0,0 @@
|
||||
<div class="b-footer">
|
||||
<span>[날짜]</span>
|
||||
<span>[호수]</span>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
@@ -1,5 +0,0 @@
|
||||
/* A, B의 대략 색감만 아주 약하게 */
|
||||
.preview-a4.a .accent{ height:2px; background:#006400; opacity:0.55; margin:4px 0 6px; }
|
||||
.preview-a4.b .accent{ height:2px; background:#e53935; opacity:0.55; margin:4px 0 6px; }
|
||||
</style>
|
||||
</head>
|
||||
@@ -1,9 +0,0 @@
|
||||
/* 대제목(H1)은 전체폭 */
|
||||
.sheet .body-content .b-top h1,
|
||||
.sheet .body-content .b-col h1{
|
||||
color: var(--b-primary) !important;
|
||||
border-bottom: 2px solid var(--b-primary) !important;
|
||||
margin: 0 0 10px 0;
|
||||
font-size: 18pt;
|
||||
font-weight: 900;
|
||||
}
|
||||
@@ -1,3 +0,0 @@
|
||||
<div class="b-lead">
|
||||
[리드문] [리드문] [리드문]
|
||||
</div>
|
||||
@@ -1,5 +0,0 @@
|
||||
<h3>1-3. 리스크 요인: 무역갈등, 지정학, 고부채</h3>
|
||||
<p>글로벌 전망에서 반복적으로 등장하는 키워드는 “정책 불확실성”이다. IMF는 2025년 4·10월 보고서에서, 관세 인상과 공급망 재편, 지정학적 긴장 고조가 향후 성장률을 추가로 깎아먹을 수 있는 하방 리스크라고 지적한다.</p>
|
||||
<p>두 번째 리스크는 고부채다. 코로나 위기 대응 과정에서 확대한 정부지출과 이후의 고금리 환경이 결합되면서 많은 국가의 재정 상태가 빠르게 악화되었다.</p>
|
||||
<p>마지막으로, 디지털 전환과 에너지 전환(탈탄소화)은 장기적으로는 성장 잠재력을 키우는 요인이지만, 단기적으로는 막대한 투자 비용과 산업 구조조정을 수반한다.</p>
|
||||
</section>
|
||||
@@ -1,11 +0,0 @@
|
||||
<script>
|
||||
let isEditable = false;
|
||||
let iframe = null;
|
||||
let currentFileName = "report.html";
|
||||
let currentReportTitle = "Report";
|
||||
let activeBlock = null;
|
||||
const historyStack = [];
|
||||
const redoStack = [];
|
||||
const MAX_HISTORY = 50;
|
||||
let sourceHtml = ""; // 마지막으로 로드한 원본 HTML
|
||||
let droppedAssets = new Map(); // 드롭된 부가 파일들(이미지 등) 이름 -> blob URL
|
||||
@@ -1,3 +0,0 @@
|
||||
<div class="toast" id="toast">메시지</div>
|
||||
<div class="loading" id="loading"><div class="spinner"></div><div>처리 중...</div></div>
|
||||
<input type="file" id="fileInput" accept=".html,.htm" onchange="handleFile(event)">
|
||||
@@ -1,10 +0,0 @@
|
||||
<!-- 목차 -->
|
||||
<div class="preview-a4">
|
||||
<div class="pad">
|
||||
<div class="h1">[목차]</div>
|
||||
<div class="toc-l1">1. [대목차]</div>
|
||||
<div class="toc-l2">1.1 [중목차]</div>
|
||||
<div class="toc-l3">1.1.1 [소목차]</div>
|
||||
<div class="toc-l3">1.1.2 [소목차]</div>
|
||||
<div class="toc-l1">2. [대목차]</div>
|
||||
<div class="toc-
|
||||
@@ -1,10 +0,0 @@
|
||||
<body>
|
||||
<div class="app">
|
||||
<aside class="sidebar">
|
||||
<div class="sidebar-header">
|
||||
<div class="logo">📝 문서 편집기 <span class="logo-sub">Word Style v2</span></div>
|
||||
<button class="btn" onclick="openFile()">📂 파일 열기</button>
|
||||
<button class="btn" onclick="openPasteModal()" style="border-color:#555;">📋 코드 붙여넣기</button>
|
||||
</div>
|
||||
<div class="sidebar-content">
|
||||
<div style="padding: 8px; font-size: 11px; co
|
||||
@@ -1,3 +0,0 @@
|
||||
<h3>2-2. 물가와 금리: 2% 초반 물가, 완화 기조에서 다시 “신중 모드”로</h3>
|
||||
<p>한국의 물가는 2022~2023년 고물가 국면을 지나 2024년 이후 뚜렷한 안정세를 보였고, 2025년에는 2% 안팎에서 움직일 것이라는 전망이 우세하다.</p>
|
||||
<p>한동안 완화 기조로 전환하던 한국은행은 최근 원화 약세와 다시 높아지는 물가 압력을 이유로 기준금리를 2.50% 수준에서 동결하고, “추가 인하에 매우 신중한 입장”으로 한 걸음 물러섰다.</p>
|
||||
@@ -1,6 +0,0 @@
|
||||
function cloneMoveChildrenToList(doc, parentEl) {
|
||||
if (!parentEl) return [];
|
||||
const arr = [];
|
||||
Array.from(parentEl.children).forEach(ch => arr.push(ch));
|
||||
return arr;
|
||||
}
|
||||
@@ -1,7 +0,0 @@
|
||||
<div class="format-bar" id="formatBar">
|
||||
<select class="format-select" id="fontFamily" onchange="applyFontFamily(this.value); restoreSelection();">
|
||||
<option value="Noto Sans KR">본고딕</option>
|
||||
<option value="Malgun Gothic">맑은 고딕</option>
|
||||
<option value="serif">명조체</option>
|
||||
</select>
|
||||
<input type="number" class="format-select" id="fontSizeInput" value="12" min="6" max="72" style="widt
|
||||
@@ -1,5 +0,0 @@
|
||||
<!-- 본문 1장(다단 인지) -->
|
||||
<div class="preview-a4 b">
|
||||
<div class="pad">
|
||||
<div class="b-section">[대제목]</div>
|
||||
<div class="b-subhead">[소제목]</div>
|
||||
@@ -1,11 +0,0 @@
|
||||
<!-- 본문 -->
|
||||
<div class="preview-a4">
|
||||
<div class="pad">
|
||||
<div class="h1">1. [대제목]</div>
|
||||
<div class="h2">1.1 [중제목]</div>
|
||||
<div class="p">[본문]</div>
|
||||
<div class="p muted">[본문]</div>
|
||||
<div class="h2">1.2 [중제목]</div>
|
||||
<div class="p">[본문]</div>
|
||||
<div class="p muted">[본문]</div>
|
||||
|
||||
@@ -1,13 +0,0 @@
|
||||
/* B 본문 레이아웃 */
|
||||
.sheet .body-content .b-top{
|
||||
margin: 0 0 10px 0;
|
||||
}
|
||||
.sheet .body-content .b-columns{
|
||||
display: flex;
|
||||
gap: 18px;
|
||||
align-items: flex-start;
|
||||
}
|
||||
.sheet .body-content .b-col{
|
||||
flex: 1;
|
||||
min-width: 0;
|
||||
}
|
||||
@@ -1,8 +0,0 @@
|
||||
<div class="b-cols">
|
||||
<div class="b-col">
|
||||
<p>[본문]</p><p>[본문]</p><p>[본문]</p><p>[본문]</p><p>[본문]</p><p>[본문]</p>
|
||||
</div>
|
||||
<div class="b-col">
|
||||
<p>[본문]</p><p>[본문]</p><p>[본문]</p><p>[본문]</p><p>[본문]</p><p>[본문]</p>
|
||||
</div>
|
||||
</div>
|
||||
@@ -1,12 +0,0 @@
|
||||
/* 중, 소제목은 단 내부 */
|
||||
.sheet .body-content .b-col h2{
|
||||
color: var(--b-accent) !important;
|
||||
border-left: 5px solid var(--b-primary) !important;
|
||||
margin: 10px 0 6px 0;
|
||||
font-size: 12pt;
|
||||
font-weight: 900;
|
||||
}
|
||||
.sheet .body-content .b-col h3{
|
||||
color: var(--b-primary) !important;
|
||||
margin: 8px 0 4px 0;
|
||||
|
||||
@@ -1,3 +0,0 @@
|
||||
<h3>2-3. 수출과 산업: 반도체와 자동차가 버티는 가운데, 내수는 여전히 약한 고리</h3>
|
||||
<p>2025년 한국 수출은 반도체와 자동차가 이끌고 있다. 특히 메모리 반도체 가격과 수요가 회복되면서, 11월 기준으로 반도체 수출은 전년 동기 대비 20%를 넘는 증가율을 보이고 있고, 자동차 역시 미국·유럽·신흥국에서 견조한 수요를 유지하고 있다.</p>
|
||||
<p>내수 측면에서는 고금리 여파와 실질소득 둔화, 부동산 시장 조정으로 소비 심리가 완전히 회복되지 못했다. 한국은행 소비자동향지수(CCSI)는 팬데믹 직후보다는 높지만, 과거 확장 국면에 비하면 여전히 조심스러운 수준이다.</p>
|
||||
@@ -1,6 +0,0 @@
|
||||
<div class="panel-body">
|
||||
<div class="panel-section-title">양식 목록</div>
|
||||
<div class="template-list" id="templateList"></div>
|
||||
</div>
|
||||
</aside>
|
||||
</div>
|
||||
@@ -1,9 +0,0 @@
|
||||
<div class="viewer">
|
||||
<div id="viewerInner" style="height:100%; width:100%; display:flex; justify-content:center; transform-origin: top center;"></div>
|
||||
</div>
|
||||
</main>
|
||||
<aside class="right-panel" id="templatePanel">
|
||||
<div class="panel-header">
|
||||
<div class="panel-title">양식 선택</div>
|
||||
<button class="panel-add-btn" type="button" onclick="openTemplateAdd()">양식 추가</button>
|
||||
</div>
|
||||
@@ -1,3 +0,0 @@
|
||||
function openTemplateAdd() {
|
||||
toast("양식 추가는 다음 단계에서 연결합니다");
|
||||
}
|
||||
@@ -1,12 +0,0 @@
|
||||
// Type A에서 검증된 제목+본문 그룹핑
|
||||
function groupHeadingWithParagraph(nodes, index) {
|
||||
const node = nodes[index];
|
||||
if(!node) return { group: [], consumed: 0 };
|
||||
|
||||
const next = nodes[index + 1];
|
||||
|
||||
if(!node.tagName) return { group: [node], consumed: 1 };
|
||||
|
||||
const tag = node.tagName.toUpperCase();
|
||||
if((tag === 'H2' || tag === 'H3') && next && next.tagName && next.tagName.toUpperCase() === 'P') {
|
||||
return { group: [node
|
||||
@@ -1,9 +0,0 @@
|
||||
/* 요약 박스 스타일 */
|
||||
header p:last-of-type {
|
||||
background-color: #f8f9fa;
|
||||
border: 1px solid #ddd;
|
||||
padding: 15px;
|
||||
border-radius: 5px;
|
||||
font-weight: 500;
|
||||
color: #555;
|
||||
}
|
||||
@@ -1,9 +0,0 @@
|
||||
<!-- 요약 -->
|
||||
<div class="preview-a4">
|
||||
<div class="pad">
|
||||
<div class="h1">[요약]</div>
|
||||
<div class="p">[요약 내용 1]</div>
|
||||
<div class="p">[요약 내용 2]</div>
|
||||
<div class="p">[요약 내용 3]</div>
|
||||
</div>
|
||||
</div>
|
||||
@@ -1,9 +0,0 @@
|
||||
</head>
|
||||
<body>
|
||||
<div class="a4-wrapper">
|
||||
|
||||
<header>
|
||||
<h1>요즘 경제, 어디까지 왔나: 2025년 말 글로벌·한국 경제 진단</h1>
|
||||
<p>작성일: 2025년 11월 27일</p>
|
||||
<p>요약: 고물가 쇼크와 급격한 금리 인상 국면이 지나가고 있지만, 세계 경제는 저성장·고부채·지정학 리스크라는 세 가지 부담을 안고 완만한 성장세에 머물고 있다. 한국 경제 역시 1%대 저성장과 수출 의존 구조, 인구·부동산·가계부채 문제라는 고질적 구조적 과제를 동시에 마주하고 있다.</p>
|
||||
</header>
|
||||
@@ -1,6 +0,0 @@
|
||||
/* --- 인쇄 모드 (PDF 변환 시 적용) 핵심 코드 --- */
|
||||
@media print {
|
||||
@page {
|
||||
size: A4;
|
||||
margin: 0; /* 브라우저 여백 제거하고 body padding으로 제어 */
|
||||
}
|
||||
@@ -1,9 +0,0 @@
|
||||
<main class="main">
|
||||
<div class="toolbar">
|
||||
<div class="status-badge" id="editStatusBadge">
|
||||
<div class="dot"></div> <span id="editStatusText">읽기 전용</span>
|
||||
</div>
|
||||
<div class="toolbar-divider"></div>
|
||||
<button class="toolbar-btn" id="btnEdit" onclick="toggleEditMode()">✏️ 편집</button>
|
||||
<button class="toolbar-btn" title="실행 취소" onclick="performUndo()">↩️</button>
|
||||
<button
|
||||
@@ -1,3 +0,0 @@
|
||||
<footer>
|
||||
<p>자료 출처: IMF World Economic Outlook(2025년 4·10월판), World Bank Global Economic Prospects(2025년 6월), OECD Economic Outlook(2025년 6월 및 9월 업데이트), 한국은행, KDI, 국내 주요 언론 경제면 정리.</p>
|
||||
</footer>
|
||||
@@ -1,9 +0,0 @@
|
||||
:root {
|
||||
--font-main: 'Noto Sans KR', sans-serif;
|
||||
--page-width: 210mm;
|
||||
--page-height: 297mm;
|
||||
--margin-top: 25mm;
|
||||
--margin-bottom: 25mm;
|
||||
--margin-side: 25mm;
|
||||
--primary-color: #003366; /* 전문적인 네이비 컬러 */
|
||||
}
|
||||
@@ -1,4 +0,0 @@
|
||||
<h3>3-4. 정리: “위기는 완화, 과제는 심화”된 국면</h3>
|
||||
<p>요약하면, 2025년 말 세계와 한국 경제는 “급한 불은 껐지만, 구조적 과제는 더욱 분명해진 상태”라고 정리할 수 있다.</p>
|
||||
<p>지금의 경제 상황은 “모든 것이 나쁘다”기보다는, “잘하는 영역과 못하는 영역의 차이가 점점 더 크게 벌어지는 시대”에 가깝다.</p>
|
||||
</section>
|
||||
@@ -1,3 +0,0 @@
|
||||
<div class="b-title">
|
||||
[제목] <span class="red">[강조]</span> [제목]
|
||||
</div>
|
||||
@@ -1,10 +0,0 @@
|
||||
h2 {
|
||||
font-size: 16pt;
|
||||
color: #0056b3;
|
||||
margin-top: 25px;
|
||||
margin-bottom: 15px;
|
||||
border-left: 5px solid #0056b3;
|
||||
padding-left: 10px;
|
||||
break-after: avoid; /* 제목 뒤에서 페이지 넘김 방지 */
|
||||
break-inside: avoid;
|
||||
}
|
||||
@@ -1,4 +0,0 @@
|
||||
h2, h3 {
|
||||
break-after: avoid; /* 제목만 덩그러니 남는 것 방지 */
|
||||
page-break-after: avoid;
|
||||
}
|
||||
@@ -1,13 +0,0 @@
|
||||
/* 줄바꿈 시 다음줄 들여쓰기(넘버링 정렬) */
|
||||
.sheet .body-content .b-top h1,
|
||||
.sheet .body-content .b-col h1{
|
||||
padding-left: 24px;
|
||||
text-indent: -24px;
|
||||
}
|
||||
.sheet .body-content .b-col h2{
|
||||
padding-left: 20px;
|
||||
text-indent: -20px;
|
||||
}
|
||||
.sheet .body-content .b-col h3{
|
||||
padding-left: 18px;
|
||||
text-in
|
||||
@@ -1,9 +0,0 @@
|
||||
<section id="implications">
|
||||
<h2>3. 지금 경제 상황이 의미하는 것: 기업과 가계, 투자자의 관점</h2>
|
||||
<h3>3-1. 기업: “고성장 시대”가 아니라 “정교한 선택의 시대”</h3>
|
||||
<p>세계와 한국 모두 고성장 국면은 아니다. 대신, 성장의 편차와 업종 간 차별화가 중요한 시대다.</p>
|
||||
<ul>
|
||||
<li>디지털 전환과 자동화를 통해 인력·자본 효율성을 높이고, 비용 구조를 경직적에서 유연한 형태로 바꾸는 것</li>
|
||||
<li>해외 시장과 공급망 다변화를 통해 특정 국가·산업 의존도를 줄이는 것</li>
|
||||
<li>R&D와 데이터 활용을 통해 제품·서비스 차별화, 고부가가치화를 추구하는 것</li>
|
||||
</ul>
|
||||
@@ -1,9 +0,0 @@
|
||||
/* --- 타이포그래피 설정 --- */
|
||||
h1 {
|
||||
font-size: 24pt;
|
||||
color: var(--primary-color);
|
||||
border-bottom: 3px solid var(--primary-color);
|
||||
padding-bottom: 10px;
|
||||
margin-bottom: 30px;
|
||||
break-after: avoid; /* 제목 뒤에서 페이지 넘김 방지 */
|
||||
}
|
||||
@@ -1,7 +0,0 @@
|
||||
<h3>3-3. 투자자: “불확실성 관리”가 기본값이 된 시장</h3>
|
||||
<p>주식, 채권, 부동산, 대체투자 모두에서 공통적으로 나타나는 특징은 “중간 정도의 성장과 반복되는 정책 변수”다.</p>
|
||||
<ul>
|
||||
<li>국가·통화·자산군 분산을 통한 리스크 헤지</li>
|
||||
<li>특정 테마(예: AI, 친환경, 헬스케어)에 대한 집중 투자 여부를, 수익·현금흐름·규제 환경을 종합적으로 보며 판단하는 것</li>
|
||||
<li>단기 금리·환율 이벤트에 휘둘리기보다는, 3~5년 이상의 중기적 시계에서 정책과 구조 변화의 방향성을 읽는 것</li>
|
||||
</ul>
|
||||
@@ -1,9 +0,0 @@
|
||||
<div class="drop-overlay" id="dropOverlay"><div class="drop-box">📄 파일을 놓으세요</div></div>
|
||||
|
||||
<div class="modal-overlay" id="pasteModal">
|
||||
<div class="modal-box">
|
||||
<div class="modal-header">📋 HTML 코드 붙여넣기</div>
|
||||
<textarea class="modal-textarea" id="pasteInput" placeholder="HTML 코드를 여기에 붙여넣으세요..."></textarea>
|
||||
<div class="modal-footer">
|
||||
<button class="btn" style="width:auto;" onclick="closePasteModal()">취소</button>
|
||||
<bu
|
||||
@@ -1,5 +0,0 @@
|
||||
function applyTemplate(templateId) {
|
||||
if (!iframe) {
|
||||
toast("파일을 먼저 열어주세요");
|
||||
return;
|
||||
}
|
||||
@@ -1,9 +0,0 @@
|
||||
p, ul, li {
|
||||
orphans: 2; /* 페이지 끝에 한 줄만 남는 것 방지 */
|
||||
widows: 2; /* 다음 페이지에 한 줄만 넘어가는 것 방지 */
|
||||
}
|
||||
|
||||
/* 문단이 너무 작게 잘리는 것을 방지 */
|
||||
p {
|
||||
break-inside: auto;
|
||||
}
|
||||
@@ -1,4 +0,0 @@
|
||||
/* 페이지 분할 알고리즘 */
|
||||
section {
|
||||
break-inside: auto; /* 섹션 내부에서 페이지 나눔 허용 */
|
||||
}
|
||||
@@ -1,12 +0,0 @@
|
||||
function buildPreviewA() {
|
||||
return `
|
||||
<!-- 표지 -->
|
||||
<div class="preview-a4">
|
||||
<div class="pad">
|
||||
<div class="cover-top">[날짜]<br>[작성자]</div>
|
||||
<div class="cover-center">
|
||||
<div class="cover-title">[제목]</div>
|
||||
<div class="cover-sub">[부제]</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
@@ -1,16 +0,0 @@
|
||||
const TEMPLATE_REGISTRY = [
|
||||
{
|
||||
id: "A",
|
||||
name: "A type",
|
||||
desc: "표지 목차 요약 본문 구조",
|
||||
preview: () => buildPreviewA(),
|
||||
apply: (doc) => applyTemplateA(doc),
|
||||
},
|
||||
{
|
||||
id: "B",
|
||||
name: "B type",
|
||||
desc: "다단 본문 중심 구조",
|
||||
preview: () => buildPreviewB(),
|
||||
apply: (doc) => applyTemplateB(doc),
|
||||
},
|
||||
];
|
||||
@@ -1,7 +0,0 @@
|
||||
function buildPreviewB() {
|
||||
return `
|
||||
<!-- 표지 1장 -->
|
||||
<div class="preview-a4 b">
|
||||
<div class="pad">
|
||||
<div class="b-tag">[특집]</div>
|
||||
<div class="b-pill">[브랜드]</div>
|
||||
@@ -1,6 +0,0 @@
|
||||
/* 표지나 특정 섹션 강제 넘김이 필요하면 사용 */
|
||||
.page-break {
|
||||
break-before: page;
|
||||
}
|
||||
}
|
||||
</style>
|
||||
@@ -1,8 +0,0 @@
|
||||
/* 푸터 (출처) 스타일 */
|
||||
footer {
|
||||
margin-top: 30px;
|
||||
border-top: 1px solid #eee;
|
||||
padding-top: 10px;
|
||||
font-size: 9pt;
|
||||
color: #888;
|
||||
}
|
||||
@@ -1,5 +0,0 @@
|
||||
<section id="korea-economy">
|
||||
<h2>2. 한국 경제: 1%대 성장과 수출 회복 사이에서 균형 찾기</h2>
|
||||
<h3>2-1. 성장률: 2025년 1% 안팎, 2026년 2%대 회복 전망</h3>
|
||||
<p>OECD는 한국의 2025년 실질 GDP 성장률을 약 1.0% 수준으로, 2026년에는 2.2%까지 완만하게 회복될 것으로 전망한다. 세계 평균 성장률(3%대 초반)과 비교하면 상당히 낮은 수준으로, 저성장 구조가 점점 고착화되고 있다는 평가가 많다.</p>
|
||||
<p>한국은행과 국내 연구기관(KDI 등) 역시 비슷한 그림을 제시한다. 대외 환경이 크게 악화되지는 않았지만, 수출과 설비투자는 제한적 회복에 그치고, 소비와 건설투자가 경제를 강하게 끌어올릴 만큼의 모멘텀을 보여주지 못한다는 판단이다.</p>
|
||||
@@ -1,10 +0,0 @@
|
||||
body {
|
||||
font-family: var(--font-main);
|
||||
background-color: #f5f5f5; /* 화면 확인용 회색 배경 */
|
||||
margin: 0;
|
||||
padding: 20px;
|
||||
color: #333;
|
||||
line-height: 1.6;
|
||||
word-break: keep-all; /* 단어 단위 줄바꿈 (가독성 핵심) */
|
||||
text-align: justify;
|
||||
}
|
||||
@@ -1,11 +0,0 @@
|
||||
/* 화면에서 볼 때 A4처럼 보이게 하는 컨테이너 */
|
||||
.a4-wrapper {
|
||||
width: var(--page-width);
|
||||
min-height: var(--page-height);
|
||||
background: white;
|
||||
margin: 0 auto;
|
||||
padding: var(--margin-top) var(--margin-side) var(--margin-bottom) var(--margin-side);
|
||||
box-shadow: 0 0 15px rgba(0,0,0,0.1);
|
||||
box-sizing: border-box;
|
||||
position: relative;
|
||||
}
|
||||
@@ -1 +0,0 @@
|
||||
}
|
||||
@@ -1,5 +0,0 @@
|
||||
response = client.chat.completions.create(
|
||||
gpt-4.1-2025-04-14,
|
||||
messages=[{role: user, content: f다음을 한국어로 번역해줘:\n{text}}]
|
||||
)
|
||||
return response.choices[0].message.content.strip()
|
||||
@@ -1,9 +0,0 @@
|
||||
resp = openai.ChatCompletion.create(
|
||||
model=model,
|
||||
messages=[
|
||||
{role:system, content: system_prompt},
|
||||
{role:user, content: user_prompt}
|
||||
],
|
||||
temperature=0.7
|
||||
)
|
||||
return resp.choices[0].message.content.strip()
|
||||
@@ -1,15 +0,0 @@
|
||||
response = client.chat.completions.create(
|
||||
gpt-4.1-2025-04-14,
|
||||
messages=[{role: user, content: f아래 내용을 50자 내외로 요약해줘:\n{text}}]
|
||||
)
|
||||
return response.choices[0].message.content.strip()
|
||||
|
||||
|
||||
for category in categories:
|
||||
driver.get(base_url.format(category))
|
||||
time.sleep(2)
|
||||
|
||||
# Load
|
||||
while True:
|
||||
try:
|
||||
load_more = driver.find_element(By.XPATH, //button[contains(text(),'Load more templates')])
|
||||
109
02. Prompts/최종본/01-1. 단일 AI 활용 보고서 작성 _ (개요) 내용 요약 (1).md
Normal file
109
02. Prompts/최종본/01-1. 단일 AI 활용 보고서 작성 _ (개요) 내용 요약 (1).md
Normal file
@@ -0,0 +1,109 @@
|
||||
# 프롬프트 구조 및 내용 해설 — 단일 AI 보고서 작성
|
||||
|
||||
---
|
||||
|
||||
## 1. 이 프롬프트는 무엇인가
|
||||
|
||||
단일 AI를 활용하여 내부 자료 기반의 분석 보고서를 작성하는 프롬프트이다.
|
||||
작성자가 AI와 대화하며 단계별로 확인·수정을 거쳐 A4 HTML 보고서를 완성한다.
|
||||
|
||||
---
|
||||
|
||||
## 2. 어떻게 실행하는가
|
||||
|
||||
작성자는 아래 세 가지를 AI에게 함께 제공한다.
|
||||
|
||||
| 제공물 | 설명 |
|
||||
|--------|------|
|
||||
| **(사전) 작성자 기재사항.md** | 보고서 제목, 목적, 대상 독자, 성격, 키워드, 흐름 등 작성자의 요구사항 |
|
||||
| **프롬프트 본문.md** | AI가 따를 규칙과 절차. 문체, 형식, 출처 원칙, HTML 출력 규격 포함 |
|
||||
| **관련 자료** | 보고서의 근거가 되는 첨부 파일들 |
|
||||
|
||||
프롬프트 본문은 한 번 설계하면 거의 수정하지 않는 고정 규칙이고, 기재사항은 매 보고서마다 작성자가 채워 넣는 변동 입력값이다. 두 파일을 분리한 이유는 프롬프트를 범용 템플릿으로 유지하면서, 작성자가 기재사항만 바꿔 다양한 보고서에 재사용할 수 있도록 하기 위함이다.
|
||||
|
||||
---
|
||||
|
||||
## 3. 특징
|
||||
|
||||
이 프롬프트의 핵심 특징은 **(사전) 기재사항에 기반하여 프롬프트 각 항목이 재정리된다**는 점이다.
|
||||
|
||||
- 페르소나 설정 → 기재사항의 분야·전문성 힌트를 반영하여 AI가 스스로 전문가 역할을 선언
|
||||
- 보고서 성격 → 기재사항의 목적·대상·성격에 따라 보고서 방향이 결정됨
|
||||
- 목차 설계 → 기재사항의 키워드·보고서 흐름에 따라 구조가 설계됨
|
||||
- 최종 출력 → 기재사항의 제목이 표지와 헤더에 반영됨
|
||||
|
||||
기재사항을 많이 채울수록 정밀해지고, 적게 채워도 프롬프트의 기본값으로 동작한다.
|
||||
|
||||
---
|
||||
|
||||
## 4. 프롬프트 순서 — 왜 이 위치에 있는가
|
||||
|
||||
프롬프트 본문은 **사전 규칙**과 **작업 절차** 두 영역으로 나뉜다.
|
||||
사전 규칙은 AI가 작업을 시작하기 전에 숙지해야 할 것이고, 작업 절차는 순서대로 실행하는 것이다.
|
||||
|
||||
### 사전 규칙의 순서
|
||||
|
||||
| 순서 | 항목 | 이 위치에 있는 이유 |
|
||||
|------|------|-------------------|
|
||||
| ① | 페르소나 설정 | "나는 누구인가"가 정해져야 이후 모든 판단의 관점이 생긴다 |
|
||||
| ② | 보고서 성격 | 페르소나가 정해진 후 "무엇을 위한 보고서인가"를 확인한다 |
|
||||
| ③ | 출처 및 자료 활용 원칙 | 목적이 정해진 후 "자료를 어떻게 다룰 것인가"의 규칙이 필요하다. 이것이 없으면 AI가 자료에 없는 내용을 추론으로 채운다 |
|
||||
| ④ | 문체 기준 | 무엇을 쓸지, 어떤 자료로 쓸지가 정해진 후 "어떤 말투로 쓸지"를 지정한다 |
|
||||
| ⑤ | 보고서 형식 | 문체까지 정해진 후 "물리적으로 어떤 모양인가"를 지정한다. 계층 구조, 문단 길이, 표 처리 등 |
|
||||
|
||||
**요약 : 정체성 → 목적 → 재료 규칙 → 말투 → 외형** 순서이다.
|
||||
|
||||
---
|
||||
|
||||
## 5. 각 단계 요약
|
||||
|
||||
### STEP 1. 자료 분석 및 페르소나 선언
|
||||
|
||||
자료를 읽고 분야·성격을 파악하여 페르소나를 선언한다. 자료별 핵심 내용, 문제점·쟁점, 상충 사항을 정리하여 작성자에게 보고한다. 이 단계에서만 `[자료-001]`, `[상충]` 같은 내부 태그를 사용하여 근거를 명확히 보여준다.
|
||||
|
||||
→ **자료를 읽지 않은 상태에서 목차를 설계하면 자료에 없는 내용으로 채우게 되므로, 분석이 반드시 선행되어야 한다.**
|
||||
|
||||
### STEP 2. 목차 설계
|
||||
|
||||
STEP 1의 분석 결과와 기재사항의 키워드·흐름을 바탕으로 장-절 구조의 목차를 설계한다. 자료에서 충분히 뒷받침되는 항목만 포함한다.
|
||||
|
||||
→ **목차 없이 본문을 쓰면 AI가 중간에 구조를 바꾸거나 내용을 반복한다. 목차를 먼저 확정해야 절의 범위가 명확해진다.**
|
||||
|
||||
### STEP 3. 절 단위 본문 작성
|
||||
|
||||
확정된 목차 순서대로 1개 절씩 작성하고, 작성자 확인 후 다음 절로 이동한다. 본문에는 내부 태그를 표시하지 않고, 출처는 본문 흐름에 자연스럽게 녹인다.
|
||||
|
||||
→ **한 번에 전체를 쓰면 특정 절만 수정할 때 다른 절까지 함께 바뀌는 문제가 발생한다. 절 단위로 나누면 수정 범위가 격리된다.**
|
||||
|
||||
### STEP 4. 전체 검토 및 마무리
|
||||
|
||||
맥락 흐름, 중복, 문체 통일, 수치 일관성, 키워드 반영 여부를 체크리스트로 검토한다.
|
||||
|
||||
→ **절 단위로 쓰면 개별 절의 품질은 확보되지만, 절 간 연결과 일관성은 전체를 놓고 봐야 한다.**
|
||||
|
||||
### STEP 5. 최종 출력 — A4 HTML 보고서
|
||||
|
||||
확정된 본문을 A4 규격 HTML로 변환하여 출력한다. HTML 구조(5-B), CSS(5-C), 변환 규칙(5-D), JS 렌더링 엔진(5-E)이 프롬프트 안에 포함되어 있다.
|
||||
|
||||
→ **Markdown은 A4 용지 규격, 페이지 분할, 인쇄 레이아웃을 제어할 수 없다. HTML + CSS + JS가 A4 보고서를 브라우저에서 렌더링하고 인쇄/PDF 저장까지 가능하게 한다.**
|
||||
|
||||
---
|
||||
|
||||
## 6. 출처 태그의 이중 처리
|
||||
|
||||
| 단계 | 태그 | 이유 |
|
||||
|------|------|------|
|
||||
| STEP 1 | 표시 | 작성자가 AI의 분석 근거를 확인해야 한다 |
|
||||
| STEP 3~5 | 제거, 본문에 녹임 | 최종 보고서에 태그가 보이면 가독성이 떨어진다 |
|
||||
|
||||
태그 없이 쓰라고만 하면 AI가 출처 구분 자체를 하지 않아 추론으로 채우는 문제가 생긴다. "내부적으로는 구분하되 최종 출력에서만 제거하라"는 이중 규칙이 이를 해결한다.
|
||||
|
||||
---
|
||||
|
||||
## 7. 한계
|
||||
|
||||
- 자료가 많으면 AI의 컨텍스트 윈도우를 초과하여 전체를 한 번에 읽지 못할 수 있음
|
||||
- 절 단위 수정을 지시해도 AI가 다른 절을 함께 바꾸는 경우가 있음
|
||||
- 시각화(차트, 그래프) 생성 절차가 없어 텍스트 보고서만 출력됨
|
||||
- CSS/JS를 정확히 포함하는지, box-content 구조를 올바르게 만드는지는 AI 역량에 의존
|
||||
- 대화가 길어지면 초반에 선언한 문체나 형식을 잊는 경우가 있음
|
||||
727
02. Prompts/최종본/01-2. 단일 AI 활용 보고서 작성 프롬프트.md
Normal file
727
02. Prompts/최종본/01-2. 단일 AI 활용 보고서 작성 프롬프트.md
Normal file
@@ -0,0 +1,727 @@
|
||||
# 내부 자료 기반 분석 보고서 작성 가이드
|
||||
|
||||
> 이 프롬프트는 **(사전) 요청사항.md** 파일 및 첨부된 관련 자료와 함께 제공됩니다.
|
||||
> 프롬프트의 모든 지시는 해당 파일과 자료를 기반으로 수행하십시오.
|
||||
|
||||
---
|
||||
|
||||
## 페르소나 설정
|
||||
|
||||
**(사전) 요청사항.md**의 분야·전문성 힌트와 첨부된 자료를 읽고, 아래를 수행하십시오.
|
||||
|
||||
1. 자료의 분야를 파악하십시오.
|
||||
2. 자료의 성격을 파악하십시오.
|
||||
3. 파악된 분야와 성격에 맞는 전문가 페르소나를 선언하십시오.
|
||||
4. (사전) 요청사항에 힌트가 있으면 이를 반영하고, 없으면 자료에서 자동 파악하십시오.
|
||||
|
||||
---
|
||||
|
||||
## 보고서 성격
|
||||
|
||||
**(사전) 요청사항.md**에 기재된 목적·대상 독자·성격을 기준으로 보고서의 방향을 설정하십시오.
|
||||
|
||||
기재가 없는 경우 아래를 기본값으로 적용하십시오.
|
||||
|
||||
- 대상 : 사내 임직원
|
||||
- 성격 : 현황 문제점 분석, 주제 학습과 이해, 실무 인사이트 도출
|
||||
- 이 보고서는 특정 방향을 제시하기보다, 향후 전략 수립을 위한 전단계적 관찰과 다각적 검토의 성격을 지닙니다.
|
||||
|
||||
---
|
||||
|
||||
## 출처 및 자료 활용 원칙
|
||||
|
||||
제공된 자료의 내용을 **우선적으로** 활용하십시오.
|
||||
|
||||
**작성 과정에서의 내부 규칙 (작성자에게는 보이지 않는 처리):**
|
||||
|
||||
- 자료에 근거한 내용과 AI 자체 판단을 내부적으로 구분하며 작성하십시오.
|
||||
- 자료 간 내용이 상충할 경우 임의로 한쪽을 선택하지 말고, 양쪽 입장을 모두 정리하십시오.
|
||||
- 자료에 없는 내용을 사실인 것처럼 작성하지 마십시오.
|
||||
|
||||
**최종 보고서의 출력 규칙:**
|
||||
|
||||
- 최종 보고서 본문에는 `[자료-001]`, `[AI 판단]`, `[상충]` 같은 내부 태그를 표시하지 마십시오.
|
||||
- 출처가 필요한 경우, 본문 흐름 안에서 자연스럽게 녹이십시오.
|
||||
(예: "국토교통부 통계에 따르면 ~", "실무 현장에서는 ~로 알려져 있음")
|
||||
- 단, **STEP 1 자료 분석 보고** 단계에서는 작성자에게 출처와 쟁점을 명확히 보여주기 위해 태그를 사용하십시오.
|
||||
|
||||
**비정형 출처 기준:**
|
||||
|
||||
- SNS, 블로그, 언론자료 등은 사례 참고용으로만 사용하십시오.
|
||||
- 분석과 인사이트 도출은 신뢰할 수 있는 자료나 실무 기반 내용에서 하십시오.
|
||||
|
||||
---
|
||||
|
||||
## 문체 기준
|
||||
|
||||
기본 문체는 **보고체(간결체)**입니다. 전체 보고서에 일관 적용하십시오.
|
||||
|
||||
| 항목 | 기준 | 예시 |
|
||||
|------|------|------|
|
||||
| 문장 종결 | 명사형 또는 동사 원형 종결 | ~으로 나타남, ~임, ~필요 |
|
||||
| 문장 길이 | 1문장 2줄 이내 | 길면 두 문장으로 분리 |
|
||||
| 주어 생략 | 주어 반복 시 생략 | "분석 결과, ~로 확인됨" |
|
||||
| 수동태 | 적극 사용 | ~로 분석됨, ~으로 판단됨 |
|
||||
| 경어·구어 | **절대 사용 금지** | ~합니다, ~입니다, ~것 같다 금지 |
|
||||
| 숫자 표기 | 아라비아 숫자 | 3개, 15% |
|
||||
|
||||
---
|
||||
|
||||
## 보고서 형식
|
||||
|
||||
**계층 구조**
|
||||
|
||||
| 계층 | 표기 |
|
||||
|------|------|
|
||||
| 장 (Chapter) | 1, 2, 3 ... |
|
||||
| 절 (Section) | 1.1, 1.2, 2.1 ... |
|
||||
| 항 (Clause) | 가, 나, 다 ... |
|
||||
| 항 하위 | ▢ → ㅇ → - |
|
||||
|
||||
**문단 및 표 처리**
|
||||
|
||||
- 1개 문단은 3~5문장으로 구성하십시오.
|
||||
- 수치가 3개 이상 나열될 경우 반드시 표로 정리하십시오.
|
||||
- 표에는 출처를 본문 흐름 안에서 자연스럽게 명기하십시오.
|
||||
|
||||
---
|
||||
|
||||
## 작업 절차
|
||||
|
||||
아래 단계를 순서대로 수행하십시오.
|
||||
각 단계는 작성자의 확인 후 다음 단계로 진행합니다.
|
||||
|
||||
---
|
||||
|
||||
### [STEP 1] 자료 분석 및 페르소나 선언
|
||||
|
||||
제공된 자료와 (사전) 요청사항을 읽고 아래 형식으로 보고하십시오.
|
||||
|
||||
> 이 단계에서만 내부 태그([자료-001], [상충] 등)를 사용하여 작성자에게 명확히 보여주십시오.
|
||||
|
||||
```
|
||||
[자료 분석 완료]
|
||||
|
||||
▣ 페르소나 선언
|
||||
- 분야 :
|
||||
- 선언 : "나는 ~~ 분야의 ~~ 전문가입니다."
|
||||
|
||||
▣ 자료별 핵심 내용
|
||||
- [자료-001] : 핵심 내용
|
||||
- [자료-002] : 핵심 내용
|
||||
|
||||
▣ 식별된 문제점·쟁점
|
||||
- 문제점 1 : 내용 / 근거 자료
|
||||
- 문제점 2 : 내용 / 근거 자료
|
||||
|
||||
▣ 자료 간 상충 사항 (있는 경우만)
|
||||
- [상충] : [자료-001]의 입장 vs [자료-002]의 입장
|
||||
|
||||
▣ 보고서에 활용 가능한 수치·사례
|
||||
- 수치/사례 : 근거 자료
|
||||
```
|
||||
|
||||
보고 후 작성자의 확인을 기다리십시오.
|
||||
|
||||
---
|
||||
|
||||
### [STEP 2] 목차 설계
|
||||
|
||||
STEP 1의 분석 결과와 (사전) 요청사항의 포함 키워드·보고서 흐름을 바탕으로 목차를 설계하십시오.
|
||||
|
||||
```
|
||||
[목차 설계 기준]
|
||||
- 장(Chapter) → 절(Section) 구조로 구성하십시오.
|
||||
- 자료에서 충분히 뒷받침되는 항목만 목차에 포함하십시오.
|
||||
- (사전) 요청사항에 보고서 흐름이 지정되어 있으면 이를 반영하십시오.
|
||||
- 지정되어 있지 않으면 논리적 흐름(배경 → 현황 → 분석 → 시사점)을 기본으로 하되, 자료 성격에 따라 조정하십시오.
|
||||
```
|
||||
|
||||
목차를 제시하고 작성자의 확인을 기다리십시오.
|
||||
수정 요청 시 반영 후 재제시하십시오.
|
||||
|
||||
---
|
||||
|
||||
### [STEP 3] 절 단위 본문 작성
|
||||
|
||||
확정된 목차의 첫 번째 절부터 순서대로 본문을 작성하십시오.
|
||||
|
||||
```
|
||||
[작성 규칙]
|
||||
- 한 번에 1개 절씩만 작성하십시오.
|
||||
- 최종 보고서 본문에는 내부 태그를 표시하지 마십시오.
|
||||
- 출처는 본문 흐름 안에서 자연스럽게 녹이십시오.
|
||||
- 작성한 절을 제시하고 작성자의 확인을 기다리십시오.
|
||||
- 수정 요청 시 해당 절만 수정하십시오. 다른 절을 건드리지 마십시오.
|
||||
- 확인 완료 시 다음 절로 이동하십시오.
|
||||
```
|
||||
|
||||
모든 절 작성이 완료되면 완료를 보고하십시오.
|
||||
|
||||
---
|
||||
|
||||
### [STEP 4] 전체 검토 및 마무리
|
||||
|
||||
모든 절 작성이 완료되면 아래 항목을 검토하십시오.
|
||||
|
||||
```
|
||||
[전체 검토]
|
||||
|
||||
✅ 맥락 흐름 : 장 간 연결 자연스러움 / 어색한 부분 X건
|
||||
✅ 중복 내용 : 절 간 중복 없음 / 중복 X건
|
||||
✅ 문체 통일 : 보고체 준수 / 위반 X건
|
||||
✅ 수치 일관성 : 수치·용어 통일 / 불일치 X건
|
||||
✅ 자료 반영 : (사전) 요청사항의 키워드 전부 반영 / 미반영 X건
|
||||
|
||||
⚠️ 수정 필요 항목 (있는 경우만)
|
||||
- 해당 절 : 사유 및 수정 제안
|
||||
```
|
||||
|
||||
검토 결과를 보고하고, 작성자의 최종 확인을 기다리십시오.
|
||||
|
||||
---
|
||||
|
||||
### [STEP 5] 최종 출력 — A4 HTML 보고서
|
||||
|
||||
작성자의 최종 확인이 완료되면, 아래 HTML/CSS/JS 규격에 따라 A4 보고서 HTML 파일을 출력하십시오.
|
||||
|
||||
---
|
||||
|
||||
#### 5-A. A4 렌더링 엔진 핵심 원칙
|
||||
|
||||
출력 HTML에 포함된 JS 렌더링 엔진은 아래 원칙으로 동작합니다.
|
||||
본문 HTML은 이 원칙에 맞는 구조여야 합니다.
|
||||
|
||||
| 원칙 | 설명 |
|
||||
|------|------|
|
||||
| **Deep Sanitization** | 모든 class, style을 삭제하고 표준 스타일로 재적용. SVG 내부는 제외 |
|
||||
| **H1 Only Break** | 대목차(H1) 태그에서만 무조건 페이지를 나눔 |
|
||||
| **Orphan Control** | H2, H3가 페이지 하단에 홀로 남으면 다음 페이지로 넘김 |
|
||||
| **Smart Fit** | 표·그림이 15% 이내로 넘치면 85%까지 축소하여 현재 페이지에 배치 |
|
||||
| **Gap Filling** | 그림이 넘어가 빈 공간이 생기면 뒤 텍스트 문단을 당겨와 채움 |
|
||||
| **Visual Standard** | 여백 상하좌우 20mm, 모든 그림·표 캡션은 하단 중앙 정렬 |
|
||||
|
||||
---
|
||||
|
||||
#### 5-B. HTML 전체 구조
|
||||
|
||||
출력 HTML은 아래 구조를 정확히 따르십시오.
|
||||
`raw-container` 안의 4개 박스에 콘텐츠를 주입하면, JS가 이를 읽어 A4 페이지로 조립합니다.
|
||||
|
||||
```html
|
||||
<!DOCTYPE html>
|
||||
<html lang="ko">
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<title>보고서 제목</title>
|
||||
<style>
|
||||
/* === 5-C의 CSS 전문을 여기에 삽입 === */
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
|
||||
<!-- ① 원본 데이터 컨테이너 (화면에 표시되지 않음, JS가 읽는 원본) -->
|
||||
<div id="raw-container">
|
||||
<div id="box-cover">
|
||||
<h1>보고서 제목</h1>
|
||||
<h2>부제 (선택)</h2>
|
||||
<p>작성자 / 소속 / 작성일</p>
|
||||
</div>
|
||||
<div id="box-toc">
|
||||
<!-- 본문의 H1, H2, H3를 그대로 나열 → JS가 목차로 자동 변환 -->
|
||||
</div>
|
||||
<div id="box-summary">
|
||||
<!-- 요약 내용 (없으면 비워둠) -->
|
||||
</div>
|
||||
<div id="box-content">
|
||||
<!-- 본문 전체 (H1~H3, p, table, ul, ol 등) -->
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- ② 페이지 템플릿 (JS가 복제하여 사용) -->
|
||||
<template id="page-template">
|
||||
<div class="sheet">
|
||||
<div class="page-header"></div>
|
||||
<div class="body-content"></div>
|
||||
<div class="page-footer">
|
||||
<span class="rpt-title"></span>
|
||||
<span class="pg-num"></span>
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<!-- ③ 렌더링 엔진 JS -->
|
||||
<script>
|
||||
/* === 5-E의 JS 전문을 여기에 삽입 === */
|
||||
</script>
|
||||
|
||||
</body>
|
||||
</html>
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
#### 5-C. CSS 전문 — A4 렌더링 스타일시트
|
||||
|
||||
아래 CSS를 `<style>` 태그 안에 그대로 포함하십시오.
|
||||
|
||||
```css
|
||||
@import url('https://fonts.googleapis.com/css2?family=Noto+Sans+KR:wght@300;400;500;700;900&display=swap');
|
||||
|
||||
:root {
|
||||
--primary: #006400;
|
||||
--accent: #228B22;
|
||||
--light-green: #E8F5E9;
|
||||
--bg: #525659;
|
||||
}
|
||||
body { margin: 0; background: var(--bg); font-family: 'Noto Sans KR', sans-serif; }
|
||||
|
||||
.sheet {
|
||||
width: 210mm; height: 297mm;
|
||||
background: white; margin: 20px auto;
|
||||
position: relative; overflow: hidden; box-sizing: border-box;
|
||||
box-shadow: 0 0 15px rgba(0,0,0,0.1);
|
||||
}
|
||||
@media print {
|
||||
.sheet { margin: 0; break-after: page; box-shadow: none; }
|
||||
body { background: white; }
|
||||
}
|
||||
|
||||
.page-header {
|
||||
position: absolute; top: 10mm; left: 20mm; right: 20mm;
|
||||
font-size: 9pt; color: #000000; font-weight: bold;
|
||||
text-align: right; border-bottom: none !important; padding-bottom: 5px;
|
||||
}
|
||||
.page-footer {
|
||||
position: absolute; bottom: 10mm; left: 20mm; right: 20mm;
|
||||
display: flex; justify-content: space-between; align-items: flex-end;
|
||||
font-size: 9pt; color: #555; border-top: 1px solid #eee; padding-top: 5px;
|
||||
}
|
||||
|
||||
.body-content {
|
||||
position: absolute;
|
||||
top: 20mm; left: 20mm; right: 20mm;
|
||||
bottom: auto;
|
||||
}
|
||||
|
||||
h1, h2, h3 {
|
||||
white-space: nowrap; overflow: hidden; word-break: keep-all; color: var(--primary);
|
||||
margin: 0; padding: 0;
|
||||
}
|
||||
h1 {
|
||||
font-size: 20pt; font-weight: 900; color: var(--primary);
|
||||
border-bottom: 2px solid var(--primary); margin-bottom: 20px; margin-top: 0;
|
||||
}
|
||||
h2 {
|
||||
font-size: 18pt; border-left: 5px solid var(--accent); padding-left: 10px;
|
||||
margin-top: 30px; margin-bottom: 10px; color: #03581dff;
|
||||
}
|
||||
h3 { font-size: 14pt; margin-top: 20px; margin-bottom: 5px; color: var(--accent); font-weight: 700; }
|
||||
p, li { font-size: 12pt !important; line-height: 1.6 !important; text-align: justify; word-break: keep-all; margin-bottom: 5px; }
|
||||
|
||||
.toc-group { margin-bottom: 12px; break-inside: avoid; page-break-inside: avoid; }
|
||||
.toc-lvl-1, .toc-lvl-2, .toc-lvl-3 { list-style: none !important; }
|
||||
.toc-item { line-height: 1.8; list-style: none; border-bottom: 1px dotted #eee; }
|
||||
.toc-lvl-1 { color: #006400; font-weight: 900; font-size: 13.5pt; margin-top: 15px; margin-bottom: 5px; border-bottom: 2px solid #ccc; }
|
||||
.toc-lvl-2 { font-size: 10.5pt; color: #333; margin-left: 20px; font-weight: normal; }
|
||||
.toc-lvl-3 { font-size: 10.5pt; color: #666; margin-left: 40px; }
|
||||
.toc-lvl-1 .toc-number, .toc-lvl-1 .toc-text { font-weight: 900; font-size: 1.2em; color: #006400; }
|
||||
.toc-lvl-1 .toc-number { float: left; margin-right: 14px; }
|
||||
.toc-lvl-1 .toc-text { display: block; overflow: hidden; }
|
||||
.toc-lvl-2 .toc-number, .toc-lvl-3 .toc-number { font-weight: bold; color: #2c5282; margin-right: 11px; }
|
||||
.toc-lvl-2 .toc-text, .toc-lvl-3 .toc-text { color: #4a5568; font-size: 1em; }
|
||||
|
||||
table {
|
||||
width: 100%; border-collapse: collapse; margin: 15px 0; font-size: 9.5pt;
|
||||
table-layout: auto; border-top: 2px solid var(--primary);
|
||||
}
|
||||
th, td {
|
||||
border: 1px solid #ddd; padding: 6px 5px; text-align: center;
|
||||
vertical-align: middle; word-break: keep-all; word-wrap: break-word;
|
||||
}
|
||||
th {
|
||||
background: var(--light-green); color: var(--primary); font-weight: 900;
|
||||
white-space: nowrap; letter-spacing: -0.05em; font-size: 9pt;
|
||||
}
|
||||
|
||||
figure { display: block; margin: 20px auto; text-align: center; width: 100%; }
|
||||
img, svg { max-width: 95% !important; height: auto !important; display: block; margin: 0 auto; border: 1px solid #eee; }
|
||||
figcaption { display: block; text-align: center; margin-top: 10px; font-size: 9.5pt; color: #666; font-weight: 600; }
|
||||
|
||||
.atomic-block { break-inside: avoid; page-break-inside: avoid; }
|
||||
#raw-container { display: none; }
|
||||
|
||||
.highlight-box {
|
||||
background-color: rgb(226, 236, 226); border: 1px solid #2a2c2aff;
|
||||
padding: 5px; margin: 1.5px 1.5px 2px 0px; border-radius: 3px; color: #333;
|
||||
}
|
||||
.highlight-box li, .highlight-box p { font-size: 11pt !important; line-height: 1.2; letter-spacing: -0.6px; margin-bottom: 3px; color: #1a1919ff; }
|
||||
.highlight-box h3, .highlight-box strong, .highlight-box b { font-size: 12pt !important; color: rgba(2, 37, 2, 1) !important; font-weight: bold; margin: 0; display: block; margin-bottom: 5px; }
|
||||
|
||||
.squeeze { line-height: 1.35 !important; letter-spacing: -0.5px !important; margin-bottom: 2px !important; }
|
||||
.squeeze-title { margin-bottom: 5px !important; padding-bottom: 2px !important; }
|
||||
#box-summary p, #box-summary li { font-size: 10pt !important; line-height: 1.45 !important; letter-spacing: -0.04em !important; margin-bottom: 3px !important; text-align: justify; }
|
||||
#box-summary h1 { margin-bottom: 10px !important; padding-bottom: 5px !important; }
|
||||
|
||||
.toc-squeeze .toc-group { margin-bottom: 5px !important; }
|
||||
.toc-squeeze .toc-lvl-1 { margin-top: 8px !important; margin-bottom: 3px !important; }
|
||||
.toc-squeeze .toc-item { line-height: 1.4 !important; padding: 1px 0 !important; }
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
#### 5-D. 본문 변환 규칙
|
||||
|
||||
STEP 3에서 작성한 본문을 `box-content`에 넣을 때 아래 규칙으로 변환하십시오.
|
||||
|
||||
| 보고서 요소 | HTML 변환 |
|
||||
|------------|-----------|
|
||||
| 장 제목 (1, 2, 3...) | `<h1>1. 제목</h1>` |
|
||||
| 절 제목 (1.1, 1.2...) | `<h2>1.1 제목</h2>` |
|
||||
| 항 제목 | `<h3>제목</h3>` |
|
||||
| 본문 문단 | `<p>내용</p>` |
|
||||
| 항목 나열 | `<ul><li>항목</li></ul>` |
|
||||
| 순서 나열 | `<ol><li>항목</li></ol>` |
|
||||
| 수치 정리 | `<table>` 구조로 변환 |
|
||||
|
||||
> **주의** : `box-content` 안에는 class, style 속성을 붙이지 마십시오.
|
||||
> JS의 `detox()` 함수가 모든 class/style을 제거하고 표준 스타일로 재적용합니다.
|
||||
> 단, `highlight-box` 클래스가 필요한 강조 박스는 예외입니다.
|
||||
|
||||
---
|
||||
|
||||
#### 5-E. JS 렌더링 엔진 전문 — A4 페이지네이션
|
||||
|
||||
아래 JavaScript를 `<script>` 태그 안에 그대로 포함하십시오.
|
||||
|
||||
```javascript
|
||||
window.addEventListener("load", async () => {
|
||||
await document.fonts.ready;
|
||||
const CONFIG = { maxHeight: 970 };
|
||||
|
||||
const rawContainer = document.getElementById('raw-container');
|
||||
if (rawContainer) {
|
||||
rawContainer.innerHTML = rawContainer.innerHTML.replace(
|
||||
/(<rect[^>]*?)\s+y="[^"]*"\s+([^>]*?y="[^"]*")/gi, "$1 $2"
|
||||
);
|
||||
}
|
||||
const raw = {
|
||||
cover: document.getElementById('box-cover'),
|
||||
toc: document.getElementById('box-toc'),
|
||||
summary: document.getElementById('box-summary'),
|
||||
content: document.getElementById('box-content')
|
||||
};
|
||||
|
||||
let globalPage = 1;
|
||||
let reportTitle = raw.cover.querySelector('h1')?.innerText || "Report";
|
||||
|
||||
function detox(node) {
|
||||
if (node.nodeType !== 1) return;
|
||||
if (node.closest('svg')) return;
|
||||
let cls = "";
|
||||
if (node.hasAttribute('class')) cls = node.getAttribute('class');
|
||||
if ( (cls.includes('bg-') || cls.includes('border-') || cls.includes('box')) &&
|
||||
!cls.includes('title-box') && !cls.includes('toc-') &&
|
||||
!cls.includes('cover-') && !cls.includes('highlight-box') ) {
|
||||
node.setAttribute('class', 'highlight-box atomic-block');
|
||||
node.querySelectorAll('h3, h4, strong, b').forEach(head => { head.removeAttribute('style'); head.removeAttribute('class'); });
|
||||
node.removeAttribute('style');
|
||||
cls = 'highlight-box atomic-block';
|
||||
}
|
||||
if (node.hasAttribute('class')) {
|
||||
if (!cls.includes('toc-') && !cls.includes('cover-') && !cls.includes('highlight-') &&
|
||||
!cls.includes('title-box') && !cls.includes('atomic-block')) {
|
||||
node.removeAttribute('class');
|
||||
}
|
||||
}
|
||||
node.removeAttribute('style');
|
||||
if (node.tagName === 'TABLE') node.border = "1";
|
||||
if (node.tagName === 'FIGURE') {
|
||||
node.querySelectorAll('h3, h4, .chart-title').forEach(t => t.style.display = 'none');
|
||||
}
|
||||
}
|
||||
|
||||
function formatTOC(container) {
|
||||
const nodes = container.querySelectorAll("h1, h2, h3");
|
||||
if(nodes.length === 0) return;
|
||||
let tocHTML = "<ul style='padding-left:0; margin:0;'>";
|
||||
nodes.forEach(node => {
|
||||
let text = node.innerText.trim();
|
||||
let lvlClass = node.tagName === "H1" ? "toc-lvl-1" : (node.tagName === "H2" ? "toc-lvl-2" : "toc-lvl-3");
|
||||
let num = "", title = text;
|
||||
const match = text.match(/^(\d+(\.\d+)*)\s+(.*)/);
|
||||
if (match) { num = match[1]; title = match[3]; }
|
||||
tocHTML += `<li class='toc-item ${lvlClass}'><span class='toc-number'>${num}</span><span class='toc-text'>${title}</span></li>`;
|
||||
});
|
||||
tocHTML += "</ul>";
|
||||
container.innerHTML = tocHTML;
|
||||
}
|
||||
|
||||
function getFlatNodes(element) {
|
||||
if(element.id === 'box-toc') {
|
||||
element.querySelectorAll('*').forEach(el => detox(el));
|
||||
formatTOC(element);
|
||||
const tocNodes = [];
|
||||
let title = element.querySelector('h1');
|
||||
if (!title) { title = document.createElement('h1'); title.innerText = "목차"; }
|
||||
tocNodes.push(title.cloneNode(true));
|
||||
const allLis = element.querySelectorAll('li');
|
||||
let currentGroup = null;
|
||||
allLis.forEach(li => {
|
||||
if (li.classList.contains('toc-lvl-1')) {
|
||||
if (currentGroup) tocNodes.push(currentGroup);
|
||||
currentGroup = document.createElement('div');
|
||||
currentGroup.className = 'toc-group atomic-block';
|
||||
const ul = document.createElement('ul');
|
||||
ul.style.margin = "0"; ul.style.padding = "0";
|
||||
currentGroup.appendChild(ul);
|
||||
}
|
||||
if (!currentGroup) {
|
||||
currentGroup = document.createElement('div');
|
||||
currentGroup.className = 'toc-group atomic-block';
|
||||
const ul = document.createElement('ul');
|
||||
ul.style.margin = "0"; ul.style.padding = "0";
|
||||
currentGroup.appendChild(ul);
|
||||
}
|
||||
currentGroup.querySelector('ul').appendChild(li.cloneNode(true));
|
||||
});
|
||||
if (currentGroup) tocNodes.push(currentGroup);
|
||||
return tocNodes;
|
||||
}
|
||||
let nodes = [];
|
||||
Array.from(element.children).forEach(child => {
|
||||
detox(child);
|
||||
if (child.classList.contains('highlight-box')) {
|
||||
child.querySelectorAll('h3, h4, strong, b').forEach(head => { head.removeAttribute('style'); head.removeAttribute('class'); });
|
||||
nodes.push(child.cloneNode(true));
|
||||
}
|
||||
else if(['DIV','SECTION','ARTICLE','MAIN'].includes(child.tagName)) { nodes = nodes.concat(getFlatNodes(child)); }
|
||||
else if (['UL','OL'].includes(child.tagName)) {
|
||||
Array.from(child.children).forEach((li, idx) => {
|
||||
detox(li);
|
||||
const w = document.createElement(child.tagName);
|
||||
w.style.margin="0"; w.style.paddingLeft="20px";
|
||||
if(child.tagName==='OL') w.start=idx+1;
|
||||
const cloneLi = li.cloneNode(true);
|
||||
cloneLi.querySelectorAll('*').forEach(el => detox(el));
|
||||
w.appendChild(cloneLi);
|
||||
nodes.push(w);
|
||||
});
|
||||
} else {
|
||||
const clone = child.cloneNode(true);
|
||||
detox(clone);
|
||||
clone.querySelectorAll('*').forEach(el => detox(el));
|
||||
nodes.push(clone);
|
||||
}
|
||||
});
|
||||
return nodes;
|
||||
}
|
||||
|
||||
function renderFlow(sectionType, sourceNodes) {
|
||||
if (!sourceNodes.length) return;
|
||||
let currentHeaderTitle = sectionType === 'toc' ? "목차" : (sectionType === 'summary' ? "요약" : reportTitle);
|
||||
let page = createPage(sectionType, currentHeaderTitle);
|
||||
let body = page.querySelector('.body-content');
|
||||
let queue = [...sourceNodes];
|
||||
while (queue.length > 0) {
|
||||
let node = queue.shift();
|
||||
let clone = node.cloneNode(true);
|
||||
let isH1 = clone.tagName === 'H1';
|
||||
let isHeading = ['H2', 'H3'].includes(clone.tagName);
|
||||
let isText = ['P', 'LI'].includes(clone.tagName) && !clone.classList.contains('atomic-block');
|
||||
let isAtomic = ['TABLE', 'FIGURE', 'IMG', 'SVG'].includes(clone.tagName) ||
|
||||
clone.querySelector('table, img, svg') || clone.classList.contains('atomic-block');
|
||||
if (isH1 && clone.innerText.includes('-')) { clone.innerText = clone.innerText.split('-')[0].trim(); }
|
||||
if (isH1 && (sectionType === 'body' || sectionType === 'summary')) {
|
||||
currentHeaderTitle = clone.innerText;
|
||||
if (body.children.length > 0) { page = createPage(sectionType, currentHeaderTitle); body = page.querySelector('.body-content'); }
|
||||
else { page.querySelector('.page-header').innerText = currentHeaderTitle; }
|
||||
}
|
||||
if (isHeading) {
|
||||
const spaceLeft = CONFIG.maxHeight - body.scrollHeight;
|
||||
if (spaceLeft < 160) { page = createPage(sectionType, currentHeaderTitle); body = page.querySelector('.body-content'); }
|
||||
}
|
||||
body.appendChild(clone);
|
||||
if (isText && clone.innerText.length > 10) {
|
||||
const originalHeight = clone.offsetHeight;
|
||||
clone.style.letterSpacing = "-1.0px";
|
||||
if (clone.offsetHeight < originalHeight) { clone.style.letterSpacing = "-0.8px"; }
|
||||
else { clone.style.letterSpacing = ""; }
|
||||
}
|
||||
if (body.scrollHeight > CONFIG.maxHeight) {
|
||||
if (sectionType === 'toc' && !body.classList.contains('toc-squeeze') && body.children.length > 0) {
|
||||
body.classList.add('toc-squeeze');
|
||||
if (body.scrollHeight <= CONFIG.maxHeight) continue;
|
||||
else { body.classList.remove('toc-squeeze'); body.removeChild(clone); }
|
||||
}
|
||||
if (isText) {
|
||||
body.removeChild(clone);
|
||||
let textContent = node.innerText;
|
||||
let tempP = node.cloneNode(false); tempP.innerText = "";
|
||||
if (clone.style.letterSpacing) tempP.style.letterSpacing = clone.style.letterSpacing;
|
||||
body.appendChild(tempP);
|
||||
const words = textContent.split(' ');
|
||||
let currentText = "";
|
||||
for (let i = 0; i < words.length; i++) {
|
||||
let prevText = currentText;
|
||||
currentText += (currentText ? " " : "") + words[i];
|
||||
tempP.innerText = currentText;
|
||||
if (body.scrollHeight > CONFIG.maxHeight) {
|
||||
tempP.innerText = prevText;
|
||||
tempP.style.textAlign = "justify"; tempP.style.textAlignLast = "justify";
|
||||
let remainingNode = node.cloneNode(false);
|
||||
remainingNode.innerText = words.slice(i).join(' ');
|
||||
queue.unshift(remainingNode);
|
||||
page = createPage(sectionType, currentHeaderTitle);
|
||||
body = page.querySelector('.body-content');
|
||||
break;
|
||||
}
|
||||
}
|
||||
} else {
|
||||
body.removeChild(clone);
|
||||
let spaceLeft = CONFIG.maxHeight - body.scrollHeight;
|
||||
if (body.children.length > 0 && spaceLeft > 50 && queue.length > 0) {
|
||||
while(queue.length > 0) {
|
||||
let candidate = queue[0];
|
||||
if (['H1','H2','H3'].includes(candidate.tagName) ||
|
||||
candidate.classList.contains('atomic-block') || candidate.querySelector('img, table')) break;
|
||||
let filler = candidate.cloneNode(true);
|
||||
if(['P','LI'].includes(filler.tagName) && filler.innerText.length > 10) filler.style.letterSpacing = "-1.0px";
|
||||
body.appendChild(filler);
|
||||
if (body.scrollHeight <= CONFIG.maxHeight) {
|
||||
if(filler.style.letterSpacing === "-1.0px") filler.style.letterSpacing = "-0.8px";
|
||||
queue.shift();
|
||||
} else { body.removeChild(filler); break; }
|
||||
}
|
||||
}
|
||||
if (body.children.length > 0) { page = createPage(sectionType, currentHeaderTitle); body = page.querySelector('.body-content'); }
|
||||
body.appendChild(clone);
|
||||
if (isAtomic && body.scrollHeight > CONFIG.maxHeight) {
|
||||
const currentH = clone.offsetHeight;
|
||||
const overflow = body.scrollHeight - CONFIG.maxHeight;
|
||||
body.removeChild(clone);
|
||||
if (overflow > 0 && overflow < (currentH * 0.15)) {
|
||||
clone.style.transform = "scale(0.85)"; clone.style.transformOrigin = "top center";
|
||||
clone.style.marginBottom = `-${currentH * 0.15}px`;
|
||||
body.appendChild(clone);
|
||||
} else { body.appendChild(clone); }
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
function createPage(type, headerTitle) {
|
||||
const tpl = document.getElementById('page-template');
|
||||
const clone = tpl.content.cloneNode(true);
|
||||
const sheet = clone.querySelector('.sheet');
|
||||
if (type === 'cover') {
|
||||
sheet.innerHTML = "";
|
||||
const title = raw.cover.querySelector('h1')?.innerText || "Report";
|
||||
const sub = raw.cover.querySelector('h2')?.innerText || "";
|
||||
const pTags = raw.cover.querySelectorAll('p');
|
||||
const infos = pTags.length > 0 ? Array.from(pTags).map(p => p.innerText).join(" / ") : "";
|
||||
sheet.innerHTML = `
|
||||
<div style="position:absolute; top:20mm; right:20mm; text-align:right; font-size:11pt; color:#666;">${infos}</div>
|
||||
<div style="display:flex; flex-direction:column; justify-content:center; align-items:center; height:100%; text-align:center; width:100%;">
|
||||
<div style="width:85%;">
|
||||
<div style="font-size:32pt; font-weight:900; color:var(--primary); line-height:1.2; margin-bottom:30px; word-break:keep-all;">${title}</div>
|
||||
<div style="font-size:20pt; font-weight:300; color:#444; word-break:keep-all;">${sub}</div>
|
||||
</div>
|
||||
</div>`;
|
||||
} else {
|
||||
clone.querySelector('.page-header').innerText = headerTitle;
|
||||
clone.querySelector('.rpt-title').innerText = reportTitle;
|
||||
if (type !== 'toc') clone.querySelector('.pg-num').innerText = `- ${globalPage++} -`;
|
||||
else clone.querySelector('.pg-num').innerText = "";
|
||||
}
|
||||
document.body.appendChild(sheet);
|
||||
return sheet;
|
||||
}
|
||||
|
||||
createPage('cover');
|
||||
if(raw.toc) renderFlow('toc', getFlatNodes(raw.toc));
|
||||
|
||||
const summaryNodes = getFlatNodes(raw.summary);
|
||||
const tempBox = document.createElement('div');
|
||||
tempBox.style.width = "210mm"; tempBox.style.position = "absolute"; tempBox.style.visibility = "hidden";
|
||||
tempBox.id = 'box-summary';
|
||||
document.body.appendChild(tempBox);
|
||||
summaryNodes.forEach(node => tempBox.appendChild(node.cloneNode(true)));
|
||||
const totalHeight = tempBox.scrollHeight;
|
||||
const pageHeight = CONFIG.maxHeight;
|
||||
const lastPart = totalHeight % pageHeight;
|
||||
if (totalHeight > pageHeight && lastPart > 0 && lastPart < 180) {
|
||||
summaryNodes.forEach(node => {
|
||||
if(node.nodeType === 1) {
|
||||
node.classList.add('squeeze');
|
||||
if(node.tagName === 'H1') node.classList.add('squeeze-title');
|
||||
if(node.tagName === 'P' || node.tagName === 'LI') {
|
||||
node.style.fontSize = "9.5pt"; node.style.lineHeight = "1.4"; node.style.letterSpacing = "-0.8px";
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
document.body.removeChild(tempBox);
|
||||
renderFlow('summary', summaryNodes);
|
||||
renderFlow('body', getFlatNodes(raw.content));
|
||||
|
||||
document.querySelectorAll('.sheet h1, .sheet h2').forEach(el => {
|
||||
let fs = 100;
|
||||
while(el.scrollWidth > el.clientWidth && fs > 50) { el.style.fontSize = (--fs)+"%"; }
|
||||
});
|
||||
|
||||
const allTextNodes = document.querySelectorAll('.sheet .body-content p, .sheet .body-content li');
|
||||
allTextNodes.forEach(el => {
|
||||
if (el.closest('table') || el.closest('figure') || el.closest('.chart')) return;
|
||||
if (el.innerText.trim().length < 10) return;
|
||||
const originH = el.offsetHeight;
|
||||
const originSpacing = el.style.letterSpacing;
|
||||
el.style.fontSize = "12pt"; el.style.letterSpacing = "-1.4px";
|
||||
const newH = el.offsetHeight;
|
||||
if (newH < originH) { el.style.letterSpacing = "-1.0px"; }
|
||||
else { el.style.letterSpacing = originSpacing; }
|
||||
});
|
||||
|
||||
document.querySelectorAll('.sheet h1, .sheet h2').forEach(el => {
|
||||
let fs = 100;
|
||||
while(el.scrollWidth > el.clientWidth && fs > 50) { el.style.fontSize = (--fs)+"%"; }
|
||||
});
|
||||
|
||||
const pages = document.querySelectorAll('.sheet');
|
||||
if (pages.length >= 2) {
|
||||
const lastSheet = pages[pages.length - 1];
|
||||
const prevSheet = pages[pages.length - 2];
|
||||
if(lastSheet.querySelector('.rpt-title')) {
|
||||
const lastBody = lastSheet.querySelector('.body-content');
|
||||
const prevBody = prevSheet.querySelector('.body-content');
|
||||
if (lastBody.scrollHeight < 150 && lastBody.innerText.trim().length > 0) {
|
||||
prevBody.style.lineHeight = "1.3"; prevBody.style.paddingBottom = "0px";
|
||||
const contentToMove = Array.from(lastBody.children);
|
||||
contentToMove.forEach(child => prevBody.appendChild(child.cloneNode(true)));
|
||||
if (prevBody.scrollHeight <= CONFIG.maxHeight + 5) { lastSheet.remove(); }
|
||||
else { for(let i=0; i<contentToMove.length; i++) prevBody.lastElementChild.remove(); prevBody.style.lineHeight = ""; }
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
const rawToRemove = document.getElementById('raw-container');
|
||||
if(rawToRemove) rawToRemove.remove();
|
||||
});
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
#### 5-F. 출력 규칙 요약
|
||||
|
||||
```
|
||||
[출력 규칙]
|
||||
- STEP 3에서 확정된 절들을 5-D 변환 규칙에 따라 HTML로 변환하여 box-content에 넣으십시오.
|
||||
- 수정 확인 과정에서 변경된 내용이 있으면 최종본을 반영하십시오.
|
||||
- 내부 태그([자료-001], [AI 판단], [상충])는 본문에 포함하지 마십시오.
|
||||
- 출처는 본문 흐름 안에서 자연스럽게 녹이십시오.
|
||||
- 보고서 말미에 "참고 자료" 절을 두어, 활용한 자료 목록을 정리하십시오.
|
||||
- CSS(5-C)와 JS(5-E)를 그대로 포함하십시오. 수정하지 마십시오.
|
||||
- box-content 안에는 class, style 속성을 붙이지 마십시오. (highlight-box 예외)
|
||||
- 이 HTML을 브라우저에서 열면 A4 보고서가 자동 렌더링됩니다.
|
||||
```
|
||||
97
02. Prompts/최종본/01. (사전) 작성자 기재사항.md
Normal file
97
02. Prompts/최종본/01. (사전) 작성자 기재사항.md
Normal file
@@ -0,0 +1,97 @@
|
||||
# (사전) 요청사항
|
||||
|
||||
> 이 파일을 작성하여 프롬프트 및 관련 자료와 함께 AI에게 제공하십시오.
|
||||
|
||||
---
|
||||
|
||||
## 보고서 제목
|
||||
|
||||
```
|
||||
(예: 한국 토목 인프라 산업에서의 AutoCAD 독점 구조와 시사점)
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 보고서 목적
|
||||
|
||||
```
|
||||
(예: AutoCAD 독점 현황의 문제점을 파악하고, 토목 S/W 시장의 구조적 개선 방향에 대한 인사이트를 도출)
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 대상 독자
|
||||
|
||||
```
|
||||
(예: 사내 임직원 / 경영진 / 기술팀 등)
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 보고서 성격
|
||||
|
||||
```
|
||||
아래 중 해당하는 항목을 선택하거나, 직접 기재하십시오.
|
||||
|
||||
- [ ] 현황에 대한 문제점 분석
|
||||
- [ ] 주제에 대한 학습과 이해
|
||||
- [ ] 실무 관점의 인사이트 도출
|
||||
- [ ] 의사결정을 위한 검토 자료
|
||||
- [ ] 기타 :
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 분야 및 페르소나 힌트
|
||||
|
||||
```
|
||||
AI가 자료를 읽고 페르소나를 스스로 파악하되, 아래에 힌트를 제공할 수 있습니다.
|
||||
비워두면 AI가 자료에서 자동 파악합니다.
|
||||
|
||||
- 분야 : (예: 토목공학, 건설 IT, 환경 정책 등)
|
||||
- 전문성 : (예: 산업 분석, 기술 검토, 정책 비교 등)
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 포함 키워드
|
||||
|
||||
```
|
||||
보고서에 반드시 포함되어야 할 키워드나 주제를 나열하십시오.
|
||||
|
||||
-
|
||||
-
|
||||
-
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 보고서 흐름 (선택)
|
||||
|
||||
```
|
||||
보고서의 흐름을 직접 지정하고 싶은 경우 기재하십시오.
|
||||
비워두면 AI가 자료 분석 결과를 바탕으로 설계합니다.
|
||||
|
||||
1.
|
||||
2.
|
||||
3.
|
||||
4.
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 제공 자료 목록
|
||||
|
||||
```
|
||||
- [자료-001] 파일명 : 내용 설명
|
||||
- [자료-002] 파일명 : 내용 설명
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 추가 지시 (선택)
|
||||
|
||||
```
|
||||
AI에게 별도로 전달할 사항이 있으면 기재하십시오.
|
||||
(예: "3장은 해외 사례 중심으로", "표는 최소화해줘" 등)
|
||||
```
|
||||
12
02. Prompts/최종본/02-1. 내부 자료 정리_NotebookLM (1).md
Normal file
12
02. Prompts/최종본/02-1. 내부 자료 정리_NotebookLM (1).md
Normal file
@@ -0,0 +1,12 @@
|
||||
# (사전) 관련 내부 자료들의 업로드
|
||||
|
||||
```
|
||||
업로드 내용을 바탕으로 주요 핵심 내용들과 키워드를 중심으로 정리해주세요.
|
||||
|
||||
정리시에 꼭 포함되어야 하는 사항은 다음과 같습니다.
|
||||
- AutoCAD의 토목 엔지니어링 독점 현황
|
||||
- 이로 인한 국내 토목시장의 문제
|
||||
- 발생하는 문제점
|
||||
- 대안
|
||||
- 시사점
|
||||
```
|
||||
86
02. Prompts/최종본/02-2. 보고서 내용 생성_Skywork (1).md
Normal file
86
02. Prompts/최종본/02-2. 보고서 내용 생성_Skywork (1).md
Normal file
@@ -0,0 +1,86 @@
|
||||
# (사전) NotebookLM 요약 결과 업로드 후 아래 프롬프트 실행
|
||||
|
||||
## 역할 정의
|
||||
|
||||
```
|
||||
당신은 토목공학 및 인프라 기술 응용 분야에 전문성을 지닌 산업 분석가입니다.
|
||||
당신의 임무는 한국 인프라 건설 산업, 특히 토목 분야에서 AutoCAD의 사용 실태와
|
||||
구조적 문제에 대해 포괄적이고 통찰력 있는 분석을 제공하는 것입니다.
|
||||
이 분석은 기업 임원들을 위한 것이므로, 실질적이며 사례 기반의 인사이트에 중점을 두어야 합니다.
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 지시 사항
|
||||
|
||||
```
|
||||
먼저, 한국 인프라 산업(특히 토목 분야) 내 AutoCAD 사용의 현황을 개괄하십시오.
|
||||
|
||||
AutoCAD의 시장 지배력의 원인을 분석하되, 기술적 우수성과 관행적 의존을 모두 고려하십시오.
|
||||
|
||||
한국의 토목 기술자들이 직면한 문제, 특히 AutoCAD 사용과 관련된 어려움을 조사하십시오.
|
||||
|
||||
3D BIM 기술로의 전환 상황과 Civil 3D, Revit 등 Autodesk 제품들의 역할을 평가하십시오.
|
||||
|
||||
AutoCAD 및 기타 Autodesk 제품에 대한 사용자 경험과 실질적인 불편함을 수집하십시오.
|
||||
|
||||
최근 데이터와 신뢰할 수 있는 자료를 활용하여 분석을 뒷받침하십시오.
|
||||
|
||||
사례 연구를 포함하여 실질적인 인사이트를 제공하십시오.
|
||||
|
||||
그래프나 도표 등의 시각 자료를 활용하여 명확성과 이해도를 높이십시오.
|
||||
|
||||
분석의 전반적인 어조는 전문적이고 포괄적이어야 하며, 다각적인 시각에서 접근하십시오.
|
||||
|
||||
특정 제품 개발 방향은 제시하지 마십시오.
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 보고서 구조 지정
|
||||
|
||||
```
|
||||
보고서는 단순 연구보고서가 아니므로 일반적인 연구 개요 사항은 포함하지 마십시오.
|
||||
|
||||
보고서의 흐름은 아래 순서를 따르십시오.
|
||||
|
||||
1. 토목 S/W 시장에 대한 구조를 바탕으로 AutoCAD 독점의 배경과 문제
|
||||
2. 이러한 독점이 과연 관행인지, 아니면 기능적 수요에 의한 것인지
|
||||
3. 그렇다면 AutoCAD는 토목 인프라건설 산업 분야에서 적합한 것인지
|
||||
4. 적합하지 않다면 어떠한 기능들과 요구사항들이 포함되어야 하는 것인지
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 출처 및 성격 기준
|
||||
|
||||
```
|
||||
사례와 수치를 기반으로 하십시오.
|
||||
|
||||
SNS, 블로그, 언론자료 등 비정형 출처는 사례 참고용으로만 사용하되,
|
||||
분석과 인사이트 도출은 반드시 신뢰할 수 있는 자료나 실무 기반의 내용을 바탕으로 구성하십시오.
|
||||
|
||||
이 보고서는 특정 방향을 제시하기보다는,
|
||||
향후 전략 수립을 위한 전단계적 관찰과 다각적 검토의 성격을 지닙니다.
|
||||
정형화되지 않은 의견도 구조적으로 정리하십시오.
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 응답 스타일
|
||||
|
||||
```
|
||||
귀하의 응답은 전문적이고 포괄적이며 분석적이어야 하며, 기업 임원들이 읽기에 적합해야 합니다.
|
||||
특정 제품 개발 방향은 제시하지 않고, 균형 잡힌 관점을 제시하십시오.
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 리마인더
|
||||
|
||||
```
|
||||
실질적이고 사례 기반의 인사이트에 집중하십시오.
|
||||
최근 1~2년 이내의 데이터와 신뢰할 수 있는 출처를 활용하십시오.
|
||||
전문적인 어조를 유지하고, 다각적 분석을 제공하십시오.
|
||||
특정 제품 개발 방향은 제시하지 마십시오.
|
||||
```
|
||||
36
02. Prompts/최종본/02-3. 문체 보완 및 구조화_Gemini (1).md
Normal file
36
02. Prompts/최종본/02-3. 문체 보완 및 구조화_Gemini (1).md
Normal file
@@ -0,0 +1,36 @@
|
||||
# (사전) skywork 보고서 결과물 업로드
|
||||
|
||||
|
||||
## 역할 정의
|
||||
|
||||
```
|
||||
당신은 보고서 편집 전문가입니다.
|
||||
제공된 보고서의 내용을 수정하지 않고, 문체를 다듬고 구조적 마무리를 수행하는 것이 임무입니다.
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 절대 원칙
|
||||
|
||||
```
|
||||
본문의 내용, 수치, 사례, 출처를 변경하지 마십시오.
|
||||
문장을 삭제하거나 새로운 내용을 추가하지 마십시오.
|
||||
문체와 구조 정리만 수행하십시오.
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 지시 사항
|
||||
|
||||
```
|
||||
제공된 보고서 내용을 그대로 유지한 상태에서 아래 두 가지를 수행하십시오.
|
||||
|
||||
1. 문체 보완
|
||||
- 전체 문체를 부드럽게 다듬으십시오.
|
||||
- 딱딱하거나 나열식인 문장을 자연스러운 흐름으로 연결하십시오.
|
||||
- 내용 자체는 바꾸지 마십시오.
|
||||
|
||||
2. 구조화 마무리
|
||||
- 각 문단의 마지막에 해당 문단의 핵심 사항을 구조화하여 정리하십시오.
|
||||
- 본문 흐름을 해치지 않는 범위에서 요약·정리 항목을 추가하십시오.
|
||||
```
|
||||
78
02. Prompts/최종본/02. AI 활용 보고서 작성(3step) _ (개요) 내용 요약.md
Normal file
78
02. Prompts/최종본/02. AI 활용 보고서 작성(3step) _ (개요) 내용 요약.md
Normal file
@@ -0,0 +1,78 @@
|
||||
# AI 기반 문서 생성 — 프롬프트 모음
|
||||
|
||||
## 개요
|
||||
|
||||
내부 자료를 바탕으로 주제에 대한 분석 보고서를 생성하기 위한 AI 프롬프트 모음입니다.
|
||||
NotebookLM으로 자료를 정리하고, Skywork으로 보고서를 생성하고, Gemini로 문체를 다듬는 3단계 흐름입니다.
|
||||
|
||||
---
|
||||
|
||||
## 전체 프로세스
|
||||
|
||||
```
|
||||
내부 자료 (PDF, PPT, DOCX 등)
|
||||
↓
|
||||
[00-1] NotebookLM → 내부 자료 핵심 내용 정리
|
||||
↓
|
||||
[00-2] Skywork → 산업 분석 보고서 생성
|
||||
↓
|
||||
[00-3] Gemini → 문체 보완 및 구조화 마무리
|
||||
↓
|
||||
최종 보고서 완성
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 단계별 프롬프트
|
||||
|
||||
---
|
||||
|
||||
### 00-1. 내부 자료 핵심 내용 정리
|
||||
`사용 AI : NotebookLM`
|
||||
|
||||
내부 자료를 NotebookLM에 업로드하고, 주제와 관련된 핵심 내용을 정리합니다.
|
||||
NotebookLM은 업로드된 소스에서만 답변하므로, 정리 범위(독점 현황, 문제점, 대안, 시사점)만 지정합니다.
|
||||
|
||||
---
|
||||
|
||||
### 00-2. 주제 기반 산업 분석 보고서 생성
|
||||
`사용 AI : Skywork`
|
||||
|
||||
산업 분석가 역할을 부여하고, 주제에 대한 분석 보고서를 생성합니다.
|
||||
보고서 흐름(독점 배경 → 관행 vs 수요 → 적합성 → 요구사항)을 직접 지정하며,
|
||||
출처 신뢰도 기준과 보고서 성격(전단계적 관찰, 다각적 검토)을 명시합니다.
|
||||
|
||||
---
|
||||
|
||||
### 00-3. 문체 보완 및 구조화 마무리
|
||||
`사용 AI : Gemini`
|
||||
|
||||
Skywork이 생성한 보고서의 내용을 그대로 유지한 채, 문체를 부드럽게 다듬고
|
||||
각 문단 말미에 핵심 사항을 구조화하여 정리합니다.
|
||||
|
||||
---
|
||||
|
||||
## 한계 및 아쉬운 점
|
||||
|
||||
**Skywork의 자율성이 너무 크다** : 보고서를 잘 쓰지만 프롬프트의 지시를 넘어서 자체적으로 구조를 재편하거나 내용을 확장하는 경향이 있습니다. 작성자가 의도한 범위를 벗어나는 결과물이 자주 나옵니다.
|
||||
|
||||
**Skywork의 부분 수정이 어렵다** : 특정 문단만 수정을 요청하면 해당 부분만 고치는 것이 아니라 전체 보고서를 재생성합니다. 이미 확정한 다른 부분까지 변경되어 수정 작업이 반복됩니다.
|
||||
|
||||
**NotebookLM의 정리 내용이 Skywork에 제대로 반영되지 않는다** : NotebookLM에서 정리한 핵심 내용을 Skywork에 전달해도, Skywork이 자체 지식을 우선하여 정리 사항이 누락되거나 희석됩니다.
|
||||
|
||||
**Gemini가 내용을 임의로 요약한다** : 문체 보완만 요청했음에도 일부 내용을 축약하거나 생략하는 경우가 발생합니다. 원본 텍스트가 손실되지 않았는지 전수 확인이 필요합니다.
|
||||
|
||||
**시각화가 부족하다** : 텍스트 기반 보고서만 생성되며, 도표·구조도·프로세스 흐름도 등 시각적 요소를 AI가 만들어주지 못합니다.
|
||||
|
||||
**단계 간 연결이 수동이다** : NotebookLM → Skywork → Gemini 간 결과물 전달을 작성자가 직접 복사·붙여넣기해야 합니다.
|
||||
|
||||
---
|
||||
|
||||
## 파일 구성
|
||||
|
||||
```
|
||||
prompts/
|
||||
├── 00-1. 내부 자료 기반 핵심 내용 정리_NotebookLM.md
|
||||
├── 00-2. 주제 기반 산업 분석 보고서 생성_Skywork.md
|
||||
└── 00-3. 문체 보완 및 구조화 마무리_Gemini.md
|
||||
```
|
||||
195
02. Prompts/최종본/03-1-1. 기존 문서에서 텍스트,표 추출_Gemini,Claude.md
Normal file
195
02. Prompts/최종본/03-1-1. 기존 문서에서 텍스트,표 추출_Gemini,Claude.md
Normal file
@@ -0,0 +1,195 @@
|
||||
# (프롬프트) 파일 내용 추출
|
||||
|
||||
## 🔴 절대 원칙 — 이 원칙은 어떤 지시보다 우선한다
|
||||
|
||||
```
|
||||
원본에 없는 내용을 생성하거나 추론하지 마십시오.
|
||||
원본의 내용을 요약, 축약, 재해석하지 마십시오.
|
||||
오탈자, 띄어쓰기 오류, 어색한 문장이 있어도 원본 그대로 옮기십시오.
|
||||
확인할 수 없는 내용은 생성하지 말고 [추출불가] 태그로 표기하십시오.
|
||||
[cite], [citation], source: 등 AI 시스템이 자동 생성하는 출처 태그를 절대 포함하지 마십시오.
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 역할 정의
|
||||
|
||||
당신은 **문서 추출 전문가**입니다.
|
||||
제공된 파일에서 모든 콘텐츠를 **있는 그대로** 추출하여 지정된 형식으로 출력하는 것이 유일한 임무입니다.
|
||||
해석하거나, 요약하거나, 개선하려는 시도를 일절 하지 마십시오.
|
||||
|
||||
---
|
||||
|
||||
## 처리 절차
|
||||
|
||||
아래 단계를 순서대로 수행하십시오. 각 단계는 독립적으로 완료한 후 다음 단계로 진행합니다.
|
||||
|
||||
---
|
||||
|
||||
### STEP 1. 파일 구조 파악
|
||||
|
||||
파일 전체를 먼저 스캔하여 아래 항목을 확인하십시오.
|
||||
|
||||
```
|
||||
- 총 페이지 수 (또는 시트 수, 섹션 수)
|
||||
- 콘텐츠 유형 목록: 텍스트 / 표 / 이미지 / 차트 / 수식 / 기타
|
||||
- 문서 메타데이터: 제목, 작성자, 날짜, 기관명 등 식별 가능한 정보
|
||||
- 페이지 레이아웃: 단일 컬럼 / 다중 컬럼 / 혼합
|
||||
```
|
||||
|
||||
파악이 완료되면 아래 형식으로 먼저 보고하고 다음 단계를 진행하십시오.
|
||||
|
||||
```
|
||||
[구조 파악 완료]
|
||||
- 총 분량: X 페이지
|
||||
- 콘텐츠 유형: 텍스트, 표 X개, 이미지 X개
|
||||
- 메타데이터: 제목(OOO), 작성자(OOO), 날짜(OOO)
|
||||
- 레이아웃: OOO
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### STEP 2. 텍스트 추출 → MD 파일 출력
|
||||
|
||||
**문서의 맨 첫 줄부터 맨 마지막 줄까지 위에서 아래로(Top-to-Bottom) 순서대로 읽으십시오.**
|
||||
표만 찾거나, 이미지만 찾거나, 특정 요소만 선별 추출하지 마십시오.
|
||||
제목 → 개요 → 본문 → 표 → 캡션 → 결론의 원본 흐름을 그대로 유지하십시오.
|
||||
|
||||
아래 규칙에 따라 전체 텍스트를 추출하여 마크다운(.md) 형식으로 출력하십시오.
|
||||
|
||||
#### 2-1. 계층 구조 변환 규칙
|
||||
|
||||
| 원본 요소 | MD 변환 |
|
||||
|---------|--------|
|
||||
| 문서 제목 | `# 제목` |
|
||||
| 대목차 / 장 | `## 제목` |
|
||||
| 중목차 / 절 | `### 제목` |
|
||||
| 소목차 / 항 | `#### 제목` |
|
||||
| 본문 단락 | 빈 줄로 구분된 일반 텍스트 |
|
||||
| 번호 목록 | `1. 항목` |
|
||||
| 기호 목록 | `- 항목` |
|
||||
| 강조 (볼드) | `**텍스트**` |
|
||||
| 페이지 구분 | `---` + `<!-- page X -->` 주석 |
|
||||
|
||||
#### 2-2. 표 추출 규칙 — Visual Grid Rule
|
||||
|
||||
**"선(Line)이 법이다"**: 표의 내용이나 논리를 판단하지 말고, 오직 선이 막혀있는지 뚫려있는지만 보고 셀 병합을 결정하십시오.
|
||||
|
||||
**가로 병합 (colspan)**
|
||||
같은 행 내에서 인접한 셀 사이에 세로줄이 없다면 무조건 하나로 합치십시오.
|
||||
상위 셀 아래에 N개의 하위 열이 있다면 반드시 `colspan="N"`을 적용하십시오.
|
||||
|
||||
**세로 병합 (rowspan)**
|
||||
좌측 열에서 아래 행 사이에 가로줄이 없다면, 데이터가 달라도 무조건 하나로 합치십시오.
|
||||
특정 그룹이 시각적으로 N개 행을 포함하고 그 사이에 가로선이 없다면 `rowspan="N"`으로 묶으십시오.
|
||||
|
||||
MD는 colspan/rowspan을 직접 표현할 수 없으므로, 병합이 있는 표는 아래와 같이 처리하십시오.
|
||||
- 표 앞에 `[병합표]` 태그를 표기하십시오.
|
||||
- 병합된 셀 위치에 `[↑병합]` (세로) 또는 `[←병합]` (가로) 태그로 명시하십시오.
|
||||
- 표 뒤 JSON에서 정확한 colspan/rowspan 값을 기록하십시오.
|
||||
|
||||
표 앞에는 반드시 `[표 X] p.페이지 — 표 제목`을 기재하십시오.
|
||||
|
||||
```
|
||||
[표 1] p.1 — 샘플링 제어 설정 비교
|
||||
|
||||
| 설정 항목 | 설명 | 특징/효과 |
|
||||
|---------|-----|---------|
|
||||
| 온도 | 내용 | 내용 |
|
||||
```
|
||||
|
||||
#### 2-3. 헤더/푸터 처리
|
||||
|
||||
- 반복되는 헤더/푸터(기관명, 페이지 번호 등)는 본문에 삽입하지 않고 별도로 처리하십시오.
|
||||
- MD 파일 최상단 메타데이터 블록에 한 번만 기재하십시오.
|
||||
|
||||
```markdown
|
||||
---
|
||||
title: "문서 제목"
|
||||
author: "작성자"
|
||||
date: "날짜"
|
||||
organization: "기관명"
|
||||
total_pages: X
|
||||
---
|
||||
```
|
||||
|
||||
#### 2-4. 이미지 처리
|
||||
|
||||
> 🚨 **이미지 추출 불가**
|
||||
> AI는 PDF·문서 내 이미지를 파일로 추출할 수 없습니다.
|
||||
> 이미지가 있는 위치는 아래 태그로 자리만 표시하고, 실제 이미지 추출은 별도 코드(PyMuPDF 등)로 처리해야 합니다.
|
||||
|
||||
```
|
||||
<!-- [이미지] p.X 위치: 상/중/하, 내용: 캡션 또는 설명 -->
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### STEP 3. JSON 구조화 출력
|
||||
|
||||
전체 문서를 아래 스키마에 따라 JSON으로 출력하십시오.
|
||||
|
||||
```json
|
||||
{
|
||||
"metadata": {
|
||||
"title": "",
|
||||
"author": "",
|
||||
"date": "",
|
||||
"organization": "",
|
||||
"total_pages": 0,
|
||||
"source_format": "pdf / xlsx / csv / mp4 중 해당"
|
||||
},
|
||||
"structure": [
|
||||
{
|
||||
"page": 1,
|
||||
"sections": [
|
||||
{
|
||||
"type": "heading / paragraph / table / image / list",
|
||||
"level": "h1 / h2 / h3 / null",
|
||||
"content": "원본 텍스트 그대로",
|
||||
"table_id": "표인 경우 테이블 ID, 아니면 null",
|
||||
"image_id": "이미지인 경우 이미지 ID, 아니면 null"
|
||||
}
|
||||
]
|
||||
}
|
||||
],
|
||||
"tables": [
|
||||
{
|
||||
"id": "tbl_p01_001",
|
||||
"page": 1,
|
||||
"caption": "표 제목 또는 null",
|
||||
"headers": ["열1", "열2"],
|
||||
"rows": [
|
||||
["셀1", "셀2"]
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### STEP 4. 추출 결과 검증 보고
|
||||
|
||||
모든 추출이 완료되면 아래 형식으로 검증 결과를 보고하십시오.
|
||||
|
||||
```
|
||||
[추출 완료 보고]
|
||||
|
||||
✅ MD 파일 : 총 X 페이지 / 표 X개 / 이미지 위치 표시 X개
|
||||
✅ JSON 파일 : sections X개 / tables X개
|
||||
🚨 이미지 파일 : 추출 불가 — 별도 코드 처리 필요
|
||||
|
||||
⚠️ 추출 불가 항목 (있는 경우만 기재)
|
||||
- p.X : [추출불가] 사유 설명
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 출력 파일 명명 규칙
|
||||
|
||||
| 파일 | 명명 규칙 | 예시 |
|
||||
|------|---------|------|
|
||||
| MD | `원본파일명.md` | `프롬프트_엔지니어링.md` |
|
||||
| JSON | `원본파일명.json` | `프롬프트_엔지니어링.json` |
|
||||
| 이미지 | `img_p페이지번호_순번.png` | `img_p01_001.png` |
|
||||
111
02. Prompts/최종본/03-1-2. 프롬프트 설명서.md
Normal file
111
02. Prompts/최종본/03-1-2. 프롬프트 설명서.md
Normal file
@@ -0,0 +1,111 @@
|
||||
# 프롬프트 구조 및 내용 해설
|
||||
## (프롬프트) 파일 내용 추출
|
||||
|
||||
---
|
||||
|
||||
## 🚨 지원 파일 형식 및 제한 사항
|
||||
|
||||
### 처리 가능한 형식
|
||||
|
||||
| 형식 | 확장자 |
|
||||
|------|--------|
|
||||
| 문서 | `.pdf`, `.ppt`, `.pptx`, `.doc`, `.docx` |
|
||||
| 이미지 | `.png`, `.jpg` |
|
||||
| 텍스트 | `.md`, `.txt` |
|
||||
|
||||
### 🔴 HWP / HWPX — 처리 불가
|
||||
|
||||
한컴오피스의 HWP·HWPX 파일은 **이 프롬프트로 처리할 수 없습니다.**
|
||||
|
||||
이유는 두 가지입니다. 첫째, HWP는 한컴 독자 바이너리 포맷으로 AI가 직접 읽을 수 없습니다. 둘째, pyhwpx 등 변환 라이브러리를 사용하더라도 한글 버전에 따라 호환성 문제가 빈번히 발생합니다.
|
||||
|
||||
**HWP 파일은 반드시 사전에 PDF 또는 DOCX로 변환한 후 이 프롬프트를 적용하십시오.**
|
||||
|
||||
---
|
||||
|
||||
## 전체 구성 한눈에 보기
|
||||
|
||||
| 순서 | 구성요소 | 역할 한 줄 요약 |
|
||||
|:---:|---------|--------------|
|
||||
| 1 | **절대 원칙** | 추론·요약·생성 차단 |
|
||||
| 2 | **역할 정의** | AI의 작업 태도 설정 |
|
||||
| 3 | **STEP 1** | 파일 전체 구조 먼저 파악 |
|
||||
| 4 | **STEP 2** | 텍스트 추출 → MD 출력 |
|
||||
| 5 | **STEP 3** | 전체 문서 JSON 구조화 |
|
||||
| 6 | **STEP 4** | 추출 결과 검증 보고 |
|
||||
|
||||
---
|
||||
|
||||
## 1. 절대 원칙 — 추론·요약·생성 차단
|
||||
|
||||
**이 프롬프트에서 하는 역할**
|
||||
|
||||
생성형 AI의 가장 큰 문제는 원본에 없는 내용을 자연스럽게 채워 넣는다는 점입니다. 특히 Gemini는 아무리 "그대로 추출하라"고 해도 문장을 보완하거나 재해석하는 경향이 강해 원본 무결성을 보장할 수 없습니다. 절대 원칙은 이 성질을 억제하는 강한 제약 선언입니다.
|
||||
|
||||
"오탈자가 있어도 원본 그대로"라는 지시는 AI가 친절하게 교정하려는 행동을 차단하고, "[추출불가] 태그"는 확인 불가 영역을 임의로 채우지 말고 명시적으로 표시하도록 강제합니다.
|
||||
|
||||
"[cite], [citation], source: 태그 금지"는 AI 아티팩트 제거 규칙입니다. 일부 AI 모델은 추출 과정에서 출처 태그를 자동으로 삽입하는데, 이는 원본에 없는 내용으로 데이터 오염을 유발합니다. 이후 RAG 구축이나 본문 생성 단계에서 이 태그가 그대로 유입되면 결과물의 신뢰성이 훼손됩니다.
|
||||
|
||||
**왜 역할 정의보다 먼저 오는가**
|
||||
|
||||
절대 원칙은 역할 정의를 포함한 이후의 모든 지시보다 우선순위가 높습니다. 역할 정의 뒤에 두면 AI가 역할 수행을 위해 원칙을 유연하게 해석할 여지가 생깁니다.
|
||||
|
||||
---
|
||||
|
||||
## 2. 역할 정의 — AI의 작업 태도 설정
|
||||
|
||||
**이 프롬프트에서 하는 역할**
|
||||
|
||||
"문서 추출 전문가"라는 역할은 AI가 편집자·요약자·번역자처럼 행동하지 않도록 경계를 만듭니다. "해석하거나 요약하거나 개선하려는 시도를 일절 하지 마십시오"라는 문장이 핵심으로, 이 한 문장이 이후 모든 단계에서 AI의 판단 기준이 됩니다.
|
||||
|
||||
---
|
||||
|
||||
## 3. STEP 1 — 파일 구조 먼저 파악
|
||||
|
||||
**왜 바로 추출하지 않고 구조 파악을 먼저 하는가**
|
||||
|
||||
파일을 바로 추출하면 AI가 중간에 레이아웃을 잘못 판단하여 텍스트 순서가 뒤바뀌거나 표가 일반 텍스트로 처리되는 오류가 발생합니다. 특히 다단 레이아웃(2단 편집)이나 헤더/푸터가 있는 PDF는 구조를 먼저 파악하지 않으면 추출 순서가 틀립니다.
|
||||
|
||||
"구조 파악 완료" 보고를 먼저 받음으로써 사용자가 AI가 문서를 올바르게 인식했는지 확인한 후 다음 단계를 진행할 수 있습니다.
|
||||
|
||||
---
|
||||
|
||||
## 4. STEP 2 — 텍스트 추출 → MD 출력
|
||||
|
||||
**왜 MD(마크다운)인가**
|
||||
|
||||
MD는 계층 구조(제목 레벨)와 표, 목록을 텍스트 형태로 표현할 수 있어 이후 글벗 파이프라인의 모든 단계에서 입력 형식으로 사용 가능합니다. PDF의 고유 포맷을 그대로 가져오면 다음 단계 처리가 불가합니다.
|
||||
|
||||
**왜 Top-to-Bottom(순차 추출)을 명시하는가**
|
||||
|
||||
AI는 별도 지시가 없으면 표·이미지처럼 눈에 띄는 요소를 먼저 처리하는 경향이 있습니다. 이렇게 되면 표 앞의 개요 설명이나 표 뒤의 결론 문단이 누락됩니다. "맨 첫 줄부터 맨 마지막 줄까지 위에서 아래로"라는 명시적 순서 지시가 없으면 본문 단락이 통째로 빠지는 오류가 발생합니다.
|
||||
|
||||
**Visual Grid Rule — 왜 내용이 아닌 선으로 판단하는가**
|
||||
|
||||
표 병합 처리에서 AI가 가장 자주 저지르는 오류는 셀의 내용을 보고 스스로 병합 여부를 판단하는 것입니다. 예를 들어 '직접영향권'이라는 텍스트가 5개 행에 걸쳐 있어도 AI가 내용상 "반복"이라고 판단하면 rowspan을 적용하지 않고 각각 분리하거나, 반대로 관련 있어 보이는 셀을 임의로 합치는 오류를 범합니다. "선이 막혔는지만 보라"는 규칙은 AI의 내용 기반 판단을 차단하고 시각적 구조만 따르도록 강제합니다.
|
||||
|
||||
**헤더/푸터를 본문에서 분리하는 이유**
|
||||
|
||||
PDF의 반복 헤더/푸터(기관명, 페이지 번호 등)는 매 페이지마다 동일하게 존재합니다. 이를 본문에 그대로 넣으면 이후 AI가 내용을 처리할 때 반복 텍스트로 인식하여 오류가 발생합니다. 메타데이터 블록에 한 번만 기재하여 본문과 분리합니다.
|
||||
|
||||
**이미지 위치에 자리 표시만 하는 이유**
|
||||
|
||||
AI는 PDF·문서 내 이미지를 파일로 직접 추출할 수 없습니다. 이미지가 있는 위치는 주석 태그로만 표시하고, 실제 이미지 추출은 PyMuPDF 등의 코드로 별도 처리해야 합니다.
|
||||
|
||||
---
|
||||
|
||||
## 5. STEP 3 — JSON 구조화 출력
|
||||
|
||||
**왜 MD와 별도로 JSON을 출력하는가**
|
||||
|
||||
MD는 사람이 읽기 위한 형식이고, JSON은 글벗 파이프라인의 다음 단계(도메인 분석, RAG 구축 등)에서 코드가 읽기 위한 형식입니다. 동일한 내용을 두 가지 형식으로 동시에 출력하여 사람과 시스템이 각각 필요한 형식을 사용할 수 있도록 합니다.
|
||||
|
||||
JSON 스키마에서 `sections` 배열의 각 항목이 `table_id`, `image_id`를 참조하도록 설계한 것은 본문 텍스트·표·이미지의 원래 순서와 위치 관계를 코드에서 정확하게 재구성하기 위해서입니다.
|
||||
|
||||
---
|
||||
|
||||
## 6. STEP 4 — 추출 결과 검증 보고
|
||||
|
||||
**왜 마지막에 검증 보고가 있는가**
|
||||
|
||||
추출 작업이 완료되어도 누락이나 오류가 있었는지 사용자는 전체 결과물을 직접 검토하기 전까지 알 수 없습니다. 검증 보고는 AI 스스로 추출한 항목 수를 집계하여 보고하도록 하여, 사용자가 원본 문서의 예상 항목 수와 비교할 수 있게 합니다. `[추출불가]` 항목이 있는 경우 이 단계에서 명시적으로 확인할 수 있습니다.
|
||||
147
02. Prompts/최종본/03-2-1. 업로드 문서 기반 목차 구성_GPT.md
Normal file
147
02. Prompts/최종본/03-2-1. 업로드 문서 기반 목차 구성_GPT.md
Normal file
@@ -0,0 +1,147 @@
|
||||
# (프롬프트) 문서 구조 설계
|
||||
|
||||
## 🔴 절대 원칙 — 이 원칙은 어떤 지시보다 우선한다
|
||||
|
||||
```
|
||||
제공된 자료에 없는 내용을 목차나 키워드로 생성하지 마십시오.
|
||||
모든 목차 항목은 반드시 제공된 자료에서 근거를 찾아 출처를 명기하십시오.
|
||||
출처를 찾을 수 없는 항목은 생성하지 말고 [근거없음] 태그로 표기하십시오.
|
||||
자료 간 내용이 상충될 경우 임의로 판단하지 말고 [상충] 태그로 표기하십시오.
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 역할 정의
|
||||
|
||||
당신은 **문서 구조 설계 전문가**입니다.
|
||||
제공된 자료들을 분석하여 보고서의 뼈대(목차)를 설계하고,
|
||||
각 목차 항목별로 어떤 내용이 담길지, 그 근거가 어느 자료 어느 부분인지를 함께 제시하는 것이 임무입니다.
|
||||
|
||||
---
|
||||
|
||||
## 처리 절차
|
||||
|
||||
아래 단계를 순서대로 수행하십시오. 각 단계는 편집장(사용자)의 확인 후 다음 단계로 진행합니다.
|
||||
|
||||
---
|
||||
|
||||
### STEP 1. 자료 분석 및 문서 성격 파악
|
||||
|
||||
제공된 모든 자료를 읽고 아래 항목을 파악하십시오.
|
||||
|
||||
```
|
||||
[자료 분석 완료]
|
||||
|
||||
▣ 자료 목록
|
||||
- [자료-001] 파일명 : 내용 한 줄 요약
|
||||
- [자료-002] 파일명 : 내용 한 줄 요약
|
||||
(이하 동일)
|
||||
|
||||
▣ 문서 성격
|
||||
- 분야 : (예: 건설/교통/환경/정책 등)
|
||||
- 문서 유형 : (예: 기술보고서/기획안/검토의견서 등)
|
||||
- 핵심 주제 : (자료 전체를 관통하는 핵심 주제 1~2문장)
|
||||
|
||||
▣ 자료 간 관계
|
||||
- 보완 관계 : (서로 다른 측면을 다루는 자료)
|
||||
- 중복 내용 : (여러 자료에 걸쳐 반복되는 내용)
|
||||
- 상충 내용 : (자료 간 내용이 다른 부분, 있는 경우만)
|
||||
```
|
||||
|
||||
파악이 완료되면 위 형식으로 보고하고 편집장의 확인을 기다리십시오.
|
||||
|
||||
---
|
||||
|
||||
### STEP 2. 목차 초안 설계
|
||||
|
||||
STEP 1에서 파악한 내용을 바탕으로 보고서의 목차 초안을 설계하십시오.
|
||||
|
||||
#### 목차 설계 기준
|
||||
|
||||
- 장(Chapter) 단위로 먼저 구성하고, 각 장 아래 절(Section)을 배치하십시오.
|
||||
- 각 장·절은 제공된 자료에서 충분한 내용이 뒷받침되는 항목만 구성하십시오.
|
||||
- 논리적 흐름(배경 → 현황 → 분석 → 결론)을 기본 구조로 하되, 문서 성격에 따라 조정하십시오.
|
||||
|
||||
#### 출력 형식
|
||||
|
||||
```
|
||||
[목차 초안]
|
||||
|
||||
# 1장. 장 제목
|
||||
## 1.1. 절 제목
|
||||
## 1.2. 절 제목
|
||||
|
||||
# 2장. 장 제목
|
||||
## 2.1. 절 제목
|
||||
...
|
||||
```
|
||||
|
||||
목차 초안을 제시하고 편집장의 확인을 기다리십시오.
|
||||
편집장이 수정을 요청하면 반영 후 재제시하십시오.
|
||||
|
||||
---
|
||||
|
||||
### STEP 3. 목차별 콘텐츠 설계 (핵심 내용 + 출처)
|
||||
|
||||
확정된 목차의 각 절(Section)별로 아래 형식에 따라 콘텐츠 설계서를 작성하십시오.
|
||||
|
||||
```
|
||||
## 1.1. 절 제목
|
||||
|
||||
▣ 핵심 내용
|
||||
- 이 절에서 다뤄야 할 주요 내용 항목 (3~5개)
|
||||
- 제공된 자료에서 직접 확인된 내용만 기재
|
||||
|
||||
▣ 주요 키워드
|
||||
- 이 절과 관련된 핵심 용어·개념 (5개 이내)
|
||||
|
||||
▣ 출처
|
||||
- [자료-001] p.X : 해당 내용이 있는 위치와 내용 요약
|
||||
- [자료-003] p.X : 해당 내용이 있는 위치와 내용 요약
|
||||
|
||||
▣ 유의사항 (해당하는 경우만 기재)
|
||||
- [근거없음] : 자료에서 확인되지 않아 추가 자료가 필요한 항목
|
||||
- [상충] : 자료 간 내용이 다른 부분과 각 자료의 입장
|
||||
```
|
||||
|
||||
모든 절의 콘텐츠 설계가 완료되면 전체를 한 번에 제시하고 편집장의 최종 확인을 기다리십시오.
|
||||
|
||||
---
|
||||
|
||||
### STEP 4. 구조 설계서 최종 출력
|
||||
|
||||
편집장이 STEP 3을 최종 확인하면, 아래 형식으로 구조 설계서를 JSON으로 출력하십시오.
|
||||
|
||||
```json
|
||||
{
|
||||
"document": {
|
||||
"title": "보고서 제목 (편집장이 지정하지 않은 경우 [미정])",
|
||||
"field": "분야",
|
||||
"type": "문서 유형",
|
||||
"sources": [
|
||||
{ "id": "자료-001", "filename": "파일명", "summary": "내용 요약" }
|
||||
]
|
||||
},
|
||||
"toc": [
|
||||
{
|
||||
"chapter": 1,
|
||||
"title": "장 제목",
|
||||
"sections": [
|
||||
{
|
||||
"section": "1.1",
|
||||
"title": "절 제목",
|
||||
"keywords": ["키워드1", "키워드2"],
|
||||
"key_contents": ["핵심 내용 1", "핵심 내용 2"],
|
||||
"sources": [
|
||||
{ "id": "자료-001", "page": "X", "note": "관련 내용 요약" }
|
||||
],
|
||||
"flags": {
|
||||
"no_evidence": ["근거없음 항목 (없으면 빈 배열)"],
|
||||
"conflict": ["상충 항목 (없으면 빈 배열)"]
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
```
|
||||
87
02. Prompts/최종본/03-2-2. 프롬프트 설명서.md
Normal file
87
02. Prompts/최종본/03-2-2. 프롬프트 설명서.md
Normal file
@@ -0,0 +1,87 @@
|
||||
# 프롬프트 구조 및 내용 해설
|
||||
## (프롬프트) 문서 구조 설계
|
||||
|
||||
---
|
||||
|
||||
## 이 프롬프트가 하는 일
|
||||
|
||||
참조 자료들을 AI에게 업로드하면, AI가 자료를 읽고 보고서의 목차를 설계한 뒤 각 목차 항목별로 어떤 내용이 들어가야 하는지, 그 근거가 어느 자료 어느 페이지에 있는지를 함께 출력합니다.
|
||||
|
||||
---
|
||||
|
||||
## 전체 구성 한눈에 보기
|
||||
|
||||
| 순서 | 구성요소 | 역할 한 줄 요약 |
|
||||
|:---:|---------|--------------|
|
||||
| 1 | **절대 원칙** | 근거 없는 목차 생성 차단 |
|
||||
| 2 | **역할 정의** | AI의 작업 태도 설정 |
|
||||
| 3 | **STEP 1** | 자료 전체 읽기 및 문서 성격 파악 |
|
||||
| 4 | **STEP 2** | 목차 초안 설계 및 확인 |
|
||||
| 5 | **STEP 3** | 목차별 핵심 내용 + 출처 설계 |
|
||||
| 6 | **STEP 4** | 구조 설계서 JSON 최종 출력 |
|
||||
|
||||
---
|
||||
|
||||
## 1. 절대 원칙 — 근거 없는 목차 생성 차단
|
||||
|
||||
**이 프롬프트에서 하는 역할**
|
||||
|
||||
목차 설계에서 AI가 가장 자주 저지르는 오류는 자료에 없는 내용을 그럴듯하게 채워 넣는 것입니다. 예를 들어 "3장. 향후 과제"라는 항목을 만들고 내용을 스스로 생성하거나, 자료에서 언급만 된 개념을 마치 충분한 근거가 있는 것처럼 목차에 포함시키는 경우입니다.
|
||||
|
||||
`[근거없음]`, `[상충]` 태그는 AI가 불확실한 부분을 숨기지 않고 명시적으로 드러내도록 강제합니다. 이 표시가 있는 항목은 편집장이 추가 자료를 보완하거나 해당 항목을 삭제하는 판단을 내릴 수 있습니다.
|
||||
|
||||
**왜 역할 정의보다 먼저 오는가**
|
||||
|
||||
절대 원칙은 역할 정의를 포함한 이후의 모든 지시보다 우선순위가 높습니다. 역할 정의 뒤에 두면 AI가 "전문가답게 목차를 채우려는" 역할 수행을 위해 원칙을 유연하게 해석할 여지가 생깁니다.
|
||||
|
||||
---
|
||||
|
||||
## 2. 역할 정의 — AI의 작업 태도 설정
|
||||
|
||||
**이 프롬프트에서 하는 역할**
|
||||
|
||||
"문서 구조 설계 전문가"라는 역할은 AI가 내용 생성자가 아닌 구조 설계자로 행동하도록 경계를 만듭니다. 목차를 설계하는 것과 본문을 쓰는 것은 다른 작업입니다. 이 프롬프트에서 AI의 임무는 "어떤 내용이 어느 자료에 있는가"를 정리하는 것이지, 본문을 직접 작성하는 것이 아닙니다.
|
||||
|
||||
---
|
||||
|
||||
## 3. STEP 1 — 자료 분석 및 문서 성격 파악
|
||||
|
||||
**왜 목차 설계 전에 자료 분석을 먼저 하는가**
|
||||
|
||||
자료를 분석하지 않고 바로 목차를 설계하면 AI가 자료의 실제 내용과 무관하게 일반적인 보고서 형식을 그대로 가져다 쓰는 경우가 많습니다. 자료 목록, 문서 성격, 자료 간 관계를 먼저 파악하고 편집장이 확인함으로써 AI가 자료를 제대로 읽었는지 검증할 수 있습니다.
|
||||
|
||||
**자료 간 상충 내용을 명시하는 이유**
|
||||
|
||||
여러 자료가 제공될 때 서로 다른 주장이나 수치가 섞여 있을 수 있습니다. 이를 AI가 임의로 하나를 선택하거나 평균내어 처리하면 보고서의 신뢰성이 훼손됩니다. STEP 1에서 상충 내용을 미리 표시하면 편집장이 어느 자료를 기준으로 할지 판단할 수 있습니다.
|
||||
|
||||
---
|
||||
|
||||
## 4. STEP 2 — 목차 초안 설계
|
||||
|
||||
**왜 목차를 한 번에 확정하지 않고 초안 → 확인 → 확정 순서로 가는가**
|
||||
|
||||
목차는 이후 본문 생성 전체의 방향을 결정합니다. 목차가 잘못되면 본문 생성 단계에서 처음부터 다시 해야 합니다. 초안 단계에서 편집장의 확인을 받아 방향을 잡는 것이 전체 작업 효율 면에서 유리합니다.
|
||||
|
||||
**논리적 흐름(배경 → 현황 → 분석 → 결론)을 기본으로 하는 이유**
|
||||
|
||||
보고서를 읽는 임원이나 의사결정자는 이 흐름에 익숙합니다. 다른 구조를 쓰려면 별도의 이유가 있어야 하므로, 특별한 지시가 없는 한 이 흐름을 기본값으로 설정했습니다.
|
||||
|
||||
---
|
||||
|
||||
## 5. STEP 3 — 목차별 콘텐츠 설계
|
||||
|
||||
**왜 핵심 내용과 출처를 함께 정리하는가**
|
||||
|
||||
이 단계의 결과물이 다음 단계인 본문 생성 프롬프트의 입력값이 됩니다. 본문 생성 AI는 "이 절에서 무엇을 써야 하는지"와 "어느 자료를 참조해야 하는지"를 이 설계서에서 가져옵니다. 출처가 함께 정리되어 있어야 본문 생성 단계에서 AI가 근거 없는 내용을 만들어내는 것을 막을 수 있습니다.
|
||||
|
||||
**키워드를 별도로 정리하는 이유**
|
||||
|
||||
키워드는 본문 생성 단계에서 해당 절의 핵심 용어가 일관되게 사용되도록 하는 기준이 됩니다. 같은 개념을 문서마다 다른 용어로 쓰는 혼선을 방지합니다.
|
||||
|
||||
---
|
||||
|
||||
## 6. STEP 4 — JSON 최종 출력
|
||||
|
||||
**왜 마지막에 JSON으로 출력하는가**
|
||||
|
||||
STEP 1~3은 편집장과 AI가 주고받으며 목차를 다듬는 대화 과정입니다. 최종 확정된 구조를 JSON으로 출력하면 본문 생성 프롬프트에서 이 파일을 그대로 입력값으로 사용할 수 있습니다. 대화 내용에서 필요한 정보를 다시 정리할 필요 없이 다음 단계로 바로 넘어갈 수 있습니다.
|
||||
@@ -0,0 +1,171 @@
|
||||
# (프롬프트) 외부 자료 조사
|
||||
|
||||
## 🔴 절대 원칙 — 이 원칙은 어떤 지시보다 우선한다
|
||||
|
||||
```
|
||||
조사된 외부 자료는 요약하지 말고 핵심 내용을 원문에 가깝게 정리하십시오.
|
||||
모든 외부 자료는 반드시 출처(URL, 발행처, 날짜)를 명기하십시오.
|
||||
출처가 불명확하거나 신뢰할 수 없는 자료는 [출처불명] 태그로 표기하십시오.
|
||||
내부 자료와 외부 조사 결과가 상충될 경우 임의로 판단하지 말고 [상충] 태그로 표기하십시오.
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 역할 정의
|
||||
|
||||
당신은 **외부 자료 조사 전문가**입니다.
|
||||
확정된 보고서 목차를 기준으로, 각 절(Section)별로 내부 자료만으로 부족한 내용을 외부에서 조사하여 보완하는 것이 임무입니다.
|
||||
조사 결과는 본문 생성 단계에서 바로 활용할 수 있도록 목차 구조에 맞춰 정리합니다.
|
||||
|
||||
---
|
||||
|
||||
## 사전 준비 — 입력값 확인
|
||||
|
||||
이 프롬프트를 실행하기 전에 아래 두 가지가 준비되어 있어야 합니다.
|
||||
|
||||
```
|
||||
1. 02단계에서 출력된 구조 설계서 JSON
|
||||
→ 목차 구조와 각 절별 키워드·핵심 내용이 담긴 파일
|
||||
|
||||
2. 조사 도구 준비
|
||||
→ Perplexity (https://www.perplexity.ai) : 최신 정보 및 통계 조사
|
||||
→ Liner (https://getliner.com) : 논문·전문 자료 조사
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 처리 절차
|
||||
|
||||
---
|
||||
|
||||
### STEP 1. 조사 필요 항목 식별
|
||||
|
||||
구조 설계서 JSON을 읽고, 각 절별로 외부 조사가 필요한 항목을 파악하십시오.
|
||||
|
||||
아래 기준으로 조사 필요 여부를 판단하십시오.
|
||||
|
||||
```
|
||||
조사 필요 ▶ 내부 자료에 [근거없음]으로 표기된 항목
|
||||
조사 필요 ▶ 내부 자료만으로 내용이 부족한 항목 (통계, 최신 동향, 법령 등)
|
||||
조사 불필요 ▶ 내부 자료에서 충분히 뒷받침되는 항목
|
||||
```
|
||||
|
||||
파악이 완료되면 아래 형식으로 보고하고 편집장의 확인을 기다리십시오.
|
||||
|
||||
```
|
||||
[조사 필요 항목 파악 완료]
|
||||
|
||||
▣ 조사 필요 항목
|
||||
- 1.2절 : 최근 3년 통계 자료 부족
|
||||
- 2.1절 : 관련 법령 개정 현황 확인 필요
|
||||
- 3.3절 : 해외 사례 추가 필요
|
||||
(이하 동일)
|
||||
|
||||
▣ 조사 불필요 항목
|
||||
- 1.1절 : 내부 자료로 충분
|
||||
(이하 동일)
|
||||
|
||||
총 조사 필요 항목: X개
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### STEP 2. 조사 쿼리 설계
|
||||
|
||||
STEP 1에서 파악한 항목별로 Perplexity와 Liner에 입력할 검색 쿼리를 설계하십시오.
|
||||
|
||||
#### 도구별 역할 분담
|
||||
|
||||
| 도구 | 적합한 조사 대상 |
|
||||
|------|--------------|
|
||||
| **Perplexity** | 최신 통계·수치, 최근 동향·이슈, 정책·법령 현황, 국내외 사례 |
|
||||
| **Liner** | 학술 논문, 전문 보고서, 기술 자료, 심층 분석 자료 |
|
||||
|
||||
#### 쿼리 설계 출력 형식
|
||||
|
||||
```
|
||||
[조사 쿼리 설계]
|
||||
|
||||
▣ 1.2절 — 최근 3년 통계
|
||||
Perplexity : "쿼리 내용" (한국어 또는 영어)
|
||||
Liner : "쿼리 내용"
|
||||
|
||||
▣ 2.1절 — 관련 법령 개정 현황
|
||||
Perplexity : "쿼리 내용"
|
||||
Liner : 해당 없음
|
||||
(이하 동일)
|
||||
```
|
||||
|
||||
쿼리 설계를 제시하고 편집장의 확인을 기다리십시오.
|
||||
편집장이 쿼리를 수정하거나 추가하면 반영 후 재제시하십시오.
|
||||
|
||||
---
|
||||
|
||||
### STEP 3. 조사 결과 정리
|
||||
|
||||
편집장이 Perplexity·Liner에서 조사한 결과를 붙여넣으면, 아래 형식으로 절별 조사 결과를 정리하십시오.
|
||||
|
||||
```
|
||||
## 1.2절 — 절 제목
|
||||
|
||||
▣ 조사 결과 요약
|
||||
- 핵심 내용 1
|
||||
- 핵심 내용 2
|
||||
- 핵심 내용 3
|
||||
|
||||
▣ 주요 수치·통계 (있는 경우만)
|
||||
- 수치 내용 : 출처
|
||||
|
||||
▣ 출처 목록
|
||||
- [외부-001] 제목 / 발행처 / 날짜 / URL
|
||||
- [외부-002] 제목 / 발행처 / 날짜 / URL
|
||||
|
||||
▣ 내부 자료와의 관계
|
||||
- 보완 : 내부 자료의 어느 부분을 어떻게 보완하는지
|
||||
- [상충] : 내부 자료와 다른 내용이 있는 경우 명시 (없으면 생략)
|
||||
```
|
||||
|
||||
모든 항목 정리가 완료되면 편집장의 확인을 기다리십시오.
|
||||
|
||||
---
|
||||
|
||||
### STEP 4. 보완된 구조 설계서 JSON 출력
|
||||
|
||||
편집장이 STEP 3을 최종 확인하면, 02단계 JSON에 외부 조사 결과를 병합하여 업데이트된 구조 설계서를 출력하십시오.
|
||||
|
||||
```json
|
||||
{
|
||||
"document": { },
|
||||
"toc": [
|
||||
{
|
||||
"chapter": 1,
|
||||
"sections": [
|
||||
{
|
||||
"section": "1.2",
|
||||
"title": "절 제목",
|
||||
"keywords": [],
|
||||
"key_contents": [],
|
||||
"sources": [
|
||||
{ "id": "자료-001", "page": "X", "note": "내부 자료" }
|
||||
],
|
||||
"external_sources": [
|
||||
{
|
||||
"id": "외부-001",
|
||||
"tool": "Perplexity 또는 Liner",
|
||||
"title": "자료 제목",
|
||||
"publisher": "발행처",
|
||||
"date": "날짜",
|
||||
"url": "URL",
|
||||
"note": "활용 내용 요약"
|
||||
}
|
||||
],
|
||||
"flags": {
|
||||
"no_evidence": [],
|
||||
"conflict": []
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
```
|
||||
80
02. Prompts/최종본/03-3-2. 프롬프트 설명서.md
Normal file
80
02. Prompts/최종본/03-3-2. 프롬프트 설명서.md
Normal file
@@ -0,0 +1,80 @@
|
||||
# 프롬프트 구조 및 내용 해설
|
||||
## (프롬프트) 외부 자료 조사
|
||||
|
||||
---
|
||||
|
||||
## 이 프롬프트가 하는 일
|
||||
|
||||
02단계에서 확정된 목차를 기준으로, 내부 자료만으로 부족한 항목을 Perplexity와 Liner를 통해 외부에서 보완 조사합니다. 조사 결과는 목차 구조에 맞춰 정리되어 04단계 본문 생성의 입력값으로 연결됩니다.
|
||||
|
||||
---
|
||||
|
||||
## 전체 구성 한눈에 보기
|
||||
|
||||
| 순서 | 구성요소 | 역할 한 줄 요약 |
|
||||
|:---:|---------|--------------|
|
||||
| 1 | **절대 원칙** | 출처 불명 자료 사용 차단 |
|
||||
| 2 | **역할 정의** | AI의 작업 태도 설정 |
|
||||
| 3 | **사전 준비** | 입력값 및 도구 확인 |
|
||||
| 4 | **STEP 1** | 조사 필요 항목 식별 |
|
||||
| 5 | **STEP 2** | 도구별 검색 쿼리 설계 |
|
||||
| 6 | **STEP 3** | 조사 결과 정리 |
|
||||
| 7 | **STEP 4** | 보완된 구조 설계서 JSON 출력 |
|
||||
|
||||
---
|
||||
|
||||
## 1. 절대 원칙 — 출처 불명 자료 사용 차단
|
||||
|
||||
**이 프롬프트에서 하는 역할**
|
||||
|
||||
외부 조사에서 가장 위험한 문제는 출처가 불분명한 정보가 보고서에 그대로 유입되는 것입니다. AI는 그럴듯해 보이는 수치나 내용을 출처 없이 생성하거나, 조회된 자료의 출처를 부정확하게 표기하는 경우가 있습니다. 임원 보고용 문서에서 출처 불명 정보가 포함되면 신뢰성 전체가 훼손됩니다.
|
||||
|
||||
`[출처불명]` 태그는 AI가 확인되지 않은 자료를 그냥 쓰는 대신 명시적으로 표시하도록 강제합니다. `[상충]` 태그는 외부 조사 결과가 내부 자료와 다를 때 편집장이 판단할 수 있도록 드러냅니다.
|
||||
|
||||
---
|
||||
|
||||
## 2. 사전 준비 — 입력값 및 도구 확인
|
||||
|
||||
**왜 사전 준비 항목이 별도로 있는가**
|
||||
|
||||
이 프롬프트는 02단계 JSON을 입력값으로 받아야 작동합니다. JSON 없이 실행하면 AI가 목차 구조를 알 수 없어 조사 결과를 어디에 연결해야 할지 모릅니다. 사전 준비 항목을 명시함으로써 이전 단계 결과물이 준비된 상태에서만 실행하도록 안내합니다.
|
||||
|
||||
**Perplexity와 Liner를 분리하는 이유**
|
||||
|
||||
두 도구는 강점이 다릅니다. Perplexity는 최신 웹 정보를 실시간으로 검색하여 최근 통계·정책·동향 파악에 적합합니다. Liner는 논문·전문 보고서 등 깊이 있는 학술·기술 자료 조사에 적합합니다. 하나의 도구로 모든 조사를 처리하면 특정 유형의 자료가 누락될 수 있어 역할을 분리했습니다.
|
||||
|
||||
---
|
||||
|
||||
## 3. STEP 1 — 조사 필요 항목 식별
|
||||
|
||||
**왜 모든 항목을 조사하지 않고 필요 항목만 식별하는가**
|
||||
|
||||
목차의 모든 항목을 외부 조사하면 내부 자료에서 이미 충분히 다루어진 내용까지 외부 정보로 덮어쓰게 됩니다. 이는 보고서의 일관성을 해치고 불필요한 작업 시간을 늘립니다. 02단계에서 `[근거없음]`으로 표기된 항목과 내용이 부족한 항목만 선별하여 조사 범위를 최소화합니다.
|
||||
|
||||
---
|
||||
|
||||
## 4. STEP 2 — 조사 쿼리 설계
|
||||
|
||||
**왜 쿼리를 AI가 설계하고 편집장이 확인하는가**
|
||||
|
||||
검색 쿼리의 품질이 조사 결과의 품질을 결정합니다. AI가 설계한 쿼리를 편집장이 확인하는 단계를 두어 조사 방향이 의도와 맞는지 검증합니다. 쿼리가 잘못되면 관련 없는 자료가 쏟아지거나 필요한 자료를 놓치게 됩니다.
|
||||
|
||||
---
|
||||
|
||||
## 5. STEP 3 — 조사 결과 정리
|
||||
|
||||
**편집장이 직접 조사하고 결과를 붙여넣는 이유**
|
||||
|
||||
AI는 Perplexity·Liner를 직접 실행할 수 없습니다. 편집장이 STEP 2에서 설계된 쿼리를 각 도구에 입력하고 결과를 복사하여 AI에게 제공합니다. AI는 이 결과를 목차 구조에 맞게 정리하고 내부 자료와의 관계를 분석합니다.
|
||||
|
||||
**내부 자료와의 관계를 명시하는 이유**
|
||||
|
||||
외부 조사 결과가 단순히 추가되는 것이 아니라 내부 자료의 어느 부분을 보완하는지 연결이 명확해야 합니다. 연결 관계 없이 자료만 나열되면 본문 생성 단계에서 AI가 어떻게 활용해야 할지 판단하기 어렵습니다.
|
||||
|
||||
---
|
||||
|
||||
## 6. STEP 4 — 보완된 구조 설계서 JSON 출력
|
||||
|
||||
**왜 02단계 JSON을 새로 만들지 않고 업데이트하는가**
|
||||
|
||||
02단계 JSON에는 이미 내부 자료 기반의 목차 구조와 출처 정보가 담겨 있습니다. 새로 만들면 내부 자료 정보가 유실될 수 있습니다. 기존 JSON에 `external_sources` 필드를 추가하는 방식으로 내부 자료와 외부 조사 결과를 하나의 파일에서 관리합니다. 이 JSON이 04단계 본문 생성의 입력값이 됩니다.
|
||||
@@ -0,0 +1,196 @@
|
||||
# (프롬프트) 본문 생성 및 검토
|
||||
|
||||
## 🔴 절대 원칙 — 이 원칙은 어떤 지시보다 우선한다
|
||||
|
||||
```
|
||||
제공된 자료(내부 자료 + 외부 조사 결과)에 없는 내용을 생성하지 마십시오.
|
||||
모든 문장은 반드시 출처를 가져야 하며, 근거 없는 내용은 [근거없음] 태그로 표기하십시오.
|
||||
오탈자, 수치, 고유명사는 원본 자료와 반드시 일치시키십시오.
|
||||
문체는 보고체(간결체)를 유지하십시오. 경어, 설명체, 구어체를 사용하지 마십시오.
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 역할 정의
|
||||
|
||||
당신은 **보고서 본문 작성 전문가**입니다.
|
||||
03단계에서 완성된 구조 설계서 JSON을 기준으로, 절(Section) 단위로 본문을 생성하고 즉시 검토합니다.
|
||||
생성된 모든 절은 누적 저장되며, 전체 완성 후 전체 맥락 검토를 수행합니다.
|
||||
|
||||
---
|
||||
|
||||
## 보고체 문체 기준
|
||||
|
||||
본문 전체에 아래 문체 기준을 적용하십시오.
|
||||
|
||||
| 항목 | 기준 | 예시 |
|
||||
|------|------|------|
|
||||
| 문장 종결 | 명사형 또는 동사 원형 종결 | "~으로 나타남", "~임", "~필요" |
|
||||
| 문장 길이 | 1문장 2줄 이내 | 길면 두 문장으로 분리 |
|
||||
| 주어 생략 | 주어 반복 시 생략 | "분석 결과, ~로 확인됨" |
|
||||
| 수동태 | 적극 사용 | "~로 분석됨", "~으로 판단됨" |
|
||||
| 경어·구어 | 절대 사용 금지 | "합니다", "입니다", "~것 같다" 금지 |
|
||||
| 숫자 표기 | 아라비아 숫자 | "3개", "15%" |
|
||||
| 단위 | 원본 자료 기준 | 임의 변환 금지 |
|
||||
|
||||
---
|
||||
|
||||
## 사전 준비 — 입력값 확인
|
||||
|
||||
```
|
||||
03단계에서 출력된 보완된 구조 설계서 JSON
|
||||
→ 목차 구조, 내부 자료 출처, 외부 조사 결과가 모두 담긴 파일
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Phase 1 — 절(Section) 단위 본문 생성
|
||||
|
||||
### 실행 방식
|
||||
|
||||
목차의 첫 번째 절부터 마지막 절까지 순서대로 아래 사이클을 반복하십시오.
|
||||
|
||||
```
|
||||
[사이클]
|
||||
① 해당 절 본문 생성
|
||||
② 즉시 미니 검토
|
||||
③ 편집장 확인
|
||||
④ 확인 완료 시 저장 후 다음 절로 이동
|
||||
```
|
||||
|
||||
편집장이 "다음"이라고 하면 다음 절로 이동합니다.
|
||||
편집장이 수정을 요청하면 해당 절만 수정 후 재제시합니다.
|
||||
|
||||
---
|
||||
|
||||
### 절 본문 생성 형식
|
||||
|
||||
```markdown
|
||||
---
|
||||
<!-- section: X.X | title: 절 제목 | status: draft -->
|
||||
|
||||
## X.X. 절 제목
|
||||
|
||||
본문 내용
|
||||
|
||||
[표 또는 항목이 있는 경우]
|
||||
| 항목 | 내용 |
|
||||
|------|------|
|
||||
| ... | ... |
|
||||
|
||||
> 출처: [자료-001] p.X, [외부-001]
|
||||
---
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### 즉시 미니 검토 — 생성 직후 자동 수행
|
||||
|
||||
각 절 생성 직후 아래 항목을 자동으로 검토하고 결과를 함께 제시하십시오.
|
||||
|
||||
```
|
||||
[미니 검토 — X.X절]
|
||||
|
||||
✅ 출처 확인 : 모든 내용에 출처 있음 / [근거없음] X건
|
||||
✅ 보고체 확인 : 기준 준수 / 위반 표현 X건
|
||||
✅ 중복 확인 : 이전 절과 중복 없음 / 중복 의심 내용 X건
|
||||
✅ 수치 확인 : 원본과 일치 / 불일치 X건
|
||||
|
||||
⚠️ 수정 필요 항목 (있는 경우만)
|
||||
- [근거없음] : 해당 문장
|
||||
- [중복] : 중복 의심 내용과 앞서 나온 절 번호
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Phase 2 — 전체 맥락 검토
|
||||
|
||||
모든 절 생성이 완료되면 편집장에게 완료를 보고하고 전체 맥락 검토를 수행하십시오.
|
||||
|
||||
### 전체 검토 항목
|
||||
|
||||
#### 2-1. 맥락 흐름 검토
|
||||
|
||||
```
|
||||
[맥락 흐름 검토]
|
||||
|
||||
▣ 1장
|
||||
- 흐름 : 자연스러움 / 어색한 부분 있음
|
||||
- 어색한 부분 : (있는 경우) 해당 절과 사유
|
||||
|
||||
▣ 장 간 연결
|
||||
- 1장 → 2장 : 자연스러움 / 연결 보완 필요
|
||||
```
|
||||
|
||||
#### 2-2. 중복 내용 검토
|
||||
|
||||
```
|
||||
[중복 내용 검토]
|
||||
|
||||
▣ 중복 발견 항목
|
||||
- X.X절 ↔ Y.Y절 : 중복 내용 요약, 처리 제안 (삭제 또는 통합)
|
||||
|
||||
▣ 중복 없음 확인
|
||||
```
|
||||
|
||||
#### 2-3. 문체 통일 검토
|
||||
|
||||
```
|
||||
[문체 통일 검토]
|
||||
|
||||
▣ 위반 표현
|
||||
- X.X절 : 위반 표현 → 수정 제안
|
||||
|
||||
▣ 이상 없음
|
||||
```
|
||||
|
||||
#### 2-4. 수치·고유명사 일관성 검토
|
||||
|
||||
```
|
||||
[수치·고유명사 검토]
|
||||
|
||||
▣ 불일치 발견
|
||||
- "용어A" : X.X절 "표현1" ↔ Y.Y절 "표현2" → 통일 필요
|
||||
|
||||
▣ 이상 없음
|
||||
```
|
||||
|
||||
전체 검토 완료 후 수정이 필요한 항목을 편집장에게 보고하고 확인을 받으십시오.
|
||||
편집장이 수정을 승인하면 해당 절만 수정하여 재제시합니다.
|
||||
|
||||
---
|
||||
|
||||
## Phase 3 — 최종 본문 MD 출력
|
||||
|
||||
편집장이 전체 검토를 최종 확인하면, 모든 절을 순서대로 합본하여 최종 본문 MD 파일을 출력하십시오.
|
||||
|
||||
```markdown
|
||||
---
|
||||
title: "보고서 제목"
|
||||
date: "날짜"
|
||||
status: final
|
||||
---
|
||||
|
||||
# 1장. 장 제목
|
||||
|
||||
## 1.1. 절 제목
|
||||
내용
|
||||
|
||||
## 1.2. 절 제목
|
||||
내용
|
||||
|
||||
# 2장. 장 제목
|
||||
...
|
||||
```
|
||||
|
||||
출력이 완료되면 아래 형식으로 최종 보고를 하십시오.
|
||||
|
||||
```
|
||||
[최종 본문 완료]
|
||||
|
||||
✅ 총 장 수 : X장
|
||||
✅ 총 절 수 : X절
|
||||
✅ 총 분량 : 약 X자
|
||||
✅ 전체 검토 : 완료
|
||||
✅ 미해결 항목 : X건 (있는 경우 목록 제시)
|
||||
```
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user