ユーザーエクスペリエンスの向上:インタラクティブなチャットボットにOpenAIアシスタントAPIを実装する
美容とファッション業界の向上:OpenAIアシスタントAPIを活用したインタラクティブなチャットボットの導入
イントロダクション
OpenAIによるChatGPTとGPT 3モデルの導入により、世界はAIを統合したアプリケーションの使用にシフトしました。私たちが日常的に使用しているすべてのアプリケーション、電子商取引から銀行のアプリケーションまで、AIはアプリケーションのいくつかの部分、特に大規模な言語モデルを組み込んでいます。その中の1つがOpenAIアシスタントAPIであり、チャットボットと呼ばれます。OpenAIは最近、ユーザーエクスペリエンスを向上させるために設計されたベータ版のアシスタントAPIをリリースしました。
学習目標
- 特定の指示を持つ目的に特化したAIアシスタントの作成プロセスを学ぶ。
- アシスタントAPIにおける永続性と無限に長いスレッドの概念を探求する。
- OpenAIライブラリを使用してAIアシスタントを作成し、名前、指示、モデル、ツールなどのパラメータを指定する方法を実演する。
- 特定のスレッドでAIアシスタントを実行するためのランの作成プロセスを学ぶ。
- 言語モデルトークン、コードインタプリタセッション、およびリトリーバルツールの使用などの要素を考慮したアシスタントAPIの価格体系を理解する。
この記事はデータサイエンスブログアソンの一環として公開されました。
アシスタントAPIとは何か?何ができるのか?
OpenAIは最近、ベータ版のアシスタントAPIを発表しました。このAPIを使用すると、OpenAIの大規模な言語モデルとツールを使用してAIアシスタントを構築および統合することができます。企業はこれらのアシスタントを特定の目的に合わせてカスタマイズし、その特定の用途のための関連データを提供します。このアシスタントの例としては、天気情報を提供するAI天気アシスタントや、旅行に関するクエリに答えるAIトラベルアシスタントなどがあります。
これらのアシスタントは状態を保持するように設計されています。つまり、以前の会話を大部分で保持し、開発者が状態管理を心配する必要がなくなります(それをOpenAIに任せます)。典型的な流れは以下の通りです:
- アシスタントの作成:データの選択、使用するモデル、アシスタントへの指示、使用するツールを選択します。
- 次に、スレッドを作成します。スレッドはユーザーのメッセージとLLM(Large Language Models)の返信を保存します。このスレッドはアシスタントの状態を管理し、OpenAIがそれに対応します。
- スレッドにメッセージを追加します。これはユーザーがAIアシスタントに入力するメッセージやアシスタントの応答です。
- 最後に、そのスレッド上でアシスタントを実行します。スレッド上のメッセージに基づいて、AIアシスタントは適切な応答を提供するためにOpenAI LLMを呼び出し、次のセクションで説明する一部のツールにも連絡する場合があります。
これらのアシスタント、スレッド、メッセージ、およびランはアシスタントAPIにおけるオブジェクトと呼ばれます。これらのオブジェクトに加えて、アシスタントが実行中に実行された詳細なステップを提供するRun Stepという別のオブジェクトもあります。これにより、内部の機能に関する洞察が提供されます。
ツール – アシスタントAPIのアーセナル
私たちは常にツールという言葉を使っていますが、OpenAIアシスタントAPIとは何の関係があるのでしょうか?ツールは、アシスタントAPIが追加のタスクを実行するための武器のようなものです。これにはKnowledge RetrievalやCode InterpreterなどのOpenAIホストされたツールが含まれます。また、この記事ではカスタムツールの定義については説明しませんが、Function Callingを使用して独自のツールを定義することもできます。
では、残りのツールについて詳しく見ていきましょう。
- コードインタプリタ: これは、独自のPythonスクリプトを実行するための環境を提供する、サンドボックス化されたPythonコードの解釈機能です。データ分析などのシナリオで役立ち、アシスタントがCSVデータを分析するためのコードを生成し、実行してユーザーに応答することができます。
- Function Calling: 開発者はカスタムツールを定義することができ、これらのツールとその出力を利用してアシスタントが反復的に応答を構築することができます。
- Retrieval: AIアシスタントにとって必要不可欠で、データの解析を行います。たとえば、製品のためのアシスタントを作成する際には、関連する情報をチャンクに分割し、埋め込み、ベクトルストアに格納します。ユーザーのクエリに応答する際に、アシスタントはこのデータを知識ベースから取得します。
アシスタントの構築
このセクションでは、アシスタントの作成、スレッドへのメッセージの追加、およびそのスレッド上でのアシスタントの実行について説明します。まず、OpenAIライブラリをダウンロードします。
# Assistants APIを含むopenaiライブラリをインストールします!pip install openai
最新バージョン(この記事作成時の最新バージョンはv.1.2.3です)を使用していることを確認してください。まず、クライアントを作成します。
< pre># 環境変数を読み込むためのosライブラリのインポートimport os# Assistants APIと対話するためのopenaiライブラリのインポートfrom openai import OpenAI# OPENAI APIキーを環境変数に格納os.environ["OPENAI_API_KEY"] = "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"# APIキーを指定してOpenAIクライアントを作成client = OpenAI(api_key = os.environ['OPENAI_API_KEY'])
アシスタントの作成
openaiライブラリからOpenAIクラスをインポートします。そして、OpenAI APIトークンを環境変数に格納します。そして、変数api_keyを使用してOpenAIクラスのインスタンスを作成します。client変数はOpenAIクラスのインスタンスです。今度はアシスタントを作成する時です。
< pre># アシスタントを作成しますassistant = client.beta.assistants.create( name="PostgreSQL Expret", instructions="あなたはPostgreSQLの専門家であり、例を使って簡単な方法で任意の質問に答えることができます", model="gpt-4-1106-preview", tools=[{"type":"retrieval"}])
< ul>
ドキュメントをロードする
したがって、アシスタントを作成し、assistant変数に割り当てました。次のステップはドキュメントを読み込むことです。
< pre># ファイルをアップロードしますfile = client.files.create( file=open( "/content/LearnPostgres.pdf", "rb", ), purpose="assistants",)# アシスタントを更新しますassistant = client.beta.assistants.update( assistant.id, file_ids=[file.id],)
< ul>
アシスタントの構成にリトリーバルツールを含めたため、LearnPostres.pdfをチャンキングし、埋め込みに変換し、関連する情報を取得する処理が行われます。
スレッドの作成とメッセージの保存
このセクションでは、スレッドを作成し、メッセージを追加します。まず、新しいスレッドを作成します。
# スレッドを作成するthread = client.beta.threads.create()
threads クラスの create() メソッドは、スレッドを作成するために使用されます。スレッドは会話のセッションを表します。 assistants と同様に、スレッドオブジェクトにも固有のIDが関連付けられます。また、スレッドにはアシスタントIDを渡していないことに注意してください。これは、スレッドが分離されてアシスタントとは関連付けられていないことを意味しています。さて、新しく作成したスレッドにメッセージを追加しましょう。
# スレッドに最初のメッセージを追加するmessage = client.beta.threads.messages.create( thread_id=thread.id, role="user", content="PostgreSQLでテーブルを作成する方法")
- メッセージはユーザーのクエリとレスポンスを含む会話のブロックです。スレッドにメッセージを追加するには、 messages クラスの create() メソッドを使用し、次のパラメータを指定します。
- thread_id: 作成した各スレッドに関連付けられた固有のIDです。ここでは、以前に開始したスレッドのIDを渡します。
- role: このメッセージの送信者は誰ですか?この例では、ユーザーです。
- content: ユーザーのクエリです。この例では、“PostgreSQLでテーブルを作成する方法” を指定します。
アシスタントの実行
さて、アシスタントを実行するために、アシスタントが実行されるスレッドを指定して Run を作成します。
# Runを作成するrun = client.beta.threads.runs.create( thread_id=thread.id, assistant_id=assistant.id)
- Runを作成するには、runs クラスの create() メソッドを使用します。スレッドID(つまり、アシスタントを実行するスレッド)とアシスタントID(つまり、実行するアシスタント)を run 変数に渡します。
- Runの作成はレスポンスを生成しません。代わりに、Runが完了するまで待機する必要があります。Runは非同期タスクとして考えることができ、Runが実行を終了したかどうかをポーリングする必要があります。
関数の作成
オブジェクトには、特定の Run が 待機中 / 進行中 / 完了しているかどうかを示す status という変数があります。そのため、以下の関数を作成します。
import time# Runが完了したかどうかをチェックするための関数を作成するdef poll_run(run, thread): while run.status != "completed": run = client.beta.threads.runs.retrieve( thread_id=thread.id, run_id=run.id, ) time.sleep(0.5) return run # 完了するまで待機するrun = poll_run(run, thread)
- ここでは、poll_run() という関数を作成します。この関数は以前に作成した Run と Thread オブジェクトを受け取ります。
- Runの status が “completed” になると、Runが処理されたと言われます。そのため、Runが完了したかどうかをループでチェックするために run をポーリングします。
- このループでは、 runs クラスの retrieve() メソッドを呼び出し、RunのIDとThreadのIDを渡します。retrieveメソッドは、更新された status を持つ同じRunオブジェクトを返します。
- 完了状態が更新されているかどうかを確認し、Runオブジェクトを0.5秒ごとに取得して完了をポーリングします。
- Runの status が完了になった場合、Runを返します。
この Run ステップでは、作成したアシスタントは、指定したモデルの利用可能なデータコールからユーザーのクエリに関連する関連情報を取得するためにリトリーバルツールを利用し、応答を生成します。この生成された応答はスレッドに保存されます。さて、スレッドには2つのメッセージがあります。1つはユーザーのクエリで、もう1つはアシスタントの応答です。
スレッド内にメッセージを保存する方法
まず、スレッドに保存されたメッセージを取得しましょう。
# メッセージを抽出するmessages = client.beta.threads.messages.list(thread_id=thread.id)for m in messages: print(f"{m.role}: {m.content[0].text.value}")
- 最初のステップでは、messagesクラスのlist()メソッドを呼び出してスレッド内のすべてのメッセージを抽出します。抽出するために、スレッドのIDを渡します
- 次に、リスト内のすべてのメッセージをループで処理し、出力します。スレッドにアップロードしたメッセージやアシスタントが生成したメッセージは、メッセージオブジェクトのmessage.content[0].text.valueに保存されます
上記のイメージでは、トップにはアシスタントの応答、ボトムにはユーザーのクエリが表示されています。さて、2番目のメッセージを入力して、アシスタントが前回の会話にアクセスできるかテストしましょう。
# 2番目のメッセージを作成するmessage2 = client.beta.threads.messages.create( thread_id=thread.id, role="user", content="作成したテーブルに値を追加してください")# ルンオブジェクトを作成するrun = client.beta.threads.runs.create( thread_id=thread.id, assistant_id=assistant.id)# Runメソッドの完了を待つrun = poll_run(run, thread)# メッセージを抽出するmessages = client.beta.threads.messages.list(thread_id=thread.id)for m in messages: print(f"{m.role}: {m.content[0].text.value}")
- ここでは、message2という別のメッセージを作成し、今回はクエリ「作成したテーブルに値を追加してください」を渡しています。このクエリは前回の会話を参照しており、そのためにスレッドに渡されます。
- その後、Runを作成し、アシスタントと共に実行し、ポーリングします。
最後に、スレッドからすべてのメッセージを取得し、出力します。
アシスタントは確かに前回の会話から情報にアクセスし、検索ツールを使用して提供されたクエリに対する応答を生成することができました。したがって、OpenAIアシスタントAPIを使用することで、カスタムアシスタントを作成し、それをアプリケーション内の任意の形式に統合することができます。OpenAIでは、アシスタントAPIが使用できる多くのツールをリリースする予定もあります。
アシスタントAPIの料金設定
アシスタントAPIの料金は、選択したモデルと使用するツールに基づいて請求されます。検索やコード解釈などのツールにはそれぞれ独自のコストがあります。モデルについては、OpenAIの各モデルには、入力に使用するトークンの数と生成される出力トークンの数に基づいて独自のコストがあります。モデルの価格については、こちらでOpenAIのLarge Language Modelの価格をチェックしてください。
コード解釈に関しては、セッションごとに$0.03の料金がかかり、デフォルトでは1時間の有効なセッションです。セッションはスレッドに関連付けられるため、実行中のスレッドがN個ある場合、料金はN * $0.03になります。
一方、検索はアシスタントごとにGBあたり$0.20の価格で提供されます。N個のアシスタントがこのツールにアクセスする場合、価格はN * $0.2 / Dayとなります。スレッドの数は検索の価格には影響しません。
データプライバシーと倫理的な懸念事項
倫理的な懸念事項とユーザーデータの使用に関して、OpenAIはデータプライバシーを最優先に考えています。ユーザーはOpenAI APIに送信されたデータとそれから受け取ったデータの唯一の所有者です。また、OpenAIはユーザーデータでトレーニングを行わず、データの保存期間はユーザーの制御下にあります。また、OpenAIでトレーニングされたカスタムモデルもそれを作成したユーザーにのみ属しています。
OpenAIは厳格なコンプライアンスを遵守しています。データの暗号化はリスト(AES-256)および転送(TLS 1.2+)中に有効にしています。OpenAIはSOC 2コンプライアンスに対して監査されています。これは、OpenAIがデータのプライバシーとセキュリティに厳格な取り組みを行っていることを意味します。OpenAIは組織内でデータにアクセスできる人を厳密に管理します。
結論
OpenAI Assistants APIは、AIアシスタントをアプリケーションに作成および統合するための新しいアプローチを提供しています。これらは、特定の目的/タスクに対処するために開発されたアシスタントです。このAPIの機能とツール、コードインタプリタ、リトリーバル、カスタムツールの作成などを探求すると、開発者が強力なアーセナルを手に入れたことが明らかになります。アシスタントの持続的な性質は、スレッドを介してシームレスに管理され、開発者に負担を軽減し、個別のAI体験の作成に集中することを可能にします。
キーポイント
- Assistants APIを使用すると、特定のタスクに合わせた目的のために作られたAIアシスタントの開発が可能です。
- Code InterpreterやRetrievalなどのツールを含めることで、AIアシスタントが実現できる範囲が広がります。カスタムPythonコードの実行から外部知識へのアクセスまで。
- APIは持続的かつ無限長のスレッドを導入し、状態管理を簡素化し、開発者に柔軟性を提供します。
- スレッドとアシスタントは分離されており、開発者は複製されたスレッドを利用したり、他のアシスタントを実行したりすることができます。
- 関数呼び出しツールを使用することで、アシスタントが応答生成プロセスで使用できるカスタムツールを開発者が利用できます。
よくある質問
参考文献
OpenAI Assistants APIの公式ドキュメンテーションは以下の通りです
- https://platform.openai.com/docs/assistants/overview
- https://platform.openai.com/docs/api-reference/assistants
この記事に表示されるメディアはAnalytics Vidhyaの所有ではなく、著者の裁量によって使用されています。
We will continue to update VoAGI; if you have any questions or suggestions, please contact us!
Was this article helpful?
93 out of 132 found this helpful
Related articles