← 프로젝트 목록
LangGraph 논문 검색 AI 에이전트
4인 팀 · 검색 서브그래프·RAG·품질 평가 담당
자연어로 논문을 검색·분석·추천하는 에이전트입니다. 검색 서브그래프와 RAG를 설계했고, RAGAS 평가로 검색 실패의 원인을 찾아 고쳤습니다.
PythonLangGraphGPT-4o-miniChromaDBCross-EncoderRAGASFastAPIGradio
30 → 11%회피 답변 비율
0.91Context Precision (유효 응답)
100%도메인 밖 질문 거부
1위수강생 10팀 중
프로젝트 목적
주제나 제목으로 논문을 찾고, 내용을 요약·설명하고, 관심사에 맞는 논문을 추천하는 에이전트를 만드는 수업 프로젝트였습니다. 근거 없는 답변을 줄이는 것이 핵심이었습니다.
| 기간 | 2025.10 — 2025.12 |
|---|---|
| 인원 | 4명 |
| 링크 | GitHub ↗ |
담당 역할
- 검색 서브그래프 설계: RAG → Semantic Scholar → Google 순 폴백
- RAG 파이프라인: 인덱싱, 거리 게이트, 리랭킹
- RAGAS 평가셋 구축과 단계별 실패 분석
시스템 구조
주요 구현
1. 인덱싱→2. 벡터 검색→3. 거리 게이트→4. 리랭킹→5. 외부 검색 폴백
- 논문 약 1,700편을 1,000자 청크(겹침 100) 약 3,300개로 나눠 다국어 임베딩으로 ChromaDB에 인덱싱했습니다.
- 벡터 검색 결과 중 거리가 먼 것은 답변에 쓰기 전에 버리고, 남은 후보는 Cross-Encoder로 다시 순위를 매겼습니다.
- 평가셋은 코퍼스에서 주제별로 뽑은 논문으로 LLM이 질문을 만들게 해 10개 이상 분야, 99건을 구성했습니다.
해결 과제
1. 관련 없는 질문에도 답하던 RAG
- 과제
- 벡터 검색은 관련 없는 질문에도 가장 가까운 문서를 돌려줘, 그럴듯한 환각 답변이 나왔습니다.
- 접근
- 검색 결과를 쓰기 전에 거리로 먼저 거르기로 했습니다. 임계값은 감으로 잡았던 0.5 대신, 평가셋 100건(코퍼스 안 80건, 도메인 밖 20건)의 거리 분포를 훑어 0.45로 정했습니다.
도메인 밖 질문 거부 95% → 100%, 전체 분류 정확도 98% → 99%
2. 리랭커가 순위를 무너뜨리고 있었다
- 과제
- 완성 후 성능을 체감으로만 판단하고 있었습니다. RAGAS로 재 보니 정답 논문이 코퍼스에 있는데도 30%가 "찾지 못했다"는 회피 답변이었습니다.
- 원인
- 처음엔 검색 개수가 적다고 보고 top-k를 3에서 5로 늘렸지만 24%에서 멈췄습니다. 검색·게이트·리랭킹을 나눠 실행해 보니 벡터 검색은 정답을 1위로 찾았는데, 영어 전용 리랭커(ms-marco)가 한국어 질의의 순위를 뒤섞고 있었습니다.
- 접근
- 다국어 리랭커(mMARCO)로 교체했습니다.
| 응답 가능 94건 기준 | 초기 (k=3) | k=5 | k=5 + 다국어 리랭커 |
|---|---|---|---|
| 회피 답변 비율 | 30% | 24% | 11% |
| 유효 응답 수 | 64건 | 69건 | 81건 |
| Context Precision | 0.637 | 0.619 | 0.804 |
| Context Recall | 0.660 | 0.704 | 0.809 |
| Faithfulness | 0.735 | 0.731 | 0.792 |
| Answer Relevancy | 0.444 | 0.484 | 0.554 |
유효 응답만 보면 Faithfulness 0.845 · Context Precision 0.909 · Context Recall 0.901
남은 한계
- Answer Relevancy가 0.55로 다른 지표보다 낮습니다.
- 평가셋을 LLM으로 생성해, 실제 사용자 질문과 분포가 다를 수 있습니다.