はじめに
- 本記事では、Dataiku上にOpenAI APIを使用してrecipeを作成するための環境構築方法を紹介します。
- Dataiku で用意された「OpenAI GPT(リンク)」というプラグインを使用することで、直ぐにChatGPT/GPTの機能を使うことができます。
- しかし、今回はプラグインを用いずにOpenAI APIを呼び出すためのpython環境構築を行いました。python環境構築ができると、必要に応じて柔軟な処理を行うことができるようになり、作業の幅が広がります。
- 実行例として、OpenAI API で提供されているfunction calling(リンク)という機能を用いて json 形式で文章分類の結果を取得するrecipe 例を作成しました。
目次
- 概要
- 実行環境
- python 環境の構築
- recipe 作成時の設定
- OpenAI API を用いてた recipe の実例
- まとめ
1. 概要
テキスト データは豊富な情報を持っていますが、そのままでは定量分析に用いるのが難しいため、自然言語処理で情報(分類、感情分析など)を抽出して定量化を行う必要があります。その処理用に様々な機械学習のモデルが開発されてきました。しかしChatGPT/GPTではプロンプトを変えることにより単一モデルで様々な自然言語処理を行うことが可能となるため、実装の手間を大幅に減らすことができます。このようにChatGPT/GPTを用いることでテキスト データを定量分析に使う敷居を大幅に下げることができると考えています。
Dataikuには「OpenAI GPT(リンク)」というプラグインが用意されており、それを用いて直ぐにChatGPT/GPTの機能を使うことができます。
しかし、今回はプラグインは用いずにOpenAI APIを呼び出すための環境構築を行い、テキストに対してOpenAI APIで提供されているfunction calling(※)を用いて2値分類(positive/negative)を実施しました。
作業の大まかな流れは以下になります。
- openai ライブラリをインストールした python 環境を構築。
- pythonの Code recipe を作成し、実行環境を 作成したpython環境に変更。
- Code recipeで、テキストに対してOpenAI APIを用いて2値分類(positive/negative)を実施。
※ Function calling(リンク)とは
開発者が事前に関数を記述しておき、必要に応じて実行する関数とその引数をGPTに選択させるためのAPIです。またGPTが選択した関数や引数は json 形式で返されるため、今回はGPTからの応答を json 形式で取得するために用いています。
2. 実行環境
- Dataiku Windows版 (DLページ)
- Dataiku DSS 12、License typeはFree Edition で動作検証を行いました。
- pythonのバージョンは、3.7を使用しました。
- OpenAI API
- opneai ライブラリは、0.27.0 より上のバージョンで環境を構築しています。
3. python環境の構築
3-1. DSS settings 画面を開く
Dataiku DSS 画面 右上のApplications から、[Administration] を選択してください。
DSS settings 画面が開きます。
3-2. 新しいpython環境の構築
ここでは、追加のpythonライブラリをインストールするための新しいpython環境を作成します。
DSS settings で、Code Envs を選択し、[NEW PYTHON ENV] ボタンを押してください。
New Python env の設定
Pythonのバージョンは3.7を選択しています。
[CREATE]ボタンを押すと、python 環境が作られます。
3-3. 追加ライブラリのインストール
[Packages to install] を開いて、作成した python 環境に、追加のpythonライブラリをインストールします。
3-3-1. Packages to install
[Packages to install]を開いて、ADD SETS OF PACKAGES を行います。
3-3-2. ADD SETS OF PACKAGES
Core packages versions は、「Pandas 1.2 (Python 3.7 and above)」を選択しています。
[ADD SETS OF PACKAGES] ボタンを押すと、Add additional packages 画面が開きます。
デフォルトのままで [ADD]ボタンを押してください。
Requested packages (Pip) に以下のようにパッケージが設定されます。
3-3-3. openai ライブラリのインストール
Requested packages (pip) にインストールが必要なパッケージを追記します。
ここでは、Function calling を用いるために、openai ライブラリのバージョンを 0.27.0 より新しいバージョンを要求しています。
- 注意事項
- 「mxnet==1.7.0.post2」が openai と衝突してしまいました。
- mxnet 関連の機能を使う予定はなかったため、Requested packages ではありましたが、mxnet を外して、openai をインストールしました。
3-3-4. SAVE AND UPDATE
[SAVE AND UPDATE]ボタンを押すと、インストールが始まります。
Env updateの完了をお待ちください。
4. recipe 作成時の設定
4-1. データ準備
今回、サンプルとして2値分類(positive/negative)を行う対象のテキストデータを用意しました。
プロジェクト作成やデータ準備に関しては、省略させていただきます。
Dataikuの基本的な機能やデータ整形に関しては、以下のブログもご参照下さい。
- Dataikuつかってみた(リンク)
- KaggleでおなじみのTitanicのデータをDataikuで整形をしてみた(リンク)
準備したデータに対して、OpenAI API を用いて2値分類を行う Recipe を作成していきます。
4-2. pythonの Code recipe 作成
Code recipe 選択
[ACTIONS] から pythonの Code recipe を選択して下さい。
出力先のデータセットを作成
ここでは、出力先のデータセットを「output_gpt_results」として作成しています。
Code recipe 作成
[CREATE DATASET] で出力先データセットを作成後、[CREATE RECIPE] ボタンを押して、recipeを作成してください。
4-3. python 環境の変更
OpenAI APIを用いるには、recipeのデフォルトのpython 環境ではなく、openaiライブラリをインストールしたpython 環境に変更する必要があります。
ACTIONS
ACTIONS を開いてください。
Other actions の Change Python code env で、python環境を変更できます。
Python環境の変更
Selection behavior を 「Select an environment」とすると、作成したpython 環境を選択できるようになります。
Environment で、openai ライブラリをインストールした python 環境を選択してください。
5. OpenAI APIを用いた recipe の実例
5-1. 2値分類関数
OpenAI APIを用いて2値分類を行うために、以下の関数(classify_text)を作成しました。
Function callingを用いて、判定結果をjson形式で出力する関数になっています。
import openai message = ''' Determine whether the content of #Text is positive or negative. #Text ''' def classify_text(text): prompt_text = message + text response = openai.ChatCompletion.create( model="gpt-3.5-turbo-0613", temperature=0.0, messages=[ {"role": "user", "content": prompt_text} ], functions=[{ "name": "judgement_function", "description": "Process the extracted features and judgment results as JSON.", "parameters": { "type": "object", "properties": { "reason": { "type": "string", "description": "Please output the reason for judging whether the content of #Text is positive or negative.", }, "judgement":{ "type": "string", "enum":["positive", "negative"], "description": "Output the result of judging whether the content of #Text is positive or negative.", } } } }], function_call={"name": "classify_text"}, ) result = json.loads(response.choices[0].message.function_call.arguments) return result
python環境の動作検証を行うことが目的のため、プロンプトのカスタマイズは行っておらず、判定精度の評価も行っておりません。
5-2. データへの適用例
classify_text関数を呼び出して、判定結果をDataFrameに格納しています。
ADD から END までが追加したコードです。
# Read recipe inputs sample_data_filtered_prepared = dataiku.Dataset("sample_data_filtered_prepared") sample_data_filtered_prepared_df = sample_data_filtered_prepared.get_dataframe() # Compute recipe outputs from inputs # TODO: Replace this part by your actual code that computes the output, as a Pandas dataframe # NB: DSS also supports other kinds of APIs for reading and writing data. Please see doc. output_gpt_results_df = sample_data_filtered_prepared_df # For this sample code, simply copy input to output # ----- ADD ----- # API Key openai.api_key = "sk-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" # Convert to list data_list = output_gpt_results_df.to_numpy().tolist() # Judgment processing judgement_list = [] for target in data_list: text = target[1] result = classify_text(text) judgement = result['judgement'] judgement_list.append(judgement) # Add "judgement" column output_gpt_results_df["judgement"] = pd.Series(judgement_list) # ----- END ----- # Write recipe outputs output_gpt_results = dataiku.Dataset("output_gpt_results") output_gpt_results.write_with_schema(output_gpt_results_df)
5-3. 結果確認
作成した Code recipe 出力結果です。
judgement カラムに判定結果が挿入されています。
6. まとめ
OpenAI APIを使用してrecipeを作成するためのpython環境を構築方法を紹介しました。
そして構築したpython環境を用いて、文書分類を行うCode recipeを作成しました。
必要に応じてpythonの実行環境を構築できることは、処理の柔軟性を非常に高められると感じています。ChatGPT/GPT以外のライブラリやモデルが必要となった際にも活用していきたいです。
また Dataiku と ChatGPT/GPT を組み合わせることにより、テキスト データを扱う際の実装コストを下げることができ、Dataiku上でのテキスト データの活用の幅を広げられると考えています。