데보션 오픈랩(DEVOCEAN OpenLab) - 토이 프로젝트 세션 part3

Simon Kim·2024년 5월 19일

서론


작성된 설계서를 바탕으로 모델 및 어플리케이션 코드를 작성하는데, 문제가 발생했다. 과거 내 블로그에 작성한 "POE를 이용한 다양한 AI모델 사용"을 활용하려고 하였으나, POE 서비스가 최근에 챗봇 생성 방식이 변경되면서 챗봇을 찾지 못하는 현상이 발생하였다.

TrobleShooting


1. 원인

Poe-api-wrapper 패키지에서 챗봇에 프롬프트를 전달할 때, 아래 코드처럼 사용되는 모델(engine_nm) 기준으로 챗봇코드(chat_code)를 조회 후, 모델과 챗봇코드로 작성한 프롬프트(prompt)를 전달하여 모델에서 데이터를 생성하는데, 최근 POE 서비스가 업그레이드 되면서 아래 API를 요청 시 에러가 발생한다.

chat_code = client.get_chat_history(engine_nm)['data'][engine_nm][0]
for res_message in client.send_message(engine_nm, prompt,chatCode=chat_code):
	...

왜 에러가 나는 Poe-api-wrapper 패키지에서 제공하는 코드를 까보니, 챗봇 조회 방식이 모델(engine_nm)방식으로 더이상 챗봇 목록이 조회되지 않아 Poe-api-wrapper 패키지에 대한 업데이트가 필요한 상황이다.
그러나, 해당 패키지가 오픈 소스다 보니 업그레이드 적용에는 시간이 걸리는 상황이어서 급하게 대안을 찾아야 하는 상황이다.

2. 대안

위의 방안을 해결하기 위해서 아래 3가지의 방안을 강구하였다. 이 중, Devocean 세션 종료 기간을 고려하고, 개인적으로 관심을 가지고 있는 1안으로 진행하기로 결정하였다.

1. AWS bedrock Endpoint를 이용
2. Fast API로 시스템 아키텍처 변경 후, Poe-api-wrapper 패키지 코드를 custom하게 구성하여 사용
3. Devocean에서 제공하는 GPT-4 사용 검토

3. Amazon Bedrock이란

Amazon에서 제공하는 여러개의 Foundation Model를 활용하여 생성형 챗봇부터, 이미지 생성 등의 다양한 서비스를 구성할 수 있도록 제공하는 LLM 서비스로, 자세한 내용은 나의 설명 보다는 AWS 공식 URL을 참고하여 내용을 보면 도움이 될 것이다.
Amazon Bedrock이란?
Amazon Bedrock workshop

4. Amazon Bedrock Endpoint 연결

Amazon Bedrock에서 제공하는 Endpoint가 지원되는 리전별로 존재하며, Amazon Bedrock Endpoint로 API 호출 시, AWS SDK인 boto3를 사용하거나 또는 AWS 전용 Langchain Framework를 사용하는 방법 2가지가 있다. AWS 전용 Langchain Framework의 경우 Langchain Framework community 패키지의 종속되어 있는데, 버전 지원 문제로 인하여 AWS SDK인 boto3를 사용하여 구성하였다.

session = boto3.Session()
bedrock = session.client(service_name='bedrock-runtime') #creates a Bedrock client
body = json.dumps({
        "anthropic_version": "bedrock-2023-05-31",
        "max_tokens": 512,
        "messages": [
            {
                "role": "user",
                "content": [
                    {
                        "type": "text",
                        "text": prompt   #prompt 내용 입력
                    }
                ]
            }
        ],
        "temperature": 0.5,
        "top_p": 0.9
    })

response = bedrock.invoke_model(body=body, modelId=model, accept='application/json', contentType='application/json') #send the payload to Bedrock
response_body = json.loads(response.get('body').read()) # read the response
response_text = response_body.get("content")[0].get("text") #extract the text from the JSON response

5. 결과

Bedrock API호출 방법을 해멨으나, 결국 호출에 성공하였다. ㅎㅎ

다음시간에는


계속해서 어플리케이션을 구축 할 예정이다.

profile
다양한 주제를 심플하고 명확하게 정리해 보려는 연차만 많은 IT 잡부입니다. 사람들과의 소통을 사랑합니다.~^^

0개의 댓글