Add self-study-agent skill with feedback loop
- SKILL.md: Main skill definition with 20-iteration feedback loop - config.yaml: Pipeline parameters (loop, sources, questions, adaptation) - pipeline/: 5-step learning pipeline (topic selection → source discovery → extraction → synthesis → report) - feedback/: 4 feedback mechanisms (self-testing, spaced repetition, interleaving, adaptation) - Learning science principles: active recall, spaced repetition, desirable difficulty, interleaving, delayed feedback
This commit is contained in:
@@ -0,0 +1,172 @@
|
||||
# F4: 적응 로직 (Adaptation)
|
||||
|
||||
## 개요
|
||||
|
||||
자기 평가 결과를 분석하여 다음 세션의 전략과 파라미터를 자동 조절합니다.
|
||||
|
||||
## 메트릭 정의
|
||||
|
||||
### 핵심 메트릭
|
||||
|
||||
| 메트릭 | 계산 방법 | 목표 |
|
||||
|--------|-----------|------|
|
||||
| **정답률** | 정답 수 / 전체 문제 수 | ≥ 0.85 |
|
||||
| **유형별 정답률** | 유형별 정답 수 / 유형별 문제 수 | ≥ 0.70 |
|
||||
| **주제별 정답률** | 주제별 정답 수 / 주제별 문제 수 | ≥ 0.70 |
|
||||
| **난이도별 정답률** | 난이도별 정답 수 / 난이도별 문제 수 | 0.6-0.8 |
|
||||
| **간격 유지율** | 예정된 복습 수행 비율 | ≥ 0.80 |
|
||||
| **개념 연결도** | 연결된 개념 비율 | ≥ 0.30 |
|
||||
|
||||
### 메트릭 수집
|
||||
|
||||
각 자기 평가 루프 후 메트릭 계산:
|
||||
|
||||
```json
|
||||
{
|
||||
"session_id": "session_001",
|
||||
"iteration": 5,
|
||||
"metrics": {
|
||||
"accuracy": 0.75,
|
||||
"type_accuracy": {
|
||||
"direct_recall": 0.85,
|
||||
"application": 0.70,
|
||||
"variation": 0.65,
|
||||
"connection": 0.80
|
||||
},
|
||||
"topic_accuracy": {
|
||||
"rust_async": 0.80,
|
||||
"ownership": 0.70
|
||||
},
|
||||
"difficulty_accuracy": {
|
||||
"easy": 0.95,
|
||||
"medium": 0.75,
|
||||
"hard": 0.55
|
||||
},
|
||||
"concepts_mastered": 8,
|
||||
"concepts_total": 12
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
## 적응 로직
|
||||
|
||||
### 1. 정답률 기반 적응
|
||||
|
||||
```
|
||||
if 정답률 < 0.5 and 연속 3회:
|
||||
→ 난이도 하향
|
||||
→ 학습 속도 감소
|
||||
→ 쉬운 문제 비중 증가
|
||||
|
||||
if 정답률 > 0.9 and 연속 5회:
|
||||
→ 난이도 상향
|
||||
→ 새로운 주제 탐색
|
||||
→ 어려운 문제 비중 증가
|
||||
```
|
||||
|
||||
### 2. 유형별 적응
|
||||
|
||||
```
|
||||
for each 유형 in [직접 회상, 적용, 변형, 연결]:
|
||||
if 유형별 정답률 < 0.5:
|
||||
→ 해당 유형 문제 비중 증가 (+0.1)
|
||||
elif 유형별 정답률 > 0.9:
|
||||
→ 해당 유형 문제 비중 감소 (-0.05)
|
||||
```
|
||||
|
||||
### 3. 난이도 적응
|
||||
|
||||
```
|
||||
if 쉬운 문제 정답률 > 0.95:
|
||||
→ 보통 문제 비중 증가
|
||||
|
||||
if 보통 문제 정답률 > 0.85:
|
||||
→ 어려운 문제 비중 증가
|
||||
|
||||
if 어려운 문제 정답률 < 0.4:
|
||||
→ 어려운 문제 비중 감소
|
||||
→ 보통 문제 비중 증가
|
||||
```
|
||||
|
||||
### 4. 주제별 적응
|
||||
|
||||
```
|
||||
for each 주제 in 메모리:
|
||||
if 주제별 정답률 < 0.6:
|
||||
→ 해당 주제 재학습 세션 추가
|
||||
elif 주제별 정답률 > 0.9:
|
||||
→ 해당 주제 심화 탐색
|
||||
```
|
||||
|
||||
## 파라미터 조절
|
||||
|
||||
### 문제 생성 파라미터
|
||||
|
||||
```json
|
||||
{
|
||||
"type_distribution": {
|
||||
"direct_recall": 0.4,
|
||||
"application": 0.3,
|
||||
"variation": 0.2,
|
||||
"connection": 0.1
|
||||
},
|
||||
"difficulty_distribution": {
|
||||
"easy": 0.3,
|
||||
"medium": 0.4,
|
||||
"hard": 0.3
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
### 적응 예시
|
||||
|
||||
```
|
||||
원래: direct_recall=0.4, application=0.3, variation=0.2, connection=0.1
|
||||
적용 질문 정답률 0.45 (낮음):
|
||||
→ direct_recall=0.35, application=0.35, variation=0.2, connection=0.1
|
||||
|
||||
어려운 문제 정답률 0.35 (낮음):
|
||||
→ easy=0.35, medium=0.45, hard=0.20
|
||||
```
|
||||
|
||||
## 적응 이력
|
||||
|
||||
적응 변경 시 메모리에 기록:
|
||||
|
||||
```json
|
||||
{
|
||||
"adaptation_log": [
|
||||
{
|
||||
"timestamp": "2024-01-10T10:00:00Z",
|
||||
"trigger": "low_accuracy_variation",
|
||||
"changes": {
|
||||
"type_distribution.variation": {"old": 0.2, "new": 0.25}
|
||||
},
|
||||
"reason": "변형 질문 정답률 0.45 (기준 미달)"
|
||||
}
|
||||
]
|
||||
}
|
||||
```
|
||||
|
||||
## 메모리 저장 형식
|
||||
|
||||
```json
|
||||
{
|
||||
"current_strategy": {
|
||||
"type_distribution": {...},
|
||||
"difficulty_distribution": {...},
|
||||
"interleaving_ratio": 0.3
|
||||
},
|
||||
"adaptation_history": [...],
|
||||
"metrics_history": [
|
||||
{
|
||||
"iteration": 1,
|
||||
"accuracy": 0.60
|
||||
},
|
||||
{
|
||||
"iteration": 5,
|
||||
"accuracy": 0.75
|
||||
}
|
||||
]
|
||||
}
|
||||
```
|
||||
@@ -0,0 +1,95 @@
|
||||
# F3: 교차 학습 (Interleaving)
|
||||
|
||||
## 개요
|
||||
|
||||
여러 주제를 섞어서 학습하면 단일 주제를 반복하는 것보다 장기 기억이 40% 향상됩니다.
|
||||
|
||||
## 적용 방법
|
||||
|
||||
### 세션 내 교차
|
||||
|
||||
한 자기 평가 세션에서 여러 주제의 문제를 혼합 출제:
|
||||
|
||||
```
|
||||
세션 문제 구성:
|
||||
- 현재 주제 문제: 70%
|
||||
- 이전 세션 주제 문제: 30%
|
||||
```
|
||||
|
||||
### 세션 간 교차
|
||||
|
||||
이전 세션에서 학습한 주제를 현재 세션에 포함:
|
||||
|
||||
```
|
||||
예시:
|
||||
- 세션 1: Rust Async 학습
|
||||
- 세션 2: Tokio Internals 학습
|
||||
- 세션 2 자기 평가:
|
||||
- Tokio 문제: 70%
|
||||
- Rust Async 문제: 30% (세션 1에서 학습)
|
||||
```
|
||||
|
||||
## 문제 구성 알고리즘
|
||||
|
||||
### 1단계: 현재 주제 문제 생성
|
||||
|
||||
현재 학습한 주제에서 문제 생성 (70%)
|
||||
|
||||
### 2단계: 이전 주제 문제 선택
|
||||
|
||||
메모리에서 이전 세션 주제를 검색하고, 복습 예정 카드에서 문제 선택 (30%)
|
||||
|
||||
### 3단계: 문제 셔플
|
||||
|
||||
모든 문제를 무작위 순서로 셔플
|
||||
|
||||
## 이전 주제 선택 기준
|
||||
|
||||
| 기준 | 가중치 |
|
||||
|------|--------|
|
||||
| 복습 예정일이 가까운 순 | 높음 |
|
||||
| 이전 정답률이 낮은 순 | 높음 |
|
||||
| 개념 연결이 많은 순 | 중간 |
|
||||
| 최근 학습한 순 | 낮음 |
|
||||
|
||||
## 교차 비중 조절
|
||||
|
||||
### 설정
|
||||
|
||||
```yaml
|
||||
interleaving:
|
||||
enabled: true
|
||||
mix_previous_sessions: 3 # 이전 세션 주제 포함 수
|
||||
mix_ratio: 0.3 # 이전 주제 비중
|
||||
```
|
||||
|
||||
### 적응적 조절
|
||||
|
||||
- 현재 주제 정답률 90%↑ → 이전 주제 비중 0.4로 증가
|
||||
- 현재 주제 정답률 50%↓ → 이전 주제 비중 0.2로 감소
|
||||
- 특정 이전 주제 오답률 높음 → 해당 주제 비중 증가
|
||||
|
||||
## 메모리 저장 형식
|
||||
|
||||
```json
|
||||
{
|
||||
"session_topics": [
|
||||
{
|
||||
"topic_id": "rust_async",
|
||||
"source_session": 1,
|
||||
"question_count": 7,
|
||||
"correct_count": 6
|
||||
},
|
||||
{
|
||||
"topic_id": "tokio_internals",
|
||||
"source_session": 2,
|
||||
"question_count": 3,
|
||||
"correct_count": 2
|
||||
}
|
||||
],
|
||||
"interleaving_stats": {
|
||||
"mix_ratio": 0.3,
|
||||
"cross_session_accuracy": 0.83
|
||||
}
|
||||
}
|
||||
```
|
||||
@@ -0,0 +1,155 @@
|
||||
# F1: 자기 평가 (Self-Testing)
|
||||
|
||||
## 개요
|
||||
|
||||
메모리에 있는 지식으로 문제를 생성하고, 메모리에서만 답변하여 테스트하는 루프입니다.
|
||||
|
||||
## 루프 구조
|
||||
|
||||
```
|
||||
최대 20회 반복:
|
||||
1. 문제 생성
|
||||
2. 답변 시도 (메모리만 사용)
|
||||
3. 피드백 생성 (에이전트 자체)
|
||||
4. 메모리 업데이트
|
||||
5. 적응 (난이도/유형 조절)
|
||||
|
||||
종료 조건:
|
||||
- 정답률 95% 이상
|
||||
- 또는 20회 완료
|
||||
```
|
||||
|
||||
## Step 1: 문제 생성
|
||||
|
||||
### 문제 유형과 비중
|
||||
|
||||
| 유형 | 비중 | 설명 | 예시 |
|
||||
|------|------|------|------|
|
||||
| **직접 회상** | 40% | 정의, 개념, 사실 묻기 | "Rust의 Ownership이란?" |
|
||||
| **적용 질문** | 30% | 실제 상황에서의 활용 | "이 상황에서 Ownership을 어떻게 사용?" |
|
||||
| **변형 질문** | 20% | 같은 내용 다른 표현 (암기 방지) | "Ownership의 장단점은?" |
|
||||
| **연결 질문** | 10% | 개념 간 관계 묻기 | "Ownership과 Borrowing의 관계는?" |
|
||||
|
||||
### 난이도 분포
|
||||
|
||||
| 난이도 | 비중 | 기준 |
|
||||
|--------|------|------|
|
||||
| **쉬움** | 30% | 단순 회상, 정의, 사실 |
|
||||
| **보통** | 40% | 적용, 분석 |
|
||||
| **어려움** | 30% | 종합, 평가, 창의적 사고 |
|
||||
|
||||
### 문제 생성 규칙
|
||||
|
||||
1. 메모리에서 주제 관련 지식 추출
|
||||
2. 각 개념/팩트에 대해 문제 생성
|
||||
3. 유형별 비중 준수
|
||||
4. 난이도별 비중 준수
|
||||
5. 이전 오답 유형 고려 (약한 유형 비중 증가)
|
||||
|
||||
### 문제 생성 프롬프트
|
||||
|
||||
```
|
||||
메모리에 있는 "{topic}" 관련 지식으로 문제를 생성하십시오.
|
||||
|
||||
문제 유형: {type} (직접 회상/적용/변형/연결)
|
||||
난이도: {difficulty} (쉬움/보통/어려움)
|
||||
|
||||
규칙:
|
||||
- 메모리에서만 답변할 수 있어야 함
|
||||
- 명확하고 구체적인 문제
|
||||
- 부분 정답 가능하도록 설계
|
||||
- 관련 개념과 연결된 문제 선호
|
||||
|
||||
문제:
|
||||
```
|
||||
|
||||
## Step 2: 답변 시도
|
||||
|
||||
### 규칙
|
||||
|
||||
1. **메모리에서만 정보 꺼냄** — 외부 소스 접근 금지
|
||||
2. **생각하는 과정 표시** — 어떤 지식을 기반으로 답변하는지
|
||||
3. **확신도 표시** — 0-100% 확신도
|
||||
|
||||
### 답변 형식
|
||||
|
||||
```json
|
||||
{
|
||||
"question_id": "q_001",
|
||||
"user_answer": "사용자의 답변",
|
||||
"confidence": 85,
|
||||
"thinking_process": "메모리에서 X 개념과 Y 팩트를 기반으로 답변"
|
||||
}
|
||||
```
|
||||
|
||||
## Step 3: 피드백 생성
|
||||
|
||||
### 피드백 생성 규칙
|
||||
|
||||
에이전트가 직접 피드백을 생성합니다:
|
||||
|
||||
1. **정답 여부 판단**
|
||||
- 핵심 키워드 포함 여부
|
||||
- 개념적 정확성
|
||||
- 부분 정답 처리
|
||||
|
||||
2. **피드백 내용**
|
||||
- 정답: "맞습니다. {설명}"
|
||||
- 오답: "틀렸습니다. 정답은 {정답}입니다. {왜 그런지 설명}"
|
||||
- 부분 정답: "부분적으로 맞습니다. {맞은 부분}은 정확하지만, {틀린 부분}은..."
|
||||
|
||||
3. **관련 개념 링크**
|
||||
- 틀린 문제의 관련 개념 자동 식별
|
||||
- "이 문제는 {개념A}, {개념B}와 연결되어 있습니다"
|
||||
|
||||
4. **추가 학습 제안**
|
||||
- "이 부분을 더 공부하려면 {추천 자료}를 확인하세요"
|
||||
|
||||
### 피드백 형식
|
||||
|
||||
```json
|
||||
{
|
||||
"question_id": "q_001",
|
||||
"is_correct": false,
|
||||
"partial_credit": 0.5,
|
||||
"feedback": "틀렸습니다. 정답은 'Rust의 Ownership은 메모리 안전성을 보장하는 시스템으로, 각 값에 대해 하나의 소유자가 존재합니다'입니다.",
|
||||
"explanation": "Ownership은 Rust의 핵심 개념으로...",
|
||||
"related_concepts": ["Borrowing", "Lifetimes", "Move Semantics"],
|
||||
"source_reference": "https://doc.rust-lang.org/book/ch04-01.html",
|
||||
"suggested_review": "Rust Book Chapter 4.1을 다시 읽어보세요"
|
||||
}
|
||||
```
|
||||
|
||||
## Step 4: 메모리 업데이트
|
||||
|
||||
### 정답 시
|
||||
|
||||
```json
|
||||
{
|
||||
"concept_id": "concept_001",
|
||||
"confidence": 0.85,
|
||||
"last_reviewed": "timestamp",
|
||||
"next_review": "FSRS 알고리즘으로 계산",
|
||||
"correct_count": 5,
|
||||
"total_count": 6
|
||||
}
|
||||
```
|
||||
|
||||
### 오답 시
|
||||
|
||||
```json
|
||||
{
|
||||
"concept_id": "concept_001",
|
||||
"confidence": 0.4,
|
||||
"last_reviewed": "timestamp",
|
||||
"next_review": "1일 후 (간격 초기화)",
|
||||
"correct_count": 2,
|
||||
"total_count": 6,
|
||||
"weak_points": ["관련 개념1", "관련 개념2"],
|
||||
"review_notes": "추가 학습 필요"
|
||||
}
|
||||
```
|
||||
|
||||
## Step 5: 적응
|
||||
|
||||
`feedback/adaptation.md` 참조
|
||||
@@ -0,0 +1,140 @@
|
||||
# F2: 간격 반복 (Spaced Repetition)
|
||||
|
||||
## FSRS 알고리즘
|
||||
|
||||
### 기본 원리
|
||||
|
||||
간격 반복은 정보를 점점 더 긴 간격으로 반복하여 장기 기억을 강화하는 기법입니다.
|
||||
|
||||
### FSRS 파라미터
|
||||
|
||||
```
|
||||
w = [0.4, 0.6, 2.4, 5.8, 4.93, 0.94, 0.86, 0.01, 1.49, 0.14, 0.94, 2.18, 0.05, 0.34, 1.26, 0.29, 2.61]
|
||||
```
|
||||
|
||||
### 간격 계산
|
||||
|
||||
**새 카드:**
|
||||
- 최초 학습 후: 1일
|
||||
- 첫 번째 복습 후: 3-7일 (난이도 기반)
|
||||
- 두 번째 복습 후: 7-30일
|
||||
- 이후: 지수적 증가 (최대 365일)
|
||||
|
||||
**Rating별 간격:**
|
||||
|
||||
| Rating | 의미 | 간격 조정 |
|
||||
|--------|------|-----------|
|
||||
| `again` | 잊어버림 | 간격 초기화 (1일) |
|
||||
| `hard` | 노력해서 회상 | 간격 × 1.2 |
|
||||
| `good` | 정확히 회상 | 간격 × FSRS 공식 |
|
||||
| `easy` | 쉽게 회상 | 간격 × 1.3 × FSRS 공식 |
|
||||
|
||||
### 안정성(Stability) 계산
|
||||
|
||||
```
|
||||
new_stability = stability * exp(
|
||||
(w6 - w7 * delta) * (w8 - w9 * (rating-1)) * w10 +
|
||||
(1 - w11) * exp(w12 - w13 * (rating-1))
|
||||
)
|
||||
```
|
||||
|
||||
단, again일 때:
|
||||
```
|
||||
new_stability = w14 * max(stability * w15, 1) * min(new_stability, w16 * stability)
|
||||
```
|
||||
|
||||
### 간격(Interval) 계산
|
||||
|
||||
```
|
||||
interval = stability * target_retention
|
||||
interval = max(min_interval, min(interval, max_interval))
|
||||
```
|
||||
|
||||
## 카드 관리
|
||||
|
||||
### 카드 생성
|
||||
|
||||
학습 세션에서 추출된 각 개념/팩트에 대해 자동 생성:
|
||||
|
||||
```json
|
||||
{
|
||||
"id": "card_001",
|
||||
"concept_id": "concept_001",
|
||||
"front": "Rust의 Ownership이란?",
|
||||
"back": "메모리 안전성을 보장하는 시스템으로, 각 값에 대해 하나의 소유자가 존재합니다",
|
||||
"difficulty": 0.6,
|
||||
"interval_days": 0,
|
||||
"due_date": "timestamp",
|
||||
"reps": 0,
|
||||
"lapses": 0
|
||||
}
|
||||
```
|
||||
|
||||
### 카드 업데이트
|
||||
|
||||
복습 후 FSRS 알고리즘에 따라 업데이트:
|
||||
|
||||
```json
|
||||
{
|
||||
"id": "card_001",
|
||||
"interval_days": 7,
|
||||
"due_date": "7일 후 timestamp",
|
||||
"reps": 3,
|
||||
"lapses": 0,
|
||||
"stability": 2.5,
|
||||
"retrievability": 0.85
|
||||
}
|
||||
```
|
||||
|
||||
## 복습 세션
|
||||
|
||||
### 복습할 카드 선택
|
||||
|
||||
1. 오늘 예정된 카드 우선
|
||||
2. 연체된 카드 다음
|
||||
3. 새로운 카드는 설정된 수만큼 (기본 20개/일)
|
||||
|
||||
### 복습 흐름
|
||||
|
||||
```
|
||||
복습할 카드 목록
|
||||
│
|
||||
▼
|
||||
각 카드에 대해:
|
||||
│
|
||||
├── 문제 표시
|
||||
│
|
||||
├── 답변 시도
|
||||
│
|
||||
├── 정답 확인
|
||||
│
|
||||
└── Rating 선택 (again/hard/good/easy)
|
||||
│
|
||||
└── 카드 간격 업데이트
|
||||
```
|
||||
|
||||
## 메모리 저장 형식
|
||||
|
||||
```json
|
||||
{
|
||||
"cards": [
|
||||
{
|
||||
"id": "card_001",
|
||||
"front": "...",
|
||||
"back": "...",
|
||||
"interval_days": 7,
|
||||
"due_date": "2024-01-15",
|
||||
"reps": 3,
|
||||
"lapses": 0,
|
||||
"stability": 2.5
|
||||
}
|
||||
],
|
||||
"stats": {
|
||||
"total_cards": 100,
|
||||
"due_today": 15,
|
||||
"due_this_week": 45,
|
||||
"overdue": 5,
|
||||
"retention_rate": 0.88
|
||||
}
|
||||
}
|
||||
```
|
||||
Reference in New Issue
Block a user