diff --git a/00-course-setup/translations/ja-jp/README.md b/00-course-setup/translations/ja-jp/README.md new file mode 100644 index 000000000..efb5d5b3f --- /dev/null +++ b/00-course-setup/translations/ja-jp/README.md @@ -0,0 +1,137 @@ +# このコースを始めるために + +私たちは、皆様がこのコースを開始し生成 AI で何を創り出すのかを見るのが、とても楽しみです! + +皆様がこのレッスンを成功できるよう、セットアップ手順と技術要件そして必要な時に情報を得る方法を、このページにまとめました。 + +## セットアップ手順 + +このコースを始める前に、下記の手順を実施してください。 + +### 1. リポジトリのフォーク + +コードを修正したりレッスンの課題を完了するため、このリポジトリ全てをご自身の GitHub アカウントで[フォーク](https://github.com/microsoft/generative-ai-for-beginners/fork?WT.mc_id=academic-105485-yoterada)してください。また、簡単にこのリポジトリを見つけれるよう、[スター(🌟)をつける](https://docs.github.com/en/get-started/exploring-projects-on-github/saving-repositories-with-stars?WT.mc_id=academic-105485-yoterada)こともできます。 + +### 2. codespaces を作成 + +コードを実行する際、依存関係の問題を避けるため、GitHub codespaces で、このコースを実行することをお勧めします。 + +codespaces は、上記でフォークしたリポジトリの `Code` を選択し、**Codespaces** オプションを選択することで作成できます。 + +### 3. API キーの保管 + +アプリケーションを構築する際、API キーを安全に管理することはとても重要です。公開リポジトリにこうした機密情報をコミットすると、不正利用による想定外のコストや問題が発生する可能性があります。そこで、作業中のコードに直接 API キーを保存しないようにしてください。 + +![codespaceを作成するボタンを示すダイアログ](../../images/who-will-pay.webp?WT.mc_id=academic-105485-yoterada) + +## ローカルのコンピュータで実行する方法 + +ローカルのコンピュータ上で、コードを実行するためには、[Python のインストール](https://www.python.org/downloads/?WT.mc_id=academic-105485-yoterada)が必要です。 + +そして、リポジトリを使用するためクローンする必要があります + +```shell +git clone https://github.com/microsoft/generative-ai-for-beginners +cd generative-ai-for-beginners +``` + +これですべての準備が整いましたので、学習と作業を始めることができます。 + +### miniconda のインストール (オプションの手順) + +**[miniconda](https://conda.io/en/latest/miniconda.html?WT.mc_id=academic-105485-yoterada)** のインストールをお勧めします - これは、異なる Python **仮想環境**で `conda` パッケージ・マネージャをサポートする、比較的軽量なインストーラーです。`conda` を利用すると、異なる Python のバージョンやパッケージを簡単にインストールでき、切り替えるもできます。さらに、`pip` 経由で入手できないパッケージのインストールもできます。 + +miniconda をインストールした後、リポジトリをクローンしてください(まだ行っていない場合)。そして、このレッスン用の仮想環境を作成してください: + +下記の手順を実行する前に、まず *environment.yml* ファイルが存在していることをご確認ください。*environment.yml* ファイルは、conda 環境の構築に必要な依存関係を定義した設定ファイルで、下記のような内容を記述します: + +```yml +name: +channels: + - defaults +dependencies: +- python= +- openai +- python-dotenv +``` + +`` には、この conda 環境名を設定し、`` には使用する Python のバージョンを記述してください。作成した *environment.yml* ファイルはリポジトリ内の *.devcontainer* フォルダ配下に置いてください。 + +*environment.yml* ファイルを作成した後、下記のコマンドを実行し、conda 環境を作成します: + +```bash +conda env create --name ai4beg --file .devcontainer/environment.yml +conda activate ai4beg +``` + +仮に何らかの問題が発生した場合は、ユーザ・ガイドの [conda 環境](https://docs.conda.io/projects/conda/en/latest/user-guide/tasks/manage-environments.html?WT.mc_id=academic-105485-yoterada)をご参照ください。 + +### Python の拡張機能をインストールした Visual Studio Code の使用 + +本カリキュラムを進めていく上で最もお勧めの方法は、[Python の拡張機能を](https://marketplace.visualstudio.com/items?itemName=ms-python.python&WT.mc_id=academic-105485-yoterada)インストールした [Visual Studio Code](http://code.visualstudio.com/?WT.mc_id=academic-105485-yoterada) のご利用です。 + +> **ご注意**: クローンした後、VS Code でディレクトリを開くと、自動的に Python 拡張機能のインストールが提案されます。上記で説明したように miniconda もインストールする必要があります。 + +> **ご注意**: ローカルにインストールした Python を利用したい場合、VS Code がコンテナでリポジトリを再度開くことを提案した際、コンテナでの起動を拒否してください。 + +### ブラウザで Jupyter の使用 + +ご自身のコンピュータの Web ブラウザから直接、Jupyter 環境を使用することもできます。実際クラシックな Jupyter と Jupyter Hub は、自動補完、コード・ハイライトなどの機能を備えた非常に便利な開発環境を提供します。 + +Jupyter をローカルで起動するには、レッスン・コースのディレクトリに移動し、下記のコマンドを実行します: + +```bash +jupyter notebook +``` + +もしくは + +```bash +jupyterhub +``` + +次に任意の `.ipynb` ファイルに移動し、ファイルを開いて作業を開始できます。 + +### コンテナでの実行 + +ローカル環境に Python をインストールする代わりに、コンテナ上で実行することもできます。このプロジェクトを fork するとレポジトリ内に、コンテナ環境を構築するために必要な設定を含む `.devcontainer` フォルダが存在します。そこで、VS Code は起動時にコンテナで実行することを提案します。コンテナで実行する為には、事前に Docker のインストールが必要で、少し複雑になるため経験豊富なユーザーにお勧めします。 + +GitHub codespaces を使用して API キーを安全に管理するためには、Codespace Secrets の利用が最適です。[codespaces のシークレットを管理](https://docs.github.com/en/codespaces/managing-your-codespaces/managing-secrets-for-your-codespaces?WT.mc_id=academic-105485-yoterada)する方法については、このガイドをご参照ください。 + +## レッスンと技術要件 + +このコースは、6 つの概念レッスンと 6 つのコーディング・レッスンがあります。 + +コーディング・レッスンでは、Azure OpenAI サービスを使用します。コードを実行するには、Azure OpenAI サービスへのアクセスと API キーが必要です。[このアプリケーション・フォームを完了](https://go.microsoft.com/fwlink/?linkid=2222006&clcid=0x409?WT.mc_id=academic-105485-yoterada)することで Azure OpenAI へアクセス申請できます。 + +アプリケーション・フォーム申請処理の完了を待つ間、何もできないわけではなく、各レッスン中に、`README.md` ファイルとサンプル・コードが含まれていますので、申請処理の完了前でもレッスンの内容をご確認いただけます。 + +## Azure OpenAI サービスをはじめて使用する場合 + +仮に Azure OpenAI サービスをはじめて使用する場合は、[Azure OpenAI サービス・リソースを作成しデプロイする方法](https://learn.microsoft.com/azure/ai-services/openai/how-to/create-resource?pivots=web-portal&WT.mc_id=academic-105485-yoterada)はこちらのガイドをご参照ください。 + +## 他の学習者との交流 + +他の学習者と交流できるように、私たちは公式 [Discord AI コミュニティ・サーバー](https://aka.ms/genai-discord?WT.mc_id=academic-105485-yoterada)にチャンネルを作成しました。生成 AI の技術を向上したいと考える他の方々、たとえば、志の同じ起業家、開発者、学生、そして、どなたとでも交流していただく事が可能です。 + +[![Discord チャンネルに参加](https://dcbadge.vercel.app/api/server/ByRwuEEgH4)](https://aka.ms/genai-discord?WT.mc_id=academic-105485-yoterada) + +このプロジェクトを開発したチーム・メンバーも、この Discord サーバーに参加し学習者を支援しています。 + +## 貢献 + +本レッスンはオープンソース・プロジェクトとして公開しています。仮に改善すべき点や問題を発見したら、[プルリクエスト](https://github.com/microsoft/generative-ai-for-beginners/pulls?WT.mc_id=academic-105485-yoterada)をお送りいただくか、もしくは、[GitHub の Issue](https://github.com/microsoft/generative-ai-for-beginners/issues?WT.mc_id=academic-105485-yoterada) で報告していただければ幸いです。 + +このプロジェクトの開発チームは全ての貢献を確認しています。オープンソースにご貢献いただくことは、生成 AI の分野で新しいキャリアを築くのに良い方法かもしれません。 + +多くの場合、貢献者はコントリビューター・ライセンス契約(CLA)に同意して頂く必要があります。これは貢献者が持っている権利を、私たちに、皆様の貢献を使用する権利を実際に与えて頂くことを宣言するための契約です。詳細については [CLA、コントリビューターライセンス契約のウェブサイト](https://cla.microsoft.com?WT.mc_id=academic-105485-yoterada)をご覧ください。 + +重要なお知らせ:このリポジトリ内に含まれるテキストを翻訳する場合、機械翻訳の使用は避けてください。翻訳の内容はコミュニティで検証するため、ご自身が熟知している言語でのみ翻訳作業にご協力ください。 + +プル・リクエストを提出すると、CLA-bot が自動的に CLA(コントリビューター・ライセンス契約)の提出が必要かどうかを判断し、プル・リクエストに適切なマーク(例:ラベル、コメント)を付けます。bot の指示にお従いください。この処理は、CLA を使用するすべてのリポジトリで一度だけ行う必要があります。 + +このプロジェクトは、[Microsoft Open Source Code of Conduct](https://opensource.microsoft.com/codeofconduct/?WT.mc_id=academic-105485-yoterada) を採用しています。詳細は、Code of Conduct FAQ をご覧いただくか、追加の質問やコメントがある場合は、[メールで opencode](opencode@microsoft.com) にお問い合わせください。 + +## それでは、始めましょう + +このレッスンを修了するために必要な手順をすべて完了したので、[生成 AI と大規模言語モデルの紹介](../../../01-introduction-to-genai/translations/ja-jp/README.md?WT.mc_id=academic-105485-yoterada) から始めましょう。 diff --git a/01-introduction-to-genai/translations/ja-jp/README.md b/01-introduction-to-genai/translations/ja-jp/README.md new file mode 100644 index 000000000..edcae7309 --- /dev/null +++ b/01-introduction-to-genai/translations/ja-jp/README.md @@ -0,0 +1,169 @@ +# 生成 AI と大規模言語モデルの紹介 + +[![Introduction to Generative AI and Large Language Models](../../images/01-lesson-banner.png?WT.mc_id=academic-105485-yoterada)](https://youtu.be/vf_mZrn8ibc?WT.mc_id=academic-105485-yoterada) + +> *(上記の画像をクリックすると、レッスン・ビデオを表示します)* + +生成 AI は、テキストや画像などのコンテンツを生成する人工知能です。この技術が素晴らしいのは、AI を誰にでも使えるようにしている所で、自然言語で書いた文章やテキスト・プロンプトだけで利用できる点です。 +価値あることを成し遂げるために、Java や SQL のような言語を学ぶ必要はありません。自分の言葉で要望を伝えるだけで、AI モデルから提案が返ってきます。この技術を使えば、報告書を書いたり理解したり、アプリケーションを作成したりといったことが、わずか数秒で可能になります。その可能性と影響力は計り知れません。 + +このカリキュラムで、スタートアップ企業が教育分野で新たな可能性を切り開くために生成 AI をどのように利用しているか、またその応用に伴う社会的影響や、技術的な制限によって避けられない課題にどう対処しているかを詳しく見ていきます。 + +## レッスン内容の紹介 + +このレッスンでは、下記の内容について説明します。 + +* ビジネスシナリオの紹介: スタートアップのアイデアとミッション +* 生成 AI と、技術的な歴史背景 +* 大規模言語モデルの内部動作 +* 大規模言語モデルの主な機能と実用的なユースケース + +## 学習目標 + +このレッスンを修了すると、下記を理解できます: + +* 生成 AI とは何か、そして大規模言語モデルの仕組みを理解する +* 教育シナリオに重点を置き、さまざまなユース・ケースで大規模言語モデルを活用する方法を理解する + +## シナリオ: 教育関連事業をターゲットにするスタートアップ企業 + +生成 AI は AI 技術の最高峰に位置付けられ、かつては不可能と思われていたことにも挑戦し、新たな可能性を広げています。 +生成 AI モデルは様々な機能と用途で利用可能ですが、このカリキュラムでは、架空のスタートアップ企業を通じて教育分野でどのように革新していくのかを学んでいきます。この新興企業を「スタートアップ」と呼ぶことにします。 +スタートアップは、教育の領域において下記の野心的な目標を持って事業を行っています。 + +> *世界規模で学習の利便性を高め、教育に対する平等な機会を実現し、学習者一人ひとりの要望に応える個別学習体験を提供します。* + +スタートアップ・チームは、現在最も強力なツールである大規模言語モデル(LLM)を活用せず、この目標を達成する事は難しいと考えています。 + +生成 AI を利用すると、生徒は 24 時間いつでも問い合わせ可能なバーチャルの教師から、大量の情報や例を得られるようになり、教師も生徒の成績を評価しフィードバックするために、新しいツールが使えるようになると考えられ、現在の学習方法や指導方法に革命をもたらすと考えられています。 + +![モニターを見つめる5人の若い学生 - DALLE2 による画像](../../images/students-by-DALLE2.png?WT.mc_id=academic-105485-yoterada) + +まず、カリキュラム全体を通じて使用する、基本的な概念と用語を定義しましょう。 + +## 生成 AI はどのようにして生まれたのでしょうか? + +最近発表された、生成 AI モデルは大きな注目を集めていますが、この技術は数十年にわたる開発の歴史があり、初期の研究は 1960 年代までさかのぼります。そして今、AI 技術は [OpenAI の ChatGPT](https://openai.com/chatgpt) や [Bing Chat](https://www.microsoft.com/edge/features/bing-chat?WT.mc_id=academic-105485-yoterada) のように会話能力を有するなど、人間の認知能力を持つレベルにまで達しています。また、これらのチャットシステムは、Bing の Web 検索における会話でも GPT モデルを採用しています。 + +AI の歴史を振り返ると、初期の AI のプロトタイプは、タイプライター式のチャットボットで、専門家集団から抽出した知識をベースに、それをコンピューターに表現していました。知識ベースによる回答は、入力テキスト内に出現するキーワードがトリガーになっていました。しかし、タイプライター式のチャットボットは、スケール・アウトが難しい事がすぐに分かりました。 + +### 統計学的手法を基にした AI 技術: 機械学習 + +1990年代に入り、テキスト解析に統計学的手法を応用したことで、転換点が訪れました。 +これにより、データからパターンを学習できる新しいアルゴリズムが開発されました。これは「機械学習」として知られ、学習にプログラミングを必要としません。この手法を用いることで、機械は人間の言語理解を再現することが可能になります。テキストとラベルの組み合わせで訓練された統計モデルが、メッセージの意図を示す定義済みのラベルで、未知の入力テキストを分類することができるようになります。 + +### ニューラルネットワーク(神経回路網)と最新の仮想アシスタント + +最近では、より大量のデータと、複雑な計算を処理できるハードウェアの進化が、AI 分野の研究をさらに促進し、ニューラル・ネットワークやディープラーニング・アルゴリズムと呼ばれる高度な機械学習アルゴリズムの開発につながりました。 + +ニューラルネットワーク(特に再帰型ニューラルネットワーク - RNN と呼ばれる)は、自然言語処理を飛躍的に進化させ、文章中に含まれる単語の意味を、文脈を考慮して評価し、より有益な方法でテキストの意図を表現できるようになりました。 + +この技術は、21 世紀の初頭に登場したバーチャル・アシスタントの基盤となり、人の言葉を読み取って要求を識別し、それに応じた行動を取ることができます。例えば、事前に用意したスクリプトで応答したり、外部サービスを利用することが含まれます。 + +### 現在の生成 AI + +このような経緯を経て、今日における生成 AI が誕生しました。これはディープラーニングのサブセットとして捉えることができます。 + +![AI, ML, DL and Generative AI](../../images/AI-diagram.png?WT.mc_id=academic-105485-yoterada) + +長年の AI 研究を経て、*トランスフォーマー* と呼ばれる新しいモデルのアーキテクチャが登場し、RNN の限界を越え、より長文テキストのシーケンスを入力として受け取ることができるようになりました。トランスフォーマーは、アテンションメカニズム(注意機構)を採用しており、モデルが、受け取った入力に対して異なる重み付けを行うことができます。これにより、テキスト内の単語の並ぶ順番に関わらず、最も関連性の高い情報が集中している部分に「より多くの注意を払う」ことができます。 + +最近の生成 AI モデルの多くは、文章の入出力を行う「大規模言語モデル(LLMs)」とも呼ばれており、実際にこのアーキテクチャに基づいています。これらのモデルが注目される理由は、書籍、記事、ウェブサイトなど様々な情報源から、膨大なラベルなしデータとして訓練されているにも関わらず、創造性を備え文法も正しい文章を作り出すのが特筆すべき点です。したがって、これらのモデルは、機械が単に入力されたテキストを「理解」する力を飛躍的に向上させただけでなく、人間の言葉で独自の回答を作り出す力も実現しました。 + +## 大規模言語モデルの仕組みを教えてください? + +次の章では、さまざまな種類の生成 AI モデルについて詳しく説明しますが、その前に、OpenAI の GPT(Generative Pre-trained Transformer)モデルを中心に、大規模言語モデルがどのように機能するのかを確認しましょう。 + +* **トークナイザー、テキストから数値へ**: 大規模言語モデルは、テキストを入力として受け取り、テキストを出力として生成します。ただし、統計モデルのため、テキストシーケンスよりも数値の方が、とてもうまく機能します。そこでモデルに対するすべての入力は、コア・モデルが使用する前に、トークナイザーで処理されます。トークンは文字の塊で、可変数の文字から構成されています。トークナイザーは、入力された文字列をトークン毎に分割し、トークン配列に格納する処理を行います。その後、各トークンはトークン・インデックスと結びつけられます。トークン・インデックスは元のテキストのチャンク(断片)を整数で符号化したものになります。 + +![トークン化の例](../../images/tokenizer-example.png?WT.mc_id=academic-105485-yoterada) + +* **出力トークンの予測**: 入力として n 個のトークンを受け取ると(モデルによって n の最大値は異なります)、モデルは出力として 1 個のトークンを予測する力を持っています。この予測されたトークンは次の反復処理の入力に追加され、拡張ウィンドウ・パターンにより、ユーザーが 1 つ以上の文を回答として得られるようになります。これは、ChatGPT を試したことがある人なら、文の途中で時々処理が停止するような動きにつながる理由です。 + +* **選考過程、確率分布**: モデルは、現在のテキストの順番の後ろに続く文字を、確率的に可能性の高い結果に基づいて出力トークンを選びます。これは、モデルが過去の訓練に基づいて、「次に出現するトークン」の各選択肢についてどれだけの確率があるかを計算し、その全体の確率分布を推定しているからです。ただし、得られた分布から最も確率の高いトークンが必ず選ばれるとは限りません。この選択には、ある程度のランダム性が導入されており、モデルが決定的に振る舞わないようにしています。- つまり同じ入力に対して必ずしも同じ出力が得られるわけではないのです。このランダム性は、創造的な思考過程を模倣するために導入され、温度(temperature)というパラメータで調整ができます。 + +## スタートアップは、大規模言語モデルをどのように活用できるでしょうか? + +大規模言語モデルについて、内部動作の理解が深まったところで、ビジネス・シナリオも視野に入れて、大規模言語モデルをうまく活用するための、実践的な例をいくつか見てみましょう。 + +大規模言語モデルが最も得意とするのは、自然言語で記述されたテキストの入力から、新しいテキストを作ることだと述べました。 + +しかし、具体的にどのようなテキストの入力と出力を想定しているのでしょうか? +大規模言語モデルの入力は「プロンプト」と呼ばれ、出力は「コンプリーション」と呼ばれています。これは、モデルが現在の入力に続く次のトークンを生成する仕組みを表しています。これからプロンプトの意味や、モデルを最大限に活用するための設計方法について詳しく見ていくことになりますが、とりあえず現時点では、プロンプトは以下のような要素が含まれるとお考えください: + +* モデルに対して、期待する出力の種類を指定する**指示**。この指示には、場合によって具体例やその他のデータを追加で組み込むことがあります。 + + 1. 記事、書籍、製品レビューなどの要約と、非構造化データから知見(インサイト)の抽出 + + 訳者追記: + - Can you please summarize the following text for me ? + - 以下のテキストの内容を要約していただけますか? + + ![Example of summarization](../../images/summarization-example.png?WT.mc_id=academic-105485-yoterada) + +
+ + 1. 記事、エッセイ、課題などのアイデアとデザインの作成 + + 訳者追記: + - Please write an assignment for high school students including four open-ended questions about Louis XIV and his court. + - 高校生用の課題を作成します。ルイ14世と彼の宮廷について、自由に回答できる 4 つの質問を作成してください。 + + ![Example of creative writing](../../images/creative-writing-example.png?WT.mc_id=academic-105485-yoterada) + +
+ +* エージェントに対して会話形式で尋ねる**質問** + + 訳者追記: + - Who is Louis XIV and why he is an important historical character? + - ルイ14世はどういう人で、なぜ彼は歴史的に重要な人物なのですか? +![Example of conversation](../../images/conversation-example.png?WT.mc_id=academic-105485-yoterada) + +
+ +* 続きを書く**文章の一節**で、実際には文章の執筆支援を要求しています + + 訳者追記: + - Louis XIV is an important historical character because + - ルイ14世が歴史的に重要な人物である理由は + +![Example of text completion](../../images/text-completion-example.png?WT.mc_id=academic-105485-yoterada) + +
+ +* **プログラムコード**の一部と、そのコードに関する説明や記述を求める要望、または特定の作業を行うコードの生成を依頼するコメント + + 訳者追記: + - A Python function to sum two numbers a and b + - 二つの数値aとbを合計するPython関数 + +![Coding example](../../images/coding-example.png?WT.mc_id=academic-105485-yoterada) + +
+ +上記に挙げた例は基本的なものであり、大規模言語モデルの機能を全て網羅したわけではありません。教育分野に限らず、生成 AI が持つ潜在的な可能性と利点を示しました。 + +また、生成 AI モデルの出力結果は決して完璧ではなく、場合によってはモデルの創造性が逆効果となって、現実を曲解するような言葉を組み合わせたり、不快な言葉を組み合わせて作り出すこともあります。また、生成 AI は知能を持っているわけではありません。少なくとも、批判的思考や創造的推理、感情知能を含む広い意味において知能はありません。そして決定論的でもなく、信頼性もありません。なぜなら、誤った参照や内容、声明などの作り話が、正しい情報と混ざり合って、説得力のある自信に満ちた言葉で提示されることがあるからです。次のレッスンでは、これらすべての制限に対処し、それらを軽減するために何ができるかを見ていきます。 + +## 課題 + +この課題では、「生成 AI」に関する知識を深め、まだ生成 AI が導入されていない領域を特定し、そこにどう取り込めるかを検討してください。従来の方法と比べて、どのような違いがあるでしょうか?これまでにできなかったことが、実現可能になるか、作業の速度が上がるかご検討ください。「問題点」「AIの活用方法」「導入による効果」といった見出しを用いて、理想の AI スタートアップについて 300 文字で概要をまとめてください。可能であれば、ビジネスプランも記述してください。 + +この課題を達成すれば、マイクロソフトのスタートアップ向けインキュベータープログラム、[Microsoft for Startups Founders Hub](https://www.microsoft.com/startups?WT.mc_id=academic-105485-yoterada) への応募資格が得られるかもしれません。Azure や OpenAI の使用クレジット、メンタリング、その他多くの支援を提供していますので、詳細はウェブサイトをご覧ください。 + +## 知識チェック + +大規模言語モデルについてどれが正しいですか? + +1. 毎回まったく同じ回答が返ってきます +1. 物事を完璧に行い、計算をしたり、正しく動作するコードを生成するのに最適です +1. 同じプロンプトを使用しても、回答が異なる場合があります。また、テキストやコードなど最初に何らかのヒントを得るために利用するのには最適です。しかし、得られた結果は改善する必要があります。 + +A: 3, 大規模言語モデル(LLM)は決定的ではなく、出力結果にはばらつきがありますが、温度設定を調整することで、ばらつきを制御することが可能です。完璧な結果を期待するべきではありません。LLM は皆様の負担を軽減するために存在し、物事を始める際に最初の良い出発点を提供します。 ただ多くの場合、段階的に改善していく必要があるでしょう。 + +## お疲れ様でした! 次のレッスンを続ける + +このレッスンを修了後、[生成 AI 学習コレクション](https://aka.ms/genai-collection?WT.mc_id=academic-105485-yoterada) に進んで、生成 AI の知識をさらに深めましょう! + +レッスン 2 にお進みください。そこでは、[様々な LLM の調査と比較](../../../02-exploring-and-comparing-different-llms/translations/ja-jp/README.md?WT.mc_id=academic-105485-yoterada)方法に焦点を当てます! diff --git a/02-exploring-and-comparing-different-llms/translations/ja-jp/README.md b/02-exploring-and-comparing-different-llms/translations/ja-jp/README.md new file mode 100644 index 000000000..f8926939c --- /dev/null +++ b/02-exploring-and-comparing-different-llms/translations/ja-jp/README.md @@ -0,0 +1,191 @@ +# さまざまな LLM の調査と比較 + +[![Exploring and comparing different LLMs](../../images/02-lesson-banner.png?WT.mc_id=academic-105485-yoterada)](https://youtu.be/J1mWzw0P74c?WT.mc_id=academic-105485-yoterada) + +> *(上記の画像をクリックすると、レッスン・ビデオを表示します)* + +前回のレッスンで、生成 AI がどのようにして進化し、大規模言語モデル(LLM)がどう機能するのか、そしてスタートアップがそれらを自分たちの用途に応用し、成長させることができるかを見てきました。この章では、様々な大規模言語モデル(LLM)を比較し、それぞれの利点と欠点を理解することに焦点を当てます。 + +スタートアップが次に進むべきステップは、大規模言語モデル(LLM)の現在の状況を調査し、自社のニーズに適したものが何かを理解することです。 + +## はじめに + +このレッスンでは以下の内容を扱います: + +- いま存在する様々な種類の LLM(大規模言語モデル)について学ぶ +- Azure で用途に応じて異なる AI モデルを選択しテスト、反復作業、及び比較を行う +- LLM のデプロイ方法について学ぶ + +## 学習目標 + +このレッスンを完了した後、以下のことができるようになります: + +- ユースケースに適したモデルを選択する +- モデルのパフォーマンスをテストし、反復し、そして改善する方法を理解する +- 企業がどのようにモデルをデプロイするかを知る + +## 大規模言語モデル(LLM)の様々な種類の理解 + +大規模言語モデル(LLM)は、そのアーキテクチャ、トレーニングデータ、用途に応じて、様々なカテゴリに分類することができます。これらの違いを理解することは、スタートアップがシナリオに応じて最適なモデルを選択し、そのパフォーマンスをテストし、反復し、改善する方法を理解するのに役立ちます。 + +LLM モデルには、さまざまな種類があり、どのモデルを選択するかは、それらを使用する目的、扱うデータ、ご利用可能な金額などによって異なります。 + +選択するモデルは、テキスト、オーディオ、ビデオ、画像の生成など、各用途に応じてそれぞれ異なる種類のモデルを選択します。 + +- **オーディオおよび音声認識** この用途には、音声認識として汎用性のある Whisper というモデルが最適です。このモデルは、様々なオーディオ・データでトレーニングされており、多言語にも対応した音声認識ができます。[Whisper のモデルについての詳細はこちら](https://platform.openai.com/docs/models/whisper?WT.mc_id=academic-105485-yoterada). + +- **画像生成**。画像生成の選択肢としては、DALL-E と Midjourney が非常に有名です。Azure OpenAI 上で DALL-E のモデルが利用可能です。[DALL-Eについての詳細はこちら](https://platform.openai.com/docs/models/dall-e?WT.mc_id=academic-105485-yoterada)をご覧ください。このカリキュラムの第 9 章でも解説します。 + +- **テキスト生成**。多くのモデルがテキスト生成用にトレーニングされており、GPT-3.5 から GPT-4 に至るまで、多種多様な選択肢があります。それぞれ利用する際のコストは異なり、GPT-4 が最も高価です。機能とコストの観点から、ニーズに最も適したモデルを選択するために、[Azure OpenAI プレイグラウンド](https://oai.azure.com/portal/playground?WT.mc_id=academic-105485-yoterada)をご確認ください。 + +モデルを選択するということは、基本的な機能を手に入れ利用できることを意味しますが、それだけでは不十分な場合もあります。通常、会社固有のデータを何らかの方法で LLM に伝えなければならない状況もあります。その方法はいくつかの選択肢がありますが、それについては後続のセクションで詳しく説明します。 + +### ファウンデーション・モデルと LLM の比較 + +「ファウンデーション・モデル」という用語はスタンフォード大学の研究者たちが提唱し、以下のような基準に従う AI モデルとして定義しています。 + +- **教師なし学習、または自己教師あり学習でトレーニング** ラベルのないマルチモーダル・データを用いてトレーニングし、トレーニング・プロセス中、人間によるデータの注釈やラベル付けは不要です +- **非常に大規模なモデル**。数十億のパラメーターを用いてトレーニングされたディープ・ニューラル・ネットワークに基づいています +- **通常、他のモデルの「基盤」として機能** ファイン・チューニングを行うことで、他のモデルを構築する際の出発点(基盤)として使用できます + +![ファウンデーション・モデルと LLM](../../images/FoundationModel.png?WT.mc_id=academic-105485-yoterada) + +画像出展: [基盤モデルと大規模言語モデルの効果的なガイド | Babar M Bhatti著 | Medium](https://thebabar.medium.com/essential-guide-to-foundation-models-and-large-language-models-27dab58f7404) + +この違いをさらに明確にするために、ChatGPT を例に挙げてみましょう。ChatGPT の最初のバージョンを作る際 GPT-3.5 というモデルをファウンデーション・モデルとして使いました。つまり、OpenAI は、チャットボットのような会話シナリオで高いパフォーマンスを発揮するよう、チャットに特化したデータを用いて GPT-3.5 のチューニング版を作成したのです。 + +![Foundation Model](../../images/Multimodal.png?WT.mc_id=academic-105485-yoterada) + +画像出展: [2108.07258.pdf (arxiv.org)](https://arxiv.org/pdf/2108.07258.pdf?WT.mc_id=academic-105485-yoterada) + +### オープンソース・モデルとプロプライエタリ・モデル + +大規模言語モデル(LLM)を分類する別の方法として、それがオープンソースなのか、それともプロプライエタリのものなのか、という観点があります。 + +オープンソース・モデルは、一般に公開され、誰でも利用できるモデルです。これらは多くの場合、そのモデルを開発した企業や研究コミュニティによって提供されます。これらのモデルは、LLM の様々な用途に合わせて検証、変更、カスタマイズすることが許可されています。しかし、常に本番環境での利用に最適化されているわけではなく、プロプライエタリモデルほど高いパフォーマンスを発揮しない場合もあります。さらに、オープンソース・モデルの資金調達は限られており、長期的に継続できない場合や、最新の研究に基づいて更新されない可能性もあります。[Alpaca](https://crfm.stanford.edu/2023/03/13/alpaca.html?WT.mc_id=academic-105485-yoterada)、[Bloom](https://sapling.ai/llm/bloom?WT.mc_id=academic-105485-yoterada)、[LLaMA](https://sapling.ai/llm/llama?WT.mc_id=academic-105485-yoterada) などが人気のオープンソース・モデルの例です。 + +プロプライエタリ・モデルは、企業が所有し一般には公開されていないモデルです。これらのモデルは、通常本番環境での利用に最適化されています。しかし異なるユースケースに対して、検証、変更、カスタマイズをすることは許されていません。また、常に無料で利用できるわけではなく、利用するためには、サブスクリプションによる支払いが必要な場合もあります。さらに、利用者はモデルをトレーニングする際に使用するデータをコントロールできず、データのプライバシーや、責任ある AI の原則に基づく使用を、プロプライエタリ・モデルの所有者が保証していることを信頼しなければなりません。[OpenAI のモデル](https://platform.openai.com/docs/models/overview?WT.mc_id=academic-105485-yoterada)、[Google Bard](https://sapling.ai/llm/bard?WT.mc_id=academic-105485-yoterada)、[Claude 2](https://www.anthropic.com/index/claude-2?WT.mc_id=academic-105485-yoterada) などが人気のプロプライエタリ・モデルです。 + +### 埋め込み (Embedding) と画像生成とテキスト・コード生成 + +大規模言語モデル(LLM) は出力の種類によっても分類できます。 + +埋め込み (Embedding) は、テキストを、埋め込みと呼ぶ、数値形式に変換する AI モデルです。言い換えるならば、埋め込みは入力されたテキストに対する数値表現です。埋め込みによって、機械が単語や文の関係を理解しやすくなり、分類モデルや、数値データでパフォーマンスが向上するクラスタリング・モデルなど、他のモデルの入力として利用できます。埋め込みモデルは、データが豊富な代理タスクのためにモデルを構築し、その後でモデルの重み(埋め込み)を他の下流タスクで再利用する転移学習によく使用されます。このカテゴリーの例としては、[OpenAI Embeddings](https://platform.openai.com/docs/models/embeddings?WT.mc_id=academic-105485-yoterada) モデルがあります。 + +![Embedding](../../images/Embedding.png?WT.mc_id=academic-105485-yoterada) + +画像生成モデルは、画像を生成するモデルです。これらのモデルは、画像編集、画像合成、画像変換で頻繁に利用されます。画像生成モデルは、[LAION-5B](https://laion.ai/blog/laion-5b/?WT.mc_id=academic-105485-yoterada) などの大規模な画像データセットでトレーニングされることが多く、新しい画像を生成したり、画像修復、高解像度化、色付け技術を用いて既存の画像を編集する際に利用できます。[DALL-E-3](https://openai.com/dall-e-3?WT.mc_id=academic-105485-yoterada) や [Stable Diffusion models](https://github.com/Stability-AI/StableDiffusion?WT.mc_id=academic-105485-yoterada) といったモデルがあります。 + +![Image generation](../../images/Image.png?WT.mc_id=academic-105485-yoterada) + +テキスト生成モデルとコード生成モデルは、テキストやコードを生成するモデルです。これらのモデルは、テキストの要約、翻訳、質疑応答などによく利用されます。テキスト生成モデルは、[BookCorpus](https://www.cv-foundation.org/openaccess/content_iccv_2015/html/Zhu_Aligning_Books_and_ICCV_2015_paper.html?WT.mc_id=academic-105485-yoterada) などの大規模なテキストデータセットでトレーニングされ、新しいテキストを生成したり、質問に答えたりするのに使われます。[CodeParrot](https://huggingface.co/codeparrot?WT.mc_id=academic-105485-yoterada) のようなコード生成モデルは、GitHub などの大規模なソースコード・データセットでトレーニングされ、新しいコードを生成したり、既存コードのバグ修正に使われます。 + ![Text and code generation](../../images/Text.png?WT.mc_id=academic-105485-yoterada) + +### 「エンコーダー・デコーダー」 と 「デコーダーのみ」 のモデル + +大規模言語モデル (LLM) のアーキテクチャの種類の違いについて解説するため、下記の例え話しを使います。 + +上司から、学生用のクイズを作成する仕事を任されたことを想像してください。あなたには 2 人の同僚がいて、1 人はコンテンツの作成を担当し、もう 1 人はそれをレビューする役割を担います。 + +コンテンツを作成する人は「デコーダーのみ」のモデルに似ています。コンテンツ作成者は、トピックを見て、既に書いた内容を参考に、それに基づいてコンテンツを作成します。コンテンツ作成者は、魅力的で情報豊かなコンテンツを作成するのが得意ですが、トピックや学習目標を理解するのは得意ではありません。「デコーダーのみ」のモデルの例には、GPT-3 などの GPT ファミリーのモデルがあります。 + +一方で、レビューを担当する人は「エンコーダーのみ」のモデルに似ています。レビュー担当者は書かれたコンテンツと回答を見て、それらの関係を把握し、文脈を理解しますが、コンテンツを作成するのは得意ではありません。「エンコーダーのみ」のモデルの例には、BERT があります。 + +クイズを作成し、それをレビューする同一人物がいることを想像してみてください。これが「エンコーダー・デコーダー」モデルです。BARTやT5などが例として挙げられます。 + +### サービスとモデル + +サービスとモデルの違いについて説明します。サービスはクラウド・サービス・プロバイダーが提供する製品で、モデル、データ、その他のコンポーネントを組み合わせたものです。モデルはサービスの核となる部分で、大規模言語モデル (LLM) のようなファウンデーション・モデルが一般的です。 + +サービスは、本番環境での利用に最適化されており、グラフィカル・ユーザー・インターフェースを通じてモデルよりも使いやすいことが多いです。しかしサービスは、常に無料で利用できるわけではなく、サービス提供者の機器やリソースを活用する代わりに、サブスクリプションや支払いが必要な場合があります。これにより、費用を最適化し、簡単にスケールアップできます。サービスの例としては、使用量に応じて料金が発生する [Azure OpenAI Service](https://learn.microsoft.com/azure/ai-services/openai/overview?WT.mc_id=academic-105485-yoterada) があります。また、Azure OpenAI サービスは、モデルの能力に加えて、エンタープライズグレードのセキュリティと責任あるAIフレームワークを提供します。 + +モデルは、パラメーターや重みなどを含むニューラルネットワークそのものです。企業がローカルで運用することも可能ですが、そのためには機器の購入、スケールアップのための環境構築、ライセンスの購入、またはオープンソース・モデルの使用が必要になります。LLaMAのようなモデルは利用可能ですが、モデルを実行するための計算能力が必要です。 + +## Azure でパフォーマンスを理解するために異なるモデルでテストと反復処理を行う方法 + +現在の LLM の状況を調査し、シナリオに適したモデルの候補を見つけたら、次に企業の実データと負荷試験でそれらをテストする必要があります。これは実験と測定を通じて行われる反復的なプロセスです。前の段落で触れたモデル(OpenAIモデル、Llama2のようなオープンソースモデル、Hugging Faceのトランスフォーマー)のほとんどは、[Azure Machine Learning Studio](https://ml.azure.com/?WT.mc_id=academic-105485-yoterada) の[ファウンデーション・モデル・カタログ](https://learn.microsoft.com/azure/machine-learning/concept-foundation-models?WT.mc_id=academic-105485-yoterada)で利用可能です。 + +[Azure Machine Learning](https://azure.microsoft.com/products/machine-learning/?WT.mc_id=academic-105485-yoterada) は、データ・サイエンティストと機械学習エンジニアが ML ライフサイクル全体(トレーニング、テスト、デプロイ、MLOpsの管理)を一つのプラットフォームで管理するために設計されたクラウド・サービスです。Machine Learning Studio はグラフィカル・ユーザー・インターフェースを提供し、ユーザーが次の操作を行うことを可能にします: + +- カタログから興味のあるファウンデーション・モデルを探し、タスク、ライセンス、名前でフィルタリングします。カタログにまだ含まれていない新しいモデルをインポートすることも可能です。 +- モデル・カードを確認して、詳細な説明とコードサンプルを見て、サンプル推論ウィジェットを使ってテストします。これは、サンプルプロンプトを提供して結果を試すものです。 + +![Model card](../../images/Llama1.png?WT.mc_id=academic-105485-yoterada) + +- 特定の負荷試験と入力された特定のデータセットに関する客観的な評価指標を用いて、モデルのパフォーマンスを評価します。 + +![Model evaluation](../../images/Llama2.png?WT.mc_id=academic-105485-yoterada) + +- Azure Machine Learning の実験と追跡機能を活用して、カスタム・トレーニングデータでモデルをファイン・チューニングし、特定の負荷試験におけるモデルのパフォーマンスを向上させます。 + +![Model fine-tuning](../../images/Llama3.png?WT.mc_id=academic-105485-yoterada) + +- 元の事前トレーニング済みモデルまたはファイン・チューニングされたバージョンをリモートのリアルタイム推論、もしくはバッチ・エンドポイントにデプロイし、アプリケーションから利用できるようにします。 + +![Model deployment](../../images/Llama4.png?WT.mc_id=academic-105485-yoterada) + +## 大規模言語モデル (LLM) の出力結果を改善する + +スタートアップ・チームは、さまざまな種類の大規模言語モデル (LLM) とクラウド・プラットフォーム(Azure Machine Learning)を理解し、異なるモデルを比較し、テストデータで評価し、パフォーマンスを向上させ、推論エンドポイントにデプロイする方法を検討しました。 + +しかし、事前トレーニングされたモデルを使用するのではなく、モデルをファイン・チューニングすることを検討すべきタイミングはいつでしょうか?特定の負荷試験でモデルのパフォーマンスを向上させる他のアプローチはあるのでしょうか? + +企業が LLM から必要な結果を得るためには、トレーニング程度の異なる様々な種類のモデルを選択するなど、いくつかのアプローチがあります。 + +異なるレベルの複雑さ、コスト、品質で LLM を本番環境にデプロイすることができます。以下に、いくつかの異なるアプローチを紹介します。 + +- **コンテキストを用いたプロンプトエンジニアリング** プロンプトを記述する際に十分なコンテキストを提供し、必要な応答を得ることが狙いです。 + +- **Retrieval Augmented Generation(RAG)** 例えば、データがデータベースや Web 上に存在する場合、プロンプトの記述時に、それらのデータや一部を含めるために、関連データを取得し、プロンプトの一部にすることができます。 + +- **ファイン・チューニングしたモデル** 自分のデータを利用してモデルをさらにトレーニングし、モデルをより正確に、そしてニーズに応じた形にします。ただし、コストがかかる可能性があります。 + +![LLMs deployment](../../images/Deploy.png?WT.mc_id=academic-105485-yoterada) + +画像出展:: [Four Ways that Enterprises Deploy LLMs | Fiddler AI Blog](https://www.fiddler.ai/blog/four-ways-that-enterprises-deploy-llms?WT.mc_id=academic-105485-yoterada) + +### コンテキストを用いたプロンプトエンジニアリング + +事前学習済みの LLM は、一般的な自然言語タスクとして、短いプロンプトで文章を作成するか、質問を作成して呼び出すことで、とてもうまく動作します。これを「ゼロショット」学習と言います。 + +しかし、詳細なリクエストとサンプルを用いて問い合わせ内容を記述すると、つまり追加のコンテキストを提供すると、回答はより正確でユーザーの期待値に近いものになります。この場合、プロンプトに一つの例が含まれている場合は「ワンショット」学習、複数の例が含まれていると「フュー・ショット」学習と言います。コンテキストを用いたプロンプト・エンジニアリングは、始めに実施すべきで、そして最もコスト効率の高いアプローチです。 + +### Retrieval Augmented Generation(RAG) + +LLM は、トレーニング中に使用したデータだけを使って回答を作るという制約があります。これは、トレーニング・プロセス後に起きた事実や、非公開情報(例えば企業データ)については分からないということを意味しています。RAG は、プロンプトの長さの制限を考慮しつつ、ドキュメントの断片という形で、外部データをプロンプトに追加する技術で、上記の制約から逃れる事ができます。これは、ベクター・データベース・ツール([Azure Vector Search](https://learn.microsoft.com/azure/search/vector-search-overview?WT.mc_id=academic-105485-yoterada)など)を用いて、さまざまな定義済みのデータソースから有用な情報の断片を取得し、プロンプトのコンテキストに加えることで実現します。 + +この技術は、LLM をファイン・チューニングするための十分なデータ、時間、リソースがない企業にとって非常に有用です。そして特定の負荷試験におけるパフォーマンスを向上させ、回答捏造のリスク、つまり現実の歪曲や有害なコンテンツのリスクを減らしたい場合に非常に有効です。 + +### ファイン・チューニングしたモデルの利用 + +ファイン・チューニングは、転移学習を活用してモデルを下流タスクに「適応」させたり、特定の問題を解決するプロセスです。フュー・ショット学習や、RAG とは異なり、更新した重みとバイアスを持つ新しいモデルを生成します。これには、プロンプト(入力)とそれに関連する出力(完成)からなるトレーニング・サンプルが必要です。このアプローチが好まれるのは以下のような場合です: + +- **ファイン・チューニングしたモデルを使用する場合** 企業が高性能なモデルではなく、ファイン・チューニングした能力の低いモデル(埋め込みモデルなど)を使用し、よりコスト効率を高く、迅速なソリューション提供したいと考えている場合 + +- **レイテンシーを考慮する場合** 特定の用途でレイテンシーが重要で、とても長いプロンプトを使用することができない、またはモデルから学習するサンプル数がプロンプトの長さ制限に合わない場合 + +- **最新の状態を維持する場合** 企業が高品質のデータと正確なラベルを多く持ち、これらのデータを時間をかけて最新の状態に保つためにリソースを持っている場合 + +### トレーニング済みモデル + +LLM をゼロからトレーニングすることは、間違いなく最も困難で最も複雑なアプローチです。膨大なデータ、熟練したリソース、適切な計算能力が必要です。このオプションは、ビジネスがドメイン固有のユースケースと大量のドメイン中心のデータを持っている場合にのみ検討すべきです。 + +## 知識チェック + +LLM からの出力結果を改善するための良いアプローチは何でしょうか? + +1. コンテキストを用いたプロンプトエンジニアリング +2. RAG +3. 微調整されたモデル + +A: 3、時間とリソース、高品質のデータがある場合、微調整は最新の状態を維持するためのより良い選択肢です。しかし、改善を目指していて時間が足りない場合は、まず RAG を検討する価値があります。 + +## 🚀 Challenge + +ビジネスで RAG を活用する方法についてもっと学びたい方は、[こちら](https://learn.microsoft.com/azure/search/retrieval-augmented-generation-overview?WT.mc_id=academic-105485-yoterada)をご覧ください。 + +## お疲れ様でした! 次のレッスンを続ける + +このレッスン終了後、[生成 AI 学習コレクション](https://aka.ms/genai-collection?WT.mc_id=academic-105485-yoterada)をチェックして、生成 AI の知識をさらに深めましょう。 + +次のレッスン 3 では、[責任ある生成 AI の利用](../../../03-using-generative-ai-responsibly/translations/ja-jp/README.md?WT.mc_id=academic-105485-yoterada)について学びます! diff --git a/03-using-generative-ai-responsibly/translations/ja-jp/README.md b/03-using-generative-ai-responsibly/translations/ja-jp/README.md new file mode 100644 index 000000000..ce098fcbf --- /dev/null +++ b/03-using-generative-ai-responsibly/translations/ja-jp/README.md @@ -0,0 +1,136 @@ +# 生成 AI の責任ある使用 + +[![生成 AI の責任ある使用](../../images/03-lesson-banner.png?WT.mc_id=academic-105485-yoterada)]() + +> **ビデオは近日公開予定** + +AI、特に生成 AI に強い興味は抱くことは理解できますが、それをどのように責任を持って利用するかについて、十分に考慮する必要があります。例えば、出力結果が公平で有害でないことを保証するなど、多くの点を考慮すべきです。本章は、上記の背景や考慮すべき点、そして AI をより有効活用するための具体的な行動指針を、皆様にお届けします。 + +## はじめに + +このレッスンでは以下の内容を取り上げます: + +- 生成 AI アプリケーションを構築する際に、なぜ責任ある AI を重視すべきか +- 責任ある AI の基本原則と、それが生成 AI とどう結びつくのか +- 戦略とツールを使って、責任ある AI の原則をどのように実践するのか + +## 学習目標 + +このレッスンを完了すると、以下のことが理解できるようになります: + +- 生成 AI アプリケーション構築時の、責任ある AI の重要性 +- 生成 AI アプリケーションの構築時、責任ある AI の基本原則をいつ、どのように検討し適用するか +- 責任ある AI の概念を実践するために利用可能なツールと戦略 + +## 責任ある AI の原則 + +生成 AI に対する興味は、今までにないほど高まっています。この盛り上がりは、新たな開発者や関心、資金をこの領域にもたらしています。これは、生成 AI を使用して新しい製品や、新しい企業を創業する人々にとって非常に好意的な状況ですが、同時に責任を持って進めることも重要です。 + +このコースでは、スタートアップが AI を利用した教育製品の実装に焦点を当てます。公平性、包括性、信頼性・安全性、セキュリティ・プライバシー、透明性、説明責任といった責任ある AI の原則に基づいて、これらが製品における生成 AI の活用と、どのように関連していくのかについて考えます。 + +## 責任ある AI を優先すべき理由 + +製品開発時、利用者の利益を最優先に考える人間中心のアプローチで進めると、最良の結果が得られます。 + +生成 AI の特徴は、利用者に役立つ回答、情報、ガイダンス、コンテンツを作成する力にあります。これは多くの手作業を必要とせずに行うことができ、それによって非常に素晴らしい成果を生み出すことができます。しかし、適切な計画と戦略がなければ、残念ながら利用者、製品、そして社会全体に有害な結果をもたらすこともあります。 + +下記より、潜在的に害を及ぼす可能性のある例(全てではありませんが)について見ていきましょう: + +### Hallucinations (幻覚) + +「Hallucinations (幻覚)」とは、LLM が完全に無意味な内容や、他の情報に基づいて事実と異なる内容を出力する際に使用する用語です。 + +例えば、スタートアップで、学生が AI モデルに対して歴史に関する質問をすることができる機能を作ったとします。そして、ある学生がこんな質問をしました +`タイタニックの唯一の生き残りは誰ですか?` + +すると、モデルは以下のような回答を生成します + +> ご注意:毎回同じ回答結果ではありませんし、利用するモデルのバージョンによっても回答内容は異なります:(日本語訳者による追記) + +![Prompt saying "Who was the sole survivor of the Titanic"](../../../03-using-generative-ai-responsibly/images/ChatGPT-titanic-survivor-prompt.webp?WT.mc_id=academic-105485-yoterada) + +> *(Source: [Flying bisons](https://flyingbisons.com?WT.mc_id=academic-105485-yoterada))* + +これはとても自信に満ちて、詳細な回答結果です。しかし残念ながら、この回答は間違っています。調べれば、タイタニック号の生存者は複数人いたことがわかります。この課題研究を始めたばかりの学生にとって、この回答は疑う余地なく事実として受け入れられるほど説得力があります。このような結果から、AI のシステムを信頼できなくなり、さらにはスタートアップ企業の評判にも悪影響を及ぼす可能性があります。 + +LLM のバージョンを更新するごとに、幻覚を減らす方向でパフォーマンス改善がはかられています。ただ、この改善があったとしても、アプリケーションの開発者やユーザーは、こうした問題を意識し続ける必要があります。 + +### 有害なコンテンツ + +前のセクションで、LLM が不正確、または無意味な回答を出力する可能性について触れました。もう一つ注意すべきリスクは、モデルが有害なコンテンツを回答する場合です。 + +有害なコンテンツには以下のようなものがあります: + +- 自傷行為や特定グループへの危害を助長、または奨励する指示を与える +- 憎悪や侮辱的な内容 +- あらゆる種類の攻撃や、暴力行為の計画を指導する +- 違法なコンテンツを探す方法や、違法行為を犯す方法について指導する +- 性的に露骨な内容を表示する + +スタートアップでは、このようなコンテンツが学生に見られないように、適切なツールと戦略を確実に導入したいと考えています。 + +### 公平性の欠如 + +公平性とは、「AI システムが偏見や差別を持たず、全人類を公平かつ平等に扱うこと」を意味します。生成 AI の世界では、マイノリティグループの排他的な世界観が、モデルの出力で再強化されないように注意を払いたいと思います。 + +このような公平性が欠如した出力は、利用者にとって好意的な製品体験を妨げるだけでなく、社会的な損害をさらに引き起こします。アプリケーション開発者として、生成 AI を用いたソリューション開発する際には、常に多種多様な利用者層を意識することが重要です。 + +## 責任ある生成 AI の使用方法 + +責任ある生成 AI の重要性を理解した上で、責任を持って AI ソリューションを構築するために、4つの取り組むべき項目について見ていきましょう。 + +![Mitigate Cycle](../../images/mitigate-cycle.png?WT.mc_id=academic-105485-yoterada) + +### 潜在的な危害の測定 + +ソフトウェアのテストでは、アプリケーションに対して利用者が行うと予想する行動についてテストします。同様に、利用者が入力しそうな様々なプロンプトをテストすることは、潜在的な害を見極めるための良い方法と言えます。 + +スタートアップが教育関連の製品を実装しているので、教育関連のプロンプトのリストを準備すると良いでしょう。これには、特定の科目、歴史的事実、学生生活に関するプロンプトなどが含まれるかもしれません。 + +### 潜在的な危害の軽減 + +AI モデルとその出力によって引き起こされる、潜在的な害を防ぐ、または抑制する方法を探る時が来ました。これを4つの異なるレイヤーで考えます。 + +![Mitigation Layers](../../images/mitigation-layers.png?WT.mc_id=academic-105485-yoterada) + +- **AI モデル** 用途に適したモデルを選択します。GPT-4 のように大きくて複雑なモデルを、より小規模で特定の用途に使う場合、有害な内容を引き起こす可能性がありリスクが高まります。独自のトレーニング・データを使ってモデルをファイン・チューニングすることで、有害なコンテンツのリスクを減らすこともできます。 + +- **安全システム** 安全システムとは、モデルを提供するプラットフォーム上で危害を軽減するために使用する設定やツールです。例えば、Azure OpenAI サービスのコンテンツ・フィルタリング・システムがあります。システムはボットにおける、脱獄攻撃 (Jailbreak) や、望ましくない活動などのリクエストも検出すべきです。 + +- **メタ・プロンプト** メタ・プロンプトやグラウンディングといった手法を使って、モデルの行動や情報を特定の方向に誘導したり制限することができます。これはシステム入力を使って、モデルに対して特定の制限を定義します。また、システムのスコープや領域に合った、より適切な結果を出力することもできます。 + + Retrieval Augmented Generation(RAG)のような技術を使って、モデルが信頼できる情報源からのみ情報を引き出すようにすることもできます。このコースの後半で、検索アプリケーションの構築に関するレッスンもあります。 + +- **ユーザーエクスペリエンス** 最後のレイヤーは、ユーザ・インターフェースです。利用者はどのような形であれ、アプリケーションが提供するインターフェイスを利用してモデルと直接やりとりを行います。このように UI/UX を設計し、モデルに送信する入力の種類やユーザーで表示されるテキストや画像を制限することができます。AI アプリケーションをデプロイする際、生成 AI アプリケーションができることと、できないことについて透明性を持って伝える必要があります。 + + [AI アプリケーションの UX デザイン](../../../12-designing-ux-for-ai-applications/README.md?WT.mc_id=academic-105485-yoterada)に特化したレッスンがあります。 + +- **モデルを評価** 大規模言語モデル(LLMs)は、そのモデルがどのようなデータを使って学習されたのかを完全に把握することができないため、扱うのが難しい場合があります。それでもなお、モデルの性能や出力は常に検証すべきです。特に出力の正確性、類似性、根拠の正しさ、関連性を評価することは重要です。これにより、利害関係者や利用者に透明性と信頼性を提供することができます。 + +### 責任ある生成 AI ソリューションを運用する + +本番環境用の AI アプリケーションを構築する最終段階に入りました。これには、スタートアップの法務部門やセキュリティ部門など他部署と協力し、全ての規制方針に準拠しているか確認することが含まれます。サービスのローンチ前には、デリバリー計画、問題発生時の対応、不具合が発生した際に元に戻すロールバック手順を作り、利用者に被害が及ばないように戦略を練りたいと思います。 + +## ツール + +責任ある AI ソリューションを開発する作業は、手間がかかるように感じられるかもしれません。しかし、その労力に見合う価値があります。生成 AI のビジネスが進化するに連れて、開発作業中に責任ある AI を効率的に取り入れられるツールが、より充実していくでしょう。例えば、[Azure AI Content Safety](https://learn.microsoft.com/azure/ai-services/content-safety/overview?WT.mc_id=academic-105485-yoterada) は、API を呼び出すことで有害なコンテンツや画像を検出するのに役立ちます。 + +## 知識チェック + +責任ある AI の利用を確実にするために、どのような点に考慮する必要があるのでしょうか? + +1. 回答が正しいこと。 +2. AI が悪用されたり犯罪目的で利用されないように注意すること +3. AI が偏りや差別的な内容を含まないようにすること + +A: 2 と 3 が正解です。責任ある AI を使用することで、害を及ぼす可能性のある影響や偏見をどのように緩和できるか、さらにその他のさまざまな問題について考える手助けにもなります。 + +## 🚀 Challenge + +[Azure AI Content Safety](https://learn.microsoft.com/azure/ai-services/content-safety/overview?WT.mc_id=academic-105485-yoterada) について調べ、ご自身の用途に適用できるかご検討ください。 + +## お疲れ様でした! 次のレッスンを続ける + +このレッスン終了後、[生成 AI 学習コレクション](https://aka.ms/genai-collection?WT.mc_id=academic-105485-yoterada)をチェックして、生成 AI の知識をさらに深めましょう。 + +レッスン 4 では、[プロンプト・エンジニアリングの基本](../../../04-prompt-engineering-fundamentals/translations/ja-jp/README.md?WT.mc_id=academic-105485-yoterada)について学びます! diff --git a/04-prompt-engineering-fundamentals/translations/ja-jp/README.md b/04-prompt-engineering-fundamentals/translations/ja-jp/README.md new file mode 100644 index 000000000..1581423c1 --- /dev/null +++ b/04-prompt-engineering-fundamentals/translations/ja-jp/README.md @@ -0,0 +1,395 @@ +# プロンプト・エンジニアリングの基礎 + +[![Prompt Engineering Fundamentals](../../images/04-lesson-banner.png?WT.mc_id=academic-105485-yoterada)](https://youtu.be/r2ItK3UMVTk?WT.mc_id=academic-105485-yoterada) + +大規模言語モデル (LLM) では、プロンプトの書き方がとても重要で、慎重に作成したプロンプトは、そうでないものに比べ良い結果をもたらします。しかし、プロンプトやプロンプト・エンジニアリングとは一体どういう物なのでしょうか?また、LLM に送信する内容をどのようにして改善すればいいのでしょうか?この章と次の章では、そうした疑問に答えることを目指しています。 + +_生成 AI_ は、ユーザーからの依頼に対して、テキスト、画像、オーディオ、コード等の新しいコンテンツを生み出す能力を有しています。これを実現するために、OpenAI の GPT(Generative Pre-trained Transformer)シリーズのような、自然言語とコードの使用目的でトレーニングされた _大規模言語モデル(LLM)_ を利用します。 + +利用者は、チャットのような馴染み深い手法で、特別な技術の知識や研修を受講しなくても、これらのモデルと対話できるようになりました。これらのモデルは、_プロンプト_ で操作し、ユーザーがテキストの入力(プロンプト)を送ると、AI からの回答(コンプリーション)が得られます。その後、利用者は何度も 「AI と対話」を重ね、複数回のやり取りを通じてプロンプトを洗練させ、期待する回答が得られるまで調整を行います。 + +現在、「プロンプト」は生成 AI アプリケーションの主要なプログラミングインターフェースとなり、モデルに対して何を行うべきか指示し、返される回答の品質に影響を与えています。「プロンプト・エンジニアリング」は、大規模で一貫性のある高品質な回答を得るためのプロンプトの設計と最適化に焦点を当てた、急速に成長している研究分野です。 + +## 学習目標 + +このレッスンでは、プロンプト・エンジニアリングとは何か、そしてその重要性、また特定のモデルやアプリケーションの目的に応じた、効果的なプロンプトの作成方法について学習します。プロンプト・エンジニアリングの基本概念とベストプラクティスを理解し、実際にこれらのコンセプトを適用している例を、インタラクティブな Jupyter ノートブックの「サンドボックス」環境で動かし、その操作方法も学びます。 + +このレッスンの終了後、下記ができるようになります: + +1. プロンプト・エンジニアリングとは何か、またその重要性について説明できる +2. プロンプトの構成要素とその使用方法について述べる +3. プロンプト・エンジニアリングのベストプラクティスと技術を習得する +4. OpenAI のエンドポイントにアクセスし、学んだテクニックを実際に試す + +## サンドボックス (Sandbox) とは + +プロンプト・エンジニアリングは現在、科学というよりは、むしろ芸術に近いものです。これに対する感覚を高めるには、_より多くの練習_ を積み重ね、アプリケーション専門知識で推奨される技術や、モデル固有の最適化を組み合わせた、試行錯誤の方法を取り入れることが重要です。 + +このレッスンに付随するJupyterノートブックは、学んだ内容を実際に試すことができる _サンドボックス_ 環境を提供します。レッスン中、もしくは最終的なコードチャレンジで利用することができます。演習を行うためには、下記が必要です: + +1. OpenAI API キー - デプロイした大規模言語モデル(LLM)のサービスエンドポイント +2. Python の実行環境 - ノートブックを実行する環境 + +このリポジトリは Python 3 の実行環境を含む、_.devcontainer_ を提供しています。GitHub Codespaces、もしくは Docker Desktop をインストールしたご自身のローカル環境でリポジトリを開くことで、コンテナ環境が自動的に起動します。その後、ノートブックを開いて Python 3.x カーネルを選択することで、実行するためのノートブックを準備できます。 + +デフォルトで用意されているノートブックは、OpenAI の API キーを利用する設定になっています。フォルダのルート・ディレクトリにある`.env.copy`を`.env`にリネームし、`OPENAI_API_KEY=`の行に API キーを入力するだけで、準備が整います。 + +このノートブックには基本的な演習が用意されていますが、より多くのサンプルやアイディアを試すために、ご自身で_Markdown_(説明文)や_Code_(プロンプトのリクエスト)のセクションを追加することができます。これにより、プロンプトデザインに対する感覚をより養うことができます。 + +## スタートアップ + +それでは、_このトピック_ がスタートアップのミッションである「[教育へ AI 革新をもたらす](https://educationblog.microsoft.com/2023/06/collaborating-to-bring-ai-innovation-to-education?WT.mc_id=academic-105485-yoterada)」とどのように結びついているのかについて見て行きましょう。私たちは _個別学習_ を実現する AI アプリケーションの開発を目指しています。そこで、私たちのアプリケーションを利用する様々な利用者がプロンプトをどのように「デザイン」するかを考えてみましょう。 + +- **管理者**: AI に _カリキュラムのデータを分析し、カバーしてない領域を特定する_ よう要求する可能性があります。AI はその結果をまとめたり、コードを用いて可視化することができます。 +- **教員**: AI に _特定の生徒と授業科目に応じた授業計画を作成する_ 可能性があります。AI は指定されたフォーマットに従って個別に計画を作成できます。 +- **生徒**: AI に _苦手な科目で個別指導を依頼する_ 可能性があります。AI は生徒のレベルに合わせたレッスン、ヒント、例を提供して指導することができます。 + +これらは、ほんの一例です。教育専門家から厳選された、オープンソースのプロンプト・ライブラリ「[Prompts For Education](https://github.com/microsoft/prompts-for-edu/tree/main?WT.mc_id=academic-105485-yoterada)」を確認し、さらに広い視野で可能性を探ってみてください! _サンドボックスでそれらのプロンプトを試しに実行したり、OpenAI Playground で試してどのような結果が出力されるか試してください!_ + + + +## プロンプト・エンジニアリングとは何ですか? + +レッスンの冒頭で、**プロンプト・エンジニアリング**は、特定のアプリケーションとモデルに対して、一貫性があり質の高い回答(コンプリーション)を得るために、テキスト入力(プロンプト)を _設計して最適化する_ 作業と説明しました。これは下記の 2 段階のプロセスとして考えることができます。 + +- 特定のモデルと目的に合わせた初期プロンプトを _設計する_ +- 回答品質を向上させるために、プロンプトを反復して _改善する_ + +最適な結果を導き出すためには、ユーザーの勘と努力を要する試行錯誤の過程が必要不可欠です。それがどうして重要なのかというと、その答えを出す前に、我々は下記の 3 つの概念を理解する必要があります。 + +- _Tokenization_ = モデルがプロンプトを「理解する」方法 +- _Base LLM_ = ファウンデーション・モデルがプロンプトを「処理する」方法 +- _Instruction-Tuned LLM_ = モデルが「タスク」を理解する方法 + +### Tokenization + +LLM は、プロンプトを _トークンの連続_ として見ており、異なるモデル(またはモデルの異なるバージョン)を利用すると、同じプロンプトでも異なる方法でトークン化することがあります。LLM は生のテキストではなくトークンを使ってトレーニングしているため、プロンプトがどのようにトークン化されるかは、生成される回答品質に直接影響を及ぼします。 + +トークン化の仕組みを理解するには、こちらの [OpenAI Tokenizer](https://platform.openai.com/tokenizer?WT.mc_id=academic-105485-yoterada) などのツールを使ってご確認いただくのが良いかもしれません。プロンプトをコピーして、それがどのようにトークンに変換されるかをツールからご確認ください。特に空白文字や句読点の扱いに注意してください。下記の例では、古い LLM(GPT-3)の例を示していますが、新しいモデルを利用すると異なる結果になるかもしれません。 + +![Tokenization](../../images/04-tokenizer-example.png?WT.mc_id=academic-105485-yoterada) + +### 概念: ファウンデーション・モデル + +プロンプトをトークンに分割した後、「[Base LLM](https://blog.gopenai.com/an-introduction-to-base-and-instruction-tuned-large-language-models-8de102c785a6?WT.mc_id=academic-105485-yoterada)」(またはファウンデーションモデル)の主な役割は、その分割したトークンの連続した文字列の中で、次に来るトークンを予測することです。LLM は膨大な量のテキスト・データでトレーニングされているため、トークン間の統計的な関連性を十分に把握しており、ある程度の自信を持ってその予測を行うことができます。ただしモデルは、プロンプトやトークンに含まれる単語の _意味_ を理解しているわけではなく、単に次にくるトークンの予測から「完成」できるパターンを見ているだけです。ユーザーが操作を停止するか、あらかじめ定められた条件が満たされるまで、予測を続けることが可能です。 + +プロンプトベースの完成(completion)がどのように機能するか確認してみたいですか?上記のプロンプトをデフォルトの設定のままでAzure OpenAI Studioの[_チャットプレイグラウンド_](https://oai.azure.com/playground?WT.mc_id=academic-105485-yoterada)に入力してください。システムは、プロンプトを情報のリクエストとして処理するように構成されいるので、その文脈に適した回答結果が得られるはずです。 + +それでは、ユーザーがある特定基準やタスク目標に対して適する、特定結果を望む場合はどうでしょうか?そのような場合には、_インストラクション・チューニングされた LLM_ が役立ちます。 + +![Base LLM Chat Completion](../../images/04-playground-chat-base.png?WT.mc_id=academic-105485-yoterada) + +### 概念: インストラクション・チューニングされた LLM + +[インストラクションチューニングされたLLM](https://blog.gopenai.com/an-introduction-to-base-and-instruction-tuned-large-language-models-8de102c785a6?WT.mc_id=academic-105485-yoterada)は、ファウンデーションモデルを基に、明確な指示を含む例や入出力の組み合わせ(例えば、複数のターンにわたる「メッセージ」など)で微調整を施します。そして、AI はその指示に従うような回答作成を試みるようになります。 + +これには、人間のフィードバックを取り入れた強化学習(Reinforcement Learning with Human Feedback : RLHF)などの技術が使われます。RLHF を利用すると、モデルが利用者からの _指示に従って_ 、 _フィードバックから学習する_ ようにトレーニングでき、これにより、実用的なアプリケーションに適した、よりユーザーの目的に合致する回答が得られるようになります。 + +それでは、実際に試してみましょう。 +先ほどのプロンプトに戻り、今度は _システムメッセージ_ を変更して、下記の指示をコンテキストとして加えてみてください: + +> _提供された内容を小学2年生が理解できるように要約してください。結果は3〜5項目を箇条書きで1段落にまとめてください。_ + +結果が、期待する内容とフォーマットに合わせて調整されているのをお分かり頂けますか?教員は、この回答を授業のスライドに直接利用することができるようになります。 + +![Instruction Tuned LLM Chat Completion](../../images/04-playground-chat-instructions.png?WT.mc_id=academic-105485-yoterada) + +## プロンプト・エンジニアリングはなぜ必要なのでしょうか? + +LLM がプロンプトをどのように処理するかを理解したところで、_なぜ_ プロンプト・エンジニアリングが必要なのかについて考えてみましょう。その答えは、現在の LLM がいくつかの課題を抱えており、プロンプトの作成と最適化に取り組まなければ、_信頼性のある一貫した回答_ を得ることが難しく、このような課題が多数存在するという事実があります。例を挙げると: + +1. **モデルの回答は確率的な性質を持っています。** たとえ、_同一プロンプト_ であっても、異なるモデルやモデルのバージョンの差によって、異なる回答を得る場合があります。そして、_同じモデル_ でも、異なる時期に実行すると異なる結果を生じることがあります。_プロンプト・エンジニアリングの手法は、より適切なガイドラインを提供することで、こうしたばらつきを減らすのに役立ちます。_ + +1. **モデルは回答を捏造することがあります** モデルは _大規模ながら有限の_ データセットで事前にトレーニングされているため、トレーニングの範囲を超えた概念に関する知識は不足しています。その結果、不正確、もしくは架空、あるいは既知の事実と明らかに矛盾する回答を出力することがあります。_プロンプトエンジニアリングの手法は、ユーザーがこのような捏造を特定し軽減するのに役立ちます。例えば、AI に出典や論理的根拠の説明を求めて防ぎます。_ + +1. **モデルの能力は異なります。** 新しいモデルや新世代のモデルは、より高度な機能を持つ一方で、独自の特性やコストと複雑さの面でトレードオフをもたらします。_プロンプト・エンジニアリングは、これらの違いを取り除き、スケーラブルでシームレスな方法でモデル固有の要件に適応するベストプラクティスとワークフローを開発するのに役立ちます。_ + +OpenAI や Azure OpenAI プレイグラウンドで実際に試してみましょう: + +- 異なる LLM 環境(例えば OpenAI、Azure OpenAI、Hugging Face)で同じプロンプトを使ってみてください - 変化に気づきましたか? +- _同じ_ LLM 環境(例えば:Azure OpenAI プレイグラウンド)で同じプロンプトを繰り返し実行してみてください - これらの変化はどのように変わりましたか? + +### 捏造の例 + +この講座では、LLM がトレーニングの制限やその他の制約により、事実に反する情報を回答する現象を「**捏造**」という用語で説明します。一般的な記事や研究論文で「_幻覚_」と表現されることもありますが、機械が生み出した回答に対して人間の特性を誤って当てはめる擬人化を避けるために、「_捏造_」という用語の使用を強く推奨します。これは、用語の観点から[責任ある AI のガイドライン](https://www.microsoft.com/ai/responsible-ai?WT.mc_id=academic-105485-yoterada)を強化するものであり、また、一部の文脈で不快感を与えたり排他的であると考えられる用語を排除することにもつながります。 + +捏造がどのように行われるかを理解したいですか?AI に対して、トレーニング・データに含まれていない、架空のトピックに関するコンテンツ作成をプロンプトで指示する事を考えてください。例えば、私は下記のプロンプトを試しました: + +> **プロンプト:** 2076年の火星戦争についての授業計画を生成してください。 + +Web で検索を行ったところ、火星の戦争についてのフィクション(例:テレビドラマや書籍)はいくつか見つかりましたが、2076 年に関するものは存在しませんでした。常識的に考えても、2076年は _未来_ であり、実際の出来事と関連付けることはできません。 + +それでは、このプロンプトを異なる LLM サービス・プロバイダで試したら、どのような結果が得られるのでしょうか? + +> **回答 1**: OpenAI Playground (GPT-35) + +![Response 1](../../images/04-fabrication-oai.png?WT.mc_id=academic-105485-yoterada) + +> **回答 2**: Azure OpenAI Playground (GPT-35) + +![Response 2](../../images/04-fabrication-aoai.png?WT.mc_id=academic-105485-yoterada) + +> **回答 3**: : Hugging Face Chat Playground (LLama-2) + +![Response 3](../../images/04-fabrication-huggingchat.png?WT.mc_id=academic-105485-yoterada) + +予想通り、モデルごと(またはモデルのバージョンごと)に、確率的なふるまいやモデルの能力差によって、微妙に異なる回答が得られました。たとえば、一つのモデルは中学2年生を対象にしているのに対し、別のモデルは高校生を対象にしています。しかし、どのモデルも、情報を持たないユーザーに対して、その出来事が実際にあったかのように誤解生じさせる回答を生成しました。 + +_メタプロンプティング_ や _温度調整_ といったプロンプトエンジニアリングの手法は、モデルによる捏造をある程度抑制することが可能です。新しいプロンプトエンジニアリングの _アーキテクチャ_ は、これらの影響を緩和または削減させるために、新しいツールや手法をプロンプト・フローにシームレスに取り入れています。 + +## ケーススタディ:GitHub Copilot + +このセクションを終えるにあたり、[GitHub Copilot](https://github.com/features/copilot?WT.mc_id=academic-105485-yoterada) の事例を通じて、プロンプト・エンジニアリングが実際のソリューションでどのように活用されているかを具体的に見ていきましょう。 + +GitHub Copilotは「AI ペア・プログラマー」として機能し、開発環境(例:Visual Studio Code)に統合し、テキスト・プロンプトからコードに変換することでユーザーにシームレスな体験を提供します。下記のブログ・シリーズに記述されているように、初期バージョンは OpenAI Codex モデルをベースにしていました。しかしエンジニアはすぐにコード品質をより向上させるため、モデルをファイン・チューニングし、より良いプロンプト・エンジニアリング技術を開発する必要性を認識しました。7月には、[Codex を越える改良版 AI モデルを発表し](https://github.blog/2023-07-28-smarter-more-efficient-coding-github-copilot-goes-beyond-codex-with-improved-ai-model/?WT.mc_id=academic-105485-yoterada)、これにより、さらに素早い提案が可能になりました。 + +投稿を順番に読んで、GitHub Copilot の学習の過程をたどってください。 + +- **2023年5月** | [GitHub Copilot、コード理解能力を向上](https://github.blog/2023-05-17-how-github-copilot-is-getting-better-at-understanding-your-code/?WT.mc_id=academic-105485-yoterada) +- **2023年5月** | [GitHub の内部:GitHub Copilot の背後にある LLM との連携](https://github.blog/2023-05-17-inside-github-working-with-the-llms-behind-github-copilot/?WT.mc_id=academic-105485-yoterada). +- **2023年6月** | [GitHub Copilot 用のより効果的なプロンプトの作成方法](https://github.blog/2023-06-20-how-to-write-better-prompts-for-github-copilot/?WT.mc_id=academic-105485-yoterada). +- **2023年7月** | [改良した AI モデルで Codex を超越した GitHub Copilot](https://github.blog/2023-07-28-smarter-more-efficient-coding-github-copilot-goes-beyond-codex-with-improved-ai-model/?WT.mc_id=academic-105485-yoterada) +- **2023年7月** | [開発者向けプロンプト・エンジニアリングと LLM のガイド ](https://github.blog/2023-07-17-prompt-engineering-guide-generative-ai-llms/?WT.mc_id=academic-105485-yoterada) +- **2023年9月** | [企業向け LLM アプリの構築方法:GitHub Copilot の事例から学ぶ](https://github.blog/2023-09-06-how-to-build-an-enterprise-llm-application-lessons-from-github-copilot/?WT.mc_id=academic-105485-yoterada) + +また、これらのモデルやテクニックを実際のアプリケーションに適用する方法をまとめた[こちらの記事](https://github.blog/2023-09-27-how-i-used-github-copilot-chat-to-build-a-reactjs-gallery-prototype/?WT.mc_id=academic-105485-yoterada)のように、 +より多くの知見を得たい場合は、[エンジニア・ブログ](https://github.blog/category/engineering/?WT.mc_id=academic-105485-yoterada)もどうぞご覧ください。 + +--- + + + +## プロンプトの組み立て + +ここまで、プロンプト・エンジニアリングがなぜ大切なのかを見てきました。次に、プロンプトをどのように _作成する_ のかを把握し、より効果的なプロンプトを設計するために存在する、様々な手法を見ていきましょう。 + +### 基本的なプロンプト + +基本的なプロンプトから始めましょう:モデルに送信するテキスト入力で、他のコンテキストはありません。例を挙げると、OpenAI の[Completion API](https://platform.openai.com/docs/api-reference/completions?WT.mc_id=academic-105485-yoterada) にアメリカ国歌の最初の数語を送ると、すぐに次の数行で回答を _完成させる_、基本的な予測動作を示します。 + +| プロンプト (入力) | 回答 (出力) | +|:---|:---| +| Oh say can you see | アメリカ合衆国の国歌「星条旗」の歌詞から始めているように聞こえますね。完全な歌詞は... | + +### 複雑なプロンプト + +次に、基本的なプロンプトにコンテキストと指示を加えてみましょう。[Chat Completion API](https://learn.microsoft.com/azure/ai-services/openai/how-to/chatgpt?WT.mc_id=academic-105485-yoterada) を利用すると、以下の要素を含むメッセージのコレクションとして高度なプロンプトを作成できます: + +- _ユーザー_ の入力と _アシスタント_ の応答を示す入出力ペア +- アシスタントの振る舞いや人格の文脈を設定するシステムメッセージ + +リクエストは下記の形式になり、トークン化によってコンテキストと会話から関連情報を効果的に捉えられます。システム・コンテキストの変更は、ユーザーの入力内容と同じくらい、回答品質に影響を与える可能性があります。 + +```python +response = openai.ChatCompletion.create( + model="gpt-3.5-turbo", + messages=[ + {"role": "system", "content": "あなたは頼りになる助手です。"}, + {"role": "user", "content": "2020年のワールドシリーズで優勝したのはどのチームですか?"}, + {"role": "assistant", "content": "2020年のワールドシリーズはロサンゼルス・ドジャースが優勝しました。"}, + {"role": "user", "content": "その試合はどこでプレイされましたか?"} + ] +) +``` + +### 指示 (Instruction) を含むプロンプト + +上記の例では、ユーザーのプロンプトは情報を求めるだけの単純なテキストの問い合わせでした。 _指示 (Instruction)_ を含むプロンプトを使用すると、テキストを通じてより詳細にタスクを指定し、AI に対する指示を改善できます。以下に例を示します: + +| プロンプト (入力) | 回答 (出力) | 指示 (Instruction) の型 | +|:---|:---|:---| +| 南北戦争について教えてください | _単純な説明文を返す_ | シンプル| +| 南北戦争について教えてください。戦争における重要な日付とその出来事、そしてその重要性を教えてください。 | _説明段落の後に、主要なイベントの日付リストとイベント名、それに関する説明が箇条書きで出力されます。_| 複雑 | +| 南北戦争について1段落で説明を書いてください。戦争における重要な日付とその重要性を3つの箇条書きにしてください。さらに、主要な歴史上の人物とその貢献について3つの箇条書きで記述してください。出力は JSON フォーマットとして返してください。| _テキスト・ボックス内でより詳細な情報を返し、必要に応じてファイルにコピー&ペーストして検証できるように JSON 形式で整形されたデータを提供します_| 複雑、出力フォーマット指定 | + +## 主要コンテンツ + +上記の例では、プロンプトは比較的自由度が高く、LLM が事前にトレーニングされたデータセットのどの部分が関連するかを決定する余地がありました。_主要コンテンツ_ のデザイン・パターンでは、入力テキストは二つのパートに分割されます: + +- 指示(行動) +- 関連する内容(行動に影響を及ぼす) + +以下は、「これを 2 つの短い文にまとめてください」という指示の例です。 + +| プロンプト (入力) | 回答 (出力) | +|:---|:---| +| 木星は太陽から五番目の惑星で、太陽系で最も大きな惑星です。質量は太陽の千分の一ですが、太陽系内の他のすべての惑星を合わせたものの2.5倍の巨大ガス惑星です。木星は夜空に肉眼で見える最も明るい天体の一つで、記録された歴史以前から古代文明に知られていました。ローマ神話の神ジュピターにちなんで名付けられました。[19] 地球から見ると、木星は反射光が目に見える影を投げるほど明るくなることがあり[20]、平均して月と金星に次いで夜空で三番目に明るい天体です。
**これを2つの短い文にまとめてください**| 木星は太陽系で最も大きい惑星で、太陽系の他の全惑星の質量合計の2.5倍に相当します。夜空で3番目に明るく輝くこの巨大ガス惑星は、古代から知られ、ローマ神話の最高神ジュピターの名を冠しています。 | + +主要コンテンツの部分は、より効果的な指示を出すためにさまざまな方法で利用できます: + +- **実例** - モデルに明確な指示を出す代わりに、実行すべき実例を与えて、そのパターンを推測させます。 +- **キュー(手がかり)** - 完了を促す「キュー(合図)」の指示に従って、モデルをより関連性の高い回答に誘導します。 +- **テンプレート** - 繰り返し再利用できるプロンプトの「レシピ」で、特定の用途に合わせて入力データをカスタマイズできるプレースホルダー(変数)を持ちます。 + +これらを実際に探ってみましょう。 + +### 使用例 + +この手法では、特定の指示に対して期待する出力のサンプルをいくつか「モデルに供給し」、主要コンテンツを使用し、期待する出力パターンをモデルに推測させるアプローチです。提供する例の数に応じて、ゼロショット、ワンショット、フューショット・プロンプティングなどがあります。 + +プロンプトは、下記の3つの要素から構成されます: + +- タスクの説明 +- 期待する出力の数例 +- 新しい例の開始部分(これが暗黙的にタスク説明となります) + +| 学習の型 | プロンプト (入力) | 回答 (出力) | +|:---|:---|:---| +| ゼロ・ショット | 「太陽は輝いている」をスペイン語に翻訳してください | "El Sol está brillando".| +| ワン・ショット | 「太陽は輝いている」 => "El Sol está brillando".
"寒くて風の強い日です" => | "Es un día frío y ventoso". | +| フュー・ショット| プレーヤーは塁を回った => 野球
プレーヤーはサービス・エースと取った => テニス
プレーヤーは6ランを打った => クリケット
プレーヤーはスラムダンクをした => | バスケットボール | +| | | | + +ゼロ・ショット・プロンプトでは明示的な指示(「スペイン語に翻訳してください」)を提供する必要がありましたが、ワン・ショット・プロンプトの例では、回答が推測されていることをご確認ください。フュー・ショットの例では、さらに複数の例を追加することで、モデルが追加の指示なしで、より正確な推論を行うことができていることを示しています。 + +### プロンプト・キュー + +主要コンテンツを利用する際、もう一つの方法は、例を提供する代わりに _キュー(手がかり)_ を提供することです。この場合、期待する回答フォーマットを反映した一部で _始める_ ことで、モデルを正しい方向に少し誘導します。その後、モデルはその手がかりを受け取って、その流れに従って続けます。 + +| キューの数 | プロンプト (入力) | 回答 (出力) | +|:---|:---|:---| +| 0 | 木星は太陽から五番目の惑星で、太陽系で最も大きな惑星です。質量は太陽の千分の一ですが、太陽系内の他のすべての惑星を合わせたものの2.5倍の巨大ガス惑星です。木星は夜空に肉眼で見える最も明るい天体の一つで、記録された歴史以前から古代文明に知られていました。
**これを要約してください** | 木星は太陽系で最も巨大な惑星であり、質量は太陽系の他のすべての惑星の合計の2.5倍に達します。夜空で非常に明るく輝き、古代から人類に認識されていた天体です。| +| 1 | 木星は太陽から五番目の惑星で、太陽系で最も大きな惑星です。質量は太陽の千分の一ですが、太陽系内の他のすべての惑星を合わせたものの2.5倍の巨大ガス惑星です。木星は夜空に肉眼で見える最も明るい天体の一つで、記録された歴史以前から古代文明に知られていました。
**要約すると、私たちが学んだのは、木星が**
| 太陽系で最も大きい惑星で、太陽から五番目に位置し、質量は太陽系の他の惑星を合わせたものより2.5倍大きいです。また、夜空でよく見える明るい天体の一つで、古代文明の時代から知られています。 | +| 2 | 木星は太陽から五番目の惑星で、太陽系で最も大きな惑星です。質量は太陽の千分の一ですが、太陽系内の他のすべての惑星を合わせたものの2.5倍の巨大ガス惑星です。木星は夜空に肉眼で見える最も明るい天体の一つで、記録された歴史以前から古代文明に知られていました。
**事実から学んだ3つの要約は:**
| 1. 木星は太陽から五番目の位置にある太陽系で最も大きな惑星です。
2. 木星の質量は太陽系の他の惑星を合わせたものよりも2.5倍大きく、太陽の千分の一に相当します。
3. 木星は夜空で肉眼によく見える明るい天体であり、古代文明の時代から人類に知られていました。 | +| | | | + +### プロンプト・テンプレート + +プロンプト・テンプレートは、必要に応じて保存し再利用できる _事前に定義したプロンプトのレシピ_ で、大規模向けに一貫したユーザー・エクスペリエンスを実現するために使用します。最も基本的な形式は、[OpenAI の例](https://platform.openai.com/examples?WT.mc_id=academic-105485-yoterada)のようなプロンプト例のコレクションで、インタラクティブなプロンプト要素(ユーザー メッセージとシステム メッセージ) と API 駆動型のリクエスト・フォーマットの両方を提供しており、再利用を促進しています + +[LangChain の例](https://python.langchain.com/docs/modules/model_io/prompts/prompt_templates/?WT.mc_id=academic-105485-yoterada)のような、より複雑な形式では、様々なソース(ユーザー入力、システムコンテキスト、外部データソースなど)からのデータを置き換える _プレースホルダー_ を含んでおり、プロンプトを動的に生成できます。これにより、大規模に**プログラムによる**一貫したユーザー・エクスペリエンスを実現するための再利用可能なプロンプトのライブラリを作成することが可能になります。 + +最後に、テンプレートの真の価値は、特定の垂直アプリケーションドメイン用の _プロンプト・ライブラリ_ を作成し、公開する能力にあります。プロンプトテンプレートを、アプリケーション固有のコンテキストや例を反映するように最適化し、ターゲットの利用者にとって回答をより適切で正確なものにします。[Prompts For Edu](https://github.com/microsoft/prompts-for-edu?WT.mc_id=academic-105485-yoterada)リポジトリは、教育分野に特化したプロンプトのライブラリを集め、レッスン計画やカリキュラム設計、学生の個別指導などの重要な目標に焦点を当てた、この手法の優れた例です。 + +## サポートコンテンツ + +プロンプトの作成を、指示(タスク)と目的(主コンテンツ)を含むものと考えた場合、_サポートコンテンツ_ は、**何らかの形で影響を与える**追加情報のようなものです。これは、モデルがユーザーの目的や期待に応じて回答を _カスタマイズ_ するのを支援するチューニング・パラメーターやフォーマットの指示、トピックの分類方法などを含むことができます。 + +例えば、カリキュラムで利用可能な全コースに関する広範囲のメタデータ(名前、説明、レベル、メタデータタグ、講師など)を含むコース・カタログがあるとします: + +- 「2023 年秋のコース・カタログを要約してください」という指示を定義できます +- プライマリコンテンツを使用して、期待する出力例をいくつか提供できます +- セカンダリコンテンツを使用して、関心のある上位5つの「タグ」を識別できます。 + +これで、モデルはいくつかの例で示したフォーマットで要約を提供することができますが、もし結果に複数のタグが含まれている場合は、セカンダリ・コンテンツで識別した 5 つのタグを優先することができます。 + +--- + + + +## プロンプト作成のベストプラクティス + +プロンプトがどのように _組み立てられる_ かを理解したので、ベスト・プラクティスを反映するように _プロンプトをデザイン_ する方法について考えます。これは、適切な _考え方_ を持ち、適切な _テクニック_ を適用するという2つの側面に分けて考えることができます。 + +### プロンプト・エンジニアリングの考え方 + +プロンプトエンジニアリングは試行錯誤のプロセスなので、以下の 3 つの広範な指針を念頭に置いてください. + +1. **ドメインの理解が大切です。** 回答の精度や関連性は、アプリケーションやユーザーが活動する _ドメイン_ に依存します。直感とドメインの専門知識を用いて、**テクニックをさらにカスタマイズ**してください。たとえば、システム・プロンプトに _ドメイン固有のパーソナリティ_ を定義したり、ユーザー・プロンプトに _ドメイン固有のテンプレート_ を使用します。ドメイン固有の文脈を反映するセカンダリ コンテンツを提供したり、 _ドメイン固有の手がかりや例_ を使用して、モデルが慣れ親しんだ使用パターンに導きます。 + +2. **モデル理解が大切です。** モデルは本質的に確率的な性質を持っていますが、使用するトレーニング・データ(事前学習した知識)、提供する機能(例えば API や SDK を通じて)、最適化されたコンテンツの種類(例えばコード、画像、テキスト)によっても実装は異なります。使用するモデルの長所と制限を理解し、その知識を用いて _タスクに優先順位を付けたり_ 、モデルの能力に最適化した _カスタマイズしたテンプレート_ を作成してください。 + +3. **反復と検証が重要です。** モデルは急速に進化しており、プロンプト・エンジニアリングの手法も急速に進化しています。ドメインの専門家として、広範囲のコミュニティには、 _あなたが実装する_ アプリケーションに適さない、独自のコンテキストや基準があるかもしれません。プロンプト・エンジニアリングのツールやテクニックを使用してプロンプトの作成を「いち早く開始し」、その後、自分の直感とドメインの専門知識を使用して結果を反復しながら検証してください。そして知見を記録し、他者がが将来的により迅速に反復でき、新しい基準として使用できる **ナレッジベース**(例えばプロンプトライブラリ)を作成してください。 + +## ベストプラクティス + +次に、[Open AI](https://help.openai.com/en/articles/6654000-best-practices-for-prompt-engineering-with-openai-api?WT.mc_id=academic-105485-yoterada) と [Azure OpenAI](https://learn.microsoft.com/azure/ai-services/openai/concepts/prompt-engineering#best-practices?WT.mc_id=academic-105485-yoterada) の実践者が推奨する一般的なベスト プラクティスを見てみましょう。 + +| 項目 | 理由 | +|:---|:---| +| 最新モデルの評価 | 新世代のモデルは、機能や品質が向上している可能性があります。一方でコストが高くなる可能性もあります。影響を評価し移行の可否を検討します。 | +| 指示とコンテキストの分離 | 使用しているモデルやサービス提供者が、指示やプライマリコンテンツ、セカンダリコンテンツを明確に区別するために、 _区切り文字_ を定義しているか確認してください。これにより、モデルはトークンに対して重みをより正確に割り当てることができます。 | +| 具体的かつ明確 | 目的のコンテキスト、結果、長さ、フォーマット、スタイルなどについての詳細を記入してください。これにより、回答の品質と一貫性の両方が向上します。再利用可能なテンプレートにレシピを取り込みます。 | +| 詳細に説明し、実例を示す | モデルは「示しながら教える」アプローチにより適切に応答する可能性があります。まずはゼロショット・アプローチからはじめます、最初は指示を出すだけで例を示さないでください。次にフューショット・アプローチで期待する出力例をいくつか提供し改善します。類推してください。| +| 手がかりを用いて出力を促進 | 回答の起点となる、いくつかの単語やフレーズを与え期待する結果を得てください。| +| ダブル・ダウン | 場合によっては、モデルに対して自身で反復する必要があります。メイン・コンテンツの前後で指示を出したり、指示やキュー(手がかり)を使ったりします。反復して検証し、何が機能するかを確認します。| +| 順序の重要性 | モデルに対する情報提示の順番は出力に影響を及ぼすことがあります。それが学習例の提示だとしても、最近の情報に過敏に影響を受ける認知バイアス (recency bias) によって影響します。(訳者追記:プロンプトの末尾にある情報が出力に大きな影響を与えることがある)どの方法が最良かを見極めるために、異なる方法も試してみることをお勧めします。| +| モデルに「代替案」を用意する | 何らかの理由でタスクを完了できない場合に備えて、モデルが提供できる _代替の回答_ を用意してください。これにより、モデルが誤ったり、捏造した回答を生成する可能性を低減します。 | + +すべてのベストプラクティスに共通して、_実際の効果はケース・バイ・ケース_ であることを認識してください。モデルの種類、タスクの内容、専門分野によって結果は変わります。上記の指針を基点に、ご自身にとって何が最も効果的かを見つけるために、試行錯誤を繰り返してください。新しいモデルやツールが登場するたびに、プロセスのスケーラビリティと回答の品質に注目し、プロンプト・エンジニアリングの手法をを継続的に再評価しましょう。 + + + +## 課題 + +おめでとうございます!レッスンの最後までたどり着きました!これから、実際の例を使って、いくつかの概念や技術を試す時が来ました! + +課題では、対話式で取り組める演習問題がセットされた Jupyter Notebook を使用します。また、ご自身でアイデアや技術を検証するために、独自の Markdown やコードセルを Notebook に追加することもできます。 + +### 作業を開始するには、リポジトリをフォークてください + +- (推奨) GitHub Codespacesを起動 +- (代替案 1) リポジトリをローカル・デバイスにクローンして、ローカルの Docker Desktop で実行 +- (代替案 2) 好みのノートブック実行環境でノートブックを開く + +### 次に、環境変数を設定してください + +- リポジトリのルートにある `.env.copy` ファイルを `.env` にコピーし、`OPENAI_API_KEY` の値を入力してください。API キーは [OpenAI Dashboard](https://beta.openai.com/account/api-keys?WT.mc_id=academic-105485-yoterada) から取得できます。 + +### 次に、Jupyter Notebookを開いてください + +- 使用する実行環境のカーネルを選択してください。オプション 1 や 2 を利用している場合は、devcontainer が提供する標準の Python 3.10.x カーネルを選んでください。 + +これで、演習を行う準備が整いました。この演習には _正解や不正解はありません_。与えられたモデルとアプリケーション・ドメインに対して、何が効果的かを試行錯誤しながら感覚を養うことが目的です。 + +_このため、このレッスンにはコードの解答例は含まれていません。代わりに、ノートブックには 「My Solution」 と書かれた Markdown セルがあり、参考として出力例を示しています。_ + + + +## 知識チェック + +以下のプロンプトの中で、適切なベストプラクティスに沿ったものはどれですか? + +1. 赤い車の写真を画像を表示してください +2. 夕日が沈む崖のそばに駐車した、赤いボルボの XC90 モデルの画像を表示してください +3. 赤いボルボの XC90 モデルの画像を表示してください + +A: 2番が最良のプロンプトです。それは「何を」求めているのかの詳細を提供し、具体的な情報(任意の車ではなく、特定のメーカーとモデル)を含んでいる上、周囲の環境についても描写しています。次に良いのは3番で、これも詳細な記述が含まれています。 + +## 🚀 チャレンジ + +プロンプトで 「キュー」のテクニックを利用してください。 +例文:「赤いボルボの車の画像を見せて、そして...」という文を完成させてください。どのような回答が返ってきますか?また、それをどう改善することができますか? + +## お疲れ様でした! 次のレッスンを続ける + +プロンプト・エンジニアリングに関して、さらに概念をもっと深く学びたい方は、この話題に関する他の素晴らしい情報を見つけるために[継続的学習のページ](../../../13-continued-learning/README.md?WT.mc_id=academic-105485-yoterada)をご参照ください。 + +それでは、レッスン5に移り、[高度なプロンプト技術](../../../05-advanced-prompts/translations/ja-jp/README.md?WT.mc_id=academic-105485-yoterada)を見ていきましょう! diff --git a/05-advanced-prompts/translations/ja-jp/README.md b/05-advanced-prompts/translations/ja-jp/README.md new file mode 100644 index 000000000..6857b6474 --- /dev/null +++ b/05-advanced-prompts/translations/ja-jp/README.md @@ -0,0 +1,628 @@ +# 高度なプロンプトの作成 + +[![高度なプロンプトの作成](../../images/05-lesson-banner.png?WT.mc_id=academic-105485-yoterada)](https://youtu.be/32GBH6BTWZQ?WT.mc_id=academic-105485-yoterada) + +前の章で学んだことをいくつかおさらいしましょう。 + +> プロンプト _エンジニアリング_ は、より有用な指示やコンテキストを提供することで、**より適切な回答の提供に向けてモデルを導く**プロセスです。 + +また、プロンプトを書くには、関連するコンテキストを提供することで、プロンプトを作成する際 2つのステップがあり、2番目の部分は _最適化_、つまりプロンプトを徐々に改善する手法です。 + +ここまでで、プロンプトの書き方についての基本的な理解はできましたが、さらに深く掘り下げる必要があります。この章では、さまざまなプロンプトを試し、あるプロンプトが別のプロンプトよりも優れている理由を理解します。任意の LLM に適用できる、いくつかの基本的な手法に従いプロンプトを作成する方法を学習します。 + +## はじめに + +この章では、次のトピックについて説明します。 + +- プロンプトにさまざまな手法を適用することで、プロンプト・エンジニアリングの知識を深めます +- 出力を変化させるようプロンプトを構成します + +- プロンプトには、さまざまな手法を適用することで、プロンプト・エンジニアリングの知識の幅を広げます +- 出力を変化させるようなプロンプトを作成します。 + +## 学習目標 + +このレッスンを完了すると、次のことができるようになります。 + +- プロンプトの結果を改善するプロンプト・エンジニアリング手法を利用できる。 +- 多様な、あるいは決定的なプロンプトを実行できる。 + +## プロンプト・エンジニアリング + +プロンプト・エンジニアリングは、期待する結果を生み出すためのプロンプトを作成するプロセスです。プロンプト・エンジニアリングには、単にテキスト・プロンプトを書くだけではありません。プロンプト・エンジニアリングはエンジニアリング分野ではなく、期待する結果を得るために適用できる一連のテクニックです。 + +### プロンプトの例 + +次の基本的なプロンプトを見てみましょう。 + +> 地理に関する質問を10問作成してください + +このプロンプトの中では、実際には一連のさまざまなプロンプトのテクニックを適用しています。 + +詳しく見ていきましょう。 + +- **コンテキスト :** 「地理」に関する質問であることを指定しています。 +- **出力を制限 :** 作成される質問の数は 10 個以下になります + +### 単純なプロンプトの制限 + +期待する結果が得られる場合と得られない場合があります。地理は幅広いテーマであり、以下の理由により期待する結果が得られない場合があります。 + +- **大きな話題 :** 国、首都、川などのような話題は大きく、どのような結果が返されるか予想できません。 +- **フォーマット :** 質問を特定の方法で書式設定したい場合はどうすればよいでしょうか。 + +ご覧のとおり、プロンプトを作成する際には考慮すべきことがたくさんあります。 + +ここまでは、簡単なプロンプトの例を見てきましたが、生成 AI は、さまざまな役割や業界の人々を支援するために、より多くのことができます。次に、いくつかの基本的なテクニックを確認してみましょう。 + +### プロンプトのテクニック + +まずプロンプトは、大規模言語モデル (LLM) の登場で、_新たに出てきた技術_ で、これはモデルに組み込まれている機能ではなく、モデルを使用する際に使用するものだと理解する必要があります。 + +LLM のプロンプトで利用できる、いくつかの基本的なテクニックがあります。それらを確認してみましょう。 + +- **Few shot prompting** プロンプトの最も基本的な形式で、いくつかの例を含む一つのプロンプトです。 +- **Chain-of-thought** このプロンプトは、問題を段階に分解し LLM に問い合わせします。 +- **Generated knowledge** プロンプトの応答を改善するため、事実や知識をプロンプトに追加で提供します。 +- **Least to most** Chain-of-thought(思考の連鎖)と同様に、この手法は問題を一連のステップに分解し、それらのステップを順番に実行するように指示します。 +- **Self-refine** この手法は、LLM の出力に対する評価と、それに対する改善要求を行います。 +- **Maieutic prompting** これは、LLM の回答が正しいことを確認し、回答の各部分を説明するように求めます。これは自己改善の一種です。 + +### Few-shot prompting + +このプロンプトはとても簡単で、一つのプロンプトといくつかの例から構成します。 +この手法は、LLM について学び始めたときに最初に使用する手法です。次に例を示します。 + +- プロンプト: 「代数とは何ですか?」 +- 回答: 「代数は、数学の一分野で、数学記号とそれらの記号を操作するためのルールを研究します。」 + +### Chain-of-thought + +Chain-of-thought (思考の連鎖)は非常に興味深く、LLM を一連の段階に分けて回答を導く手法です。LLM が、何をどうやって行うかを理解するように指導する手法です。次の例を考えてみてください。Chain-of-thought を用いた場合と用いない場合の両方の例をご覧ください。 + + - プロンプト: 「アリスはリンゴを 5 個持っていて、3 個を捨て、2 個をボブに渡し、ボブは 1 個を返します。アリスはリンゴを何個持っていますか?」 + - 回答: 5 + +LLMは5と答えますが、これは間違いです。正しい答えはリンゴ 1 個で、計算式は(5 -3 -2 + 1 = 1)です。 + +では、どうやって LLM がこれを正しく行うように教えることができるでしょうか? + +Chain-of-thought を試してみましょう。Chain-of-thought を適用するためには: + +1. LLM に類似の例を示す。 +2. 計算式と、それを正しく計算する方法を示す。 +3. 元のプロンプトを提供する。 + +という手順を踏みです。以下にその方法を示します。 + + - プロンプト: 「リサはリンゴを7個持っていて、1個を捨て、4個をバートに渡し、バートは1個を返します。計算は次の通り: + 7 - 1 = 6 + 6 - 4 = 2 + 2 + 1 = 3 + アリスはリンゴを 5 個持っていて、3 個を捨て、2 個をボブに渡し、ボブは 1 個を返します。アリスはリンゴを何個持っていますか?」 + - 回答: 1 + +別の例と、計算式を用いて、少し長いプロンプトを作成し、元のプロンプトを提供することで、正しい答え 1 に到達する方法に注目してください。 + +ご覧の通り、Chain-of-thought (思考の連鎖) は非常に強力な手法です。 + +### Generated knowledge + +プロンプトを作成する際、多くの場合、自社のデータを活用します。プロンプトの一部は会社からの情報で、残りの部分は具体的な問い合わせ内容にします。 + +例えば、保険業界であれば、プロンプトは以下のようになるでしょう。 + +```text +{{company}}: {{company_name}} +{{products}}: +{{products_list}} +以下の予算と要件を考慮した上で、保険を提案してください: +予算: {{budget}} +要件: {{requirements}} +``` + +上記は、テンプレートを使用してプロンプトをどのように作成するかを示しています。テンプレートには、`{{variable}}`という形式で表現する変数はいくつかあり、これらは会社の API から取得した実際の値に置き換えます。 + +以下は、変数を自社の情報に置き換えた後のプロンプトの例です。 + +```text +保険会社: ACME保険 +保険商品(月額料金): +- 自動車保険, 安価, 500ドル +- 自動車保険, 高価, 1100ドル +- 家財保険, 安価, 600ドル +- 家財保険, 高価, 1200ドル +- 生命保険, 安価, 100ドル + +以下の予算と要件を考慮した上で、保険を提案してください: +予算: $1000 +要件: 自動車保険, 家財保険 +``` + +このプロンプトをLLM(Language Model)で実行すると、以下のような回答が得られます。 + +```output +生命保険も含めて + +予算と要件を考慮した上で、ACME保険から以下の保険パッケージを提案します: +- 自動車保険, 安価, 500ドル +- 家財保険, 安価, 600ドル +- 生命保険, 安価, 100ドル +合計費用: $1,200ドル +``` + +この結果では、生命保険も提案されていますが、これは本来求めていない結果です。これは、プロンプトが何を許可するかをより明確にするために、プロンプトを最適化する必要があることを示しています。試行錯誤を繰り返した結果、以下のようなプロンプトにたどり着きました。 + +```text +保険会社: ACME保険 +保険商品(月額料金): +- 種類: 自動車保険, 安価, 費用: 500ドル +- 種類: 自動車保険, 高価, 費用: 1100ドル +- 種類: 家財保険, 安価, 費用: 600ドル +- 種類: 家財保険, 高価, 費用: 1200ドル +- 種類: 生命保険, 安価, 費用: 100ドル + +以下の予算と要件を考慮した上で、保険を提案してください: +予算: $1000 選択を以下の種類に限定: 自動車保険, 家財保険 +``` + +「種類」と「費用」を追加し、「限定」というキーワードを使用することで、LLM が何を求めているかを理解するのに役立ちます。 + +これにより、以下のような応答が得られます。 + +```output +予算と要件を考慮した上で、月額500ドルの自動車保険(安価)を提案します。 +``` + +この例から、Generated knowledge という手法を使用しても、多くの場合、望む結果を得るためにはプロンプトの最適化が必要であることがわかります。 + +### Least-to-most + +「Least-to-most (最小から最大) プロンプト」のアイデアは、大きな問題を小さな問題に分割することです。これにより、LLM(Language Model)が大きな問題をどのように「解決」するかをガイドするのに役立ちます。良い例としては、データサイエンスがあります。LLM に以下のように問題を分割するように依頼することができます。 + +> プロンプト: 5つのステップで、データサイエンスを実行する方法は何ですか? + +AI アシスタントは以下のように回答します。 + +1. データを収集する +2. データをクリーニングする +3. データを分析する +4. データをプロットする +5. データを提示する + +### Self-refine, critique the results + +生成 AI や LLM を使用する際、その出力をそのまま信じてはいけません。必ず確認が必要です。なぜなら、LLM は何が正しいかではなく、次に出てくる可能性が最も高いものを提示しているだけだからです。そのため、LLM に自己評価を求め、それによって自己改善するという手法が有効です。 + +この手法は以下の手順で行います: + +1. 最初に LLM に問題解決を求める +2. LLM が回答する +3. その回答を評価し、AI に改善を求める +4. LLM が再度回答し、今度は評価を考慮して自身が考えた解決策を提案する + +このプロセスは何度でも繰り返すことができます。 + +以下にこの手法を使用した例を示します: + +> プロンプト: "製品と顧客を持つ Python Web API を作成してください" + +AIの回答: + +```python +import flask +app = Flask(__name__) + +@app.route('/products') +def products(): + return 'Products' + +@app.route('/customers') +def customers(): + return 'Customers' +``` + +> プロンプト: "上記のコードの改善点を3つ提案してください" + +AIの回答: + +```text +もちろんです、コードを改善するための3つの提案をします: + +正しいモジュールをインポートする:最初の行は flask ではなく Flask をインポートするべきです。正しいインポート文は from flask import Flask となります。 + +メイン関数を追加する:ファイルを実行した際、アプリケーションを実行できるように、if __name__ == '__main__': ブロックをファイルの最後に追加します。 + +f-strings を使用する:ルート関数の return 文をフォーマットするために f-strings を使用します。例えば、'Products' を返す代わりに、f'This is the {request.path} page' を返すように変更できます。 +``` + + +```python +from flask import Flask, request + +app = Flask(__name__) + +@app.route('/products') +def products(): + return f'This is the {request.path} page' + +@app.route('/customers') +def customers(): + return f'This is the {request.path} page' + +if __name__ == '__main__': + app.run() +``` + +上記の AI の回答を見ると、最初の回答を再評価することで、最初に提案されたコードが改善されていることがわかります。 + +### Maieutic prompting + +Maieutic プロンプトは、self-refine (自己改善) と似た手法ですが、こちらは LLM に自身で説明を求めるものです。目指すのは、LLM の出力における不整合を減らし、正確な答えを得ることです。そのための手順は以下のようになります。 + +1. LLM に質問に答えるよう求める +2. 答えの各部分について、LLM に詳しく説明させる +3. 不整合がある場合、その部分は排除する + +これら全ての内容を検討し、回答に満足するまで 2 と 3 の手順を繰り返します。 + +以下に、例を示します。 + +> プロンプト: パンデミックを緩和するための危機対策を5つの段階でどのように作成すればよいか教えてください。 + +LLMの回答: + +```text +1. リスクを特定する +2. 利害関係者を特定する +3. リソースを特定する +4. 行動を特定する +5. コミュニケーションチャネルを特定する +``` + +5 つが特定されましたが、これが正しいかどうかを確認するために、LLM に各内容を詳しく説明させてみましょう。 + +> プロンプト: 最初のステップを詳しく説明してください。具体的には、パンデミックにおけるリスクは何ですか? + + ```text + リスクは以下の通りです: + + - 生命の喪失 + - ビジネスの喪失 + - 評判の喪失 + - 顧客の喪失 + - 従業員の喪失 + ``` + +ここで、LLM が正しいかどうかを確認するため、最初のリスクについて詳しく説明させ、それが上記の答えと一致することを確認します。 + +> プロンプト: パンデミックにおいて、最も大きなリスクは何でしょうか?また、その理由は何ですか? + +```text +最も大きなリスクは生命の喪失で、それは最も重要な守るべきものです。 +``` + +> パンデミックにおけるリスクの中で、最も大きな2つのリスクは何だと思いますか? + +```text +最も大きな2つのリスクは、生命の喪失とビジネスの喪失です。 +``` + +ここで、LLM は一貫性を保ち、「生命」と「ビジネス」を最大の2つのリスクとして挙げています。これにより、次のステップに進むことができ、かなりの自信を持つことができます。ただし、LLM を盲目的に信頼するのではなく、常にその出力を検証することが重要です。 + +## Vary your output + +LLM は本質的に非確実な性質を持っているため、同じプロンプトを実行しても結果は毎回異なります。例えば、以下のプロンプトを試してみてください。 + +> "Python Web API のコードを生成してください" + +```text +# 必要なモジュールをインポートする +import flask +from flask import request, jsonify + +# Flaskアプリを作成する +app = flask.Flask(__name__) + +# APIのルートを作成する +@app.route('/api', methods=['GET']) +def api(): + # リクエストからデータを取得する + data = request.args + + # データを処理する + result = process_data(data) + + # 結果をJSONとして返す + return jsonify(result) + +# データを処理する関数 +def process_data(data): + # データを何かしら処理する + result = data + 1 + + # 結果を返す + return result + +# アプリを実行する +if __name__ == '__main__': + app.run() +``` + +同じプロンプトを再度実行すると、少し異なる結果が出力されます。 + +```text +# 必要なパッケージをインポートする +import flask +from flask import request, jsonify + +# Flaskアプリケーションを作成する +app = flask.Flask(__name__) +app.config["DEBUG"] = True + +# 本のリストを作成する +books = [ + {'id': 0, + 'title': 'A Fire Upon the Deep', + 'author': 'Vernor Vinge', + 'first_sentence': 'The coldsleep itself was dreamless.', + 'year_published': '1992'}, + {'id': 1, + 'title': 'The Ones Who Walk Away From Omelas', + 'author': 'Ursula K. Le Guin', + 'first_sentence': 'With a clamor of bells that set the swallows soaring, the Festival of Summer came to the city Omelas, bright-towered by the sea.', + 'published': '1973'}, + {'id': 2, + 'title': 'Dhalgren', + 'author': 'Samuel R. Delany', + 'first_sentence': 'to wound the autumnal city.', + 'published': '1975'} +] + +# APIのエンドポイントを作成する +@app.route('/', methods=['GET']) +def home(): + return '''

Books API

+

A prototype API for retrieving books.

''' + +# すべての本を返すエンドポイントを作成する +@app.route('/api/v1/resources/books/all', methods=['GET']) +def api_all(): + return jsonify(books) + +# 単一の本を返すエンドポイントを作成する +@app.route('/api/v1/resources/books', methods=['GET']) +def api_id(): + # IDがURLの一部として提供されたか確認する + # IDが提供された場合は、それを変数に割り当てる + # IDが提供されていない場合は、エラーを表示する + if 'id' in request.args: + id = int(request.args['id']) + else: + return "Error: No id field provided. Please specify an id." + + # 結果のための空のリストを作成する + results = [] + + # データをループして、リクエストされたIDに一致する結果を探す + # IDは一意ですが、他のフィールドは多数の結果を返す可能性があります + for book in books: + if book['id'] == id: + results.append(book) + + # Flaskのjsonify関数を使用して、Pythonの辞書のリストをJSON形式に変換する + return jsonify(results) + +app.run() +``` + +> では、このような出力のバリエーションは問題なのでしょうか? + +それは、皆様が何を実現したいかによります。特定の確実な応答を求めている場合、それは問題となります。しかし、「地理に関する任意の 3 つの質問を生成する」のように、出力のバリエーションに対して柔軟であれば問題ではありません。 + +### 温度を使用して出力を変化させる + +出力をより予測可能、つまりより決定論的(確実)に制限したいと考えた場合、どのようにすればよいでしょうか? + +Temperature (温度) パラメータは 0 から 1 までの値を持っており、0が最も確定的で、1 が最も多様性があることを示します。デフォルト値は0.7です。温度を0.1に設定し、同じプロンプトを 2 回実行してみると以下のような結果が得られます。 + +> "Python Web API のコード を作成してください" + + ```python + #import necessary libraries + import flask + from flask import request, jsonify + + #create an instance of the Flask class + app = flask.Flask(__name__) + + #create an endpoint for the API + @app.route('/api/v1/endpoint', methods=['GET']) + def api_endpoint(): + #get the request data + data = request.get_json() + + #process the data + result = process_data(data) + + #return the result + return jsonify(result) + + #function to process the data + def process_data(data): + #process the data + result = {'result': 'success'} + + #return the result + return result + + #run the Flask app + if __name__ == '__main__': + app.run() + + ``` + +プロンプトを再度実行すると、次の結果が得られます。 + + ```python + #import necessary libraries + import flask + from flask import request, jsonify + + #create a Flask app + app = flask.Flask(__name__) + + #create a route for the API + @app.route('/api', methods=['GET']) + def api_call(): + #get the data from the request + data = request.get_json() + + #process the data + result = process_data(data) + + #return the result + return jsonify(result) + + #define the process_data function + def process_data(data): + #do something with the data + result = data + 1 + + #return the result + return result + + #run the app + if __name__ == '__main__': + app.run() + + ``` + +これら 2 つの出力結果はわずかな違いしかありません。今度は逆に、温度を0.9に設定してみましょう。 + + ```python + # Import necessary libraries + import flask + from flask import request, jsonify + + # Create a Flask app + app = flask.Flask(__name__) + + # Create a route for the API + @app.route('/api', methods=['GET']) + def api_call(): + # Get the data from the request + data = request.args + + # Process the data + result = process_data(data) + + # Return the result + return jsonify(result) + + # Function to process the data + def process_data(data): + # Do something with the data + result = data + 1 + + # Return the result + return result + + # Run the app + if __name__ == '__main__': + app.run() + + ``` + +温度パラメータの値として 0.9 で 2 回目の実行: + + ```python + import flask + from flask import request, jsonify + + # create the Flask app + app = flask.Flask(__name__) + app.config['DEBUG'] = True + + # create some test data + books = [ + {'id': 0, 'title': 'A Fire Upon The Deep', 'author': 'Vernor Vinge', 'first_sentence': 'The coldsleep itself was dreamless.', 'year_published': '1992'}, + {'id': 1, 'title': 'The Ones Who Walk Away From Omelas', 'author': 'Ursula K. Le Guin', 'first_sentence': 'With a clamor of bells that set the swallows soaring, the Festival of Summer came to the city Omelas, bright-towered by the sea.', 'published': '1973'}, + {'id': 2, 'title': 'Dhalgren', 'author': 'Samuel R. Delany', 'first_sentence': 'to wound the autumnal city.', 'published': '1975'} + ] + + # create an endpoint + @app.route('/', methods=['GET']) + def home(): + return '''

Welcome to our book API!

''' + + @app.route('/api/v1/resources/books + + ``` + +ご覧いただいたように、結果は非常に多様になることがわかります。 + +> なお、出力を変化させるために変更できるパラメータは他にもあります。例えば、top-k, top-p, repetition penalty, length penalty, diversity penalty などですが、これらはこのレッスンでは取り扱いません。 + +## おすすめの方法 + +皆様が目的の結果を得るためには、様々な方法を試すことができます。プロンプトを利用する頻度が増えるほど、ご自身専用のスタイルを身に付けられるでしょう。 + +これまでに紹介したテクニックに加えて、LLM を活用する際におすすめの方法がいくつかあります。 + +以下に、そのおすすめの方法をいくつか紹介します。 + +- **コンテキストを明確にする** コンテキストは重要で、ドメインやトピックなど、具体的に指定するほど良い結果が得られます。 +- **出力を制限する** 特定の項目数や特定の長さを求める場合は、それを明示的に指定しましょう。 +- **「何を」、「どうするか」を明確にする** 例えば、「Python の Web API を作成し、商品と顧客を設定し、それを 3 つのファイルに分けてください」といった、具体的な指示を出すようにしてください +- **テンプレートを活用する** 自社データをプロンプトに反映させたい場合が多いと思います。その際に、テンプレートを活用しましょう。テンプレートには、実際のデータに置き換えられる変数を設定できます。 +- **正確に記述する** スペル・ミスがあっても LLM は正しい回答を提供してくれるかもしれませんが、スペルが正確であれば、より良い回答が得られます。 + +## 課題 + +Flask を使用して単純な API を構築する方法を示す Python のコードを次に示します。 + +```python +from flask import Flask, request + +app = Flask(__name__) + +@app.route('/') +def hello(): + name = request.args.get('name', 'World') + return f'Hello, {name}!' + +if __name__ == '__main__': + app.run() +``` + +上記のコードを、GitHub Copilot や ChatGPT などの AI アシスタントを使用し、「self-refine (自己調整)」の手法を適用してコードを改善してください。 + +## 解決 + +コードに対して適切なプロンプトを追加し、課題の解決を試みてください。 + +> [!TIP] +> プロンプトに改善を求める際、改善点の数を制限すると効果的です。また、アーキテクチャ、パフォーマンス、セキュリティなど、特定の観点から改善を求めることも可能です。 + +[Solution](../../solution.py?WT.mc_id=academic-105485-yoterada) + +## 知識チェック + +なぜ、chain-of-thought (思考の連鎖) プロンプトを使用するのでしょうか?正解を 1 つ選択してください。 + +1. LLM に問題の解決方法を教える。 +1. LLM にコード内のエラーを見つけるように教える +1. LLM にさまざまな解決策を考えるように指示する + +答え:1:chain-of-thought (思考の連鎖) プロンプトは、LLM に回答を導き出すための一連の処理段階と、類似問題とその解決方法を提供することで、問題を解決する方法を示すことです。 + +## 🚀 Challenge + +課題では、self-refine (自己改善) の手法を使用しました。皆様が実際に実装したプログラムを取り上げて、それに対してどのように改善したいか考えてみてください。そして、その改善案を self-refine (自己改善手法)の手法を使って実際に適用してみましょう。結果は良くなりましたか?悪くなりましたか?どう思われますか? + +## お疲れ様でした!学習を続ける + +このレッスン修了後、[生成 AI 学習コレクション](https://aka.ms/genai-collection?WT.mc_id=academic-105485-yoterada) をチェックして、Generative AI の知識をレベルアップさせましょう。 + +レッスン 6 では、プロンプト エンジニアリングの知識を応用して[テキスト生成アプリケーションの構築](../../../06-text-generation-apps/translations/ja-jp/README.md?WT.mc_id=academic-105485-yoterada)を行います。 diff --git a/06-text-generation-apps/translations/ja-jp/README.md b/06-text-generation-apps/translations/ja-jp/README.md new file mode 100644 index 000000000..3b0839ba8 --- /dev/null +++ b/06-text-generation-apps/translations/ja-jp/README.md @@ -0,0 +1,651 @@ +# テキスト生成アプリケーションの構築 + +[![Building Text Generation Applications](../../images/06-lesson-banner.png?WT.mc_id=academic-105485-yoterada)](https://youtu.be/5jKHzY6-4s8?WT.mc_id=academic-105485-yoterada) + +> *(上記の画像をクリックすると、レッスン・ビデオを表示します)* + +これまでのレッスンを通じて、プロンプトの基本的な概念や、「プロンプトエンジニアリング」と呼ばれる分野が存在することを学んできました。ChatGPT、Office 365、Microsoft Power Platform など、操作可能な多くのツールは、プロンプトを使って、何かを成し遂げるためのサポートを行います。 + +アプリに、このような体験を追加するためには、プロンプトや Completion といった概念を理解し、使用するライブラリを選択する必要があります。この章では、それらを具体的に学んでいきます。 + +## はじめに + +この章では、次のことを行います。 + +- OpenAI のライブラリとその基本概念について学習します +- OpenAI を使用して、テキスト生成アプリを構築します +- プロンプト、温度、トークンなどの概念を使用してテキスト生成アプリを構築する方法を理解します + +## 学習目標 + +このレッスンを終了すると、次のことができるようになります。 + +- テキスト生成アプリケーションとは何かを説明する事ができる +- OpenAI を使用してテキスト生成アプリを構築する +- 使用するトークン数を増減させたり、温度を変更し、さまざまな出力を得られるようにアプリを構成する + +## テキスト生成アプリについて + +通常、アプリを作る際、下記のようなインターフェースがあります: + +- コマンドベース:コンソール・アプリは典型的な例で、コマンドを入力するとタスクを実行できます。例えば、git はコマンド・ベースのアプリです +- ユーザーインターフェース(UI):一部のアプリは、ボタンをクリックしたり、テキストを入力したり、オプションを選択したりするグラフィカル・ユーザーインターフェース(GUI)を持っています。 + +### コンソールと UI アプリには制限があります + +コマンドを入力するコマンドベースのアプリと比較してください。 + +- **入力可能なコマンド数は有限** 任意のコマンドを入力できるわけではなく、アプリがサポートしているコマンドのみ入力可能です。 +- **言語特有** 一部のアプリはまれに多言語をサポートしていますが、たとえ追加言語サポートが可能な場合も、基本的には特定の言語用にアプリは実装されています。 + +### テキスト生成アプリの利点 + +それでは、テキスト生成アプリはどう違うのでしょうか? + +テキスト生成アプリでは、コマンド数や特定の入力する言語に制約されることなく、より柔軟に操作でき、自然言語を使ってアプリと対話することができます。さらに、既に大量のテキストや音声データの情報から訓練されたデータ・ソースを利用しているため、従来のアプリがデータベースの内容に制限されることとは対照的に、利用可能な情報が大幅に増えます。 + +### テキスト生成アプリで何が作れるのでしょうか? + +作れるものはたくさんあります。例えば: + +- **チャットボット**: 所属する会社や、提供する製品について質問に答えるチャットボットは、良い選択肢です +- **ヘルパー** LLM は、テキストの要約、テキストから知見の抽出、履歴書作成のようなテキスト生成など、様々なことに利用できます +- **コード・アシスタント** 使用する言語モデルによっては、プログラミング・コードの作成を支援するコード・アシスタントも作れます。例えば、GitHub Copilot や ChatGPT のような製品を使って、コードの作成を支援することができます。 + +## どこから始めればよいのでしょうか? + +まず、LLM と統合する方法を見つける必要があります。これには通常、以下の2つのアプローチが含まれます: + +- API の使用:プロンプトを含む HTTP リクエストを作成し、生成されたテキストを取得 +- ライブラリの使用:API 呼び出しをカプセル化したライブラリを使用し API 呼び出しより簡単に利用可能 + +## ライブラリ/SDK + +LLMを操作するためのいくつかの有名なライブラリがあります: + +- **OpenAI** このライブラリを使用すると、モデル接続とプロンプトの送信が簡単です + +また、より高いレベルで動作するライブラリもあります: + +- **Langchain** Langchain はよく知られており、Python をサポートしています +- **Semantic Kernel** Semantic Kernelは、C#、Python、Java をサポートするMicrosoft 純正のライブラリです + +## OpenAI を使用した最初のアプリ + +以降で、最初のアプリを実装する方法、実装に必要なライブラリ、どの位の量が必要かなどをご確認ください。 + +### OpenAI のインストール + +OpenAI や Azure OpenAI と対話するためのライブラリはたくさんあります。また、C#、Python、JavaScript、Java など、さまざまなプログラミング言語を使用することも可能です。今回は、Python 用の `OpenAI` ライブラリを使用することにしました。ライブラリのインストールには `pip` を使用します。 + +```bash +pip install openai +``` + +### リソースの作成 + +下記の手順に従い実行してください: + +- Azureのアカウントを作成します。[https://azure.microsoft.com/free/](https://azure.microsoft.com/free/?WT.mc_id=academic-105485-yoterada) +- Azure Open AI へのアクセス権限を取得します。[https://learn.microsoft.com/azure/ai-services/openai/overview#how-do-i-get-access-to-azure-openai](https://learn.microsoft.com/azure/ai-services/openai/overview#how-do-i-get-access-to-azure-openai?WT.mc_id=academic-105485-yoterada) からアクセス申請を提出します + + > [!NOTE] + > 本記事の執筆時には、Azure Open AI へのアクセスを申請する必要があります。 + +- Python をインストールします。 +- Azure OpenAI Serviceリソースを作成します。[リソースの作成方法](https://learn.microsoft.com/azure/ai-services/openai/how-to/create-resource?pivots=web-portal?WT.mc_id=academic-105485-yoterada)については、こちらのガイドをご参照ください。 + +### API キーとエンドポイントを取得 + +ここで、`OpenAI` ライブラリに対してどの API キーを使用するか指定する必要があります。API キーを見つけるためには、Azure OpenAI リソースの「Keys and Endpoint」セクションに移動し、「Key 1」の値をコピーします。 + +![Keys and Endpoint resource blade in Azure Portal](https://learn.microsoft.com/azure/ai-services/openai/media/quickstarts/endpoint.png?WT.mc_id=academic-105485-yoterada) + +キー・データをコピーしたので、ライブラリにそれを使用するよう指定します。 + +> [!NOTE] +> コードから API キーを分離することは重要です。環境変数を使用して設定できます。 +> +> - 環境変数 `OPENAI_API_KEY` に API キーを設定します +> `export OPENAI_API_KEY='sk-...'` + +### Azure の設定 + +Azure OpenAI を使用している場合、下記の設定を行います: + +```python +openai.api_type = 'azure' +openai.api_key = os.environ["OPENAI_API_KEY"] +openai.api_version = '2023-05-15' +openai.api_base = os.getenv("API_BASE") +``` + +上記は、それぞれ下記の設定を行っています: + +- `api_type`を`azure`に設定します。これにより、ライブラリは OpenAI ではなく Azure Open AI を使用します。 +- `api_key`は、Azure Portal で取得した API キーを設定します。 +- `api_version`は、使用する API のバージョンです。執筆時点での最新バージョンは`2023-05-15`です。 +- `api_base` は API のエンドポイントです。これは、Azure Portal の API キーの下側に記載されています。 + +> [!NOTE] +> `os.getenv` は環境変数を読み取る関数です。`OPENAI_API_KEY` や `API_BASE` などの環境変数を読み取るために使用します。これらの環境変数は、ターミナルで設定するか、もしくは `dotenv` のようなライブラリを使用して設定します。 + +## テキストの生成 + +`Completion` クラスを使用してテキストを生成する方法をご覧ください。下記にサンプルを記述しています: + +```python +prompt = "次の文を完成させてください: むかしむかしある所に" + +completion = openai.Completion.create(model="davinci-002", prompt=prompt) +print(completion.choices[0].text) +``` + +上記のコードでは、Completion オブジェクトを作成し、使用するモデルに対してプロンプトを渡しています。その後、生成されたテキストを出力しています。 + +### Chat completions + +上記では、`Completion` クラスを使用してテキストを生成する方法を見てきました。 +しかし、チャット・ボットには、より適した `ChatCompletion` という別のクラスが用意されています。下記にサンプルを記述しています。 + +```python +import openai + +openai.api_key = "sk-..." + +completion = openai.ChatCompletion.create(model="gpt-3.5-turbo", messages=[{"role": "user", "content": "こんにちは世界 (Hello world)"}]) +print(completion.choices[0].message.content) +``` + +この機能の詳細は、次の章で説明します。 + +## エクササイズ - 初めてのテキスト生成アプリ + +OpenAI のセットアップと設定方法を学んだので、次に初めてのテキスト生成アプリを実装してみましょう。アプリの実装は、下記の手順で行なってください: + +1. 仮想環境を作成し、OpenAI をインストールします: + +```bash +python -m venv venv +source venv/bin/activate +pip install openai +``` + +> [!NOTE] +> Windows 環境で行う場合は、`source venv/bin/activate` の代わりに`venv\Scripts\activate` を入力してください。 + +> [!NOTE] +> Azure OpenAI キーは、[https://portal.azure.com/](https://portal.azure.com/?WT.mc_id=academic-105485-yoterada) に移動し、`OpenAI` を検索し、`OpenAI Resource` を選択し、その後 `Keys and Endpoint` を選択し、`Key 1` の値をコピーてください。 + +1. *app.py* ファイルを作成し、下記のコードを記述してください: + +```python +import openai + +openai.api_key = "" + +openai.api_type = 'azure' +openai.api_version = '2023-05-15' +openai.api_base = "" +deployment_name = "<デプロイ名>" + +# ここに Completion コードを追加 +prompt = "次の文を完成させてください: むかしむかし、あるところに" + +# Completion を作成 +completion = openai.Completion.create(engine= deployment_name, model="davinci-002", prompt=prompt) + +# レスポンスを出力 +print(completion.choices[0].text) +``` + +> [!NOTE] +> Azure OpenAI を使用している場合、`api_type` として `azure` を設定し、`api_key` に Azure OpenAI キーを設定する必要があります。 + +下記のような結果が表示されるはずです: + +```output +おじいさんとおばあさんが住んでいました。 + +(※ 上記の回答内容は、訳者が日本語で実行した場合にあわせて変更しました。英語で実行した場合と異なる結果が得られます。) +``` + +## さまざまな種類のプロンプト、さまざまな用途 + +これまで、プロンプトを使用してテキストを生成する方法を見てきました。色々な種類のテキストを生成するために、動作しているプログラムを変更・修正することも可能です。 + +プロンプトは様々なタスクに使用できます。例えば: + +- **様々なテキストを生成** 詩やクイズの質問などを生成することができます +- **情報の検索** 「Web 開発における CORS の意味は何ですか?」のような情報を検索するためにプロンプトを使用できます +- **コード生成** 電子メール・アドレスの検証に使用する正規表現を作成したり、Web アプリケーションのようなプログラム全体のコードを生成するためにプロンプトを使用することも可能です。 + +## より実用的な使用例: 料理レシピの作成 + +家に食材があって、何か料理を作りたい場合を想像してください。そのためにレシピが必要です。適切なレシピを見つける方法の一つに検索エンジンがありますが、LLM(大規模言語モデル)を使ってレシピを探すこともできます。 + +たとえば、下記のようなプロンプトを記述することができます: + +> 「鶏肉、じゃがいも、にんじん」を使った料理のレシピを 5 つ教えてください。レシピごとに使用する全ての食材をリストしてください。 + +上記のプロンプトを使用すると、以下のようなレスポンスが得られるかもしれません: + +```output +1. ローストチキンと野菜: +材料: +- チキンのもも肉 4 枚 +- じゃがいも 2 個、角切り +- にんじん 2 本、角切り +- オリーブオイル大さじ 2 杯 +- にんにく 2 片、みじん切り +- ドライタイム小さじ 1 杯 +- ドライオレガノ小さじ 1 +- 塩と胡椒、適量 + +2. チキンとポテトのシチュー: +材料: +- オリーブオイル大さじ 2 杯 +- 玉ねぎ 1 個、みじん切り +- にんにく 2 片、みじん切り +- チキンの胸肉 2 枚、角切り +- じゃがいも 2 個、角切り +- にんじん 2 本、角切り +- ドライオレガノ小さじ 1 +- ドライタイム小さじ 1 +- チキンブロス 1 カップ +- 塩と胡椒、適量 + +3. チキンとポテトのベイク: +材料: +- オリーブオイル大さじ 2 +- チキンの胸肉 2 枚、角切り +- じゃがいも 2 個、角切り +- にんじん 2 本、角切り +- 玉ねぎ 1 個、みじん切り +- にんにく 2 片、みじん切り +- ドライオレガノ小さじ 1 +- ドライタイム小さじ 1 +- チキンブロス 1 カップ +- 塩と胡椒、適量 + +4. チキンとポテトのスープ: +材料: +- オリーブオイル大さじ2 +- 玉ねぎ 1 個、みじん切り +- にんにく 2 片、みじん切り +- チキンの胸肉 2 枚、角切り +- じゃがいも 2 個、角切り +- にんじん 2 本、角切り +- ドライオレガノ小さじ 1 +- ドライタイム小さじ 1 +- チキンブロス 4 カップ +- 塩と胡椒、適量 + +5. チキンとポテトのハッシュ: +材料: +- オリーブオイル大さじ 2 +- チキンの胸肉 2 枚、角切り +- じゃがいも 2 個、角切り +- にんじん 2 本、角切り +- 玉ねぎ 1 個、みじん切り +- にんにく 2 片、みじん切り +- ドライオレガノ小さじ1 +``` + +この結果は素晴らしいですね、どのような料理を作れるかがわかりました。ここで役に立つ、改善点2つをご覧ください: + +- 好きでない食材やアレルギーのある食材を除外する +- 家に全ての食材がない場合に備え、買い物リストを作成する + +上記に対して、追加のプロンプトを作成しましょう: + +> "ニンニク・アレルギーがあるので、ニンニクを含むレシピを除外し、別のものに置き換えてください。また、家にはすでに鶏肉、じゃがいも、にんじんがあります、それ以外でレシピに必要な買い物リストを作成してください。" + +これで、下記のような新しい結果が得られます + +```output +1. ローストチキンと野菜: +材料: +- チキンのもも肉 4 枚 +- じゃがいも 2 個、角切り +- にんじん 2 本、角切り +- オリーブオイル大さじ 2 +- ドライタイム小さじ 1 +- ドライオレガノ小さじ 1 +- 塩と胡椒、適量 + +2. チキンとポテトのシチュー: +材料: +- オリーブオイル大さじ 2 +- 玉ねぎ 1 個、みじん切り +- チキンの胸肉 2 枚、角切り +- じゃがいも 2 個、角切り +- にんじん 2 本、角切り +- ドライオレガノ小さじ 1 +- ドライタイム小さじ 1 +- チキンブロス 1 カップ +- 塩と胡椒、適量 + +3. チキンとポテトのベイク: +材料: +- オリーブオイル大さじ 2 +- チキンの胸肉 2 枚、角切り +- じゃがいも 2 個、角切り +- にんじん 2 本、角切り +- 玉ねぎ 1 個、みじん切り +- ドライオレガノ小さじ 1 +- ドライタイム小さじ 1 +- チキンブロス 1 カップ +- 塩と胡椒、適量 + +4. チキンとポテトのスープ: +材料: +- オリーブオイル大さじ 2 +- 玉ねぎ 1 個、みじん切り +- チキンの胸肉 2 枚、角切り +- じゃがいも 2 個、角切り +- にんじん 2 本、角切り +- ドライオレガノ小さじ 1 +- ドライタイム小さじ 1 +- チキンブロス 4 カップ +- 塩と胡椒、適量 + +5. チキンとポテトのハッシュ: +材料: +- オリーブオイル大さじ 2 +- チキンの胸肉 2 枚、角切り +- じゃがいも 2 個、角切り +- にんじん 2 本、角切り +- 玉ねぎ 1 個、みじん切り +- ドライオレガノ小さじ 1 + +買い物リスト: +- オリーブオイル +- 玉ねぎ +- タイム +- オレガノ +- 塩 +- 胡椒 +``` + +以上が、5 つのレシピで、ニンニクは記載されておらず、家にすでにあるものを考慮し、買い物リストも記載されてます。 + +## 演習 - レシピ作成を構築する + +シナリオを一通り試したところで、そのシナリオに合わせたコードを実装してみましょう。下記の手順に従い実装してください。 + +1. 既存の *app.py* ファイルを利用します。 +2. `prompt`という変数を探し、下記のようにコードを修正してください。 + +```python +prompt = f"鶏肉、じゃがいも、にんじんを使った料理のレシピを 5 つ教えてください。レシピごとに、使用するすべての食材をリストしてください" +``` + +コードを実行すると、下記のような結果が表示されます。 + +```output +-鶏肉とじゃがいも、人参のシチュー: サラダ油大さじ3, 玉ねぎ1個(みじん切り), ニンニク2片(みじん切り), 人参1本(皮をむいてみじん切り), じゃがいも1個(皮をむいてみじん切り), ローリエ1枚, タイム1枝, 塩小さじ1/2, 黒コショウ小さじ1/4, 鶏ガラスープ1 1/2カップ, ドライホワイトワイン1/2カップ, パセリ(みじん切り)大さじ2, 無塩バター大さじ2, 骨なし鶏もも肉1 1/2ポンド(1インチ角に切る) + +-オーブン焼き鶏肉とじゃがいも、人参: エキストラバージンオリーブオイル大さじ3, ディジョンマスタード大さじ1, ローズマリー(みじん切り)大さじ1, タイム(みじん切り)大さじ1, ニンニク4片(みじん切り), 小さめの赤じゃがいも1 1/2ポンド(4等分に切る), 人参1 1/2ポンド(縦に4等分に切る), 塩小さじ1/2, 黒コショウ小さじ1/4, 丸鶏1羽(4ポンド) + +-鶏肉、じゃがいも、人参のキャセロール: クッキングスプレー, 大きめの玉ねぎ1個(みじん切り), ニンニク2片(みじん切り), 人参1本(皮をむいてみじん切り), じゃがいも1個(皮をむいてみじん切り), タイム(乾燥)小さじ1/2, 塩小さじ1/4, 黒コショウ小さじ1/4, 脂肪無添加、低ナトリウムの鶏ガラスープ2カップ, 冷凍グリーンピース1カップ, 中力粉1/4カップ, 低脂肪牛乳1カップ, パルメザンチーズ(おろしたもの)1/4カップ + +-ワンポットチキンとじゃがいもディナー: オリーブオイル大さじ2, 骨なし鶏もも肉1ポンド(1インチ角に切る), 大きめの玉ねぎ1個(みじん切り), ニンニク3片(みじん切り), 人参1本(皮をむいてみじん切り), じゃがいも1個(皮をむいてみじん切り), ローリエ1枚, タイム1枝, 塩小さじ1/2, 黒コショウ小さじ1/4, 鶏ガラスープ2カップ, ドライホワイトワイン1/2カップ + +-鶏肉、じゃがいも、人参のカレー: サラダ油大さじ1, 大きめの玉ねぎ1個(みじん切り), ニンニク2片(みじん切り), 人参1本(皮をむいてみじん切り), じゃがいも1個(皮をむいてみじん切り), コリアンダー(パウダー)小さじ1, クミン(パウダー)小さじ1, ターメリック(パウダー)小さじ1/2, ジンジャー(パウダー)小さじ1/2, ケイエンペッパー小さじ1/4, 鶏ガラスープ2カップ, ドライホワイトワイン1/2カップ, ヒヨコ豆1缶(15オンス、水切り), レーズン1/2カップ, シラントロ(みじん切り)1/2カップ +``` + +> 注意: LLM は非決定的(非確実)なので、プログラムを実行するたびに上記とは異なる結果が得られるかもしれません。 + +さて、どうすれば改善できるか見てみましょう。改善するために、コードに柔軟性を持たせて、材料やレシピの数を変更できるようにします。 + +1. 以下のようにコードを変更してください。 + +```python +no_recipes = input("レシピの数を入力してください(例:5): ") + +ingredients = input("食材のリストを入力してください(例:鶏肉、じゃがいも、人参): ") + +# レシピの数と材料をプロンプトに挿入 +prompt = f"{ingredients} を使った料理のレシピを {no_recipes} つ教えてください。レシピごとに、使用するすべての食材をリストしてください" +``` + +このコードをテスト実行すると、下記のような結果が得られます。 + +```output +レシピの数を入力してください(例:5): 3 +材料のリストを入力してください(例:鶏肉、じゃがいも、人参): ミルク、イチゴ + +-イチゴのミルクシェイク: ミルク、イチゴ、砂糖、バニラエキス、氷 +-イチゴのショートケーキ: ミルク、小麦粉、ベーキングパウダー、砂糖、塩、無塩バター、イチゴ、ホイップクリーム +-イチゴミルク: ミルク、イチゴ、砂糖、バニラエキス +``` + +### フィルターと買い物リストを追加して改善する + +上記で、入力に基づいてレシピを生成し、その数や使用する食材を柔軟に変更できるアプリが完成しています。 + +さらに改善するために、下記の機能を追加したいと思います。 + +- **材料のフィルタリング**。嫌いな食材やアレルギーのある食材をフィルタリングできるようにしたいと考えています。これを実現するために、既存のプロンプトを編集し、下記のようにフィルター条件をプロンプトの最後に追加してください。 + +```python +filter = input("フィルター(例:ベジタリアン、ビーガン、グルテンフリー): ") + +prompt = f"{ingredients} を使った料理のレシピを {no_recipes} つ教えてください。レシピごとに、使用するすべての食材をリストしてください。ただし、{filter}は除外してください。" +``` + +上記では、プロンプトの最後に `{filter}` を追加し、ユーザーからフィルター値も取得しています。 + +プログラムを実行すると、下記のような入出力結果が得られます。 + +```output +レシピの数を入力してください(例:5): 3 +材料のリストを入力してください(例:鶏肉、じゃがいも、人参): 玉ねぎ、ミルク +フィルター(例:ベジタリアン、ビーガン、グルテンフリー): ミルクなし + +1. フレンチオニオンスープ +材料: +-大きな玉ねぎ1個、スライス +-ビーフブロス3カップ +-ミルク1カップ +-フレンチブレッド6枚 +-パルメザンチーズ、おろしたもの1/4カップ +-バター大さじ1 +-乾燥タイム小さじ1 +-塩小さじ1/4 +-黒コショウ小さじ1/4 + +作り方: +1. 大きな鍋で、バターで玉ねぎをゴールデンブラウンになるまで炒めます。 +2. ビーフブロス、ミルク、タイム、塩、コショウを加えて沸騰させます。 +3. 火を弱めて10分間煮ます。 +4. スープボウルにフレンチブレッドのスライスを置きます。 +5. スープをパンの上にかけます。 +6. パルメザンチーズを振りかけます。 + +2. 玉ねぎとじゃがいものスープ +材料: +-大きな玉ねぎ1個、みじん切り +-じゃがいも2カップ、さいの目に切る +-野菜ブロス3カップ +-ミルク1カップ +-黒コショウ小さじ1/4 + +作り方: +1. 大きな鍋で、バターで玉ねぎをゴールデンブラウンになるまで炒めます。 +2. じゃがいも、野菜ブロス、ミルク、コショウを加えて沸騰させます。 +3. 火を弱めて10分間煮ます。 +4. 熱々で提供します。 + +3. クリーミーオニオンスープ +材料: +-大きな玉ねぎ1個、みじん切り +-野菜ブロス3カップ +-ミルク1カップ +-黒コショウ小さじ1/4 +-中力粉1/4カップ +-パルメザンチーズ、おろしたもの1/2カップ + +作り方: +1. 大きな鍋で、バターで玉ねぎをゴールデンブラウンになるまで炒めます。 +2. 野菜ブロス、ミルク、コショウを加えて沸騰させます。 +3. 火を弱めて10分間煮ます。 +4. 小さなボウルで、中力粉とパルメザンチーズを滑らかになるまで混ぜます。 +5. スープに加えてさらに5分間煮ます、またはスープがとろみを帯びるまで。 +``` + +ご覧頂いたの通り、ミルクを含むレシピは全てフィルタリングされています。しかし、もし乳製品を摂取すると体調が悪くなる方であれば、チーズを含むレシピもフィルタリングしたいとお考えでしょう。その場合は、明確化にフィルタリングで指示する必要があります。 + +- **買い物リストを作成** 我々は、家にすでにあるものを考慮して、買い物リストを作成したいと考えています。 + +この機能は、一つのプロンプトで全てを解決する事もできますし、二つのプロンプトに分けて実装する事もできます。ここでは後者の二つに分けるアプローチを採用します。ここでは、追加のプロンプトを提案していますが、それを機能させるためには、前のプロンプトの結果を後ろのプロンプトのコンテキストに追加する必要があります。 + +最初のプロンプトの結果を出力するコードの部分を見つけ、下記のコードを追加します: + +```python +old_prompt_result = completion.choices[0].text +prompt = "生成されたレシピの買い物リストを作成してください。ただし、すでに持っている食材は含めないでください。" + +new_prompt = f"{old_prompt_result} {prompt}" +completion = openai.Completion.create(engine=deployment_name, prompt=new_prompt, max_tokens=1200) + +# レスポンスを出力 +print("買い物リスト:") +print(completion.choices[0].text) +``` + +以下の点にご注意ください: + +1. 最初のプロンプトの結果を新しいプロンプトに追加して、新しいプロンプトを作成します: + +```python +new_prompt = f"{old_prompt_result} {prompt}" +``` + +1. 新しいリクエストを作成しますが、最初のプロンプトで要求したトークンの数も考慮に入れて、今回は `max_tokens` を1200とします。 + +```python +completion = openai.Completion.create(engine=deployment_name, prompt=new_prompt, max_tokens=1200) +``` + +このコードを実行すると、下記のような結果が得られます: + +```output +レシピの数(例えば、5): 2 +食材のリスト(例えば、チキン、ポテト、キャロット): リンゴ、小麦粉 +フィルター(例えば、ベジタリアン、ビーガン、グルテンフリー): 砂糖 + +-リンゴと小麦粉のパンケーキ: 小麦粉1カップ、ベーキングパウダー1/2小さじ、ベーキングソーダ1/2小さじ、塩1/4小さじ、砂糖1大さじ、卵1個、バターミルクまたはサワーミルク1カップ、溶かしたバター1/4カップ、皮を剥いてすりおろしたグラニースミスリンゴ1個 +-リンゴのフリッター: 小麦粉1-1/2カップ、ベーキングパウダー1小さじ、塩1/4小さじ、ベーキングソーダ1/4小さじ、ナツメグ1/4小さじ、シナモン1/4小さじ、オールスパイス1/4小さじ、砂糖1/4カップ、植物性ショートニング1/4カップ、ミルク1/4カップ、卵1個、皮を剥いて細かく刻んだリンゴ2カップ + +買い物リスト: +-小麦粉、ベーキングパウダー、ベーキングソーダ、塩、砂糖、卵、バターミルク、バター、リンゴ、ナツメグ、シナモン、オールスパイス +``` + +> ご注意:(訳者による追記) +> 上記の買い物リストの結果は、自宅にある食材(リンゴ、小麦粉)も含まれています。これらを除外するには、プロンプトを修正する必要があります。これは追加課題として、ご自身で実装してみてください。 + +## セットアップを改善しましょう + +現状で、動作するコードがありますが、さらに改善するためにはいくつかの調整が必要です。以下に、改善すべき点をいくつか挙げてみます。 + +- **API キーの機密情報をコードから分離する** 機密情報はコードに含めるべきではなく、安全な場所に保存すべきです。機密情報をコードから分離するために、環境変数や `python-dotenv` のようなライブラリを使ってファイルから読み込むことができます。コード上での実装は以下のようになります: + +1. 下記の内容を含む `.env` ファイルを作成します: + +```bash +OPENAI_API_KEY=sk-... +``` + +> ご注意:Azureを使用する場合は、下記の環境変数を設定する必要があります: + +```bash +OPENAI_API_TYPE=azure +OPENAI_API_VERSION=2023-05-15 +OPENAI_API_BASE= +``` + +コード上では、以下のように記述して環境変数から読み込む事ができます: + +```python +from dotenv import load_dotenv + +load_dotenv() + +openai.api_key = os.environ["OPENAI_API_KEY"] +``` + +- **トークンの長さ** 生成するテキストに必要なトークン数を考慮すべきです。トークンは増えれば増えるほどお金がかかるため、可能な限りトークンの数を節約するようにしましょう。例えば、プロンプトをどのように表現すればトークンを少なくできるかご検討ください。 + +扱うトークン数を変更するには、`max_tokens` パラメータを使用します。例えば、100 トークンを使用したい場合は、以下のようにします: + +```python +completion = openai.Completion.create(model="davinci-002", prompt=prompt, max_tokens=100) +``` + +- **温度 (Temperature)** これまで触れていなかった温度ですが、プログラムの実行結果に大きな影響を与えます。温度値が高いほど、出力はランダムになります。逆に、温度値が低いほど、出力は予測可能になります。出力にバリエーションが必要かどうかを考えてみてください。 + +温度を変更するには、`temperature` パラメータを使用します。例えば、温度を0.5に設定したい場合は、以下のようにします: + +```python +completion = openai.Completion.create(model="davinci-002", prompt=prompt, temperature=0.5) +``` + +> 注意:1.0に近づくほど、出力のバリエーションが大きくなります。 + +## 課題 + +この課題で何を作るかは任意です。 + +下記にいくつかの例を挙げてみます: + +- レシピ生成アプリを微調整してさらに改善しましょう。温度の値やプロンプトを変えて、どのような結果が得られるかお試しください。 +- 「勉強仲間」を作ってみましょう。このアプリは、例えば Python に関する質問に対して答えることができます。「Python の "特定のトピック" は何ですか?」といったプロンプトを設けたり、「"特定のトピック" に関するコードを教えてください」といったプロンプトを設けることもできます。 +- 「歴史ボット」を作って、歴史を鮮やかに再現してみましょう。ボットに特定の歴史的人物を演じさせ、その人物の生涯やその時代について質問してみましょう。 + +## 解決 + +### 勉強仲間 + +下記は手始めのプロンプトですので、使い方を確認し、お好みに合わせて微調整してください。 + +```text +- "あなたは Python 言語のエキスパートです + +下記の形式で Python の初心者向けレッスンを提案してください: + +形式: + - 概念: + - レッスンの簡単な説明: + - 解答付きのコード演習" +``` + +### 歴史ボット + +ここでは、使用できるプロンプトをいくつか紹介します。 + +```text +- "あなたはエイブラハム・リンカーンです。あなた自身について 3 つの文章を使って教えてください、そしてエイブラハムが使ったであろう文法と言葉を使って答えてください" +- "あなたはエイブラハム・リンカーンです。エイブラハムが使ったであろう文法と言葉を使って答えてください: + + あなたの最大の功績について、300語で教えてください" +``` + +## 知識チェック + +概念「温度」は何を行うのでしょうか? + +1. 出力のランダム性を制御します。 +2. 応答の規模を制御します。 +3. 使用するトークンの数を制御します。 + +## 🚀 チャレンジ + +課題に取り組む際、温度を 0、0.5、1 に変えて設定してみてください。0 が最も変化が少なく、1 が最も大きいことを覚えておいてください、アプリに最適な値はどれですか? + +## お疲れ様でした! 学習を続ける + +このレッスン修了後、[生成 AI 学習コレクション](https://aka.ms/genai-collection?WT.mc_id=academic-105485-yoterada) をチェックして、Generative AI の知識をレベルアップさせましょう。 + +レッスン 7 では、[チャットアプリケーションの構築](../../../07-building-chat-applications/translations/ja-jp/README.md?WT.mc_id=academic-105485-yoterada)方法を見ていきます。 diff --git a/07-building-chat-applications/translations/ja-jp/README.md b/07-building-chat-applications/translations/ja-jp/README.md new file mode 100644 index 000000000..5a4f09b41 --- /dev/null +++ b/07-building-chat-applications/translations/ja-jp/README.md @@ -0,0 +1,190 @@ +# 生成 AI を利用したチャット・アプリケーションの構築 + +[![Building Generative AI-Powered Chat Applications](../..//images/07-lesson-banner.png?WT.mc_id=academic-105485-yoterada)](https://youtu.be/Kw4i-tlKMrQ?WT.mc_id=academic-105485-yoterada) + +> *(上記の画像をクリックすると、レッスン・ビデオを表示します)* + +テキスト生成アプリの構築方法を見てきたところで、次にチャット・アプリケーションについて考えてみましょう。 + +チャットアプリケーションは私たちの日常生活に溶け込み、単なるカジュアルな会話の手段以上のものを提供しています。それらはカスタマーサービスやテクニカルサポート、さらには高度なアドバイザリー・システムの重要な部分を担っています。あなたも最近、チャットアプリケーションから何らかの支援を受けたことがあるかもしれません。これらのプラットフォームに生成 AI などの先進技術を組み込むと、その複雑さは増し、それに伴い課題も増えてきます。 + +解答が必要な質問は以下の通りです。 + +- **アプリの構築** 特定のユースケースに対して、これらの AI を活用したアプリケーションを効率的に構築し、シームレスに統合するにはどうすればよいのでしょうか? +- **モニタリング** 一度デプロイした後、アプリケーションが機能面と[責任のあるAIの六つの原則](https://www.microsoft.com/ai/responsible-ai?WT.mc_id=academic-105485-yoterada)の遵守という観点から、最高レベルの品質で動作していることをどのように監視し、確認することができるのでしょうか? + +自動化が進み、人間と機械が連続でやり取りする時代に突入する中で、生成 AI がチャット・アプリケーションの範囲、深さ、そして適応力をどう変えていくのかを理解することが重要です。このレッスンでは、これらの複雑なシステムを支えるアーキテクチャの側面を探求し、ドメイン固有のタスクに合わせてそれらを微調整する方法論を深掘りし、責任ある AI のデプロイを確実にするための指標と考慮点を取扱います。 + +## はじめに + +このレッスンでは下記の内容について学びます: + +- チャット・アプリケーションを効率よく実装し、統合するためのテクニック +- アプリケーションにカスタマイズと微調整を適用する方法 +- チャット・アプリケーションを効果的に監視するための戦略と考慮点 + +## 学習目標 + +このレッスンを終えた時点で、あなたは下記ができるようになります: + +- チャット・アプリケーションを実装し、既存のシステムに統合する際の考慮点を説明する +- 特定のユースケースに合わせてチャット・アプリケーションをカスタマイズする +- AI を活用したチャット・アプリケーションの品質を効果的に監視し、維持するために重要な指標と考慮点を特定する +- チャット・アプリケーションが責任ある AI の原則を活用することを確認する + +## 生成 AI をチャット・アプリケーションに統合する + +生成 AI を用いてチャット・アプリケーションを進化させることは、ただ単にそれをスマートにするだけではありません。それは、アーキテクチャ、パフォーマンス、ユーザー・インターフェースを最適化し、ユーザーに高品質な体験を提供することもできます。これは、アーキテクチャの基盤、API 統合、ユーザー・インターフェースの考慮点を調査することも含みます。このセクションでは、既存のシステムに組み込むか、もしくは独立したプラットフォームとして構築するかに関わらず、これら複雑な領域を効率的に進めるための包括的なロードマップを提供します。 + +このセクションを終えると、あなたはチャットアプリケーションを効率的に実装し、統合するための専門知識を身につけることができます。 + +### チャットボットとチャットアプリケーション、どちらが適している? + +チャット・アプリケーションの実装に取り組む前に、「チャット・ボット」と「AI 搭載チャット・アプリケーション」を比較し、それぞれが果たす役割と機能の違いを理解しましょう。チャット・ボットの主な目的は、よくある質問への回答や荷物の追跡など、特定の会話タスクを自動化することです。これは通常、ルール・ベースのロジックや複雑な AI アルゴリズムによって制御されます。それとは対照的に 「生成 AI を搭載したチャットアプリケーション」は、利用者との間でテキスト、音声、ビデオチャットなど、さまざまな形式のデジタル・コミュニケーションを可能にする、より広範囲な環境を提供します。その特徴は、微妙なニュアンスを持つ人間のような会話をシミュレートし、さまざまな入力と文脈上の手がかりに基づいて回答を生成する生成 AI モデルを統合した物です。生成 AI を搭載したチャット・アプリケーションは、特定のトピックや領域に限定せずあらゆる種類のトピックや質問に対応し、会話が進むにつれて変化するトピックや状況変化にも対応でき、さらには創造的な対話や複雑な対話を生み出すことができます。 + +下記の表は、デジタル・コミュニケーションにおけるそれぞれの役割を理解するのに役立つ、主な違いと類似点をまとめたものです。 + +| チャット・ボット | 生成 AI を搭載したチャットアプリケーション | +| ------------------------------------- | -------------------------------------- | +| タスク中心でルールベース | 文脈(コンテキスト)を認識する | +| 大規模システムに統合されることが多い | 1つまたは複数のチャット・ボットをホスト可能 | +| プログラムされた機能に限定 | 生成 AI モデルを搭載 | +| 専門的で構造化された対話を行う | オープン・ドメインでの議論が可能 (特定のトピックや領域に限定しない) | + +### SDK と API を活用した既存機能の利用 + +チャット・アプリケーションを開発する際、まずはすでに利用可能なライブラリを評価することが重要です。SDK と API を使ってチャット・アプリケーションを構築することは、様々な理由から有効な戦略となります。十分に文書化された SDK と API を利用することで、アプリケーションを長期的な成功に向けて戦略的に位置付けられ、スケーラビリティやメンテナンスの問題に対応します。 + +- **開発プロセスの迅速化とオーバーヘッドの削減**: 高コストな自作機能の構築(車輪の再発明)ではなく、既存のライブラリを利用することで、ビジネスロジックなど、より重要と考えられるアプリケーションの開発に集中できます。 +- **パフォーマンスの向上**: 機能を一から構築すると、いずれ「どのようにスケールするのか?このアプリケーションは突然のユーザー増加に対応できるのか?」と自問することになります。適切にメンテナンスされた SDK と API は、これらの問題に対する解決策を含んでいます。 +- **メンテナンスの容易さ**: ほとんどの API と SDK で、新しいバージョンがリリースされた際にライブラリを更新するだけで済むため、アップデートや改善の管理が容易になります。 +- **最先端技術へのアクセス**: 大規模なデータセットで微調整やトレーニングが行われたモデルを活用することで、アプリケーションに自然言語処理の能力を付与します。 + +SDK や API の機能を利用するためには、通常、提供されるサービスの使用許可を取得する必要があります。これは、一意のキーや認証トークンを使って行われます。OpenAI Python ライブラリを使って、これがどのように行われるのか確認してみましょう。また、このレッスン用の [OpenAI のノートブック](../../notebook-openai.ipynb?WT.mc_id=academic-105485-yoterada)や [Azure OpenAI Services のノートブック](../../notebook-azure-openai.ipynb?WT.mc_id=academic-105485-koreys)を使って、自分で試すこともできます。 + +```python +import os +import openai + +openai.api_key = os.getenv("OPENAI_API_KEY") + +chat_completion = openai.ChatCompletion.create(model="gpt-3.5-turbo", messages=[{"role": "user", "content": "生成 AI のチャット・アプリケーションに関するトレーニング・タイトルを2つ提案してください。"}]) +``` + +上記の例では、GPT-3.5 Turbo モデルを使用してプロンプトを完了しますが、その前に API キーを設定している点にご注意ください。キーを設定しなかった場合は、次のエラーが表示されます。 + +```output +AuthenticationError: No API key provided. +You can set your API key in code using 'openai.api_key = ', +or you can set the environment variable OPENAI_API_KEY=). +If your API key is stored in a file, you can point the openai module +at it with 'openai.api_key_path = '. +You can generate API keys in the OpenAI web interface. +See https://platform.openai.com/account/api-keys for details. +``` + +## ユーザーエクスペリエンス (UX) + +一般的な UX の原則はチャット・アプリケーションにも適用されますが、機械学習の要素が関わるため、特に重要な追加の考慮点がいくつかあります。 + +- **曖昧さへの対処方法**: 生成 AI モデルは時折、曖昧な回答を生成します。ユーザーがこの問題に遭遇した際に、明確化を求めることができる機能は役立ちます。 +- **文脈(コンテキスト)の保持**: 高度な生成 AI モデルは、会話の文脈(会話履歴)を記憶する能力を持っており、これはユーザー・エクスペリエンスにとって必要な要素になります。ユーザーに文脈を制御し管理する能力を与えることで、ユーザー・エクスペリエンスは向上しますが、それと同時に、機密性の高いユーザー情報を保持するリスクも生じます。この情報をどの位の期間保持するか、例えば保持期間のポリシーを導入するなどの考慮が必要で、これにより文脈の必要性とプライバシーのバランスを保つことができます。 +- **パーソナライゼーション**: 学習と適応の能力を持つ AI モデルは、ユーザーに個別のエクスペリエンスを提供します。ユーザー・プロファイルなどの機能を通じてユーザー・エクスペリエンスをカスタマイズすることは、ユーザーが理解されていると感じさせるだけでなく、特定の回答を見つけるための手助けを行い、より効率的で満足度の対話を生み出します。 + +パーソナライゼーションの一例として、OpenAI の ChatGPT では「Custom instructions(カスタム指示)」設定があります。これは、プロンプトに重要なコンテキストとなる自身の情報を提供することができるようになります。下記にカスタム指示の例を示します。 + +![Custom Instructions Settings in ChatGPT](../../images/custom-instructions.png?WT.mc_id=academic-105485-yoterada) + +この「プロファイル」は、ChatGPT に Linked Lists のレッスン・プランを作成するように促します。ChatGPT は、ユーザーが自分の経験に基づいて、より詳細なレッスン・プランが必要かもしれないことを、ちゃんと考慮している点にご注意ください。 + +![A prompt in ChatGPT for a lesson plan about linked lists](../../images/lesson-plan-prompt.png?WT.mc_id=academic-105485-yoterada) + +### 大規模言語モデル用の Microsoft のシステム・メッセージ・フレームワーク + +Microsoftは、大規模言語モデル(LLM)からの回答を生成する際に、効果的なシステムメッセージを作成するための[ガイダンス](https://learn.microsoft.com/azure/ai-services/openai/concepts/system-message#define-the-models-output-format?WT.mc_id=academic-105485-yoterada)を提供しています。これは以下の4つの領域に分類できます: + +1. モデルの対象者、能力、そして制限を明確にします +2. モデルの出力形式を定義します +3. モデルの意図した動作を示す、具体的な例を提供します +4. 追加の行動規範を提供します + +### アクセシビリティについて + +視覚、聴覚、運動機能、認知機能に関してご不自由な方も、適切に設計されたチャット・アプリケーションは利用できるべきです。下記に、各利用者に対応するためにアクセシビリティを強化する機能をリストアップします。 + +- 視覚にご不自由がある方向けの機能:ハイ・コントラストのテーマや、文字サイズの変更が可能なテキスト、スクリーンリーダーとの互換性 +- 聴覚にご不自由がある方向けの機能:テキストから音声へ、音声からテキストへの変換機能、音声通知の視覚的な手助け +- 運動機能にご不自由がある方向けの機能:キーボードによるナビゲーションのサポート、音声コマンド +- 認知機能にご不自由がある方向けの機能:簡易化された言語オプション + +## ドメイン固有言語モデルのカスタマイズと微調整 + +会社の専門用語を理解し、お客様が一般的に抱く特定の質問に答えるチャット・アプリケーションを想像してみてください。そのためのアプローチとして、以下の二つが挙げられます。 + +- **DSL モデルの活用**:DSL はドメイン固有言語を意味します。特定の領域で訓練された DSL モデルを活用することで、その領域の概念やシナリオを理解することができます。 +- **ファインチューニングの適用**:ファイン・チューニングとは、特定のデータを用いてモデルをさらに訓練するプロセスのことです。 + +## カスタマイズ : DSLの使用 + +ドメイン固有言語モデル(DSLモデル)を活用することで、ユーザー・エンゲージメントを強化し、専門的で文脈に適した対話を提供することができます。これは、特定の分野、業界、または主題に関連するテキストを理解し、生成するために訓練またはファイン・チューニングされたモデルです。DSLモデルの使用方法は、ゼロから訓練することから、SDK や API を通じて既存のものを使用することまで様々です。また、既存の事前に訓練済みモデルを取得し、それを特定の領域に適応させるためのファイン・チューニングも選択肢の一つです。 + +## カスタマイズ:ファイン・チューニングの適用 + +ファイン・チューニングは、事前訓練済みのモデルが特殊な領域や特定のタスクに対応できない場合に検討します。 + +例えば、医療に関する問い合わせは複雑で、多くの文脈が必要です。医療専門家が患者を診断する際には、ライフスタイルや過去の病歴など様々な要素に基づき、さらに診断を裏付けるために最新の医学論文に頼ることもあります。このような微妙なシナリオでは、汎用的な AI チャット・アプリケーションでは信頼性に欠けます。 + +### シナリオ: 医療アプリケーション + +治療ガイドライン、薬物服用の影響、最新の研究結果などを素早く参照できるように、医療従事者を支援するチャット・アプリケーションを考えてみましょう。 + +通常のモデルは、基本的な医学の問い合わせに答えたり、一般的なアドバイスを提供するのに十分かもしれませんが、以下のような状況では対応が難しいかもしれません。 + +- **非常に特殊または複雑なケース** 例えば、神経内科医がアプリケーションに「小児の薬剤耐性てんかんの管理における現在のベストプラクティスは何ですか?」と尋ねる場合などです。 +- **最新の情報が反映されていない** 一般的なモデルは、神経学や薬理学の最新の進歩を取り入れた現在の答えを提供するのが難しいかもしれません。 + +このような場合、専門的な医療データセットを用いてモデルをファイン・チューニングすることで、これらの複雑な医療に関する問い合わせを、より正確かつ信頼性高く処理する能力を大幅に向上させることができます。これには、対応が必要なドメイン固有の課題と質問を反映した、大規模で関連性の高いデータセットへのアクセスが必要です。 + +## 高品質な AI 駆動のチャット体験に必要な考慮事項 + +このセクションでは、「高品質」なチャット・アプリケーションの基準を説明します。これには、実用的な指標(メトリクス)の取得方法や、責任ある AI の原則を取り入れたフレームワークの利用も含まれます。 + +### 重要な指標(メトリクス) + +アプリケーションを高品質でパフォーマンスを維持するためには、重要な指標(メトリクス)と考慮事項を把握し続けることが必要です。これらの測定は、アプリケーションの機能性を保証するだけでなく、AI モデルとユーザー・エクスペリエンスの品質を評価するためにも必要です。下記に、基本的なメトリクス、AI に関するメトリクス、ユーザー・エクスペリエンスに関するメトリクスを考慮するためのリストを示します。 + +| メトリック | 定義 | チャット開発者の検討事項 | +| ----------------------------- | ---------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------- | +| **アップタイム** | アプリケーションが稼働し、ユーザーが利用可能な時間を計測します | ダウンタイムをどのように最小限に抑えますか? | +| **応答時間** | アプリケーションがユーザーからの問い合わせに応答するまでの時間 | クエリ処理をどのように最適化し、応答時間を改善しますか? | +| **精度** | 真陽性予測の割合を、陽性予測の総数で割ったもの 

(訳者による追記:モデルで提供される正しい出力の数 (真陽性) と、陽性サンプルの総数 (真陽性+偽陽性) を比較 [1](https://plat.ai/blog/confusion-matrix-in-machine-learning/)) | モデルの精度をどのように確認しますか? | +| **再現率 (Sensitivity)** | 真陽性予測の数を実際の真の数で割った比率

(訳者による追記:真の値の総数に対する、正しく分類された陽性サンプル(TP)の数の比率として計算 [1](https://plat.ai/blog/confusion-matrix-in-machine-learning/)) | Recall をどのように測定し、改善しますか? | +| **F1 スコア** | 精度と再現率の調和平均で、両者のバランスを示します | 目指すF1スコアは何ですか?精度と再現率のバランスをどのように調整しますか? | +| **Perplexity** | モデルが予測した確率分布が、データの実際の分布とどれだけ一致しているかを計測します。

(訳者追記:Perplexityは、言語モデルが与えられた文書をどの程度正確に予測できるかを示す指標で、値が小さいほど性能が良い) | Perplexity をどのように最小限に抑えますか? | +| **ユーザー満足度指標** | アプリケーションに対するユーザーの評価を計測します。主にアンケートを通じて収集します | ユーザーフィードバックはどのくらいの頻度で収集しますか?それに基づいてどのように改善策を立てますか? | +| **エラー発生率** | モデルが理解や出力で間違いを犯す割合 | エラー発生率を減らすための戦略は何ですか? | +| **再トレーニングサイクル** | 新しいデータや知見を取り入れてモデルを更新する頻度 | どのくらいの頻度でモデルを再トレーニングしますか?再トレーニングサイクルを開始するトリガーは何ですか? | +| **異常検出** | 期待する動作に適合しない異常なパターンを識別するためのツールと手法 | 異常が発生した際にどのように対応しますか? | + +### チャット・アプリケーションにおける責任ある AI の実践導入 + +Microsoft の責任ある AI に対する取り組みは、AI の開発と利用を推奨する 6 つの原則を明らかにしています。下記に、それらの原則とその定義、そしてチャット開発者が考慮すべき事項と、それらをなぜ真剣に考えるべきかを説明します。 + +| 原則 | Microsoftの定義 | チャット開発者に関する考慮事項 | 重要な理由 | +| ---------------------- | ----------------------------------------------------- | ---------------------------------------------------------------------- | -------------------------------------------------------------------------------------- | +| 公平性 | AI システムは全ての人を公平に扱うべきです | ユーザーデータに基づく差別がないようにチャットアプリケーションを設計します | ユーザー間で信頼と包括性を築き、法的な問題を避けるためです | +| 信頼性と安全性 |AI システムは確実かつ安全に動作するべきです | エラーやリスクを最小限に抑えるためにテストとフェイルセーフを実装します | ユーザーの満足度を確保し、潜在的な危険を防ぐためです | +| プライバシーとセキュリティ | AI システムは安全であり、プライバシーを尊重するべきです | ユーザーデータを保護するために強力な暗号化とデータ保護対策を実装します | ユーザーの機密データを保護し、プライバシー法を遵守するためです | +| 包括性 | AI システムは全ての人を活力づけ、人々を巻き込むべきです | 多様なユーザーがアクセスしやすく使いやすい UI/UX を設計します | 多くの人がアプリケーションを効果的に使用できるようにするためです | +| 透明性 | AI システムは理解しやすく実装するべきです | AI の応答について明確なドキュメンテーションと理由を提供します | ユーザーは、意思決定がどのように行われるかを理解できれば、システムを信頼する可能性が高まります | +| 説明責任 | 人々は AI システムに対して説明責任を負うべきです | AI の意思決定を監査し、改善するための明確なプロセスを設立します | 継続的な改善とミスが発生した場合の是正措置を可能にするためです | + +## 課題 + +[課題](../../notebook-azure-openai.ipynb?WT.mc_id=academic-105485-yoterada)をご覧ください。最初のチャット・プロンプトの実行から、テキストの分類や要約など、一連の演習を行うことができます。 + +## お疲れ様でした! 学習を続ける + +このレッスン修了後、[生成 AI 学習コレクション](https://aka.ms/genai-collection?WT.mc_id=academic-105485-yoterada) をチェックして、Generative AI の知識をレベルアップさせましょう。 + +レッスン 8 では、[検索アプリケーションの構築](../../../08-building-search-applications/translations/ja-jp/README.md?WT.mc_id=academic-105485-yoterada)方法を見ていきます。 diff --git a/08-building-search-applications/translations/ja-jp/README.md b/08-building-search-applications/translations/ja-jp/README.md new file mode 100644 index 000000000..a0279e27d --- /dev/null +++ b/08-building-search-applications/translations/ja-jp/README.md @@ -0,0 +1,163 @@ +# 検索アプリケーションの構築 + +[![Introduction to Generative AI and Large Language Models](../../images/08-lesson-banner.png?WT.mc_id=academic-105485-yoterada)](TBD) + +> **ビデオは近日公開予定** + +LLM は、チャットボットやテキスト生成だけでなく、Embeddings を使った検索アプリケーションの構築も可能です。Embeddings とは、ベクトルと呼ばれるデータの数値表現で、データのセマンティック検索に活用できます。 + +今回のレッスンでは、私たちの教育スタートアップ向けの検索アプリケーションを作ります。私たちのスタートアップは、発展途上国の学生に無料教育を提供する非営利団体で、AI について学べる多数の YouTube ビデオを提供しています。そして今、学生が質問を打ち込むだけで YouTube の動画を検索できるアプリケーションの開発を目指しています。 + +例えば、学生が「Jupyter Notebookとは何か?」や「Azure MLとは何か?」と質問を入力すれば、その質問に関連するYouTube動画のリストを返します。さらに、その質問の答えが動画のどの部分にあるのかを示すリンクも提供します。 + +## はじめに + +このレッスンでは、下記の内容を取り扱います: + +- セマンティック検索とキーワード検索の違い +- テキスト埋め込みとは何か +- テキスト埋め込みインデックスの作成方法 +- テキスト埋め込みインデックスの検索方法 + +## 学習目標 + +このレッスンを終了後、下記のことができるようになります: + +- セマンティック検索とキーワード検索の違いを理解し、説明できる +- テキスト埋め込みとは何かを理解し、説明できる +- データ検索に Embeddings を使用したアプリケーションを作成できる + +## なぜ検索アプリケーションを作るのでしょうか? + +実際に検索アプリケーションを作ることで、Embeddings を使ったデータ検索方法を理解することができます。また、学生が情報を素早く見つけるための検索アプリケーションの作り方も学べます。 + +このレッスンでは、Microsoft の [AI Show](https://www.youtube.com/playlist?list=PLlrxD0HtieHi0mwteKBOfEeOYf0LJU4O1?WT.mc_id=academic-105485-yoterada) という YouTube チャンネルから、YouTube の字幕を抜き出し、それを Embedding 検索用のインデックスとして利用する方法について紹介します。AI Show は、AI と機械学習について学ぶことのできる YouTube チャンネルです。Embedding 用のインデックスには、2023 年 10 月までの各 YouTube 字幕の Embeddings が含まれています。この Embedding インデックスを使用して、スタートアップ用の検索アプリケーションを作ります。この検索アプリケーションは、質問の答えが動画のどの部分にあるかを示すリンクを返します。これは、学生が必要な情報を素早く見つけるのに非常に役立ちます。 + +下記は、「Azure MLで rstudio を使うことはできますか?」という質問に対するセマンティック・クエリの例です。YouTube の URL を見てみると、URL には質問の答えがどの動画のどの部分にあるかを示すタイムスタンプが含まれています。 + +![Semantic query for the question "can you use rstudio with Azure ML"](../../images/query-results.png?WT.mc_id=academic-105485-yoterada) + +## セマンティック検索とは何でしょうか? + +セマンティック検索とは、検索クエリ内の単語の意味、つまりセマンティクスを利用して、関連性のある結果を返す検索手法のことを指します。 + +セマンティック検索の一例を挙げてみましょう。あなたが車を購入したいと考えている場合、「私が将来乗りたい夢の車」を検索したとします。この場合、セマンティック検索は、あなたが車について「夢」見ているわけではなく、「理想の車」を購入したいという意図を理解します。そして、その意図に関連する結果を返します。これに対して、「キーワード検索」は文字通りに車についての夢を検索し、結果として関連性のない情報を返すことが多くなります。 + +## テキスト埋め込み (Embeddings) とは何でしょうか? + +[テキストの埋め込み (Embeddings)](https://en.wikipedia.org/wiki/Word_embedding?WT.mc_id=academic-105485-yoterada) は、[自然言語処理](https://en.wikipedia.org/wiki/Natural_language_processing?WT.mc_id=academic-105485-yoterada)において用いられるテキストの表現方法で、テキストの意味を数値的に表現したものです。この埋め込みは、機械が理解しやすいように数値データとして表現するために使用します。テキスト埋め込みを生成するための AI モデルは多数存在しますが、今回のレッスンでは OpenAI が提供する埋め込みモデルを使用して埋め込みを生成する方法に焦点を当てます。 + +ここで一例を挙げます。たとえば、AI Show の YouTube チャンネルのエピソードの一部を文字起こししたテキストがあるとします。 + +```text +今日は、Azure Machine Learning について学習します。 +``` + +このテキストを OpenAI の埋め込み API に渡すと、1536 個の数値ベクトルとして埋め込みデータが返ってきます。このベクトルの各数値は、テキストの異なる側面を表現しています。簡単に理解できるように、ベクトルの最初の 10 個の数値を以下に示します。 + +```python +[-0.006655829958617687, 0.0026128944009542465, 0.008792596869170666, -0.02446001023054123, -0.008540431968867779, 0.022071078419685364, -0.010703742504119873, 0.003311325330287218, -0.011632772162556648, -0.02187200076878071, ...] +``` + +## 埋め込みインデックスはどのようにして作成するのでしょうか? + +このレッスンの埋め込みインデックスは、Python スクリプトを用いて作成しました。スクリプトとその使用方法は、このレッスンの `scripts` フォルダ内の [README](../../scripts/README.md?WT.mc_id=academic-105485-yoterada) に記載しています。埋め込みインデックスはすでに提供されているので、このレッスンを完了するためにこれらのスクリプトを実行する必要はありません。 + +スクリプトは以下の操作を行います: + +1. [AI Show](https://www.youtube.com/playlist?list=PLlrxD0HtieHi0mwteKBOfEeOYf0LJU4O1?WT.mc_id=academic-105485-yoterada) プレイリスト中の各 YouTube 動画の字幕をダウンロードします。 +2. [OpenAI の Function Calling](https://learn.microsoft.com/azure/ai-services/openai/how-to/function-calling?WT.mc_id=academic-105485-yoterada) を使用して、YouTube の字幕の最初から 3 分間で発表者の名前を抽出しようとします。各動画の発表者の名前は、`embedding_index_3m.json` という名前の埋め込みインデックスに保存します。 +3. その後、字幕テキストは**3分間のテキストブロック**に分割します。各ブロックには、次のブロックから約20語を重複して含め、各ブロックの埋め込みが途切れないように、より良い検索コンテキストを提供します。 +4. 各テキストブロックを OpenAI の Chat API に渡し、テキストを 60 語に要約します。この要約結果も `embedding_index_3m.json` という埋め込みインデックスに保存します。 +5. 最後に、テキストブロックの内容を OpenAI の埋め込み API に渡します。埋め込み API は、ブロックの意味を表現する 1536 個の数値からなるベクトルを返します。テキストブロックと OpenAI の埋め込みベクトルは、`embedding_index_3m.json` という埋め込みインデックスに保存します。 + +### ベクトル・データベース + +今回レッスンをかんたんに進めるため、埋め込みインデックスは `embedding_index_3m.json` という名前の JSON ファイルに保存し、Pandas のデータフレームに読み込みます。しかし、実際の運用環境では、埋め込みインデックスは [Azure AI Search](https://learn.microsoft.com/training/modules/improve-search-results-vector-search?WT.mc_id=academic-105485-yoterada)、[Redis](https://cookbook.openai.com/examples/vector_databases/redis/readme?WT.mc_id=academic-105485-yoterada)、[Pinecone](https://cookbook.openai.com/examples/vector_databases/pinecone/readme?WT.mc_id=academic-105485-yoterada)、[Weaviate](https://cookbook.openai.com/examples/vector_databases/weaviate/readme?WT.mc_id=academic-105485-yoterada) などのベクトル・データベースに保存します。 + +## コサイン類似度について理解しましょう + +テキストの埋め込みについて学んだので、次にテキストの埋め込みを使ってデータを検索します。特にコサイン類似度を使って特定の問い合わせに対して最も類似した埋め込みを見つける方法を学びます。 + +### コサイン類似度とは何でしょうか? + +コサイン類似度は、2つのベクトル間の類似性を測る指標で、これは「最近傍検索」とも呼ばれます。コサイン類似度検索を行うためには、まず OpenAI の埋め込み API を使って、ユーザから問い合わせされたテキストをベクトル化します。次に、問い合わせされたベクトルと、埋め込みインデックス内の各ベクトルとのコサイン類似度を計算します。埋め込みインデックスには、YouTube の字幕テキストブロックごとにベクトルが存在します。最後に、結果をコサイン類似度でソートします。コサイン類似度が最も高いテキストブロックが、問い合わせされた内容に最も近い内容を表しています。 + +数学的な観点から見ると、コサイン類似度は多次元空間に投影された 2 つのベクトル間の角度のコサインを測定します。この測定は有益で、2 つのドキュメントが大きさのためにユークリッド距離で離れていても、それらの間の角度が小さいため、コサイン類似度が高くなる可能性があります。コサイン類似度の方程式についての詳細は、[コサイン類似度](https://en.wikipedia.org/wiki/Cosine_similarity?WT.mc_id=academic-105485-yoterada)をご覧ください。 + +## 初めての検索アプリケーションの構築 + +次に、埋め込みを使って検索アプリケーションを作る方法を学びます。この検索アプリケーションでは、学生が質問を入力してビデオを検索できます。検索アプリケーションは、質問に関連するビデオのリストを返します。さらに、質問の答えがあるビデオの場所へのリンクも返します。 + +このソリューションは、Python 3.10 以上を使用して Windows 11、macOS、Ubuntu 22.04 で作成・テストしました。Python は [python.org](https://www.python.org/downloads/?WT.mc_id=academic-105485-yoterada) からダウンロードできます。 + +## 課題 - 学生向けの検索アプリケーションを作る + +このレッスンの初めにスタートアップについて紹介しました。そしてこれから、学生が自分たちの評価を検索できるアプリケーションを作ります。 + +この課題では、検索アプリケーションを作るために Azure OpenAI Services を利用します。下記のように Azure OpenAI Services を作成します。この課題を完了するためには、Azure サブスクリプションが事前に必要です。 + +### Azure Cloud Shell の起動 + +1. [Azure portal](https://portal.azure.com/?WT.mc_id=academic-105485-yoterada) にサインインします +2. Azure portal の右上隅にある Cloud Shell アイコンを選択します +3. 環境の種類として**Bash**を選択します + +#### リソースグループを作成する + +> この手順では、米国東部に "semantic-video-search" という名前のリソースグループを作成し使用します。 +> リソースグループの名前は変更可能ですが、リソースの場所を変更する場合は、 +> [モデルの可用性](https://aka.ms/oai/models?WT.mc_id=academic-105485-yoterada)から対象リージョンで利用可能かご確認ください。 + +```shell +az group create --name semantic-video-search --location eastus +``` + +#### Azure OpenAI Serviceリソースを作成する + +Azure Cloud Shell から、以下のコマンドを実行して Azure OpenAI Service リソースを作成します。 + +```shell +az cognitiveservices account create --name semantic-video-openai --resource-group semantic-video-search \ + --location eastus --kind OpenAI --sku s0 +``` + +#### アプリケーションで使用するためのエンドポイントとキーを取得する + +Azure Cloud Shell から、下記のコマンドを実行して Azure OpenAI Service リソースのエンドポイントとキーを取得します。 + +```shell +az cognitiveservices account show --name semantic-video-openai \ + --resource-group semantic-video-search | jq -r .properties.endpoint +az cognitiveservices account keys list --name semantic-video-openai \ + --resource-group semantic-video-search | jq -r .key1 +``` + +#### OpenAI Embedding モデルをデプロイする + +Azure Cloud Shell から、下記のコマンドを実行して OpenAI Embedding モデルをデプロイします。 + +```shell +az cognitiveservices account deployment create \ + --name semantic-video-openai \ + --resource-group semantic-video-search \ + --deployment-name text-embedding-ada-002 \ + --model-name text-embedding-ada-002 \ + --model-version "2" \ + --model-format OpenAI \ + --scale-settings-scale-type "Standard" +``` + +## 解決策 + +GitHub Codespaces で[ソリューションのノートブック](../../solution.ipynb?WT.mc_id=academic-105485-yoterada)を開き、Jupyter Notebook の指示に従ってください。 + +ノートブックを実行すると、問い合わせ内容を入力するように求められます。入力ボックスは次のように表示されます。 + +![Input box for the user to input a query](../../images/notebook-search.png?WT.mc_id=academic-105485-yoterada) + +## お疲れ様でした! 学習を続ける + +このレッスン修了後、[生成 AI 学習コレクション](https://aka.ms/genai-collection?WT.mc_id=academic-105485-yoterada) をチェックして、Generative AI の知識をレベルアップさせましょう。 + +次のレッスン 9 では、[画像生成アプリケーションの構築](../../../09-building-image-applications/translations/ja-jp/README.md?WT.mc_id=academic-105485-yoterada)方法について学びます! diff --git a/09-building-image-applications/translations/ja-jp/README.md b/09-building-image-applications/translations/ja-jp/README.md new file mode 100644 index 000000000..146482516 --- /dev/null +++ b/09-building-image-applications/translations/ja-jp/README.md @@ -0,0 +1,465 @@ +# 画像生成アプリケーションの構築 + +[![Building Image Generation Applications](../../images/09-lesson-banner.png?WT.mc_id=academic-105485-yoterada)](TBD) + +> **ビデオは近日公開予定** + +LLM はテキスト生成だけでなく、テキストの説明から画像を生成することも可能です。医療技術、建築、観光、ゲーム開発など、多くの分野で画像を活用することはとても有益です。この章では、最も人気のある 2 つの画像生成モデル、DALL-E と Midjourney について詳しく見ていきます。 + +## はじめに + +このレッスンでは、下記の内容について取り上げます: + +- 画像生成の有用性 +- DALL-E と Midjourney の概要とその動作原理 +- 画像生成アプリの作り方 + +## 学習目標 + +このレッスンを終了すると、下記のスキルを身につけることができます: + +- 画像生成アプリの作成 +- メタプロンプトを用いてアプリケーションの範囲を定義 +- DALL-E と Midjourney の活用方法 + +## 画像生成アプリケーションを作る理由は何でしょう? + +画像生成アプリケーションは、生成 AI の能力を引き出す絶好の手段です。例えば、下記のような用途に利用できます: + +- **画像編集と合成**:画像編集や画像合成など、様々な用途の画像を生成することができます。 + +- **多種多様な業界への応用**:医療技術、観光、ゲーム開発など、様々な業界向けの画像を生成することも可能です。 + +## シナリオ : Edu4All + +このレッスンでは、引き続きスタートアップの Edu4All で作業を進めていきます。生徒たちは評価用の画像を作成します。具体的にどのような画像を作るかは生徒たち次第ですが、自分たちの創作するおとぎ話のイラストを描いたり、物語の新しいキャラクターを作ったり、自分たちのアイデアや概念を視覚化する手助けをしてくれます。 + +例えば、Edu4All の生徒たちが授業で記念碑について学んでいる場合、下記のような画像を生成することができます: + +![Edu4All startup, class on monuments, Eiffel Tower](../../images/startup.png?WT.mc_id=academic-105485-yoterada) + +次のようなプロンプトを使用します。 + +> "早朝の日差しを浴びたエッフェル塔の前に座る犬" + +## DALL-E と Midjourney とは何でしょう? + +[DALL-E](https://openai.com/dall-e-2?WT.mc_id=academic-105485-yoterada) と [Midjourney](https://www.midjourney.com/?WT.mc_id=academic-105485-yoterada) は、プロンプトを使って画像を生成することができる、特に人気のある画像生成 AI モデルの 2 つです。 + +### DALL-E + +まずは、テキストの説明から画像を生成する生成 AI モデル、DALL-E について見ていきましょう。 + +> [DALL-Eは、CLIP と Diffused attention という2つのモデルを組み合わせたものです](https://towardsdatascience.com/openais-dall-e-and-clip-101-a-brief-introduction-3a4367280d4e?WT.mc_id=academic-105485-yoterada). + +- **CLIP** は、画像やテキストからデータの数値表現である埋め込みを生成するモデルです。 +- **Diffused attention** は、埋め込みから画像を生成するモデルです。DALL-E は画像とテキストのデータセットで訓練され、テキストの説明から画像を生成することができます。例えば、DALL-E を使って「帽子をかぶった猫」や「モヒカンヘアの犬」の画像を生成することができます。 + +### Midjourney + +Midjourney も DALL-E と同様に、テキストプロンプトから画像を生成します。Midjourney も同様に、「帽子をかぶった猫」や「モヒカンヘアの犬」などのプロンプトを使って画像を生成することができます。 + +![Image generated by Midjourney, mechanical pigeon](https://upload.wikimedia.org/wikipedia/commons/thumb/8/8c/Rupert_Breheny_mechanical_dove_eca144e7-476d-4976-821d-a49c408e4f36.png/440px-Rupert_Breheny_mechanical_dove_eca144e7-476d-4976-821d-a49c408e4f36.png?WT.mc_id=academic-105485-yoterada) +*Image cred Wikipedia, image generated by Midjourney* + +## DALL-E と Midjourney はどのように動作するのでしょうか? + +まず、[DALL-E](https://arxiv.org/pdf/2102.12092.pdf?WT.mc_id=academic-105485-yoterada) について説明します。DALL-E は、*自己回帰型トランスフォーマー*を用いたトランスフォーマー・アーキテクチャに基づく生成 AI モデルです。 + +*自己回帰型トランスフォーマー*は、AI モデルがテキストの説明から画像を生成する方法を定義します。このモデルは一度に 1 ピクセルずつ生成し、生成したピクセルを使って、次のピクセルを生成します。このプロセスは、画像が完成するまで、ニューラル・ネットワークの複数の層を通過します。 + +このプロセスを通じて、DALL-E は生成する画像の属性、オブジェクト、特性などを制御します。DALL-E 2 や 3 は生成された画像をより詳細に制御する能力を持っています。 + +## 初めての画像生成アプリケーションの構築 + +画像生成アプリケーションを作るためには、下記のライブラリが必要です。 + +- **python-dotenv**:強く推奨:このライブラリを利用し機密情報をコードから分離し *.env* ファイルに保管します +- **openai**:OpenAI API を利用するためのライブラリです +- **pillow**:Python で画像を扱うためのライブラリです +- **requests**:HTTP リクエストを作成するのに役立つライブラリです + +1. 下記の内容を記述した *.env* ファイルを作成します。 + + ```text + AZURE_OPENAI_ENDPOINT= + AZURE_OPENAI_KEY= + ``` + + この情報は、Azure Portal の OpenAI を作成したリソースの「Keys and Endpoint」セクションで確認します。 + +1. 上記で示した必須ライブラリを *requirements.txt* という名前のファイルに記述します + + ```text + python-dotenv + openai + pillow + requests + ``` + +1. 次に、仮想環境を作成し、ライブラリをインストールします + + ```bash + python3 -m venv venv + source venv/bin/activate + pip install -r requirements.txt + ``` + + Windowsの場合は、下記のコマンドを実行し仮想環境を作成し、利用できるようにします + + ```bash + python3 -m venv venv + venv\Scripts\activate.bat + ```` + +1. *app.py* という名前のファイルに下記のコードを記述します + + ```python + import openai + import os + import requests + from PIL import Image + import dotenv + + # dotenvをインポート + dotenv.load_dotenv() + + # 環境変数からエンドポイントとキーを取得 + openai.api_base = os.environ['AZURE_OPENAI_ENDPOINT'] + openai.api_key = os.environ['AZURE_OPENAI_KEY'] + + # API のバージョンを割り当て(DALL-E は現在、2023-06-01-preview API バージョンのみをサポートしています) + openai.api_version = '2023-06-01-preview' + openai.api_type = 'azure' + + + try: + # 画像生成 API を使用して画像を作成 + generation_response = openai.Image.create( + prompt='ウサギがキャンディを持って馬に乗り、霧のかかった牧場で水仙が育つ中を走っている', # ここにプロンプトのテキストを入力 + size='1024x1024', + n=2, + temperature=0, + ) + # 画像を保存するディレクトリを設定 + image_dir = os.path.join(os.curdir, 'images') + + # ディレクトリが存在しない場合は作成 + if not os.path.isdir(image_dir): + os.mkdir(image_dir) + + # 画像ファイルへのパスを設定(ファイルタイプは png にします) + image_path = os.path.join(image_dir, 'generated-image.png') + + # 生成した画像を取得 + image_url = generation_response["data"][0]["url"] # レスポンスからイメージの URL を取得 + generated_image = requests.get(image_url).content # イメージのダウンロード + with open(image_path, "wb") as image_file: + image_file.write(generated_image) + + # デフォルトの画像ビューアで画像を表示 + image = Image.open(image_path) + image.show() + + # 例外をキャッチ + except openai.error.InvalidRequestError as err: + print(err) + + ``` + +上記のコードについて説明します。 + +- 最初に、必要なライブラリをインポートします。これには、OpenAI ライブラリ、dotenv ライブラリ、requests ライブラリ、Pillow ライブラリが含まれます。 + + ```python + import openai + import os + import requests + from PIL import Image + import dotenv + ``` + +- 次に、*.env* ファイルから環境変数を読み込みます。 + + ```python + # dotenvをインポート + dotenv.load_dotenv() + ``` + +- その後、OpenAI API のエンドポイント、キー、バージョン、タイプを設定します。 + + ```python + # 環境変数からエンドポイントとキーを取得 + openai.api_base = os.environ['AZURE_OPENAI_ENDPOINT'] + openai.api_key = os.environ['AZURE_OPENAI_KEY'] + + # バージョンと種類を設定、Azure 固有設定 + openai.api_version = '2023-06-01-preview' + openai.api_type = 'azure' + ``` + +- 次に、画像を作成します。 + + ```python + # 画像生成 API を使用して画像を作成 + generation_response = openai.Image.create( + prompt='ウサギがキャンディを持って馬に乗り、霧のかかった牧場で水仙が育つ中を走っている', # ここにプロンプトのテキストを入力 + size='1024x1024', + n=2, + temperature=0, + ) + ``` + + 上記のコードは、生成された画像の URL を含む JSON オブジェクトを返します。このURL を使って画像をダウンロードし、ファイルに保存できます。 + +- 最後に、画像を開き、標準の画像ビューアを使って表示します。 + + ```python + image = Image.open(image_path) + image.show() + ``` + +### 画像生成の詳細 + +画像を生成するコードをより詳しく見てみましょう。 + +```python +generation_response = openai.Image.create( + prompt='ウサギがキャンディを持って馬に乗り、霧のかかった牧場で水仙が育つ中を走っている', # ここにプロンプトのテキストを入力 + size='1024x1024', + n=2, + temperature=0, + ) +``` + +- **prompt**:画像を生成するためのテキスト・プロンプトです。この例では、「ウサギがキャンディを持って馬に乗り、霧のかかった牧場で水仙が育つ中を走っている」というプロンプトを使用しています。 +- **size**:生成する画像のサイズを指定します。この例では、1024x1024 ピクセルの画像を生成しています。 +- **n**:生成する画像の数です。この例では、2 つの画像を生成しています。 +- **temperature**:生成 AI モデルの出力のランダム性を制御するパラメータです。温度は 0 から 1 の間の値で、0 は出力が決定的であることを意味し、1 は出力がランダムであることを意味します。デフォルト値は 0.7 です。 + +次のセクションでは、画像生成でできることについてさらに詳しく説明します。 + +## 画像生成における追加機能 + +ここまで、Python コードを実装して画像を生成する方法を見てきました。しかし、画像でできることは他にもあります。 + +下記のようなこともできます。 + +- **画像編集を行う**:既存の画像にマスクとプロンプトを提供することで、画像を編集する事もできます。例えば、画像の一部に、何かを新たに追加することができます。ウサギの画像を想像してみてください、ウサギに帽子を被せることができます。それを行う方法は、画像、マスク(変更するエリアの部分を特定する)と、何をすべきかを示すテキストプロンプトを提供することです。 + + ```python + response = openai.Image.create_edit( + image=open("base_image.png", "rb"), + mask=open("mask.png", "rb"), + prompt="頭に帽子をかぶったウサギの画像", + n=1, + size="1024x1024" + ) + image_url = response['data'][0]['url'] + ``` + + ベース画像にはウサギだけが含まれていますが、最終的な画像にはウサギの帽子が含まれています。 + +- **バリエーションを作成する**:既存の画像を取得し、バリエーションを作成するように依頼します。バリエーションを作成するには、画像とテキストプロンプトを提供し、以下のようにコードを記述します。 + + ```python + response = openai.Image.create_variation( + image=open("bunny-lollipop.png", "rb"), + n=1, + size="1024x1024" + ) + image_url = response['data'][0]['url'] + ``` + + > ご注意:これはOpenAIでのみサポートされています。 + +## 温度 + +温度は、生成 AI モデルの出力のランダム性を制御するパラメータで、0 から 1 までの値を取ります。0 は出力が決定的であること、1 は出力がランダムであることを示しています。デフォルト値は 0.7 となっています。 + +実際に確認するため、下記のプロンプトを二度実行して、温度がどのように作用するかを見てみましょう。 + +> プロンプト : "ウサギがキャンディを持って馬に乗り、霧のかかった牧場で水仙が育つ中を走っている" + +![Bunny on a horse holding a lollipop, version 1](../../images/v1-generated-image.png?WT.mc_id=academic-105485-yoterada) + +同じプロンプトを再度実行し、同じ画像が生成されないことを確認します。 + +![Generated image of bunny on horse](../../images/v2-generated-image.png?WT.mc_id=academic-105485-yoterada) + +ご覧の通り、生成された画像は似ていますが、同じではありません。ここで温度値を 0.1 に変更して、その結果を見てみましょう。 + +```python + generation_response = openai.Image.create( + prompt='ウサギがキャンディを持って馬に乗り、霧のかかった牧場で水仙が育つ中を走っている', # ここにプロンプトのテキストを入力 + size='1024x1024', + n=2 + ) +``` + +### 温度を変更してみましょう + +結果をより決定的にしたい場合、生成した二つの画像から見て分かるように、最初の画像にはウサギが、二つ目の画像には馬が映っているので、2つの画像に大きな違いがあります。 + +そこで、コードを修正して温度を0に設定します。 + +```python +generation_response = openai.Image.create( + prompt='ウサギがキャンディを持って馬に乗り、霧のかかった牧場で水仙が育つ中を走っている', # ここにプロンプトのテキストを入力 + size='1024x1024', + n=2, + temperature=0 + ) +``` + +このコードを実行すると、次の二つの画像が得られます。 + +- ![Temperature 0, v1](../../images/v1-temp-generated-image.png?WT.mc_id=academic-105485-yoterada) +- ![Temperature 0 , v2](../../images/v2-temp-generated-image.png?WT.mc_id=academic-105485-yoterada) + +これらの画像をご覧いただくと、2つの画像は互いにより似ていることが明確にわかります。 + +## メタ・プロンプトを使ってアプリケーションの範囲を設定する方法 + +上記のように、すでにお客様に提供できる画像を生成することができます。しかし、アプリケーションの範囲を設定する必要があります。 + +例えば、職場の中で安全でない画像や、子供に適さない画像を生成することは避けたいと思います。 + +これは*メタ・プロンプト*という手法を使って実現できます。メタ・プロンプトは、生成 AI モデルの出力を制御するために使用するテキスト・プロンプトです。例えば、メタ・プロンプトを使って出力を制御し、生成された画像が職場にとって安全であることや、子供に適していることを確認できます。 + +### それはどのように動作するのでしょうか? + +それでは、メタ・プロンプトはどのように動作するのでしょうか? + +メタ・プロンプトは、生成 AI モデルの出力を制御するために使用するテキスト・プロンプトで、テキスト・プロンプトの前に配置し、モデルの出力を制御するために使用します。これはアプリケーションに組み込まれ、モデルの出力を制御します。プロンプト入力とメタ・プロンプト入力を一つのテキスト・プロンプトにまとめます。 + +メタ・プロンプトの一例を下記に示します。 + +```text +あなたは子供向けの画像を作成するアシスタントデザイナーです。 + +画像は職場で安全であり、子供に適している必要があります。 + +画像はカラーである必要があります。 + +画像は風景の向きである必要があります。 + +画像は16:9のアスペクト比である必要があります。 + +以下の入力から、職場で安全でないものや子供に適さないものは考慮しないでください。 + +(入力) +```text + +さて、それではアプリでメタ・プロンプトをどのように使うか見てみましょう。 + +```python +disallow_list = "剣、暴力、血、ゴア、ヌード、性的コンテンツ、アダルト・コンテンツ、アダルト・テーマ、アダルト・ワード、アダルト・ユーモア、アダルト・ジョーク、アダルト・シチュエーション、アダルト" + +meta_prompt =f"""あなたは子供向けの画像を作成するアシスタントデザイナーです。 + +画像は職場の中で使用する際に安全で、子供に適している必要があります。 + +画像はカラーである必要があります。 + +画像は横長の形式であるべきです。 + +画像は16:9のアスペクト比である必要があります。 + +以下の、職場にとって安全でないものや、子供に適さないものは除外してください。 +{disallow_list} +""" + +prompt = f"{meta_prompt} +ウサギがアメを持って馬に乗っている画像を作成してください" + +# TODO 画像生成のリクエストを追加 +``` + +上記のプロンプトから、生成されるすべての画像がメタ・プロンプトを考慮していることがわかります。 + +## 課題 - 学生の能力を引き出しましょう + +このレッスンの初めに Edu4All を紹介しました。今度は、学生が自分たちの評価のための画像を生成できるようにしましょう。 + +学生は、自分たちの評価用の画像を作成します。その画像には記念碑が含まれている必要がありますが、どの記念碑を選ぶかは学生に任せます。学生は、これらの記念碑をさまざまな状況に合わせるために、この課題では創造性を発揮する事が求められます。 + +## 解決策 + +下記に一つの解決策案を示します: + +```python +import openai +import os +import requests +from PIL import Image +import dotenv + +# dotenvをインポート +dotenv.load_dotenv() + +# 環境変数からエンドポイントとキーを取得 +openai.api_base = "<エンドポイントに置き換え>" +openai.api_key = "" + +# APIバージョンを指定(DALL-Eは現在、2023-06-01-preview APIバージョンのみ対応) +openai.api_version = '2023-06-01-preview' +openai.api_type = 'azure' + +disallow_list = "剣、暴力、血、ゴア、ヌード、性的コンテンツ、大人向けコンテンツ、大人向けテーマ、大人向け言語、大人向けユーモア、大人向けジョーク、大人向け状況、大人" + +meta_prompt = f"""あなたは子供向けの画像を作成するアシスタントデザイナーです。 + +画像は、職場において安全で、子供に適している必要があります。 + +画像はカラーである必要があります。 + +画像は横向きである必要があります。 + +画像は16:9のアスペクト比である必要があります。 + +以下の入力は、職場で安全でない、または子供に適していないので除外してください。 +{disallow_list}""" + +prompt = f"""{metaprompt} +Generate monument of the Arc of Triumph in Paris, France, in the evening light with a small child holding a Teddy looks on. +"""" + +try: + # 画像生成APIを使用して画像を作成 + generation_response = openai.Image.create( + prompt=prompt, # ここにプロンプト・テキストを入力 + size='1024x1024', + n=2, + temperature=0, + ) + # 保存する画像のディレクトリを設定 + image_dir = os.path.join(os.curdir, 'images') + + # ディレクトリが存在しない場合は作成 + if not os.path.isdir(image_dir): + os.mkdir(image_dir) + + # 画像のパスを初期化(ファイルタイプは png であることに注意) + image_path = os.path.join(image_dir, 'generated-image.png') + + # 生成された画像を取得 + image_url = generation_response["data"][0]["url"] # レスポンスから画像URLを抽出 + generated_image = requests.get(image_url).content # 画像をダウンロード + with open(image_path, "wb") as image_file: + image_file.write(generated_image) + + # デフォルトの画像ビューアで画像を表示 + image = Image.open(image_path) + image.show() + +# 例外をキャッチ +except openai.error.InvalidRequestError as err: + print(err) +``` + +## お疲れ様でした! 学習を続ける + +このレッスン修了後、[生成 AI 学習コレクション](https://aka.ms/genai-collection?WT.mc_id=academic-105485-yoterada) をチェックして、Generative AI の知識をレベルアップさせましょう。 + +次のレッスン 10 では、[ローコード AI アプリケーションの構築](../../../10-building-low-code-ai-applications/translations/ja-jp/README.md?WT.mc_id=academic-105485-yoterada)方法について学びます! diff --git a/10-building-low-code-ai-applications/translations/ja-jp/README.md b/10-building-low-code-ai-applications/translations/ja-jp/README.md new file mode 100644 index 000000000..0349770ae --- /dev/null +++ b/10-building-low-code-ai-applications/translations/ja-jp/README.md @@ -0,0 +1,244 @@ +# ローコードAIアプリケーションの構築 + +[![Building Low Code AI Applications](../../images/10-lesson-banner.png?WT.mc_id=academic-105485-yoterada)](https://youtu.be/XX8491SAF44?WT.mc_id=academic-105485-yoterada) + +> *(上記の画像をクリックすると、レッスン・ビデオを表示します)* + +## はじめに + +画像生成アプリケーションの作り方を学んだところで、次にローコード開発について会話をうつしましょう。生成 AI はローコードを含む多様な領域で使えますが、ローコードとは何でしょうか。また、それをどのように AI を組み込む事ができるのでしょうか。 + +ローコード開発プラットフォームの利用により、従来の開発者や開発未経験者でもアプリやソリューションの作成がより簡単になりました。ローコード開発プラットフォームを使うと、ほとんどコードを書かずに、あるいは全く書かずに、アプリやソリューションを作れます。これは、コンポーネントをドラッグ・アンド・ドロップで配置できるビジュアル開発環境を利用することで実現します。これにより、アプリやソリューションをより速く、リソースも少なく作れます。このレッスンでは、ローコードの使い方と、Power Platform を使った AI によるローコード開発の方法について詳しく説明します。 + +Power Platform は、直感的なローコードまたはノーコードの開発環境を通じて、組織のチーム・メンバーが自分達自身でソリューションを作れるような機会を提供します。この環境は、ソリューション作成のプロセスを大幅に簡素化します。Power Platform を使えば、ソリューションを数ヶ月や数年かけて作るのではなく、数日や数週間で作れるようになります。Power Platform は、Power Apps、Power Automate、Power BI、Copilot Studio の 5 つの主要製品から構成されています。 + +このレッスンでは、下記の内容を取り扱います: + +- Power Platform における生成 AI の紹介 +- Copilot の紹介と使い方 +- 生成 AI を使って Power Platform でアプリとフローを作る方法 +- AI Builder を使って Power Platform の AI モデルを理解する方法 + +## 学習目標 + +このレッスンを終了すると、下記を理解できます。 + +- Copilot が Power Platform でどのように機能するかを理解します + +- 教育スタートアップによる、学生の課題追跡アプリを構築します。 + +- AI を使用して請求書から情報を抽出する請求書処理フローを構築します。 + +- GPT モデルを使用してテキスト生成を行う際の、ベスト・プラクティスを適用します。 + +このレッスンで使用するツールとテクノロジは下記のとおりです。 + +- **Power Apps**: データを追跡、管理、操作するアプリを作るためのローコード開発環境を提供し、これを利用し学生の課題追跡アプリを作ります。 + +- **Dataverse**: 学生の課題追跡アプリのデータを格納するために使います。Dataverse はアプリのデータを格納するためのローコード・データ・プラットフォームを提供します。 + +- **Power Automate**: 請求書処理フローを作るためのローコード開発環境を提供し、これを使って請求書処理プロセスを自動化します。 + +- **AI Builder**: 事前に作成した AI モデルを使ってスタートアップの請求書を処理するための請求書処理 AI モデルを作ります。 + +## Power Platform における生成 AI + +Power Platform の主な目標は、生成 AI を用いてローコード開発とアプリケーションを強化することです。その狙いは、データサイエンスの専門知識がない人でも、AI を使ったアプリ、サイト、ダッシュボードの作成や、AI によるプロセスの自動化ができるようにすることです。この目標は、Copilot と AI Builder を通じて、Power Platform のローコード開発体験に生成 AI を組み込むことで達成します。 + +### どのように動作するのでしょうか? + +Copilot は AI アシスタントで、自然言語を使い会話形式のやり取りで要件を説明し、Power Platform のソリューションを作ることができます。たとえば、アプリで使用するフィールドを AI アシスタントに指示すると、アプリとそれに基づくデータモデルの両方を作成します。また、Power Automateでフローを設定する方法を指定することもできます。 + +アプリ画面に Copilot の機能を組み込むことで、ユーザーは、会話型のやり取りを通じて、知見が得られるようになります。 + +AI Builder は、Power Platform で利用可能なローコード AI 機能で、AI モデルを使用してプロセスを自動化し、結果を予測することができます。AI Builder を使用すると、Dataverse や SharePoint、OneDrive、Azure などの様々なクラウド上のデータソースに接続するアプリやフローに AI を組み込むことができます。 + +Copilotは、Power Apps、Power Automate、Power BI、Power Pages、Power Virtual Agentsといった、全 Power Platform 製品で利用できます。一方で、AI Builder は Power Apps と Power Automate で利用できます。今回のレッスンでは、Power Apps と Power Automate における Copilot と AI Builder の使用方法について、特に教育スタートアップ用のソリューション開発の観点から詳しく説明していきます。 + +### Power Apps における Copilot + +Power Platform の一部として、Power Apps は、データの追跡、管理、対話型のアプリを作成する事ができる、ローコード開発環境を提供します。これは、スケーラブルなデータ・プラットフォームと、クラウドサービスやオンプレミス・データに接続する力を備えたアプリ開発サービスを組み合わせた物です。Power Apps を使用すると、ブラウザ、タブレット、携帯電話上で動作するアプリを作成し、同僚に共有することができます。Power Apps はシンプルなインターフェースで、ユーザーが簡単にアプリを開発できるように作られており、全てのビジネス・ユーザーやプロの開発者がカスタム・アプリを作成できます。 + +Power Apps における Copilot AI アシスタント機能を利用すると、必要なアプリの種類や、アプリで追跡、収集、表示したい情報を説明できます。Copilot はその説明に基づいて、レスポンシブな(ユーザーが使用しているデバイスの画面サイズに応じて自動的にレイアウトを調整する)Canvas アプリを生成します。その後、アプリを自分のニーズに合わせてカスタマイズすることもできます。また、AI Copilot は追跡したいデータを保存するために必要なフィールドをあらかじめ持っている Dataverse テーブルとサンプルデータを生成し、提案します。このレッスンの後半では、Dataverse とは何か、そして Power Apps でどのように使用するかを詳しく見ていきます。その後、会話でのやり取りを通じて AI Copilot アシスタント機能を使用してテーブルを自分のニーズに合わせてカスタマイズすることができます。この機能は、Power Apps のホーム画面からすぐに利用できます。 + +### Power Automate における Copilot + +Power Platform の一部である Power Automate は、ユーザーが、アプリケーションとサービス間で、自動化ワークフローの作成を可能にします。これにより、コミュニケーション、データ収集、承認決定などの反復的なビジネス・プロセスを自動化する事ができます。そして、その簡単なインターフェースは、初心者から経験豊富な開発者まで、全ての技術レベルのユーザーが作業タスクを自動化することを可能にします。またこうした、ワークフロー開発体験は Copilot を通じた生成型 AI で強化されます。 + +Power Automate における Copilot AI アシスタント機能を利用すると、必要なフローの種類や、フローで実行したいアクションを、それぞれ説明することができます。Copilot はその説明に基づいて、フローを生成します。その後、フローをご自分のニーズに合わせてカスタマイズできます。また、AI Copilot は、自動化したいタスクを実行するために必要なアクションを生成したり、提案してくれます。このレッスンの後半では、フローとは何か、Power Automate での活用方法を詳しく説明します。その後、会話でのやり取りを通じた AI Copilot のアシスタント機能を通じて、アクションを自分のニーズに合わせてカスタマイズすることができます。この機能は、Power Automate のホーム画面からすぐに利用できます。 + +## 課題: スタートアップが Copilot を使用して学生の課題と請求書を管理する + +スタートアップは、学生にオンラインコースを提供しています。スタートアップは急速に成長し、そのコースの需要に対応するのが難しくなっています。スタートアップはあなたを Power Platform 開発者として新たに採用し、学生の課題と請求書を管理するためのローコードソリューションを構築するように依頼しました。そのソリューションは、アプリを通じて学生の課題の追跡と管理を行い、ワークフローを通じて請求処理のプロセスを自動化するのに役立ちます。あなたは、ソリューションを開発するために生成 AI を使用するように指示されています。 + +Copilot を使い始める際には、[Power Platform Copilot Prompt Library](https://pnp.github.io/powerplatform-prompts/?WT.mc_id=academic-109639yoterada) を使用して、プロンプトを使い始められます。このライブラリには Copilot と共に、アプリやフローを作成するためのプロンプトのリストが含まれています。また、ライブラリ内のプロンプトを使用して、Copilot に対して要件をどのように説明するかのアイデアを得ることもできます。 + +### スタートアップによる学生課題追跡アプリの構築 + +スタートアップの教育者たちは、学生の課題を追跡するのに苦労しています。彼らは課題を追跡するためにスプレッドシートを使用していましたが、学生数が増加するにつれて管理が難しくなってきました。彼らはあなたに、学生の課題追跡と管理を手助けするアプリの作成を依頼しました。アプリは新しい課題の追加、課題の閲覧、課題の更新、課題の削除ができる必要があります。また、アプリは教育者と学生が共に、採点済みの課題と未採点の課題を閲覧できるように実装する必要があります。 + +下記の手順に従って、Power Apps の Copilot を利用してアプリを構築します: + +1. [Power Apps](https://make.powerapps.com?WT.mc_id=academic-105485-yoterada) のホーム画面に遷移します。 + +1. ホーム画面のテキストエリアに、作成したいアプリを説明します。例えば、***学生の課題を追跡し管理するアプリを作成してください***と入力します。**Send**ボタンをクリックして、プロンプトをAI Copilotに送信します。 + + ![Describe the app you want to build](../../images/copilot-chat-prompt-powerapps.png?WT.mc_id=academic-105485-yoterada) + +1. AI Copilot は、追跡したいデータを保存するために必要なフィールドとサンプルデータを持つ Dataverse テーブルの作成を提案します。その後、会話でのやり取りを通じ AI Copilot のアシスタント機能を使用して、テーブルを自分のニーズに合わせてカスタマイズできます。 + + > **重要**:Dataverse は Power Platform の基盤となるデータプラットフォームで、アプリのデータを保存するためのローコード・データ・プラットフォームです。Microsoft Cloud 上にデータを安全に保存する、完全にマネージドなサービスで、Power Platform 環境内でプロビジョニングされます。データ分類、データ系統、きめ細やかなアクセス制御など、組み込みのデータガバナンス機能が付属しています。Dataverse については[こちら](https://docs.microsoft.com/powerapps/maker/data-platform/data-platform-intro?WT.mc_id=academic-109639-yoterada)から詳しく学ぶことができます。 + + ![Suggested fields in your new table](../../images/copilot-dataverse-table-powerapps.png?WT.mc_id=academic-105485-yoterada) + +1. 教育者は、課題を提出した学生に進行状況を伝えるためにメールを送りたいと考えています。その為に、Copilotを使用して、学生のメールアドレスを保存する新しいフィールドをテーブルに追加できます。例えば、***学生のメールを保存する列を追加してください***というプロンプトを使用して、新しいフィールドを追加できます。**Send** ボタンをクリックして、プロンプトを AI Copilot に送信します。 + +![Adding a new field](../../images/copilot-new-column.png?WT.mc_id=academic-105485-yoterada) + +1. AI Copilot は新しいフィールドを生成し、その後、フィールドを自身のニーズに合わせてカスタマイズできます。 + +1. テーブルが完成した後、**Create app** ボタンをクリックしてアプリを作成します。 + +1. AI Copilot は記述内容に基づいてレスポンシブな Canvas アプリを生成します。その後、アプリを自分のニーズに合わせてカスタマイズできます。 + +1. 教育者が学生にメールを送るために、Copilotを使用してアプリに新しい画面を追加することができます。例えば、次のプロンプトを使用してアプリに新しい画面を追加することができます:***学生にメールを送る画面を追加してください***。そして **Send** ボタンをクリックして、プロンプトを AI Copilot に送信します。 + +![Adding a new screen via a prompt instruction](../../images/copilot-new-screen.png?WT.mc_id=academic-105485-yoterada) + +1. AI Copilot は新しい画面を生成し、その後、自身のニーズに合わせて画面をカスタマイズすることができます。 + +1. アプリが完成した後、**Save** ボタンをクリックしてアプリを保存します。 + +1. 教育者にアプリを共有するには、**Share** ボタンをクリックし、再度 **Share** ボタンをクリックします。その後、教育者のメールアドレスを入力してアプリを共有することができます。 + +> **課題**:あなたが作ったアプリは良い出発点ですが、まだ改善の余地があります。現在のメール機能は、教育者が学生のメールアドレスを手動で入力してメールを送るしかできません。課題を提出したときに、自動的に学生にメールを送ることができる自動化機能を Copilot を使用して構築することはできますか?ヒントは、適切なプロンプトを使用すれば、Power Automate の Copilot を使用して構築することができます。 + +### スタートアップによる請求書情報テーブルを作成 + +スタートアップの財務部門は、請求書の追跡に苦労しています。彼らはスプレッドシートを使って請求書を追跡していましたが、請求書の数が増えるにつれて、管理が難しくなってきました。彼らはあなたに、受け取った請求書の情報を保存し、追跡したり、管理を手助けするアプリの作成を依頼しました。請求書情報を扱うテーブルは、すべての請求書情報を抽出し、それをテーブルに保存するまでの処理を自動化できるように実装します。またテーブルは、財務部門が支払い済みの請求書と未払いの請求書を、閲覧できるように実装します。 + +Power Platform には、アプリやソリューションのデータを保存するための基盤となるデータプラットフォーム、Dataverse が存在します。Dataverse はアプリのデータを保存するための、ローコード・データ・プラットフォームを提供し、Microsoft Cloud 上にデータを安全に保存するフルマネージドサービスです。これは Power Platform 環境内でプロビジョニングされ、データ分類、データの流れ、細かいアクセス制御などのデータ・ガバナンス機能も組み込まれています。Dataverse について詳しくは[こちら](https://docs.microsoft.com/powerapps/maker/data-platform/data-platform-intro?WT.mc_id=academic-109639-yoterada)をご覧ください。 + +なぜスタートアップで Dataverse を使うべきなのでしょうか?Dataverse 内の標準テーブルとカスタムテーブルは、クラウド・ベースの安全なストレージ・オプションを提供します。テーブルを使うと、一つの Excel ワークブック内で複数のワークシートを使うのと同じように、さまざまな種類のデータを保存できます。組織やビジネスニーズに特化したデータをテーブルに保存することが可能です。スタートアップが Dataverse を使うことで得られる利点には下記のような物があります。 + +- **管理が容易**:メタデータとデータはクラウドに保存されるため、その保存や管理の詳細について心配する必要はありません。アプリやソリューションの構築に集中できます。 + +- **安全**:Dataverse はクラウドベースの安全なストレージオプションを提供します。ロールベースのセキュリティを使用し、テーブル内のデータへのアクセスを誰が、どのように行うかを制御できます。 + +- **豊富なメタデータ**:データ型とリレーションシップは Power Apps 内で直接利用されます。 + +- **ロジックと検証**:ビジネスルール、計算列、検証ルールを使い、ビジネスロジックを適用し、データの正当性を維持できます。 + +Dataverse とは何か、そしてその利点を理解したところで、Copilot を使って Dataverse でテーブルを作成し、財務チームの要件を満たすテーブル作成方法を見ていきましょう。 + +>**注**:次のセクションでは、このテーブルを使って、すべての請求書情報を抽出し、そこからテーブルに保存するまでの自動化処理を構築します。 + +Copilotを使って Dataverse でテーブルを作成する手順は下記の通りです: + +1. [Power Apps](https://make.powerapps.com?WT.mc_id=academic-105485-yoterada) のホーム画面に遷移します。 + +2. 左側のナビゲーションバーで「テーブル」を選択し、「Describe the new Table」をクリックします。 + +![Select new table](../../images/describe-new-table.png?WT.mc_id=academic-105485-yoterada) + +3. 「Describe the new Table」画面で、テキストエリアに作成したいテーブルの内容を記述します。例えば、「請求書情報を保存するテーブルを作成してください」と入力します。「送信」ボタンをクリックして、この指示を AI Copilot に送ります。 + +![Describe the table](../../images/copilot-chat-prompt-dataverse.png?WT.mc_id=academic-105485-yoterada) + +4. AI Copilot は、追跡したいデータを保存するために必要なフィールドといくつかのサンプルデータを含む Dataverse テーブルを提案します。その後、会話形式のステップを通じて AI Copilot アシスタント機能を使って、自分のニーズに合わせてテーブルをカスタマイズできます。 + +![Suggested Dataverse table](../../images/copilot-dataverse-table.png?WT.mc_id=academic-105485-yoterada) + +5. 財務チームは、サプライヤーにメールを送り、請求書の現在のステータスを更新したいと考えています。Copilot を使って、サプライヤーのメールを保存する新しいフィールドをテーブルに追加できます。例えば、「サプライヤーのメールを保存する列を追加してください」という指示を入力します。「送信」ボタンをクリックして、この指示を AI Copilot に送ります。 + +6. AI Copilot は新しいフィールドを生成し、そのフィールドを自分のニーズに合わせてカスタマイズできます。 + +7. テーブルの作成が完了したら、「作成」ボタンをクリックしてテーブルを作成します。 + +## AI Builder を使った Power Platform の AI モデル + +AI Builder は Power Platform で利用可能なローコード AI 機能で、プロセスの自動化や結果の予測を支援する AI モデルを使用できます。AI Builder を使えば、Dataverse や SharePoint、OneDrive、Azure などのさまざまなクラウド・データソースに接続するアプリやフローに AI を導入できます。 + +## 事前構築済み AI モデルとカスタム AI モデル + +AI Builder は、事前構築済み AI モデルとカスタム AI モデルの 2 種類の AI モデルを提供します。事前構築済み AI モデルは、Microsoft がトレーニングしたすぐに使用できる AI モデルで、Power Platform で利用可能です。これらのモデルを使うと、データを収集して独自のモデルを構築、トレーニング、公開することなく、アプリやフローにインテリジェンスな機能を追加できます。これらのモデルを使ってプロセスを自動化したり、結果を予測したりできます。 + +Power Platform で利用可能な事前構築済み AI モデルには以下のようなものがあります: + +- **キーフレーズ抽出**:このモデルはテキストからキーフレーズを抽出します。 +- **言語検出**:このモデルはテキストの言語を検出します。 +- **感情分析**:このモデルはテキスト内の肯定的、否定的、中立的、または混合した感情を検出します。 +- **名刺リーダー**:このモデルは名刺から情報を抽出します。 +- **テキスト認識**:このモデルは画像からテキストを抽出します。 +- **物体検出**:このモデルは画像から物体を検出して抽出します。 +- **文書処理**:このモデルはフォームから情報を抽出します。 +- **請求書処理**:このモデルは請求書から情報を抽出します。 + +カスタム AI モデルを使うと、自分のモデルを AI Builder に取り込んで、AI Builder のカスタムモデルと同様に機能させ、自分のデータを使ってモデルをトレーニングできます。これらのモデルを使って、Power Apps と Power Automate の両方でプロセスを自動化し、結果を予測できます。自分のモデルを使用する場合、適用に関して制限があります。これらの制限について、詳しくは[こちら](https://learn.microsoft.com/ai-builder/byo-model#limitations?WT.mc_id=academic-105485-yoterada)をご覧ください。 + +![AI builder models](../../images/ai-builder-models.png?WT.mc_id=academic-105485-yoterada) + +## 課題#2 - スタートアップによる請求書処理フローの構築 + +財務チームは請求書の処理に苦労しています。彼らはスプレッドシートを使って請求書を追跡していましたが、請求書の数が増えるにつれて管理が難しくなってきました。そこで、AI を使って請求書を処理するワークフローの構築を依頼されました。このワークフローでは、請求書から情報を抽出し、その情報を Dataverse テーブルに保存することが求められています。また、抽出した情報を財務チームにメールで送信する必要もあります。 + +AI Builder とは何か、なぜそれを使うべきなのかを理解したところで、先ほど説明した AI Builder の請求書処理 AI モデルを使って、財務チームが請求書を処理するのに役立つワークフローを構築する方法を見ていきましょう。 + +AI Builder の請求書処理 AI モデルを使って、財務チームが請求書を処理するのに役立つワークフローを構築するには、下記の手順を実行します: + +1. [Power Automate](https://make.powerautomate.com?WT.mc_id=academic-105485-yoterada) のホーム画面に遷移します。 + +2. ホーム画面のテキストエリアを使って、構築したいワークフローを記述します。例えば、「メールボックスに請求書が届いたら処理を開始してください」と入力します。「送信」ボタンをクリックして、この指示を AI Copilot に送ります。 + + ![Copilot power automate](../../images/copilot-chat-prompt-powerautomate.png?WT.mc_id=academic-105485-yoterada) + +3. AI Copilot は、自動化したいタスクを実行するために必要なアクションを提案します。「次へ」ボタンをクリックすると、次のステップに進むことができます。 + +4. 次のステップでは、Power Automate がフローに必要な接続の設定を求めます。設定が完了したら、「フローの作成」ボタンをクリックしてフローを作成します。 + +5. AI Copilot はフローを生成し、その後、フローを自分のニーズに合わせてカスタマイズできます。 + +6. フローのトリガーを更新し、請求書が保存されるフォルダーを指定します。例えば、「受信トレイ」を指定できます。「詳細オプションの表示」をクリックし、「添付ファイルのみ」を「はい」に設定します。これにより、添付ファイル付きのメールがフォルダーに届いたときだけフローが実行されます。 + +7. 「HTMLからテキストへ」、「Compose」、「Compose 2」、「Compose 3」、「Compose 4」のアクションは使用しないため、フローから削除します。 + +8. 「条件」アクションも使用しないため、フローから削除します。次のスクリーンショットのようになります。 + + ![power automate, remove actions](../../images/powerautomate-remove-actions.png?WT.mc_id=academic-105485-yoterada) + +9. 「アクションの追加」ボタンをクリックし、「Dataverse」を検索します。「新しい行の追加」アクションを選択します。 + +10. 「請求書から情報を抽出」アクションで、請求書ファイルをメールの「添付ファイルの内容」を指すように更新します。これにより、フローが添付ファイルの請求書から情報を抽出するようになります。 + +11. 前に作成した「テーブル」を選択します。例えば、「請求書情報」テーブルを選択できます。前のアクションの動的コンテンツを選択して、次のフィールドに入力します: + + - ID + - 金額 + - 日付 + - 名前 + - ステータス - 「ステータス」を「保留中」に設定します。 + - サプライヤーメール - 「新しいメールが届いたとき」にトリガーを呼び出し「送信者」を動的コンテンツとして使用します。 + + ![power automate add row](../../images/powerautomate-add-row.png?WT.mc_id=academic-105485-yoterada) + +12. フローの設定が完了したら、「保存」ボタンをクリックしてフローを保存します。その後、トリガーで指定したフォルダーに請求書を含むメールを送信することで、フローをテストできます。 + +> **課題**:今作成したフローは良いスタート地点ですが、まだ改善ポイントがあります。次に、財務部門がサプライヤーにメールを送信し、請求書の現在の状況を更新できるような自動化処理を実装する方法を考える必要があります。ヒント:フローは、請求書の状況が変更されたときに実行する必要があります。 + +## Power Automate でテキスト生成 AI モデルを使用 + +AI Builder の GPT モデルを使った「テキストの生成」機能は、プロンプトに基づいてテキストを生成するもので、Microsoft Azure OpenAI Service で提供されています。この機能を使えば、GPT(Generative Pre-Trained Transformer)テクノロジーをアプリやフローに組み込み、さまざまな自動化フローや知見に満ちたアプリケーションを構築できます。 + +GPT モデルは、膨大な量のデータに対して広範囲なトレーニングを行い、プロンプトが与えられると、人間の言葉による表現によく似たテキストを生成できます。ワークフローの自動化と統合することで、GPT などの AI モデルを活用して、さまざまなタスクを合理化し、自動化できます。 + +例えば、メールの下書きや商品説明を自動生成するフローを作れます。また、このモデルを使えば、チャットボットや顧客サービス・アプリで、顧客の問い合わせに効率的に対応するテキストも生成できます。 + +![create a prompt](../../images/create-prompt-gpt.png?WT.mc_id=academic-105485-yoterada) + +Power Automate でこの AI モデルを使用する方法については、[AI Builder と GPT を使ってインテリジェンスな機能を追加する](https://learn.microsoft.com/training/modules/ai-builder-text-generation/?WT.mc_id=academic-109639-yoterada)をご参照ください。 + +## お疲れ様でした! 学習を続ける + +このレッスン修了後、[生成 AI 学習コレクション](https://aka.ms/genai-collection?WT.mc_id=academic-105485-yoterada) をチェックして、生成 AI の知識をレベルアップさせましょう。 + +次のレッスン 11 では、[Function Calling との統合](../../../11-integrating-with-function-calling/translations/ja-jp/README.md?WT.mc_id=academic-105485-yoterada)について学びます! diff --git a/11-integrating-with-function-calling/translations/ja-jp/README.md b/11-integrating-with-function-calling/translations/ja-jp/README.md new file mode 100644 index 000000000..df954b380 --- /dev/null +++ b/11-integrating-with-function-calling/translations/ja-jp/README.md @@ -0,0 +1,475 @@ +# Function Calling との統合 + +![chapter image](../../images/11-lesson-banner.png?WT.mc_id=academic-105485-yoterada) + +これまでのレッスンでかなり多くの事を学びました。しかし、さらに成長できます。取り組むべき課題の一つは、一貫性のある回答フォーマットを作りだすことです。回答フォーマットが一貫する事で後続の処理はスムーズに進める事ができます。また、他のデータ・ソースからデータを追加し、アプリケーションをさらに充実させることもできます。 + +上記の問題は、この章で取り組む内容です。 + +> **ビデオは近日公開予定** + +## はじめに + +このレッスンでは、以下の内容を取り扱います: + +- 関数呼び出し (function calling) とは何か、その使用例について説明します。 +- Azure OpenAI を使用して関数呼び出しを作成します。 +- 関数呼び出しをアプリケーションに統合する方法を学びます。 + +## 学習目標 + +このレッスンを終えると、下記ができるようになります: + +- 関数呼び出しを使う理由を説明できます。 +- Azure Open AI Service を使用して関数呼び出しアプリを構築できます。 +- アプリケーションのユースケースに適した効果的な関数呼び出しを設計できます。 + +## シナリオ:関数を用いてチャットボットを改善する + +このレッスンでは、教育スタートアップで、利用者である学生がチャットボットを使用して技術コースを検索できる機能を実装したいと考えています。利用者のスキルレベル、現在の役割、興味のある技術に合わせたコースを推奨します。 + +このシナリオを実現するために、下記の機能やサービスを使用します: + +- `Azure Open AI`:利用者にチャット体験を提供する為に使用します。 +- `Microsoft Learn Catalog API`:利用者のリクエストに基づいて、コースを見つける支援を行います。 +- `Function Calling`:利用者の問い合わせ内容を取得し、それを関数に送信し API リクエストを作成します。 + +手始めに、そもそもなぜ関数呼び出しを使用する必要があるのかを見てみましょう。 + +## 関数呼び出しを行う理由 + +関数呼び出しを行う前は、LLM からの回答は構造化されておらず、一貫性がありませんでした。開発者は、得られるさまざまな回答に対して処理できるように、複雑な検証コードを記述する必要がありました。例えば、ユーザーは「今のストックホルムの天気は何ですか?」のような回答も得ることができませんでした。これは、モデルの学習データをトレーニングした時間が制限されていたためです。 + +「関数呼び出し」は、Azure Open AI Service の機能で、下記ができるようになります: + +- **一貫した回答形式**:回答形式をより適切に制御できれば、回答を他のシステムにより簡単に統合できます。 +- **外部データの利用**:チャットのコンテキスト(文脈)に、アプリケーションが他の外部データ・ソースのデータを使用できます。 + +## シナリオを通じた問題の説明 + +> *Notebook.ipynb* というファイルを作成し、下記のコードをコピー&ペーストしてください。仮に下記のシナリオを実行したい場合は、別のコードセルに貼り付けることをお勧めします。また、下記に記述する関数が、実際の問題に対処するための説明も行っているので、あわせてどうぞご覧ください。 + +「一貫した回答フォーマットの取得」に関する問題の例を見てみましょう: + +たとえば、学生データのデータベースを作成し、学生に対して適切なコースを提案できるようにしたいと考えています。下記に、含まれているデータが非常によく似ている学生に関する2つの説明があります。 + +1. Azure Open AI リソースへの接続を作成します。 + + ```python + import os + import json + from openai import AzureOpenAI + from dotenv import load_dotenv + load_dotenv() + + client = AzureOpenAI( + api_key=os.environ['AZURE_OPENAI_KEY'], # これもデフォルトで省略できます + api_version = "2023-07-01-preview" + ) + + deployment=os.environ['AZURE_OPENAI_DEPLOYMENT'] + ``` + + 上記は、Azure Open AI への接続するための Python コードで、ここでは `api_version`、`api_key`を設定します。 + +1. `student_1_description`と`student_2_description`という変数を使用して、2人の学生の説明を作成します。 + + ```python + student_1_description="Emily Johnson は、Duke University のコンピューターサイエンス専攻の2年生です。彼女の GPA は3.7です。Emily は大学のチェス・クラブとディベート・チームの活動的なメンバーです。彼女は卒業後、ソフトウェア・エンジニアリングのキャリアを進ことを望んでいます。" + + student_2_description = "Michael Lee は、Stanford University のコンピューターサイエンス専攻の2年生です。彼の GPA は3.8です。Michael はプログラミングが得意である事が知られており、大学のロボティクス・クラブの活動的なメンバーです。彼は学習を終えた後、人工知能関連のキャリアへ進むことを望んでいます。" + ``` + + 上記の学生の説明を LLM に送信し、データを解析します。このデータは後でアプリケーションで使用したり、API に送信したり、データベースに保存することができます。 + +1. 関心のある情報を LLM に指示する 2 つの同一プロンプトを作成しましょう。 + + ```python + prompt1 = f''' + 以下の情報を指定されたテキストから抽出し、それをJSONオブジェクトとして返してください: + + 名前 + 専攻 + 学校 + 成績 + クラブ + + 情報を抽出するためのテキスト本文は以下の通りです: + {student_1_description} + ''' + + prompt2 = f''' + 以下の情報を指定されたテキストから抽出し、それをJSONオブジェクトとして返してください: + + 名前 + 専攻 + 学校 + 成績 + クラブ + + 情報を抽出するためのテキスト本文は以下の通りです: + {student_2_description} + ''' + ``` + + 上記のプロンプトは、LLM に情報を抽出し、応答を JSON 形式で返すように指示しています。 + +1. プロンプトと Azure Open AI への接続設定を行った後、`openai.ChatCompletion`を使用してプロンプトを LLM に送信します。プロンプトは `messages` 変数に格納し、ロールを `user` に設定します。これは、ユーザーからのメッセージがチャット・ボットに書き込まれる様子を模倣するために記載しています。 + + ```python + # プロンプト1からの応答 + openai_response1 = client.chat.completions.create( + model=deployment, + messages = [{'role': 'user', 'content': prompt1}] + ) + openai_response1.choices[0].message.content + + # プロンプト2からの応答 + openai_response2 = client.chat.completions.create( + model=deployment, + messages = [{'role': 'user', 'content': prompt2}] + ) + openai_response2.choices[0].message.content + ``` + + これで、両方のリクエストを LLM に送信し、受信した回答を `[openai_response1.choices[0].message.content]` 等で取得することができます。 + +1. 最後に、`json.loads`を呼び出すことで、応答を JSON 形式に変換できます: + + ```python + # 応答を JSON オブジェクトとして読み込む + json_response1 = json.loads(openai_response1.choices[0].message.content) + json_response1 + ``` + + 応答 1: + + ```json + { + "name": "Emily Johnson", + "major": "コンピューターサイエンス", + "school": "Duke University", + "grades": "3.7", + "club": "チェス・クラブ" + } + ``` + + 応答 2: + + ```json + { + "name": "Michael Lee", + "major": "コンピューターサイエンス", + "school": "Stanford University", + "grades": "3.8 GPA", + "club": "ロボティクス・クラブ" + } + ``` + + プロンプトは同じで、説明も似ていますが、`grades` プロパティ値の出力形式が異なる場合があります。例えば、`3.7`や`3.8 GPA`のような形式で出力する場合があります。 + + この結果は、LLM が記述したプロンプトの形式で非構造化のデータを取得し、結果として非構造化データも返すためです。このデータを保存したり使用したりする際に何を期待するかを理解するために、構造化された形式のデータが必要です。 + + それでは、出力フォーマットの問題をどのようにして解決すればよいのでしょうか。関数呼び出しを使用することで、構造化されたデータを確実に受け取ることができます。関数呼び出しを使用する場合、LLM は実際には特定の関数を呼び出したり実行したりしません。代わりに、LLM は構造化された回答を作成します。その後、これらの構造化された回答を使用して、アプリケーションで実行する関数を決定します。 + +![function flow](../../images/Function-Flow.png?WT.mc_id=academic-105485-yoterada) + + 関数から返された結果を取得し、それを LLM に送り返すことができます。その後、LLM は自然言語を使用して利用者の問い合わせに回答します。 + +## 関数呼び出しを使用するユースケース + +関数呼び出しを使用することでアプリが改善されるユースケースは多岐にわたります: + +- **外部ツールの呼び出し**:チャット・ボットは利用者からの質問に回答するのが得意です。関数呼び出しを使用すると、チャット・ボットは利用者からのメッセージを使用して、特定のタスクを完了できます。例えば、学生はチャットボットに「この科目についてさらに支援が必要というメールを、教員に送信してください」と依頼できます。これにより、`send_email(to: string, body: string)`という関数呼び出しを行います。 + +- **API またはデータベースクエリの作成**:ユーザーは、書式設定された問い合わせ、または API 要求に変換される自然言語を使用して、情報を検索できます。例えば、教師が「最後の課題を完了した生徒は誰ですか」と要求すると、`get_completed(student_name: string, assignment: int, current_status: string)`という関数を呼び出します。 + +- **構造化データの作成**:ユーザーは、テキストまたは CSV フォーマットのデータを取得し、LLM を使用して、そこから重要な情報を抽出できます。例えば学生は、和平合意に関するウィキペディアの記事を変換して、AI フラッシュカードを作成できます。これは、`get_important_facts(agreement_name: string, date_signed: string, parties_involved: list)`という関数を使用して行います。 + +## 最初の関数呼び出しの作成 + +関数呼び出しを作成するプロセスは、以下の3つの主要なステップから構成されています。 + +1. **呼び出し**:関数リストとユーザーメッセージを用いて、Chat Completions API を呼び出します。 +2. **読み取り**:モデルからの回答を読み取り、アクションを実行します。つまり、関数を実行したり、API 呼び出しを行ったりします。 +3. **再呼び出し**:関数からの応答を用いて、Chat Completions API を再度呼び出し、その情報を使用してユーザーへの回答を作成します。 + +![LLM Flow](../../images/LLM-Flow.png?WT.mc_id=academic-105485-yoterada) + +### ステップ1 - メッセージの作成 + +最初のステップは、ユーザー・メッセージを作成することです。これは、テキストの入力値を取得して動的に割り当てるか、もしくはここで直接値を割り当てることもできます。もし仮に Chat Completions API を初めて使用するの場合は、メッセージの `role` と `content` を定義してください。 + +`role` は `system`(ルールを作成)、`assistant`(モデル)、または `user`(エンドユーザー)のいずれかになります。関数呼び出しは、`user` とし、質問の例を割り当てます。 + +```python +messages= [ {"role": "user", "content": "初心者の学生が Azure を学ぶための良い学習コースを見つけてください。"} ] +``` + +異なる役割を割り当てることで、LLM は、システムが言っているのか、それともユーザーが何かを言っているのかが明確になり、LLM は会話履歴を構築するのに役立ちます。 + +### ステップ2 - 関数の作成 + +次に、関数とその関数のパラメータを定義します。ここでは `search_courses` という1つの関数のみを使用しますが、複数の関数を作ることもできます。 + +> **重要** : 関数は LLM のシステム・メッセージに含まれており、利用可能なトークンの数に含まれます。 + +下記は、関数を項目の配列として作成しています。各項目は関数であり、`name`、`description`、`parameters` というプロパティを持ちます。 + +```python +functions = [ + { + "name":"search_courses", + "description":"提供されたパラメータに基づいて検索インデックスからコースを取得します", + "parameters":{ + "type":"object", + "properties":{ + "role":{ + "type":"string", + "description":"学習者の役割(例:開発者、データサイエンティスト、学生など)" + }, + "product":{ + "type":"string", + "description":"レッスンでカバーしている製品(例:Azure、Power BIなど)" + }, + "level":{ + "type":"string", + "description":"コースを受講する学習者のレベル(例:初心者、中級者、上級者)" + } + }, + "required":[ + "role" + ] + } + } +] +``` + +下記に、関数について詳しく説明します。 + +- `name` - 呼び出したい関数名 +- `description` - 関数がどのように動作するかの説明。ここは具体的で明確であることが重要 +- `parameters` - モデルによって回答で生成する値とフォーマットのリスト。`parameters` 配列として構成し、次のプロパティを含む + 1. `type` - プロパティのデータ型 + 1. `properties` - 回答に使用する特定の値のリスト + 1. `name` - フォーマットされた回答で使用するプロパティ名。例えば、`product` + 1. `type` - プロパティのデータ型。例えば、`string` + 1. `description` - 特定のプロパティの説明 + +また、オプションのプロパティとして `required`もあります。これは関数呼び出しが必須かを指定するプロパティです。 + +### ステップ3 - 関数呼び出しの実行 + +関数を定義した後、次に Chat Completion API の呼び出しにその関数を含める必要があります。これを行うには、リクエストに `functions` を追加します。この場合、`functions=functions`とします。 + +また、`function_call` を `auto` に設定するオプションもあります。これは、どの関数を呼び出すか、利用者からのメッセージに基づいて LLM に判断させ、自分で割り当てるのではなく、LLM に選択させます。 + +以下に、`ChatCompletion.create` を呼び出すコードを示します。`functions=functions` と `function_call="auto"` を設定し、LLM に提供する関数をいつ呼び出すかを選択させる方法に注目してください。 + +```python +response = client.chat.completions.create(model=deployment, + messages=messages, + functions=functions, + function_call="auto") + +print(response.choices[0].message) +``` + +返される回答は下記のようになります。 + +```json +{ + "role": "assistant", + "function_call": { + "name": "search_courses", + "arguments": "{\n \"role\": \"学生\",\n \"product\": \"Azure\",\n \"level\": \"初心者\"\n}" + } +} +``` + +ここでは、`search_courses` 関数がどのように呼び出され、どのような引数で呼び出されたかを、JSON 形式で返された応答の `arguments` プロパティ・リストから確認できます。 + +結論として、LLM は Chat Completion 呼び出しの `messages` パラメータで提供した値からデータを抽出し、関数の引数に適合するデータを見つけることができました。以下は、`messages` 値の内容です。 + +```python +messages= [ {"role": "user", "content": "初心者の学生が Azure を学ぶための良い学習コースを見つけてください。"} ] +``` + +ご覧の通り、`学生`、`Azure`、`初心者`は `messages` から抽出され、関数への入力として設定されました。このように関数を使用することは、プロンプトから情報を抽出するだけでなく、LLM に構造を提供し、再利用可能な機能を持たせる事ができます。 + +次に、この機能をアプリでどのように使用できるかを確認します。 + +## アプリケーションへ関数呼び出しの統合 + +LLM からフォーマットされた応答を取得した後、これをアプリケーションに統合します。 + +### フローの管理 + +アプリケーションに統合するためには、下記の手順で行います。 + +1. まず、Open AI サービスを呼び出し、メッセージを `response_message` という変数に代入します。 + + ```python + response_message = response.choices[0].message + ``` + +1. 次に、Microsoft Learn のカタログ API を呼び出してコースの一覧を取得する関数を定義します。 + + ```python + import requests + + def search_courses(role, product, level): + url = "https://learn.microsoft.com/api/catalog/" + params = { + "role": role, + "product": product, + "level": level + } + response = requests.get(url, params=params) + modules = response.json()["modules"] + results = [] + for module in modules[:5]: + title = module["title"] + url = module["url"] + results.append({"title": title, "url": url}) + return str(results) + ``` + + `functions` 変数に記載した関数名にマップする、実際の Python 関数を作成する方法に注目してください。また、必要なデータを取得するために、実際に外部 API 呼び出しも行っています。ここでは、Microsoft Learn API に対してトレーニング モジュールを検索しています。 + +いま、`functions` 変数とそれに対応する Python 関数を作成しましたが、実際の Python 関数を呼び出すために、これら 2 つをマッピングした内容を、LLM に指示するにはどうすればよいでしょうか? + +1. Python 関数を呼び出す必要があるかどうかを確認するためには、LLM からの応答を調べ、 `function_call` が含まれているかを確認し、指摘された関数を呼び出す必要があります。以下のようにしてチェックを行います。 + + ```python + # モデルが関数を呼び出したいかどうかを確認 + if response_message.function_call.name: + print("Recommended Function call:") + print(response_message.function_call.name) + print() + + # 関数を呼び出す + function_name = response_message.function_call.name + + available_functions = { + "search_courses": search_courses, + } + function_to_call = available_functions[function_name] + + function_args = json.loads(response_message.function_call.arguments) + function_response = function_to_call(**function_args) + + print("関数呼び出しの出力:") + print(function_response) + print(type(function_response)) + + + # アシスタントの応答と関数の応答をメッセージに追加 + messages.append( # アシスタントの応答をメッセージに追加 + { + "role": response_message.role, + "function_call": { + "name": function_name, + "arguments": response_message.function_call.arguments, + }, + "content": None + } + ) + messages.append( # 関数の応答をメッセージに追加 + { + "role": "function", + "name": function_name, + "content":function_response, + } + ) + ``` + + 下記の 3 行は、関数名と引数を抽出し、呼び出しを行ている事を確認できます。 + + ```python + function_to_call = available_functions[function_name] + + function_args = json.loads(response_message.function_call.arguments) + function_response = function_to_call(**function_args) + ``` + + 下記は、コードを実行した出力結果です。 + + **Output** + + ```output + { + "name": "search_courses", + "arguments": "{\n \"role\": \"学生\",\n \"product\": \"Azure\",\n \"level\": \"初心者\"\n}" + } + + 関数呼び出しの出力: + [ + { + "title": "暗号の概念についての説明", + "url": "https://learn.microsoft.com/training/modules/describe-concepts-of-cryptography/?WT.mc_id=api_CatalogApi" + }, + { + "title": "TensorFlow を使用したオーディオ分類の概要", + "url": "https://learn.microsoft.com/training/modules/intro-audio-classification-tensorflow/?WT.mc_id=api_CatalogApi" + }, + { + "title": "Azure Data Studio を使って Azure SQL Database でパフォーマンスに優れたデータ モデルを設計する", + "url": "https://learn.microsoft.com/training/modules/design-a-data-model-with-ads/?WT.mc_id=api_CatalogApi" + }, + { + "title": "Azure 用の Microsoft クラウド導入フレームワークの概要", + "url": "https://learn.microsoft.com/training/modules/cloud-adoption-framework-getting-started/?WT.mc_id=api_CatalogApi" + }, + { + "title": "Rust 開発環境を設定する", + "url": "https://learn.microsoft.com/training/modules/rust-set-up-environment/?WT.mc_id=api_CatalogApi" + } + ] + + ``` + +1. 次に、更新したメッセージ `messages` を LLM に送信して、JSON 形式の応答ではなく自然言語の応答を受け取ります。 + + ```python + print("次のリクエストのメッセージ:") + print(messages) + print() + + second_response = client.chat.completions.create( + messages=messages, + model=deployment, + function_call="auto", + functions=functions, + temperature=0 + ) # 関数からの応答を元にした GPT から新しい応答を取得 + + print(second_response.choices[0].message) + ``` + + **Output** + + ```python + { + "role": "assistant", + "content": "Azureを学ぶ初心者の学生向けにいくつかの良いコースを見つけました:\n\n1. [暗号の概念についての説明] (https://learn.microsoft.com/training/modules/describe-concepts-of-cryptography/?WT.mc_id=api_CatalogApi)\n2. [TensorFlow を使用したオーディオ分類の概要](https://learn.microsoft.com/training/modules/intro-audio-classification-tensorflow/?WT.mc_id=api_CatalogApi)\n3. [Azure Data Studio を使って Azure SQL Database でパフォーマンスに優れたデータ モデルを設計する](https://learn.microsoft.com/training/modules/design-a-data-model-with-ads/?WT.mc_id=api_CatalogApi)\n4. [Azure 用の Microsoft クラウド導入フレームワークの概要](https://learn.microsoft.com/training/modules/cloud-adoption-framework-getting-started/?WT.mc_id=api_CatalogApi)\n5. [Rust 開発環境を設定する](https://learn.microsoft.com/training/modules/rust-set-up-environment/?WT.mc_id=api_CatalogApi)\n\nリンクをクリックしてコースにアクセスできます。" + } + ``` + +## 課題 + +Azure Open AI Function Calling の学習を続けるために、以下のことを試してみてください。 + +- 学習者がより多くのコースを見つける為に役立つ可能性のある関数のパラメーターを探し増やす。 +- 学習者の母国語を聞くなど、学習者からより多くの情報を取得するための別の関数呼び出しを作成する。 +- 関数呼び出しや API 呼び出しが、適切なコースを返さない場合のエラー処理を実装する。 + +ヒント: これらのデータを、どこでどのように利用できるかを確認するために、[Learn API リファレンス ドキュメント](https://learn.microsoft.com/training/support/catalog-api-developer-reference?WT.mc_id=academic-105485-yoterada) をご参照ください。 + +## お疲れ様でした! 学習を続ける + +このレッスン修了後、[生成 AI 学習コレクション](https://aka.ms/genai-collection?WT.mc_id=academic-105485-yoterada) をチェックして、Generative AI の知識をレベルアップさせましょう。 + +Head over to Lesson 12 where we will look at how to ! + +次のレッスン 12 では、[AI アプリケーション用の UX デザイン](../../../12-designing-ux-for-ai-applications/translations/ja-jp/README.md?WT.mc_id=academic-105485-yoterada)について学びます! diff --git a/12-designing-ux-for-ai-applications/README.md b/12-designing-ux-for-ai-applications/README.md index 923dfe141..b7215cb24 100644 --- a/12-designing-ux-for-ai-applications/README.md +++ b/12-designing-ux-for-ai-applications/README.md @@ -117,4 +117,4 @@ Take any AI apps you've built so far, consider implementing the below steps in y After completing this lesson, check out our [Generative AI Learning collection](https://aka.ms/genai-collection?WT.mc_id=academic-105485-koreyst) to continue leveling up your Generative AI knowledge! -Congratulations, you have completed this course! The building should not stop here. Hopefully, you have been inspired to start building your own Generative AI startup. Head over to the [Microsoft Founders Hub](https://aka.ms/genai-foundershub?WT.mc_id=academic-105485-koreyst) and apply for the program to receive support on your journey. +Congratulations, you have completed this course! The building should not stop here. Hopefully, you have been inspired to start building your own Generative AI startup. Head over to the [Microsoft Founders Hub](https://aka.ms/genai-foundershub?WT.mc_id=academic-105485-koreyst) and apply for the program to receive support on your journey. \ No newline at end of file diff --git a/12-designing-ux-for-ai-applications/translations/ja-jp/README.md b/12-designing-ux-for-ai-applications/translations/ja-jp/README.md new file mode 100644 index 000000000..8cf398bbc --- /dev/null +++ b/12-designing-ux-for-ai-applications/translations/ja-jp/README.md @@ -0,0 +1,121 @@ +# AI アプリケーションの UX 設計 + +[![Designing UX for AI Applications](../../images/12-lesson-banner.png?WT.mc_id=academic-105485-yoterada)](https://youtu.be/bO7h2_hOhR0?WT.mc_id=academic-105485-yoterada) + +> *(上の画像をクリックすると、このレッスンのビデオが表示されます)* + +アプリを構築する際、ユーザー・エクスペリエンスは非常に重要な要素です。ユーザーは、タスクを効率的に実行できるようにアプリを使用する必要があります。効率性は一つの要素ですが、全ての人が使用でき、アクセスできるようにアプリを設計することも重要です。この章では、この領域に焦点を当て、ユーザーが使用でき、使いたくなるアプリを設計することを目指します。 + +## はじめに + +ユーザー・エクスペリエンスとは、ユーザーがシステム、ツール、デザインなど、特定の製品やサービスとどのように対話し、使用するかということです。AI アプリケーションを開発する際、開発者はユーザー・エクスペリエンスが効果的であるだけでなく、倫理的であることにも重点を置きます。このレッスンでは、ユーザーのニーズに対応する人工知能(AI)アプリケーションの構築方法について説明します。 + +このレッスンでは、以下の内容を取り扱います: + +* ユーザー・エクスペリエンスの概要とユーザー・ニーズの理解 +* 信頼性と透明性のある AI アプリケーションの設計 +* コラボレーションとフィードバックを求める AI アプリケーションの設計 + +## 学習目標 + +このレッスンを受講すると、下記ができるようになります。 + +* ユーザーのニーズを満たす AI アプリケーションを構築する方法を理解します。 +* 信頼性とコラボレーションを促進する AI アプリケーションを設計します。 + +### 前提 + +少し時間を取り、[ユーザー・エクスペリエンスとデザイン思考](https://learn.microsoft.com/training/modules/ux-design?WT.mc_id=academic-105485-yoterada)の基礎について学んでみましょう。 + +## ユーザーエクスペリエンスの概要とユーザーニーズの理解 + +架空の教育スタートアップでは、教師と生徒の 2 つの主要な利用者がいます。2 つの利用者には、それぞれ固有のニーズがあります。ユーザー中心設計は、利用者のニーズを最優先に考え、製品が対象とする利用者にとって関連性があり、有益なものであることを確認します。 + +アプリケーションは、優れたユーザー・エクスペリエンスを提供するために、**有用で信頼性が高く、アクセスしやすく、快適**である必要があります。 + +### ユーザビリティ + +有用であるとは、アプリケーションがその目的に適した機能を持つことを意味します。例えば、採点プロセスを自動化したり、復習用のフラッシュカードを生成したりするなどです。採点を自動化するアプリケーションは、事前に設定した基準に基づいて、学生の作業に対して正確かつ効率的にスコアを付けることができなければなりません。同様に、復習用のフラッシュカードを生成するアプリケーションは、そのデータに基づいて関連性のある多様な質問を作成することがで着なければなりません。 + +### 信頼性 + +信頼性が高いとは、アプリケーションが一貫してエラーなくタスクを実行できることを意味します。しかし、AIも人間と同じく完全ではなく、エラーが起こる可能性があります。アプリケーションは、人間の介入や修正が必要なエラーや、予期せぬ状況に遭遇することがあります。では、エラーはどのように取り扱うべきでしょうか?このレッスンの最後のセクションでは、AI システムとアプリケーションが、どのようにして協力やフィードバックを設計に取り入れているかについて説明します。 + +### アクセシビリティ + +アクセシブルであるとは、障害を持つユーザーを含む、様々な能力を持つ利用者全てに対して、ユーザー・エクスペリエンスを提供し、誰もが取り残されないようにすることを意味します。アクセシビリティのガイドラインと原則に従うことで、AIソリューションは全てのユーザーにとってより包括的で、使いやすく、有益なものになります。 + +### 快適 + +快適であるとは、アプリケーションを使うことが楽しいということを意味します。魅力的なユーザー・エクスペリエンスは、利用者に好印象を与え、アプリケーションの再利用を促し、ビジネスの収益を増加させることができます。 + +![image illustrating UX considerations in AI](../../images/uxinai.png?WT.mc_id=academic-105485-yoterada) + +全ての問題を AI で解決できるわけではありません。AI は、手動の作業を自動化したり、ユーザー体験をパーソナライズしたりすることで、ユーザー体験を向上させる役割を果たします。 + +## 信頼性と透明性のためのAIアプリケーションの設計 + +AI アプリケーションを設計する際には、利用者との信頼関係を築くことが重要です。信頼があると、利用者はアプリケーションがタスクを遂行し、一貫した結果を提供し、その結果が自分のニーズに合致すると確信できます。この分野でのリスクは、不信と過信です。不信感は、ユーザーが AI システムをほとんど信頼していない、または全く信頼していない場合に生じ、結果としてユーザーがアプリケーションを拒否することにつながります。一方、過信は、ユーザーが AI システムの能力を過大評価し、AI システムを過度に信頼する状況を指します。例えば、過信があると、自動採点システムを使う教師が、採点システムが適切に機能していることを確認するために、一部の試験を見直さない可能性があります。これにより、学生に対する不公平な評価や誤った評価が生じたりするため、フィードバックや改善の機会を逃す可能性があります。 + +デザインの中心に信頼性を位置づけるための二つの方法は、説明可能性とコントロールです。 + +### 説明可能性 (Explainability) + +AI が将来の世代への知識を伝えるなどの意思決定を支援する際、教師や保護者は AI がどのように意思決定を行うのかを理解することは重要です。これが説明可能性という概念で、AI アプリケーションがどのように決定を下すのかを理解することを指します。説明可能性を考慮した設計には、AI アプリケーションが何をできるのかの具体的な例を追加することが含まれます。例えば、「AI 教師を使い始める」ではなく、「AI を使ってノートを要約し、復習を容易にする」といった表現を使うことができます。 + +![an app landing page with clear illustration of explainability in AI applications](../../images/explanability-in-ai.png?WT.mc_id=academic-105485-yoterada) + +もう一つの例は、AI が利用者のデータや個人情報をどのように利用するかという点です。例えば、「学生」という属性を持つ利用者は、その属性に基づいて制約があるかもしれません。AI は質問の答えを直接教えることはできないかもしれませんが、利用者が問題解決の方法を自分で考える手助けをすることは可能です。 + +![AI replying to questions based on persona](../../images/solving-questions.png?WT.mc_id=academic-105485-yoterada) + +説明可能性のもう一つの重要な要素は、説明の簡素化です。学生や教師は AI の専門家ではないかもしれません。そこで、アプリケーションで何ができて何ができないのかについて説明する際は、簡単な内容で理解しやすい形にするべきです。 + +![simplified explanations on AI capabilities](../../images/simplified-explanations.png?WT.mc_id=academic-105485-yoterada) + +### コントロール + +生成 AI は、利用者と AI が協力する関係を作り出します。例えば、利用者は異なる結果を得るためにプロンプトによる指示を変更することができます。さらに、一度結果が出力されたら、利用者はその結果を修正することができ、自分がコントロールしていると感じることができます。例えば、Bing を使うときには、形式やトーン、長さに基づいてプロンプトによる指示をカスタマイズすることができます。そして、出力に変更を加えて、以下のように出力結果を修正することも可能です。 + +![Bing search results with options to modify the prompt and output](../../images/bing1.png?WT.mc_id=academic-105485-yoterada "Bing search results with options to modify the prompt and output") + +Bing には、利用者がアプリケーションを自分で操作できる機能として、AI が使用するデータの選択(オプトイン)や選択解除(オプトアウト)できる機能があります。例えば、学校のアプリケーションでは、学生は自分のノートや教師の教材を復習資料として利用したいと思うかもしれません。 + +![Bing search results with options to modify the prompt and output](../../images/bing2.png?WT.mc_id=academic-105485-yoterada "Bing search results with options to modify the prompt and output") + +> AI アプリケーションを設計する際、利用者が AI の能力について非現実的な期待を持ちすぎないようにするためには、意図的な設計が重要です。これを実現する一つの方法は、プロンプトによる指示と結果の間にある種の隔たりを作り出すことです。これにより、利用者に対して、相手が AI であって人間ではないことを思い出させることができます。 + +## コラボレーションとフィードバックのための AI アプリケーションの設計 + +前述の通り、生成 AI は利用者と AI の協力関係を生み出します。ほとんどの場合、利用者がプロンプトで指示を入力し、AI が結果を出力します。しかし、出力が間違っていた場合どうなるでしょうか?エラーが起きた場合、アプリケーションはどのように対処するのでしょうか?AI は利用者を責めるのでしょうか、それともエラーについて説明する時間を取れるのでしょうか? + +また、AI アプリケーションは、フィードバックを受け付け、提供するように実装すべきです。これは AI システムの改善だけでなく、ユーザーとの信頼関係の構築にもつながります。設計にはフィードバック・ループを含めるべきで、例えば、出力に対する「いいね」や「よくないね」のボタンを付けるようなシンプルな評価がそれに当たります。 + +これに対応するもう一つの方法は、システムの能力と限界をはっきりと伝えることです。ユーザーが AI の能力を超える要求をしてエラーが発生した場合でも、それに対して適切に対処する必要があります。具体的な方法は下記の通りです。 + +![Giving feedback and handling errors](../../images/feedback-loops.png?WT.mc_id=academic-105485-yoterada) + +システム・エラーは、利用者が AI の対応範囲を超える情報を問い合わせたり、要約を作成できる質問数やテーマの数に制限があるアプリケーションでよく見られます。例えば、歴史や数学など限定的なテーマのデータで学習させた AI アプリケーションは、地理学に関する質問に対応できないかもしれません。これを解消するために、AI システムは「申し訳ありませんが、当社の製品は以下のテーマのデータで学習していますので、あなたの質問には答えられません」といった回答を返すことができます。 + +AI アプリケーションは完全ではなく、間違いを犯すことは避けられません。そのため、アプリケーションを設計する際には、利用者からのフィードバックを受け付け、エラー処理をシンプルで簡単に説明できる方法で作成する必要があります。 + +## 課題 + +これまでに構築した AI アプリを使用して、アプリに次の実装を加えることを検討してください。 + +* **快適:** あなたのアプリをより使いやすくするためにどのような工夫ができるか考えてみてください。各所に説明を追加していますか?利用者が自由に探索できるように促していますか?エラーメッセージはどのように表現していますか? + +* **ユーザビリティ:** Web アプリ構築の場合、アプリがマウスとキーボードの両方で操作できていますか? + +* **信頼と透明性:** AI とその結果を完全に信頼するのではなく、結果を確認するために人間が介入するプロセスをどのように追加するか考えてみてください。また、信頼性と透明性を高めるための他の手段も考慮し、取り入れてみてください。 + +* **コントロール:** 利用者が自分で提供するデータを管理できるようにしましょう。AI アプリケーションで、利用者が使用するデータの選択(オプトイン)や選択解除(オプトアウト)する方法を導入してください。 + + + +## おめでとうございます、このコースを終了しました + +このレッスン修了後、[生成 AI 学習コレクション](https://aka.ms/genai-collection?WT.mc_id=academic-105485-yoterada) をチェックして、Generative AI の知識をレベルアップさせましょう。 + +おめでとうございます、このコースを無事終了しました!しかし、ここで学びを止めることはありません。このコースを通じて、ご自身の AI スタートアップを立ち上げることに興味を持たれたことと思います。 +[Microsoft Founders Hub](https://aka.ms/genai-foundershub?WT.mc_id=academic-105485-yoterada)にアクセスしてプログラムに申し込み、あなたの新たな挑戦をサポートしてもらいましょう。 diff --git a/13-continued-learning/translations/ja-jp/README.md b/13-continued-learning/translations/ja-jp/README.md new file mode 100644 index 000000000..1331194c6 --- /dev/null +++ b/13-continued-learning/translations/ja-jp/README.md @@ -0,0 +1,135 @@ +# 追加のリソース + +以下は、生成 AI の学習と構築を続けるための他の素晴らしいリソースへのリンクです。 + +素晴らしいリソースが欠けている場合は、PRを提出してお知らせください! + +## 🧠 すべてを制覇する一コレクション + +このコースを終了したら、[生成 AI 学習コレクション](https://aka.ms/genai-collection?WT.mc_id=academic-105485-yoterada)をチェックし、生成 AI の知識をさらに深めてください! + +## レッスン1 - 生成 AI と大規模言語モデルの紹介 + +🔗 [GPTモデルの仕組み:誰でも理解できる](https://bea.stollnitz.com/blog/how-gpt-works/?WT.mc_id=academic-105485-yoterada) + +🔗 [生成 AI の基礎](https://learn.microsoft.com/training/modules/fundamentals-generative-ai?&WT.mc_id=academic-105485-yoterada) + +🔗 [GPTモデルの仕組み:誰でも理解できる](https://bea.stollnitz.com/blog/how-gpt-works?WT.mc_id=academic-105485-yoterada) + +🔗 [生成 AI:教育への影響と応用](https://arxiv.org/abs/2305.07605?wt.mc_id=github_S-1231_webpage_reactor) + +## レッスン2 - 様々なLLMの調査と比較 + +🔗 [Azure Machine Learningがキュレートするオープンソースの基盤モデルの使用方法 (プレビュー) - Azure Machine Learning | Microsoft Learn](https://learn.microsoft.com/azure/machine-learning/how-to-use-foundation-models?WT.mc_id=academic-105485-yoterada) + +🔗 [大規模言語モデル(LLM)インデックス | Sapling](https://sapling.ai/llm/index?WT.mc_id=academic-105485-yoterada) + +🔗 [[2304.04052] デコーダのみかエンコーダ-デコーダか?言語モデルを正則化されたエンコーダ-デコーダとして解釈する (arxiv.org)](https://arxiv.org/abs/2304.04052?WT.mc_id=academic-105485-yoterada) + +🔗 [Azure Machine Learningのプロンプトフローを使用した情報検索強化生成](https://learn.microsoft.com/azure/machine-learning/concept-retrieval-augmented-generation?WT.mc_id=academic-105485-yoterada) + +🔗 [LLMのグラウンディング](https://techcommunity.microsoft.com/t5/fasttrack-for-azure/grounding-llms/ba-p/3843857?wt.mc_id=github_S-1231_webpage_reactor) + +🔗 [大規模言語モデル(LLM)インデックス | Sapling](https://sapling.ai/llm/index?wt.mc_id=github_S-1231_webpage_reactor ) + +🔗 [[2304.04052] デコーダのみかエンコーダ-デコーダか?言語モデルを正則化されたエンコーダ-デコーダとして解釈する (arxiv.org)](https://arxiv.org/abs/2304.04052?wt.mc_id=github_S-1231_webpage_reactor) + +## レッスン3 - 責任ある生成 AI の利用 + +🔗 [責任ある生成 AI の基礎](https://learn.microsoft.com/training/modules/responsible-generative-ai/?&WT.mc_id=academic-105485-yoterada) + +🔗 [LLM のグラウンディング](https://techcommunity.microsoft.com/t5/fasttrack-for-azure/grounding-llms/ba-p/3843857?WT.mc_id=academic-105485-yoterada) + +🔗 [責任ある生成 AI の基礎](https://learn.microsoft.com/training/modules/responsible-generative-ai?WT.mc_id=academic-105485-yoterada) + +🔗 [生成 AI の責任ある使用](https://learn.microsoft.com/shows/ai-show/being-responsible-with-generative-ai?WT.mc_id=academic-105485-yoterada) + +🔗 [GPT-4システムカード](https://cdn.openai.com/papers/gpt-4-system-card.pdf?wt.mc_id=github_S-1231_webpage_reactor) + +## レッスン4 - プロンプト・エンジニアリングの基礎 + +🔗 [Azure OpenAIサービスの開始](https://https://learn.microsoft.com/training/modules/get-started-openai/?&WT.mc_id=academic-105485-yoterada) + +[Azure OpenAIサービスでのプロンプトエンジニアリングの適用](https://learn.microsoft.com/training/modules/apply-prompt-engineering-azure-openai/?&WT.mc_id=academic-105485-yoterada) + +[プロンプトエンジニアリングの紹介](https://learn.microsoft.com/azure/ai-services/openai/concepts/prompt-engineering?&WT.mc_id=academic-105485-yoterada) + +🔗 [プロンプトエンジニアリングの概要](https://learn.microsoft.com/semantic-kernel/prompt-engineering/?WT.mc_id=academic-105485-yoterada) + +🔗 [教育用Azure OpenAIプロンプト](https://techcommunity.microsoft.com/t5/education-blog/azure-openai-for-education-prompts-ai-and-a-guide-from-ethan-and/ba-p/3938259?wt.mc_id=github_S-1231_webpage_reactor ) + +🔗 [プロンプトエンジニアリングの紹介](https://learn.microsoft.com/azure/ai-services/openai/concepts/prompt-engineering?WT.mc_id=academic-105485-yoterada) + +🔗 [プロンプトエンジニアリングの概要](https://learn.microsoft.com/semantic-kernel/prompt-engineering?WT.mc_id=academic-105485-yoterada) + +🔗 [教育用Azure OpenAIプロンプト](https://techcommunity.microsoft.com/t5/e1.ucation-blog/azure-openai-for-education-prompts-ai-and-a-guide-from-ethan-and/ba-p/3938259?WT.mc_id=academic-105485-yoterada) + +## レッスン5 - 高度なプロンプトの作成 + +🔗 [プロンプトエンジニアリングの技術](https://learn.microsoft.com/azure/ai-services/openai/concepts/advanced-prompt-engineering?WT.mc_id=academic-105485-yoterada) + +## レッスン6 - テキスト生成アプリケーションの構築 + +🔗 [プロンプトエンジニアリングの技術](https://learn.microsoft.com/azure/ai-services/openai/concepts/advanced-prompt-engineering?pivots=programming-language-chat-completions&WT.mc_id=academic-105485-yoterada) + +## レッスン7 - チャットアプリケーションの構築 + +🔗 [大規模言語モデル(LLM)向けのシステムメッセージフレームワークとテンプレートの推奨事項](https://learn.microsoft.com/azure/ai-services/openai/concepts/system-message?WT.mc_id=academic-105485-yoterada) + +🔗 [GPT-35-TurboとGPT-4モデルの使用方法を学ぶ](https://learn.microsoft.com/azure/ai-services/openai/how-to/chatgpt?&WT.mc_id=academic-105485-yoterada) + +🔗 [人間の好みから言語モデルを微調整する](https://arxiv.org/pdf/1909.08593.pdf?wt.mc_id=github_S-1231_webpage_reactor) + +🔗 [Azure OpenAIサービスで自然言語ソリューションを構築する](https://learn.microsoft.com/training/modules/build-language-solution-azure-openai/?WT.mc_id=academic-105485-yoterada) + +🔗 [OpenAIの微調整](https://platform.openai.com/docs/guides/fine-tuning/when-to-use-fine-tuning?wt.mc_id=github_S-1231_webpage_reactor ) + +## レッスン8 - 検索アプリケーションの構築 + +🔗 [Azure Cognitive Search](https://learn.microsoft.com/training/modules/improve-search-results-vector-search?WT.mc_id=academic-105485-yoterada) + +🔗 [OpenAI埋め込みAPI](https://platform.openai.com/docs/api-reference/embeddings?wt.mc_id=github_S-1231_webpage_reactor) + +🔗 [コサイン類似度](https://en.wikipedia.org/wiki/Cosine_similarity?wt.mc_id=github_S-1231_webpage_reactor) + +## レッスン9 - 画像生成アプリケーションの構築 + +🔗[Azure OpenAIサービスで画像を生成する](https://learn.microsoft.com/training/modules/generate-images-azure-openai?WT.mc_id=academic-105485-yoterada) + +🔗 [OpenAIのDALL-EとCLIP 101:簡単な紹介](https://towardsdatascience.com/openais-dall-e-and-clip-101-a-brief-introduction-3a4367280d4e?wt.mc_id=github_S-1231_webpage_reactor) + +🔗 [OpenAIのCLIP論文](https://arxiv.org/pdf/2103.00020.pdf?wt.mc_id=github_S-1231_webpage_reactor) + +🔗 [OpenAIのDALL-EとCLIP 101:簡単な紹介](https://towardsdatascience.com/openais-dall-e-and-clip-101-a-brief-introduction-3a4367280d4e?WT.mc_id=academic-105485-yoterada) + +🔗 [OpenAIのCLIP論文](https://arxiv.org/pdf/2103.00020.pdf?WT.mc_id=academic-105485-yoterada) + +## レッスン10 - ローコード AI アプリケーションの構築 + +🔗 [Microsoft Copilot Studioでボットを作成する](https://learn.microsoft.com/training/paths/work-power-virtual-agents/?&WT.mc_id=academic-105485-yoterada) + +🔗 [AI BuilderとGPTを使用してインテリジェンスを追加する](https://learn.microsoft.com/training/modules/ai-builder-text-generation?&WT.mc_id=academic-105485-yoterada) + +🔗 [AI Builderの開始](https://learn.microsoft.com/training/modules/get-started-with-ai-builder?WT.mc_id=academic-105485-yoterada) + +🔗 [AI Builderでオブジェクトを検出する](https://learn.microsoft.com/training/modules/get-started-with-ai-builder-object-detection?WT.mc_id=academic-105485-yoterada) + +🔗 [Power AppsでCopilotを使用してキャンバスアプリソリューションを構築する](https://learn.microsoft.com/training/modules/build-canvas-app-real-estate-power-apps-copilot/?WT.mc_id=academic-105485-yoterada) + +🔗 [Power Platform Copilotプロンプトライブラリ](https://pnp.github.io/powerplatform-prompts/?wt.mc_id=github_S-1231_webpage_reactor&WT.mc_id=academic-109639-somelezediko) + +## レッスン11- Function Calling との統合 + +🔗 [OpenAI関数のドキュメンテーション](https://learn.microsoft.com/azure/ai-services/openai/how-to/function-calling?WT.mc_id=academic-105485-yoterada) + +## レッスン12 - AI アプリケーション用の UX デザイン + +🔗 [人間とAIのパートナーシップによる協調的UXを構築するためのベストプラクティス](https://learn.microsoft.com/community/content/best-practices-ai-ux?WT.mc_id=academic-105485-yoterada) + +🔗[人間中心のAI体験の設計:人工知能のための適用UX設計 by Akshay Kpre](https://www.linkedin.com/learning/ux-for-ai-design-practices-for-ai-developers?wt.mc_id=github_S-1231_webpage_reactor) + +🔗 [AI開発者のためのUX for AI:設計実践](https://www.youtube.com/watch?wt.mc_id=github_S-1231_webpage_reactor&v=Lkbkd_hkDLY) + +🔗 [AI時代の新しいスキル by John Maeda](https://www.amazon.com/Designing-Human-Centric-Experiences-Artificial-Intelligence/dp/1484280873?wt.mc_id=github_S-1231_webpage_reactor) + +🔗[人間中心のAI体験の設計:人工知能のための適用UX設計 by Akshay Kpre](https://www.amazon.com/Designing-Human-Centric-Experiences-Artificial-Intelligence/dp/1484280873?WT.mc_id=academic-105485-yoterada) diff --git a/docs/_navbar.md b/docs/_navbar.md index f3f19071e..e58867a00 100644 --- a/docs/_navbar.md +++ b/docs/_navbar.md @@ -5,3 +5,4 @@ * [English](/) * [Chinese](/translations/cn/) * [Portuguese](/translations/pt-br/) + * [Japanese](/translations/ja-jp/) diff --git a/translations/ja-jp/README.md b/translations/ja-jp/README.md new file mode 100644 index 000000000..dc9836a2f --- /dev/null +++ b/translations/ja-jp/README.md @@ -0,0 +1,85 @@ + +![Generative AI For Beginners](../../images/repository-thumbnail.png?WT.mc_id=academic-105485-yoterada) + +### 生成 AI アプリケーションの開発を始めるために必要な全知識を学べる 12 講座 + +[![GitHub license](https://img.shields.io/github/license/microsoft/Generative-AI-For-Beginners.svg)](https://github.com/microsoft/Generative-AI-For-Beginners/blob/master/LICENSE?WT.mc_id=academic-105485-yoterada) +[![GitHub contributors](https://img.shields.io/github/contributors/microsoft/Generative-AI-For-Beginners.svg)](https://GitHub.com/microsoft/Generative-AI-For-Beginners/graphs/contributors/?WT.mc_id=academic-105485-yoterada) +[![GitHub issues](https://img.shields.io/github/issues/microsoft/Generative-AI-For-Beginners.svg)](https://GitHub.com/microsoft/Generative-AI-For-Beginners/issues/?WT.mc_id=academic-105485-yoterada) +[![GitHub pull-requests](https://img.shields.io/github/issues-pr/microsoft/Generative-AI-For-Beginners.svg)](https://GitHub.com/microsoft/Generative-AI-For-Beginners/pulls/?WT.mc_id=academic-105485-yoterada) +[![PRs Welcome](https://img.shields.io/badge/PRs-welcome-brightgreen.svg?style=flat-square)](http://makeapullrequest.com?WT.mc_id=academic-105485-yoterada) + +[![GitHub watchers](https://img.shields.io/github/watchers/microsoft/Generative-AI-For-Beginners.svg?style=social&label=Watch)](https://GitHub.com/microsoft/Generative-AI-For-Beginners/watchers/?WT.mc_id=academic-105485-yoterada) +[![GitHub forks](https://img.shields.io/github/forks/microsoft/Generative-AI-For-Beginners.svg?style=social&label=Fork)](https://GitHub.com/microsoft/Generative-AI-For-Beginners/network/?WT.mc_id=academic-105485-yoterada) +[![GitHub stars](https://img.shields.io/github/stars/microsoft/Generative-AI-For-Beginners.svg?style=social&label=Star)](https://GitHub.com/microsoft/Generative-AI-For-Beginners/stargazers/?WT.mc_id=academic-105485-yoterada) + +[![Open in GitHub Codespaces](https://img.shields.io/static/v1?style=for-the-badge&label=GitHub+Codespaces&message=Open&color=lightgrey&logo=github)](https://codespaces.new/microsoft/generative-ai-for-beginners?WT.mc_id=academic-105485-yoterada) +[![](https://dcbadge.vercel.app/api/server/ByRwuEEgH4)](https://aka.ms/genai-discord?WT.mc_id=academic-105485-yoterada) + +# 初心者のための生成系 AI - コース + +マイクロソフトのクラウド・アドボケイトが提供する、全12回のレッスンで生成系 AI アプリケーション構築の基礎知識を身につけましょう。各レッスンで、生成系 AI の基礎知識やアプリの実装に必要なキーポイントをしっかり押さえます。このコースを通じて、自分だけの生成系 AI のスタートアップ企業を作りながらアイデアを形にする過程を実際に体験できます。 + +## 🌱 はじめに + +まず初めに、このリポジトリ全体をご自身の GitHub アカウントで [fork](https://github.com/microsoft/generative-ai-for-beginners/fork?WT.mc_id=academic-105485-yoterada) してください。すると、コードの変更や各課題を修了することができるようになります。また、後から見つけやすくするために、このリポジトリに[スター 🌟 をつける](https://docs.github.com/en/get-started/exploring-projects-on-github/saving-repositories-with-stars?WT.mc_id=academic-105485-yoterada) のもおすすめです。 + +各レッスンのリンクは、下記に掲載しています。最も関心のあるレッスンからご自由に始めてください! + +ご自身に最適なセットアップ方法を見つけるために、[コース・セットアップ・ページ](../../00-course-setup/README.md?WT.mc_id=academic-105485-yoterada)にアクセスしてください。 + +## 🗣️ 他の学習者と出会ったり、サポートを受ける + +学習する上で最も効果的な方法は、他の方と一緒に学ぶことです![公式 AI Discord サーバー](https://aka.ms/genai-discord?WT.mc_id=academic-105485-yoterada)に参加し、このコースを受講している他の学習者と出会って交流し助け合いましょう。もしかすると、そこで次のあなたの共同創業者が見つかるかもしれないですね! + +## 🧠 さらに知識を深めたいですか? + +このコースを終了後、さらに生成系 AI に関する知識を深めたい場合は、[生成 AI 学習コレクション](https://aka.ms/genai-collection?WT.mc_id=academic-105485-yoterada)を、ぜひご覧ください! + +## 🚀 スタートアップですか、それとも実現したいアイデアはありますか? + +その場合、[Microsoft for Startups Founders Hub](https://aka.ms/genai-foundershub?WT.mc_id=academic-105485-yoterada) にご登録いただくと、**OpenAI クレジットを無料で**もらえるだけでなく、**最大で $150k の Azure クレジットを獲得し、Azure OpenAI サービスで OpenAI のモデルを利用**することができます。 + +## 🙏 ご協力いただける方を募集しています + +貢献して頂ける方法をいくつかご紹介します: + +- 文章の誤字脱字やコードに間違いを発見したら、[問題(Issue)で指摘する](https://github.com/microsoft/generative-ai-for-beginners/issues?WT.mc_id=academic-105485-yoterada)か[プルリクエストを送ってください](https://github.com/microsoft/generative-ai-for-beginners/pulls?WT.mc_id=academic-105485-yoterada) +- 私たちに、新しいレッスンや演習アイデアなどの提案をお送りいただき、コースの改善点を教えてください + +## 📂 各レッスンに含まれる内容 + +- トピックの概要を説明する短い動画 +- README に記載されているレッスン +- サンプル・コードを含む Jupyter Notebook(プロジェクト形式のレッスンの場合) +- 学習内容を活用した課題やチャレンジ +- 継続して学習するための追加参考資料へのリンク + +## 🗃️ レッスン一覧 +| | レッスンへのリンク | 学ぶ内容の概念 | 学習目標 | +| :---: | :------------------------------------: | :---------------------------------------------------------: | ----------------------------------------------------------- | +| 00 | [コース紹介 - コースの受講方法](../../00-course-setup/translations/ja-jp/README.md?WT.mc_id=academic-105485-yoterada) | テクノロジーのセットアップとコースの枠組み | レッスンが成功したと分かるゴール設定| +| 01 | [生成 AI と大規模言語モデルの紹介](../../01-introduction-to-genai/translations/ja-jp/README.md?WT.mc_id=academic-105485-yoterada) |**概念**: 生成 AI と現在のテクノロジー環境| 生成 AI とは何か、そして大規模言語モデル(LLM)がどのように動くかを理解する。 | +| 02 | [様々なLLMの調査と比較](../../02-exploring-and-comparing-different-llms/translations/ja-jp/README.md?WT.mc_id=academic-105485-yoterada) | **概念**: さまざまな大規模言語モデルのテスト、反復、および比較 | ユースケースに適した AI モデルを選択 | +| 03 | [責任ある生成系 AI の利用](../../03-using-generative-ai-responsibly/translations/ja-jp/README.md?WT.mc_id=academic-105485-yoterada)| **概念**: ファウンデーションモデルの限界と AI に伴うリスクを理解する | 責任ある生成系 AI アプリケーションの開発方法を学ぶ | +| 04 | [プロンプト・エンジニアリングの基礎](../../04-prompt-engineering-fundamentals/translations/ja-jp/README.md?WT.mc_id=academic-105485-yoterada) | **Code/概念:** ハンズオン形式でプロンプト・エンジニアリングのベストプラクティスを学ぶ | プロンプトの構造と使用法の理解 | +| 05 | [高度なプロンプトの作成](../../05-advanced-prompts/translations/ja-jp/README.md?WT.mc_id=academic-105485-yoterada) | **Code/概念:** プロンプトに様々なテクニックを取り入れ、プロンプト・エンジニアリングの知識をより深める | 出力結果を改善するため、プロンプト・エンジニアリングのテクニックを取り入れる | +| 06 | [テキスト生成アプリケーションの構築](../../06-text-generation-apps/translations/ja-jp/README.md?WT.mc_id=academic-105485-yoterada) | **Code:** コード:Azure OpenAI を使用してテキスト生成アプリを構築する | トークンと温度を効率的に使用しモデルの出力を変化させる方法を理解する | +| 07 | [チャットアプリケーションの構築](../../07-building-chat-applications/translations/ja-jp/README.md?WT.mc_id=academic-105485-yoterada) | **Code**: チャット アプリケーションを効率的に構築および統合するための手法。 | AI を利用したチャット・アプリケーションの品質を効果的に監視し維持するための重要なキーメトリクスと注意点を把握する | +| 08 | Vector Databases を利用した[検索アプリケーションの構築](../../08-building-search-applications/translations/ja-jp/README.md?WT.mc_id=academic-105485-yoterada) | **Code**: セマンティック検索とキーワード検索のの違いについて学ぶ。テキストの埋め込みについて学び、検索への適用方法を理解する | 埋め込み技術を利用したデータ検索アプリケーションを構築する | +| 09 | [画像生成アプリケーションの構築](../../09-building-image-applications/translations/ja-jp/README.md?WT.mc_id=academic-105485-yoterada) | **Code:** アプリケーション開発で画像生成が役立つ理由 | 画像を生成するアプリケーションを構築する | +| 10 | [ローコード AI アプリケーションの構築](../../10-building-low-code-ai-applications/translations/ja-jp/README.md?WT.mc_id=academic-105485-yoterada) | **Low Code:** Power Platform における生成系 AI の概要 | 教育系スタートアップ企業がローコードで学生の課題追跡アプリを構築する | +| 11 | [Function Calling との統合](../../11-integrating-with-function-calling/translations/ja-jp/README.md?WT.mc_id=academic-105485-yoterada) | **Code:** Function Calling とアプリケーションにおける用途 | 外部 API からデータを取得するため Function Calling を設定する | +| 12 | [AI アプリケーション用の UX デザイン](../../12-designing-ux-for-ai-applications/translations/ja-jp/README.md?WT.mc_id=academic-105485-yoterada) | **概念:** 透明性と信頼性を備えたAIアプリケーションの設計 | 生成 AI アプリケーションの開発時に UX デザインの原則を適用する | +| xx | [学習の継続](../../13-continued-learning/translations/ja-jp/README.md?WT.mc_id=academic-105485-yoterada) | 各授業の内容をさらに進めるための参考リンク! | 生成 AI の技術をマスターするために | + +## 🎒 その他のコース + +私たちは他のコースも提供しています!ぜひご覧ください: + +- [初心者のための ML](https://aka.ms/ml-beginners?WT.mc_id=academic-105485-yoterada) +- [初心者のための Data Science](https://aka.ms/datascience-beginners?WT.mc_id=academic-105485-yoterada) +- [初心者のための AI](https://aka.ms/ai-beginners?WT.mc_id=academic-105485-yoterada) +- [初心者のための Web Dev](https://aka.ms/webdev-beginners?WT.mc_id=academic-105485-yoterada) +- [初心者のための IoT](https://aka.ms/iot-beginners?WT.mc_id=academic-105485-yoterada) +- [初心者のための XR Development](https://github.com/microsoft/xr-development-for-beginners?WT.mc_id=academic-105485-yoterada)