← 프로젝트 목록
수업 프로젝트 · 수강생 10팀 중 1등2025.10 — 2025.12

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 평가셋 구축과 단계별 실패 분석

시스템 구조

논문 검색 에이전트 전체 구조
전체 구조 · guard → agent → 서브그래프 3개 · 단기·장기 메모리원본 보기 ↗
검색 서브그래프 상세
검색 서브그래프 상세 (담당)원본 보기 ↗
이렇게 설계한 이유검색 순서를 LLM의 도구 호출에 맡기면 매번 달라집니다. LLM은 어떤 기능(검색·분석·추천)을 쓸지만 고르고, 검색 순서는 서브그래프의 조건부 엣지로 고정했습니다. 내부 DB에 근거가 없으면 학술 API, 웹 검색 순으로 넘어가고, 외부 결과에도 같은 게이트와 리랭킹을 적용합니다.

주요 구현

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 · 단계별 분리 측정

과제
완성 후 성능을 체감으로만 판단하고 있었습니다. RAGAS로 재 보니 정답 논문이 코퍼스에 있는데도 30%가 "찾지 못했다"는 회피 답변이었습니다.
원인
처음엔 검색 개수가 적다고 보고 top-k를 3에서 5로 늘렸지만 24%에서 멈췄습니다. 검색·게이트·리랭킹을 나눠 실행해 보니 벡터 검색은 정답을 1위로 찾았는데, 영어 전용 리랭커(ms-marco)가 한국어 질의의 순위를 뒤섞고 있었습니다.
접근
다국어 리랭커(mMARCO)로 교체했습니다.
응답 가능 94건 기준초기 (k=3)k=5k=5 + 다국어 리랭커
회피 답변 비율30%24%11%
유효 응답 수64건69건81건
Context Precision0.6370.6190.804
Context Recall0.6600.7040.809
Faithfulness0.7350.7310.792
Answer Relevancy0.4440.4840.554

유효 응답만 보면 Faithfulness 0.845 · Context Precision 0.909 · Context Recall 0.901

남은 한계

  • Answer Relevancy가 0.55로 다른 지표보다 낮습니다.
  • 평가셋을 LLM으로 생성해, 실제 사용자 질문과 분포가 다를 수 있습니다.