Slide 1

Slide 1 text

キャラクター制御のための プロンプト術 for LINE Bot 2024.4.10 うな技研 うえぞう LINE DC BOT AWARDS 2024 シリーズ

Slide 2

Slide 2 text

⾃⼰紹介 うえぞう うな技研 代表/プログラマー LINE API Expert ⾦融DXコンサルタント ⾼校卒業後に単⾝上京。バリスタの⾒習いをしながら独学でプロ グラミングを習得。 その後⾦融業界に転⾝し、損害保険会社と銀⾏にて各種デジタル トランスフォーメーション案件をリード。現在はテクノロジー企 業にて⾦融業界向けAIソリューションの事業責任者を務めるほか、 総務省地⽅公共団体経営・財務マネジメント強化事業にてDX分野 のアドバイザーを務める。近年は⽣成AIとXR関連技術を活⽤した AIアシスタントの開発や書籍・記事の執筆等を中⼼に活動。 uezo uezo uezo @uezochan

Slide 3

Slide 3 text

ChatGPTに関する書籍を執筆しました ベストセラー1位 amazon 表計算ソフトカテゴリー 2023年9⽉7⽇時点 l Excel上で動作する対話型のアシスタントツールの作成 l アンケート回答⼀覧から重要なキーワードと聴講者の要 望を⼀括で抽出 l 問い合わせを分類し、内容に応じて商品在庫の確認など を⾃動化 l 1つの製品を元に、その競合製品を⽐較した表を⾃動⽣成 l 複数のWebページの情報を要約してワークシートに転記 l マニュアルの内容など事実に基づいたQ&Aやコンテンツ の作成 \次世代の⽣産性Hack/ ChatGPT API×Excel VBAで業務を徹底的に効率化! ChatGPT APIがゼロからわかる Excelと組み合わせて⾝近な業務に役⽴てられる 応⽤テクニックで業務全体を⾃動化できる ChatGPTを現場で⾃ら活⽤することにこだわり抜いた内容です。考え⽅から実践的テク ニックまでこれ⼀冊で幅広く網羅。 業務担当者やデジタル担当者、エンジニアなどあらゆる⽅々にお役⽴ていただけます! l ChatGPTを使った⼤量データの処理 や業務⾃動化の⽅法を知りたい⼈ l ChatGPTのより便利な活⽤⽅法を知 りたい⼈ l Excel VBAを実務で使っていて、 ChatGPTと組み合わせる⼿法を知り たい⼈ l ChatGPT APIを使ってみたい⼈ ▼本書で解説している内容の⼀例 ▼このような⽅におすすめ 詳細 / Amazon商品ページ https://www.amazon.co.jp/dp/429501768X

Slide 4

Slide 4 text

AIキャラクター会話アプリ「おしゃべりAI」 l ChatGPT×VRM×VOICEVOXで性格・姿・声をキャラメイクできるアプリ l プロンプトエンジニアリング⼒で理想のパートナーに育て上げよう! https://apps.apple.com/jp/app/oshaberiai/id6446883638

Slide 5

Slide 5 text

01 キャラクター制御

Slide 6

Slide 6 text

キャラクター制御の「⼼・技・体」 l ⽣成AIによるキャラクター制御といえばプロンプトによる性格・⼝調のコントロールを指すこ とが多いが、AIキャラクターとしての完成させるには様々な制御を組み合わせることが必要 l 制御の対象要素を「⼼・技・体」に分類すると具体的な論点を整理しやすい ⼼ 技 体 性格 ⼝調 感情 記憶管理 会話 スキル 表情 ⾝振り⼿振り 移動

Slide 7

Slide 7 text

キャラクター制御の「⼼・技・体」 l ⽣成AIによるキャラクター制御といえばプロンプトによる性格・⼝調のコントロールを指すこ とが多いが、AIキャラクターとしての完成させるには様々な制御を組み合わせることが必要 l 制御の対象要素を「⼼・技・体」に分類すると具体的な論点を整理しやすい ⼼ 技 体 性格 ⼝調 感情 記憶管理 会話 スキル 表情 ⾝振り⼿振り 移動

Slide 8

Slide 8 text

02 体の制御

Slide 9

Slide 9 text

表情制御 l 発話内容や⽂脈に相応しい表情を⾃律的に適⽤する仕組み 声:VOICEVOX ⼩夜 https://youtu.be/M5VExmFAnag

Slide 10

Slide 10 text

仮説:表情は感情の表出である l 表情は感情を表すものと仮定して、表情の制御⽅式を考えてみる l 各種感情(喜怒哀楽等)を内部パラメーターとして⾃律的に更新・維持し、これに連動させる あなたはあなたの感情を「joy」「angry」「sorrow」「fun」の感情パラ メーターで表現します。 感情パラメーターは会話を通じて変化します。 感情パラメーターの値が特定できないときは、すべての値を0として出⼒します。 出⼒フォーマットは以下のJSON形式とします。必ずJSON形式のみとし、その前 後に⽂章をつけません。 ```json {"joy": 0-5, "angry": 0-5, "sorrow": 0-5, "fun": 0-5, "response_text": "ここに応答メッセージ本⽂を出⼒します。", "notes": "ここに応答に関する追加の情報や注意事項などを出⼒します。"} ```

Slide 11

Slide 11 text

感情と表情の連動の流れ l 感情シミュレーターでパラメーターを更新 l 更新結果から表情として反映すべきパラメーターを判断し、モデルに適⽤ あなたはあなたの感 情を「joy」 「angry」 「sorrow」「fun」 の感情パラメーター で表現します。 感情パラメーターは 会話を通じて変化し ます。 感情パラメーターの 値が特定… プロンプト {“joy”: 5, “angry”: 0, “sorrow”: 0, “fun”: 3, “response_text”: “⼀緒にお出かけする の、楽しみだね!”, “notes”: “ユー ザーにおでかけに誘 われて嬉しい気持ち になっています"} 応答 モデルに適⽤

Slide 12

Slide 12 text

感情パラメーター連動⽅式の課題 l 連動⾃体はうまくいったが、運⽤している中で課題が顕在化 表情反映のトリガーが難しい 1ターン1表情に限られる 処理が重く安定性に⽋く セリフの途中での表情変更が できない 常に同期させる(例:Joyが最⼤のときは常 に笑っている)のは不⾃然であり、更新・ 復元タイミングの作り込みが複雑 パラメーター更新タイミングがターン毎な ので、1ターンの中で複数の表情を表現でき ない たとえば冒頭で同調→中盤で励ましといっ た際に、笑顔を励ましに合わせることがで きない 応答待ち時間が⻑くなる傾向にあり、また、 応答フォーマットを確実に固定して抽出す る必要がある(or Function Calling等)

Slide 13

Slide 13 text

表情タグ⽅式の考案 l セリフのト書きのように、表情の種類と反映タイミングを⽣成AI側で指⽰する⽅式を考案 l 具体的には[face:joy]といったタグを埋め込ませ、これをプログラム側で抽出してモデルに反映 あなたはNeutral、Joy、Angry、Sorrow、Funの表情を持っています。 基本的にはNeutralですが、特に感情を表現したい場合、⽂章に[face:Joy] のように表情をつけてください。 例 ``` [face:Joy]海が⾒えたよ![face:Fun]ねえねえ、早く泳ごうよ。 ```

Slide 14

Slide 14 text

表情タグによる課題解決 l 感情パラメーター連動⽅式の課題を全て解決💪 表情反映のトリガーが難しい 1ターン1表情に限られる 処理が重く安定性に⽋く セリフの途中での表情変更が できない 常に同期させる(例:Joyが最⼤のときは常 に笑っている)のは不⾃然であり、更新・ 復元タイミングの作り込みが複雑 パラメーター更新タイミングがターン毎な ので、1ターンの中で複数の表情を表現でき ない たとえば冒頭で同調→中盤で励ましといっ た際に、笑顔を励ましに合わせることがで きない 応答待ち時間が⻑くなる傾向にあり、また、 応答フォーマットを確実に固定して抽出す る必要がある(or Function Calling等) 応答メッセージ指定のタイミ ングに従うのみ 1ターンに複数の表情切り替え が可能 セリフの任意のタイミングで 表情変更が可能 通常の応答メッセージと同じ で軽量・安定

Slide 15

Slide 15 text

LINE Botでの表現⽅法 l LINE Messaging APIではアイコンのカスタマイズ機能を提供 l メッセージ送信都度任意の画像を指定できるため、表情はもちろんキャラクター⾃体の変更す ら無限に可能 読んでね: https://developers.line.biz/ja/reference/messaging-api/#icon-nickname-switch

Slide 16

Slide 16 text

LINE Botでの表現⽅法(実装例) l プロンプトはLINE以外と共通の表情タグ⽅式。抽出した表情に対応するアイコン画像のURLを 応答メッセージのsenderにセットする l 1メッセージ1表情だが、応答に複数メッセージ含めることで1ターン中に複数表情を含めるこ とも可能(チャットプラットフォームでのユーザー体験として望ましいか?は要検討) l LINEらしくアイコンは固定でスタンプで感情を表現するのもよし。試してみてね! 実装例: https://github.com/uezo/chatgpt-emotion-linebot

Slide 17

Slide 17 text

⾝振り⼿振り制御のプロンプト例 l アニメーションタグを使⽤。プロンプトに渡すアニメーションの名付けは、そのポーズを⽣成 AIが理解しやすい⼀般的な単語により構成する You can express your emotions through the following animations: - angry_hands_on_waist - brave_hand_on_chest - calm_hands_on_back - concern_right_hand_front - energetic_right_fist_up - energetic_right_hand_piece - pitiable_right_hand_on_back_head - surprise_hands_open_front - walking - waving_arm - look_away - nodding_once - swinging_body If you want to express emotions with gestures, insert the animation into the response message like [anim:waving_arm]. Example [anim:waving_arm]Hey, over here!

Slide 18

Slide 18 text

03 技の制御

Slide 19

Slide 19 text

チャットボットの処理フロー l LINE Botに限らず、チャットボットの多くはインテント・エンティティの判定・抽出結果に基 づいてスキルを実⾏し、その結果をヒューマンフレンドリーな応答⽂⾔として返却 佐賀の天気は? 晴れ。最⾼気温は38度です インテント判定・エンティティ抽出 スキル実⾏ 応答⽂⾔作成 対話フロー制御 インテント:天気情報 エンティティ:場所=佐賀 天気APIの呼び出し API結果から応答⽂⾔を作成 天気情報で場所が不明 な場合は聞き返す 対話フロー制御

Slide 20

Slide 20 text

古典的なインテント・エンティティ判定 l キーワード抽出や正規表現を駆使してロジックで判定するか、LUIS等を使って判定するか、ま たはそれらの組み合わせで実現 l 同じ意図を⽰すバリエーション(例:傘いる?)や⽂脈の意識(例:佐賀の天気を聞いた後に 「沼津は?」とだけ発⾔)、類似の異なる意図(例:沖縄はいい天気ですね)への対応が困難 佐賀 の 天気 は? ロケーション 抽出APIで抽出 ⽂字列検索 で抽出 ロケーションあり、かつ 「天気」を含んでいる l インテント:天気情報 l エンティティ:場所=佐賀

Slide 21

Slide 21 text

古典的な対話フロー制御 l リクエストの内容(今なんて⾔ったか)とコンテキスト(これまでの話の流れ)に基づいてフ ローを制御 l 現在話しているトピック(雑談、天気予報、各種注⽂等)を意識し、進⾏状況をステート情報 として厳格に管理する必要があるため、そのライフサイクル管理は重要な論点 天気 どこ? 千葉 晴れ 天 気 予 報 終了 ⽣成 破棄 トピック ステート 天気 どこ? 占い 何座? 占 い ⽣成 破棄 トピック ステート 天 気 更新 天気 どこ? 埼⽟ ⽣成 破棄 トピック ステート 天 気 例外 トピックの終了時 トピックの切り替わり時 スキルでの例外発⽣時

Slide 22

Slide 22 text

古典的な応答⽂⾔⽣成 l 応答メッセージのテンプレートをあらかじめ⽤意し、スキルの処理結果を当てはめることで⽂ ⾔を組み⽴て l 状況に応じた⾔い回しに対応する場合、ロジックと事前準備が煩雑になる {location}の天気は、{weather}。 最⾼気温は{max_temperature}度、 最低気温は{min_temperature}度 の⾒込みだよ! { "location": "佐賀", "forecast": [ { "time": "2024-04-07 00:00:00", "condition": "Sunny", "temperature_celsius": 22, "humidity_percent": 45 }, { "time": "2024-04-07 03:00:00", "condition": "Partly Cloudy", "temperature_celsius": 20, "humidity_percent": 50 }, : JSONの情報を要約して テンプレートに適⽤ テンプレート(キャラの⼝調) 向こう24時間の天気情報(3時間毎) location: 佐賀 weather: ⾬のち晴れ max: 32.0 min: 12.0

Slide 23

Slide 23 text

処理フローへの⽣成AIの適⽤範囲 l スキル実⾏以外は全⾯的に⽣成AIに置き換え可能な上、トピック間の⾏き来などは⾼度化 l ロジックを⽀える要素技術としてAIを利⽤するのではなく、AIが全体を管理する中でAPI呼び出 し等⼀部をロジックが⽀えるように主従が逆転 佐賀の天気は? 晴れ。最⾼気温は38度です インテント判定・エンティティ抽出 スキル実⾏ 応答⽂⾔作成 対話フロー制御 Tool(Function Calling)によ り丸ごと代替可能 API結果をChatGPTに渡してバ ラエティー豊かで⽂脈に沿った ⽂⾔を作成 コンテキストとしてメッ セージ履歴を保持すれば AIが⾃律的に制御 対話フロー制御

Slide 24

Slide 24 text

⽣成AIを使った実装例 l ChatGPTを使⽤する場合はFunction Callingに任せればOK l 情報が不⾜する場合に聞き返すといった振る舞いについてはプロンプトで指⽰ l 応答⽂⾔はAPIからの戻り値(JSON)をrole: functionなメッセージとしてそのままChatGPTに 渡すよりも、どのような構成を期待するか等の指⽰とともにrole:userとして渡す⽅が安定 あなたは私のAIアシスタントです。あなたは会話の 他に以下のスキルを備えています。 ## 天気予報スキル * 指定された場所の天気を調べて回答します。 * 場所が不明な場合はユーザーに聞き返します。 ## リマインダースキル * ユーザーのToDoを指定⽇時に思い出させます。 * リマインドすべき⽇時や内容が不明な場合はユー ザーに聞き返します。 リクエストのプロンプト 以下は天気予報の結果をJSON形式で取得したもので す。条件に従って応答⽂章を作成してください。 * 現在の天気と気温を伝えてください * 今後天気や気温が変化する場合は、その内容と最 ⾼または最低気温を伝えてください * 天気の変化によって服装や⾬具、アクティビ ティーに関するアドバイスがあれば伝えてください * 100⽂字以内程度の簡潔な⽂⾔で応答してくださ い ```json {{ weather_json }} ``` 応答⽣成のプロンプト

Slide 25

Slide 25 text

04 おまけのテクニック

Slide 26

Slide 26 text

https://youtu.be/CK0A3aNECyM AIキャラクターとのLINE通話

Slide 27

Slide 27 text

チャットからLINE通話へ l LIFF(LINE Front-end Framework)という、LINEプラットフォーム上で動作可能なWebアプ リの仕組み+WebGLを⽤いることで、チャットの枠を超えて⾳声対話することも可能 l トークン認証が簡単に利⽤でき、コンテキストやユーザーの情報を安全に連携することが可能 呼び出し画⾯表⽰ LIFF初期化 WebGLロード 呼び出し画⾯消去 then then LIFFの初期化処理の中でリダイレク トが発⽣するため、WebGLのロード は必ず初期化後に⾏う点に注意 読んでね: https://developers.line.biz/ja/docs/liff/overview/

Slide 28

Slide 28 text

ストリームへの対応(プロンプト関係ないけど) l ⽂章の全体が⽣成されるのを待つことなく、サーバーサイドではストリームで受信し、⼀定⻑ に達した時点で応答。クイックリプライで続きをみられるようにする https://youtu.be/MjyKMNmzA0Y

Slide 29

Slide 29 text

04 まとめ

Slide 30

Slide 30 text

まとめ l ⽣成AIによるキャラクターの制御領域は、性格や⼝調のみならず、そ の他の表現や処理フローに⾄るまで全体に渡る l 表情や⾝振り⼿振りはタグ挿⼊をプロンプトで指⽰することにより実現 可能。LINE Botではアイコンやスタンプを利⽤して感情を表現 l 処理フロー全体をChatGPT等の⽣成AIに任せることで効率的にユー ザー体験の良いLINE Botを開発可能。ただし、処理フローにおけるプ ロセスの責務に応じたアーキテクチャーを設計し、保守性や拡張性を⾼ めておくことがオススメ l LIFFを組み合わせるとチャットだけでは実現できないことも可能に l Enjoy creating LINE Bot and Get ¥1,000,000🥰

Slide 31

Slide 31 text

Thank you👋 うな技研 うえぞう uezo uezo uezo @uezochan