라이브
📚논문드림·학위논문 인쇄·제본, 전국 대학 규격 그대로논문드림·긴급납기 신청 시 +2영업일 제작 완료 (일반은 +3영업일)🎓논문드림·5명 이상 단체 주문은 25% 자동 할인논문드림·동판+금박 올인원 · 전국 택배 무료📚논문드림·학위논문 인쇄·제본, 전국 대학 규격 그대로논문드림·긴급납기 신청 시 +2영업일 제작 완료 (일반은 +3영업일)🎓논문드림·5명 이상 단체 주문은 25% 자동 할인논문드림·동판+금박 올인원 · 전국 택배 무료

AI는 논문 작업을 ‘돕는’ 도구입니다. 연구 주제 선정·판단·집필의 주체는 연구자 본인이며, AI가 논문을 대신 써주지 않습니다. 인용·사실은 반드시 직접 검증하고, 소속 기관·학회지의 생성형 AI 사용 규정을 우선 확인하세요.

Part 5심화

RAG — 내 문헌에 근거해 쓰는 법

RAG로 내가 가진 문헌에만 근거해 환각 없이 쓰는 법 — 파이프라인·도구·한국어 임베딩.

한눈에 보기 · RAG 파이프라인
  1. 1
    문서 수집
  2. 2
    PDF 파싱
  3. 3
    청킹
  4. 4
    임베딩
  5. 5
    벡터DB
  6. 6
    검색
  7. 7
    LLM 생성
  8. 8
    출처 인용

챗봇에 "이 주제 선행연구 정리해 줘"라고 물으면 그럴듯한 문장과 함께 존재하지 않는 논문을 인용하는 일이 흔합니다. 이것을 환각(hallucination, 그럴듯하지만 사실이 아닌 생성)이라고 부릅니다. 논문에서 가짜 인용은 치명적입니다. RAG(Retrieval-Augmented Generation, 검색증강생성)는 이 문제를 정면으로 해결하는 구조입니다. AI가 자기 기억에서 답을 지어내는 대신, 내가 직접 모은 실제 PDF 문헌에서 관련 대목을 먼저 찾아온(retrieve) 뒤 그 대목만 근거로 답을 생성(generate)하게 만듭니다.

일반 챗봇과 무엇이 다른가

일반 챗봇은 학습 데이터에 녹아든 "기억"으로 답합니다. 출처를 특정할 수 없고, 최신 논문이나 내 폴더 속 자료는 모릅니다. RAG는 답하기 직전에 내 문헌 창고를 검색해서 근거 문단을 model에 함께 넣어 줍니다. 그래서 (1) 내가 넣지 않은 자료는 답에 등장하지 않고, (2) 답의 각 문장이 어느 문서 몇 페이지에서 나왔는지 되짚을 수 있습니다. 논문 작업에서 RAG가 결정적인 이유가 바로 이 근거 추적 가능성입니다.

RAG 파이프라인: 8단계 흐름

전체 과정은 "미리 색인을 만들어 두고(1~5), 질문할 때 꺼내 쓰는(6~8)" 두 국면으로 나뉩니다.

  1. 문서 수집(ingestion, 자료 모으기) — 내 PDF, 학위논문, 스캔본을 한 폴더에 모읍니다.
  2. PDF 파싱/OCR(parsing, 문자 추출) — PDF에서 본문·표·수식 텍스트를 뽑아냅니다. 스캔 이미지 PDF는 OCR(광학문자인식)이 필요합니다.
  3. 청킹(chunking, 조각 나누기) — 긴 글을 검색 단위(예: 몇 백 단어)로 쪼갭니다. 이 조각 하나가 나중에 검색·인용의 기본 단위가 됩니다.
  4. 임베딩(embedding, 의미 벡터화) — 각 조각을 "의미를 나타내는 숫자 배열(벡터)"로 변환합니다. 뜻이 비슷하면 벡터도 가까워집니다.
  5. 벡터DB 저장(vector database, 벡터 저장소) — 이 벡터들을 빠르게 검색되도록 저장합니다.
  6. 검색(retrieval, 근거 찾기) — 질문도 벡터로 바꾼 뒤, 가장 가까운 상위 몇 개 조각(top-k)을 꺼냅니다.
  7. 생성(generation, 답 작성) — LLM(대규모 언어모델)이 꺼내온 조각만 근거로 답을 씁니다.
  8. 출처 표기(citation, 인용 표시) — 답의 각 주장에 어느 문서·페이지에서 왔는지 표시합니다.

대표 도구 (2026년 7월 기준 현행 확인)

범주별로 실무에서 쓰이는 오픈소스를 정리했습니다. 처음이라면 논문 특화 도구(PaperQA2)부터 시작하는 편이 가장 빠릅니다.

범주도구용도 / 특징
프레임워크
(파이프라인 조립)
LlamaIndex검색(retrieval) 중심. 문서 색인·질의에 강해 RAG 입문에 적합
LangChain연동 폭이 넓고 에이전트(자율 수행)·다단계 워크플로에 강함
Haystack파이프라인을 부품처럼 명시적으로 구성. 감사·운영 통제에 유리
벡터DB
(벡터 저장소)
Chroma파이썬 친화적. 개인 프로젝트·프로토타입에 가장 간단
QdrantRust 기반으로 빠름. 규모가 커질 때 유리
Weaviate키워드+의미 하이브리드 검색에 강점
pgvectorPostgreSQL 확장. 이미 Postgres를 쓴다면 별도 DB 없이 사용
논문 특화PaperQA2 (paper-qa)과학 문헌 전용 고정밀 RAG. 근거 인용을 기본 제공. 파싱·청킹·재순위를 알아서 처리
PDF 파싱/OCRGROBID학술 PDF를 구조화 XML(제목·저자·참고문헌)로 추출
markerPDF를 표·수식 포함 Markdown으로 빠르게 변환
Nougat수식·표가 많은 학술 문서를 OCR로 마크업 변환

한국어 문헌 RAG: 임베딩 모델이 핵심

4단계의 임베딩 모델이 한국어를 제대로 이해하지 못하면, 아무리 좋은 프레임워크를 써도 검색이 엉뚱한 조각을 꺼내옵니다. 영어 위주로 학습된 임베딩에 한국어 논문을 넣으면 "의미가 가까운데 다른 벡터"가 되어 검색이 헛돕니다. 한국어(및 다국어) 문헌을 다룬다면 아래처럼 한국어를 지원하는 임베딩을 반드시 고르세요.

모델 (조직/모델명)특징
nlpai-lab/KURE-v1고려대 NLP연구실이 한국어 검색에 특화해 BAAI/bge-m3를 한국어 질의-문서 쌍으로 미세조정. 한국어 검색에서 다국어 모델 다수를 능가. MIT 라이선스
BAAI/bge-m3100여 개 언어를 지원하는 다국어 임베딩. 한국어+외국어 문헌을 섞어 다룰 때 무난한 기본값

근거 있는 인용 유지(grounded citation)

논문 작업에서 RAG의 존재 이유는 결국 이것입니다. 답변의 모든 주장에 "이 문장은 어느 문서, 몇 페이지에서 나왔다"는 꼬리표가 붙어야 합니다. 그래야 (1) AI가 지어낸 인용인지 검증할 수 있고, (2) 원문을 직접 확인해 내 문장으로 다시 쓸 수 있습니다. PaperQA2 같은 논문 특화 도구는 이 출처 표기를 기본으로 내장하고, LlamaIndex는 CitationQueryEngine과 응답 객체의 source_nodes(근거 조각 목록)로 출처를 되짚게 해 줍니다.

주의: RAG가 출처를 붙여 주더라도, 그 출처가 실제로 그 주장을 뒷받침하는지는 사람이 원문을 열어 최종 확인해야 합니다. 인용 표기가 있다는 사실과 인용이 정확하다는 사실은 다릅니다.

최소 코드 스켈레톤

실행 세부보다 흐름을 보여 주는 짧은 예시입니다. 먼저 가장 간단한 논문 특화 도구 PaperQA2입니다. PDF를 한 폴더에 모아 두고 질문하면, 검색·근거 인용까지 알아서 처리합니다.

# pip install paper-qa
# PDF들을 my_papers/ 폴더에 넣어 둔다
from paperqa import Settings, ask

answer = ask(
    "이 연구들에서 공통으로 지적하는 한계는 무엇인가?",
    settings=Settings(agent={"index": {"paper_directory": "my_papers"}}),
)
print(answer)   # 답변 + 근거 문서/구절 인용이 함께 출력된다

다음은 LlamaIndex로 단계를 직접 조립하는 예시입니다. 한국어 임베딩(KURE-v1)을 끼우고, 답과 함께 출처 조각을 꺼내는 흐름을 보여 줍니다.

# pip install llama-index llama-index-embeddings-huggingface
from llama_index.core import SimpleDirectoryReader, VectorStoreIndex, Settings
from llama_index.embeddings.huggingface import HuggingFaceEmbedding

# 4단계: 한국어 임베딩 지정
Settings.embed_model = HuggingFaceEmbedding(model_name="nlpai-lab/KURE-v1")

# 1~5단계: 폴더 읽기 → 청킹·임베딩 → 색인 저장
docs  = SimpleDirectoryReader("my_papers").load_data()
index = VectorStoreIndex.from_documents(docs)

# 6~7단계: 상위 3개 조각(top-k=3)만 검색해 답 생성
engine = index.as_query_engine(similarity_top_k=3)
resp   = engine.query("선행연구들의 표본 크기 차이를 정리해줘")
print(resp)

# 8단계: 근거로 쓰인 출처 조각 되짚기
for s in resp.source_nodes:
    print(s.node.metadata.get("file_name"), "—", s.node.metadata.get("page_label"))

흔한 실패와 점검 지점

  • 청크 크기·겹침(chunk size & overlap) — 조각이 너무 크면 검색이 뭉뚱그려지고, 너무 작으면 문맥이 잘립니다. 조각 사이를 조금 겹치게(overlap) 두어야 문장이 경계에서 끊겨 뜻을 잃는 일을 막습니다.
  • 검색 개수(top-k) — 너무 적게 꺼내면 근거가 빠지고, 너무 많이 꺼내면 관련 없는 조각이 섞여 답이 흐려집니다. 3~8개 사이에서 조정해 보세요.
  • 파싱 품질 — 2단계에서 표·수식·2단 편집(2-column)이 깨지면 이후 모든 단계가 오염됩니다. 스캔본은 반드시 OCR을, 수식이 많으면 Nougat·marker를 검토하세요.
  • 임베딩-언어 불일치 — 한국어 문헌에 영어 위주 임베딩을 쓰면 검색이 조용히 실패합니다("오류"가 아니라 "엉뚱한 결과"). 한국어 자료에는 한국어 지원 임베딩을 쓰세요.
  • 인용 미검증 — RAG가 붙인 출처를 원문 대조 없이 그대로 논문에 옮기지 마세요. 최종 확인은 사람의 몫입니다.

RAG로 근거를 정리했다면, 마지막에 원고의 오탈자와 형식을 점검하는 단계가 남습니다. 논문드림의 무료 논문 검증으로 문장을 다듬고, 제출·제본 규격은 논문 규격에서 확인하세요.

AI로 다듬은 원고, 마무리는 논문드림에서