Taste of Tech Topics

Acroquest Technology株式会社のエンジニアが書く技術ブログ

ragasを使ってRAGシステムを定量的に評価する

皆さんこんにちは。データサイエンティストチームYAMALEXSsk1029Takashiです。
YAMALEXは Acroquest 社内で発足した、会社の未来の技術を創る、機械学習がメインテーマのデータサイエンスチームです。

Acroquestでは検索とAzure OpenAI Serviceを組み合わせたQAシステムを提供中です。
こういったシステムを運用していく中で課題になるのが精度評価と改善の仕組みです。

今年7月の記事でPrompt Flowを使った回答評価を検証してみましたが、今回はOSSのragasというツールを使って検証してみます。

ragasとは

ragasはRAG(Retrieval Augumented Generation)の仕組みの良し悪しを評価するためにOSSで作成されたライブラリです。
以下のリポジトリがあり、Pythonのライブラリとして使用することができます。
github.com

RAGを運用しているとよくあるのは、システムが誤答を出した場合に何が問題なのか切り分けるポイントが多く手間がかかることです。
誤答を出したとしても、検索結果のコンテキストが悪いのかプロンプトが悪いのかでとるべき対策が変わってきます。
一つの回答について調査するだけならログを見ればわかりますが、システムとして評価するときには全体の傾向を見る必要があります。

そこでragasはLLMを使用したRAGの評価に特化しているため、質問・参照元のコンテキスト・回答をもとにいくつかの指標に分けて回答品質を評価できます。

ragasで使える評価指標

https://user-images.githubusercontent.com/557338/268251349-b6c0db98-a0a9-4414-9ad3-372d8ceab4c7.png

ragasでは標準で以下の4つの評価指標が用意されています。

名前 説明
Faithfulness コンテキストと回答の一貫性を評価する指標です。
回答の中にコンテキストから推測できない情報が含まれているほどスコアが下がります。
Context Precision 質問とコンテキストの関連度をスコアにします。
コンテキストの中に質問に関係ない情報が含まれているほどスコアが下がります。
Context Recall 検索結果のコンテキストが期待する回答に対してどれくらいの情報をカバーできるかをスコアにします。
この指標を測る場合には、質問に対して期待する回答を事前に定義する必要があります。
Answer Relevancy 質問と回答の関連度をスコアにします。
質問に対して関係ないことが回答に含まれているほどスコアが下がります。

使ってみる

今回は以下の記事で使用した例を使ってragasによる評価を試してみましょう。
acro-engineer.hatenablog.com

動作させるのは非常に簡単で、datasetを作成→evaluateで評価を実行するだけです。
注意点としてragasはOpenAIのAPIを使用するため、事前に取得して、OPENAI_API_KEYという環境変数に設定して置く必要があります。

datasetを作成する

from datasets import Dataset

questions = [
    "Azure OpenAI Service上で利用できるGPT-4の最新版のモデルはバージョンは?",
    "Azure OpenAI Service上で利用できるGPT-4の最新版のモデルはバージョンは?",
    "text-embedding-ada-002モデルの次元数は?"
]

contexts = [
    ["Azure OpenAI Serviceで利用できるGPT-4のバージョンは0301, 0631があり、自動でアップデートする設定が使用可能です。"],
    ["Azure OpenAI Serviceで利用できるGPT-4のバージョンは0301, 0631があり、自動でアップデートする設定が使用可能です。"],
    ["text-embedding-ada-002はOpenAIから利用できる文章をベクトル化できるモデルで,1536次元のモデルを出力することが可能です。"]
]

answers = [
    "最新版のモデルのバージョンは0613です",
    "モデルは自動でアップデートする設定が使用可能です",
    "1536です"
]

dataset = Dataset.from_dict(
    {
        "question": questions,
        "answer": answers,
        "contexts": contexts,
    }
)

評価を実行する

評価を実行するにはスコアを出す評価指標を指定して実行するだけです。
評価指標は指定しない場合はFaithfulness、Context Precision、Context Recall、Answer Relevancyの4つが実行されます。
※ただし、今回の検証ではContext Recallに必要な期待する回答はない想定なので、Context Recall以外の3つを指定します。

from ragas import evaluate
from ragas.metrics import answer_relevancy, context_precision, faithfulness

# 評価
result = evaluate(dataset, [answer_relevancy, context_precision, faithfulness])
print(result)

こちらを実行すると以下の結果が得られます。

{'ragas_score': 0.7888, 'answer_relevancy': 0.7673, 'context_relevancy': 1.0000, 'faithfulness': 0.6667}

まずはこれで、全体のスコアは出せました。

ragas_scoreはそれぞれの評価指標での結果の調和平均をとったものになります。

調和平均というのは極端に値にペナルティを与えてスコアを計算する手法になります。
なぜ単純平均ではなくこの手法にしているかというと、一つの軸だけ極端によいという場合に全体のスコアに影響を出さないためです。

例えば評価結果でfaithfulnessが1でcontext_relevancyが0の場合を例にしてみましょう。
この場合コンテキストと回答は非常に一貫性が高いですが、質問とコンテキストが全く関係ないという状況なので、回答の質としては望ましいものではありません。
これを単純平均で計算すると0.5になりますが、調和平均にすると1.0という極端なスコアにペナルティをつけて0.0という結果になります。
このように、上記の指標は全体的に高いことが望ましいので、調和平均を使用しているようです。

また、全体のスコアだけでなく個別のQAについても評価軸ごとに結果を見ることができます。

result.to_pandas()

このようにto_pandas()を呼び出すことでDataFrameとして各QAごとの今回指定した3つの評価結果を得ることができます。
2問目のanswer_relevancyが低くなる想定ですが、結果としては3問目よりも高く出ています。
あくまで質問と回答の関連度なので、3問目が簡潔に回答しすぎなのと、2問目はモデルのバージョンについて言及しているという関連度が見られてスコアが高くなっているようです。

このようにOSSということもあり、評価方法については改善の余地はありそうです。
とはいえ、ローカルでここまで簡単に充実した回答評価を動かせるのはうれしいですね。

まとめ

今回はragasというライブラリを使用してRAGの回答を定量的に評価する仕組みを検証しました。
全面的に信用するというよりも考え方や、部分的に評価指標を利用するのが現実的な使い方になりそうです。
とはいえ、ここまで簡単にできる仕組みがあるのはうれしい部分でした。

それではまた。

Acroquest Technologyでは、キャリア採用を行っています。

  • ディープラーニング等を使った自然言語/画像/音声/動画解析の研究開発
  • Elasticsearch等を使ったデータ収集/分析/可視化
  • マイクロサービス、DevOps、最新のOSSを利用する開発プロジェクト
  • 書籍・雑誌等の執筆や、社内外での技術の発信・共有によるエンジニアとしての成長
少しでも上記に興味を持たれた方は、是非以下のページをご覧ください。
www.wantedly.com

AWSで生成AIアプリの開発が可能な『PartyRock』でポエムアプリを作ってみた

こんにちは、先日千葉に遊びにいったらアクアライン通行止めで東京湾迂回する羽目になった菅野です。

ChatGPTにて手軽にアプリケーションを自動で生成できるGPTsが世の中では大きな反響を呼んでいます。
プログラミングレスでChatGPTを利用するアプリを生成できるので、プログラマー以外の人がどんどん生成AIを利用するような流れが出来つつありますね。

さて、そのような流れにのってAmazonBedrockを利用してアプリを生成、共有するサービス、PartyRockがAWSからリリースされました。 早速利用してみましょう。

https://partyrock.aws/partyrock.aws

PartyRockの始め方

アカウントの作成

PartyRockはAWSが提供するサービスではありますが、AWSアカウントとは別のアカウントを作成する必要があります。
PartyRockのサイトにアクセスし、Sign inボタンを押下するか、Build your own appを選択し、生成したいアプリの条件を入力後にアカウント作成ダイアログが表示されます。 現時点ではGoogle, apple, amazonのアカウントを利用してのサインインのみ対応している模様です。

全体的にDJ、パーティーをテーマにしたポップなサイトデザインになっており、エンジニア以外の人でも手軽に利用してほしいというAWS側の意図を感じますね。

PartyRockにかかる料金

現時点では、PartyRockは無料トライアル中のためアカウント作成のみで無償で利用することができます
将来的には有償化すると思われますので、様々なアプリを試しに作ってみるなら今のうちにやってみるのがよさそうです。

実際にPartyRockでアプリを生成してみた。

それでは実際にPartyRockでのアプリ生成を試してみましょう。

Build your own appを押下すると、アプリケーション生成ダイアログが表示されるので、 そこに作りたいアプリの説明を入力します。
PartyRockのFAQでは、英語のみ対応となっておりますが、一応日本語で入力してもアプリは生成されるみたいです。
ただし、生成されるアプリは英語で説明されます。

生成したいアプリの内容を入力、Generate appを押下し、しばらくたつとアプリケーションが生成され、以下のような画面が表示されます。

赤枠で囲んだウィジェットがアプリの入力欄、今回のアプリでは作成したいポエムのテーマを入力する欄です。
そしてその下部にある黄緑色のヘッダのウィジェットがそれぞれポエムと挿絵を生成する出力欄になります。

試しに「紅葉」をテーマにポエムと挿絵を生成してもらいましょう。

以下のようなポエムと、挿絵が生成されました。

木々は色づき始めた 葉っぱの色はくれないに変わる 赤と橙と気が混ざり合い 美しい光景が広がる 小川だって紅葉を映す 風で葉は舞い落ちた 立ち木の上は色づき終えた 新芽が地面に散らばる  
年を経た木々は決別の時 自然の楽しみを見せてくれた 来る春を待ちわびる心に 紅葉が残した思い出  

PartyRockのアプリを編集

それぞれのウィジェットは個別に編集することが可能です。

右上に表示されているスライダーアイコンをクリックすることで、編集内容が表示されます。
それぞれのウィジェットでは以下の項目を編集できます。

  • 入力ウィジェット

    タイトル、プレースホルダー、初期入力値等を設定できます。

  • 固定文字ウィジェット

    タイトル、文章を設定できます。

  • テキスト生成ウィジェット

    タイトル、テキスト生成モデル、プロンプト、モデルへのパラメータを設定できます。
    利用できるモデルは、Claude, Claude Instant, Jurassic-2 Mid, Jurassic-2 Ultra, Commandが選択できる模様です。
    プロンプト内で@を入力すると、それぞれのウィジェットの参照が選択できます。

  • 画像生成ウィジェット

    タイトル、プロンプトを設定できます。
    テキスト生成とは異なりモデルの指定はできない模様です。Bedrockがバックグラウンドで動作していることを考えると、Stable Diffusionが動いているものと推察されます。

今回のアプリでは生成されませんでしたが、ChatBotを利用するウィジェットも存在します。

  • ChatBotウィジェット

    タイトル、プレースホルダー、テキスト生成モデル、初期表示メッセージ、プロンプト、モデルへのパラメータを設定できます。

これらのウィジェットは自由に追加、削除できます。
追加する際には、上部のAdd Widgetボタンから、削除はそれぞれのウィジェットの編集メニュー下部のDelete Widgetから実行できます。

また、それぞれのウィジェットはドラッグでの移動や、サイズの変更も可能です。

作成したアプリの公開

アプリ作成時点ではPrivateに設定されていますが、作成したアプリはPublicに設定して公開することも可能です。
画面上部のMake public and Shareから公開できます。

今回作成してみたポエム生成アプリも公開したので以下のURLから試してみてください。

https://partyrock.aws/u/Ashihito/g4tODbku5/Poetry-and-Illustration-Creator

まとめ

AWSが提供する生成AIアプリを作成、公開するサービスPartyRockの紹介をしました。
AmazonBedrockがバックグラウンドで動作しているので、様々なモデルを利用できるのがGPTsとの差分になるように思います。
いずれにせよAIを活用するアプリをエンジニア以外の人が手軽に作成できる世の中になってきており、今後の動向もますます目が離せません。
それでは。

Acroquest Technologyでは、キャリア採用を行っています。
  • ディープラーニング等を使った自然言語/画像/音声/動画解析の研究開発
  • Elasticsearch等を使ったデータ収集/分析/可視化
  • マイクロサービス、DevOps、最新のOSSクラウドサービスを利用する開発プロジェクト
  • 書籍・雑誌等の執筆や、社内外での技術の発信・共有によるエンジニアとしての成長
  少しでも上記に興味を持たれた方は、是非以下のページをご覧ください。 www.wantedly.com

Amazon Bedrock(Claude2)でPythonのソースコード/テストコードの生成を確認してみた

こんにちは、最近久々にソロキャンプをしてきました菅野です。

AWS上で、 様々なAIモデルを利用できるようになるサービス、Amazon Bedrockがリリースされました、と書き続けてそろそろひと月が経過しております。
楽しみながら様々なモデルを利用していたらあっという間に時間がたってしまいました。

今回は、BedrockのClaudeV2モデルを用いてPythonコードとテストコードを生成してみようと思います。

Bedrockの説明は、以下を参照してください。

acro-engineer.hatenablog.com

Fizz Buzz」の生成

プログラミングの初歩も初歩、定番の課題といえばFizz Buzzです。
1-100までの数字のうち、3の倍数の時にはFizzを、5の倍数の時はBuzzを、3の倍数且つ、5の倍数の時はFizzBuzzと、それ以外の時はその数字を表示するプログラムです。

早速コードを生成してもらいましょう。

以下のようなコードが出力されました。

"""FizzBuzz問題を解くモジュール。

このモジュールにはFizzBuzz問題を解くためのクラスと関数が含まれます。
"""

class FizzBuzz:
    """FizzBuzz問題を解くためのクラス。

    このクラスにはFizzBuzzのルールに基づいて文字列を生成するメソッドが含まれます。
    """

    def generate(self, n: int) -> str:
        """nを受け取りFizzBuzzのルールに基づいた文字列を返す。

        Args:
            n (int): FizzBuzzを行う数値

        Returns:
            str: FizzBuzzのルールに基づいた文字列
        """
        
        if n % 15 == 0:
            return "FizzBuzz"
        elif n % 3 == 0:
            return "Fizz"
        elif n % 5 == 0:
            return "Buzz"
        else:
            return str(n)


def main():
    """メインメソッド。FizzBuzzクラスの使用例を示す。"""
    
    fizzbuzz = FizzBuzz()
    
    for i in range(1, 21):
        print(fizzbuzz.generate(i))


if __name__ == "__main__":
    main()

出力されたコードのテストコードも作成してもらいましょう。 以下のコードが出力されました。

import pytest
from fizzbuzz import FizzBuzz

@pytest.mark.parametrize(
    "n, expected",
    [
        (1, "1"),
        (2, "2"), 
        (3, "Fizz"),
        (4, "4"),
        (5, "Buzz"),
        (6, "Fizz"),
        (10, "Buzz"),
        (15, "FizzBuzz"),
    ]
)
def test_fizzbuzz(n, expected):
    fizzbuzz = FizzBuzz()
    assert fizzbuzz.generate(n) == expected

一回でFizzBuzzを実行するコード、ユニットテストを生成することができました。
Fizz、Buzz、FizzBuzz、自身の数それぞれのパターンをテストで確認できています。

じゃんけんを実行するコード

もう少し、複雑なコードも作成してもらいましょう。
ユーザの入力をもとにじゃんけんを実施するコードを作ってもらいましょう。 (中略)

以下のコードが生成されました。

"""じゃんけんゲームを実行するモジュール。"""

from random import randint

class JankenGame:
    """じゃんけんゲームを表すクラス。

    属性:
      player_hand: プレイヤーの選択した手
      computer_hand: コンピュータの選択した手
    """

    def __init__(self):
        """コンストラクタ"""
        self.player_hand = None
        self.computer_hand = None

    def get_computer_hand(self):
        """コンピュータの手をランダムに選択する。

        返り値:
          コンピュータの選択した手(グー、チョキ、パーのいずれか)
        """
        hands = ["グー", "チョキ", "パー"]
        return hands[randint(0, 2)]

    def judge(self):
        """勝敗を判定する。

        返り値: 
          "player": プレイヤーの勝ち
          "computer": コンピュータの勝ち 
          "draw": 引き分け
        """

        # 判定ロジック
        if self.player_hand == "グー":
            if self.computer_hand == "チョキ":
                return "player"
            elif self.computer_hand == "パー":
                return "computer"
        elif self.player_hand == "チョキ":
            if self.computer_hand == "パー":
                return "player"
            elif self.computer_hand == "グー":
                return "computer"
        elif self.player_hand == "パー":
            if self.computer_hand == "グー":
                return "player"
            elif self.computer_hand == "チョキ":
                return "computer"

        return "draw"

def main():
    """メイン処理。"""
    game = JankenGame()

    # プレイヤーの手を入力
    player_hand = input("あなたの手を入力してください(グー、チョキ、パー): ")
    game.player_hand = player_hand

    # コンピュータの手を決定
    computer_hand = game.get_computer_hand()
    print(f"コンピュータの手: {computer_hand}")
    game.computer_hand = computer_hand

    # 勝敗を判定
    result = game.judge()
    print(f"結果: {result}")

if __name__ == "__main__":
    main()

一回で期待通りのコードが出力されました。

同様に、上記コードのテストを実装してもらいましょう。

以下のようなテストコードが出力されました。

import pytest
from janken import JankenGame

@pytest.mark.parametrize("player, computer, expected", [
    ("グー", "チョキ", "player"),
    ("グー", "パー", "computer"), 
    ("チョキ", "パー", "player"),
    ("チョキ", "グー", "computer"),
    ("パー", "グー", "player"),
    ("パー", "チョキ", "computer"),
    ("グー", "グー", "draw"), 
    ("チョキ", "チョキ", "draw"),
    ("パー", "パー", "draw")
])
def test_judge(player, computer, expected):
    game = JankenGame()
    game.player_hand = player
    game.computer_hand = computer
    assert game.judge() == expected

じゃんけん結果判定のそれぞれのパターンについてテストができていますね。

まとめ

Claude 2でPythonコードと、pytestのテストコードを生成してもらいました。 簡単なAssertionのみの出力となりましたが一回でテストを生成できたのはうれしいポイントでした。
ソースコードも一回の出力でエラーなく期待する挙動のコードが出てきたのも高ポイントですね。 コツとして、プロダクトコードの作成時に「関数は適宜戻り値を返すようにしテスト作成しやすいようにする」と指示すると、関数をテストしやすく作ってくれる確率が高まります。 今後も生成AIでできることを模索していきたいです。
それでは。

Acroquest Technologyでは、キャリア採用を行っています。
  • ディープラーニング等を使った自然言語/画像/音声/動画解析の研究開発
  • Elasticsearch等を使ったデータ収集/分析/可視化
  • マイクロサービス、DevOps、最新のOSSクラウドサービスを利用する開発プロジェクト
  • 書籍・雑誌等の執筆や、社内外での技術の発信・共有によるエンジニアとしての成長
  少しでも上記に興味を持たれた方は、是非以下のページをご覧ください。 www.wantedly.com

簡単にオリジナルChatGPTアプリが作れる『GPTs』で、ドット絵生成チャットを作成

こんにちは、安部です。 11月なのに暑かったり寒かったしますが、皆様いかがお過ごしでしょうか。

さて、先日のOpenAI DevDay、大変な盛り上がりでしたね。

様々な新機能が公開され、GPT関連がさらなるパワーアップを遂げました。

DevDayは基本的に開発者向けのイベントですが、一般ユーザ向けの新機能も公開されました。

それがGPTsです。

今回は、GPTsが使えるようになったので試してみたいと思います。

GPTsとは

GPTsとは、GPT Builderを使ってノーコードで簡単にChatGPTをカスタマイズできるサービスで、今のところ有料ユーザのみが使用できます。

ChatGPTは特定タスク向けのサービスではありませんが、精度の良い回答をもらおうと思ったらプロンプトを工夫したり事前情報をたくさん与えないといけなかったりしますよね?

GPTsは、あらかじめ特定の目的を持たせたChatGPTの変種(GPTsと呼ばれます)を作っておくことで、それらの問題を解消できます。 今月末には、ストアも公開され、作成したGPTsを公開できるようになるそうです。

では、実際にGPTsを作成しながらGPT Builderの使い方を見ていきましょう。

GPT Builderの使い方

まずはChatGPTにアクセスします。 すると、左上に「Explore」というボタンがあるので、こちらをクリックします。 (表示されない方は、残念ながらまだGPT Builderが使えないので辛抱強く待ちましょう!)

すると、以下のように自分が作ったGPTs・最近使ったGPTs・OpenAI製のGPTsの3つが表示されます。

「Create a GPT」をクリックしましょう。すると、GPT Builderが起動します。

左サイドの画面で、対話形式でGPTsを作成することができます。 概ね以下のようなことを聞かれますが、何回か試すと毎回微妙に聞かれる内容が多少違います。

  • 何を目的とするGPTsか
  • GPTsの名称。提案してくれる。
  • サムネイル画像。目的・名称から生成してくれる。会話で変更を加えることも可能。
  • GPTsの返答/提案の仕方。(直接的で分かりやすいか、説明的で詳細か。)
  • GPTsの口調。(フォーマルか、カジュアルでフレンドリーか。)
  • 禁止事項や言及してほしくないこと。
  • 回答するのに情報不足の場合、詳細情報を求めるか一般論を回答するか?

サンプルとして、ゲーム用のドット絵を生成してくれるGPTsを作る場合の実際の会話の様子をテキストで載せておきます。

起こしてみると長く見えますが、かかった時間は5分程度でした。

【GPT Builder】
Hi! I'll help you build a new GPT. You can say something like,
 "make a creative who helps generate visuals for new products" 
or "make a software engineer who helps format my code."

What would you like to make?

【You】
make a professional designer who helps make pixel arts for video games.

【GPT Builder】
How about naming this GPT "Pixel Art Pro"? Does that sound good to you?

【You】
Sounds nice!

【GPT Builder】
~ ここで生成されたサムネ画像が表示される ~
Here's the profile picture we have for Pixel Art Pro. It's a pixelated image of a classic arcade-style joystick with a vibrant color palette. Do you like this, or would you like to make any changes?

【You】
No. It's perfect.

【GPT Builder】
Great! Let's fine-tune how Pixel Art Pro will interact with users. What type of guidance and support should it prioritize
when assisting users with their pixel art projects?

【You】
I would like Pixel Art Pro to suggest pixel art based on the game and character settings provided. 
If I present a piece of pixel art, please critique and offer advice on it.

【GPT Builder】
Great, Pixel Art Pro is set up to provide tailored pixel art suggestions and constructive critiques.

Now, in what situations should Pixel Art Pro ask for more information,
and when should it make assumptions to provide a quicker response?

【You】
Please ask for more background knowledge about the game when it's necessary to create good pixel art. 
If there are no critical issues, feel free to make assumptions and respond accordingly.
Please share the assumptions you make.

【GPT Builder】
Pixel Art Pro will seek more game details when necessary and will share any assumptions
made during less critical decisions to maintain transparency.

Lastly, would you like Pixel Art Pro to have a particular way of speaking, such as formal, casual, enthusiastic, or any other tone?

【You】
casual, please

【GPT Builder】
Pixel Art Pro is now tuned to have a casual and approachable tone.

Feel free to try out Pixel Art Pro in the playground, which is a separate chat dialog to the right.
If you'd like any refinements to its behavior, what would they be?

【You】
It's perfect!

【GPT Builder】
Awesome! If you ever think of any adjustments or new features for Pixel Art Pro
 just let me know. Enjoy creating with your new pixel art assistant!

日本語で回答できますが、質問はすべて英語でされます。作成完了したら、画面右上の「Save」ボタンを押します。 GPTsの公開設定が選べます。

このような手順でできあがったGPTsがこちらです。 公開設定にしておいたので、ご自由に触ってみてください。

chat.openai.com

では、動かしてみてみましょう!

GPTsを動かしてみる

自分で作成したGPTsは、ChatGPTの左上、「Explore」ボタンの上に表示されます。

表示されているサムネをクリックすると、GPTsとの対話が開始します。

サイバーパンクの世界観の主人公画像を作ってもらいました。

女性と男性を作ってもらいましたが、どちらも男性に見えるので女性Verだけ再作成を依頼。

さらに、オフィスの画像も作ってもらいます。 どうも「複数枚」という指示は無視されてしまうのですが、デザインはいい感じですね。

素のChatGPTとの比較

では、全く同じプロンプトを素のChatGPTに入力してレスポンスを見てみましょう。

当然ですが、ピクセルアートであることを指示していないので、普通のイラストが生成されました。 この後追加でいくつか指示を与えることで、ゲームで使えそうな画像を出力させることができました。

GPTsであれば、あらかじめ目的などを指示してあるため、そのようなやり取りを大幅に減少させられます。

GPTsの編集

作成済みのGPTsを編集することもできます。 「Explore」ボタンから、作成したGPTsの「Edit」ボタンをクリックします。

開いたGPT Builderで「Configure」タブを開くと、設定項目が表示される。

特筆すべき設定項目としては、以下の項目でしょうか。

「Conversation startars」とは、新しい会話を始めた時にテキスト入力欄の上部に表示される選択肢です。 素のChatGPTでは、あまり役に立たない選択肢が表示されていますが、これをカスタマイズできます。

また、「Upload files」から、ファイルをアップロードしてGPTsの知識に追加することができます。 これにより、さらにオリジナリティーを持ったGPTsが作成できます。

「Capabilities」と「Actions」では、ウェブブラウジング・画像生成・Code Interpreter・Function callingの設定ができます。

まとめ

GPT Builderを触ってみましたが、対話形式で非常に簡単にオリジナルのGPTsが作成できました。 自分が持っているデータなどをアップロードしておくこともできるので、かなり挙動をカスタマイズしたGPTsも作成できそうです。 色々と作成してみて、ChatGPTをさらに便利に活用したいですね!

Acroquest Technologyでは、キャリア採用を行っています。
  • ディープラーニング等を使った自然言語/画像/音声/動画解析の研究開発
  • Elasticsearch等を使ったデータ収集/分析/可視化
  • マイクロサービス、DevOps、最新のOSSクラウドサービスを利用する開発プロジェクト
  • 書籍・雑誌等の執筆や、社内外での技術の発信・共有によるエンジニアとしての成長
  少しでも上記に興味を持たれた方は、是非以下のページをご覧ください。 www.wantedly.com

GPT-4 Turboが登場、GPT-4との違いとは

こんにちは、最近ハンドブレンダーを購入し自家製バジルでジェノベーゼを作るようになった菅野です。

2023/11/6にOpenAIDevDayが開催され、ChatGPT関連の様々なアナウンスがありました。

openai.com

その中でもChatGPTの新しいモデル、GPT-4 Turboについての情報をまとめていきます。 モデルについての詳細解説は以下の公式サイトをご覧ください。

platform.openai.com

GPT-4 Turboのモデルは現在プレビュー版でgpt-4-1106-previewというモデルが試しに使える状態です。
数週間後に安定板のリリースがなされる予定だそうです。

コンテキスト長の増加(8,192 → 128,000トークン)

ChatGPTのモデルが一度に考慮できるテキスト量を示すコンテキスト長が12万8千トークンに増加しました。 従来のモデルのコンテキスト長はそれぞれ以下のようになっていることを考えると大幅な増加といえるでしょう。

モデル名 コンテキスト長
gpt-4-1106-preview(GPT-4 Turbo) 128,000
gpt-4 8,192
gpt-3.5-turbo 4,096

従来のGPT-4のおよそ16倍ものコンテキスト長になり、より長文の文脈を理解した上での応答を返してくれることになります。
短文の応答だけではなく、長い文章を生成してもらったり、より詳細な事前情報を読み込ませることができる様になります。

利用料がより安価に(入力:0.03ドル/出力:0.06ドル → 入力:0.01ドル/出力:0.03ドル)

モデルのパフォーマンス最適化に伴い、GPT-4 Turboではより安価にモデルを利用することができるようになりました。
GPT-4 Turboの利用料は以下のようになっております。

モデル名 入力($/1Kトークン) 出力($/1Kトークン)
gpt-4-1106-preview(GPT-4 Turbo) 0.01 0.03
gpt-4 0.03 0.06
gpt-3.5-turbo 0.0010 0.0020

入力では従来のGPT-4の1/3に、出力では1/2になっています。
利用トークン数が大きくなりがちな日本語での利用では大きな変化ですね。

学習データが2023年4月までのものに

従来のGPT-4モデルでは 2021年9月までの学習データをもとに文章を出力していたため、 2年以内の最新情報を出力することはできませんでした(例えば、AWSの新機能に関する出力をChatGPTで出力できない等)。
今回の更新でそのギャップが7ヵ月程度まで縮まるのはとてもうれしい限りです。

ちなみに、ChatGPT Plusなどで利用できるChatGPTアプリに関しては、GPT-4ベースのモデルが利用されているのですが、 どうやらGPT-4 Turboと同じように2023年4月の情報が最新に更新されているようです。

GPT-3.5を選択した場合はいまだに2021年9月が最新の模様です。

Function callingの改善

以前から実施可能であったFunction callingに以下の改善が加えられました。

  1. モデルのトレーニングにより、より厳密にFunction callingの適切なパラメータを呼び出せるようになった。

  2. 従来は一度の応答で1回しかFunction callingを利用できなかったが、複数の関数呼び出しを並列して実施できるようになった。
    例えば、国名を受け取って、受け取った国の気温を返すFunctionを定義した際に、「アメリカ、日本、フランスの気温を教えて」とchat completion APIに投入することで、3回のFunction呼出が行われるようになります。

JSON modeの追加

従来のGPT-4では出力のフォーマットを固定するには、プロンプトへ「応答は常にJSON形式で返してください。」といった文言を追加する必要がありました。
今回のアップデートでパラメータにresponse_formatを指定できるようになり、response_format: { type: "json_object"}とすることでモデルがJSON形式で応答を返すようになります。
入力プロンプトに常にメッセージを入れる必要がなくなるため、トークン数の節約につながりますね。
また、プロンプトへのフォーマット指定は、必ずしもそのフォーマットにならない場合がありましたが、今回のJSONモードでは厳密にJSONで返してくれるようになるので、 組み込みでアプリケーションを作成する際には実装が簡単になりそうです。

GPT-4 Turboを試してみる

ChatGPTのAPIで課金(1$以上)しているユーザにはすでに、gpt-4-1106-preview(GPT-4 Turbo)モデルを利用できるようです。
試しにAPIを使うだけでは、無料クレジット枠があるためすぐには課金されませんが、事前に支払いを行うprepaid billingを行うことでもモデルが解放されます。
上記課金について、ChatGPT Plusはカウントに含まれない点はご注意ください。

早速PlaygroundでGPT-4 Turboモデルが選択できるようになったため2023年2月の出来事を聞いてみましょう。

従来のGPT-4モデルでは以下のような応答になって答えてくれませんでしたが、 しっかり今年起こった出来事を回答してくれるようになりました。

まとめ

新しくアナウンスされた、GPT-4 Turboモデルについて従来のGPT-4とどのように差分があるのか説明しました。
より大量のコンテキストを理解できるモデルを安価に利用ができるようになったので、 ますます使い勝手がよくなっていきそうですね。
今後も生成AIで何ができるのか探っていこうと思います。
それでは。

Acroquest Technologyでは、キャリア採用を行っています。
  • ディープラーニング等を使った自然言語/画像/音声/動画解析の研究開発
  • Elasticsearch等を使ったデータ収集/分析/可視化
  • マイクロサービス、DevOps、最新のOSSクラウドサービスを利用する開発プロジェクト
  • 書籍・雑誌等の執筆や、社内外での技術の発信・共有によるエンジニアとしての成長
  少しでも上記に興味を持たれた方は、是非以下のページをご覧ください。 www.wantedly.com

Amazon Bedrock の Claude と Stable Diffusion を組み合わせて簡単に画像生成

こんにちは、肌寒い日が続くと南の島の暖かい海に行きたくなる菅野です。

AWS上で、 様々なAIモデルを利用できるようになるサービス、Amazon Bedrockがリリースされました。
Bedrockでは今までのブログで紹介してきた、テキスト生成以外にも、画像生成に利用できるモデルStable Diffusionも利用可能になっています。
Stable Diffusion自体はOSSとなっているので無料で利用できますが、自身のマシンにインストールして動かす必要があり、動かすマシンにはある程度の性能のGPUも必須になってきます。
手軽にStable Diffusionをオンデマンドで利用できるのは今までにないメリットなのではないでしょうか?

今回は、BedrockのClaudeV2モデルを用いて作成したプロンプトを使って、Stable Diffusionで画像生成をしていこうと思います。

Bedrockについて執筆した別記事もあわせてご覧ください。

acro-engineer.hatenablog.com

acro-engineer.hatenablog.com

モデルの利用料金

Amazon BedrockでのStable Diffusionの利用料金はオンデマンド料金とプロビジョニングスループットそれぞれ料金設定がされています。
よく使うであろうオンデマンド利用料金について、Bedrockで利用可能なSDXL0.8モデルではステップ数と画像解像度に応じて以下の料金になっています。

画像解像度 標準品質(51ステップ未満) 高品質(51ステップ以上)
512×512 以下 0.018USD/1画像 0.036USD/1画像
512×512 より大きい 0.036USD/1画像 0.072USD/1画像

詳細は以下の料金ページをご覧ください。

基盤モデルを使用した生成系 AI アプリケーションの構築 – Amazon Bedrock の料金表 – AWS

ステップ数とは?

Stable Diffusionが画像を生成する際には、画像の生成を繰り返し微修正を加えながら画像の精度を上げていきます。
その繰り返し処理1回を1ステップとし、繰り返せば繰り返すだけより高品質な画像が表示されます。

モデルの有効化

Stable Diffusionを利用するにあたって、モデルを有効化する必要があります。
Amazon Bedrock画面のサイドメニューから、Model accessを選択し、表示されるモデル一覧のEditを押下します。 Stability AI>Stable Diffusion XLにチェックを入れてSave Changesを押下します。

Playgroundsの利用

他のテキスト生成AIモデルと同様に、Stable DiffusionもPlaygloudsで簡単にモデルを試すことができます。
簡易的なUIのため変更できるパラメータが少ない、生成画像のサイズを変更できない等の制限が付きますが、まず動かす分には十分かと思います。
Bedrock画面サイドメニューからPlaygrounds>Imageを押下します。

Prompt欄に生成したい画像を示す文言を入力して生成します。
試しに海の画像を生成してみました。

プロンプトをClaudeV2で生成する

Stable Diffusionで期待する画像を生成する際には所謂”呪文”と呼ばれている特定のプロンプトメッセージを入力することが有効であるといわれています。
今回はせっかくなので同じBedrokで利用可能なテキスト生成モデルClaudeV2を利用して、Stable Diffusionのプロンプトを生成してもらいましょう。
カメをカメラと誤解するというおちゃめな出力をしたりしていましたが、訂正してもらって以下のプロンプトを提案してもらいました。

A beautiful coral reef sea at daytime with blue sky. Photorealistic photographic image. A turtle is visible in the frame.

早速こちらのプロンプトを用いて画像生成してみましょう。 以下の画像を生成してくれました。

青空を指定したにもかかわらずちょっと黄昏色に染まってしまってはいますが、カメとサンゴがきれいな海の画像ができました。

まとめ

Amazon BedrockにてStable DiffusionのモデルSDXL0.8を用いて画像生成を実施しました。
Playgroundsではテキストからの画像生成(t2i)しか試せませんが、APIを利用することで画像から画像を生成する(i2i)ことも実施可能なようです。
それについては今後試してみたいですね。
今後も生成AIで何ができるのか探っていこうと思います。
それでは。

Acroquest Technologyでは、キャリア採用を行っています。
  • ディープラーニング等を使った自然言語/画像/音声/動画解析の研究開発
  • Elasticsearch等を使ったデータ収集/分析/可視化
  • マイクロサービス、DevOps、最新のOSSクラウドサービスを利用する開発プロジェクト
  • 書籍・雑誌等の執筆や、社内外での技術の発信・共有によるエンジニアとしての成長
  少しでも上記に興味を持たれた方は、是非以下のページをご覧ください。 www.wantedly.com

Amazon Bedrock(ClaudeV2)でLambdaのコードを生成してみた

こんにちは、最近久々にソロキャンプをしてきました菅野です。

AWS上で、 ChatGPTのようなテキスト生成AIを利用できるようになるサービス、Amazon Bedrockがリリースされました。
今回はBedrockで、LambdaのPythonコードを生成してもらいます。

利用するモデルは、ChatGPTと同レベルの性能を有しているClaudeV2を利用します。詳細はこちら

Bedrockについて執筆した別記事もあわせてご覧ください。

acro-engineer.hatenablog.com

acro-engineer.hatenablog.com

S3に保存したCSVファイルの平均を求めるLambda関数を作成する

以下のようなcsvをS3からダウンロードし、一分毎、name毎の平均を返却するLambdaを作成してもらいます。

id,name,value,timestamp
1,data_1,5.79,2023-10-25T00:00:00
2,data_3,84.84,2023-10-25T00:00:10
3,data_2,23.88,2023-10-25T00:00:20
4,data_4,56.92,2023-10-25T00:00:30
5,data_4,19.51,2023-10-25T00:00:40
6,data_1,41.2,2023-10-25T00:00:50
7,data_2,26.52,2023-10-25T00:01:00
8,data_1,77.41,2023-10-25T00:01:10
9,data_1,19.05,2023-10-25T00:01:20
10,data_1,5.24,2023-10-25T00:01:30
11,data_1,94.87,2023-10-25T00:01:40
12,data_3,17.43,2023-10-25T00:01:50
13,data_3,22.94,2023-10-25T00:02:00
14,data_4,44.15,2023-10-25T00:02:10
15,data_4,95.46,2023-10-25T00:02:20
16,data_4,16.64,2023-10-25T00:02:30

Lambdaの構成はこのようになります。

それでは早速生成してもらいましょう。 (中略)

import csv
import boto3
from datetime import datetime, timedelta

s3 = boto3.client('s3') 

def lambda_handler(event, context):

  bucket = event['bucket']
  key = event['key']

  obj = s3.get_object(Bucket=bucket, Key=key)
  lines = obj['Body'].read().decode('utf-8').splitlines()  

  reader = csv.reader(lines)
  header = next(reader)

  data = {}
  
  for row in reader:
    name = row[1]
    value = row[2] 
    timestamp = datetime.fromisoformat(row[3])

    if value == 'null':
      continue
    
    value = float(value)

    # 一分ごとの範囲を計算
    start = timestamp.replace(second=0, microsecond=0)
    end = start + timedelta(minutes=1)

    if name not in data:
      data[name] = {}

    # その一分の範囲にある場合はデータを追加 
    if start <= timestamp < end:
      if start not in data[name]:
        data[name][start.strftime('%Y-%m-%dT%H:%M:%S')] = []
      data[name][start.strftime('%Y-%m-%dT%H:%M:%S')].append(value)

  averages = {}
  
  for name, minutes in data.items():
    averages[name] = {}
    for start, values in minutes.items():
      averages[name][start] = sum(values) / len(values)
  
  print(averages)
  
  return averages

lambdaのeventからバケット名とキー名を取得、読み取った内容を計算してくれるLambdaを生成してくれました。
valueがnullの場合早期リターンをするようにして、インデントが深くならないように工夫してくれているのがうれしいポイントですね。
返り値について、日付型をDictのKeyにしているとLambdaの返り値としてシリアライズする際にエラーになる為あらかじめStr型で保存するように手動で修正しています。

Lambdaの実行結果は以下のようになりました。

{
  "data_1": {
    "2023-10-25T00:00:00": 41.2,
    "2023-10-25T00:01:00": 94.87,
    "2023-10-25T00:02:00": 85.45,
    "2023-10-25T00:04:00": 0,
    "2023-10-25T00:05:00": 40.11,
    "2023-10-25T00:06:00": 0,
    "2023-10-25T00:07:00": 49.54,
    "2023-10-25T00:08:00": 95.98,
    "2023-10-25T00:09:00": 81.28,
    "2023-10-25T00:10:00": 19.23,
    "2023-10-25T00:11:00": 2.17,
    "2023-10-25T00:12:00": 63.83,
    "2023-10-25T00:13:00": 22.27,
    "2023-10-25T00:14:00": 28.9,
    "2023-10-25T00:15:00": 37.66,
    "2023-10-25T00:16:00": 93.55,
    "2023-10-25T00:17:00": 84.35,
(以下略)

無事期待通り、user毎、一分毎のValueの平均を求めてくれました。

まとめ

BedrockにてLambda関数を出力してもらいました。
今回の内容では、データの構成だけ修正が必要にはなりましたが、AWSの構成等も理解した上で、ほぼ動作するコードを1回で出力してくれたので、実用に足る結果になっていると感じました。
今後も生成AIで何ができるのか探っていこうと思います。
それでは。

Acroquest Technologyでは、キャリア採用を行っています。
  • ディープラーニング等を使った自然言語/画像/音声/動画解析の研究開発
  • Elasticsearch等を使ったデータ収集/分析/可視化
  • マイクロサービス、DevOps、最新のOSSクラウドサービスを利用する開発プロジェクト
  • 書籍・雑誌等の執筆や、社内外での技術の発信・共有によるエンジニアとしての成長
  少しでも上記に興味を持たれた方は、是非以下のページをご覧ください。 www.wantedly.com