Gemma를 통해 비즈니스 이메일 AI 어시스턴트 빌드

이메일을 비롯한 고객 문의 처리는 많은 비즈니스를 운영하는 데 필요한 부분이지만, 빠르게 부담이 될 수 있습니다. 약간의 노력만 기울이면 Gemma와 같은 인공지능 (AI) 모델을 통해 이 작업을 더 쉽게 처리할 수 있습니다.

모든 비즈니스에서 이메일과 같은 문의를 처리하는 방식이 약간씩 다르므로 생성형 AI와 같은 기술을 비즈니스 요구사항에 맞게 조정할 수 있어야 합니다. 이 프로젝트는 빵집에 접수된 이메일에서 주문 정보를 추출하여 주문 처리 시스템에 빠르게 추가할 수 있도록 구조화된 데이터로 변환하는 특정 문제를 해결합니다. 문의와 원하는 출력의 예시를 10~20개 사용하여 고객의 이메일을 처리하고, 빠르게 응답하고, 기존 비즈니스 시스템과 통합하도록 Gemma 모델을 조정할 수 있습니다. 이 프로젝트는 비즈니스에서 Gemma 모델의 가치를 얻기 위해 확장하고 적용할 수 있는 AI 애플리케이션 패턴으로 빌드됩니다.

프로젝트 및 확장 방법에 관한 동영상 개요와 프로젝트를 빌드한 사용자의 통계를 확인하려면 비즈니스 이메일 AI 어시스턴트 Google AI로 빌드 동영상을 참고하세요. Gemma Cookbook 코드 저장소에서 이 프로젝트의 코드를 검토할 수도 있습니다. 그렇지 않은 경우 다음 안내에 따라 프로젝트를 확장하면 됩니다.

개요

이 튜토리얼에서는 Gemma, Python, Flask로 빌드된 비즈니스 이메일 어시스턴트 애플리케이션을 설정, 실행, 확장하는 방법을 안내합니다. 이 프로젝트는 필요에 맞게 수정할 수 있는 기본 웹 사용자 인터페이스를 제공합니다. 이 애플리케이션은 고객 이메일에서 가상의 빵집 구조로 데이터를 추출하도록 빌드되었습니다. 텍스트 입력과 텍스트 출력을 사용하는 모든 비즈니스 작업에 이 애플리케이션 패턴을 사용할 수 있습니다.

웹 앱 사용자 인터페이스 스크린샷

그림 1. 베이커리 이메일 문의를 처리하기 위한 프로젝트 사용자 인터페이스

하드웨어 요구사항

그래픽 처리 장치 (GPU) 또는 텐서 처리 장치 (TPU)가 있고 기존 모델과 조정 데이터를 저장할 수 있는 충분한 GPU 또는 TPU 메모리가 있는 컴퓨터에서 이 조정 프로세스를 실행합니다. 이 프로젝트에서 튜닝 구성을 실행하려면 GPU 메모리 약 16GB, 일반 RAM 약 16GB, 디스크 공간 최소 50GB가 필요합니다.

T4 GPU 런타임이 있는 Colab 환경을 사용하여 이 튜토리얼의 Gemma 모델 미세 조정 부분을 실행할 수 있습니다. Google Cloud VM 인스턴스에서 이 프로젝트를 빌드하는 경우 다음 요구사항에 따라 인스턴스를 구성합니다.

  • GPU 하드웨어: 이 프로젝트를 실행하려면 NVIDIA T4가 필요합니다 (NVIDIA L4 이상 권장).
  • 운영체제: Linux 딥 러닝 옵션, 특히 GPU 소프트웨어 드라이버가 사전 설치된 CUDA 12.3 M124가 포함된 Deep Learning VM을 선택합니다.
  • 부팅 디스크 크기: 데이터, 모델, 지원 소프트웨어를 위해 디스크 공간을 최소 50GB로 프로비저닝합니다.

프로젝트 설정

이 안내에서는 개발 및 테스트를 위해 이 프로젝트를 준비하는 방법을 설명합니다. 일반 설정 단계에는 필수 소프트웨어 설치, 코드 저장소에서 프로젝트 클론, 환경 변수 몇 개 설정, Python 라이브러리 설치, 웹 애플리케이션 테스트가 포함됩니다.

설치 및 구성

이 프로젝트에서는 Python 3과 가상 환경 (venv)을 사용하여 패키지를 관리하고 애플리케이션을 실행합니다. 다음 설치 안내는 Linux 호스트 머신용입니다.

필수 소프트웨어를 설치하려면 다음 단계를 따르세요.

  • Python 3와 Python용 venv 가상 환경 패키지를 설치합니다.

    sudo apt update
    sudo apt install git pip python3-venv
    

프로젝트 클론

개발 컴퓨터에 프로젝트 코드를 다운로드합니다. 프로젝트 소스 코드를 가져오려면 git 소스 제어 소프트웨어가 필요합니다.

프로젝트 코드를 다운로드하려면 다음 안내를 따르세요.

  1. 다음 명령어를 사용하여 Git 저장소를 클론합니다.

    git clone https://github.com/google-gemini/gemma-cookbook.git
    
  2. 선택적으로 스파스 체크아웃을 사용하도록 로컬 Git 저장소를 구성하여 프로젝트 파일만 포함할 수 있습니다.

    cd gemma-cookbook/
    git sparse-checkout set Demos/business-email-assistant/
    git sparse-checkout init --cone
    

Python 라이브러리 설치

Python 패키지 및 종속 항목을 관리하기 위해 활성화된 venv Python 가상 환경을 사용하여 Python 라이브러리를 설치합니다. pip 설치 프로그램을 사용하여 Python 라이브러리를 설치하기 전에 Python 가상 환경을 활성화해야 합니다. Python 가상 환경 사용에 대한 자세한 내용은 Python venv 문서를 참고하세요.

Python 라이브러리를 설치하려면 다음 단계를 따르세요.

  1. 터미널 창에서 business-email-assistant 디렉터리로 이동합니다.

    cd Demos/business-email-assistant/
    
  2. 이 프로젝트의 Python 가상 환경 (venv)을 구성하고 활성화합니다.

    python3 -m venv venv
    source venv/bin/activate
    
  3. setup_python 스크립트를 사용하여 이 프로젝트에 필요한 Python 라이브러리를 설치합니다.

    ./setup_python.sh
    

환경 변수 설정하기

이 프로젝트를 실행하려면 Kaggle 사용자 이름과 Kaggle API 토큰을 비롯한 몇 가지 환경 변수가 필요합니다. Gemma 모델을 다운로드하려면 Kaggle 계정이 있어야 하고 Gemma 모델에 대한 액세스를 요청해야 합니다. 이 프로젝트에서는 Kaggle 사용자 이름과 Kaggle API 토큰을 두 개의 .env 파일에 추가합니다. 이 파일은 각각 웹 애플리케이션과 튜닝 프로그램에서 읽습니다.

환경 변수를 설정하려면 다음 단계를 따르세요.

  1. Kaggle 문서의 안내에 따라 Kaggle 사용자 이름과 토큰 키를 가져옵니다.
  2. Gemma 설정 페이지의 Gemma 액세스 권한 얻기 안내에 따라 Gemma 모델에 대한 액세스 권한을 얻습니다.
  3. 프로젝트의 환경 변수 파일을 만듭니다. 프로젝트의 클론에서 다음 위치에 .env 텍스트 파일을 만듭니다.
    email-processing-webapp/.env
    model-tuning/.env
    
  4. .env 텍스트 파일을 만든 후 파일에 다음 설정을 추가합니다.

    KAGGLE_USERNAME=<YOUR_KAGGLE_USERNAME_HERE>
    KAGGLE_KEY=<YOUR_KAGGLE_KEY_HERE>
    

애플리케이션 실행 및 테스트

프로젝트의 설치 및 구성을 완료한 후 웹 애플리케이션을 실행하여 올바르게 구성했는지 확인합니다. 자체 용도로 프로젝트를 수정하기 전에 기준선 검사로 이 작업을 실행해야 합니다.

프로젝트를 실행하고 테스트하려면 다음 단계를 따르세요.

  1. 터미널 창에서 email-processing-webapp 디렉터리로 이동합니다.

    cd business-email-assistant/email-processing-webapp/
    
  2. run_app 스크립트를 사용하여 애플리케이션을 실행합니다.

    ./run_app.sh
    
  3. 웹 애플리케이션을 시작하면 프로그램 코드에 탐색하고 테스트할 수 있는 URL이 나열됩니다. 일반적으로 이 주소는 다음과 같습니다.

    http://127.0.0.1:5000/
    
  4. 웹 인터페이스에서 첫 번째 입력 필드 아래에 있는 데이터 가져오기 버튼을 눌러 모델에서 응답을 생성합니다.

애플리케이션을 실행한 후 모델의 첫 번째 대답은 첫 번째 생성 실행에서 초기화 단계를 완료해야 하므로 시간이 더 오래 걸립니다. 이미 실행 중인 웹 애플리케이션에 대한 후속 프롬프트 요청 및 생성은 더 짧은 시간에 완료됩니다.

애플리케이션 확장

애플리케이션이 실행되면 사용자 인터페이스와 비즈니스 로직을 수정하여 자신 또는 비즈니스와 관련된 작업에 맞게 작동하도록 확장할 수 있습니다. 앱이 생성형 AI 모델에 전송하는 프롬프트의 구성요소를 변경하여 애플리케이션 코드를 사용해 Gemma 모델의 동작을 수정할 수도 있습니다.

애플리케이션은 모델의 전체 프롬프트와 함께 사용자의 입력 데이터를 모델에 제공합니다. 이러한 안내를 수정하여 생성할 JSON의 파라미터 이름과 구조를 지정하는 등 모델의 동작을 변경할 수 있습니다. 모델의 동작을 변경하는 더 간단한 방법은 생성된 대답에 마크다운 형식이 포함되지 않도록 지정하는 등 모델의 대답에 대한 추가 안내를 제공하는 것입니다.

프롬프트 요청 사항을 수정하려면 다음 단계를 따르세요.

  1. 개발 프로젝트에서 business-email-assistant/email-processing-webapp/app.py 코드 파일을 엽니다.
  2. app.py 코드에서 get_prompt(): 함수에 추가 지침을 추가합니다.

    def get_prompt():
      return """
        Extract the relevant details of this request and return them in
        JSON code, with no additional markdown formatting:\n"""
    

이 예에서는 '추가 마크다운 서식 없이'라는 문구를 안내에 추가합니다.

프롬프트에 추가 안내를 제공하면 생성된 출력에 큰 영향을 미칠 수 있으며, 구현하는 데 훨씬 적은 노력이 필요합니다. 이 메서드를 먼저 시도하여 모델에서 원하는 동작을 얻을 수 있는지 확인해야 합니다. 하지만 프롬프트 명령어를 사용하여 Gemma 모델의 동작을 수정하는 데는 한계가 있습니다. 특히 Gemma 2의 경우 8,192개 토큰인 모델의 전체 입력 토큰 한도를 고려하여 이 한도를 넘지 않도록 자세한 프롬프트 안내와 제공하는 새 데이터의 크기 간에 균형을 맞춰야 합니다.

모델 조정

Gemma 모델을 세부 조정하는 것이 특정 작업에 대해 더 안정적으로 응답하도록 하는 데 권장되는 방법입니다. 특히 모델이 특정 구조의 JSON을 생성하도록 하려면(예: 구체적으로 명명된 매개변수 포함) 해당 동작에 맞게 모델을 조정하는 것이 좋습니다. 모델이 완료해야 하는 작업에 따라 10~20개의 예시로 기본 기능을 구현할 수 있습니다. 이 튜토리얼 섹션에서는 특정 작업을 위해 Gemma 모델에서 미세 조정을 설정하고 실행하는 방법을 설명합니다.

다음 안내에서는 VM 환경에서 미세 조정 작업을 실행하는 방법을 설명하지만 이 프로젝트의 연결된 Colab 노트북을 사용하여 이 조정 작업을 실행할 수도 있습니다.

하드웨어 요구사항

세부 조정의 컴퓨팅 요구사항은 프로젝트의 나머지 부분에 대한 하드웨어 요구사항과 동일합니다. 입력 토큰을 256개로, 배치 크기를 1로 제한하면 T4 GPU 런타임이 있는 Colab 환경에서 튜닝 작업을 실행할 수 있습니다.

데이터 준비

Gemma 모델을 조정하기 전에 조정 데이터를 준비해야 합니다. 특정 작업에 맞게 모델을 조정할 때는 요청 및 응답 예시가 필요합니다. 이러한 예에는 안내 없이 요청 텍스트와 예상되는 대답 텍스트가 표시되어야 합니다. 먼저 10개 정도의 예시가 포함된 데이터 세트를 준비해야 합니다. 이러한 예는 다양한 요청과 이상적인 대답을 나타내야 합니다. 요청과 대답이 반복되지 않도록 하세요. 모델의 대답이 반복되고 요청의 변형에 적절하게 조정되지 않을 수 있습니다. 구조화된 데이터 형식을 생성하도록 모델을 조정하는 경우 제공된 모든 대답이 원하는 데이터 출력 형식을 엄격하게 준수해야 합니다. 다음 표에는 이 코드 예의 데이터 세트에서 가져온 몇 가지 샘플 레코드가 나와 있습니다.

요청 응답
안녕하세요, Indian Bakery Central님.\n10개의 페다와 30개의 분디 라두를 가지고 계신가요? 바닐라 프로스팅과 초콜릿 맛 케이크도 판매하나요? 6인치 사이즈를 찾고 있어. { "type": "inquiry", "items": [ { "name": "pendas", "quantity": 10 }, { "name": "bundi ladoos", "quantity": 30 }, { "name": "cake", "filling": null, "frosting": "vanilla", "flavor": "chocolate", "size": "6 in" } ] }
Google 지도에서 귀하의 비즈니스를 확인했습니다. 젤라비와 굴랍 자문도 판매하나요? { "type": "inquiry", "items": [ { "name": "jellabi", "quantity": null }, { "name": "gulab jamun", "quantity": null } ] }

표 1. 베이커리 이메일 데이터 추출기의 조정 데이터 세트의 일부 목록입니다.

데이터 형식 및 로드

Python 코드로 레코드를 검색할 수 있는 한 데이터베이스 레코드, JSON 파일, CSV, 일반 텍스트 파일 등 원하는 형식으로 조정 데이터를 저장할 수 있습니다. 이 프로젝트는 data 디렉터리의 JSON 파일을 딕셔너리 객체의 배열로 읽습니다. 이 예시 튜닝 프로그램에서는 prepare_tuning_dataset() 함수를 사용하여 model-tuning/main.py 모듈에 튜닝 데이터 세트를 로드합니다.

def prepare_tuning_dataset():
    # collect data from JSON files
    prompt_data = read_json_files_to_dicts("./data")
    ...

앞서 언급한 바와 같이 연결된 응답으로 요청을 가져와 조정 레코드로 사용되는 텍스트 문자열로 어셈블할 수 있는 한 편리한 형식으로 데이터 세트를 저장할 수 있습니다.

튜닝 레코드 어셈블

실제 튜닝 프로세스에서 프로그램은 각 요청과 응답을 프롬프트 지침과 응답 콘텐츠가 포함된 단일 문자열로 어셈블합니다. 그런 다음 튜닝 프로그램은 모델에서 사용할 수 있도록 문자열을 토큰화합니다. 튜닝 레코드를 어셈블하는 코드는 model-tuning/main.py 모듈 prepare_tuning_dataset() 함수에서 확인할 수 있습니다.

def prepare_tuning_dataset():
    ...
    # prepare data for tuning
    tuning_dataset = []
    template = "{instruction}\n{response}"

    for prompt in prompt_data:
        tuning_dataset.append(template.format(instruction=prompt["prompt"],
                                              response=prompt["response"]))

    return tuning_dataset

이 함수는 데이터를 입력으로 사용하고 명령과 대답 사이에 줄바꿈을 추가하여 형식을 지정합니다.

모델 가중치 생성

튜닝 데이터가 준비되고 로드되면 튜닝 프로그램을 실행할 수 있습니다. 이 예시 애플리케이션의 조정 프로세스에서는 Keras NLP 라이브러리를 사용하여 Low Rank Adaptation(LoRA) 기법으로 모델을 조정하여 새로운 모델 가중치를 생성합니다. LoRA는 모델 가중치의 변경사항을 근사화하므로 전체 정밀도 조정에 비해 메모리 효율성이 훨씬 높습니다. 그런 다음 이러한 근사 가중치를 기존 모델 가중치에 오버레이하여 모델의 동작을 변경할 수 있습니다.

조정 실행을 실행하고 새 가중치를 계산하려면 다음 단계를 따르세요.

  1. 터미널 창에서 model-tuning/ 디렉터리로 이동합니다.

    cd business-email-assistant/model-tuning/
    
  2. tune_model 스크립트를 사용하여 조정 프로세스를 실행합니다.

    ./tune_model.sh
    

튜닝 프로세스는 사용 가능한 컴퓨팅 리소스에 따라 몇 분 정도 걸립니다. 성공적으로 완료되면 튜닝 프로그램은 다음 형식으로 model-tuning/weights 디렉터리에 새 *.h5 가중치 파일을 씁니다.

gemma2-2b_inquiry_tuned_4_epoch##.lora.h5

문제 해결

튜닝이 완료되지 않은 경우 다음 두 가지 이유가 있을 수 있습니다.

  • 메모리 부족 또는 리소스 소진: 이러한 오류는 튜닝 프로세스에서 사용 가능한 GPU 메모리 또는 CPU 메모리를 초과하는 메모리를 요청할 때 발생합니다. 튜닝 프로세스가 실행되는 동안 웹 애플리케이션을 실행하지 마세요. GPU 메모리가 16GB인 기기에서 조정하는 경우 token_limit256으로 설정되어 있고 batch_size1로 설정되어 있는지 확인합니다.
  • GPU 드라이버가 설치되지 않았거나 JAX와 호환되지 않음: 튜닝 프로세스에서는 컴퓨팅 기기에 JAX 라이브러리 버전과 호환되는 하드웨어 드라이버가 설치되어 있어야 합니다. 자세한 내용은 JAX 설치 문서를 참고하세요.

조정된 모델 배포

조정 프로세스는 조정 데이터와 조정 애플리케이션에 설정된 총 에포크 수를 기반으로 여러 가중치를 생성합니다. 기본적으로 튜닝 프로그램은 튜닝 에포크별로 하나씩 3개의 모델 가중치 파일을 생성합니다. 각 연속 튜닝 에포크는 튜닝 데이터의 결과를 더 정확하게 재현하는 가중치를 생성합니다. 다음과 같이 조정 프로세스의 터미널 출력에서 각 에포크의 정확도 비율을 확인할 수 있습니다.

...
8/8 ━━━━━━━━━━━━━━━━━━━━ 121s 195ms/step - loss: 0.5432 - sparse_categorical_accuracy: 0.5982
Epoch 2/3
8/8 ━━━━━━━━━━━━━━━━━━━━ 2s 194ms/step - loss: 0.3320 - sparse_categorical_accuracy: 0.6966
Epoch 3/3
8/8 ━━━━━━━━━━━━━━━━━━━━ 2s 192ms/step - loss: 0.2135 - sparse_categorical_accuracy: 0.7848

정확도 비율은 0.80 정도로 비교적 높아야 하지만, 비율이 너무 높거나 1.00에 매우 가까우면 가중치가 조정 데이터에 과적합되었음을 의미하므로 바람직하지 않습니다. 이 경우 모델은 조정 예시와 크게 다른 요청에 대해 제대로 작동하지 않습니다. 기본적으로 배포 스크립트는 에포크 3 가중치를 선택하며, 이 가중치의 정확도율은 일반적으로 0.80입니다.

생성된 가중치를 웹 애플리케이션에 배포하려면 다음 단계를 따르세요.

  1. 터미널 창에서 model-tuning 디렉터리로 이동합니다.

    cd business-email-assistant/model-tuning/
    
  2. deploy_weights 스크립트를 사용하여 조정 프로세스를 실행합니다.

    ./deploy_weights.sh
    

이 스크립트를 실행하면 email-processing-webapp/weights/ 디렉터리에 새 *.h5 파일이 표시됩니다.

새 모델 테스트

새 가중치를 애플리케이션에 배포했으면 새로 조정된 모델을 사용해 볼 차례입니다. 웹 애플리케이션을 다시 실행하고 응답을 생성하면 됩니다.

프로젝트를 실행하고 테스트하려면 다음 단계를 따르세요.

  1. 터미널 창에서 email-processing-webapp 디렉터리로 이동합니다.

    cd business-email-assistant/email-processing-webapp/
    
  2. run_app 스크립트를 사용하여 애플리케이션을 실행합니다.

    ./run_app.sh
    
  3. 웹 애플리케이션을 시작하면 프로그램 코드에 탐색하고 테스트할 수 있는 URL이 나열됩니다. 일반적으로 이 주소는 다음과 같습니다.

    http://127.0.0.1:5000/
    
  4. 웹 인터페이스에서 첫 번째 입력 필드 아래에 있는 데이터 가져오기 버튼을 눌러 모델에서 응답을 생성합니다.

이제 애플리케이션에서 Gemma 모델을 조정하고 배포했습니다. 애플리케이션을 실험하고 작업에 맞게 조정된 모델의 생성 기능 한도를 파악해 보세요. 모델이 제대로 작동하지 않는 시나리오가 있다면 요청을 추가하고 이상적인 대답을 제공하여 이러한 요청을 조정 예시 데이터 목록에 추가해 보세요. 그런 다음 튜닝 프로세스를 다시 실행하고, 새 가중치를 다시 배포하고, 출력을 테스트합니다.

추가 리소스

이 프로젝트에 대한 자세한 내용은 Gemma Cookbook 코드 저장소를 참고하세요. 애플리케이션 빌드에 도움이 필요하거나 다른 개발자와 공동작업하고 싶다면 Google Developers Community Discord 서버를 확인하세요. Google AI로 빌드 프로젝트에 관한 자세한 내용은 동영상 재생목록을 참고하세요.