■ ChatOllama 클래스를 사용해 PDF 문서를 요약하는 방법을 보여준다. (llama3.2:3b 모델)
▶ main.py
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 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 |
from langchain_community.document_loaders import PyPDFLoader from langchain.text_splitter import RecursiveCharacterTextSplitter from langchain_ollama import ChatOllama from langchain_core.prompts import PromptTemplate from langchain_core.output_parsers import StrOutputParser pyPDFLoader = PyPDFLoader("nke-10k-2023.pdf") documentList = pyPDFLoader.load() recursiveCharacterTextSplitter = RecursiveCharacterTextSplitter( chunk_size = 4096, chunk_overlap = 200, length_function = len, separators = ["\n\n", "\n", " ", ""] ) splitDocumentList = recursiveCharacterTextSplitter.split_documents(documentList) chatOllama = ChatOllama(model = "llama3.2:3b", temperature = 0) splitDocumentSummaryPromptTemplateString = """다음은 긴 문서의 한 섹션입니다. 이 섹션의 주요 내용을 최대한 자세하게 요약해주세요. 이 요약은 나중에 전체 문서의 최종 요약을 만드는 데 사용될 것입니다. 주의사항 : 1. 가능한 한 구체적인 정보, 숫자, 데이터를 포함해주세요. 2. 중요한 키워드나 전문 용어는 그대로 유지해주세요. 3. 문맥상 중요한 인과관계나 시간 순서를 유지해주세요. 4. 요약은 원문의 뉘앙스와 톤을 유지하면서 객관적이어야 합니다. 섹션 내용 : {text} 섹션 요약 :""" splitDocumentSummaryPromptTemplate = PromptTemplate.from_template(splitDocumentSummaryPromptTemplateString) splitDocumentSummaryRunnableSequence = {"text" : lambda x : x.page_content} | splitDocumentSummaryPromptTemplate | chatOllama | StrOutputParser() splitDocumentSummaryList = [] for splitDocument in splitDocumentList: splitDocumentSummary = splitDocumentSummaryRunnableSequence.invoke(splitDocument) splitDocumentSummaryList.append(splitDocumentSummary) summaryPromptTemplateString = """아래는 긴 문서의 여러 섹션에 대한 요약들입니다. 이 요약들을 바탕으로 전체 문서의 포괄적인 최종 요약을 작성해주세요. 주의사항: 1. 문서의 전체적인 구조와 흐름을 파악하여 논리적으로 연결해주세요. 2. 각 섹션의 핵심 내용들을 유기적으로 통합해주세요. 3. 중복되는 내용은 적절히 통합하고, 상충되는 내용은 맥락을 고려하여 조율해주세요. 4. 전체 문서의 주요 주장, 결론 또는 시사점을 명확히 드러내주세요. 5. 가능한 한 구체적인 정보와 예시를 포함해주세요. 섹션 요약들 : {summaries} 최종 요약 :""" summaryPromptTemplate = PromptTemplate.from_template(summaryPromptTemplateString) summaryRunnableSequence = summaryPromptTemplate | chatOllama | StrOutputParser() summary = summaryRunnableSequence.invoke({"summaries" : "\n\n".join(splitDocumentSummaryList)}) print("[개별 섹션 요약]") print("-" * 50) for index, splitDocumentSummary in enumerate(splitDocumentSummaryList, 1): print() print(f"섹션 {index} :") print() print(splitDocumentSummary) print("-" * 50) print() print("[최종 요약]") print("-" * 50) print(summary) print("-" * 50) print() """ [최종 요약] -------------------------------------------------- NIKE, Inc.는 미국의 스포츠 장비 및 의류 회사로, 주소가 오레곤주 베이베르트에 위치하고 있으며 공식 웹사이트는 www.nike.com입니다. NIKE, Inc.는 뉴욕 상장에서 'NKE'로 거래되는 independent company이며, PricewaterhouseCoopers LLP에 의해 audits가 수행되고 Computershare Trust Company, N.A.가 등록 및 전환을 관리합니다. 주식은 매년 4월 5일, 10월 5일, 1월 5일, 4월 5일의 일자에 분배됩니다. NIKE, Inc.는 세계에서 가장 큰 스포츠 장비 및 의류 회사 중 하나이며, 다양한 스포츠 장비와 의류를 판매합니다. NIKE, Inc.는 또한 European Headquarters가 Netherlands에 위치하고 있으며 Greater China Headquarters가 Shanghai, China에 위치하고 있습니다. NIKE, Inc.의 주요 내용은 다음과 같습니다: * 주소: 오레곤주 베이베르트 * 공식 웹사이트: www.nike.com * 상장 회사: 뉴욕 상장 (NKE) * audits: PricewaterhouseCoopers LLP * 등록 및 전환: Computershare Trust Company, N.A. * 주식 분배: 매년 4월 5일, 10월 5일, 1월 5일, 4월 5일의 일자 NIKE, Inc.는 세계에서 가장 큰 스포츠 장비 및 의류 회사 중 하나이며, 다양한 스포츠 장비와 의류를 판매합니다. -------------------------------------------------- """ |
▶ requirements.txt
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 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 |
aiohappyeyeballs==2.4.4 aiohttp==3.11.11 aiosignal==1.3.2 annotated-types==0.7.0 anyio==4.8.0 attrs==24.3.0 certifi==2024.12.14 charset-normalizer==3.4.1 dataclasses-json==0.6.7 frozenlist==1.5.0 greenlet==3.1.1 h11==0.14.0 httpcore==1.0.7 httpx==0.27.2 httpx-sse==0.4.0 idna==3.10 jsonpatch==1.33 jsonpointer==3.0.0 langchain==0.3.14 langchain-community==0.3.14 langchain-core==0.3.29 langchain-ollama==0.2.2 langchain-text-splitters==0.3.5 langsmith==0.2.10 marshmallow==3.25.1 multidict==6.1.0 mypy-extensions==1.0.0 numpy==2.2.1 ollama==0.4.6 orjson==3.10.14 packaging==24.2 propcache==0.2.1 pydantic==2.10.5 pydantic-settings==2.7.1 pydantic_core==2.27.2 pypdf==5.1.0 python-dotenv==1.0.1 PyYAML==6.0.2 requests==2.32.3 requests-toolbelt==1.0.0 sniffio==1.3.1 SQLAlchemy==2.0.37 tenacity==9.0.0 typing-inspect==0.9.0 typing_extensions==4.12.2 urllib3==2.3.0 yarl==1.18.3 |
※ pip install langchain langchain-community langchain-ollama pypdf 명령을 실행했다.