はじめに
最近、JevというAIサービスを知り、どのようなことができるのか気になったので
実際に触ってみました。
今回はJevの以下3つの機能を試してみます。
- Noul
- Choice
- Score
実際にAPIを実行して、それぞれどのような結果が返ってくるのか確認してみます。
Jevとは
Jevは、文章などの入力に対して質問を設定し、その結果を構造化されたデータとして取得できるサービスです。
今回は問い合わせ文章を題材にして、以下のような判定を試してみました。
- 緊急性があるか
- どのカテゴリーに分類されるか
- 緊急度がどのくらい高いか
APIキーを準備する
まず、JevのAPIを利用するためにAPIキーを準備します。
今回、最初に以下のTypeSafe側からAPIキーを発行しました。
しかし、このAPIキーを使用してJevのAPIを実行すると、以下のエラーになりました。
{
"code": -1,
"message": "Invalid API key."
}
そこで、以下のJev側のページからAPIキーを発行し直しました。
こちらで発行したAPIキーに変更したところ、正常に実行できました。
あくまで今回試した環境での結果です。
発行したAPIキーは、以下のように環境変数へ設定しました。
export JEV_API_KEY='発行したAPIキー'
実際のAPIキーをソースコードなどに直接記載しないように注意してください。
Noulを試してみる
最初にNoulを試してみます。
今回は以下の2つについて判定してみました。
- この問い合わせには緊急性があるか
- この問い合わせには返信が必要か
以下のリクエストを実行します。
curl -X POST https://thejevai.com/v1/systemone \
-H "Authorization: Bearer $JEV_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "jev-latest",
"state": "明日のイベントで使用する商品なのですが、まだ届いていません。今日中に配送状況を確認してください。",
"questions": {
"is_urgent": {
"type": "noul",
"instructions": "この問い合わせには緊急性がありますか?"
},
"needs_reply": {
"type": "noul",
"instructions": "この問い合わせには返信が必要ですか?"
}
}
}'
結果は以下のようになりました。
"is_urgent": {
"type": "noul",
"noul": 0.94
},
"needs_reply": {
"type": "noul",
"noul": 0.93
}
結果を整理すると、以下のようになりました。
| 項目 | 結果 |
|---|---|
| 緊急性 | 0.94 |
| 返信の必要性 | 0.93 |
文章を変更してみる
次に、問い合わせ内容を大きく変更してみます。
商品が無事に届きました。ありがとうございました!
同じ質問で実行したところ、以下の結果になりました。
"is_urgent": {
"type": "noul",
"noul": 0.06
},
"needs_reply": {
"type": "noul",
"noul": 0.39
}
2つの結果を比較すると以下のようになります。
| 入力内容 | 緊急性 | 返信の必要性 |
|---|---|---|
| 今日中に配送状況を確認してほしい | 0.94 | 0.93 |
| 商品が届いたことへのお礼 | 0.06 | 0.39 |
文章の内容を変更することで、結果が大きく変化することを確認できました。
Choiceを試してみる
次にChoiceを試します。
今回は問い合わせ内容を以下の4種類に分類してみました。
- 配送
- 返金・返品
- 商品
- その他
以下の問い合わせを入力します。
注文した商品がまだ届いていません。
現在の配送状況を確認してもらえますか?
実行結果は以下のようになりました。
"category": {
"type": "choice",
"choice": "delivery",
"probabilities": {
"refund": 0,
"other": 0,
"product": 0,
"delivery": 1
},
"confidence": 1
}
結果は以下のとおりで、delivery が選択されました。
delivery : 100%
refund : 0%
product : 0%
other : 0%
少し曖昧な文章でも試してみる
次に、配送と返金の両方の要素を含んだ文章に変更してみます。
商品が予定日を過ぎても届いていません。
明日までに届かない場合はキャンセルして返金してもらいたいです。
結果は以下のようになりました。
"category": {
"type": "choice",
"choice": "delivery",
"probabilities": {
"product": 0,
"delivery": 0.91,
"other": 0,
"refund": 0.09
},
"confidence": 0.89
}
最終的には delivery が選択されましたが、以下のような結果になりました。
delivery : 91%
refund : 9%
最初の問い合わせでは delivery が100%でしたが、返金についても記載したことで refund にも確率が割り振られています。
また、confidence についても 1.00 → 0.89 と変化しました。
単純にカテゴリーを1つ返すだけではなく、それぞれの候補に対する確率も確認できる点が面白いと感じました。
Scoreを試してみる
最後にScoreを試してみます。
今回は以下の文章の緊急度を評価しました。
今日中に必要な商品がまだ届いていません。
至急、配送状況を確認してください。
評価基準は以下の4段階です。
| Score | 評価 |
|---|---|
| 0 | 緊急性はない |
| 1 | 緊急性は低い |
| 2 | 緊急性は高い |
| 3 | 非常に緊急性が高い |
実行した結果、以下のようになりました。
"urgency": {
"type": "score",
"score": 2.94,
"legend": {
"0": "緊急性はない",
"1": "緊急性は低い",
"2": "緊急性は高い",
"3": "非常に緊急性が高い"
},
"probabilities": {
"0": 0,
"1": 0,
"2": 0.06,
"3": 0.94
},
"confidence": 0.94
}
Scoreは 2.94 / 3 となりました。
各段階の確率を見ると、以下のようになっています。
0 : 0%
1 : 0%
2 : 6%
3 : 94%
今回の結果では、
2 × 0.06 = 0.12
3 × 0.94 = 2.82
0.12 + 2.82 = 2.94
となり、各段階の確率をもとにした値がScoreとして返っていることも確認できました。
Noul・Choice・Scoreの違い
今回試した内容を簡単に整理すると、以下のようになりました。
| 種類 | 今回試した内容 | 結果の例 |
|---|---|---|
| Noul | 緊急性があるか | 0.94 |
| Choice | 問い合わせの分類 | delivery 91%、refund 9% |
| Score | 緊急度の段階評価 | 2.94 / 3 |
実際に触ってみることで、それぞれの違いが少し理解できました。
Noul
「該当するかどうかを判断したい」という場合に利用できそうです。
今回であれば、「この問い合わせには緊急性がありますか?」という問いに対して数値が返ってきました。
Choice
「複数のカテゴリーから分類したい」という場合に利用できそうです。
今回であれば、配送・返金・商品・その他という複数の候補から問い合わせ内容を分類しました。
Score
「いくつかの段階を設けて評価したい」という場合に利用できそうです。
今回であれば、緊急度を0〜3の4段階で評価しました。
まとめ
今回はJevを使って、以下の3種類を実際に試してみました。
- Noul
- Choice
- Score
特に面白いと感じたのは、単純に「Yes / No」や「カテゴリー名」だけが返ってくるのではなく、確率やScoreといった数値として結果を取得できる点です。
また、Choiceでは少し曖昧な文章を入力することで、delivery : 91%、refund : 9% のように、複数の候補に確率が分かれることも確認できました。
今回はcurlを使った簡単な検証でしたが、今後は実際のアプリケーションに組み込んだ場合にどのような使い方ができるのかについても試してみたいと思います。
参考資料
- Jev公式ドキュメント
https://thejevai.com/docs - Jev Playground
https://thejevai.com/playground - Jev API Tutorial
https://thejevai.com/blog/jev-ai-api-tutorial