自社の新卒メンバー向け研修コンテンツの一部となります。
特に隠す内容もないので公開します。(口頭フォロー前提のため、記載荒い点はご容赦ください)
これは何?
- アジャイル開発の会社における、エンジニア&デザイナー共通の新卒研修、うち技術各論編の一つ「生成AI」テーマのハンズオンパートの教材です
- このハンズオンの前段に講義編があります
- 2hぐらいで実施する想定
- 受講メンバーはオンサイトでペアを組み、相互フォローしながら実施してもらいます
1. プロンプトエンジニアリング(20分)
目的
- 自然言語のプロンプトだけで、どこまで生成AIへ高度な仕事を任せられるかを学ぶ
ハンズオン
ChatGPTを利用
以下を抜粋して実施
- 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、どちらが大きな実数ですか?
- マルチモーダル入力
- GPTs
2. 色々な生成AIアプリを試す(20分)
※残り時間によっては、この項は後回しにする予定
目的
- 複数のモデルの違いを知る
- 生成AIの様々なユースケースを知る
ハンズオン
Claude.ai
- プロンプト例:
社外の方へのメール宛先を誤って送信してしまいました。どのような文面でお詫びを送ればいいですか?
(ChatGPTと比較)
その他の機能
- アーティファクト
- プロジェクト
Perplexity
- 質問例:
KDDIの社員数は、KAGの何倍?
ビジつく!
※社内プロダクトのため、URLは別途共有
3. API利用(20分)
目的
- 実際のアプリケーションに生成AIの機能を組み込むイメージを体感する
環境準備
- OpenAI APIキー:事務局より貸与
- AWSアカウント(チームで1つ)
- Cloud9環境(シドニーリージョンで作成)
ハンズオン
Cloud9環境の作成
- シドニーリージョンのデフォルトVPC内に、無料枠インスタンスで構築
OpenAIのAPIを叩いてみよう
以下を利用
事前作業
# Pyhton用のOpenAIライブラリをCloud9にインストール
pip install openai
# Cloud9のターミナルの環境変数にOpenAIのAPIキーを設定
export OPENAI_API_KEY=sk-以下略
※講義メモ: APIキーとは何か?(無いとなぜ困るか、パスワードとの違い)
実行するコード
openai-api.py
# 必要なPython外部ライブラリをインポート
from openai import OpenAI
# OpenAI API用のクライアントを作成(リモコンのようなもの)
client = OpenAI()
# 生成機能(APIメソッド)を実行した結果を、変数に格納
completion = client.chat.completions.create(
model="gpt-4o-mini",
messages=[{"role": "user", "content": "日本の総理大臣は?"}]
)
# 変数の値を画面に表示
print(completion.choices[0].message)
実行コマンド
python3 openai-api.py
StreamlitでGUI作成
以下を利用
事前作業
pip install os streamlit
実行するコード
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})
実行コマンド
streamlit run openai-gui.py --server.port 8080
Cloud9のプレビュー画面から、Webアプリにアクセス可能。
このPythonアプリをコンテナイメージに固めて、ECS等にデプロイすれば公開Webアプリもできる!
4. RAG(30分)
目的
- プロンプトエンジニアリング手法の一つ「RAG」理解の解像度をあげる
環境準備
- AWSアカウント(チームで1つ)
- IAMユーザー(AdministratorAccess権限)
- Cloud9環境(シドニーリージョンで作成)
ハンズオン
以下を利用
- S3バケット作成
- ナレッジベース作成
- モデル有効化
- Cloud9でアプリ実行
5. エージェント(30分)
目的
- RAGの次のトレンド、AIエージェントの理解の解像度をあげる
環境準備
- AWSアカウント(チームで1つ)
- Cloud9環境(シドニーリージョンで作成)
ハンズオン
事前作業
pip install langchain langchain-community langchain_aws wikipedia numexpr
実行するコード(画面なし版)
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",
region_name="us-east-1"
)
# ツールとエージェントを定義
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との認証方法の違いは?
実行コマンド
python3 agent.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",
region_name="us-east-1"
)
# ツールとエージェントを定義
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)
with st.chat_message("assistant"):
response = agent.run(prompt, callbacks=[StreamlitCallbackHandler(st.container())])
st.write(response)
実行コマンド
streamlit run agent-gui.py --server.port 8080
操作例
※比較として、エージェント for Amazon Bedrockについても簡単に紹介
さいごに
弊社KAGでは、新卒メンバーも含めて技術アウトプットにも力を入れています!
また、今回のテーマである生成AIについては、先月AWSを題材にした入門書を出版しました。研修などにご利用いただいている会社さまもあるようなので、ご興味あればお手にとってくださいますと幸いです!