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