Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
ChatGPT実践
Search
Sponsored
·
Your Podcast. Everywhere. Effortlessly.
Share. Educate. Inspire. Entertain. You do you. We'll handle the rest.
→
Ryosuke Uchiyama
May 05, 2023
Technology
390
1
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
ChatGPT実践
Ryosuke Uchiyama
May 05, 2023
More Decks by Ryosuke Uchiyama
See All by Ryosuke Uchiyama
AWSでサーバレスな書籍管理アプリを作る
step63r
0
61
PythonでSlack通知botを作る
step63r
0
23
IoT実践! 行先予定表を電子ペーパーで作る
step63r
0
45
React x Socket.ioで人狼サーバを作る 第一章 フロントエンド実装
step63r
0
32
深層強化学習で東方AI 第一章 DQNの基本
step63r
0
320
Build 2021 プレイバック
step63r
0
42
WPFで実践アプリ開発! 第四章 機能の実装 Part 2
step63r
0
61
WPFで実践アプリ開発! 第三章 機能の実装 Part 1
step63r
0
140
WPFで実践アプリ開発! 第二章 UI
step63r
0
180
Other Decks in Technology
See All in Technology
推論の観測、できていますか? 〜 Google Cloud Gemini Enterprise Agent Platformで 3つの Gemini モデルを実測して踏んだ、評価の罠 〜
shukob
PRO
0
150
設計の世代交代を乗り越える、14年続くAndroidアプリの開発戦略
sansantech
PRO
1
150
DGX Sparkを2台使って いろいろ動かす話
sonoda_mj
1
130
Guerilla InnerSource in enterprises, during the AI hype
onenashev
PRO
0
150
生成AI時代の クレデンシャルとパーミッション設計
nrinetcom
PRO
4
1.6k
Microsoft 365 Copilot chat -tekoälypalvelun tietosuojaongelmat
hponka
0
450
[DroidKaigi 2026] Making UI specifications visible: Android UI development in the AI agent era supported by Compose Screenshot Testing and galleries
syarihu
0
590
GuardDuty 検知対応を DevOps Agent で効率化しようとしている話 / GuardDuty Investigations with DevOps Agent
masahirokawahara
1
320
Kiro Crewしか勝たん!?
miu_crescent
PRO
0
180
Amazon S3 Tablesに全部任せてみた結果——コンパクション/スナップショット管理は本当に手放せるか
shigeruoda
0
410
いま、生成AIにKaggleをどこまで 任せられるか — ROGIIコンペでの進め方とTips
k951286
3
1.4k
KAEN Company Deck
kaen
PRO
0
320
Featured
See All Featured
Claude Code のすすめ
schroneko
67
230k
Why Our Code Smells
bkeepers
PRO
340
58k
Building Adaptive Systems
keathley
44
3.2k
Digital Projects Gone Horribly Wrong (And the UX Pros Who Still Save the Day) - Dean Schuster
uxyall
1
2.7k
Darren the Foodie - Storyboard
khoart
PRO
3
3.9k
GraphQLとの向き合い方2022年版
quramy
50
15k
Agile Leadership in an Agile Organization
kimpetersen
PRO
0
230
The SEO Collaboration Effect
kristinabergwall1
1
550
Why Mistakes Are the Best Teachers: Turning Failure into a Pathway for Growth
auna
0
250
The MySQL Ecosystem @ GitHub 2015
samlambert
251
13k
Chasing Engaging Ingredients in Design
codingconduct
0
300
Refactoring Trust on Your Teams (GOTO; Chicago 2020)
rmw
35
3.8k
Transcript
ChatGPT実践 Ryosuke Uchiyama 1 © 2023 minato project. step63r
2 AGENDA © 2023 minato project. 1. 概略 2. ChatGPTとは
3. 実践 4. Demo
1. 概略 3 © 2023 minato project.
きっかけ © 2023 minato project. 4 Gateboxの社長がこんなん作ってた→ https://twitter.com/takechi0209/status/1631583858650124288
つくるもの © 2023 minato project. 5 音声入力のテキストをChatGPTに投げ、返ってきた文章を音声合成で発話する。 認識精度、応答速度、抑揚、論理性などの観点でどれだけ違和感がないか検証。 音声入力 音声合成
「こんにちは」 「こんにちは!お元気ですか?...」
採用技術・FW等 © 2023 minato project. 6 動作基盤 Windows 11 (version
22H2) IDE Visual Studio 2022 アプリケーション WPF (.NET Core 6.0) 音声入力 Azure Cognitive Services (Speech to Text) チャットボット ChatGPT (gpt-3.5-turbo) 合成音声 VOICEVOX CORE 0.14.2 応答速度を高めるため、合成音声はネイティブライブラリを使用する
2. ChatGPTとは 7 © 2023 minato project.
ChatGPT © 2023 minato project. 8 ChatGPTでVoiceVoxのSDKについて質問している様子 ユーザーが入力した問いかけに対して人間のように自然言語でAIが答えてくれるチャットサービス
GPT (Generative Pretrained Transformer) © 2023 minato project. 9 OpenAIが開発した、Transformerアーキテクチャに基づく深層学習の言語モデル
オリジナルのGPTモデル GPT-1 1.17億 GPT-2 15億 GPT-3 1750億 GPT-4 推定5000億+ パラメータ数の変遷
とりあえずChatGPTを呼び出してみる © 2023 minato project. 10 import os import openai
from typing import Any, Dict, List def main(args: Any) -> None: """ Main method. Parameters ---------- args : Any Command line arguments. """ messages: List[Dict[str, str]] = [ {"role": "system", "content": "あなたは日本語でコミュニケーションできる有能なアシスタントです。"} ] openai.api_key = os.getenv("OPENAI_API_KEY") _ = openai.ChatCompletion.create( model="gpt-3.5-turbo", messages=messages ) 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 try: while True: request = input("You: ") messages.append({"role": "user", "content": request}) if len(messages) > 10: messages.pop(0) response = openai.ChatCompletion.create( model="gpt-3.5-turbo", messages=messages ) if response is not None: finish_reason = response["choices"][0]["finish_reason"] if finish_reason == "stop": answer = response["choices"][0]["message"]["content"] messages.append({"role": "assistant", "content": answer}) print(f"Assistant: {answer}") else: print(f"error: Invalid finish reason: {finish_reason}.") break else: print("error: response is null.") break except KeyboardInterrupt: pass except Exception as err: print(err) if __name__ == '__main__': main(None) 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 環境変数 "OPEN_AI_APIKEY" にAPIキーを設定し、以下のPythonスクリプトを実行
3. 実践 11 © 2023 minato project.
ソースコード © 2023 minato project. 12 step63r/ChatAIFluentWpf https://github.com/step63r/ChatAIFluentWpf
WARNING!! これから紹介するクラウドやAPIを実行するにはお金がかかります。 個人利用の範疇であれば(APIキーの漏洩とかしない限り)たかが知れた額ではありますが、 以降に記載のことを試して後でクレカ請求がきても文句言わないでください。
事前準備 © 2023 minato project. 14 1. OpenAIに登録し、APIキーを払い出す 2. VOICEVOX
COREをダウンロードしてビルドする 3. Visual Studio拡張機能のWPF UIをインストールする 4. Visual StudioでWPFを新規作成する 5. こちらを参考にヘッダ、リンカ、DLL、辞書フォルダを配置する 6. Azure環境を準備する i. Azure ADでアプリを登録する ii. Azure Cognitive Services (音声サービス) を作成し、APIキーを払い出す iii. Azure Key Vaultを作成し、シークレットにOpenAIとACSのAPIキーを格納する iv. Azure Key Vaultのアクセスポリシーで、i. で作成したアプリにシークレットの取得を許可する
全体構成 © 2023 minato project. 15 WPF (.NET Core 6)
Views Services VMs C# C# C# Azure OpenAI Native APIs C++ VOICEVOX CORE Azure Key Vault Azure Cognitive Services Core Libraries (C++) ChatGPT 1. 認証情報取得 2. 音声認識 3. レスポンス取得 4. 音声合成
アプリケーションの新規作成 © 2023 minato project. 16 「WPF UI - Compact
Navigation (MVVM | DI)」を選択する。
アプリケーション設定の追加 © 2023 minato project. 17 アプリケーション設定に以下を追加する。正攻法なのかは不明。 • AzureKeyVaultUri:Azure Key
Vaultの「コンテナーのURI」 • AzureClientID:Azure ADの「アプリケーション (クライアント) ID」 • AzureTenantID:Azure ADの「ディレクトリ (テナント) ID」 • AzureClientSecret:Azure ADの「クライアント シークレット」
NLogのセットアップ (1/3) © 2023 minato project. 18 NuGetパッケージマネージャーから以下をインストールする。 • NLog
• NLog.Extensions.Logging
NLogのセットアップ (2/3) © 2023 minato project. 19 NLog.conigを作成する。 「出力ディレクトリにコピー」を「新しい場合はコピーする」にする。
NLogのセットアップ (3/3) © 2023 minato project. 20 DIに追加する。
Azure SDKのセットアップ (1/2) © 2023 minato project. 21 NuGetパッケージマネージャーから以下をインストールする。 •
Azure.Identity • Azure.Security.KeyVault.Secrets • Microsoft.Extensions.Azure
Azure SDKのセットアップ (2/2) © 2023 minato project. 22 DIに追加する。
その他のセットアップ © 2023 minato project. 23 NuGetパッケージマネージャーから以下をインストールする。 • Betalgo.OpenAI.GPT3 •
Microsoft.Xaml.Behaviors.Wpf • NAudio
ソリューション構成 © 2023 minato project. 24 ChatAIFluentWpf Common/ VoiceVoxMetaData.cs VOICEVOX辞書のメタデータ定義
VoiceVoxResultCode.cs VOICEVOXから返却される結果コードのマネージ列挙型 Helpers/ (省略) Models/ (省略) Services/ Interfaces/ IAudioServices.cs オーディオ構成を取得するサービスインターフェイス IVoiceVoxService.cs VOICEVOXにアクセスするサービスインターフェイス ApplicationHostService.cs アプリケーションのマネージホスト AudioService.cs オーディオ構成を取得するサービス実装クラス PageService.cs ナビゲーションページを提供するサービスクラス VoiceVoxService.cs VOICEVOXにアクセスするサービス実装クラス ViewModels/ ChatAIViewModel.cs ChatGPTとの対話をする画面のViewModelレイヤ MainWindowViewModel.cs メインウィンドウのViewModelレイヤ SettingsViewModel.cs 設定画面のViewModelレイヤ Views/ Pages/ ChatAIPage.xaml ChatGPTとの対話をする画面 SettingsPage.xaml 設定画面 Windows/ MainWindow.xaml メインウィンドウ ChatAIFluentWpf.Clr ソース/ ChatAIFluentWpf.Clr.cpp VOICEVOXアクセス用のネイティブ&ラッパーのヘッダー ヘッダー/ ChatAIFluentWpf.Clr.h VOICEVOXアクセス用のネイティブ&ラッパーの実装
認証情報取得 © 2023 minato project. 25 55 services.AddAzureClients(clientBuilder => 56
{ 57 // Add a KeyVault client. 58 clientBuilder.AddSecretClient(new Uri(ChatAIFluentWpf.Properties.Settings.Default.AzureKeyVaultUri)); 59 60 // Use DefaultAzureCredential by default. 61 clientBuilder.UseCredential(new DefaultAzureCredential()); 62 }; App.xaml.cs 182 await Task.Run(() => 183 { 184 StatusBarMessage = "OpenAIの初期化中..."; 185 186 var azureSpeechApiKey = _secretClient.GetSecretAsync("AzureSpeechAPIKey").Result; 187 var openAIApiKey = _secretClient.GetSecretAsync("OpenAIApiKey").Result; ... 216 }); ChatAIViewModel.cs
音声認識 © 2023 minato project. 26 229 using (var recognizer
= new SpeechRecognizer(_speechConfig, audioConfig)) 230 { 231 CaptureButtonContent = "話してください…"; 232 IsRecording = true; 233 var result = await recognizer.RecognizeOnceAsync(); 234 IsRecording = false; 235 236 // Checks result. 237 if (result.Reason == ResultReason.RecognizedSpeech) 238 { ... 287 } ... 310 } ChatAIViewModel.cs
ChatGPTレスポンス取得 © 2023 minato project. 27 193 _openAIService = new
OpenAIService(new OpenAiOptions()) 194 { 195 ApiKey = openAIApiKey.Value.Value, 196 }); 197 198 _messages.Add(ChatMessage.FromSystem("あなたは日本語で会話ができるチャットボットです。")); ChatAIViewModel.cs 243 var completionResult = await _openAIService!.ChatCompletion.CreateCompletion(new ChatCompletionCreateRequest() 244 { 245 Messages = _messages, 246 Model = "gpt-3.5-turbo", 247 MaxTokens = 150, 248 }); 249 250 if (completionResult.Successful) 251 { ... 271 } ChatAIViewModel.cs
音声合成 © 2023 minato project. 28 51 // register VoiceVox
service. 52 services.AddSingleton<IVoiceVoxService, VoiceVoxService>(); App.xaml.cs 202 // VoiceVoxの初期化 203 var initRet = _voiceVoxService.Initialize(); ... 209 _ = LoadModelAsync(_voiceVoxSpeakerId); ChatAIViewModel.cs 257 var ret = _voiceVoxService.GenerateVoice(completionResult.Choices.First().Message.Content); 258 if (ret != VoiceVoxResultCode.VOICEVOX_RESULT_OK) 259 { ... 265 } 266 else 267 { 268 var player = new SoundPlayer(@"./speech.wav"); 269 } ChatAIViewModel.cs
4. Demo 29 © 2023 minato project.
評価 © 2023 minato project. 30 認識精度 ★★★★☆ かなり高精度。 砕けた表現や固有名詞が弱いのは致し方ないか。
応答速度 ★★★★☆ 人間と対話する時ほどではないがストレスはない。 マシンスペックやNW速度に左右されるか。 抑揚 ★★☆☆☆ 生身の人間が喋ってるのと比べるとやはり違和感が残る。 息づかいの再現度もあるのかも。 論理性 ★★★★☆ 論理的に矛盾した返事をしてくることは少ないが 相談事などは「可もなく不可もなく」な回答が多い印象。
ご清聴ありがとうございました
32 参考文献 © 2023 minato project. • オンプレミスでホストされている .NET アプリから
Azure リソースに対して認証する | Microsoft Learn • WPF UI | WPF UI • Prism(WPF)でNLogでもMicrosoft.Extensions.Logging.ILoggerにしたい - Qiita • .NETで音声処理を試してみる NAudio編 第1回 · A certain engineer "COMPLEX" • GPT (言語モデル) - Wikipedia