e2c5471046
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
7.8 KiB
7.8 KiB
id, title, category, status, verification_status, canonical_id, aliases, duplicate_of, source_trust_level, confidence_score, created_at, updated_at, review_reason, merge_history, tags, raw_sources, applied_in, github_commit
| id | title | category | status | verification_status | canonical_id | aliases | duplicate_of | source_trust_level | confidence_score | created_at | updated_at | review_reason | merge_history | tags | raw_sources | applied_in | github_commit | ||||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| prompt-engineering-patterns | 프롬프트 엔지니어링 패턴 | AI_and_ML | draft | applied |
|
A | 0.91 | 2026-06-13 | 2026-06-13 |
|
|
|
프롬프트 엔지니어링 패턴
🎯 한 줄 통찰 (One-line insight)
좋은 프롬프트는 "조립 가능한 블록으로 만들고(역할·규칙·컨텍스트·출력형식), 작은 모델일수록 system 으로 강하게 grounding 하고, 출력은 파싱 가능한 JSON/템플릿으로 강제하며, 결정론적 신호로 동적으로 강도를 조절"한다 — ConnectAI 의 검증 레이어가 이를 그대로 실천한다 [S1][S3][S4].
🧠 핵심 개념 (Core concepts)
- 블록 조립: 시스템 프롬프트를
[EPISTEMIC GUARD],[MEMORY CONTEXT],[자기검토]같은 명명 블록으로 만들어 필요 시 합친다 [S1][S5]. - 작은 모델엔 강한 system grounding: gemma 류는 system 이 없으면 짧고 모호한 입력에 "시는 못 써드려요" 같은 환각 거절을 한다 — system 을 반드시 채운다 [S5].
- 출력 형식 강제: "반드시 아래 JSON 만 출력" + 예시 스키마. 파싱은 균형 괄호 스캔으로 잡설 내성 [S3].
- 동적 강도 조절: 검색 근거가 없을수록 가드 지시를 강화(
chunkCount === 0이면 "단정 금지·질문 우선") [S1]. - few-shot 대신 규칙+제약: 길고 명시적인 규칙 목록 + "근거 없으면 지어내지 말 것" 같은 negative constraint [S4].
🧩 추출된 패턴 (Extracted patterns)
- 명명 블록 + 닫는 태그:
[EPISTEMIC GUARD] ... [/EPISTEMIC GUARD]— 모델이 블록 경계를 인식 [S1]. - 3등급 인식론 강제: 확실/추정/모름 등급 표시 — "모름 인정이 그럴듯한 오답보다 낫다" 를 명문화 [S1].
- 조건부 블록 주입: 통계가 임계(같은 태그 2회+)를 넘을 때만 자기검토 블록 주입 — 노이즈 방지 [S2].
- 태그별 맞춤 지시: 오류 태그(사실오류/근거누락…)마다 다른 자기검토 문장 매핑 [S2].
- system/user 분리 빌더:
buildCritiquePrompt가{ system, user }를 반환 — 역할(검수자)과 데이터(초안)를 분리 [S3]. - 입력 잘라내기(budget): 초안/필드를
maxDraftChars/MAX_FIELD_CHARS로 잘라 토큰·비용 통제 [S3]. - 출력 후처리: 작은 모델이 흘리는
##/**마커를 사후 제거하고 history 에도 정제본만 저장(마커 재학습 방지) [참조: Agent 오케스트레이터 분해].
📖 세부 내용 (Details)
왜 블록 조립인가
한 턴의 system 프롬프트는 정체성·모드·메모리·가드·자기검토 등 여러 관심사가 합쳐진다. 각 관심사를 독립 빌더 함수(buildEpistemicGuardBlock, buildSelfReviewBlock)로 만들면, 조건에 따라 켜고 끄며 조합할 수 있고 단위 테스트가 쉽다 [S1][S2].
작은 모델 대응 (이 프로젝트의 핵심 제약)
- system 으로 강하게 grounding (services.ts 주석: system 없으면 환각 거절) [S5].
- 규칙을 명시적이고 번호 매겨 제시(wikify 프롬프트의 "필수 규칙 1
6 + 공통 규칙 715") [S4]. - "본문에 없으면 지어내지 말고 '확인되지 않음' 표시" 같은 negative constraint 를 반복 [S4].
- 출력 형식을 템플릿으로 못박고, 흘러나온 마커는 사후 정제.
JSON 출력 + 강건 파싱
"반드시 JSON 한 줄만" 을 지시해도 작은 모델은 코드펜스·잡설을 섞는다. 그래서 첫 균형 {} 블록을 스캔(문자열/이스케이프 인식)해 추출하고, 실패 시 휴리스틱 fallback 으로 분류한다 — 프롬프트와 파서를 함께 설계 [S3].
⚖️ 모순 및 업데이트 (Contradictions & updates)
- 긴 프롬프트 vs 컨텍스트 한도: 블록을 다 합치면 길어져 작은 모델의 컨텍스트를 압박한다. 그래서 RAG 검색 파이프라인 의 토큰 예산과 조건부 주입으로 길이를 통제한다.
- JSON 강제의 취약성: 모델이 형식을 어기면 파싱 실패. 강건 파서 + fallback 이 필수 — "프롬프트만 믿지 말고 파서로 방어".
- few-shot 비용: 예시를 많이 넣으면 정확하지만 토큰이 비싸다. ConnectAI 는 예시 최소화 + 규칙/제약 위주로 절충.
🛠️ 적용 사례 (Applied in summary)
ConnectAI/src/intelligence/epistemicGuardBlock.ts— 명명 블록, 동적 강도 [S1].ConnectAI/src/intelligence/correctionLoop.ts— 조건부·태그별 자기검토 블록 [S2].ConnectAI/src/intelligence/criticAgent.ts— system/user 분리, JSON 강제+강건 파싱 [S3].ConnectAI/src/features/datacollect/prompts/wikifyPrompt.ts— 번호 규칙 + negative constraint + 템플릿 강제 [S4].
💻 코드 패턴 (Code patterns)
// 1) 명명 블록 + 동적 강도 (src/intelligence/epistemicGuardBlock.ts)
lines.push('[EPISTEMIC GUARD]');
lines.push('- **모름 / 확인 필요** — 근거 없음. 지어내지 말고 "(확인 필요)" 표시.');
if (signals.chunkCount === 0) lines.push('⚠️ 이번 턴은 검색 근거가 없음 — 단정하지 말 것.');
lines.push('[/EPISTEMIC GUARD]');
// 2) 출력 형식 강제 (src/intelligence/criticAgent.ts)
const system = [
'너는 업무 산출물 검수자(Critic)다.',
'반드시 아래 JSON 만 출력 (다른 텍스트 금지):',
'{"pass": true|false, "issues": [{"severity":"major"|"minor","description":"..."}], "supplement":"..."}',
].join('\n');
// 3) 작은 모델 grounding — system 필수 (src/core/services.ts 주석)
// gemma 같은 작은 모델은 system 이 없으면 짧은/모호한 입력에 환각 거절을 하는 경향 → system 을 반드시 채운다.
// 4) 조건부 주입 — 임계 넘을 때만 (src/intelligence/correctionLoop.ts)
const significant = profile.tagCounts.filter(t => t.count >= 2).slice(0, 2);
if (significant.length === 0) return ''; // 1회성 실수로 프롬프트 어지럽히지 않음
✅ 검증 상태 및 신뢰도
- 상태: draft
- 검증 단계: applied
- 출처 신뢰도: A
- 신뢰 점수: 0.91
- 중복 검사 결과: 신규 생성 (New discovery)
🔗 지식 그래프 (Knowledge Graph)
- 상위/루트: ConnectAI 아키텍처 개요
- 관련 개념: Intelligence 검증 레이어, RAG 검색 파이프라인, 코딩 컨벤션과 주석 철학, Reflection Pattern, Critic Pattern
- 참조 맥락: 로컬 LLM 이 다른(또는 자기 자신) 모델을 호출하는 프롬프트를 설계할 때 참조.
📚 출처 (Sources)
- [S1] ConnectAI/src/intelligence/epistemicGuardBlock.ts — 명명 블록, 3등급, 동적 강도
- [S2] ConnectAI/src/intelligence/correctionLoop.ts — 조건부·태그별 자기검토 주입
- [S3] ConnectAI/src/intelligence/criticAgent.ts — system/user 분리, JSON 강제+강건 파싱, 입력 budget
- [S4] ConnectAI/src/features/datacollect/prompts/wikifyPrompt.ts — 번호 규칙, negative constraint, 템플릿
- [S5] ConnectAI/src/core/services.ts — 작은 모델 system grounding 근거
📝 변경 이력 (Change history)
- 2026-06-13: ConnectAI 코드 분석 기반 초안 생성.