코딩하는 덕구 🐶

LangChain으로 논문 분석 및 문서 QA 봇 만들기 본문

인공지능

LangChain으로 논문 분석 및 문서 QA 봇 만들기

코딩하는 덕구 🐶 2024. 11. 27. 09:21
728x90
반응형
  • 제조 사례에서 알아본 사례 중 하나인 NVIDA 사례(ChipNeMo 논문)를 분석해보겠습니다.
  • 내용이 어렵고 분량도 많으니 생성AI를 위한 프레임워크인 LangChain을 이용해서 논문의 내용을 분석해보겠습니다.
  • jupyter 노트북, open Ai API key가 필요합니다.

자료 출처: 아래의 링크에서 PDF 형식으로 파일을 다운로드 받을 수 있습니다.

발급 받은 OpenAI key를 불러옵니다.

In [1]:
import os
os.environ["OPENAI_API_KEY"] = "your key" #각각의 open AI key 입력

필요 모듈을 불러옵니다.

In [2]:
import openai
from PyPDF2 import PdfReader
from langchain.document_loaders import PyPDFLoader, Docx2txtLoader
 

Option 1. PDF 파일을 불러옵니다.

In [3]:
path = "nvidia_ChipNeMo_Domain-Adapted LLMs for Chip Design.pdf"
 
In [11]:
reader = PdfReader(path)
paper_law_raw_text = ""
for i, page in enumerate(reader.pages): #각 페이지에 접근
    text = page.extract_text() #현재 페이지의 텍스트 추출
    if text: #추출한 텍스트가 존재한다면
 	paper_law_raw_text += (text + " ") #기존문자 + 추출한 텍스트
        paper_law_raw_text = paper_law_raw_text.replace("/n", " ")
print(paper_law_raw_text)
 

논문에 대한 QA는 정확성과 일관성이 중요하므로, 일관된 답변을 위해 temperature를 0으로 설정합니다.

  • gpt4 모델은 gpt-3.5 모델보다 정확성이 더 높지만 속도가 느리고 비용이 비싸므로, 주의하여야 합니다.
  • 이번 실습에서는 gpt-3.5 모델을 이용하여 진행하겠습니다.
In [14]:
from langchain.chat_models import ChatOpenAI

model = ChatOpenAI(model="gpt-3.5-turbo", temperature=0)
#temperature 높이면 유연하게 답변하게 됨. 답변마다 답변 내용이 달라짐.
 

사용할 수 있는 모델들

  • 모델마다 비용이 다르기 때문에 주의해서 사용이 필요합니다.
  • 2024.05월 기준
CategoryModel
GPT-4o "gpt-4o"
GPT-4 Turbo and GPT4 "gpt-4-turbo"
  "gpt-4"
GPT-3.5 Turbo "gpt-3.5-turbo" (권장)

질문 답변을 위한 도구(Chain) 만들기

  • chain_type="map_reduce"를 이용하여, PDF 전체 텍스트의 양이 많기 때문에 전체 텍스트를 덩어리(batch)로 나누어 질문과 관련이 있는 덩어리(batch)를 기준으로 답변을 해주도록 설정합니다.
In [15]:
from langchain.chains.question_answering import load_qa_chain #질문 응답 체인(도구)
from langchain.chains import AnalyzeDocumentChain #논문 분석 체인

qa_chain = load_qa_chain(model, chain_type="map_reduce")
#질문과 가까운 페이지(문서 내용)을 모델이 
#자체적으로 판단하고 관련된 내용의 텍스트를 참조하여 답변 생성
#문서 전체는 무겁기 때문에 나눠서 처리해야 함

qa_document_chain = AnalyzeDocumentChain(combine_docs_chain=qa_chain)
#문서 분석 체인과 결합한 최종 질문 응답 체인 객체 구성
 

사용의 편의성을 위해 함수로 만들기

  • 프롬프트를 입력하면 출력 결과와 함께 총 사용 토큰과 그에 따른 달러/원 비용, 그리고 소요 시간이 함께 출력되는 함수를 만듭니다.
  • 참고: 1 token은 대략 영어에서 알파벳 4개 정도의 크기에 해당하며, 한글은 한 글자가 초성, 중성, 종성 세 글자로 구성되기에 영어보다 훨씬 토큰 수가 더 많이 소모됩니다.

 

 
 
import FinanceDataReader as fdr #환율 가져오는 라이브러리
exchange_rate = fdr.DataReader('USD/KRW').iloc[-1][0] #달러를 원화로 변경후 가져옴
 
 
 
from langchain.callbacks import get_openai_callback
# 토큰 사용량 알 수 인는 모델

from langchain.chat_models import ChatOpenAI
#GPT 가져오기

from langchain.chains.question_answering import load_qa_chain
#질문 응답 특화된 체인

import time

def qa_bot(source, question, model='gpt-3.5-turbo', temperature=0, chain_type="map_reduce"):

    model = ChatOpenAI(model=model, temperature=0)

    qa_chain = load_qa_chain(model, chain_type=chain_type)
    qa_document_chain = AnalyzeDocumentChain(combine_docs_chain=qa_chain)

    with get_openai_callback() as cb: #callback을 cb로 별명 지어줌 
        #with : 코드 블록 내의 코드가 모두 실행되는 동안 리소스가 할당되고, 이후에 자동으로 정리
        #ex) 파일처리, 데이터베이스 연결(보안을 위해 사용시에만 연결), 잠금 관리 등 리소스 관리 
        
        start = time.time() #현재시간
        
        print(qa_document_chain.run(input_document=source, question=question))
        end = time.time()

        print(f"Total Tokens: {cb.total_tokens}") # 총 처리 토큰(단어) 수
        print(f"Prompt Tokens: {cb.prompt_tokens}") #프롬프트 읽을 때 처리 토큰(단어) 수
        print(f"Completion Tokens: {cb.completion_tokens}") #응답할 때 처리 토큰(단어) 수
        print(f"Total Cost (USD): {cb.total_cost:.2f}$, Total Cost (Won): {cb.total_cost*exchange_rate:.2f}₩")
        #환율 계산 후 달러/원화 얼만지 계산
        
        print(f"걸린 시간: {end-start:.2f}초")
        #응답하는데 걸린 시간

 

우리가 만든 PDF QA 봇이 얼마나 정확하게 답변해주는지 확인해봅시다.

 

Q. 텍스트에서 LLM을 이용한 칩 디자인을 위해 어떤 방법을 사용했나요?

qa_bot(paper_law_raw_text, "텍스트에서 LLM을 이용한 칩 디자인을 위해 어떤 방법을 사용했나요?")
728x90
반응형