본문 바로가기
파이썬

openAI chatGPT assistant api 사용방법. 파이썬.

by 진심블로그 2024. 3. 6.

안녕하세요. 파이신입니다.

 

오늘은 파이썬을 이용하여 openAI의 어시스턴트 API 코딩을 알아봅니다.

 

- 본 글은 파이썬 고급 레벨의 이용자가 읽어 보기에 적합합니다

- 코드는 아래에서 바로 확인할 수 있습니다

 

chatGPT 챗지피티를 일반적으로 이용하거나, GPTs를 다루는 내용이 아닙니다.

 

일반적인 대화에 사용하는 기본적인 API가 아닙니다.

 

GPTs에서 보이는 앱들의 내부 코딩과 관련된 주제입니다.

 

코딩실력과는 별개로, 새로운 API를 사용한다는 것은 언제나 어려운 일입니다.

 

해당 API의 프로토콜을 이해하고 있어야 효과적인 사용을 할 수 있기 때문입니다.

 

간단한 묻고 대답하기 형식의 API의 경우에는 그나마 수월할 수 있지만,

post형식이 비동기적으로 이루지거나 할 경우에는,

해당 API를 공부하는데 꽤 시간이 필요하게 됩니다.

 

openAI의 assistant api가 바로 이런 경우입니다.

 

그냥 단순하게 질문을 던지고 대답을 받는 openAI의 여타 api와는

다른 방식입니다.

 

물론, 코드를 복사하기, 붙여넣기로 그냥 단순하게 사용만 한다면,

그렇지 않을 수도 있겠네요.

하지만 단순하게 복붙하기 위한 코드도 찾아보기 어렵습니다.

 

오늘, 해당 코드를 제공하고, 설명을 곁들이겠습니다.

 

아래 코드들의 각 셀은 모두 jupyter로 작성했습니다. 

한 셀, 한 셀 실행해 보면 바로바로 실행이 됩니다.

코드는 블로그에서 볼 수 있도록, 줄 넘김을 임의로 했습니다.

 

본 코드를 통해 하나의 독립된 GPTs를 만들 수 있습니다.

본 프로그램은 내가 만든 정보가 담겨 있는 pdf 파일을 업로드해서,

해당 내용을 바탕으로 chatGPT와 대화하는 PDF-chatbot입니다.

 

모 재능판매 사이트에서,

본 기능을 1000만원에 가까운 금액으로 판매를 하고 있는 걸 봤습니다.

 

잘 활용하기를 바랍니다.

 

첫 번째 단계입니다.

from openai import OpenAI
client = OpenAI()

file = client.files.create(
  file=open(r'C:\MyProjects\Model01\MODEL01_00000001-101.pdf', "rb"),
  purpose='assistants'
)

my_assistant = client.beta.assistants.create(
    instructions="You are a proactive and friendly chatbot
    			that responds based on the provided PDF file.
                You answer questions in Korean
                and strive to find the most relevant information from the PDF file",
    name="PDF chatbot",
    model="gpt-4-turbo-preview",
    tools=[{"type": "retrieval"}],
    file_ids=[file.id]
)
print(my_assistant)

 

- 내가 만든 pdf 파일을 업로드하여 file 객체를 만듭니다.

본 flle객체는 file.id와 같이 file의 id로 객체를 전달하는 역할을 합니다.

 

- 내 assistant를 만듭니다.

메서드명에서 보다시피 openAI의 assistant는 현재 공식적으로 beta입니다.

 

- 내가 올린 pdf를 바탕으로 한국어로 대답하라는 지시를 줍니다.

 

- assistant는 GPT4와 GPT3.5를 지원하는데,

정확하게는 gpt-4-turbo-preview와 gpt-3.5-turbo를 지원합니다.

아시다시피 gpt4는 유료입니다. 이건 일반 chatGPT4가 유료인 것과 다릅니다.

api를 이용할 때 gpt4 모델을 사용하려면, USD5 이상을 결제해야 합니다.

 

일반적으로 gpt4를 이용할 때와 gpt3을 이용할 때는 범용성 측면에서는 별다른

차이가 없습니다. 일반인이 사용할 때 그렇다는 말입니다.

하지만 api를 이용해서 '일'을 할 때는 두 개의 차이가 많이 나타납니다.

기반한 데이터의 양이나 결과물의 수준을 의미하는 것이 아니라,

모델이 데이터를 분석하는 능력에서 많은 차이를 보여줍니다.

이건, 같은 파일을 업로드하고,

gpt4와 gpt3.5를 모델로 각각 이용해서 직접 사용해 보면 알 수 있습니다.

 

하지만, 개인이 이런저런 테스트를 해보기에는 비쌉니다.

특히 대용량 데이터를 가지고 테스트를 해보면,

사용금액이 갑자기 늘어나는 경험을 하게 됩니다.

이건 직접 만든 api를 통해서 할 때도 그렇고,

openai의 ai platform playground를 이용할 때도 마찬가지입니다.

 

그렇다고 적은 양의 데이터를 가지고 테스트를 해보자니,

결과의 신뢰도가 떨어집니다.

 

해결방안은 본 포스트를 이어 가면서 하나하나 다루어 보겠습니다.

 

 - tool의 type키에 대응하는 값은 code_interpreter와 retrieval인데 혼용해도

됩니다.

code_inperpreter는 수학공식을 입력해서 답을 얻거나 긴 줄의 코드를 입력해서

사용하는 목적만은 아닙니다.

자연어로 이루어진 파일을 분석해서,

retrieval에서 더 원하는 답을 만들어 내는데도 도움이 됩니다.

 

위 셀을 실행하면,

아래와 같이 내가 만든 assistant의 id와 file의 id를 알 수 있습니다.

 

이렇게 내 assistant를 만들었으면, 이제 두 번째 단계입니다.

my_assistants = client.beta.assistants.list(
    limit="20",
)
print(my_assistants.data)
for id in my_assistants:
    print(f'my_assistants id : {id.id}')
print(f'my_assistants id : {my_assistant.id}')

 

텍스트로 확인한 id를 코드에서 사용할 수 있게 값을 가져옵니다. 

위에서 limit은 내가 만든 assistant들을 20개 한도 내에서 가져오라는 뜻입니다.

하나의 코드에서 assistant를 여러 개 만들 수 있습니다.

 

셀을 실행하면, 위와 같이, 내가 만든 assistant들의 모든 id를 출력합니다.

 

코드를 실행하면서 테스트를 할 때 주의해야 할 점이 있습니다.

 

맨 위의 셀은 실행할 때마다,

여러분에게 묻지 않고 계속해서 assistant를 만듭니다.

 

이렇게 되면 후의 코드들을 테스트할 때 id가 많아져서 사용이 복잡해집니다.

 

더 큰 문제는 파일을 업로드해서 구글 클라우드에 내 파일이 저장될 때마다

과금이 된다는 겁니다.

어시스턴트마다, 하루에 1GB마다 USD 0.2입니다.

작게 생각했다가 코드 테스트를 이거 저거 하다 보면,

순식간에 금액이 올라갑니다.

API사용요금은 또 별도입니다.

 

처음 배우는 단계에서는 다음의 내용을 꼭 확인하세요.

- 한 개의 어시스턴트 인스턴스를 확인하는 습관을 들인다

- 사용 후에는 파일을 어시스턴트에서 꼭 분리한다

(구글 클라우드 스토리지에서 꼭 삭제한다)

- 재학습이 필요 없는 단계라면 어시스턴트 자체를 삭제한다

- 사용요금 한도를 설정해 놓는다

 

이제 세 번째 단계입니다.

my_thread = client.beta.threads.create()

my_thread_message = client.beta.threads.messages.create(
  thread_id=my_thread.id,
  role="user",
  content='전체 문서에서 "파이신"이라는 글자가 몇번이나 나와?',
)
print(f"the message object: {my_thread_message} \n")

 

이제 본격적인 시작입니다.

 

API는 쓰레드기반입니다. 메시지는 쓰레드 객체로 다루어집니다.

즉 하나의 객체에 여러 message를 담을 수 있다는 뜻입니다.

 

assistant를 활성화시키고 첫 메시지를 세팅합니다.

메시지 객체를 다루는 쓰레드객체를 하나 만들고,

해당 객체를 이용해서 메시지 객체를 다시 만듭니다

이제 내가 만든 bot에게 메시지를 전달할 준비를 마친 겁니다.

 

 

위에서처럼 쓰레드 객체와, 쓰레드 객체가 가지고 있는 메세지 객체의 id를 볼 수 있습니다.

(코드에서는 쓰레드 객체 id를 출력하는 라인은 제외했습니다)

 

pdf 문서를 통해 여러 대화를 나누는 동작은, 실제로는 단순하지 않습니다.

가장 직관적인 질문을 선택해 보았습니다.

 

'전체문서에서 "파이신"이라는 글자가 몇 번이나 나와?" 와 같은 질문입니다.

 

여담으로,

AI, 특히나 모든 종류의 gpt는 마술상자가 아닙니다.

프로그래머들에게는 특히 더 그렇습니다.

 

회사에서 고객상담을 하는 챗봇을 만들 때는 그간 축적한 Q&A 를 db로 사용합니다.

db자체에 이미 질문과 대답이 있기 때문에,

gpt는 이걸 기반으로 결과물을 만들 수 있습니다.

 

그렇지만 Q&A가 없는 문서를 가지고 챗봇을 만든다는 건 완전히 다른 이야기입니다.

 

예를 들어, 위의 질문은 sql에서 select * from where.....를 사용하는 것이 빠릅니다.

그리고 더 신뢰할 수 있습니다.

gpt는 db가 아니고, db의 사용법으로 사용하는 대상이 아닙니다.

 

이건 중요한 개념입니다.

 

gpt를 이용해서 무언가를 기획하고 만드는 입장에서는 그 차이에 대해 반드시

알고 있어야 합니다.

 

블로그의 여러 글들을 둘러보면서 본인의 아이디어를 확장하는데 도움이 되기를

바랍니다.

 

글이 길어져 다음 글에서 이어 쓰도록 하겠습니다.

 

제 블로그에 관련 글들을 계속해서 게재할 예정입니다.