[LangChain] MonaiGPT - Medical Imaging Chatbot 을 만들어볼까? - 1

반응형

Project Plan - Introduction

Pytorch 기반 의료 영상 프레임워크인 MONAI의 공식 문서와 LLM 기술을 쉽게 다룰 수 있는 모듈인 LangChain을 결합한 MonaiGPT를 만들어 볼 것입니다. 이 프로젝트에서는 Langchain의 역할과 ChromaDB를 사용하는 방법에 대해서 배울 수 있습니다.
또한 Streamlit을 활용하여 web에서 MonaiGPT를 구동하고 배포합니다.

Medical imaging에 관심이 많다면 MONAI의 프레임워크를 자주 사용할 것입니다.
Monai뿐만 아니라 다른 웹사이트들의 문서들을 pdf로 변환하여 데이터베이스에 적재하고 chatbot으로 개발할 수 있습니다.

What is Monai ?

Unknown

MONAI는 파이토치 기반 의료 영상 처리 오픈소스 프레임워크입니다. 아래와 같은 기능을 수행할 수 있습니다.
의료 영상을 전처리 및 데이터 증강 ( Preprocessing & data augmentation ) 하는 기능 역시 포함합니다.

*2D classification - 2D Segmentation - 3D Classification - 3D Segmentation *

Screenshot 2023-09-11 at 14 11 30Screenshot 2023-09-11 at 14 12 48

MONAI의 공식 문서 웹사이트를 가보면 MONAI-Labels , MONAI-Core, MONAI-Deploy 3가지로 나뉩니다.

MONAI-Labels는 우리가 가지고 있는 data를 라벨링할 때 사용됩니다.
MONAI-Core에서는 전처리, 모델 학습, 모델 테스트 등의 기능을 포함합니다.
MONAI-Deploy는 말그대로 모델을 배포하는데 필요한 기능입니다.

ChatGPT

이 프로젝트에서는 ChatGPT의 API를 활용하지만 그대로 사용하지 않습니다. 왜냐하면 ChatGPT는 2021년 이전의 내용만 포함하고 있습니다.

BeautifulSoup 모듈을 활용하여 웹에서 긁어온 정보와 Pdf,ppt,Txt,Doc 등에서 추출한 HTML 페이지나 문서를
LangChain 코드에 통과시키고 Chroma DB에 문서에 포함된 텍스트만 저장합니다.

구동방식

Screenshot 2023-09-11 at 14 23 33

Requirements.txt

streamlit
streamlit-chat==0.0.2.2
urllib3==1.26.15
PyYAML==6.0
regex==2023.5.5
langchain==0.0.161
chromadb==0.3.21
openai==0.27.6
pypdf==3.8.1
requests==2.29.0
tiktoken==0.4.0
unstructured==0.6.3
pytesseract==0.3.10

data_collections.py 코드

import requests
from bs4 import BeautifulSoup
import json
from reportlab.lib.pagesizes import letter, landscape
from reportlab.lib import colors
from reportlab.platypus import SimpleDocTemplate, Paragraph, Spacer
from reportlab.lib.styles import getSampleStyleSheet, ParagraphStyle

def scrape_website(url):
    response = requests.get(url)
    if response.status_code != 200:
        raise ValueError(f'Failed to fetch the URL {url}')

    soup = BeautifulSoup(response.content, 'html.parser')
    headers = soup.find_all(['h1', 'h2', 'h3'])

    documentation = {}
    for header in headers:
        content = []
        sibling = header.find_next(['h1', 'h2', 'h3', 'p'])
        while sibling and sibling.name == 'p':
            content.append(sibling.get_text())
            sibling = sibling.find_next(['h1', 'h2', 'h3', 'p'])
        if content:
            documentation[header.get_text()] = ' '.join(content)

    return documentation

def save_to_json(documentation, file_name):
    with open(file_name, 'w') as json_file:
        json.dump(documentation, json_file, ensure_ascii=False, indent=2)

def save_to_text(documentation, file_name):
    with open(file_name, 'w', encoding='utf-8') as text_file:
        for title, content in documentation.items():
            text_file.write(f'{title}\n')
            text_file.write(f'{content}\n\n')

def save_to_pdf(documentation, file_name):
    doc = SimpleDocTemplate(file_name, pagesize=letter)
    styles = getSampleStyleSheet()
    elements = []

    for title, content in documentation.items():
        title_style = ParagraphStyle(name="TitleStyle", fontSize=14, textColor=colors.blue, spaceAfter=12)
        content_style = ParagraphStyle(name="ContentStyle", fontSize=12, textColor=colors.black, spaceAfter=12)

        title_para = Paragraph(title, style=title_style)
        content_para = Paragraph(content, style=content_style)

        elements.append(title_para)
        elements.append(content_para)
        elements.append(Spacer(1, 12))

    doc.build(elements)


if __name__ == '__main__':
    url = 'https://docs.monai.io/en/stable/utils.html'
    try:
        documentation = scrape_website(url)
        save_to_pdf(documentation, 'data/monai_utils.pdf')
        # save_to_text(documentation, 'interview_documentation.txt')
        # save_to_json(documentation, 'documentation.json')
        print('Documentation successfully saved to documentation')
    except Exception as e:
        print(f'Error: {e}')

이 코드는 웹 스크레이핑을 사용하여 특정 웹페이지의 콘텐츠를 가져와서 PDF, 텍스트, JSON 형식으로 저장하는 작업을 수행합니다. 코드를 주요 부분별로 나누어 설명하겠습니다:

  1. 라이브러리 임포트:
    • requests: 웹 페이지의 내용을 가져오기 위한 라이브러리입니다.
    • BeautifulSoup: 웹 페이지의 HTML 콘텐츠를 파싱하고 조작하기 위한 라이브러리입니다.
    • json: JSON 형식의 데이터를 읽고 쓰기 위한 라이브러리입니다.
    • reportlab: PDF 파일을 생성하기 위한 라이브러리입니다.
  2. scrape_website(url) 함수:
    • 주어진 URL의 웹페이지를 스크레이핑하여, h1, h2, h3 태그로 시작하는 섹션의 제목과 그 다음에 오는 문단(p 태그)들을 수집합니다.
    • 결과는 제목을 키로, 연관된 내용을 값으로 하는 딕셔너리 형태로 반환됩니다.
  3. save_to_json(documentation, file_name) 함수:
    • 주어진 딕셔너리(documentation)를 JSON 형식의 파일로 저장합니다.
  4. save_to_text(documentation, file_name) 함수:
    • 주어진 딕셔너리(documentation)를 텍스트 파일로 저장합니다. 각 섹션 제목 아래에 해당 내용이 오도록 저장됩니다.
  5. save_to_pdf(documentation, file_name) 함수:
    • 주어진 딕셔너리(documentation)를 PDF 파일로 저장합니다. PDF에는 파란색으로 표시된 제목과 그 아래에 일반 텍스트로 표시된 내용이 포함됩니다.
  6. 메인 실행 부분 (if name == 'main':):
    • 'https://docs.monai.io/en/stable/utils.html'라는 URL을 지정하여 해당 웹페이지의 내용을 스크레이핑합니다.
    • 스크레이핑된 내용은 'data/monai_utils.pdf'라는 이름의 PDF 파일로 저장됩니다.
    • 코드에는 JSON 및 텍스트로의 저장 코드도 있지만, 현재 주석 처리되어 있어 실행되지 않습니다.
    • 스크레이핑 및 파일 저장이 성공적으로 완료되면, 'Documentation successfully saved to documentation'이라는 메시지가 출력됩니다. 만약 오류가 발생하면 해당 오류 메시지가 출력됩니다.

이 코드는 주어진 URL의 웹 페이지 내용을 가져와서 필요한 정보를 추출하고, 그 정보를 다양한 형식의 파일로 저장하는 기능을 제공합니다.

위의 코드를 실행하면 ./data 폴더에 아래와 같이 pdf 파일들이 저장됩니다.

Screenshot 2023-09-11 at 14 46 19

다음 포스팅에서는 Database를 만들고 Chatgpt, Langchain 코드에 대해서 리뷰하겠습니다. :)

반응형