본문 바로가기
IT/CHATGPT

[ChatGPT]Assistants API 활용

by Tony Jung 2024. 6. 9.
반응형

Assistants API 

와.. 활용도가 높았던  Custom GPT(GPTs)는 API를 제공하지 않아 많이 아쉬었는데 Assistants API에서 Custom GPT의 File Search, Code interpreter, Functions 을 지원하게 되어 무궁무진한 활용도를 가지게 되었답니다. 기업의 내부 시스템과 연동을 하거나, 내부 자료로 ChatBOT을 운영할 수 있을 것입니다. 

Assistants API는 현재 (24년 6월) Beta 딱지가 붙어있어서 예제의 코드에도 Beta 딱지가 붙어 있지만 요즘 업그레이드 되는 속도를 보면 곧 정식 공개가 될 것입니다.

Assistants API의 구조는 기본적으로 아래의 구조를 따릅니다. 

새롭게 적용되는 Thread 개념이 추가 되었습니다. 대화가 시작될 때 마다 Thread ID가 생성이 되며 Thread ID로 Bot에게 질문했던 모든 내용을 한번에 확인 할 수 있게 되었습니다. 

기본적인 순서는 아래와 같답니다. 

1. Assistant 생성 

Assistant는 OpenAI의 여러 모델을 사용하고 도구를 호출하는AI 입니다.  

2. Thread 생성 

Assistant와 사용자 간의 대화 세션 입니다. 생성된 Thread id를 기준으로 Gpt와 대화한 내용을 모두 확인 할 수 있습니다. 기존의 Api와 다른 부분이지요.. 

3.Message 생성

사용자나 Assistant가 생성한 메시지 입니다. 메시지는 텍스트, 이미지, 기타 파일이 포함될 수 있습니다. 모든 Message는 Thread에 List 로 저장됩니다.

4.Run 실행 

Thread에서 Assistant를 호출합니다. Thread에 전달된 메세지를 이용하여 모델과 도구를 호출하는 작업을 진행합니다. Chat Completions API와 다른 점은 Assistants API의 RUN은 비동기 작업입니다. 

5.Message 응답 확인 

Run이 실행되면 Status는 queued(대기중)으로 표기됩니다. Assistant가 처리를 완료했는지 알기 위해서는 Run을 상태를 주기적으로 확인하여 Status가 Completed 되기까지를 확인하여야 합니다. 

Assistant 생성 

Assistant 생성은 2가지 방법이 있습니다. OpenAI의 Playground를 이용하여 생성하는 방법과 API에서 직접 생성하는 방법이 있습니다. 이번 포스팅에서는 Assistant 생성을 OpenAI Playground에서 진행 하도록할게요.

OpenAI에 로그인 후 API 메뉴로 접근하면 아래와 같이 PlayGround 화면에 접속할 수 있습니다.

좌측 메뉴의 Assistant를 클릭한 후 Name과 Instructions를 먼저 정의하여야 합니다. Instructions는 Assistant의 역할과 답변의 제한, 형식에 대하여 미리 정의 해놓을 수 있습니다. 예를 들어 "당신은 기업의 HR 전문가로서 User가 질문하는 내용을 첨부된 파일의 내용 기반으로 답변해주세요. 모든 답변은 한글로 해주시고 전문가 스타일로 답변해주세요. " 라고 정의 할 수 있습니다. 

 

Model은 GPT3.5 Turbo부터 GPT-4o의 범위를 선택할 수 있으며 각 모델 마다 질문 /답변의 토큰 수 그리고 비용의 차이뿐 아니라 AI 모델 기본적인 성능의 차이도 있습니다. 적절한 모델을 선택 하시면 됩니다. 

File Search를 활성화하여 파일을 업로드 할 수 있습니다. GPT가 학습할 파일을 업로드 해주세요. 우측의 채팅창을 통해 설정된 내용으로 테스트가 가능합니다. 자.. API를 사용하기 위해서 가장 중요한 것은 Name 입력창 밑에 Asst_ xxxxxxxxxxx 라고 보일 것입니다. 이 코드가 여러분이 생성한 Assistant 모델의 Assistant 고유 ID로 API를 실행할 때 필수로 필요한 코드 입니다. 

Assistant API - Python

import json
import os
#openai api를 사용하기 위함 
import openai
#Tread의 상태값을 주기적으로 확인하기 위함
import time

openai.api_key="openai의 api 키를 발급받아 입력합니다. "
ASSISTANT_ID='playground에서 생성한 Assistant 모델의 assistant id를 입력합니다'

우선 openai를 import 해주셔야 합니다 .만약 설치가 안되었다면 터미널에서 pip install openai 명령어로 설치 해주세요. 그리고 이전에 설치했었다면 pip install openai --upgrade 로 업데이트 해주셔야 합니다. Assistant가 beta이니 최신으로 업데이트 해주셔야 겠지요. 

OpenAI 의 API 키와 Assistant ID키를 정의 해주시면 됩니다. OpenAI의 API키 생성은 이전 포스팅에 있답니다. 

2023.10.16 - [IT/CHATGPT] - ChatGPT API 이용하기 (GPT4, GPT3.5,Davinci)

Assistant를 생성하였으니 Thread를 생성해볼까요? 아래는 Thread를 생성하는 부분을 함수로 정의하였습니다. 만약 기존에 사용하고 있던 Thread 키가 없거나 새로운 대화창에서 대화를 시작하고 싶으실 때 호출하여 생성하시면 됩니다.

def create_new_thread():
    thread=openai.beta.threads.create()
    return thread

Thread 가 생성되었다면 이젠 메세지를 보내고 , Run을 실행 시키면 됩니다. 메세지는 Thread로 보내는 것이기에 아래와 같이 Thead id가 필요하며, Run으로 Assistant에게 전달 할때는 Thread id와 Assistant id가 필요로 합니다. 아래의 함수는 메세지 내용과, Thread id, Assistant id를 필수 인자값으로 가지고 있는 함수로 정의한 내용입니다. 

def summit_message(assistant_id,thread_id,user_message):
    #Thread에 메세지를 전송 
    openai.beta.threads.messages.create(
        thread_id=thread_id,
        role="user",
        content=user_message
    )
    #Run을 실행시켜 Assistant와 연결 
    run=openai.beta.threads.runs.create(
        thread_id=thread_id,
        assistant_id=assistant_id
    )
    return run

자. 우리는 Thread를 생성하고, Thread에 메세지를 보내고, Assistant에 User가 질문을 하였다고 알림을 주었습니다. 바로 답변이 오면 베스트인데. 현재는 바로 답변이 오지 않는답니다(곧 지원 되겠지요?). return 받은 run Stauts를 확인해보면 아마 대기 중 상태일 것입니다. 언제 답변이 올지 모르는 우리는 run의 상태를 지속적으로 확인이 필요합니다.

아래의 함수는 run의 Status가 queued 또는 in_progress 가 아닐때 까지 지정된 시간 간격으로 계속 상태를 확인 후 완료(Assistant 가 답변 완료) 되면 완료된 값을 반환 해 주는 함수 입니다. 

def wait_on_run(run,thread):
    while run.status =="queued" or run.status=="in_progress":
        run=openai.beta.threads.runs.retrieve(
            thread_id=thread,
            run_id=run.id,
        )
        time.sleep(0.5)
    return run

참고로 Run의 상태값은 아래와 같습니다. 

  • queued: 아직 실행이 되지 않고 대기중인 상태
  • in_progress: 처리중
  • requires_action: 사용자 입력 대기중
  • cancelling: 작업 취소중
  • cancelled: 작업 취소 완료
  • failed: 실패(오류)
  • completed: 작업 완료
  • expired: 작업 만료

Run의 Status가 작업 완료임을 확인 하였다면 이젠 Thread 값을 다시 가져와야 합니다.

def get_response(thread_id):
    return openai.beta.threads.messages.list(thread_id=thread_id,order="asc")

Order="asc"를 지정하지 않으면 기본적으로 역순으로 정렬됩니다. 즉 최신 질문과 답변이 맨위로 올라오게 되지요. 필요에따라 채팅 형식으로 만들기 위해서는 최신 질문과 답변이 맨아래로 와야 하기에 그때는 Order="asc" 로 설정해주시면 됩니다. 

API는 Json 형태로 값을 전달해 주기에 Json에서 필요한 내용만 추출하여 출력할 필요가 있습니다. 우리는 "질문"내역과 "답변"내역만을 출력하는 함수를 만들 것입니다. 

def print_message(response):
    for res in response:
        print(f"[res.role.upper()]\n{res.content[0].text.value}\n")

res.role.upper() 는 User인지 Assistant인지를 구분하며 "질문" ,"답변"은 res.content[0].text.value 에 있습니다. 

참고로 아래의 함수는  중간중간 받은 OpenAI의 Json값 전체 내용에 대하여 확인이 필요할 때 활용 할 수 있는 함수 입니다. 필요할 경우 상태값,Thread 전체 값을 확인해보시기 바랍니다. 

def show_json(obj):
    print(json.loads(obj.model_dump_json()))

그럼 이젠 각 함수를 호출하는 Main함수를 확인해 볼까요.

반응형

 

def main():
    #Thread_id 생성  
    THREAD_ID=create_new_thread().id
    
    #Assistant에게 전달할 질문내용
    USER_MESSAGE="PC지급 절차에 대해서 알려줘요"
    
    #Thread에 메세지를 전송하고, Run 실행 
    run=summit_message(ASSISTANT_ID,THREAD_ID,USER_MESSAGE)
    
    #실행된 Run의 상태값을 확인 
    run1=wait_on_run(run,THREAD_ID)
    
    #Run이 완료되면 Thread 값을 가져온 후 필요한 데이터 출력 
    print_message(get_response(THREAD_ID).data[-2:])

print_message(get_response(THREAD_ID).data[-2:]) 여기서 [-2:0]은 최신 질문과 답변만 출력하겠다는 것입니다. 만약 모든 Thread의 대화내용을 출력하고 싶다면 [0:] 의 형태로 변경하여 사용하시면 됩니다. 

위의 소스는 Thread 가 main이 호출 될 때 마다 생성이 되지만 개발환경에 맞추어서 기존에 생성한 thread 값이 있는지 확인 후 없거나, 새로운 Thread가 필요할 때만 생성하시고 만약 이미 생성된 Thread 값이 있다면 기존 Thread값을 활용하시면 됩니다.

main()을 호출하시면 이젠 아래와 같은 결과를 확인 할 수 있습니다.   

Assistant API는 약간의 활용으로 업무에 많은 변화를 가져올 수 있을 것입니다. 새로운 기능이 나올때 마다 전통적인 방식대로 테스트하고,검증하는 방식도 당연히 중요하겠지만 AI기술 적용에 있어서는 저는 우선 "먼저 적용하고, 사용해보기"를 권장합니다. 우리가 테스트하고 검증을 완료할 때 쯤이면,또 다른 새로운 버전과 기능이 나오고 있기에 결국 새로운 변화에 아무것도 적용 못하고 뒤쳐지는 결과를 초래할 수 있기 때문입니다.  

실제 기업의 시스템에 적용하려 할 때는 여러 근거없는 반대와 불필요함을 마주하실 것입니다. 이 포스팅을 보고 있는 여러분들은 좌절하지 마시고 끝까지 시도 해보시기 바랍니다. 정말 한끗차이랍니다~ 화이팅!!

반응형

댓글