본문 바로가기
데이터&AI/LLM

openai의 assistant api 기능 활용하기(= openai의 threads = openai agent)

by 일등박사 2024. 11. 2.
728x90

 

openai의 gpt 모델 API를 활용해서 텍스트를 생성할때는 1회성입니다!!

이를 개선하기 위해서 langchain의 ConversationBufferMemory를 사용해보기도 헀었는데요!

 

2024.01.27 - [데이터&AI/langchain] - [langchain공부] ConversationBufferMemory (과거 프롬포트 내용 기억하기!!)

 

[langchain공부] ConversationBufferMemory (과거 프롬포트 내용 기억하기!!)

2023.03.05 - [일등박사의 생각/데이터&AI] - python API를 활용한 chatgpt- 과거내용 기억하기 python API를 활용한 chatgpt- 과거내용 기억하기 안녕하세요~!!! 파이썬 API를 활용하여 새로나온 chatgpt(gpt-3.5-turbo)

drfirst.tistory.com

 

그럴필요 없이!! openai에서 제공하는 threads 기능을 통해서

하나의 객채를 만들고 이어서 대화를 진행할수 있습니다!!

오늘은 이에 대하여 알아보겠습니다!!


오늘의 컨셉은 다음과 같습니다

 

사용자 1: 수학을 질문하는학생. 질문은 1개당 500원의 비용을 받습니다!! 질문을 많이함

사용자 2: 같은 학생이지만 1개 질문만 함

 

 

agent 1 - 수학쌤 : 돈은 잘 모르고 그냥 질문에 답변만한다

agent2 - 돈받는사람 : 그동안 몇개 질문했는지 바탕으로 계산을한다

 

시작해봅시다!!!!

1. 학원 구성하기

컨셉에 맞게 수학썜과 돈받는사람(clerk)으로 구성된 학원을 구성합니다.

from openai import OpenAI
client = OpenAI()

teacher = client.beta.assistants.create(
  name="수학쌤",
  instructions="너는 개인 수학선생님이야. 수학답안을 해줘",
  tools=[{"type": "code_interpreter"}],
  model="gpt-4o",
)

clerk = client.beta.assistants.create(
  name="결재원",
  instructions="너는 학원에서 결재받는 점원. 총 질문에 500원씩 비용을 청구해",
  model="gpt-4o",
)

 

2. 사용자등장

user1, user2 사용자가 등장합니다!!

user1 = client.beta.threads.create()
user2 = client.beta.threads.create()

 

3. 사용자1의 질문공세!!

user1이 수학질문을 시작합니다!!

message = client.beta.threads.messages.create(
  thread_id=user1.id,
  role="user",
  content="X^2 -3x -4 - 0 의 해를 찾고싶어"
)
message

 

해당 질문을 넣어서 agent의 수학쌤에게 시작합니다!

run = client.beta.threads.runs.create_and_poll(
  thread_id=user1.id,
  assistant_id=teacher.id,
  instructions="사용자는 일등박사야. 그는 VIP회원이야."
)
run

if run.status == 'completed': 
    messages = client.beta.threads.messages.list(
    thread_id=thread.id
    )
    print(messages)
else:
    print(run.status)

 

그럼!! 수학쌤의 답변을 볼수있습니다!!

 

익숙하죠?? 그런데!! 만약 이해가 잘 안되었다면!?

기존 API와 다르게 그냥 이유를 설명해줘!! 라고 질문합니다!

message = client.beta.threads.messages.create(
  thread_id=user1.id,
  role="user",
  content="그 이유를 소개해줘"
)
message

 

그리고 결과를 보면!!

run = client.beta.threads.runs.create_and_poll(
  thread_id=user1.id,
  assistant_id=teacher.id,
  instructions="사용자는 일등박사야. 그는 VIP회원이야. "
)
run

if run.status == 'completed': 
    messages = client.beta.threads.messages.list(
    thread_id=user1.id
    )
    print(messages)
else:
    print(run.status)

 

기존 내용을 기억해 두었다가 그 이유를 잘 설명해줍니다!!

 

그래서 과거 이력을 모두 프린트해보면!

for d in messages.data[::-1]:
    print(d.content[0].text.value)
    print('-'*20)

 

그동안의 모든 이력을 잘 저장하는것을 알 수 있지요~!

 

 

다른 수학질문을 해볼까요!!?

message = client.beta.threads.messages.create(
  thread_id=user1.id,
  role="user",
  content="X^3 -1 = 0  의 해도 알고싶어"
)
message
run = client.beta.threads.runs.create_and_poll(
  thread_id=user1.id,
  assistant_id=teacher.id,
  instructions="사용자는 일등박사야. 그는 VIP회원이야. 일등박사님 안녕하세요? 로 대화를 시작해"
)
run

if run.status == 'completed': 
    messages = client.beta.threads.messages.list(
    thread_id=user1.id
    )
    print(messages)
else:
    print(run.status)

 

이번에도 물론!! 잘 답변해줍니다!!

 

4. 사용자2의 질문!!

이떄!! user2가 등장합니다!!

message = client.beta.threads.messages.create(
  thread_id=user2.id,
  role="user",
  content="X^2 -3x -4 - 0 의 해를 찾고싶어"
)
message

run = client.beta.threads.runs.create_and_poll(
  thread_id=user2.id,
  assistant_id=teacher.id,
  instructions="사용자는 일등박사야. 그는 VIP회원이야. 일등박사님 안녕하세요? 로 대화를 시작해"
)
run

if run.status == 'completed': 
    messages = client.beta.threads.messages.list(
    thread_id=user2.id
    )
    print(messages)
else:
    print(run.status)

 

thread_id = user2.id로 하여!! 진행하면!

이번에는 새 대화가 진행됩니다! user1에서 진행하던것은 아에 모르지요~!

 

 

5. 결재의시간!!!

이번엔 assistant_id를 teacher에서 clert, 점원으로 바꾸어봅식다!@!

message = client.beta.threads.messages.create(
  thread_id=user1.id,
  role="user",
  content="이제 얼마야!?"
)
message

run = client.beta.threads.runs.create_and_poll(
  thread_id=user1.id,
  assistant_id=clerk.id,
  instructions="지금까지의 대화내용을 바탕으로 수학계산알려준것 * 500 해서 비용을 알려줘"
)
run

if run.status == 'completed': 
    messages = client.beta.threads.messages.list(
    thread_id=user1.id
    )
    print(messages)
else:
    print(run.status)

 

결과를 본다면!! 과거의내용을 기억해서 잘 답변해주는것을 알 수있습니다!

 

 

마찬가지 방법으로!!! 사용자2의 비용도 계산할 수 있겠지요!?

다른부분은 그대로 두고 thread_id만 바꾸어주면 됩니다!!

message = client.beta.threads.messages.create(
  thread_id=user2.id,
  role="user",
  content="이제 얼마야!?"
)
message

run = client.beta.threads.runs.create_and_poll(
  thread_id=user2.id,
  assistant_id=clerk.id,
  instructions="지금까지의 대화내용을 바탕으로 수학계산알려준것 * 500 해서 비용을 알려줘"
)
run

if run.status == 'completed': 
    messages = client.beta.threads.messages.list(
    thread_id=user2.id
    )
    print(messages)
else:
    print(run.status)

 

ㅁ 참고 : https://platform.openai.com/docs/assistants/deep-dive

728x90

댓글