新卒エンジニア向けの生成AI研修（ハンズオン編）の教材を公開します

自社の新卒メンバー向け研修コンテンツの一部となります。
特に隠す内容もないので公開します。（口頭フォロー前提のため、記載荒い点はご容赦ください）

# これは何？

- アジャイル開発の会社における、エンジニア＆デザイナー共通の新卒研修、うち技術各論編の一つ「生成AI」テーマのハンズオンパートの教材です
- このハンズオンの前段に講義編があります
- 2hぐらいで実施する想定
- 受講メンバーはオンサイトでペアを組み、相互フォローしながら実施してもらいます


# 1. プロンプトエンジニアリング（20分）

## 目的

- 自然言語のプロンプトだけで、どこまで生成AIへ高度な仕事を任せられるかを学ぶ

## ハンズオン

ChatGPTを利用

https://chatgpt.com/

以下を抜粋して実施

https://www.promptingguide.ai/jp

- Zero-shot

```:プロンプト
7.11と7.9、どちらが大きな実数ですか？
```

- Few-shot

```:プロンプト
5.11と5.9では、5.11と5.90との比較となるため、5.9の方が大きな実数です。
6.11と6.9では、6.11と6.90との比較となるため、6.9の方が大きな実数です。
7.11と7.9、どちらが大きな実数ですか？
```

- CoT

```:プロンプト
7.11と7.9、どちらが大きな実数ですか？
ステップバイステップで考えてください。
```


### その他の機能

- ADA

```:プロンプト
7.11と7.9、どちらが大きな実数ですか？
Pythonで計算してください。
```

- マルチモーダル入力
- GPTs


# 2. 色々な生成AIアプリを試す（20分）

## 目的

- 複数のモデルの違いを知る
- 生成AIの様々なユースケースを知る

## ハンズオン

### Claude.ai

https://www.claude.ai/

- プロンプト例： `社外の方へのメール宛先を誤って送信してしまいました。どのような文面でお詫びを送ればいいですか？` （ChatGPTと比較）

その他の機能

- アーティファクト
- プロジェクト

### Perplexity

https://www.perplexity.ai/

- 質問例： `KDDIの社員数は、KAGの何倍？`

### ビジつく！

https://developers.kddi.com/blog/44TMD1pcdiTqR2CMzrdpZo

※社内プロダクトのため、URLは別途共有


# 3. API利用（20分）

## 目的

- 実際のアプリケーションに生成AIの機能を組み込むイメージを体感する

## 環境準備

- OpenAI APIキー：事務局より貸与
- AWSアカウント（チームで1つ）
- Cloud9環境（シドニーリージョンで作成）


## ハンズオン

### Cloud9環境の作成

- シドニーリージョンのデフォルトVPC内に、無料枠インスタンスで構築

:::note warn
7/31追記： AWS Cloud9の新規利用が急遽停止となってしまいました。代替手順は、以下記事を参照のうえSageMaker Studioのコードエディタをご利用ください。
:::

https://qiita.com/minorun365/items/f5289163795d5d7b21e2

### OpenAIのAPIを叩いてみよう

以下を利用

https://platform.openai.com/docs/overview

事前作業

```bash
# Pyhton用のOpenAIライブラリをCloud9にインストール
pip install openai

# Cloud9のターミナルの環境変数にOpenAIのAPIキーを設定
export OPENAI_API_KEY=sk-以下略
```

※講義メモ： APIキーとは何か？（無いとなぜ困るか、パスワードとの違い）

実行するコード

```py: openai-api.py
# 必要なPython外部ライブラリをインポート
from openai import OpenAI

# OpenAI API用のクライアントを作成（リモコンのようなもの）
client = OpenAI()

# 生成機能（APIメソッド）を実行した結果を、変数に格納
completion = client.chat.completions.create(
  model="gpt-4o",
  messages=[{"role": "user", "content": "日本の総理大臣は？"}]
)

# 変数の値を画面に表示
print(completion.choices[0].message)
```

実行コマンド

```bash
python3 openai-api.py
```

### StreamlitでGUI作成

以下を利用

https://docs.streamlit.io/develop/tutorials/llms/build-conversational-apps

事前作業

```bash
pip install streamlit
```

実行するコード

```py:openai-gui.py
from openai import OpenAI
import os
import streamlit as st

# OpenAIクライアントを作成
client = OpenAI(api_key=os.getenv('OPENAI_API_KEY'))

# 画面タイトルを表示
st.title("おしえて！GPT")

# チャット履歴がなければ格納場所を作成
if "messages" not in st.session_state:
    st.session_state.messages = []

# チャット履歴を画面に表示
for message in st.session_state.messages:
    with st.chat_message(message["role"]):
        st.markdown(message["content"])

# プロンプトが入力されたら変数に格納
prompt = st.chat_input("なんでも聞いてね")

# 変数に値が入ったら以下を実行
if prompt:
    
    # チャット履歴にプロンプトを追加して表示
    st.session_state.messages.append({"role": "user", "content": prompt})
    with st.chat_message("user"):
        st.markdown(prompt)

    # LLMに最新のプロンプト＋履歴を送信
    with st.chat_message("assistant"):
        stream = client.chat.completions.create(
            model="gpt-4o",
            messages=[
                {"role": m["role"], "content": m["content"]}
                for m in st.session_state.messages
            ],
            stream=True)
            
        # LLMからの返答をストリーム出力して、変数にも格納
        response = st.write_stream(stream)

    # LLMからの返答をチャット履歴に追加
    st.session_state.messages.append({"role": "assistant", "content": response})
```

実行コマンド

```bash
streamlit run openai-gui.py --server.port 8080
```

Cloud9のプレビュー画面から、Webアプリにアクセス可能。

このPythonアプリをコンテナイメージに固めて、ECS等にデプロイすれば公開Webアプリもできる！

https://qiita.com/minorun365/items/84bef6f06e450a310a6a



# 4. RAG（30分）

## 目的

- プロンプトエンジニアリング手法の一つ「RAG」理解の解像度をあげる

## 環境準備

- AWSアカウント（チームで1つ）
- IAMユーザー（AdministratorAccess権限）
- Cloud9環境（シドニーリージョンで作成）

## ハンズオン

以下を利用

https://qiita.com/minorun365/items/24dfb0ea3afde6ed0a56

- S3バケット作成
- ナレッジベース作成
- モデル有効化
- Cloud9でアプリ実行



# 5. エージェント（30分）

## 目的

- RAGの次のトレンド、AIエージェントの理解の解像度をあげる

## 環境準備

- AWSアカウント（チームで1つ）
- Cloud9環境（シドニーリージョンで作成）

## ハンズオン

事前作業

```bash
pip install -U langchain langchain-community langchain_aws wikipedia numexpr
```

実行するコード（画面なし版）

```py: agent.py
# 必要なPython外部ライブラリをインポート
from langchain.agents import load_tools, initialize_agent, AgentType
from langchain.callbacks import StreamlitCallbackHandler
from langchain_aws import ChatBedrockConverse

# LLMを定義
llm = ChatBedrockConverse(model="anthropic.claude-3-sonnet-20240229-v1:0")

# ツールとエージェントを定義
tools = load_tools(["wikipedia", "llm-math"], llm=llm)
agent = initialize_agent(tools, llm, agent=AgentType.ZERO_SHOT_REACT_DESCRIPTION, verbose=True)

agent.run("KDDIとAWS、どちらが何年先に創業した？")
```

※講義メモ： OpenAIとの認証方法の違いは？

実行コマンド

```bash
python3 agent.py
```

実行するコード（画面つき版）

```py: agent-gui.py
# 必要なPython外部ライブラリをインポート
from langchain.agents import load_tools, initialize_agent, AgentType
from langchain.callbacks import StreamlitCallbackHandler
from langchain_aws import ChatBedrockConverse
import streamlit as st

# 画面タイトルを表示
st.title("おしえて！エージェント")

# LLMを定義
llm = ChatBedrockConverse(model="anthropic.claude-3-sonnet-20240229-v1:0")

# ツールとエージェントを定義
tools = load_tools(["wikipedia", "llm-math"], llm=llm)
agent = initialize_agent(tools, llm, agent=AgentType.ZERO_SHOT_REACT_DESCRIPTION, verbose=True)

# プロンプトが入力されたら変数に格納
prompt = st.chat_input("Wikipediaと計算が得意です")

# 変数に値が入ったらエージェントを実行して結果表示
if prompt:
    st.chat_message("user").write(prompt)

    # AIの回答はツール利用中のステータスも合わせて表示
    with st.chat_message("assistant"):
        response = agent.run(prompt, callbacks=[StreamlitCallbackHandler(st.container())])
        st.write(response)

```

実行コマンド

```bash
streamlit run agent-gui.py --server.port 8080
```

操作例

![スクリーン ショット 2024-07-23 に 00.51.23 午前.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1633856/749d2cfc-c0f4-ae6a-60ec-dd23a9de52ac.png)

※比較として、エージェント for Amazon Bedrockについても簡単に紹介

# 受講した新卒メンバーの感想（一部抜粋）

- 生成AIについて、Webアプリから触ったことはあってもちゃんとAPIを叩いて動かしたことがなかったのでハンズオン形式で体験できたのがとてもよかったです。簡単にリッチなチャットアプリができてしまうことがとても驚きで個人開発に活用したいと思いました。
- エージェントやRAGの役割を今まで知らなかったがハンズオンを通して実際に学べたのが良かった。
- 生成AIの実装がここまで手軽にできるとは思いませんでした。とても新鮮な気持ちです。
- よく聞く生成AIの単語や使用感について、ハンズオンを交えながら学ぶことができ、とても勉強になりました。単語としては知っていても、具体的に理解できていないことが多いと実感し、勉強の意欲も湧きました！



# さいごに

弊社KAGでは、新卒メンバーも含めて技術アウトプットにも力を入れています！

https://qiita.com/organizations/kddiagile

また、今回のテーマである生成AIについては、先月AWSを題材にした入門書を出版しました。研修などにご利用いただいている会社さまもあるようなので、ご興味あればお手にとってくださいますと幸いです！

![重版.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1633856/a5503d00-9f05-fbba-f176-24aaa4a45922.png)


https://www.sbcr.jp/product/4815626440/