LoginSignup
0
0

OpenAIとServiceNowの連携(翻訳の実装手順)

Last updated at Posted at 2024-04-16

1. はじめに

みなさんこんにちは、三井情報株式会社です。

今回は、ServiceNowとOpenAI APIを連携させることにより、ChatGPTの機能を利用することができることを検証しました。
①翻訳の実装手順
②要約・コードチェックの実装手順
の2つの記事にわけて紹介します。
今回は①翻訳の実装手順について紹介します。

2. 検証内容

以下の図は、左が翻訳実行前、右が翻訳実行後です。
image.png
翻訳処理の流れとしては、
①インシデントレコードを作成します。
②APIを使って翻訳処理を実行させます。
 この時、翻訳対象となるのはインシデントのDescriptionです。
③翻訳結果はカスタムしたカラム“翻訳”に格納されます。
 ここでは日本語から英語に翻訳するように指定しているため、翻訳カラムには英語翻訳 
 結果が入っています。

3. 事前準備

連携の実装に入る前に事前準備があります。

OpenAI側の作業

・OpenAIのアカウントを作成する
 ①OpenAIの公式サイト(https://openai.com/blog/chatgpt) にアクセスします。
 ②画面右上の「Log in↗」を押下します。
 ③ログイン画面にあるSign Upリンクを押下します。
 ④メールアドレス・パスワードを入力し、メールが届いたら本登録に進みます。

・API連携用のAPIキーを取得する
 ①OpenAIの公式サイト(https://openai.com/blog/chatgpt) にアクセスします。
 ②右のAPIを選択します。
image.png

 ③OpenAI platformサイドバーから「APIkeys」を開きます。
image.png
image.png
 ④「+Create new secret key」からAPIkeyを取得します。

APIKeyは再確認することができません
生成時に必ずコピーして、忘れないように控えておいてください。
忘れた場合は、APIKeyを作成し直してください

ServiceNow側の作業

・インシデントテーブルに3つのカラムを追加する
※インシデントの翻訳処理を動的に行えるようにカラムを新規追加しましたが、必ずしもカラムを新規追加する必要はありません。
①翻訳:翻訳した結果を格納するカラム
②翻訳元言語:翻訳前の言語
③翻訳先言語:翻訳後の言語

image.png

・APIキーをシステムプロパティに格納する
事前準備で取得したAPIキーをシステムプロパティのValueに格納しTypeをpassword2にすることでキーが暗号化され目視でキーを読み取ることができなくなります。ただしプログラムを使用して本プロパティを読み取る際は複合化されます。

image.png

4. 連携の実装手順

RESTメッセージ、Business Rule、Flow Designerの2通りの方法で実装しましたのでそれぞれの実装方法を記載します。

4.1 RESTメッセージを用いた実装手順

(1) RESTメッセージを作成する

RESTメッセージ(親)
まずはじめにREST メッセージを作成します。各項目を以下のように入力します。

image.png

image.png

(2) RESTメッセージ変数を作成する

RESTメッセージ(子)
処理内容を記載するために、RESTメッセージ変数を作成します。各項目を以下のように入力します。
image.png

image.png

(3) 「HTTPヘッダー」にRequest Headerを、「コンテンツ」にRequest Bodyを記載する
HTTPヘッダーにRequest Headerを記載します。この時、APIキーを直接入れるのではなくシステムプロパティから値を取得するため関数を入れます。
コンテンツは3つの関数を入れていて最初の2つは翻訳元言語・翻訳先言語を動的に変えられるように固定値ではなく関数タイプにしています。3つ目は翻訳対象が入るので関数タイプにしています。

image.png

コンテンツの詳しい中身についてご説明します。
ここでは、メッセージの中にロールとコンテンツというプロパティをセットにしています。これがChatGPTとユーザーとの会話のやり取りです。
ロール:メッセージの送信者
システム:ChatGPT
ユーザー:ユーザーが入力した文章
コンテンツ:メッセージ部分 ※ここでは英語になっていますが日本語でも対応可能です。
まずシステムが"○○語から○○語に翻訳をしますよ"というメッセージを出してユーザーが実際に翻訳してほしい文章を投げています。

  "model": "gpt-3.5-turbo",
  "messages": [
    {
      "role": "system",
      "content": "You will be provided with a sentence in ${sourceLanguage},and your task is to translate it into ${targetLanguage}."
    },
    {
      "role": "user",
      "content": "${translationResult}"
    }
  ]
}

(4) REST Messageを実行するための処理をBusiness Ruleにて作成する
REST Messageで作成した処理を実行するための処理をビジネスルールで作成しました。「Advanced」をTrueにすることで「Advance」タブが表示され、スクリプトを入力できるようになります。
また、「When to run」タブで実行タイミングを設定します。Incidentのレコードが作成されたときに言語翻訳をさせるためにInsert(挿入)のタイミングにします。

image.png

続いて「Advanced」のスクリプト欄に処理を記載します。

(function executeRule(current, previous /*null when async*/) {

// インシデント情報
var incidentDescription = current.getValue("description");

// OpenAI APIへのリクエストを生成
var openaiRequest;
var responseBody;
var status;

// システムプロパティからAPIKeyを取得する
var APIKey = gs.getProperty("u_vancouver_pt_openai_skm");

openaiRequest = new sn_ws.RESTMessageV2("u_vancouver_rm_openai_skm","chat_completions");

// RESTMessageで登録した関数に引数を渡す
openaiRequest.setStringParameterNoEscape("summaryResult",incidentDescription);
openaiRequest.setStringParameterNoEscape("APIKey",APIKey);
openaiRequest.setHttpTimeout(60000);

// OpenAI APIを呼び出し
response = openaiRequest.execute();
responseBody = response.haveError() ? response.getErrorMessage() : response.getBody();
status = response.getStatusCode();

var responseObj = JSON.parse(responseBody);

// 要約結果を取得
var summarizedDescription = responseObj.choices[0].message.content;

// インシデントに要約結果を設定
current.setValue("u_summary", summarizedDescription);

})(current, previous);

※sn_ws.RESTMessageV2についての詳細情報は以下のリファレンスサイトをご参照ください。
https://developer.servicenow.com/dev.do#!/reference/api/vancouver/server/sn_ws-namespace/c_RESTMessageV2API

4.2 Flow Designerを用いた実装手順

Flow Designerのみで処理を実装する場合の手順を紹介します。

4.2.1 Flow Actionの作成

(1) 翻訳処理を行うカスタムアクションを作成する
InputにIncidentレコードを設定します。

image.png

(2) APIキーをシステムプロパティから取得する
image.png

(function execute(inputs, outputs) {
// ... code ...
//APIキーの取得
var APIKey = gs.getProperty('u_vancouver_pt_openai_skm');
// 取得したキーをOutputにセットする
outputs.api_key = APIKey;

//インシデント.説明をJSONに変換
var description = inputs.description_string;
outputs.description_json = JSON.stringify(description);

})(inputs, outputs);

取得したAPIkeysを次のステップで使用できるようにOutputにセットします。
image.png

(3) REST STEPを追加する
Connection Details
 Credential:Bearer認証方式のため登録不要
 Base URL:エンドポイントのベースURL
Request Details
 Resource Path:OpenAI APIの「Create chat completion」のパス
 HTTP Method:POST(リファレンスサイトはこちら)
 Headers:1つ目のステップで取得したAPIkeysをセット

Request Content
 Request Body:インプットで指定したIncidentレコードの「翻訳元言語」「翻訳先言語」
 「説明」の入力値をセット

image.png

image.png

(4) 翻訳結果を取得する
2つ目のステップのResponse Bodyをインプットにセットします。

image.png

翻訳結果をアウトプットとして設定します。

image.png

(function execute(inputs, outputs) {

//responseBodyから翻訳結果のみを取得
var translatedDescription = JSON.parse(inputs.responseBody).choices[0].message.content;

//翻訳結果をアウトプットとしてセット
outputs.translateddescription_output = translatedDescription;

})(inputs, outputs);

(5) アクションをアウトプットする
翻訳結果をアクションのアウトプットとして設定した後、1つ前のステップのアウトプットを設定します。

image.png

4.2.2 Flow Designerでのフローの作成

(1) Flowの全体像
以下の流れのフローを作成します。
・Trigger:Incidentレコードの作成
・Flow
 ①カスタムアクション:Incidentの翻訳アクションを実行
 ②OOTBアクション:翻訳結果をIncidentのカラム“翻訳”に格納

image.png

(2) Incidentが起票された時をTriggerにする
Incidentレコードが作成されたときにFlowが動くように設定します。
その他の条件は必要に応じて設定します。

image.png

(3) 4.3.1で作成したカスタムアクションを呼び出し、Incidentレコードをカスタムアクションのinputとして設定する
inputとしてTriggerのIncidentレコードを設定します。

image.png

(4) カスタムアクションからのoutputをIncidentレコードの"翻訳"カラムに格納する
Incidentレコードの"翻訳"カラムにカスタムアクションのoutputを設定し、レコードをUpdateします。

image.png

5. おわりに

如何でしたか。
今回は、ServiceNowとOpenAI APIの連携の翻訳の実装手順について紹介しました。
2つの方法での紹介でかなりのボリュームになりましたが、ご理解いただけましたでしょうか?

次回は第2弾として文章の要約・コードチェックの実装手順について紹介しますので是非ご覧ください!

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0