이전 내용
챗GPT 문서 요약 프롬프트 제작
챗GPT를 이용해서 불러온 내용을 요약하는 프롬프트를 제작해 본다.
프롬프트를 제작하기 전에 앞서, 랭체인(Langchain)과 pypdf 라이브러리 설치가 필요하다.
[랭체인 설치]
[pypdf 라이브러리 설치]
필자의 경우, 차은우 비주얼 관련 나무위키 글을 PDF로 저장한 뒤, 이를 요약하는 챗GPT 프로그램을 만들어 보려 한다.
아래는 그 글의 일부 내용이다.
import os
import openai
# 환경변수에서 OpenAI API 키를 읽어옴.
openai_api_key = os.getenv('OPENAI_API_KEY')
# API 키가 환경변수에 설정되어 있는지 확인.
if not openai_api_key:
raise ValueError("환경변수 'OPENAI_API_KEY'가 설정되지 않았습니다.")
# OpenAI API 키를 설정.
openai.api_key = openai_api_key
# OpenAI 클라이언트를 생성.
client = openai.OpenAI()
from langchain.document_loaders import PyPDFLoader
def pdf_loader(pdf_path):
loader=PyPDFLoader(pdf_path)
pdf_doc=loader.load()
return pdf_doc
pdf_path = "C:/Users/niceq/Desktop/차은우_비주얼_나무위키.pdf"
pages_content = pdf_loader(pdf_path)[0].page_content # 첫 번째 페이지
system_ai_en = """ You are an artificial intelligence assistance, and you should be able to respond to various topics such as reading PDFs,
summarizing documents, managing schedules, providing weather information, searching for the shortest route, and conducting web searches.
Please respond briefly in Korean."""
prompt = """다음은 문서 중 일부 내용입니다.
{pages_content}
이 문서의 주요 내용을 요약해 주세요.
답변:"""
completion = client.chat.completions.create(
model="gpt-3.5-turbo-1106",
messages=[
{"role": "system", "content": system_ai_en},
{"role": "user", "content": prompt.format(pages_content=pages_content)},
]
)
print(completion.choices[0].message.content)
- PDF 파일을 읽기 위해 랭체인의 PyPDFLoader 모듈을 불러온다.
- Load 했을 때는 페이지 별로 내용이 들어가 있으므로 첫 번째 페이지만 요약한다.
- system 프롬프트를 영어로 설정하여 속도가 좀 더 빠르게 한다.
- 문서 내용 요약을 요청하는 프롬프트를 기본 설정하여 PDF 파일의 내용을 추가했을 때 요약해 달라는 프롬프트를 적용할 수 있도록 작성한다.
랭체인을 활용한 문서 요약
랭체인을 활용한 문서 요약 방식에는 StuffDocumentsChain 방식과 MapReduceDocumentsChain 방식이 있다.
- StuffDocumentsChain: 짧고 중간 길이의 문서들을 전체 맥락 속에서 요약하고자 할 때 유용.
- MapReduceDocumentsChain: 길거나 많은 문서를 분산 처리하고, 개별 요약본들을 결합하여 요약할 때 유용.
StuffDocumentsChain 방식
- 정의: StuffDocumentsChain 방식은 여러 문서를 하나의 덩어리로 합쳐서 요약하는 방식이다. 모든 문서를 한 번에 처리하여 전체 요약본을 생성하는 과정이다.
- 작동 방식: 문서들을 하나의 대규모 텍스트 덩어리로 결합하고, 이 결합된 텍스트를 입력으로 사용하여 요약한다.
- 장점:
- 문서 간의 맥락을 유지하며 요약할 수 있다.
- 단일 요약본을 생성하므로 결과가 간결하다.
- 단점:
- 문서가 길거나 너무 많은 경우 메모리 및 성능 문제가 발생할 수 있다.
- 텍스트가 너무 길어 모델이 한 번에 처리하기 어려울 수 있다.
- 사용 사례: 짧고 중간 길이의 문서들에 적합하다. (예: 몇 개의 관련 뉴스 기사 요약, 몇 편의 단편 논문 요약)
MapReduceDocumentsChain 방식
- 정의: MapReduceDocumentsChain 방식은 MapReduce 알고리즘을 차용한 방식으로, 문서를 먼저 개별적으로 요약한 후, 이 요약본들을 다시 종합하여 최종 요약본을 생성하는 방식이다.
- 작동 방식: 각 문서를 개별적으로 요약하는 Mapping 단계. 개별 요약본들을 결합하여 다시 요약하는 Reducing 단계
- 장점:
- 각 문서를 따로 요약하기 때문에 메모리 사용량이 적다.
- 처리 속도 및 성능이 향상될 수 있다.
- 분산 처리에 적합하여 대규모 문서를 다룰 수 있다.
- 단점:
- 문서 간의 전체적인 맥락을 파악하기 어려울 수 있다.
- 개별 요약본들의 결합 과정에서 중요한 정보가 누락될 가능성이 있다.
- 사용 사례: 아주 길거나 다수의 문서를 요약할 때 유용하다. (예: 대량의 학술 논문, 대규모 데이터베이스 또는 여러 장의 도서 내용 요약)
여기서는 이 두 가지 방법을 모두 활용하여 문서 요약을 진행해 본다.
◆ 문서 내용 로드
PDF로 되어 있는 문서 내용을 로드하면 각 문서가 페이지 번호와 페이지 내용을 포함한 내용을 얻게 된다.
우선 가장 첫 번째 페이지 내용을 읽어 들여와 일부분만 출력해 본다.
import os
import openai
# 환경변수에서 OpenAI API 키를 읽어옴.
openai_api_key = os.getenv('OPENAI_API_KEY')
# API 키가 환경변수에 설정되어 있는지 확인.
if not openai_api_key:
raise ValueError("환경변수 'OPENAI_API_KEY'가 설정되지 않았습니다.")
# OpenAI API 키를 설정.
openai.api_key = openai_api_key
# OpenAI 클라이언트를 생성.
client = openai.OpenAI()
from langchain.document_loaders import PyPDFLoader
def pdf_loader(pdf_path):
loader=PyPDFLoader(pdf_path)
pdf_doc=loader.load()
return pdf_doc
pdf_path = "C:/Users/niceq/Desktop/차은우_비주얼_나무위키.pdf"
pages_content = pdf_loader(pdf_path)
print(pages_content[0].page_content[:200])
◆ 문서 내용 분할
문서 내용이 길 경우, 문서 전체 내용을 넣을 수 없기 때문에 각각의 문서를 분할하는 작업을 진행해야 한다. 문서 분할은 RecursiveCharacterTextSplitter를 이용해서 2,000개 정도의 chunk_size로 분할하여 진행해 본다.
from langchain.text_splitter import RecursiveCharacterTextSplitter
# 스플리터 설정
text_splitter = RecursiveCharacterTextSplitter.from_tiktoken_encoder(
chunk_size=2000,
chunk_overlap=0,
)
# pages_content 내용 분할
split_docs = text_splitter.split_documents(pages_content)
# 분할된 문서의 수 확인
print("분할된 문서의 개수는: ", len(split_docs))
◆ 분할 내용 각각 요약 실행
현재 분할된 문서는 4개로, 이 분할된 문서를 각각 요약해야 한다. 이렇게 분할된 문서를 요약하는 과정을 map이라 하고, 요약본을 통합하는 과정을 reduce 라고 한다.
우선 map 과정의 문서 요약 코드를 작성해 본다.
프롬프트를 설정하여 각각의 map 과정에서 사용될 템플릿을 설정하고, 문서 내용이 길 수 있기 때문에 gpt-3.5-turbo-0125로 설정하여 진행한다.
## 각각의 문서에 대한 요약 실행
from langchain.prompts import PromptTemplate
from langchain.chat_models import ChatOpenAI
from langchain.chains import LLMChain
# map template 설정, {pages_content} 분할된 내용이 입력
map_template = """ 다음은 문서 중 일부 내용입니다.
{pages_content}
이 문서의 주요 내용을 입력해 주세요.
"""
# map 기본 프롬프트
map_prompt = PromptTemplate.from_template(map_template)
# 문서 내용이 길 수 있으므로 model을 gpt-3.5-turbo-0125 설정
llm = ChatOpenAI(temperature=0,
model_name='gpt-3.5-turbo-0125')
map_chain = LLMChain(llm=llm, prompt=map_prompt)
# reduce 단계에서 처리할 프롬프트 정의
reduce_template = """ 다음은 문서 요약의 집합입니다.
{summaries}
이 내용을 바탕으로 통합된 문서 요약을 작성해 주세요.
"""
# Reduce 프롬프트
reduce_prompt = PromptTemplate.from_template(reduce_template)
# Reduce에서 수행할 LLMChain 정의
reduce_chain = LLMChain(llm=llm, prompt=reduce_prompt)
◆ 각 문서의 요약본 통합 실행
위에서 작성된 각각의 map_chain을 통합하는 reduce 과정이 필요하다. 통합할 때 역시 템플릿을 통해 프롬프트를 정의할 수 있다.
from langchain.chains.combine_documents.stuff import StuffDocumentsChain
from langchain.chains import ReduceDocumentsChain
# 문서 목록 통합 체인 설정
combine_doc_chain = StuffDocumentsChain(
llm_chain=reduce_chain,
document_variable_name="summaries" # reduce 프롬프트에 대입되는 변수
)
# 분할된 문서를 순차적으로 reduce 처리
reduce_doc_chain = ReduceDocumentsChain(
combine_documents_chain=combine_doc_chain,
collapse_documents_chain=combine_doc_chain,
token_max=4000,
)
◆ 최종 결과 통합 체인 생성
마지막 통합 과정에서는 정의한 map 체인과 reduce 체인을 연결하고 최종적으로 MapReduceDocumentsChain을 통해 각각의 객체를 통합할 수 있다.
from langchain.chains import MapReduceDocumentsChain
# 최종 체인 연결
final_chain=MapReduceDocumentsChain(
llm_chain=map_chain, # 각 문서 맵핑
reduce_documents_chain=reduce_doc_chain,
document_variable_name="pages_content",
return_intermediate_steps=False,
)
# 최종 결과 실행
result_summary=final_chain.run(split_docs)
# 요약 결과 출력
print(result_summary)
- llm_chain=map_chain 에는 이전에 정의해 놓은 map 체인을 설정해야 한다.
- reduce_documents_chain=reduce_doc_chain에는 통합된 reduce 체인을 지정하여야 한다.
- document_variable_name="pages_content" 는 각각의 분할된 문서명의 이름을 지정한 결과를 지정한다.
- result_summary=final_chain.run(split_docs)가 완성된 통합 체인을 실행하게 되면 최종 요약 결과를 얻을 수 있다.
다음 내용
[출처]
Hey, 파이썬! 생성형 AI 활용 앱 만들어줘
OpenAI 홈페이지
StackOverFlow
Langchain 홈페이지
'[파이썬 Projects] > <파이썬 Gen AI, LLM>' 카테고리의 다른 글
[Gen AI] 그라디오로 두 번째 챗봇 제작하기-2 (1) | 2024.12.21 |
---|---|
[Gen AI] 그라디오로 두 번째 챗봇 제작하기-1 (1) | 2024.12.20 |
[Gen AI] 음성 변환 기술 구현해보기(STT, TTS) (1) | 2024.12.19 |
[Gen AI] 그라디오 챗봇 업그레이드 (2) | 2024.12.19 |
[Gen AI] 랭체인을 활용한 챗봇 업그레이드 - 3 (2) | 2024.12.13 |