AI/LLM

OpenAI Assistants API란? 예제를 통해 쉽게 알아보기

J's Note 2023. 11. 30. 22:22

Assistants API란?

어시스턴트 api를 사용하면, 기존에 사용하던 langchain등을 사용하여 묶인 여러 기능들을 openAI의 서비스만으로 쉽게 구현할 수 있습니다. 또한 GPT4 유료모델에서 제공하는 코드 인터프리터, 검색및 함수 등의 툴들을 지원하기때문에 높은 수준에서의 API개발이 가능합니다. 또한 “스레드”라는 무한한 메세지 스토리지를 제공하므로 더이상 conversation 메모리를 따로 구현할 필요가 없습니다.

  • 코드인터프리터, 웹 검색, 함수도출 등의 툴 제공
  • 사용자와 대화를 시작하면 스레드를 생성, 이 스레드는 무한한 메세지 추가가 가능

Assistants API 사용해보기

어시스턴트 생성

어시스턴트는 다음과 같은 파라미터를 가질 수 있습니다.

  • 지침(instructions) : pre-prompt라고 생각하면됩니다. 어시스턴트 모델이 어떻게 행동하거나 반응해야할지에 대해 정의합니다.
  • 모델(model) : 사용할 모델(파인튜닝 포함)을 지정합니다. gpt3.5, gpt4.0 등을 지정할 수도 있습니다.
  • 도구(tools) : 확장할 툴을 선택합니다. 코드 인터프리터, 외부검색, 함수 등을 지정할 수 있습니다.
assistant = client.beta.assistants.create(
    name="Math Tutor",
    instructions="You are a personal math tutor. Write and run code to answer math questions.",
    tools=[{"type": "code_interpreter"}],
    model="gpt-4-1106-preview"
)

스레드 생성

스레드는 대화를 나타냅니다. 사용자가 대화를 시작하면 스레드가 생성됩니다.

  • 스레드에는 크기제한이 없으므로 원하는 만큼 메세지를 추가할 수 있습니다.
  • Assistant는 테스트를 토큰화 하는 부분에 대해 알아서 확인하기때문에 이는 고려대상이 아닙니다.
  • 복잡성을 처리할 필요가 없어지며 컨텍스트를 어시스턴트가 직접 관리합니다.
thread = client.beta.threads.create()

메세지 추가

메세지에는 텍스트유형과 사용자가 업로드하는 파일 유형을 추가할 수 있습니다.

message = client.beta.threads.messages.create(
    thread_id=thread.id,
    role="user",
    content="I need to solve the equation `3x + 11 = 14`. Can you help me?"
)

메세지를 확인해보면 다음과 같은 데이터를 얻을 수 있습니다.

{
  "object": "list",
  "data": [
    {
      "created_at": 1696995451,
      "id": "msg_abc123",
      "object": "thread.message",
      "thread_id": "thread_abc123",
      "role": "user",
      "content": [{
        "type": "text",
        "text": {
          "value": "I need to solve the equation `3x + 11 = 14`. Can you help me?",
          "annotations": []
        }
          }],
        ...

어시스턴트 실행

사용자 메세지에 응답을 하려는경우 run을 생성하면 됩니다.

  • 이를 통해 어시스턴트는 스레드를 읽고 툴을 호출할지, 아니면 그냥 모델을 사용할지에 대해 알아서 판단한 후에 쿼리에 가장 잘 응답할 방법을 선택하여 결정합니다.
  • 또한 모델의 컨텍스트에 포함될 이전 메세지를 스레드에서 찾아 알아서 결정합니다.
  • 이 방식은 ChatGPT에서의 내용을 기반으로 최적화되어있습니다.
run = client.beta.threads.runs.create(
  thread_id=thread.id,
  assistant_id=assistant.id,
  instructions="Please address the user as Jane Doe. The user has a premium account."
)

실행상태 확인

이 run은 기본적으로 queued 상태로 전환되고, 주기적으로 상태를 검색하여 completed 되었는지 확인 할 수 있습니다.

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

응답 표시

실행이 완료되면, 어이스턴트가 스레드에 추가한 메세지를 나열할 수 있습니다.

messages = client.beta.threads.messages.list(
  thread_id=thread.id
)

해당 스레드의 메세지를 확인해보면 다음과 같은 메세지들을 포함하는것을 확인할 수 있습니다.

ROLE CONTENT

user I need to solve the equation 3x + 11 = 14. Can you help me?
assistant Certainly, Jane Doe. To solve the equation (3x + 11 = 14) for (x), you'll want to isolate (x) on one side of the equation. Here's how you can do that:
  1. Subtract 11 from both sides of the equation to get (3x = 3).
  2. Then, divide both sides by 3 to solve for (x).Let me calculate the value of (x) for you. | | assistant | The solution to the equation (3x + 11 = 14) is (x = 1). |