영어로 읽기

다음을 통해 공유


Azure OpenAI 도우미(미리 보기) 시작

Azure OpenAI 도우미(미리 보기)를 사용하면 사용자 지정 지침을 통해 필요에 맞게 조정되고 코드 해석기 및 사용자 지정 함수와 같은 고급 도구로 강화된 AI 도우미를 만들 수 있습니다. 이 문서에서는 도우미 API를 시작하는 방법을 자세히 설명합니다.

참고

  • 파일 검색은 도우미당 최대 10,000개의 파일을 수집할 수 있으며, 이는 이전보다 500배 이상 높은 수치입니다. 빠르고 다중 스레드 검색을 통해 병렬 쿼리를 지원하며 향상된 순위 재지정 및 쿼리 다시 쓰기 기능을 제공합니다.
    • 벡터 저장소는 API의 새 개체입니다. 파일이 벡터 저장소에 추가되면 자동으로 구문 분석, 청크 분할, 포함되어 검색할 수 있는 상태가 됩니다. 벡터 저장소는 도우미와 스레드에서 사용할 수 있으므로 파일 관리 및 청구를 간소화합니다.
  • 특정 실행에서 특정 도구(예: 파일 검색, 코드 인터프리터, 함수)를 강제로 사용하는 데 사용할 수 있는 tool_choice 매개 변수에 대한 지원이 추가되었습니다.

도우미 지원

지역 및 모델 지원

코드 인터프리터는 Azure OpenAI Assistant가 지원하는 모든 지역에서 사용할 수 있습니다. 모델 페이지에는 현재 도우미를 지원하는 지역/모델에 대한 최신 정보가 포함되어 있습니다.

API 버전

  • 2024-02-15-preview
  • 2024-05-01-preview

지원되는 파일 형식

파일 형식 MIME 형식 코드 해석기
c. text/x-c
.cpp text/x-c++
.csv application/csv
.docx application/vnd.openxmlformats-officedocument.wordprocessingml.document
.html text/html
.java text/x-java
json. application/json
.md text/markdown
.pdf application/pdf
.php text/x-php
.pptx application/vnd.openxmlformats-officedocument.presentationml.presentation
.py text/x-python
.py text/x-script.python
.rb text/x-ruby
.tex text/x-tex
.txt text/plain
.css 텍스트/css
.jpeg image/jpeg
.jpg image/jpeg
.js text/javascript
.gif image/gif
.png image/png
.tar application/x-tar
.ts application/typescript
.xlsx application/vnd.openxmlformats-officedocument.spreadsheetml.sheet
.xml application/xml 혹은 "text/xml"
.zip application/zip

도구

특정 실행에서 특정 도구(예: file_search, code_interpreter 또는 function)를 강제로 사용하는 데 사용할 수 있는 tool_choice 매개 변수에 대한 지원이 추가되었습니다.

개별 도우미는 코드 인터프리터파일 검색을 포함하여 최대 128개의 도구에 액세스할 수 있지만 함수를 통해 고유의 사용자 지정 도구를 정의할 수도 있습니다.

Files

스튜디오를 통해 또는 프로그래밍 방식으로 파일을 업로드할 수 있습니다. file_ids 매개 변수는 code_interpreter와 같은 도구에 파일 액세스 권한을 부여하는 데 필요합니다. 파일 업로드 엔드포인트를 사용하는 경우 purpose를 도우미 API에서 사용할 도우미로 설정해야 합니다.

도우미 플레이그라운드

빠른 시작 가이드에서 도우미 플레이그라운드에 대한 안내를 제공합니다. 이는 도우미의 기능을 테스트할 수 있는 코드 없는 환경을 제공합니다.

도우미 구성 요소

구성 요소 설명
도우미 도구와 함께 Azure OpenAI 모델을 사용하는 사용자 지정 AI입니다.
스레드 도우미와 사용자 간의 대화 세션입니다. 스레드는 메시지를 저장하고 자동으로 잘림을 처리하여 콘텐츠를 모델의 컨텍스트에 맞춥니다.
Message 도우미 또는 사용자가 작성한 메시지입니다. 메시지에는 텍스트, 이미지 및 기타 파일이 포함될 수 있습니다. 메시지는 스레드에 목록으로 저장됩니다.
Run 스레드의 콘텐츠에 따라 실행을 시작하기 위한 도우미 활성화. 도우미는 구성과 스레드의 메시지를 사용하여 모델과 도구를 호출하여 작업을 수행합니다. 실행의 일부로 도우미는 스레드에 메시지를 추가합니다.
실행 단계 도우미가 실행의 일부로 수행한 단계의 세부 목록입니다. 도우미는 실행 중에 도구를 호출하거나 메시지를 만들 수 있습니다. 실행 단계를 조사하면 도우미가 최종 결과를 가져오는 방법을 이해할 수 있습니다.

첫 번째 도우미 설정

도우미 만들기

이 예제에서는 code_interpreter 도구의 기능을 사용하여 시각화를 생성하는 코드를 작성하는 도우미를 만듭니다. 아래 예제의 목적은 Jupyter Notebook과 같은 환경에서 순차적으로 실행하는 것입니다.

import os
import json
from openai import AzureOpenAI
    
client = AzureOpenAI(
    api_key=os.getenv("AZURE_OPENAI_API_KEY"),  
    api_version="2024-05-01-preview",
    azure_endpoint = os.getenv("AZURE_OPENAI_ENDPOINT")
    )

# Create an assistant
assistant = client.beta.assistants.create(
    name="Data Visualization",
    instructions=f"You are a helpful AI assistant who makes interesting visualizations based on data." 
    f"You have access to a sandboxed environment for writing and testing code."
    f"When you are asked to create a visualization you should follow these steps:"
    f"1. Write the code."
    f"2. Anytime you write new code display a preview of the code to show your work."
    f"3. Run the code to confirm that it runs."
    f"4. If the code is successful display the visualization."
    f"5. If the code is unsuccessful display the error message and try to revise the code and rerun going through the steps from above again.",
    tools=[{"type": "code_interpreter"}],
    model="gpt-4-1106-preview" #You must replace this value with the deployment name for your model.
)

위의 구성에서 몇 가지 유의해야 할 세부 정보가 있습니다.

  • 이 도우미가 tools=[{"type": "code_interpreter"}], 줄과 관련하여 코드 해석기에 액세스할 수 있도록 설정합니다. 그러면 모델은 샌드박스가 적용된 Python 환경에 액세스하여 코드를 실행하고 사용자의 질문에 대한 응답을 작성할 수 있습니다.
  • 이 지침에서는 모델에 코드를 실행할 수 있다고 알려줍니다. 경우에 따라 주어진 쿼리를 해결하는 데 적합한 도구가 무엇인지 모델에 알려주어야 할 때도 있습니다. 고객은 이러한 도구를 알고 있으면 특정 라이브러리를 사용하여 코드 인터프리터의 일부임을 알고 있는 특정 응답을 생성합니다. 그러면 "Matplotlib을 사용하여 x 수행"과 같은 메시지를 전달하여 지침을 제공하는 데 도움이 될 수 있습니다.
  • Azure OpenAI이므로 model=에 대해 입력하는 값이 배포 이름과 일치해야 합니다.

다음으로, 방금 만든 도우미의 내용을 출력하여 만들기가 성공했는지 확인합니다.

print(assistant.model_dump_json(indent=2))
{
  "id": "asst_7AZSrv5I3XzjUqWS40X5UgRr",
  "created_at": 1705972454,
  "description": null,
  "file_ids": [],
  "instructions": "You are a helpful AI assistant who makes interesting visualizations based on data.You have access to a sandboxed environment for writing and testing code.When you are asked to create a visualization you should follow these steps:1. Write the code.2. Anytime you write new code display a preview of the code to show your work.3. Run the code to confirm that it runs.4. If the code is successful display the visualization.5. If the code is unsuccessful display the error message and try to revise the code and rerun going through the steps from above again.",
  "metadata": {},
  "model": "gpt-4-1106-preview",
  "name": "Data Visualization",
  "object": "assistant",
  "tools": [
    {
      "type": "code_interpreter"
    }
  ]
}

스레드 만들기

이제 스레드를 만들겠습니다.

# Create a thread
thread = client.beta.threads.create()
print(thread)
Thread(id='thread_6bunpoBRZwNhovwzYo7fhNVd', created_at=1705972465, metadata={}, object='thread')

스레드는 근본적으로 도우미와 사용자 간의 대화 세션을 기록한 것입니다. 일반적인 채팅 완료 API 호출의 메시지 배열/목록과 비슷합니다. 주요 차이점 중 하나는 채팅 완료 메시지 배열과 달리 각 호출에서 토큰을 추적하여 모델의 컨텍스트 길이 아래로 남아 있는지 확인할 필요가 없다는 것입니다. 스레드는 이 관리 세부 정보를 추상화하고 대화를 계속할 수 있도록 필요한 대로 스레드 기록을 압축합니다. 컨텍스트 길이가 더 길고 최신 기능을 지원하는 최신 모델을 사용하면 스레드가 더 큰 대화로 이 작업을 수행하는 기능이 향상됩니다.

다음으로, 스레드에 추가할 첫 번째 사용자 질문을 만듭니다.

# Add a user question to the thread
message = client.beta.threads.messages.create(
    thread_id=thread.id,
    role="user",
    content="Create a visualization of a sinewave"
)

스레드 메시지 나열

thread_messages = client.beta.threads.messages.list(thread.id)
print(thread_messages.model_dump_json(indent=2))
{
  "data": [
    {
      "id": "msg_JnkmWPo805Ft8NQ0gZF6vA2W",
      "assistant_id": null,
      "content": [
        {
          "text": {
            "annotations": [],
            "value": "Create a visualization of a sinewave"
          },
          "type": "text"
        }
      ],
      "created_at": 1705972476,
      "file_ids": [],
      "metadata": {},
      "object": "thread.message",
      "role": "user",
      "run_id": null,
      "thread_id": "thread_6bunpoBRZwNhovwzYo7fhNVd"
    }
  ],
  "object": "list",
  "first_id": "msg_JnkmWPo805Ft8NQ0gZF6vA2W",
  "last_id": "msg_JnkmWPo805Ft8NQ0gZF6vA2W",
  "has_more": false
}

스레드 실행

run = client.beta.threads.runs.create(
  thread_id=thread.id,
  assistant_id=assistant.id,
  #instructions="New instructions" #You can optionally provide new instructions but these will override the default instructions
)

여기에서 instructions 매개 변수를 전달할 수도 있지만, 그러면 이전에 도우미에게 제공한 기존 지침이 재정의됩니다.

스레드 상태 검색

# Retrieve the status of the run
run = client.beta.threads.runs.retrieve(
  thread_id=thread.id,
  run_id=run.id
)

status = run.status
print(status)
completed

실행하는 쿼리의 복잡성에 따라 스레드를 실행하는 데 더 오래 걸릴 수 있습니다. 이 경우 아래 예제와 같은 코드를 사용하여 스레드의 실행 상태를 모니터링하는 루프를 만들 수 있습니다.

import time
from IPython.display import clear_output

start_time = time.time()

status = run.status

while status not in ["completed", "cancelled", "expired", "failed"]:
    time.sleep(5)
    run = client.beta.threads.runs.retrieve(thread_id=thread.id,run_id=run.id)
    print("Elapsed time: {} minutes {} seconds".format(int((time.time() - start_time) // 60), int((time.time() - start_time) % 60)))
    status = run.status
    print(f'Status: {status}')
    clear_output(wait=True)

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

print(f'Status: {status}')
print("Elapsed time: {} minutes {} seconds".format(int((time.time() - start_time) // 60), int((time.time() - start_time) % 60)))
print(messages.model_dump_json(indent=2))

실행이 in_progress 또는 다른 비터미널 상태이면 스레드가 잠긴 것입니다. 스레드가 잠겼으면 새 메시지를 추가할 수 없고 새 실행을 만들 수 없습니다.

실행 후 스레드 메시지 나열

실행 상태가 완료이면 스레드의 내용을 다시 나열하여 모델 및 도구 응답을 검색할 수 있습니다.

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

print(messages.model_dump_json(indent=2))
{
  "data": [
    {
      "id": "msg_M5pz73YFsJPNBbWvtVs5ZY3U",
      "assistant_id": "asst_eHwhP4Xnad0bZdJrjHO2hfB4",
      "content": [
        {
          "text": {
            "annotations": [],
            "value": "Is there anything else you would like to visualize or any additional features you'd like to add to the sine wave plot?"
          },
          "type": "text"
        }
      ],
      "created_at": 1705967782,
      "file_ids": [],
      "metadata": {},
      "object": "thread.message",
      "role": "assistant",
      "run_id": "run_AGQHJrrfV3eM0eI9T3arKgYY",
      "thread_id": "thread_ow1Yv29ptyVtv7ixbiKZRrHd"
    },
    {
      "id": "msg_oJbUanImBRpRran5HSa4Duy4",
      "assistant_id": "asst_eHwhP4Xnad0bZdJrjHO2hfB4",
      "content": [
        {
          "image_file": {
            "file_id": "assistant-1YGVTvNzc2JXajI5JU9F0HMD"
          },
          "type": "image_file"
        },
        {
          "text": {
            "annotations": [],
            "value": "Here is the visualization of a sine wave: \n\nThe wave is plotted using values from 0 to \\( 4\\pi \\) on the x-axis, and the corresponding sine values on the y-axis. I've also added grid lines for easier reading of the plot."
          },
          "type": "text"
        }
      ],
      "created_at": 1705967044,
      "file_ids": [],
      "metadata": {},
      "object": "thread.message",
      "role": "assistant",
      "run_id": "run_8PsweDFn6gftUd91H87K0Yts",
      "thread_id": "thread_ow1Yv29ptyVtv7ixbiKZRrHd"
    },
    {
      "id": "msg_Pu3eHjM10XIBkwqh7IhnKKdG",
      "assistant_id": null,
      "content": [
        {
          "text": {
            "annotations": [],
            "value": "Create a visualization of a sinewave"
          },
          "type": "text"
        }
      ],
      "created_at": 1705966634,
      "file_ids": [],
      "metadata": {},
      "object": "thread.message",
      "role": "user",
      "run_id": null,
      "thread_id": "thread_ow1Yv29ptyVtv7ixbiKZRrHd"
    }
  ],
  "object": "list",
  "first_id": "msg_M5pz73YFsJPNBbWvtVs5ZY3U",
  "last_id": "msg_Pu3eHjM10XIBkwqh7IhnKKdG",
  "has_more": false
}

파일 ID 검색

모델이 사인파 이미지를 생성할 것을 요청했습니다. 이미지를 다운로드하려면 먼저 이미지 파일 ID를 검색해야 합니다.

data = json.loads(messages.model_dump_json(indent=2))  # Load JSON data into a Python object
image_file_id = data['data'][0]['content'][0]['image_file']['file_id']

print(image_file_id)  # Outputs: assistant-1YGVTvNzc2JXajI5JU9F0HMD

이미지 다운로드

content = client.files.content(image_file_id)

image= content.write_to_file("sinewave.png")

이미지를 다운로드한 후 로컬로 엽니다.

from PIL import Image

# Display the image in the default image viewer
image = Image.open("sinewave.png")
image.show()

코드 인터프리터가 생성된 사인 웨이브의 스크린샷.

스레드에 대한 후속 질문

도우미가 지침을 따르지 않았고 응답의 텍스트 부분에서 실행된 코드를 포함하고 있으므로, 해당 정보를 명시적으로 요청해 보겠습니다.

# Add a new user question to the thread
message = client.beta.threads.messages.create(
    thread_id=thread.id,
    role="user",
    content="Show me the code you used to generate the sinewave"
)

스레드를 다시 실행하고 상태를 검색해야 합니다.

run = client.beta.threads.runs.create(
  thread_id=thread.id,
  assistant_id=assistant.id,
  #instructions="New instructions" #You can optionally provide new instructions  but these will override the default instructions
)

# Retrieve the status of the run
run = client.beta.threads.runs.retrieve(
  thread_id=thread.id,
  run_id=run.id
)

status = run.status
print(status)

completed

실행 상태가 완료로 전환되면 스레드의 메시지를 다시 나열합니다. 이번에는 마지막 질문에 대한 응답이 포함되어 있을 것입니다.

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

print(messages.model_dump_json(indent=2))
{
  "data": [
    {
      "id": "msg_oaF1PUeozAvj3KrNnbKSy4LQ",
      "assistant_id": "asst_eHwhP4Xnad0bZdJrjHO2hfB4",
      "content": [
        {
          "text": {
            "annotations": [],
            "value": "Certainly, here is the code I used to generate the sine wave visualization:\n\n```python\nimport numpy as np\nimport matplotlib.pyplot as plt\n\n# Generating data for the sinewave\nx = np.linspace(0, 4 * np.pi, 1000)  # Generate values from 0 to 4*pi\ny = np.sin(x)  # Compute the sine of these values\n\n# Plotting the sine wave\nplt.plot(x, y)\nplt.title('Sine Wave')\nplt.xlabel('x')\nplt.ylabel('sin(x)')\nplt.grid(True)\nplt.show()\n```\n\nThis code snippet uses `numpy` to generate an array of x values and then computes the sine for each x value. It then uses `matplotlib` to plot these values and display the resulting graph."
          },
          "type": "text"
        }
      ],
      "created_at": 1705969710,
      "file_ids": [],
      "metadata": {},
      "object": "thread.message",
      "role": "assistant",
      "run_id": "run_oDS3fH7NorCUVwROTZejKcZN",
      "thread_id": "thread_ow1Yv29ptyVtv7ixbiKZRrHd"
    },
    {
      "id": "msg_moYE3aNwFYuRq2aXpxpt2Wb0",
      "assistant_id": null,
      "content": [
        {
          "text": {
            "annotations": [],
            "value": "Show me the code you used to generate the sinewave"
          },
          "type": "text"
        }
      ],
      "created_at": 1705969678,
      "file_ids": [],
      "metadata": {},
      "object": "thread.message",
      "role": "user",
      "run_id": null,
      "thread_id": "thread_ow1Yv29ptyVtv7ixbiKZRrHd"
    },
    {
      "id": "msg_M5pz73YFsJPNBbWvtVs5ZY3U",
      "assistant_id": "asst_eHwhP4Xnad0bZdJrjHO2hfB4",
      "content": [
        {
          "text": {
            "annotations": [],
            "value": "Is there anything else you would like to visualize or any additional features you'd like to add to the sine wave plot?"
          },
          "type": "text"
        }
      ],
      "created_at": 1705967782,
      "file_ids": [],
      "metadata": {},
      "object": "thread.message",
      "role": "assistant",
      "run_id": "run_AGQHJrrfV3eM0eI9T3arKgYY",
      "thread_id": "thread_ow1Yv29ptyVtv7ixbiKZRrHd"
    },
    {
      "id": "msg_oJbUanImBRpRran5HSa4Duy4",
      "assistant_id": "asst_eHwhP4Xnad0bZdJrjHO2hfB4",
      "content": [
        {
          "image_file": {
            "file_id": "assistant-1YGVTvNzc2JXajI5JU9F0HMD"
          },
          "type": "image_file"
        },
        {
          "text": {
            "annotations": [],
            "value": "Here is the visualization of a sine wave: \n\nThe wave is plotted using values from 0 to \\( 4\\pi \\) on the x-axis, and the corresponding sine values on the y-axis. I've also added grid lines for easier reading of the plot."
          },
          "type": "text"
        }
      ],
      "created_at": 1705967044,
      "file_ids": [],
      "metadata": {},
      "object": "thread.message",
      "role": "assistant",
      "run_id": "run_8PsweDFn6gftUd91H87K0Yts",
      "thread_id": "thread_ow1Yv29ptyVtv7ixbiKZRrHd"
    },
    {
      "id": "msg_Pu3eHjM10XIBkwqh7IhnKKdG",
      "assistant_id": null,
      "content": [
        {
          "text": {
            "annotations": [],
            "value": "Create a visualization of a sinewave"
          },
          "type": "text"
        }
      ],
      "created_at": 1705966634,
      "file_ids": [],
      "metadata": {},
      "object": "thread.message",
      "role": "user",
      "run_id": null,
      "thread_id": "thread_ow1Yv29ptyVtv7ixbiKZRrHd"
    }
  ],
  "object": "list",
  "first_id": "msg_oaF1PUeozAvj3KrNnbKSy4LQ",
  "last_id": "msg_Pu3eHjM10XIBkwqh7IhnKKdG",
  "has_more": false
}

마지막 질문에 대한 응답만 추출하려면 다음을 수행합니다.

data = json.loads(messages.model_dump_json(indent=2))
code = data['data'][0]['content'][0]['text']['value']
print(code)

Certainly, here is the code I used to generate the sine wave visualization:

import numpy as np
import matplotlib.pyplot as plt

# Generating data for the sinewave
x = np.linspace(0, 4 * np.pi, 1000)  # Generate values from 0 to 4*pi
y = np.sin(x)  # Compute the sine of these values

# Plotting the sine wave
plt.plot(x, y)
plt.title('Sine Wave')
plt.xlabel('x')
plt.ylabel('sin(x)')
plt.grid(True)
plt.show()

어둡게 모드

코드 해석기가 차트를 자동으로 어둡게 모드로 바꿀 수 있는지 확인하기 위해 스레드에 마지막 질문을 하나 추가해 보겠습니다.

# Add a user question to the thread
message = client.beta.threads.messages.create(
    thread_id=thread.id,
    role="user",
    content="I prefer visualizations in darkmode can you change the colors to make a darkmode version of this visualization."
)

# Run the thread
run = client.beta.threads.runs.create(
  thread_id=thread.id,
  assistant_id=assistant.id,
)

# Retrieve the status of the run
run = client.beta.threads.runs.retrieve(
  thread_id=thread.id,
  run_id=run.id
)

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

print(messages.model_dump_json(indent=2))
{
  "data": [
    {
      "id": "msg_KKzOHCArWGvGpuPo0pVZTHgV",
      "assistant_id": "asst_eHwhP4Xnad0bZdJrjHO2hfB4",
      "content": [
        {
          "text": {
            "annotations": [],
            "value": "You're viewing the dark mode version of the sine wave visualization in the image above. The plot is set against a dark background with a cyan colored sine wave for better contrast and visibility. If there's anything else you'd like to adjust or any other assistance you need, feel free to let me know!"
          },
          "type": "text"
        }
      ],
      "created_at": 1705971199,
      "file_ids": [],
      "metadata": {},
      "object": "thread.message",
      "role": "assistant",
      "run_id": "run_izZFyTVB1AlFM1VVMItggRn4",
      "thread_id": "thread_ow1Yv29ptyVtv7ixbiKZRrHd"
    },
    {
      "id": "msg_30pXFVYNgP38qNEMS4Zbozfk",
      "assistant_id": null,
      "content": [
        {
          "text": {
            "annotations": [],
            "value": "I prefer visualizations in darkmode can you change the colors to make a darkmode version of this visualization."
          },
          "type": "text"
        }
      ],
      "created_at": 1705971194,
      "file_ids": [],
      "metadata": {},
      "object": "thread.message",
      "role": "user",
      "run_id": null,
      "thread_id": "thread_ow1Yv29ptyVtv7ixbiKZRrHd"
    },
    {
      "id": "msg_3j31M0PaJLqO612HLKVsRhlw",
      "assistant_id": "asst_eHwhP4Xnad0bZdJrjHO2hfB4",
      "content": [
        {
          "image_file": {
            "file_id": "assistant-kfqzMAKN1KivQXaEJuU0u9YS"
          },
          "type": "image_file"
        },
        {
          "text": {
            "annotations": [],
            "value": "Here is the dark mode version of the sine wave visualization. I've used the 'dark_background' style in Matplotlib and chosen a cyan color for the plot line to ensure it stands out against the dark background."
          },
          "type": "text"
        }
      ],
      "created_at": 1705971123,
      "file_ids": [],
      "metadata": {},
      "object": "thread.message",
      "role": "assistant",
      "run_id": "run_B91erEPWro4bZIfryQeIDDlx",
      "thread_id": "thread_ow1Yv29ptyVtv7ixbiKZRrHd"
    },
    {
      "id": "msg_FgDZhBvvM1CLTTFXwgeJLdua",
      "assistant_id": null,
      "content": [
        {
          "text": {
            "annotations": [],
            "value": "I prefer visualizations in darkmode can you change the colors to make a darkmode version of this visualization."
          },
          "type": "text"
        }
      ],
      "created_at": 1705971052,
      "file_ids": [],
      "metadata": {},
      "object": "thread.message",
      "role": "user",
      "run_id": null,
      "thread_id": "thread_ow1Yv29ptyVtv7ixbiKZRrHd"
    },
    {
      "id": "msg_oaF1PUeozAvj3KrNnbKSy4LQ",
      "assistant_id": "asst_eHwhP4Xnad0bZdJrjHO2hfB4",
      "content": [
        {
          "text": {
            "annotations": [],
            "value": "Certainly, here is the code I used to generate the sine wave visualization:\n\n```python\nimport numpy as np\nimport matplotlib.pyplot as plt\n\n# Generating data for the sinewave\nx = np.linspace(0, 4 * np.pi, 1000)  # Generate values from 0 to 4*pi\ny = np.sin(x)  # Compute the sine of these values\n\n# Plotting the sine wave\nplt.plot(x, y)\nplt.title('Sine Wave')\nplt.xlabel('x')\nplt.ylabel('sin(x)')\nplt.grid(True)\nplt.show()\n```\n\nThis code snippet uses `numpy` to generate an array of x values and then computes the sine for each x value. It then uses `matplotlib` to plot these values and display the resulting graph."
          },
          "type": "text"
        }
      ],
      "created_at": 1705969710,
      "file_ids": [],
      "metadata": {},
      "object": "thread.message",
      "role": "assistant",
      "run_id": "run_oDS3fH7NorCUVwROTZejKcZN",
      "thread_id": "thread_ow1Yv29ptyVtv7ixbiKZRrHd"
    },
    {
      "id": "msg_moYE3aNwFYuRq2aXpxpt2Wb0",
      "assistant_id": null,
      "content": [
        {
          "text": {
            "annotations": [],
            "value": "Show me the code you used to generate the sinewave"
          },
          "type": "text"
        }
      ],
      "created_at": 1705969678,
      "file_ids": [],
      "metadata": {},
      "object": "thread.message",
      "role": "user",
      "run_id": null,
      "thread_id": "thread_ow1Yv29ptyVtv7ixbiKZRrHd"
    },
    {
      "id": "msg_M5pz73YFsJPNBbWvtVs5ZY3U",
      "assistant_id": "asst_eHwhP4Xnad0bZdJrjHO2hfB4",
      "content": [
        {
          "text": {
            "annotations": [],
            "value": "Is there anything else you would like to visualize or any additional features you'd like to add to the sine wave plot?"
          },
          "type": "text"
        }
      ],
      "created_at": 1705967782,
      "file_ids": [],
      "metadata": {},
      "object": "thread.message",
      "role": "assistant",
      "run_id": "run_AGQHJrrfV3eM0eI9T3arKgYY",
      "thread_id": "thread_ow1Yv29ptyVtv7ixbiKZRrHd"
    },
    {
      "id": "msg_oJbUanImBRpRran5HSa4Duy4",
      "assistant_id": "asst_eHwhP4Xnad0bZdJrjHO2hfB4",
      "content": [
        {
          "image_file": {
            "file_id": "assistant-1YGVTvNzc2JXajI5JU9F0HMD"
          },
          "type": "image_file"
        },
        {
          "text": {
            "annotations": [],
            "value": "Here is the visualization of a sine wave: \n\nThe wave is plotted using values from 0 to \\( 4\\pi \\) on the x-axis, and the corresponding sine values on the y-axis. I've also added grid lines for easier reading of the plot."
          },
          "type": "text"
        }
      ],
      "created_at": 1705967044,
      "file_ids": [],
      "metadata": {},
      "object": "thread.message",
      "role": "assistant",
      "run_id": "run_8PsweDFn6gftUd91H87K0Yts",
      "thread_id": "thread_ow1Yv29ptyVtv7ixbiKZRrHd"
    },
    {
      "id": "msg_Pu3eHjM10XIBkwqh7IhnKKdG",
      "assistant_id": null,
      "content": [
        {
          "text": {
            "annotations": [],
            "value": "Create a visualization of a sinewave"
          },
          "type": "text"
        }
      ],
      "created_at": 1705966634,
      "file_ids": [],
      "metadata": {},
      "object": "thread.message",
      "role": "user",
      "run_id": null,
      "thread_id": "thread_ow1Yv29ptyVtv7ixbiKZRrHd"
    }
  ],
  "object": "list",
  "first_id": "msg_KKzOHCArWGvGpuPo0pVZTHgV",
  "last_id": "msg_Pu3eHjM10XIBkwqh7IhnKKdG",
  "has_more": false
}

다음과 같이 새 이미지 파일 ID를 추출하고 이미지를 다운로드하여 표시합니다.

data = json.loads(messages.model_dump_json(indent=2))  # Load JSON data into a Python object
image_file_id = data['data'][0]['content'][0]['image_file']['file_id'] # index numbers can vary if you have had a different conversation over the course of the thread.

print(image_file_id)

content = client.files.content(image_file_id)
image= content.write_to_file("dark_sine.png")

# Display the image in the default image viewer
image = Image.open("dark_sine.png")
image.show()

어둡게 모드에서 사인 웨이브를 생성한 코드 인터프리터의 스크린샷

추가 참조

실행 상태 정의

상태 정의
queued 실행이 처음 만들어지거나 required_action을 완료하면 큐 대기 상태로 바뀝니다. 거의 즉시 in_progress로 전환됩니다.
in_progress in_progress인 동안 도우미는 모델 및 도구를 사용하여 단계를 수행합니다. 실행 단계를 검사하여 실행의 진행 상황을 볼 수 있습니다.
completed 실행이 성공적으로 완료되었습니다. 이제 도우미가 스레드에 추가한 모든 메시지와 실행에서 수행한 모든 단계를 볼 수 있습니다. 또한 스레드에 사용자 메시지를 더 추가하고 또 다른 실행을 만들어 대화를 계속할 수 있습니다.
requires_action 함수 호출 도구를 사용하는 경우 모델이 호출할 함수의 이름과 인수를 결정하면 실행이 required_action 상태로 전환됩니다. 그러면 실행이 진행되기 전에 이러한 함수를 실행하고 출력을 제출해야 합니다. expires_at 타임스탬프가 지나기 전에(만든 후 약 10분) 출력을 제공하지 않으면 실행이 만료됨 상태로 전환됩니다.
expired 이 동작은 expires_at 전에 함수 호출 출력이 제출되지 않고 실행이 만료될 때 발생합니다. 또한 실행이 너무 오래 걸리고 expires_at에 지정된 시간을 초과하면 시스템이 실행을 만료합니다.
cancelling 실행 취소 엔드포인트를 사용하여 in_progress 실행 취소를 시도할 수 있습니다. 취소 시도가 성공하면 실행 상태가 취소됨으로 전환됩니다. 취소 시도가 반드시 성공한다는 보장은 없습니다.
cancelled 실행이 취소되었습니다.
failed 실행에서 last_error 개체를 확인하여 실패 이유를 볼 수 있습니다. 실패의 타임스탬프는 failed_at 아래에 기록됩니다.

메시지 주석

도우미 메시지 주석은 완료 및 채팅 완료 API 응답에 있는 콘텐츠 필터링 주석과 다릅니다. 도우미 주석은 개체의 콘텐츠 배열 내에서 발생할 수 있습니다. 주석은 사용자에게 보내는 응답의 텍스트에 주석을 추가하는 방법에 대한 정보를 제공합니다.

메시지 콘텐츠 배열에 주석이 있으면 텍스트에 읽을 수 없는 모델 생성 부분 문자열이 있는데, 이 부분을 올바른 주석으로 바꿔야 합니다. 이러한 문자열은 【13†source】 또는 sandbox:/mnt/data/file.csv와 같은 형태입니다. 다음은 이러한 문자열을 주석에 있는 정보로 바꾸는 OpenAI의 Python 코드 조각입니다.


from openai import AzureOpenAI
    
client = AzureOpenAI(
    api_key=os.getenv("AZURE_OPENAI_API_KEY"),  
    api_version="2024-05-01-preview",
    azure_endpoint = os.getenv("AZURE_OPENAI_ENDPOINT")
    )

# Retrieve the message object
message = client.beta.threads.messages.retrieve(
  thread_id="...",
  message_id="..."
)

# Extract the message content
message_content = message.content[0].text
annotations = message_content.annotations
citations = []

# Iterate over the annotations and add footnotes
for index, annotation in enumerate(annotations):
    # Replace the text with a footnote
    message_content.value = message_content.value.replace(annotation.text, f' [{index}]')

    # Gather citations based on annotation attributes
    if (file_citation := getattr(annotation, 'file_citation', None)):
        cited_file = client.files.retrieve(file_citation.file_id)
        citations.append(f'[{index}] {file_citation.quote} from {cited_file.filename}')
    elif (file_path := getattr(annotation, 'file_path', None)):
        cited_file = client.files.retrieve(file_path.file_id)
        citations.append(f'[{index}] Click <here> to download {cited_file.filename}')
        # Note: File download functionality not implemented above for brevity

# Add footnotes to the end of the message before displaying to user
message_content.value += '\n' + '\n'.join(citations)

메시지 주석 설명
file_citation 파일 인용은 검색 도구를 통해 만들어지며, 도우미가 응답을 생성하기 위해 업로드하고 사용한 특정 파일의 특정 견적에 대한 참조를 정의합니다.
file_path 파일 경로 주석은 code_interpreter 도구를 통해 만들어지며, 도구에서 만든 파일에 대한 참조를 포함합니다.

참고 항목