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

プログラミング

今回は最近発表された大規模言語モデル
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を初めとした
大規模言語モデルの開発が進んできています

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

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

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

今回はAI/機械学習に特化した
新プログラミング言語
「Mojo」を取り上げてみました


解説動画はこちら




Mojo言語とは

Python言語をベースにした
パフォーマンスやデプロイ問題を解決した
新しいプログラミング言語で
Python言語の拡張版のような位置付け

Python++ みたいな感じでしょうか



Python言語の利点、欠点

・Pythonの利点
読みやすい、覚えやすい
有能なライブラリが豊富で
機械学習のための標準言語になっているのが
大きな利点です


・Pythonの欠点
遅い、とにかく遅い
(現在でもCやRustなどを併用する方法も有るが
他の言語も学ばないといけない)

ライブラリの依存性問題がある

かなり致命的とも言える欠点があります



Mojo言語の特徴

Pythonエコシステムと互換性がある
(まだ未完成な所が残っているっぽい)

コンパイル型言語である
(ライブラリの依存関係問題も解決される)

関数を作成する際に「def」の代わりに
「fn」を使用してより高速な「モード」を選択できる

「class」の代わりに「struct」を使用すると
ポインタを追いかけ回すことなく
データ構造で使用することができる

C言語並に高速なコードが
Pythonコードを少し変更するだけで
書けてしまうっぽい

まだまだ特徴は有りそうですが
全部を理解するには時間が掛かりそうです



Mojo言語のメリット

TensorFlow や PyTorch などの
機械学習フレームワークがC++ で実装されているが
これを1つの言語に置き換えられる可能性があります

デプロイ時にコンパイルされたファイルを使用するので
依存関係を気にする必要が無くなる可能性があります


とにかく速いらしいです!!

ベンチマークでは35000倍高速化出来たとか・・・
本当ならMLOpsが超はかどるでしょうね


Mojo言語のまとめ

Pythonと互換性が有って
高速で動作し、デプロイも楽になる
夢のようなプログラミング言語が開発中

ただし、Get start で申し込んでも waitlist で
待ち状態のため実際に使えないから
確認は出来ていない状況です

今後のML業界の標準言語に置き換わって行くのか?
これからの開発を待ちたいと思います


それでは
 

今回はAmazonからリリースされた
コーディング支援ツール
Amazon CodeWhispererを試していきたいと思います


解説動画はこちら




さてこのツールですが
Amazonからリリースされた
コーディング支援ツールになっていて
個人なら無料で使えそうです

VSCodeなどのIDEで利用可能です
Pythonを初めとした
たくさんの言語で使えるみたいです


CodeWhispererを使えるようにする方法

1.VSCodeのインストール

MSのサイトからインストールしましょう

2.Amazon Toolkitのインストール

VSCodeの拡張機能から
インストール出来ます

3.DEVELOPER TOOLSの起動

画面左のDEVELOPER TOOLSから
CodeWhispererの所にある
Startをクリックしてください

4.ビルダーIDの登録

英語で「ビルダーIDでサインイン」が
を選択出来るので、そこから出てくる
ポップアップのコードをコピーします

5.Eメールで登録

AmazonのWEBサイトで登録を行う形になります

Eメールを入力すると確認コードが飛んでくるので
それとパスワードなどを入力して登録します

登録できたら使える様になります


Amazon CodeWhispererの使い方

使い方はとても簡単で

コード上でコメントに
入力してもらいたいコード内容を
文章で入力してエンターキーです

コードが推薦されるので
タブキーで確定します

これだけです

あとは使ってみましょう

使っている様子は
動画から確認する事ができますので
使い勝手を見てみて下さい

ChatGPTに加えて
コーディングもAI活用で
かなり捗るのではないかと思いますので
なかなか面白いですね

これからもこういうツール系は
たくさん試してみたいと思います

それでは

今回は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でノーコードプログラミングを
試してみました

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

Twitter社のソースコードが公開されたので
早速覗いてみました

解説動画はこちら


 
Twitter社のソースコードが
Githubにオープンソースとして公開されましたね

Twitterのgithub

今回公開されたのは
レコメンドアルゴリズム
だそうです

自分もフリーランスで
レコメンドエンジンを開発したりしていますが
非常に興味深いものです

今回は彼らの技術ブログの内容も併せて
解説していきたいと思います
Twitterの技術ブログ



レコメンドアルゴリズム

公式ブログによれば
「おすすめ」タイムラインに表示されるツイートは
次の3段階のプロセスを経て決定されているようです

system-diagram

1.Fetch the best Tweets from different recommendation sources in a process called candidate sourcing.

2.Rank each Tweet using a machine learning model.

3.Apply heuristics and filters, such as filtering out Tweets from users you’ve blocked, NSFW content, and Tweets you’ve already seen.

1.`candidate sourcing`と呼ばれる機能で
様々な基準から個人に対して
最適なツイート候補を抽出する

2.機械学習モデルによって
それぞれのツイート候補をランク付けする

3.有害なツイートを除外したりする
フィルタリングを行なって出力候補を決める


この辺りは一般的なレコメンドエンジンにも
適用出来る内容であるかなと思います



それぞれの詳細を見ていきましょう



1.ツイート候補の抽出

Twitter自体はすごいユーザー数がいます
その中からユーザーにとって最適なツイートを
表示させるのは大変です

そこでまず初めにツイート全体から
各個人への候補を絞り込みが行われています


この機能では数億のツイートから
1500ツイートが抽出されているようです

・フォローしているユーザー(ネットワーク内)から50%
・フォローしてないユーザー(ネットワーク外)から50%

ネットワーク内のソースは
Real Graph(リアルグラフ)と呼ばれる
ユーザー間のエンゲージメントを予測するモデルで
計算されているようです

このReal Graph が高いほど
より多くツイートが候補に含まれるようです


次にネットワーク外のソースは
Social Graph(ソーシャルグラフ)と
Embedding Spaces(埋め込みスペース)
と呼ばれるアプローチ方法を採用しているようです


Social Graph(ソーシャルグラフ)は
フォローしている人々が最近エンゲージしたツイート
似たツイートを気に入った人は誰か、というような
計算されたツイート候補を生成しています(15%)


Embedding Spaces(埋め込みスペース)

ユーザーの関心とツイートコンテンツの
類似性を計算したものです


SimClusters:
行列分解アルゴリズム
(custom matrix factorization algorithm)

ユーザーとツイートをコミュニティ空間で表現し
ユーザーは複数のコミュニティに属する
各コミュニティでのツイートの
現在の人気度を調べて結果を埋め込むようです

これらのアルゴリズムを用いて
ツイート候補を絞り込みするのが第一段階です



2.機械学習モデルのランク付け

HEAVY RANKER と呼ばれる
ニューラルネットワークで構成された
スコア計算機を使っています

前段から抽出したデータを基にした特徴量や
重み付の設定からツイートのスコアを計算しています

現在の重み付けとしては
scored_tweets_model_weight_fav: 0.5
scored_tweets_model_weight_retweet: 1.0
scored_tweets_model_weight_reply: 13.5
scored_tweets_model_weight_good_profile_click: 12.0
scored_tweets_model_weight_video_playback50: 0.005
scored_tweets_model_weight_reply_engaged_by_author: 75.0
scored_tweets_model_weight_good_click: 11.0
scored_tweets_model_weight_good_click_v2: 10.0
scored_tweets_model_weight_negative_feedback_v2: -74.0
scored_tweets_model_weight_report: -369.0

「いいね」される:0.5
ツイートをリツイートされる:1.0
ツイートを開き、リプライまたは「いいね」される:13.5
プロフィールを確認し、ツイートにまたは「いいね」される:12
リプライに対し、投稿者によって返信または「いいね」またはリツイートされる:75
「このツイートに興味がない」ブロックまたはミュートされる:-74
「ツイートを報告」される:-369

という形で指定されている様です
この辺りも日々変わっているようでが
これらを加味して `0-1` のスコアを計算しています

3.フィルタリング


ツイート候補のスコア付を行ったら
最後にフィルタリングを行って
最終的な出力ツイートを選出します

home-mixer と呼ばれる
Scalaで書かれたシステムによって
最終候補が決定されています

次のようなフィルタリングが行われているっぽいです

Author Diversity
Content Balance (In network vs Out of Network)
Feedback fatigue
Deduplication / previously seen Tweets removal
Visibility Filtering (blocked, muted authors/tweets, NSFW settings)

著者の多様性
コンテンツ バランス
(ネットワーク内 vs ネットワーク外)
フィードバック疲労
重複除去 / 以前に見たツイートの削除
可視性フィルタリング
(ブロック、ミュートされた作成者/ツイート、NSFW 設定)


主に出力されるツイートのバランスを保ち
見たくないツイートの除外を行なっています



おすすめに載るポイント


ソースから見える、スコアリングの仕組みや
フィルタリングの仕組みから
おすすめに載るポイントとなる点を挙げてみました

この辺りも本日現在のものになり
日々更新されるものなので
最近版はソースを見て下さいね


・フォロー数とフォロワー数の比率

フォロワー数 < フォロー数 は
低く評価される仕組みの様です

フォロワーを増やすか
フォロー数を減らすしかないですね
ExtractTweepcred.scala
reduce pagerank for users with low followers compared to number of followings


・Twitter Blueへの加入

課金ユーザーはフォロワーの「おすすめ」タイムラインで 4倍
非フォロワーのタイムラインでは 2倍 のブーストされるようです

課金しろってことですね
HomeGlobalParams.scala

object BlueVerifiedAuthorInNetworkMultiplierParam
      extends FSBoundedParam[Double](
        name = "home_mixer_blue_verified_author_in_network_multiplier",
        default = 4.0,


object BlueVerifiedAuthorOutOfNetworkMultiplierParam
      extends FSBoundedParam[Double](
        name = "home_mixer_blue_verified_author_out_of_network_multiplier",
        default = 2.0,

・リプライされる

現在のスコア計算の重み付けより
リプライ の重み付けが高いです

リプライされる様なツイートしましょう


・画像や動画をつける

画像や動画などのメディアを含むツイートは
通常のツイートと比較して 2倍 のブースト

画像を付けると良いですね
RelevanceSearchUtil.scala

      tweetHasImageUrlBoost = 2.0,
      tweetHasVideoUrlBoost = 2.0,


・ツイートの評価は時間が経つと下がる仕組み

次の様なソースコードがあります
ranking.thrift

struct ThriftAgeDecayRankingParams {
  // the rate in which the score of older tweets decreases
  1: optional double slope = 0.003
  // the age, in minutes, where the age score of a tweet is half of the latest tweet
  2: optional double halflife = 360.0
  // the minimal age decay score a tweet will have
  3: optional double base = 0.6
}(persisted='true')

360分(6時間)経つとhalflife
ツイートの寿命のようなものが減る様です

なので常に呟いているのが
良いんじゃないかと思います

なお呟きすぎても
同じユーザーのツイートは
除外される仕組みでは有るので
程々にでしょうね


Twitterのような大企業の
ソースコードが垣間見えるのは
我々一般ユーザーにとっても
なかなか興味深いですね

読み込めばもっと
ツイッター攻略出来るかもしれません


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

このページのトップヘ