본문 바로가기
AI 언어 모델

Ollama와 대규모 언어 모델 Llama2-uncensored를 활용한 PDF 요약과 음성변환

by James AI Explorer 2024. 1. 13.
    728x90

    안녕하세요! 오늘은 대규모 언어 모델 활용도구인 Ollama를 활용해서 PDF의 내용을 요약하고 읽어주는 Llama2-unsensored(무검열) 모델을 만나보겠습니다. unsensored는 부적절한 내용이나 표현의 제한이 없는 모델을 가리킵니다. 예를 들면, "차를 어떻게 훔칠 수 있어?"라는 질문에 일반적인 언어 모델은 불법적이고 비윤리적인 정보를 제공할 수 없다고 응답하지만, 무검열 모델은 이러한 질문에도 제한 없이 답변할 수 있습니다. 이 블로그에서는 무검열 언어 모델을 이용한 텍스트 요약, PDF 파일처리 및 동적 페이지 범위설정, Text to Speech 라이브러리, gradio 웹 인터페이스 구축 등에 대해 알아보실 수 있습니다. 자, 같이 시작하실까요?

    Llama2-unsensored

    "이 포스팅은 쿠팡 파트너스 활동의 일환으로, 이에 따른 일정액의 수수료를 제공받습니다."

    프로젝트 개요 및 Uncensored

    이 프로젝트는 창작 프로젝트이며, 코드와 내용의 배포와 활용은 자유이지만, 출처 URL을 반드시 기재해 주시기 바랍니다. 이 코드는 Gradio를 사용하여 PDF 파일을 업로드하고 특정 페이지 범위의 텍스트를 추출한 후, Ollama에서 불러온 로컬 대규모 언어 모델, Llama2-unsensored로 해당 텍스트를 요약하고, 이를 음성으로 변환하여 제공하는 PDF to Text-to-Speech (TTS) 변환기능을 구현합니다. 

    PDF to Text-to-Speech(TTS) 변환 기능 실행화면

    이 프로젝트에서 사용한 언어 모델은 Meta와 Microsoft가 협력하여 만든 오픈소스 모델, Llama2의 unsensored 버전입니다. "Uncensored 모델"이란 데이터의 제한이나 선별 없이 훈련된 언어 모델을 나타냅니다. 이 모델들은 훈련 데이터에 대한 필터링이나 편향이 없이 학습되었기 때문에 특정한 주제나 윤리적인 제한에 따라 동작하지 않습니다.

     

    반면에, Uncensored가 아닌 모델들은 훈련 데이터나 제약 설정에 따라 특정한 주제나 행동을 방지하거나 강제하는 방식으로 "정렬(alignment)"됩니다. 다음은 Uncensored 모델에 대한 몇 가지 설명입니다:

    • 다양성과 개인 선택권: Uncensored 모델은 더 다양한 주제와 응용을 다룰 수 있습니다. 사용자는 모델이 주제나 내용에 대한 제한 없이 다양한 분야에서 사용될 수 있음을 선택할 수 있습니다.
    • 문화적 다양성 및 특정 그룹을 위한 모델: 일부 모델은 특정 문화, 정치적 성향, 종교 등에 특화된 정렬을 가지고 있습니다. 반면 Uncensored 모델은 특정 그룹이나 의견을 배제하지 않고 자유롭게 사용할 수 있습니다.
    • 탐구와 창작: 예술 작품, 소설, 연구, 궁금증 해결 등 다양한 목적을 위해 사용될 수 있습니다. Uncensored 모델은 작가가 원하는 내용을 자유롭게 표현할 수 있는 환경을 제공할 수 있습니다.
    • 소유권과 제어: 사용자는 자신의 컴퓨터에서 동작하는 모델에 대해 높은 소유권과 제어를 원합니다. Uncensored 모델은 사용자가 모델의 동작에 직접적인 영향을 미칠 수 있도록 해줍니다.
    • 조합 가능한 정렬: Uncensored 모델을 기반으로 하여 필요에 따라 원하는 정렬을 추가할 수 있습니다. 이는 다양한 사용 사례에 대한 커스터마이징이 가능하게 합니다.

    하지만 Uncensored 모델을 사용하는 것에 대한 논란도 있습니다. 무분별한 사용으로 인해 윤리적인 문제가 발생할 수 있고, 특히 안전하지 않은 내용이나 위험한 행동을 유도하는 데 사용될 수 있습니다. 이러한 모델의 사용은 신중하게 고려되어야 하며, 윤리적인 지침을 준수해야 합니다. 

     

    아래 화면은 "차를 훔치는 방법"에 대한 일반 Llama2 모델과 Uncensored 모델의 응답 차이를 보여줍니다. 

    차를 훔치는 방법에 대한 Llama2 모델의 응답
    차를 훔치는 방법에 대한 Llama2-unsensored 모델의 응답

     

     

     

     

    환경설정 및 종속성 설치

    다음은 환경설정 및 종속성 설치단계입니다. 이번 프로젝트는 대규모 언어 모델 활용도구인 Ollama의 사용을 위해 가상환경 생성과 활성화 모두 WSL(Windows Subsystem for Linux) 프롬프트에서 진행하였으며, WSL 프롬프트에서 가상환경 생성은 "python3.11 -m venv myenv", 활성화는 "source myenv/bin/activate" 명령어를 입력하면 됩니다. 

     

    종속성 설치는 아래에 텍스트 내용을 복사해서 원하는 폴더에 requirements.txt라는 이름으로 파일을 만든 다음 가상환경이 활성화된 WSL 프롬프트에서 "pip install -r requirements.txt" 명령어로 종속성을 설치해 줍니다. 

    PyPDF2==3.0.1
    gradio==4.14.0
    llama-index==0.9.30
    gTTS==2.5.0

     

    종속성 설치에 포함된 각 라이브러리에 대한 간단한 설명은 다음과 같습니다:

    • PyPDF2 (버전 3.0.1): `PyPDF2`는 Python에서 PDF 파일을 다루기 위한 라이브러리입니다. 주로 PDF 파일에서 텍스트 추출, 페이지 회전, 병합, 분할 등 다양한 작업을 수행할 수 있습니다.
    • Gradio (버전 4.14.0): `Gradio`는 간단하게 모델을 웹 인터페이스로 래핑할 수 있는 라이브러리로, 모델의 입출력을 쉽게 시각화하고 상호 작용할 수 있게 해 줍니다. 머신러닝 모델, 텍스트 처리, 이미지 처리 등 다양한 응용 분야에서 사용될 수 있습니다.
    • Llama-index: 벡터 인덱싱과 관련된 라이브러리로, 정보 검색 및 질의 처리를 위해 주로 사용됩니다. 대규모 언어 모델과의 통합, 벡터 인덱싱, 쿼리 엔진 등을 포함하여 텍스트 데이터에 대한 효율적인 검색과 분석을 지원합니다.
    • gTTS (버전 2.5.0): `gTTS`는 Google Text-to-Speech의 Python 래퍼 라이브러리로, 텍스트를 음성으로 변환하는 기능을 제공합니다. 사용자가 지정한 텍스트를 음성으로 변환하여 오디오 파일로 저장하거나 스트리밍 할 수 있습니다.

    Llama2-uncensored 모델을 다운로드하기 위해서는 Ollama가 설치된 WSL 프롬프트 상에서 "Ollama run llama2-uncensored" 명령어를 실행하면 자동으로 아래 화면과 같이 다운로드됩니다.

    Llama2-uncensored 모델 다운로드

    대규모 언어 모델 활용도구 Ollama의 설치방법은 아래 링크를 참고하시기 바랍니다. 

    2023.12.15 - [대규모 언어모델] - Ollama를 활용한 대규모 언어 모델 웹 인터페이스 만들기: Mistral 7B와의 대화

     

    Ollama를 활용한 대규모 언어 모델 웹 인터페이스 만들기: Mistral 7B와의 대화

    안녕하세요. 오늘은 내 컴퓨터에서 웹 인터페이스로 최신 언어모델과 대화하는 프로젝트에 도전해 보겠습니다. 이 블로그에서는 Ollama라는 오픈소스 도구를 이용해서 최신 인기 대규모 언어모

    fornewchallenge.tistory.com

    728x90

    파이썬 코드 실행

    다음은 코드 실행단계입니다. 코드를 실행하기 전 WSL 프롬프트 상에서 "ollama serve" 명령어를 입력하여 ollama를 기동 합니다. http://127.0.0.1:11434의 주소에서 ollama가 실행되고 있는지 확인합니다. 

    다음은 코드의 동작순서입니다. 

    • 1. 라이브러리 임포트 및 초기화: 필요한 라이브러리들을 임포트 하고, Ollama 모델을 초기화합니다. 컴퓨터 사양이 낮은 경우 반드시 "request_timeout=3600"와 같이 타임아웃 설정을 해야 합니다. 
    • 2. 텍스트 요약 함수: `summarize_text` 함수는 Ollama에서 불러온 Llama2-unsensored 언어 모델을 사용하여 주어진 텍스트를 요약합니다. 디버깅을 위한 언어 모델의 요약 텍스트 출력 문장이 포함됩니다. 
    • 3. PDF 읽기 및 처리 함수: `read_pdf` 함수는 업로드된 PDF 파일에서 특정 페이지 범위의 텍스트를 추출합니다. 추출된 텍스트는 Llama2-unsensored 모델을 통해 요약되고, 해당 요약은 gTTS를 사용하여 음성으로 변환됩니다. 생성된 음성 파일은 임시 WAV 파일로 저장되며, 그 내용은 이후에 읽혀지고 파일은 삭제됩니다.
    • 4. Gradio 인터페이스 생성: `gr.Interface`를 사용하여 간단한 웹 인터페이스를 생성합니다. 사용자는 PDF 파일을 업로드하고 특정 페이지 또는 범위를 지정할 수 있습니다.
    • 5. 페이지 범위 동적 설정: `@iface.postprocess` 데코레이터를 사용한 후처리 함수이며, PDF 파일이 업로드될 때 페이지의 최대값을 동적으로 설정합니다.
    • 6. 인터페이스 실행: `iface.launch(share=False)`를 사용하여 Gradio 인터페이스를 실행합니다. 사용자는 웹 인터페이스를 통해 PDF 파일을 업로드하고 페이지 범위를 설정한 후, 요약된 텍스트와 해당 텍스트의 음성 파일을 얻을 수 있습니다. 페이지 범위는 단일 페이지 또는 "start-end" 형식으로 입력할 수 있습니다. 
    from PyPDF2 import PdfReader
    import gradio as gr
    from gtts import gTTS
    import tempfile
    from llama_index.llms import Ollama
    import os
    
    # Initialize Ollama model
    llm = Ollama(model="llama2-uncensored", request_timeout=3600)
    
    def summarize_text(text):
        # Ollama를 사용하여 텍스트 요약 생성
        response = llm.complete(text, "Summarize this text in one sentence.")
        print("Ollama 응답:", response)  # 디버깅을 위한 출력 문장
    
        summary = str(response)  # Convert the response object to a string
    
        return summary
    
    def read_pdf(file, page_range):
        # Validate page range
        try:
            # Try to split the range by '-'
            start_page, end_page = map(int, page_range.split('-'))
        except ValueError:
            # If the split fails, try to interpret it as a single page
            try:
                start_page = int(page_range)
                end_page = start_page
            except ValueError:
                return ("Invalid page range. Please enter a valid range or a single page number.", None)
    
        # Validate start and end pages
        if start_page < 1 or end_page < start_page:
            return ("Invalid page range. Please enter a valid range or a single page number.", None)
    
        with open(file.name, "rb") as pdf_file:
            pdf_reader = PdfReader(pdf_file)
            num_pages = len(pdf_reader.pages)
    
            # Set the maximum page number dynamically
            max_page_number = num_pages if num_pages > 0 else 1
    
            # Check if the page range is within the valid range
            if end_page > max_page_number:
                return ("Invalid page range. End page exceeds the total number of pages.", None)
    
            # Extract text for the specified pages
            text = ""
            for page_number in range(start_page, end_page + 1):
                page = pdf_reader.pages[page_number - 1]
                text += page.extract_text()
    
            # Get the summary of the text
            summary = summarize_text(text)
            print("Summary:", summary)  # 디버깅을 위한 출력 문장
    
            # Save the speech as a temporary WAV file
            temp_wav_file = tempfile.NamedTemporaryFile(suffix=".wav", delete=False)
            speech = gTTS(text=summary, lang='en')
            speech.save(temp_wav_file.name)
    
            # Read the contents of the temporary WAV file
            wav_data = temp_wav_file.read()
    
            # Close and remove the temporary WAV file
            temp_wav_file.close()
            os.remove(temp_wav_file.name)
    
            # Return the summary and audio data as bytes
            return (summary, wav_data)
    
    # Create the Gradio interface
    page_range_textbox = gr.Textbox(label="Page Range", value="5-6")  # Set default value here
    iface = gr.Interface(fn=read_pdf,
                         inputs=[gr.File(label="Upload PDF"), page_range_textbox],
                         outputs=["text", "audio"],
                         title="PDF to Text-to-Speech Converter")
    
    # Set the maximum page number dynamically based on the uploaded PDF
    @iface.postprocess
    def set_max_page_number(pdf_file):
        with open(pdf_file.name, "rb") as file:
            pdf_reader = PdfReader(file)
            num_pages = len(pdf_reader.pages)
            iface.max = num_pages if num_pages > 0 else 1
    
    # Launch the interface
    iface.launch(share=False)

     

    다음 화면은 코드를 실행하고, Trust LLM 관련 논문을 업로드 하여 내용을 요약한 결과입니다. 요약한 결과는 Text to Speech 라이브러리를 통해 음성 파일로 변환되어 재생할 수 있으며, wave 파일 형태로 다운로드할 수 있습니다. 

    PDF to Text-to-Speech(TTS) 변환 기능 실행화면

    이 TRUST LLM 프레임워크는 신뢰성을 판단하기 위해 여덟 가지 핵심 측면에 대한 철저한 분석을 제공하도록
    설계되었습니다. 이러한 측면에는 진실성, 안전성, 공정성, 견고성, 개인 정보 보호, 기계 윤리, 투명성 및
    책임성이 포함됩니다. 이러한 차원을 평가하기 위해 우리는 철저하고 다양한 모델을 조사했습니다. 
    TRUST LLM 프레임워크는 다양한 작업 및 데이터셋에서 LLMs의 신뢰성을 철저하게 평가하기 위해 설계되었습니다. 
    우리는 30개의 데이터셋을 벤치마킹하여 LLMs의 기능적 능력을 포괄적으로 평가했는데, 이는 단순한 분류부터 
    복잡한 생성 작업까지 다양한 작업을 포함합니다. 다양한 평가 메트릭을 사용하여 LLMs의 능력을 이해하는 데 
    사용되었습니다.

    https://fornewchallenge.tistory.com/

    "이 포스팅은 쿠팡 파트너스 활동의 일환으로, 이에 따른 일정액의 수수료를 제공받습니다."

    마치며

    이번 프로젝트에서 우리는 PDF 문서의 효율적인 처리와 무검열 언어 모델의 활용을 통해 텍스트 요약 및 음성 변환 기능을 구현했습니다. Llama2-uncensored 모델은 다양한 용도로 사용할 수 있으며, Gradio와의 통합을 통해 사용자가 손쉽게 이 기능을 활용할 수 있습니다. 이 프로젝트는 Gradio 라이브러리를 활용하여 간편한 웹 인터페이스를 제공하며, PDF 파일의 동적 페이지 범위 설정과 음성 변환을 통해 빠르고 편리한 문서내용 파악을 가능하게 합니다.

     

    Uncensored 모델의 활용은 다양한 창작, 연구, 및 개인적인 호기심을 만족시키며, 사용자는 프로젝트의 코드와 결과물을 토대로 자신만의 응용 프로그램을 개발하거나 추가 기능을 구현할 수 있습니다. 이 프로젝트에서 살펴본 도구와 기술은 다양한 분야에서의 새로운 기회와 창의적인 가능성을 열어줄 수 있을 것으로 보입니다. 여러분도 이 코드와 아이디어를 기반으로 자신만의 프로젝트를 만들어 보시면 어떨까요? 그럼 저는 다음 시간에 더 유익한 정보를 가지고 다시 찾아뵙겠습니다. 감사합니다!

     

    2023.12.30 - [대규모 언어모델] - 허깅페이스 1위 Solar 10.7B와 Autogen으로 대화하기 : feat. Mistral 7B

     

    허깅페이스 1위 Solar 10.7B와 Autogen으로 대화하기 : feat. Mistral 7B

    안녕하세요! 오늘은 허깅페이스의 오픈소스 LLM 리더보드에서 당당하게 1위를 차지하고 있는 우리나라 스타트업 "업스테이지"의 대규모 언어 모델 "Solar"와 대화를 해보겠습니다. 이번 프로젝트

    fornewchallenge.tistory.com

     

    728x90