G-gen の佐々木です。当記事では、生成 AI モデルである PaLM 2 のチャットボットを構築した際に、モデルからの回答文で同じ文章が何度も繰り返されてしまう事象の解決策を紹介します。
前提知識
PaLM 2 は Google が開発した生成 AI モデルです。Google Cloud の機械学習サービスである Vertex AI で PaLM API として公開されており、生成 AI を使用したチャットボットの構築などに使用することができます。
PaLM 2 や PaLM 2 のモデルを使用したチャットボットについては以下の記事を参照してください。
また、以下の記事では Slack をフロントエンドとして PaLM 2 モデルを使用したチャットボットを実装しています。
当記事では、これらの記事で紹介しているような PaLM 2 を使用したチャットボットの利用時に起こりうる事象と、その解決策を解説していきます。
事象
PaLM 2 の chat-bison
や text-bison
などのモデルを使用して作成したチャットボットに対して、以下のような質問を送信したとします。
# 質問文 クラウドエンジニアの採用面接を想定して、1000文字以内の自己PR文を生成してください。
PaLM 2 からは以下のような回答が返ってきます。1回の回答で同じ文章が何度も繰り返されており、自己 PR にはとても使用できない文章になっていることがわかります。
# PaLM 2 の回答 クラウドエンジニアとして、私はクラウドコンピューティングの深い知識と経験を持ち、クラウドインフラストラクチャの設計、構築、管理に精通しています。また、クラウドセキュリティのベストプラクティスにも精通しており、クラウド環境のセキュリティを確保することができます。 私は、クラウドコンピューティングの分野で5年以上の経験を持ち、大手企業のクラウドインフラストラクチャの設計、構築、管理に携わってきました。また、クラウドセキュリティのベストプラクティスにも精通しており、クラウド環境のセキュリティを確保することができます。 私は、クラウドコンピューティングの分野で5年以上の経験を持ち、大手企業のクラウドインフラストラクチャの設計、構築、管理に携わってきました。また、クラウドセキュリティのベストプラクティスにも精通しており、クラウド環境のセキュリティを確保することができます。 私は、クラウドコンピューティングの分野で5年以上の経験を持ち、大手企業のクラウドインフラストラクチャの設計、構築、管理に携わってきました。また、クラウドセキュリティのベストプラクティスにも精通しており、クラウド環境のセキュリティを確保することができます。 私は、クラウドコンピューティングの分野で5年以上の経験を持ち、大手企業のクラウドインフラストラクチャの設計、構築、管理に携わってきました。また、クラウドセキュリティのベストプラクティスにも精通しており、クラウド環境のセキュリティを確保することができます。 私は、クラウドコンピューティングの分野で5年以上の経験を持ち、大手企業のクラウドインフラストラクチャの設計、構築、管理に携わってきました。また、クラウドセキュリティのベストプラクティスにも精通しており、クラウド環境のセキュリティを確保することができます。 私は、クラウドコンピューティングの分野で5年以上の経験を持ち、大手企業のクラウドインフラストラクチャの設計、構築、管理に携わってきました。また、クラウドセキュリティのベストプラクティスにも精通しており、クラウド環境のセキュリティを確保することができます。 私は、クラウドコンピューティングの分野で5年以上の経験を持ち、大手企業のクラウドインフラストラクチャの設計、構築、管理に携わってきました。また、クラウドセキュリティのベストプラクティスにも精通しており、クラウド環境のセキュリティを確保することができます。 私は、クラウドコンピューティングの分野で5年以上の経験を持ち、大手企業のクラウドインフラストラクチャの設計、構築、管理に携わってきました。また、クラウドセキュリティのベストプラクティスにも精通しており、クラウド環境のセキュリティを確保することができます。 私は、クラウドコンピューティングの分野で5年以上の経験を持ち、大手企業のクラウドインフラストラクチャの設計、構築、管理に携わってきました。また、クラウドセキュリティのベストプラクティスにも精通しており、クラウド環境のセキュリティを確保することができます。
PaLM 2 だけではなく、Gemini(旧称:Bard)や ChatGPT などに代表される生成 AI チャットボットでは、このような同じ文章を繰り返す回答が生成される場合があります。
たとえ文章の内容が正しくても、壊れたように同じ文章を繰り返す様子は非常にインパクトがあります。
解決策
Frequency Penalty パラメータ
PaLM 2 の回答精度をユーザー側で調整する手段として、Temperature や Top-K、Top-P などのパラメータが存在します。
PaLM 2 ではこれらの代表的なパラメータのほかに、Frequency Penalty というパラメータを設定することで、同じ文章が繰り返し生成される可能性を低くすることができます。
以下は、公式ドキュメントの Frequency Penalty に関する説明の抜粋です。
Parameter | Description | Acceptable values |
---|---|---|
frequencyPenalty | Positive values penalize tokens that repeatedly appear in the generated text, decreasing the probability of repeating content. Acceptable values are -2.0—2.0. | Minimum value: -2.0 Maximum value: 2.0 |
サンプルコード
PaLM 2 は Python 用の Vertex AI SDK から利用することができますが、2024年2月時点では Frequency Penalty パラメータを含めたリクエストを送信することができないようです。そこで、REST API 経由で Frequency Penalty パラメータを含むリクエストを送信します。
以下のコード例では Frequency Penalty の値を 0.0
に設定しており、この設定値で質問文「クラウドエンジニアの採用面接を想定して、1000文字以内の自己PR文を生成してください。」を送信すると、先ほど事例として紹介した同じ文章を何度も繰り返す回答文が返ってきます。
""" Python のバージョン: 3.12 外部ライブラリのバージョン: google-cloud-aiplatform==1.41.0 vertexai==0.0.1 """ import vertexai import google.auth from vertexai.language_models import ChatModel import json import requests # 環境変数の設定 PROJECT_ID = 'myproject' LOCATION = 'asia-northeast1' MAX_CHARACTER_COUNT = 4000 MAX_MULTI_TURN_COUNT = 50 CHAT_MODEL = 'chat-bison' TIMEZONE = 'Asia/Tokyo' LLM_PARAMETER_MAX_OUTPUT_TOKENS = 1024 # PaLM 2 の REST API エンドポイント URL = f'https://{LOCATION}-aiplatform.googleapis.com/v1/projects/{PROJECT_ID}/locations/{LOCATION}/publishers/google/models/{CHAT_MODEL}:predict' # モデルに与えるパラメータ LLM_PARAMETER_TEMPERATURE = 0.2 LLM_PARAMETER_TOP_P = 0.95 LLM_PARAMETER_TOP_K = 40 # モデルの回答に同じ文章が繰り返し現れた場合、ペナルティを与えるかどうか (-2.0 ~ 2.0) # 数字が大きいほど同じ文章が繰り返される可能性が低くなる。 FREQUENCY_PENALTY = 0.0 # モデルに送信するメッセージ MESSAGE = 'クラウドエンジニアの採用面接を想定して、1000文字以内の自己PR文を生成してください。' vertexai.init(project=PROJECT_ID, location=LOCATION) chat_model = ChatModel.from_pretrained(CHAT_MODEL) # Google Cloud のアクセストークンを取得 def get_access_token() -> str: credentials, _ = google.auth.default(scopes=["https://www.googleapis.com/auth/cloud-platform"]) auth_req = google.auth.transport.requests.Request() credentials.refresh(auth_req) return credentials.token # PaLM 2 の REST API にメッセージを送信 def send_message(token: str) -> str: # リクエストのボディ body = { 'instances': [ { 'messages': [ { 'author': 'user', 'content': MESSAGE } ] } ], 'parameters': { 'maxOutputTokens': LLM_PARAMETER_MAX_OUTPUT_TOKENS, 'temperature': LLM_PARAMETER_TEMPERATURE, 'topP': LLM_PARAMETER_TOP_P, 'topK': LLM_PARAMETER_TOP_K, 'frequencyPenalty': FREQUENCY_PENALTY } } # リクエストの送信 headers = { 'Authorization': 'Bearer ' + token, 'Content-Type': 'application/json' } response = requests.post(URL, headers=headers, json=body) if response.status_code != 200: print('ERROR: response status code is not 200.') print(f'status code: {response.status_code}') return response_content = json.loads(response.content) return response_content['predictions'][0]['candidates'][0]['content'] if __name__ == '__main__': response = send_message(get_access_token()) # PaLM 2 の回答を出力 print(response)
Frequency Penalty の調整
Frequency Penalty の値を最大の 2.0
に変更し、同じ文章が繰り返される事象が解決されるか確認してみます。
サンプルコードの以下の行を修正してから実行してみます。
FREQUENCY_PENALTY = 2.0 # 0.0 → 2.0 に修正
Frequency Penalty を 2.0
に設定した場合の回答は以下のようになりました。同じ文章の繰り返しがなくなり、比較的整った文章になっていることがわかります。
# PaLM 2 の回答
クラウドエンジニアとして、私はクラウドコンピューティングの深い知識と経験を持ち、クラウドインフラストラクチャの設計、構築、管理に精通しています。また、DevOpsやCI/CDパイプラインなどの最新の開発手法にも精通しており、効率的で信頼性の高いシステムを構築することができます。
私はチームプレイヤーでありながら独立して働くこともでき、常に新しいことを学び成長することを目指しています。またコミュニケーション能力が高く複雑な技術的コンセプトを明確かつ簡潔に説明することができます. さらに英語も堪能でグローバルなチームとのコミュニケーションにも問題ありません.
私のスキルと経験は貴社のクラウドエンジニアリングチームにとって貴重な資産になると確信しておりますのでご検討いただければ幸いです
佐々木 駿太 (記事一覧)
G-gen最北端、北海道在住のクラウドソリューション部エンジニア
2022年6月にG-genにジョイン。Google Cloud Partner Top Engineer 2024に選出。好きなGoogle CloudプロダクトはCloud Run。
趣味はコーヒー、小説(SF、ミステリ)、カラオケなど。
Follow @sasashun0805