cleanUrl: "langchain-based-chatgpt-rag-from-academic-paper-pdf"
description: "Langchain을 활용한 PDF 기반의 retrieval-augmented generation (RAG) 방법을 알아봅니다."

어느날 ChatGPT가 내 논문의 내용을 알고 있을지 궁금해져서, ChatGPT에게 “Chromoformer가 뭐야?” 라고 물어보았다. (Chromoformer는 히스톤 코드와 유전자 발현량 사이의 관계를 모델링한 필자의 연구에서 만들어진 모델 이름이다.)

from langchain_openai import ChatOpenAI

OPENAI_API_KEY = "..."  # 발급받아서 채워넣자.
llm = ChatOpenAI(mobdel_name='gpt-4o-mini', temperature=0, api_key=OPENAI_API_KEY)

llm.invoke("What is chromoformer?")

돌아오는 답변은 역시 시원찮았다.

As of my last knowledge update in October 2023, "chromoformer" does not appear to be a widely recognized term in scientific literature or common usage. It is possible that it could refer to a specific concept, technology, or product that has emerged more recently or is niche in nature.

If you meant "chromoformer" in a specific context, such as a scientific field (like genetics, biochemistry, or materials science), or if it is a brand name or a term from a particular industry, please provide more details. This will help me give you a more accurate and relevant response.

정리하면 “2023년 10월 기준으로 그런 모델은 없거나, 널리 알려져 있지는 않다” 라는 거다. 2022년 10월에 출판된 논문이지만, 워낙 세부적인 분야의 논문이다보니 학습 데이터에 포함되어 있지 않았거나, 학습이 되었다고 해도 이를 다시 불러오지 못하고 있다고 추측해볼 수 있다.

Retrieval-augmented generation (RAG)

위 예와 같이, ChatGPT에게 조금 지엽적인 분야의 질문을 던지면 대개 그리 만족스러운 답변을 얻지 못한다. 하지만 다행히 ChatGPT는 꽤 좋은 이해력을 가지고 있어서, 모델이 학습될 때는 접하지 못한 분야라 할지라도 모델에게 쿼리를 날릴 때 (질문을 할 때) 적절한 사전 정보를 함께 제공하기만 하면 비교적 만족스러운 답변을 준다고 알려져 있다. 이러한 패러다임을 retrieval-augmented generation (RAG)라 부르며, 보다 질 좋은 답변을 얻고자 할 때나, 사내 문서 등 지엽적이거나 보안 유지가 중요한 시스템에서 LLM을 활용하고자 할 때 사용하곤 한다.

Langchain을 활용한 PDF 기반 RAG

RAG의 개념을 이해했으니, 이제 어떻게 모델에게 “적절한 사전 정보”를 전달하는지 알아보자. 필자의 경우에는 필자의 논문 내에 사전 정보들이 존재하고 있을 것이고, 이 논문은 PDF (혹은 저널 웹사이트의 HTML) 형태로 웹 상에 존재하고 있다. 여기서는 PDF 기반의 RAG를 시도해보고자 한다.

논문 PDF 파일의 URL을 입력으로 넣어서, 어떻게든 거기서 적절한 사전 정보를 추출한 다음 좋은 답변을 내놓을 수 있다면 아주 간단하고 좋을 것이다. 고맙게도 langchain을 활용하면 이 모든 작업을 코드 몇 줄로 해결할 수 있다!

사전 준비

모델에 추가적으로 제공될 사전 정보들이 포함된 문서를 langchain에서는 Document 라 부르며, 다양한 형태의 문서들을 파싱하여 불러올 수 있게 다양한 DocumentLoader 들이 존재한다. 여기서 우리는 PyPDFLoader를 활용할 것이다. (어떤 포맷의 문서를 활용할 수 있는지 더 알아보려면 langchain 공식 문서를 참고하자)

PyPDFLoader를 사용하기 위해서는 아래 패키지를 추가적으로 설치해주어야 한다.

$ pip install pypdf