IDEA-2/1/5/7: 스마트 알림, 대화 기반 RAG, CRAG, 파라미터 자동 튜닝
- IDEA-2 스마트 알림: td_reminders 테이블, set_reminder/list_reminders 도구,
SchedulerService(asyncio 60초 루프, D-7/D-1/D-0 Telegram push),
FastAPI lifespan 연동, GET /reminders/{user_id} 엔드포인트
- IDEA-1 대화 기반 RAG: IngestionService.store_text() 추가,
AgentService._maybe_index_conversation() — 응답 후 LLM 판단 → Qdrant 저장
(CONV_RAG_ENABLED=true 활성화, background task로 응답 속도 무관)
- IDEA-5 CRAG: AgentState에 crag_fallback_used 플래그 추가,
crag_check LangGraph 노드 — search_documents 결과 없으면 web_search 자동 주입,
route_after_crag으로 fallback 1회 루프 제어 (CRAG_ENABLED=true 활성화)
- IDEA-7 RAG Auto-Eval: eval/auto_tune.py — API 서버 없이 파라미터 조합별
context_precision/recall 비교, 최적 설정 추천
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
+153
-1
@@ -6,8 +6,9 @@
|
||||
|------|------|
|
||||
| LLM | Qwen3-8B-4bit (MLX, Apple Silicon) |
|
||||
| Agent | LangGraph ReAct + Tool Calling + Thinking 모드 |
|
||||
| Scheduler | asyncio task 기반 알림 스케줄러 — D-7/D-1/D-0 Telegram push (`SchedulerService`) |
|
||||
| RAG | Qdrant + BAAI/bge-m3 임베딩 + Semantic Chunking (`SemanticChunker`) + Reranker (BAAI/bge-reranker-v2-m3) |
|
||||
| Tools | `search_documents`, `web_search`, `get_current_date`, `remember_user_info`, `recall_user_info` (5개) |
|
||||
| Tools | `search_documents`, `web_search`, `get_current_date`, `remember_user_info`, `recall_user_info`, `set_reminder`, `list_reminders` (7개) |
|
||||
| Feedback | Gradio 👍/👎 → `td_feedback` DB 저장 + LangSmith `create_feedback()` 연동 |
|
||||
| UI | CLI + Gradio Web UI + 음성 입력(STT)/출력(TTS) |
|
||||
| Memory | LangGraph MemorySaver (세션 내) + MySQL 대화 저장 + 장기 사용자 프로필 |
|
||||
@@ -544,3 +545,154 @@ Phase 20 RAGAS 평가 → Phase 15 (모델선택) → Phase 16 (Docke
|
||||
| Phase 15 모델 선택 | 🔲 미완 | 중간 | 중간 | 4순위 |
|
||||
| Phase 16 Docker | 🔲 미완 | 높음 | 중간 | 5순위 |
|
||||
| Phase 17 멀티모달 | ✅ 완료 | — | — | — |
|
||||
|
||||
---
|
||||
|
||||
## 💡 IDEA — 신규 개선 아이디어
|
||||
|
||||
### 단기 — 빠르게 임팩트 큰 것
|
||||
|
||||
#### ✅ IDEA-1. 대화 기반 자동 RAG 업데이트
|
||||
|
||||
**배경**: 현재 문서 업로드만 RAG에 들어간다. 중요 대화 내용 자체를 자동으로 벡터DB에 추가하면 사용할수록 지식이 쌓이는 시스템이 된다.
|
||||
|
||||
**구현 내용**:
|
||||
- `IngestionService.store_text(text, metadata)` — 단일 텍스트 직접 저장 (semantic chunking 없이)
|
||||
- `AgentService._maybe_index_conversation()` — 응답 완료 후 LLM이 유용한 정보 판단 → 요약 → Qdrant 저장 (asyncio background task)
|
||||
- `source="conversation"`, `user_id`, `timestamp` 메타데이터로 문서 RAG와 구분
|
||||
- `.env` `CONV_RAG_ENABLED=true`로 활성화 (기본 비활성)
|
||||
|
||||
**난이도**: 하 | **임팩트**: 높음 (지식 자동 축적)
|
||||
|
||||
---
|
||||
|
||||
#### ✅ IDEA-2. 스마트 알림 & 일정 연동
|
||||
|
||||
**배경**: 예방접종, 약 먹을 시간, 병원 예약 등 날짜 기반 알림이 없다.
|
||||
|
||||
**구현 내용**:
|
||||
- `td_reminders` 테이블 (user_id, remind_date, message, sent_d0/d1/d7)
|
||||
- `set_reminder(remind_date, message)` + `list_reminders()` 도구 — LangGraph 에이전트 자동 호출
|
||||
- `SchedulerService` — asyncio task 기반 60초 간격 체크 → D-7/D-1/D-0 Telegram push
|
||||
- FastAPI `lifespan`으로 앱 시작/종료 시 스케줄러 자동 관리
|
||||
- `GET /reminders/{user_id}` API 엔드포인트 추가
|
||||
- `.env` 설정: `TELEGRAM_BOT_TOKEN`, `TELEGRAM_USER_MAP={"아록":"123456"}`
|
||||
|
||||
**난이도**: 중간 | **임팩트**: 매우 높음 (육아 핵심 시나리오)
|
||||
|
||||
---
|
||||
|
||||
#### IDEA-3. 대화 요약 일간 리포트
|
||||
|
||||
**배경**: 하루에 어떤 질문을 했고 어떤 결정을 내렸는지 돌아볼 방법이 없다.
|
||||
|
||||
**구현 방향**:
|
||||
- 매일 자정 cron → 당일 대화 요약 생성 (`CompactService` 재활용)
|
||||
- Telegram으로 사용자별 요약 발송
|
||||
- `/chat` API + APScheduler로 구현 가능 (새 인프라 불필요)
|
||||
|
||||
**난이도**: 하 | **임팩트**: 중간
|
||||
|
||||
---
|
||||
|
||||
#### IDEA-4. 텔레그램 그룹 채팅 지원
|
||||
|
||||
**배경**: 현재 1:1 채팅만 지원한다. 가족 그룹에서 `@율봇` 멘션으로 함께 사용하고 싶다.
|
||||
|
||||
**구현 방향**:
|
||||
- 그룹 메시지에서 `@율봇` 멘션 감지 → 발신자 Telegram ID로 `user_id` 매핑
|
||||
- 그룹 공용 컨텍스트(`user_id="family"`) 옵션
|
||||
- `python-telegram-bot` 기존 코드에 그룹 핸들러 추가
|
||||
|
||||
**난이도**: 하 | **임팩트**: 높음 (가족 공동 사용)
|
||||
|
||||
---
|
||||
|
||||
### 중기 — RAG/에이전트 품질 향상
|
||||
|
||||
#### ✅ IDEA-5. Agentic RAG — 자기 교정 검색 (CRAG)
|
||||
|
||||
**배경**: 현재 `query_rewrite → search_documents` 1회로 끝난다. 검색 결과가 부족하면 재시도나 웹 검색 fallback이 없다.
|
||||
|
||||
**구현 내용**:
|
||||
- `AgentState(TypedDict)` — `messages` + `crag_fallback_used` 커스텀 상태
|
||||
- `crag_check` LangGraph 노드 — `search_documents` 결과가 비었으면 동일 쿼리로 `web_search` AIMessage 자동 주입
|
||||
- `route_after_crag` — fallback AIMessage 있으면 tools 재실행, 없으면 agent로 복귀
|
||||
- 그래프: `tools → crag_check → route_after_crag → {tools, agent}`
|
||||
- 무한 루프 방지: `crag_fallback_used` 플래그로 1회만 fallback
|
||||
- `.env` `CRAG_ENABLED=true`로 활성화 (기본 비활성)
|
||||
|
||||
**난이도**: 중간 | **임팩트**: 높음 (검색 실패 케이스 대폭 감소)
|
||||
|
||||
---
|
||||
|
||||
#### IDEA-6. 영수증/가계부 OCR
|
||||
|
||||
**배경**: `analyze_image` 도구가 이미 있다. 영수증 사진에서 지출을 자동 기록하면 가계 관리가 가능해진다.
|
||||
|
||||
**구현 방향**:
|
||||
- `analyze_image` → 금액·항목·날짜 추출 → MySQL `td_expenses` 저장
|
||||
- `get_monthly_expenses(month)` 도구 추가 → "이번 달 식비 얼마야?" 대응
|
||||
- 카테고리 자동 분류 (식비/의료비/교육비 등)
|
||||
|
||||
**난이도**: 중간 | **임팩트**: 높음 (가계 관리 시나리오)
|
||||
|
||||
---
|
||||
|
||||
#### ✅ IDEA-7. RAG 파라미터 자동 튜닝 (Auto-Eval Loop)
|
||||
|
||||
**배경**: RAGAS 평가 인프라는 있는데, 파라미터 변경 효과를 수동으로 비교해야 한다.
|
||||
|
||||
**구현 내용**:
|
||||
- `eval/auto_tune.py` — API 서버 없이 `RetrieverService` 직접 사용, 파라미터 조합별 `context_precision` + `context_recall` 비교
|
||||
- 기본 조합 4개: `baseline(3/10)`, `top_k_5(5/15)`, `top_k_2(2/6)`, `fetch_k_20(3/20)`
|
||||
- 평균 점수 기준 최적 조합 추천 + `.env` 설정값 안내
|
||||
- `eval/results/tune_YYYYMMDD.json` 저장
|
||||
- 실행: `python eval/auto_tune.py [--dataset eval/dataset.jsonl]`
|
||||
|
||||
**난이도**: 중간 | **임팩트**: 중간 (장기 품질 자동 관리)
|
||||
|
||||
---
|
||||
|
||||
### 장기 — 구조적 확장
|
||||
|
||||
#### IDEA-8. GraphRAG / 지식 그래프
|
||||
|
||||
**배경**: `td_user_profile`이 flat key-value라 엔티티 간 관계 추론이 불가능하다.
|
||||
|
||||
**구현 방향**:
|
||||
- `(도율) -[알레르기]→ (복숭아)`, `(아록) -[부모]→ (도율)` 형태 그래프
|
||||
- NetworkX 기반 로컬 그래프 + 그래프 쿼리 도구
|
||||
- 복잡한 추론 질문 ("도율이 먹으면 안 되는 음식은?") 대응 가능
|
||||
|
||||
**난이도**: 높음 | **임팩트**: 높음 (메모리 추론 능력 대폭 향상)
|
||||
|
||||
---
|
||||
|
||||
#### IDEA-9. PWA / 모바일 Web UI
|
||||
|
||||
**배경**: Gradio는 모바일 UX가 좋지 않다. 네이티브 앱처럼 설치하고 카메라 접근도 원활해야 한다.
|
||||
|
||||
**구현 방향**:
|
||||
- `youlbot-webui`를 Next.js + shadcn/ui PWA로 재작성
|
||||
- 홈 화면 설치, 오프라인 캐시, 네이티브 카메라 접근
|
||||
- 기존 REST API 그대로 재사용 (백엔드 변경 없음)
|
||||
- STT는 Web Speech API로 대체 (브라우저 내장)
|
||||
|
||||
**난이도**: 높음 | **임팩트**: 높음 (모바일 UX 대폭 개선)
|
||||
|
||||
---
|
||||
|
||||
### IDEA 우선순위 매트릭스
|
||||
|
||||
| IDEA | 설명 | 난이도 | 임팩트 | 추천 순위 |
|
||||
|------|------|--------|--------|-----------|
|
||||
| IDEA-2 스마트 알림 | ✅ asyncio 스케줄러 + Telegram push | 중간 | 매우 높음 | — |
|
||||
| IDEA-4 텔레그램 그룹 채팅 | 기존 Bot 코드 확장 | 하 | 높음 | 1순위 |
|
||||
| IDEA-3 일간 리포트 | CompactService 재활용 + SchedulerService | 하 | 중간 | 2순위 |
|
||||
| IDEA-1 대화 기반 RAG | ✅ asyncio background + Qdrant 저장 | 하 | 높음 | — |
|
||||
| IDEA-5 CRAG | ✅ crag_check LangGraph 노드 | 중간 | 높음 | — |
|
||||
| IDEA-7 Auto-Eval | ✅ eval/auto_tune.py | 중간 | 중간 | — |
|
||||
| IDEA-6 영수증 OCR | analyze_image 재활용 | 중간 | 높음 | 1순위 |
|
||||
| IDEA-8 GraphRAG | 새 데이터 구조 | 높음 | 높음 | 7순위 |
|
||||
| IDEA-9 PWA WebUI | 프론트엔드 재작성 | 높음 | 높음 | 8순위 |
|
||||
|
||||
Reference in New Issue
Block a user