[Week3] 알고리즘 코치를 mock 도구에서 문서 기반 RAG로 전환#13
Open
pykido wants to merge 4 commits into
Open
Conversation
There was a problem hiding this comment.
Pull request overview
Mock dict로 유지하던 알고리즘 코치 지식을 마크다운 문서 코퍼스로 전환하고, 의미 기반 검색(임베딩 + FAISS)으로 근거 문서 기반 답변을 생성하는 Week3 RAG 파이프라인을 구성합니다. 문서 로드/청킹/인덱싱/검색/생성 단계를 파일 단위로 분리하고, recursive vs markdown-header 청킹 전략 비교까지 포함합니다.
Changes:
- 알고리즘 패턴/문제 지식을 20개 마크다운 문서로 구성하고 로더/스플리터로 코퍼스화
- OpenAI 임베딩 + FAISS 인덱싱 및 retriever 기반 검색 파이프라인 추가
- LangGraph 2-step(retrieve → generate) 그래프로 RAG Q&A 실행 및 전략 비교 스크립트/노트북 추가
Reviewed changes
Copilot reviewed 31 out of 31 changed files in this pull request and generated 4 comments.
Show a summary per file
| File | Description |
|---|---|
| assignments/pykido/week3/state.py | RAG 그래프 상태(TypedDict) 정의 추가 |
| assignments/pykido/week3/schema.py | RAG 응답 스키마(Pydantic) 정의 추가 |
| assignments/pykido/week3/run.ipynb | 코퍼스 로드→청킹→인덱싱→검색 비교→그래프 실행 데모 노트북 추가 |
| assignments/pykido/week3/rag/init.py | Week3 데이터/인덱스 디렉토리 및 전략 상수 정의 |
| assignments/pykido/week3/rag/loader.py | data/ 아래 md 문서 로드 및 메타데이터 부여 |
| assignments/pykido/week3/rag/splitter.py | recursive/markdown-header 청킹 전략 구현 |
| assignments/pykido/week3/rag/vectorstore.py | 임베딩/FAISS 벡터스토어 build/save/load 구현 |
| assignments/pykido/week3/rag/retriever.py | FAISS retriever 기반 의미 검색 API 추가 |
| assignments/pykido/week3/rag/indexing.py | 전략별 인덱싱 수행 및 캐시 저장 스크립트 추가 |
| assignments/pykido/week3/graph.py | retrieve→generate 2-step LangGraph 기반 RAG 그래프/ask API 추가 |
| assignments/pykido/week3/compare_chunking.py | 동일 쿼리로 전략별 top-k 검색 결과 비교 스크립트 추가 |
| assignments/pykido/week3/data/problems/pgs-67258-gem-shopping.md | 문제 문서(보석 쇼핑) 추가 |
| assignments/pykido/week3/data/problems/pgs-43238-immigration.md | 문제 문서(입국심사) 추가 |
| assignments/pykido/week3/data/problems/pgs-43236-stepping-stones.md | 문제 문서(징검다리) 추가 |
| assignments/pykido/week3/data/problems/pgs-43165-target-number.md | 문제 문서(타겟 넘버) 추가 |
| assignments/pykido/week3/data/problems/pgs-42898-school-path.md | 문제 문서(등굣길) 추가 |
| assignments/pykido/week3/data/problems/pgs-42861-connecting-islands.md | 문제 문서(섬 연결하기) 추가 |
| assignments/pykido/week3/data/problems/pgs-42627-disk-controller.md | 문제 문서(디스크 컨트롤러) 추가 |
| assignments/pykido/week3/data/problems/pgs-118667-two-queues.md | 문제 문서(두 큐 합 같게 만들기) 추가 |
| assignments/pykido/week3/data/patterns/backtracking.md | 패턴 문서(백트래킹) 추가 |
| assignments/pykido/week3/data/patterns/bfs-dfs.md | 패턴 문서(BFS/DFS) 추가 |
| assignments/pykido/week3/data/patterns/binary-search.md | 패턴 문서(이분 탐색) 추가 |
| assignments/pykido/week3/data/patterns/dijkstra.md | 패턴 문서(다익스트라) 추가 |
| assignments/pykido/week3/data/patterns/dp.md | 패턴 문서(DP) 추가 |
| assignments/pykido/week3/data/patterns/greedy.md | 패턴 문서(그리디) 추가 |
| assignments/pykido/week3/data/patterns/hash-map.md | 패턴 문서(해시 맵) 추가 |
| assignments/pykido/week3/data/patterns/heap.md | 패턴 문서(힙) 추가 |
| assignments/pykido/week3/data/patterns/prefix-sum.md | 패턴 문서(누적 합) 추가 |
| assignments/pykido/week3/data/patterns/sliding-window.md | 패턴 문서(슬라이딩 윈도우) 추가 |
| assignments/pykido/week3/data/patterns/two-pointers.md | 패턴 문서(투 포인터) 추가 |
| assignments/pykido/week3/data/patterns/union-find.md | 패턴 문서(유니온 파인드) 추가 |
💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.
Comment on lines
+5
to
+14
| from .vectorstore import load_vectorstore | ||
|
|
||
|
|
||
| @lru_cache(maxsize=None) | ||
| def _store(strategy: str): | ||
| return load_vectorstore(strategy) | ||
|
|
||
|
|
||
| def retrieve(query: str, strategy: str = "markdown", k: int = 4) -> list[Document]: | ||
| return _store(strategy).as_retriever(search_kwargs={"k": k}).invoke(query) |
Comment on lines
+28
to
+36
| def load_vectorstore(strategy: str) -> FAISS: | ||
| path = INDEX_DIR / strategy | ||
| if not path.exists(): | ||
| raise FileNotFoundError(f"index not found: {path}. run indexing.py first.") | ||
| return FAISS.load_local( | ||
| str(path), | ||
| get_embeddings(), | ||
| allow_dangerous_deserialization=True, | ||
| ) |
Comment on lines
+1
to
+11
| from typing import Optional, TypedDict | ||
|
|
||
| from langchain_core.documents import Document | ||
|
|
||
|
|
||
| class RAGState(TypedDict): | ||
| question: str | ||
| strategy: str | ||
| documents: list[Document] | ||
| context: str | ||
| final_answer: Optional[dict] |
Comment on lines
+7
to
+11
| answer: str = Field(description="한국어 마크다운 답변. context 근거만 사용하고 모르면 모른다고 한다.") | ||
| confidence: float = Field( | ||
| ge=0.0, | ||
| le=1.0, | ||
| description="context 가 질문을 직접 뒷받침하면 0.85+, 부분적 근거면 ≤0.7.", |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
과제 수행 내용 요약
저번 과제까지 알고리즘 패턴과 문제 정보를
tools.py안의 mock dict 형태로 들고 있었습니다. 이번 주에는 그 지식을 마크다운 문서 20개(알고리즘 패턴 12 + 알고리즘 문제 8)로 만들고, 키워드 매칭이 아니라의미 기반 검색으로 답하는 RAG 파이프라인으로 교체했습니다. 흐름은문서 로드 → 청킹 → 임베딩 → FAISS → retriever → 2-step 그래프(retrieve → generate)로, 단계별로 파일 하나씩 책임을 나눴습니다.코퍼스(검색 대상이 되는 자료더미)는 새로 지어내지 않고 2주차에서 이미 검증된 패턴/문제 내용을 마크다운으로 확장했습니다. 덕분에 알고리즘 설명이 틀릴 위험이 적었고, 코드 9개는 직접 실행해 정답과 대조했습니다. 답변은 검색된 문서만 근거로
gpt-4o-mini가 생성하되, 근거 문서(sources)는 LLM이 지어내는 대신 실제 검색 결과에서 직접 뽑아 붙이도록 해서 '근거 없는 답"'을 구조적으로 막았습니다.청킹 전략 비교
recursive(700자 길이 분할)와 markdown(헤더 기준 분할) 두 전략을 같은 쿼리로 비교했습니다.
## 흔한 실수같은 섹션이 어휘 유사도 때문에 엉뚱한 문서에서 상위로 끌려오는 노이즈가 컸습니다.결과
최종 질문 6개(입국심사의 이분탐색, 보석쇼핑의 while 축소, 디스크컨트롤러 자료구조, 섬연결의 union-find, DFS와 최단거리, 등굣길 DP 상태)를 돌려 전부 검색 문서에 근거해 정확히 답했고, sources와 confidence를 함께 출력했습니다.