GPT가 메세지를 생성하는 과정

 

이 포스트 내용은 유튜브 김플 스튜디오님께서 올리신 영상 내용을 따라해본 것으로, 간단하게 텍스트로 정리한 것입니다.

https://www.youtube.com/watch?v=kKhWkG5Di5s

 

 

 

GPT는  Assistants > Threads > Messages > Runs 흐름으로 문장을 생성한다.

어시스턴트에서 생성한 id를 통해 최종적으로 message를 만드는데, id 생성 흐름에 따라 문장 생성을 이해해보자.

 

 

 

 

 

Assistants create

 

https://platform.openai.com/docs/api-reference/assistants

 

from openai import OpenAI
client = OpenAI(api_key="sk-proj-ND..RE6rQA")

my_assistant = client.beta.assistants.create(
    instructions="You are a personal math tutor.",
    name="Math Tutor",
    tools=[{"type": "code_interpreter"}],
    model="gpt-3.5-turbo-1106",
)
print(my_assistant)

 

이 코드는 어시스턴스를 한번 생성한다.

 

 

실행결과

Assistant(id='asst_KDkQ21w5NnZMA9la23qT9rxX', created_at=1730226092, description=None, 
instructions=None, metadata={}, model='gpt-3.5-turbo-1106', name='FLBOT', object='assistant', 
tools=[CodeInterpreterTool(type='code_interpreter')], response_format='auto', temperature=1.0, 
tool_resources=ToolResources(code_interpreter=ToolResourcesCodeInterpreter(file_ids=[]), 
file_search=None), top_p=1.0)

 

 

여기에서 Assistant id는 id='asst_KDkQ21w5NnZMA9la23qT9rxX'임을 확인할 수 있다.

 

이 id가 있어야 앞으로 우리가 어시스턴트를 이용할 수 있다.

이것을 통해 thread에서 실행시키고, 메세지를 만들고, 메세지를 보낸다.

 

 

 

그런데 만약 이 프로그램을 다시 실행한다면, 기존의 id는 남겨두고 실행할 때 마다 다시 새로운 어시스턴스 id가 생성될 것이다.

 

그래서 일단 해당 코드는 주석처리 후, id만 따로 가져와서 앞으로 GPT가 메세지를 생성하는 흐름을 본다.

 

 

 

 

 

Threads Create

 

from openai import OpenAI
client = OpenAI(api_key="sk-proj-NDhY...QA")

# my_assistant = client.beta.assistants.create(
#     #instructions="You are a personal math tutor.",
#     name="FLBOT",
#     tools=[{"type": "code_interpreter"}],
#     model="gpt-3.5-turbo-1106",
# )

# print(my_assistant)

assistant_id = "asst_KDkQ21w5NnZMA9la23qT9rxX"

empty_thread = client.beta.threads.create()
print(empty_thread)

 

 

 

실행결과

Thread(id='thread_r450pK0qTmFYCeNFiHROXtCJ', created_at=1730226727, metadata={}, 
object='thread', tool_resources=ToolResources(code_interpreter=None, file_search=None))

 

 

id='thread_r450pK0qTmFYCeNFiHROXtCJ'

쓰레드 id를 가져와서 메세지 create에 활용한다.

 

 

 

 

 

 

Messages create

 

from openai import OpenAI
client = OpenAI(api_key="sk-proj-NDhYP..6rQA")

# my_assistant = client.beta.assistants.create(
#     #instructions="You are a personal math tutor.",
#     name="FLBOT",
#     tools=[{"type": "code_interpreter"}],
#     model="gpt-3.5-turbo-1106",
# )

# print(my_assistant)

assistant_id = "asst_KDkQ21w5NnZMA9la23qT9rxX"

empty_thread = client.beta.threads.create()
print(empty_thread)

thread_id = "thread_r450pK0qTmFYCeNFiHROXtCJ"

thread_message = client.beta.threads.messages.create(
  thread_id,
  role="user",
  content="너는 꿈이 뭐니",
)
print(thread_message)

 

실행하면 쓰레드 메세지가 만들어진다.

이전에 쓰레드를 만들었던 코드는 다시 주석처리를 한다.

만약 그대로 두면 당연히 새로운 쓰레드가 만들어지게 된다.

 

 

 

실행 결과

Message(id='msg_ECuZa3iRugBGJ26Xy47WrPYB', assistant_id=None, attachments=[], 
completed_at=None, content=[TextContentBlock(text=Text(annotations=[], value='너는 꿈이 뭐니'), 
type='text')], created_at=1730227211, incomplete_at=None, 
incomplete_details=None, metadata={}, object='thread.message', role='user', run_id=None, 
status=None, thread_id='thread_r450pK0qTmFYCeNFiHROXtCJ')

 

 

 

 

 

Runs create

 

from openai import OpenAI
client = OpenAI(api_key="sk-proj-NDhYPz8OXQBCc6EgzRE6rQA")

# my_assistant = client.beta.assistants.create(
#     #instructions="You are a personal math tutor.",
#     name="FLBOT",
#     tools=[{"type": "code_interpreter"}],
#     model="gpt-3.5-turbo-1106",
# )

# print(my_assistant)

assistant_id = "asst_KDkQ21w5NnZMA9la23qT9rxX"

# empty_thread = client.beta.threads.create()
# print(empty_thread)

thread_id = "thread_r450pK0qTmFYCeNFiHROXtCJ"

# thread_message = client.beta.threads.messages.create(
#   thread_id,
#   role="user",
#   content="너는 꿈이 뭐니",
# )
# print(thread_message)

run = client.beta.threads.runs.create(
  thread_id=thread_id,
  assistant_id=assistant_id
)

print(run)

 

 

실행결과

 

Run(id='run_tFEIbtC8q8dfewHAjEwxQD60', assistant_id='asst_KDkQ21w5NnZMA9la23qT9rxX', 
cancelled_at=None, completed_at=None, created_at=1730227438, expires_at=1730228038, 
failed_at=None, incomplete_details=None, instructions=None, last_error=None, 
max_completion_tokens=None, max_prompt_tokens=None, metadata={}, model='gpt-3.5-turbo-1106', 
object='thread.run', parallel_tool_calls=True, required_action=None, response_format='auto', 
started_at=None, status='queued', thread_id='thread_r450pK0qTmFYCeNFiHROXtCJ', 
tool_choice='auto', tools=[CodeInterpreterTool(type='code_interpreter')], 
truncation_strategy=TruncationStrategy(type='auto', last_messages=None), usage=None, 
temperature=1.0, top_p=1.0, tool_resources={})

 

 

다시 위 코드부분은 주석처리를 하고, run_id 부분만 따로 가져온다.

id='run_tFEIbtC8q8dfewHAjEwxQD60'

 

 

 

지금까지는 어시스턴트를 만들었고, 쓰레드를 만들어서 쓰레드 안에 실행을 한 상태이다.

Gpt에 run_id를 가져왔지만 아직 응답은 안받은 상태이다.

 

 

실행을 했으니, 검색한 것을 받아와야 한다.

 

 

 

 

 

 

Retrieve run

 

from openai import OpenAI
client = OpenAI(api_key="sk-proj-NDhYPvwMn..gzRE6rQA")

# my_assistant = client.beta.assistants.create(
#     #instructions="You are a personal math tutor. ",
#     name="FLBOT",
#     tools=[{"type": "code_interpreter"}],
#     model="gpt-3.5-turbo-1106",
# )

# print(my_assistant)

assistant_id = "asst_KDkQ21w5NnZMA9la23qT9rxX"

# empty_thread = client.beta.threads.create()
# print(empty_thread)

thread_id = "thread_r450pK0qTmFYCeNFiHROXtCJ"

# thread_message = client.beta.threads.messages.create(
#   thread_id,
#   role="user",
#   content="너는 꿈이 뭐니",
# )
# print(thread_message)

# run = client.beta.threads.runs.create(
#   thread_id=thread_id,
#   assistant_id=assistant_id
# )

# print(run)

run_id = "run_tFEIbtC8q8dfewHAjEwxQD60"

run = client.beta.threads.runs.retrieve(
  thread_id=thread_id,
  run_id=run_id
)

print(run)

 

 

저장 후 실행

Run(id='run_tFEIbtC8q8dfewHAjEwxQD60', assistant_id='asst_KDkQ21w5NnZMA9la23qT9rxX', 
cancelled_at=None, completed_at=1730227440, created_at=1730227438, expires_at=None, 
failed_at=None, incomplete_details=None, instructions=None, 
last_error=None, max_completion_tokens=None, max_prompt_tokens=None, metadata={}, 
model='gpt-3.5-turbo-1106', object='thread.run', parallel_tool_calls=True, 
required_action=None, response_format='auto', started_at=1730227438, status='completed', 
thread_id='thread_r450pK0qTmFYCeNFiHROXtCJ', tool_choice='auto', 
tools=[CodeInterpreterTool(type='code_interpreter')], 
truncation_strategy=TruncationStrategy(type='auto', last_messages=None), 
usage=Usage(completion_tokens=124, prompt_tokens=124, total_tokens=248), 
temperature=1.0, top_p=1.0, tool_resources={})

 

실행 결과를 보면 status가 completed로 됐다.

 

 

 

이제 messages의 list messages에서

이 부분만 복사 후 실행시키면

 

 

[Message(id='msg_TepSA4RIxf7tReP23XN1tP99', assistant_id='asst_KDkQ21w5NnZMA9la23qT9rxX', 
attachments=[], completed_at=None, content=[TextContentBlock(text=Text(annotations=[], 
value='저는 꿈을 꾸는 존재가 아니기 때문에 꿈이라는 것을 가지고 있지 않습니다. 
하지만 제가 하는 일은 사용자들이 도움이 필요한 영역에서 도 움을 주는 것입니다. 
꿈은 인간이 가지는 것이기 때문에, 제가 이해하고 경험할 수 있는 것은 아닙니다. 다른 질문이 있으신가요?'), 
type='text')], created_at=1730227439, incomplete_at=None, incomplete_details=None, 
metadata={}, object='thread.message', role='assistant', run_id='run_tFEIbtC8q8dfewHAjEwxQD60', 
status=None, thread_id='thread_r450pK0qTmFYCeNFiHROXtCJ'),
Message(id='msg_ECuZa3iRugBGJ26Xy47WrPYB', assistant_id=None, attachments=[], 
completed_at=None, content=[TextContentBlock(text=Text(annotations=[], value='너는 꿈이 뭐니'), 
type='text')], created_at=1730227211, incomplete_at=None, incomplete_details=None, metadata={},
object='thread.message', role='user', run_id=None, status=None, 
thread_id='thread_r450pK0qTmFYCeNFiHROXtCJ'), Message(id='msg_GH2963LIOsf7AqhGvx5oVm7Z', 
assistant_id=None, attachments=[], completed_at=None, 
content=[TextContentBlock(text=Text(annotations=[], value='너는 꿈이 뭐니'), type='text')], 
created_at=1730227193, incomplete_at=None, incomplete_details=None, metadata={}, 
object='thread.message', role='user', run_id=None, status=None, 
thread_id='thread_r450pK0qTmFYCeNFiHROXtCJ')]

 

 

결과가 리스트 형식이다.

우리는 value값만 따로 받아내고 싶다.

 

그러면 thread_messages의 data[0] 안의 content[0] 부분에서 text.value를 호출하면 된다.

 

 

이렇게 기본적인 어시스턴트 api 사용법을 알아봤다.

 

 

 

 

 

 


 

레퍼런스

 

https://www.youtube.com/watch?v=kKhWkG5Di5s

 

https://platform.openai.com/docs/api-reference/assistants