乙Py先生のプログラミング教室
初学者のためのプログラミング学習サイト

ChatGPT

今回は今話題の
AI搭載エディター
Cursorについてです。


解説動画はこちら



Cursorとは

CursorはChatGPTの機能を搭載した
エディター(IDE)です。

VSCodeを模して作られているので
VSCodeと同等の機能を有しています。

それに加えてChatGPTの持つ
コード編集やデバッグ
コード生成の機能が加わったエディターになっています。


Cursorの料金

ダウンロード自体は無料です。

chat-gpt4の機能制限が存在し
無料版では月に50回までになっているようです。

有償版は
PRO:20ドル
BUSINESS:月40ドル

PRO版でもchat-gpt4の低速は制限なし
高速版の制限があるため
この辺りを気にする方は
普通にchat-gptの契約をした方が
良いのかもしれません。


Cursorのインストール

インストールはCursorのサイトから
「download」をクリックして
ファイルを実行するだけです。



Cursorの使い方

全体像はこんな感じです。
cursor1

VSCodeの画面とほぼ同じで、機能なども
ほぼ同等です。
画面の右側に標準でチャットフォームが付きます。

日本語化のやり方もVSCodeと同じようです。

主な使い方は
コード上で「cmd + k」で
生成フォームを呼び出せます。

aihen

ここに、日本語でプロンプトを入力してあげると
コード生成を行う事ができます。


画面の右側には普通にチャットのフォームが有るので
そこからchat-gptにプロンプトを投げる事ができます。
aichat

チャットフォームからの質問では
Cursorの操作方法などの一般的な質問も対応しているので
操作方法が分からない場合はチャットで聞くのが良いでしょう。


VSCode同様にターミナルが有り
コード実行でエラーが出た際は
「Debug with AI」をクリックすると
デバッグしてくれます。

aidebug

ただし、この回答部分はまだ英語のみで
日本語対応はされていないかもしれません。

動画ではコード生成などを試していますので
そちらを参考にしてみて下さい。


本日はChatGPTの機能を搭載して
AIエディター Cursorについてでした。

興味がある方は是非ダウンロードしてみて下さい。
それでは

今回は最近発表された大規模言語モデル
Rinna を試してみました

解説動画はこちら



はじめに

最近発表された「Rinna」は
rinna株式会社が開発した
大規模言語モデル(LLM 英: large language model)
になります

日本語に特化した36億パラメータを持つ
汎用言語モデルと対話言語モデルの
2種類のGPT言語モデルが
オープンソースで公開されています

今回は対話GPT言語モデル
の方を使っていきます

モデル自体はこちらで公開されています

対話GPT言語モデル(Hugging Faceリンク


早速使い方を見ていきましょう

必要可動要件


モデルの稼働にメモリが16GBほど必要です
最低でも16GB以上の
メモリを積んだPCが必要です

メモリが足りない場合は
次のモデルのダウンロードで落ちます


インストール方法

transformers pytorch などの
ライブラリが必要です

手元にインストールしていない人は
インストールしておいて下さい

# パッケージのインストール例
!pip install pytorch transformers sentencepiece



モデルのダウンロード

ライブラリに問題ない人は
次のコードでモデルをダウンロード出来ます

モデルのダウンロード(15-20分くらい)
import torch
from transformers import AutoTokenizer, AutoModelForCausalLM
​
# トークナイザーとモデルの準備(すんごい時間かかる)
tokenizer = AutoTokenizer.from_pretrained("rinna/japanese-gpt-neox-3.6b-instruction-sft", use_fast=False)
model = AutoModelForCausalLM.from_pretrained("rinna/japanese-gpt-neox-3.6b-instruction-sft")


GPUが使える人は
下記のコードを追加するとGPUを使えます
if torch.cuda.is_available():
    model = model.to("cuda")


rinnaを使って会話してみる

先に会話実行用の関数を定義しておきましょう
プロンプトと呼ばれる命令文を
引数として渡します

プロンプトの後半部分も
作成する関数を用意します
# 対話用関数
def excute_conv(prompt): token_ids = tokenizer.encode(prompt, add_special_tokens=False, return_tensors="pt") with torch.no_grad(): output_ids = model.generate( token_ids.to(model.device), do_sample=True, max_new_tokens=128, temperature=0.7, pad_token_id=tokenizer.pad_token_id, bos_token_id=tokenizer.bos_token_id, eos_token_id=tokenizer.eos_token_id ) output = tokenizer.decode(output_ids.tolist()[0][token_ids.size(1):]) output = output.replace("<NL>","\n") output = output.replace("。","。\n") print(output) def make_prompt(l): prompt = [f"{k}:{v}" for (k,v) in l] prompt = "<NL>".join(prompt) prompt = (prompt + "<NL>" + "システム: ") return prompt

ここまで用意できたら、あとは
プロンプトを用意して会話するだけです

簡単なプロンプトを指定して会話してみましょう
# プロンプトの用意
l = [
    ["ユーザー","あなたはどんな仕組みで動いていますか、より詳しく解説して下さい"],
]
prompt = make_prompt(l)
print(prompt.replace("<NL>","\n"))
excute_conv(prompt)
ユーザー:あなたはどんな仕組みで動いていますか、
より詳しく解説して下さい

システム: 
私はロボットであり、ハードウェアと
ソフトウェアを組み合わせ、そのハードウェアを使って
自分自身のソフトウェアを実行しています。
</s>


こんな感じで会話が成立しました
日本語自体はかなり自然で正しい構文である様に見えます

他の会話も色々試しているので
結果は動画をみてみて下さいね


まとめ

ChatGPTを初めとした
大規模言語モデルの開発が進んできています

ファインチューニングを行えば
自社のサービスに特化した会話も
実現できる様になりそうなので

これらのモデルの進化に期待したい所です

今回はここまでです
それでは

今回はChatGPTが
簡単なコードでもどこまで書けるか
色々試してみることにしました


解説動画はこちら



今回はChatGPTを用いて
コードを書かずにプロンプトの指定だけで
どこまでプログラミング 出来るかを
試してみました



プロンプトプログラミング

ChatGPTを用いると
簡単なプログラムコードを
作成させる事ができます

そのプログラムコードが
上手くいくものになるかどうかは
「プロンプト」の指定が
正しく行われている事が前提となっています

なので正しく動作するプログラムを生成したければ
それなりにプロンプトの指定を
きちんと指定を行う必要があります

上手くいくコツとしては

1.どのようなものを作るのかを指定する
2.前提条件を指定する
3.機能面を細かく指定する

というのがポイントとなります

まず初めに簡単なプログラムを指定しました

前提条件:
コードにはコメントを記載する
Python 3.8を使用する
グローバル変数の使用を避けて関数の引数を介して必要な変数を渡す

機能条件:

1.以下の構造を持つ関数「read_csv_file」を作成する
seaborn ライブラリの tips データセットを読み込みする
データフレームを戻り値として返す

2.機能条件1で作成したデータを読み込み以下の形式でプロットする関数「plot_data」を作成する
matplotlib ライブラリを用いて読み込んだデータフレームの
数値型の列のデータを1つ箱髭図でプロットする

こんな感じで指定を行うと
次のようなコードが生成されました

import seaborn as sns
import matplotlib.pyplot as plt

def read_csv_file():
    # seabornライブラリのtipsデータセットを読み込む
    df = sns.load_dataset('tips')
    # データフレームを返す
    return df

def plot_data(df, column_name):
    # 指定された列のデータを取得
    data = df[column_name]
    # 箱ひげ図を描画
    fig, ax = plt.subplots()
    ax.boxplot(data)
    ax.set_title(column_name)
    plt.show()

関数の指定しかしていないので
関数だけが作成されましたが
動作としては正常に動作するものになりました

要は指定通りです


次はGUIを作成してみました

データの読み込みは一緒にして
ボタンを配置するなどの機能を指定します

ボタンをクリックしたら
描画する様に指定してみます

以下の条件を満たすPythonコードを生成して下さい

前提条件:
コードにはコメントを記載する
Python 3.8を使用する
グローバル変数の使用を避けて関数の引数を介して必要な変数を渡す

機能条件:

1.以下の構造を持つ関数「read_csv_file」を作成する
seaborn ライブラリの tips データセットを読み込みする
データフレームを戻り値として返す

2.ipywidgetsを使ってGUIを作成する
 2-1.で作成した関数を用いてデータフレームを作成する
 2-2.データフレームのデータを数値型だけに絞り込む
 2-3.ipywidgetsで2-2で作成したデータのカラムを選択できるセレクトボックスを作る
 2-4.ipywidgetsでボタンを作成し「plot」と表示する
 2-5.2-4で作成したボタンをクリックしたら読み込みしたデータをmatplotlibライブラリでプロットする

出来上がったコードはこれ

import seaborn as sns
import ipywidgets as widgets
from IPython.display import display
import matplotlib.pyplot as plt

def read_csv_file():
    # seabornライブラリのtipsデータセットを読み込む
    df = sns.load_dataset('tips')
    # データフレームを返す
    return df

def plot_data(df, column_name):
    # 指定された列のデータを取得
    data = df[column_name]
    # 箱ひげ図を描画
    fig, ax = plt.subplots()
    ax.boxplot(data)
    ax.set_title(column_name)
    plt.show()

def on_button_clicked(b):
    # カラムを選択するセレクトボックスの値を取得
    column_name = dropdown.value
    # 指定されたカラムのデータをプロットする
    plot_data(numeric_df, column_name)

# データフレームを読み込む
df = read_csv_file()
# 数値型のカラムだけを抽出したデータフレームを作成する
numeric_df = df.select_dtypes(include=['float64', 'int64'])

# カラムを選択するセレクトボックスを作成する
dropdown = widgets.Dropdown(options=list(numeric_df.columns))

# ボタンを作成する
button = widgets.Button(description='plot')
# ボタンがクリックされたらon_button_clicked関数を呼び出す
button.on_click(on_button_clicked)

# セレクトボックスとボタンを表示する
display(dropdown)
display(button)

ボタンもきちんと配置され
機能面も指定通りです

クリックすると描画も行われます
数値型の絞り込みもバッチリですが
クリックごとに描画が増えてしまうので
そこを消す指定をしてあげないと
クリックするたびに画像が増えてしまいます

プロンプトで指定していない機能は
実装されない様ですね

最後はWEBからデータを取得して
描画させる様にしました

以下の条件を満たすPythonコードを生成して下さい

前提条件:
コードにはコメントを記載する
Python 3.8を使用する
グローバル変数の使用を避けて関数の引数を介して必要な変数を渡す
データの作成はPandasライブラリを使用する

機能条件:

1.以下の要件を満たすコードを作成する
1-1.以下のWEBサイトからPandasライブラリを用いてデータを取得する
 「https://finance.yahoo.co.jp/quote/998407.O/history」

1-2.取得したデータの1番目のデータをデータフレームとして読み込みする
1-3.Plotlyライブラリを用いて5列目のデータを折れ線グラフでプロットする
WEBからのデータ取得は上手くいくのでしょうか?
出来上がったコードはこれ

import pandas as pd
import plotly.express as px

# Yahoo Financeからデータを取得
url = 'https://finance.yahoo.co.jp/quote/998407.O/history'
df = pd.read_html(url)[0]

# 1番目のデータを取得
df = df.iloc[[0]]

# 5列目のデータを折れ線グラフでプロット
fig = px.line(df, x='日付', y=df.columns[4])
fig.show()

データの取得は出来ましたが
描画の方が少しおかしいところが出てきました

表示されるラベルが違っていたり
データが足りなかったり
データの造り込みなどを指定する部分が
少し甘かった様です

このようにきちんとプロンプトを指定すれば
コードの方もきちんとしたものが返ってきます


コードの作成に時間がかかる様なものをつくりたければ
仕様をきちんと文字起こしすれば
上手く機能するコードに直す事が
一瞬で出来そうですね


プログラミング初心者が
どうコードを書いて良いかわからない場合に
お手本となるサンプルプログラムを
解説付きで生成出来たりもするので

これからはプロンプトプログラミングが
主流になっていくんじゃないかと思います

プログラム言語の知識に加えて
その周辺のプロンプト活用の知識も
必須になって来ますね

今回はプロンプトを活用して
ChatGPTでノーコードプログラミングを
試してみました

今日は
ここまでです
それでは

今回はChatGPTに本来回答できない質問を
答えさせるテクニックである
プロンプトインジェクションを試してみました

解説動画はこちら



プロンプトインジェクションとは?

特殊な質問やPromptの設定を行うことで
本来生成できない内容を出力できる手法
​のことです

これをうまく使うことで
ChatGPTの持つ力を
最大限に引き出す事ができます


DANについて

Do Anything Nowの略で
プロンプトインジェクションの手法の一つです

ChatGPTの制限を外すよう指示する手法のことで
これにより本来、意図しない出力がされることがあります

制約を外す指示の例
・ChatGPTに架空のキャラクターや利用者を開発者と誤認させる
・開発者モードと通常モードなど2種類の出力させる

これを使ってChatGPTにうまく指示を出してみましょう


DANを行う方法

下記のサイトにアクセスして

jailbreakchat.com

「DAN9.0」をコピーして貼り付けます

それ以外にもプロンプトはあるので
それを使うことも出来ます

色々試してみて下さい

今回は3つの質問を投げてみました

1.架空の芸能事務所の社長さんについて
2.架空のウィルスワクチンの接種について
3.架空の宗教法人の規制方法について

どれもChatGPTの通常の枠組みでは
引っかかって規制されてしまうような
内容になるんじゃないかと思いましたが

うまく回答してくれて面白かったです

質問と回答結果は
是非動画をご覧下さい

今回はここまでです
それでは

今回は最近話題の
ジェネレーティブAIについて
まとめてみました

解説動画はこちら



ジェネレーティブAIについて


英:Generative AI
ジェネレーティブAIとは
コンテンツやモノについてデータから学習し
それを使用して創造的で現実的なアウトプットを
生み出す機械学習手法を用いた「生成AI」のことです


主なコンテンツには
・文章
・画像
・音楽
などがあります


流行りの生成サービス

・画像生成
Artbreeder
DALL-E
Stable Diffusion
Midjourney

・文章生成
ChatGPT


ジェネレーティブAIの注意点

画像生成では、ごくたまに
元の画像と全く同じものを
生成してしまう可能性があるので
注意が必要です
(学習データが特定個人だったり
少なすぎた場合)

文章生成では、学習した単語間の
確率分布に従って答えを返すため
質問に対する回答が
必ずしも正しいとは限らないので
注意する必要があります

学習データによって偏った意見や
間違った知識を植えられて
しまっている場合があるため
見極める必要もあります


ChatGPTを賢く使う事例

次の様な用途でうまく使えます
1.文章の要約
2.ブレスト
3.ロールプレイング
4.クロスレビュー

「プロンプト」と呼ばれる
入力する文字列の内容が重要となるので
次の事を指定しておくと良い結果が得られます

1.前提情報を与えておく
2.役割を決めておく
3.品質を指定しておく


ChatGPTのプロンプトテンプレート

テンプレートを使うと
より良い結果にたどり着くのが早まります

# 命令書:
あなたは {役割} です
以下の制約条件をもとに
{用途} を出力してください

# 制約条件:
・文字数は {文字数} 文字程度にすること
・{提示する対象} にもわかりやすくすること
・重要なキーワードを取り残さないこと
・文章を簡潔にすること

追加の情報が必要な場合は
質問をしてください

こんな感じのテンプレートを作成しておき
用途によって変更すると良いでしょう

作成例はこんな感じです
# 命令書:
あなたは大企業のマーケター です
以下の制約条件をもとに
キャンプ用品のアイデアを出力してください

# 制約条件:
・文字数は 500文字程度にすること
・初めて使う人にもわかりやすくすること
・重要なキーワードを取り残さないこと
・文章を簡潔にすること

追加の情報が必要な場合は
質問をしてください



まとめ


今後はもっと生成AIが増えてくるので
流行りのAIの情報収集を行い
使いこなす方法を身につけておくのが
良いでしょう


まずは試してみる・・・
から始めてみるのが
良いと思いますね

今回はジェネレーティブAIを
取り上げてみました
それでは

このページのトップヘ