OpenAI Assistants API入門:AIアシスタント開発の決定版ガイド

「自社データを検索してコードも実行するAIアシスタント」が数十行で作れる時代です。OpenAI Assistants APIの仕組みと、2026年最新の実装方法を解説します。

AI初心者

AIを知りたい

OpenAIのAssistants APIって普通のChat Completions APIと何が違うんですか?

AIエンジニア

AIエンジニア

大きな違いは状態管理とツール実行をAPI側が行ってくれることです。会話の履歴管理やファイル検索、コード実行をOpenAI側で自動的に処理してくれます。

AI初心者

AIを知りたい

自分で管理しなくていいんですか?

AIエンジニア

AIエンジニア

そうです!Chat Completionsでは会話履歴やツール呼び出しを自分で管理する必要がありますが、Assistants APIではそれらをOpenAIのサーバーが管理してくれます。

Assistants APIとは

OpenAI Assistants APIとは、AIアシスタントの構築を簡素化するAPIです。スレッド(会話履歴)管理、ファイル検索(RAG)、コード実行、関数呼び出しなどの機能を提供し、開発者はビジネスロジックに集中できます。

Assistants APIの基本概念

AI初心者

AIを知りたい

Assistants APIの基本的な仕組みを教えてください!

AIエンジニア

AIエンジニア

4つの重要な概念があります。

概念 説明 役割
Assistant AIアシスタントの定義 モデル・ツール・指示の設定
Thread 会話スレッド メッセージ履歴の管理
Message 個別のメッセージ ユーザーとAIの発言
Run 実行リクエスト Assistantにスレッドを処理させる

Assistants APIの実装方法

AI初心者

AIを知りたい

実際のコードを見せてください!

AIエンジニア

AIエンジニア

Python SDKを使った実装例です。

from openai import OpenAI
client = OpenAI()

# 1. Assistantの作成
assistant = client.beta.assistants.create(
    name="データ分析アシスタント",
    instructions="あなたはデータ分析の専門家です。",
    model="gpt-4o",
    tools=[
        {"type": "code_interpreter"},
        {"type": "file_search"}
    ]
)

# 2. スレッドの作成
thread = client.beta.threads.create()

# 3. メッセージの追加
message = client.beta.threads.messages.create(
    thread_id=thread.id,
    role="user",
    content="売上データを分析してトレンドを教えてください"
)

# 4. 実行(ストリーミング)
with client.beta.threads.runs.stream(
    thread_id=thread.id,
    assistant_id=assistant.id,
) as stream:
    for text in stream.text_deltas:
        print(text, end="", flush=True)

ファイル検索(RAG)の実装

AI初心者

AIを知りたい

ファイルを渡して質問に答えさせることもできるんですか?

AIエンジニア

AIエンジニア

はい!File Search機能でRAGが簡単に実装できます。PDFやテキストファイルをアップロードするだけです。

# ベクトルストアの作成
vector_store = client.beta.vector_stores.create(
    name="社内ドキュメント"
)

# ファイルのアップロード
file = client.files.create(
    file=open("manual.pdf", "rb"),
    purpose="assistants"
)

# ベクトルストアにファイルを追加
client.beta.vector_stores.files.create(
    vector_store_id=vector_store.id,
    file_id=file.id
)

# Assistantにベクトルストアを紐付け
assistant = client.beta.assistants.update(
    assistant.id,
    tool_resources={
        "file_search": {
            "vector_store_ids": [vector_store.id]
        }
    }
)

Chat Completions API vs Assistants API

AI初心者

AIを知りたい

結局どっちを使えばいいんですか?

AIエンジニア

AIエンジニア

用途によって使い分けましょう。

観点 Chat Completions Assistants API
会話管理 自前で実装 API側で管理
ファイル検索 自前でRAG構築 File Search組み込み
コード実行 非対応 Code Interpreter対応
柔軟性 高い 中程度
コスト トークンのみ トークン+ストレージ
おすすめ シンプルなチャット 複雑なアシスタント、RAG

AI初心者

AIを知りたい

用途に合わせて選べばいいんですね!

AIエンジニア

AIエンジニア

その通りです。会話の状態管理やRAGが必要ならAssistants API、シンプルなAPI呼び出しならChat Completionsを選びましょう。まずはPlaygroundで試してみるのがおすすめですよ!

関連記事

OpenAI Assistants APIの基本フロー:Assistant作成からThread・Run実行まで

Assistants APIを使ってステートフルな会話エージェントを構築する基本フローを実装します。Assistant定義 → Thread作成 → Message追加 → Run実行 → 結果取得という一連のステップを確認しましょう。


from openai import OpenAI
import time

client = OpenAI()

# ステップ1: Assistantの作成(ツール付き)
assistant = client.beta.assistants.create(
    name="Data Analysis Helper",
    instructions="""あなたはデータ分析の専門家です。
ユーザーの質問に対して、分かりやすく丁寧に回答してください。
必要に応じてCode Interpreterを使い、計算やグラフ生成を行ってください。
回答は日本語でお願いします。""",
    model="gpt-4o",
    tools=[{"type": "code_interpreter"}]
)
print(f"Assistant作成完了: {assistant.id}")

# ステップ2: Threadの作成(会話セッション)
thread = client.beta.threads.create()
print(f"Thread作成完了: {thread.id}")

# ステップ3: Messageの追加
message = client.beta.threads.messages.create(
    thread_id=thread.id,
    role="user",
    content="1から100までの素数を列挙し、その個数と合計を教えてください。"
)
print(f"Message追加完了: {message.id}")

# ステップ4: Runの実行
run = client.beta.threads.runs.create(
    thread_id=thread.id,
    assistant_id=assistant.id
)
print(f"Run開始: {run.id} (status={run.status})")

# ステップ5: Run完了をポーリングで待機
while run.status in ["queued", "in_progress"]:
    time.sleep(1)
    run = client.beta.threads.runs.retrieve(
        thread_id=thread.id,
        run_id=run.id
    )
    print(f"  status: {run.status}")

if run.status == "completed":
    # ステップ6: Assistantの応答メッセージを取得
    messages = client.beta.threads.messages.list(thread_id=thread.id)
    for msg in reversed(messages.data):
        role = msg.role
        for block in msg.content:
            if block.type == "text":
                print(f"\n[{role}] {block.text.value}")
elif run.status == "failed":
    print(f"Run失敗: {run.last_error}")

# 後続メッセージの追加(同一Thread内で会話継続)
follow_up = client.beta.threads.messages.create(
    thread_id=thread.id,
    role="user",
    content="その素数をヒストグラムで可視化してください。"
)
run2 = client.beta.threads.runs.create(
    thread_id=thread.id,
    assistant_id=assistant.id
)
while run2.status in ["queued", "in_progress"]:
    time.sleep(1)
    run2 = client.beta.threads.runs.retrieve(
        thread_id=thread.id, run_id=run2.id
    )
print(f"\nFollow-up完了: status={run2.status}")

# クリーンアップ(不要になったAssistantを削除)
client.beta.assistants.delete(assistant.id)
print("Assistant削除完了")

Assistants APIのポイントは3つあります。第一に、Threadが会話状態を保持するため、開発者側でメッセージ履歴を管理する必要がなく、follow-upメッセージを追加するだけで文脈を維持した会話が継続できます。第二に、Code Interpreterツールを有効にすることで、Assistantが自律的にPythonコードを実行して計算やグラフ生成を行えるため、データ分析ユースケースに強力です。第三に、Runは非同期で実行されるため、ポーリングまたはストリーミングで完了を検知する設計が必要です。本番環境ではclient.beta.threads.runs.create_and_poll()を使うとポーリングコードを簡略化できます。