ReportCoach는 과학전람회 보고서 데이터로 구축된 벡터 DB를 기반으로, AI를 활용하여 리포트를 검색, 분석하고 작성을 돕는 웹 애플리케이션입니다.
사용자는 AI와의 상호작용을 통해 아이디어를 발전시키고 완성도 높은 결과물을 만들 수 있습니다.
이 서비스는 2011년 이후 과학전람회 보고서 전체 데이터를 벡터화(embedding)해 구축한 DB를 기반으로 동작합니다.
- AI 채팅: 문서 내용에 기반한 심층적인 질의응답이 가능합니다.
- 리포트 작성: AI의 가이드를 받으며 단계별로 리포트를 완성할 수 있습니다.
- 리포트 검색: 질문을 기반으로 가장 관련도 높은 보고서를 찾아주고, 여러 보고서의 내용을 종합하여 요약 설명해줍니다.
- RAG 기반 검색: 과학전람회 보고서 사이트에 공개된 2011년 이후 모든 보고서 데이터를 벡터 DB(ChromaDB)에 임베딩하고, LangChain을 활용해 검색-증강-생성(Search-Augmented Generation) 방식을 구현했습니다.
- 노트 작성: 분석 중 발견한 중요한 내용 혹은 작성중인 보고서를 노트로 저장하고 관리합니다.
- PDF 뷰어: 웹에서 바로 문서를 확인하고 분석할 수 있습니다.
- 안전한 사용자 인증: JWT 토큰 기반의 안정적인 회원가입 및 로그인 시스템을 제공합니다.
- 프로필 및 계획 관리: 사용자 정보를 관리하고 리포트 작성 계획을 체계적으로 수립합니다
![]() 메인 페이지 사이트 접속 초기 화면 |
![]() 검색 화면 벡터DB 기반 검색 결과 |
![]() 보고서 분석 화면 AI와 질의응답하며 보고서 분석 |
![]() 보고서 작성 화면 AI 가이드와 함께 보고서 작성 |
![]() 노트 페이지 저장된 보고서 및 대화 내역 조회 |
![]() 멤버십 페이지 플랜 구독 및 해지 |
- FastAPI: Python 웹 프레임워크
- Supabase: 데이터베이스 및 인증
- LangChain: AI 모델 통합
- ChromaDB: 벡터 데이터베이스
- Google GenAI: AI 모델 서비스
- Uvicorn: ASGI 서버
- React: 사용자 인터페이스
- Vite: 빌드 도구
- Tailwind CSS: 스타일링
- TipTap: 리치 텍스트 에디터
- React Router: 라우팅
- Axios: HTTP 클라이언트
- 과학전람회 보고서 사이트에서 2011년 이후 모든 보고서 메타데이터 및 PDF를 수집
- 보고서 본문을 문단 단위로 쪼개고 임베딩(embedding)하여 ChromaDB에 저장
- LangChain을 통해 벡터 검색과 문서 retrieval 파이프라인 구성
- Google GenAI 모델이 검색된 문서를 기반으로 자연스러운 답변을 생성 (RAG pipeline)
ReportCoach RAG 시스템 구조 (전체 아키텍처)
flowchart TB
subgraph OFFLINE["📦 오프라인: 지식베이스 구축"]
A1[과학전람회 사이트] --> A2[report_crawler]
A2 --> A3[download_pdfs]
A3 --> A4[extract_text / extract_image]
A4 --> A5[reformat_text]
A5 --> A6[convert_json]
A6 --> A7[build_chromadb]
A7 --> A8[(ChromaDB<br/>벡터 DB)]
A7 --> A9["HuggingFace Embeddings<br/>(multilingual-e5-large)"]
A9 --> A8
end
subgraph ONLINE["🔍 온라인: 검색·생성 (RAG)"]
B1[사용자 쿼리] --> B2[SearchService]
B2 --> B3[쿼리 분석<br/>Gemini + prompt_search]
B3 --> B4[요약 쿼리 / 우선순위 섹션 / 키워드 / 메타필터]
B4 --> B5[벡터 검색<br/>Chroma similarity_search]
B5 --> B8[(ChromaDB)]
B8 --> B5
B5 --> B6[재정렬<br/>rerank_with_weights]
B6 --> B7[Top-K 문서 결과]
B7 --> B9{사용처}
B9 --> B10[검색 API 응답]
B9 --> B11[Write 채팅<br/>analyze_for_write]
end
A8 -.-> B8
RAG 검색 파이프라인 상세 (Sequence)
sequenceDiagram
participant User
participant API as Search/Write API
participant Search as SearchService
participant Gemini as Google Gemini
participant Emb as HuggingFace Embeddings
participant Chroma as ChromaDB
User->>API: 질의 (query)
API->>Search: search_documents(query, k)
Note over Search: 1. 쿼리 분석
Search->>Gemini: analyze_user_query (prompt_search.txt)
Gemini-->>Search: 요약 쿼리, 우선순위 섹션, 키워드, 메타필터
Note over Search: 2. 벡터 검색
Search->>Emb: embed_query(summary_query)
Emb-->>Search: query_embedding
Search->>Chroma: similarity_search_with_score(summary_query, k×5)
Chroma-->>Search: raw_results (문서 + 점수)
Note over Search: 3. 메타데이터 필터 (선택)
Search->>Search: metadata_filters 적용
Note over Search: 4. 재정렬 (Rerank)
Search->>Emb: embed_documents(문서/제목)
Emb-->>Search: doc_vectors, title_vectors
Search->>Search: rerank_with_weights<br/>(content/title 유사도, 섹션, 키워드, 수상, 메타데이터)
Note over Search: 5. 결과 포맷
Search->>Search: 중복 제거, Top-K, score_info
Search-->>API: results
API-->>User: 검색 결과 또는 Write 답변
report-app/
├── backend/ # FastAPI 백엔드
│ ├── app/
│ │ ├── routers/ # API 라우터
│ │ ├── services/ # 비즈니스 로직
│ │ ├── models/ # 데이터 모델
│ │ └── schemas/ # Pydantic 스키마
│ ├── prompts/ # AI 프롬프트
│ ├── scripts/ # 유틸리티 스크립트
│ └── main.py # 애플리케이션 진입점
├── frontend/ # React 프론트엔드
│ ├── src/
│ │ ├── features/ # 페이지 컴포넌트
│ │ ├── components/ # 재사용 컴포넌트
│ │ └── services/ # API 서비스
│ └── public/ # 정적 파일
└── docker-compose.yml # Docker 설정
- backend 디렉토리 에서 API 명세, 벡터 DB 구축 과정, 과학전람회 보고서 크롤링 스크립트, 데이터 전처리 코드 등을 확인할 수 있습니다.





