본문 바로가기

Data Engineering/Cloud

[AWS] Lambda를 통해 Open Ai Api 호출하여 시각화 결과 저장

Open ai API 발급

open ai prompt를 사용하기 위해 open ai에 회원가입 후 api 키를 발급받는다.

 

Lambda Layer

 

람다에서 open ai api를 호출하려면 oepn ai python 패키지를 라이브러리 형태로 람다 layer(라이브러리 집어넣는 장소)에 넣어줘야 한다. 

ec2 하나 열어서 openai 라이브러리를 설치한다음 라이브러리를 압축한 상태인 zip 형태로 layer에 넣어준다

pip install openai --target <경로>

 

Lambda layer

 

Open ai api 호출 함수

 

시크릿 키를 안전하게 환경변수에 저장한 후 람다 콘솔로 돌아와 함수를 테스트하여 올바르게 작동되는지 확인한다.

이를 통해 나중에 코드를 변경하지 않아도 키를 쉽게 업데이트 할 수 있으며 하드코딩으로 박아 넣지 않아 보안면에서 좋은 방법이다.

 

람다 함수 생성

import json
import openai
import boto3
import botocore
import pandas as pd 
from csv import reader
import io
import os

BUCKET_NAME = 'lambda_openai'
DIR_NAME = 'add/'
FILE_NAME = 'final_after.csv'
KEY = DIR_NAME + FILE_NAME

s3_client = boto3.client('s3')


def lambda_handler(event, context):
    resp = s3_client.get_object(Bucket = BUCKET_NAME, Key = KEY)
    df = pd.read_csv(io.BytesIO(resp["Body"].read()))
    sample_csv = df.head()
    
    model_to_use = "text-davinci-003"
    input_prompt=f"{sample_csv} \n\n 샘플데이터인데, 어떤 카테고리가 제일 많았는지 확인할 수 있는 시각화 코드를 짜줘 "
    
    openai.api_key = os.environ['openai_api_key']
    response = openai.Completion.create(
      model=model_to_use,
      prompt=input_prompt,
      temperature=0,
      max_tokens=100,
      top_p=1,
      frequency_penalty=0.0,
      presence_penalty=0.0
    )
    
    print(response)
    
    text_response = response['choices'][0]['text'].strip()
    
    #이 경로로 저장
    s3_client.put_object(Bucket='lambda_openai', Key=f'add/result.py', Body=text_response)
    
    return {
        'statusCode':200,
        'body': {
            'response' : text_response
        }
    }

 

Lambda 시간 늘리기

 

람다함수의 기본 제한시간은 3초이며, Open ai가 이를 호출하는데 시간이 더 많이 소요된다.

따라서 제한시간을 늘려서 호출하고 코드를 가져올 수 있을때까지의 시간으로 넣어준다. 

람다는 실행 시간을 기준으로 요금이 청구되기 때문에 실행 시간은 적당하게 넣어주는 것이 좋다.

 시각화 결과

 

s3에 저장된 시각화 결과이다. 해당 데이터는 외부 반출 불가이기 때문에 가렸으나, 각 어떤 카테고리의 수가 제일 많은지 보여준 결과이다.

시각화 코드를 해서 결과까지 호출할 수 있을 뿐만 아니라, 다른 프롬프트를 넣어서 여러 방면으로 테스트해볼 수 있을 것 같다.

반응형