Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 |
Tags
- pytorch
- C++
- 백준1463
- 백준C++
- C++ 함수
- 1로만들기
- tensorflow
- 1463
- 백준
- C++ 공백 입력
- precision
- AI강의
- AIDEEPDIVE
- 비교연산자
- 혁펜하임
- C++ 백준
- 혁펜하임강의후기
- 백준1026
- 백준9095
- 패스트캠퍼스
- 9095
- 혁펜하임AI
- 조건문
- for문
- 반복문
- cuDNN
- 혁펜하임강의
- CUDA
- c++ 기초
- 패스트캠퍼스혁펜하임
Archives
- Today
- Total
코딩하는 덕구 🐶
LangChain으로 논문 분석 및 문서 QA 봇 만들기 본문
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월 기준
GPT-4o | "gpt-4o" |
GPT-4 Turbo and GPT4 | "gpt-4-turbo" |
"gpt-4" | |
GPT-3.5 Turbo | "gpt-3.5-turbo" (권장) |
- 그 외의 모델 확인 링크 : https://platform.openai.com/docs/models
질문 답변을 위한 도구(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
반응형