← 프로젝트 목록으로
LLM / RAG

My Knowledge Chatbot 만들기

반도체 수업을 진행하면서 정리한 온라인 노트를 베이스로 삼아 그 내용에 근거해서만 답변하는 개인용 학습 챗봇을 만든 프로젝트입니다. LangChain과 Gemini API, Chroma 벡터 DB로 검색 증강 생성(RAG) 파이프라인을 구성해, 여러 폴더를 직접 뒤지지 않고 질문 한 번으로 언제 배운 개념인지부터 수율과의 연관성까지 구조화된 답변을 받을 수 있게 됐습니다.

기간2026.06 - 2026.08
구분개인 프로젝트
스택LangChain, Google Gemini API, Chroma, Google Colab
RAGLangChain + Gemini 2.5 Flash
k=4청크 검색 개수
3단계구조화된 답변 형식

개요

청년 Hy-po 프로그램을 들으며 매일 교육 중 나온 물성·소자·반도체 Process 관련 생소한 용어들을 복습하고 정리했습니다. 회로·소자·생산관리 등 여러 과목에서 배우는 용어를 수율 엔지니어의 시각으로 다시 정리해두는 과정이 꼭 필요했는데, 막상 같은 개념이 다시 나왔을 때 예전에 정리해둔 내 노트를 빠르게 찾아보기가 어려웠습니다. 이를 해결해볼 방법으로 내가 작성한 노트만을 근거로 답변하는 개인용 RAG 챗봇 "하이포_챗"을 Google Colab 환경에서 구현했습니다. 노트는 키워드마다 한 줄 정리·상세 설명·산업 동향·내 의견 순으로 작성해두었습니다.

목표: 내가 작성한 노트를 검색해 그 내용에 기반해서만 답변하고, 반도체 수율 엔지니어를 목표로 하는 학습 맥락에 맞춰 답변 형식을 구조화하는 것

문제 정의

  • 여러 폴더 중 노트를 매번 직접 검색해서 원하는 부분을 찾아 읽어야 했던 비효율
  • 일반 LLM에 그냥 질문하면 전공 맥락과 무관한 일반론적 답변(할루시네이션 위험)이 나오는 문제
  • 단순 답변이 아니라 "언제 배웠는지 → 개념 복기 → 수율/Process과의 연관성 → 더 찾아볼 키워드" 순서로, 나에게 맞춰 구조화된 답변이 필요

접근 방법

Google Drive의 my knowledge bot/notes 폴더에 과목별로 정리한 마크다운(.md) 노트를 DirectoryLoader로 불러온 뒤, MarkdownTextSplitter(chunk_size=500, chunk_overlap=50)로 청크 분할하고, Gemini 임베딩 모델(gemini-embedding-001)로 임베딩해 Chroma 벡터DB에 저장했습니다. 질의응답 시에는 retriever(k=4)로 관련 청크 4개를 검색해 프롬프트에 컨텍스트로 주입하고, gemini-2.5-flash 모델이 아래 형식으로 답하도록 ChatPromptTemplate으로 system/user 메시지를 분리해 프롬프트를 설계했습니다.

  • 0. (필수) "안녕하세요! 하이포에서 X월 Y일 배운 Z 키워드 내용과 관련있네요!" — 노트 작성일과 핵심 키워드를 답변 서두에 자동으로 채워 넣도록 지시
  • 1. 핵심 개념
  • 2. 수율/Process과의 연관성
  • 3. 더 찾아볼 키워드

체인 구성은 {"context": retriever, "question": RunnablePassthrough()} | PROMPT | llm | StrOutputParser() 형태의 LangChain LCEL 파이프라인이며, Colab에서 ipywidgets로 간단한 채팅 UI(입력창·전송·대화 초기화 버튼, 말풍선 렌더링)를 구현해 바로 사용할 수 있도록 했습니다. 답변에 포함된 마크다운 문법(**, 목록 등)은 markdown 라이브러리로 HTML로 변환해 렌더링하고, ChromaDB 접근 중 발생할 수 있는 disk I/O 오류 등은 별도로 감지해 원인과 해결 방법을 안내하도록 예외 처리를 추가했습니다.

마크다운 노트
청크 분할
Gemini 임베딩
Chroma 벡터DB
검색 (k=4)
프롬프트 주입
Gemini 2.5 Flash 응답
참고: 개인 학습 중 사용한 원본 노트북에는 API 키가 하드코딩되어 있어, .env / Colab Secrets 기반으로 키를 분리한 배포용 버전을 별도로 정리해 GitHub에 공개했습니다. 아래 첨부 자료에서 확인하실 수 있습니다.

결과

현재는 "물성 및 소자", "반도체 Process" 과목 노트 30개 파일로 검증했습니다. 질문을 입력하면 노트가 작성된 날짜와 핵심 키워드를 자동으로 인식해 인사말로 안내한 뒤, 해당 노트 내용을 근거로 핵심 개념·수율 Process과의 연관성·추가 학습 키워드까지 구조화된 답변을 받아 복기할 수 있음을 확인했습니다. ipywidgets 기반 채팅 UI에서 마크다운 서식이 적용된 답변으로 실시간 질의응답이 가능합니다.

실제 코드는 깃허브로 들어가셔서 확인하실 수 있으며, 아래는 웹사이트에 실제 화면을 그대로 체험해볼 수 있게 하고자 만든 UI 프로토타입입니다. CPO 질문은 실제 답변 내용 그대로이고, 나머지 두 개(포토리소그래피, 도즈)는 같은 형식을 보여주기 위한 예시입니다.

참고: 이 프로토타입은 LangChain/Gemini/Chroma 백엔드에 연결되어 있지 않습니다. 미리 정해둔 3개 질문에 대해서만 정해진 답변이 나오는 프론트엔드 UI 시연용이며, 실제 RAG 파이프라인은 위 접근 방법에서 설명한 Google Colab 노트북으로 동작합니다!
하이포_챗
노트 기반 답변 준비 완료
검색 파이프라인
검색된 노트 (k=4)
질문을 입력하면 벡터 DB에서 검색된 노트 청크 4개가 여기 표시됩니다.

배운 점 & 향후 계획

  • 청크 크기·overlap, retriever의 k값 등 RAG 하이퍼파라미터가 답변 품질에 미치는 영향을 직접 튜닝하며 느꼈습니다
  • 프롬프트에 답변 형식을 명시적으로 지정하는 것만으로도 학습 목적에 맞는 구조화된 응답을 얻을 수 있음을 확인했습니다
  • system/user 메시지를 분리한 ChatPromptTemplate과 마크다운 렌더링, ChromaDB 오류 처리를 추가하며 실제 사용 가능한 수준으로 다듬는 과정에서 프롬프트 설계와 예외 처리의 중요성을 체감했습니다
  • API 키를 코드에 하드코딩하지 않고 환경 변수/시크릿 매니저로 분리해야 한다는 점을 체감해, 배포용 버전에서는 .env / Colab Secrets 기반으로 분리했습니다
  • 향후 전공 노트 전체로 지식베이스를 확장하고, 출처 청크를 답변에 함께 표시하는 기능을 추가해볼 계획입니다

첨부 자료

GitHub Repository →