Megosztás a következőn keresztül:


Az Azure OpenAI Assistants használatának első lépései (előzetes verzió)

Az Azure OpenAI segédek (előzetes verzió) lehetővé teszik az Ön igényeinek megfelelő AI-segédek létrehozását egyéni utasítások útján, speciális eszközökkel, mint például kódértelmezőkkel és egyéni funkciókkal kiegészítve. Ebben a cikkben részletesen bemutatjuk az Assistants API használatának első lépéseit.

Feljegyzés

  • A fájlkeresés asszisztensenként akár 10 000 fájlt is betölthet – 500-szor több, mint korábban. Gyors, többszálas keresésekkel támogatja a párhuzamos lekérdezéseket, és továbbfejlesztett újraírást és lekérdezés-újraírást is kínál.
    • A vektortároló egy új objektum az API-ban. Miután hozzáadtak egy fájlt egy vektortárolóhoz, a rendszer automatikusan elemzi, darabolja és beágyazja, és készen áll a keresésre. A vektortárolók asszisztensek és szálak között is használhatók, így egyszerűbbé teheti a fájlkezelést és a számlázást.
  • Hozzáadtuk a tool_choice paraméter támogatását, amely egy adott eszköz (például fájlkeresés, kódértelmező vagy függvény) egy adott futtatáshoz való kényszerítésére használható.

Asszisztensek támogatása

Régió- és modelltámogatás

A kódértelmező az Azure OpenAI Assistants által támogatott összes régióban elérhető. A modellek lap a legfrissebb információkat tartalmazza azokról a régiókról/modellekről, amelyekben az Asszisztensek jelenleg támogatottak.

API-verziók

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

Támogatott fájltípusok

Fájlformátum MIME-típus Kódértelmező
c. szöveg/x-c
.Cpp szöveg/x-c++
.csv alkalmazás/csv
.docx application/vnd.openxmlformats-officedocument.wordprocessingml.document
.html szöveg/html
.java text/x-java
.json application/json
.md szöveg/markdown
.pdf alkalmazás/pdf
.php text/x-php
.pptx application/vnd.openxmlformats-officedocument.presentationml.presentation
.py szöveg/x-python
.py text/x-script.python
.rb szöveg/x-ruby
.Tex szöveg/x-tex
.txt text/plain
.Css szöveg/css
.jpeg kép/jpeg
.jpg kép/jpeg
.js text/javascript
.gif kép/gif
.png kép/png
.kátrány alkalmazás/x-tar
.Ts application/typescript
.xlsx application/vnd.openxmlformats-officedocument.spreadsheetml.sheet
.xml application/xml vagy "text/xml"
.zip alkalmazás/zip

Eszközök

Tipp.

Hozzáadtuk a tool_choice paraméter támogatását, amellyel kényszeríthető egy adott eszköz (például file_search, code_interpretervagy a function) használata egy adott futtatásban.

Az egyéni asszisztensek legfeljebb 128 eszközt érhetnek el, beleértve a kódértelmeztetőt és a fájlkeresést, de saját egyéni eszközöket is meghatározhat függvényekkel.

Fájlok

A fájlok feltölthetők a Studióban vagy programozott módon. A file_ids paraméter olyan eszközökhöz szükséges, mint a code_interpreter fájlokhoz való hozzáférés. A Fájlfeltöltési végpont használatakor a purpose Assistants API-val használandó asszisztensek beállításával kell rendelkeznie.

Asszisztensek játszótér

Rövid útmutatónkban bemutatjuk az Asszisztensek játszóteret. Ez kód nélküli környezetet biztosít az asszisztensek képességeinek teszteléséhez.

Asszisztensek összetevői

Komponens Leírás
Asszisztens Az Azure OpenAI-modelleket eszközökkel együtt használó egyéni AI.
Fonál Beszélgetési munkamenet egy asszisztens és egy felhasználó között. A szálak tárolják az üzeneteket, és automatikusan kezelik a csonkolást, hogy a tartalom illeszkedjen a modell környezetébe.
Üzenet Segéd vagy felhasználó által létrehozott üzenet. Az üzenetek tartalmazhatnak szöveget, képeket és más fájlokat. Az üzenetek listaként vannak tárolva a szálon.
Fut Egy asszisztens aktiválása a szál tartalma alapján történő futtatás megkezdéséhez. Az asszisztens a konfigurációjával és a szál üzeneteivel hajtja végre a feladatokat modellek és eszközök meghívásával. A Futtatás részeként a segéd hozzáfűzi az üzeneteket a szálhoz.
Futtatási lépés Az Asszisztens által a futtatás részeként végrehajtott lépések részletes listája. A segédek meghívhatnak eszközöket, vagy létrehozhatnak üzeneteket a futtatás során. A futtatási lépések megvizsgálásával megtudhatja, hogyan jut el a segéd a végső eredményekhez.

Az első asszisztens beállítása

Segéd létrehozása

Ebben a példában létrehozunk egy segédet, amely kódot ír, hogy vizualizációkat hozzon létre az code_interpreter eszköz képességeivel. Az alábbi példák célja, hogy egymás után fussanak egy olyan környezetben, mint a Jupyter Notebooks.

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.
)

A fenti konfigurációban néhány részletet érdemes megjegyeznie:

  • Lehetővé tesszük, hogy ez az asszisztens hozzáférjen a kódértelmezőhöz a vonallal tools=[{"type": "code_interpreter"}],. Ez hozzáférést ad a modellnek egy tesztkörnyezethez, amellyel kódokat futtathat és futtathat, amelyek segítenek a felhasználó kérdésére adott válaszok megfogalmazásában.
  • Az utasításokban emlékeztetjük a modellt, hogy képes a kód végrehajtására. Néha a modellnek segítségre van szüksége ahhoz, hogy egy adott lekérdezés megoldásához a megfelelő eszköz felé irányozza. Ha tudja, hogy egy adott kódtárat szeretne használni egy bizonyos válasz létrehozásához, amelyről tudja, hogy a kódértelmező része, segíthet útmutatást nyújtani a következőhöz hasonló szöveggel: "A Matplotlib használata x-hez".
  • Mivel ez az Azure OpenAI, a megadott értéknek model= meg kell egyeznie az üzembe helyezés nevével.

Ezután kinyomtatjuk az imént létrehozott asszisztens tartalmát, hogy meggyőződjön arról, hogy a létrehozás sikeres volt:

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"
    }
  ]
}

Szál létrehozása

Most hozzunk létre egy szálat.

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

A szál lényegében az asszisztens és a felhasználó közötti beszélgetési munkamenet rekordja. Ez hasonló egy tipikus csevegővégzítési API-hívás üzenettömbjeihez/listájához. Az egyik legfontosabb különbség, amely ellentétben áll a csevegés befejező üzenettömbjével, nem kell minden hívással nyomon követnie a jogkivonatokat, hogy biztosan a modell környezeti hossza alatt maradjon. A szálak elvonják ezt a felügyeleti részletet, és szükség szerint tömörítik a szálak előzményeit, hogy a beszélgetés folytatódhasson. A szálak nagyobb beszélgetésekkel való elérésének képessége a legújabb modellek használatakor javul, amelyek nagyobb környezeti hosszokkal rendelkeznek, és támogatják a legújabb funkciókat.

Ezután hozza létre az első, a szálhoz hozzáadni kívánt felhasználói kérdést.

# 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"
)

Szálüzenetek listázása

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
}

Szál futtatása

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
)

Itt is megadhatunk egy paramétert instructions , de ez felülírná az asszisztens számára már megadott utasításokat.

Szál állapotának lekérése

# 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

A futtatott lekérdezés összetettségétől függően a szál végrehajtása hosszabb időt is igénybe vehet. Ebben az esetben létrehozhat egy hurkot a szál futási állapotának figyeléséhez az alábbi példához hasonló kóddal:

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))

Ha egy futtatás vagy más nemtermi állapotban van in_progress , a szál zárolva van. Ha egy szál zárolva van, nem adhatók hozzá új üzenetek, és nem hozhatók létre új futtatások.

Szálüzenetek listázása a futtatás után

Ha a futtatási állapot sikeres befejezést jelez, a modell és az eszközök válaszának lekéréséhez ismét listázhatja a szál tartalmát:

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
}

Fájlazonosító lekérése

Kértük, hogy a modell hozzon létre egy szinuszhullámot ábrázoló képet. A kép letöltéséhez először le kell kérnünk a képfájl azonosítóját.

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

Rendszerkép letöltése

content = client.files.content(image_file_id)

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

A letöltés után nyissa meg helyileg a képet:

from PIL import Image

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

Képernyőkép a kódértelmező által generált szinuszhullámról.

Tegye fel a következő kérdést a szálon

Mivel az asszisztens nem követte az utasításokat, és a válasz szövegrészében futtatott kódot is belefoglalta, lehetővé teszi, hogy explicit módon kérje ezeket az információkat.

# 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"
)

Ismét le kell futtatnunk és le kell kérnünk a szál állapotát:

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

A futtatási állapot befejeződése után ismét listázzuk a szálban lévő üzeneteket, amelyeknek tartalmazniuk kell a legújabb kérdésre adott választ.

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
}

Ha csak a legújabb kérdésre adott választ szeretné kinyerni:

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

Természetesen itt van a kód, amelyet a szinuszhullám-vizualizáció létrehozásához használtam:

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()

Sötét mód

Adjunk hozzá egy utolsó kérdést a szálhoz, és nézzük meg, hogy a kódértelmező fel tudja-e cserélni a diagramot sötét módra.

# 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
}

Bontsa ki az új képfájl azonosítóját, töltse le és jelenítse meg a képet:

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()

Képernyőkép a kódértelmező által létrehozott szinuszhullámról sötét módban.

További referenciák

Állapotdefiníciók futtatása

Állapot Definíció
queued A futtatások első létrehozásakor vagy a required_action befejezésekor a rendszer áthelyezi őket egy várólistán lévő állapotba. Szinte azonnal át kell lépniük in_progress.
in_progress Míg in_progress, az asszisztens a modell és az eszközök használatával hajtja végre a lépéseket. A futtatás folyamatának előrehaladását a futtatási lépések vizsgálatával tekintheti meg.
completed A futtatás sikeresen befejeződött! Mostantól megtekintheti a szálhoz hozzáadott összes üzenetet, valamint a futtatás során végrehajtott összes lépést. A beszélgetést úgy is folytathatja, hogy további felhasználói üzeneteket ad hozzá a szálhoz, és létrehoz egy másik Futtatás parancsot.
requires_action A Függvényhívó eszköz használatakor a Futtatás required_action állapotba kerül, miután a modell meghatározza a meghívandó függvények nevét és argumentumait. Ezután futtatnia kell ezeket a függvényeket, és el kell küldenie a kimeneteket a futtatás folytatása előtt. Ha a kimenetek nem jelennek meg a expires_at időbélyeg lejárta előtt (nagyjából 10 perccel a korábbi létrehozás után), a futtatás lejárt állapotba kerül.
expired Ez akkor fordul elő, ha a függvény meghívja a kimeneteket, mielőtt expires_at, és a futtatás lejár. Továbbá, ha a futtatások végrehajtása túl sokáig tart, és túllépi a expires_at megadott időt, a rendszereink lejárnak a futtatás során.
cancelling Megpróbálhat megszakítani egy in_progress futtatás megszakítását a Futtatás megszakítása végponttal. Miután a megszakítási kísérlet sikeres volt, a Futtatás állapota megszakítva lesz. A lemondás megkísérlése megkísérlése, de nem garantált.
cancelled A futtatás sikeresen megszakadt.
failed A hiba okát a Futtatásban lévő objektum megtekintésével last_error tekintheti meg. A hiba időbélyege a failed_at alatt lesz rögzítve.

Üzenetjegyzetek

A segédüzenetek széljegyzetei eltérnek a tartalomszűrési széljegyzetektől, amelyek a befejezéskor és a csevegés befejezésére vonatkozó API-válaszokban szerepelnek. A segédjegyzetek az objektum tartalomtömbén belül is előfordulhatnak. A széljegyzetek arról nyújtanak információt, hogyan kell jegyzetelni a szöveget a felhasználónak adott válaszokban.

Ha széljegyzetek jelennek meg az Üzenet tartalomtömbjében, a megfelelő széljegyzetekre cserélendő szövegben a modell által létrehozott olvashatatlan részszűkítések jelennek meg. Ezek a sztringek a következőképpen 【13†source】 nézhetnek ki: vagy sandbox:/mnt/data/file.csv. Íme egy Python-kódrészlet az OpenAI-ból, amely lecseréli ezeket a sztringeket a széljegyzetekben található információkra.


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)

Üzenet széljegyzete Leírás
file_citation A fájl idézeteit a lekérési eszköz hozza létre, és egy adott fájlban lévő adott idézetre mutató hivatkozásokat határoz meg, amelyeket az Asszisztens feltöltött és használt a válasz létrehozásához.
file_path A fájl elérési útjának megjegyzéseit az code_interpreter eszköz hozza létre, és az eszköz által létrehozott fájlokra mutató hivatkozásokat tartalmaz.

Lásd még