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

ニュース

今回は
まだ活用できていない人のための
大規模言語モデルについてです


解説動画はこちら



最近流行の大規模言語モデルについての概要と
コード生成での活用方法についてです


大規模言語モデルとは

英:large language model
日:大規模言語モデル

多数のパラメータを持つ
ニューラルネットワークで構成される
コンピュータ言語モデルのこと

自然言語処理分野のさまざまなタスクで
優れた性能を発揮し 世の中の一般知識や
訓練中の事実を記憶することができるため
さまざまな自然言語タスクに応用することができる
というものです。

LLMの作成には大量のテキストデータで事前訓練が行われ
高品質な言語データは数兆語に及ぶと推定されています


現在の主流は
・巨大テキストデータセットを用いた、事前学習(Pre-Training)
・性能を最適化する、微調整(Fine-Tuning)
の2段階のプロセスで構成されています。

自社でLLMを活用する際は学習データを用意して
ファインチューニングを行い
業務に最適化させる必要があります。


大規模言語モデル(LLM)の種類

GoogleのBERTやLaMDA
ChatGPTに用いられているGPT-4
新興系だとAnthropicのClaudeなどがあります

その他、2023年現在では
様々な言語モデルが登場しています。



大規模言語モデル(LLM)の活用方法 

LLMの活用は
指示を送る入力文(プロンプト)の
エンジニアリング次第です

ここからはコード生成における
プロンプトエンジニアリングの
ベストプラクティスをお送りします

・ベストプラクティス

「命令文」「制約条件」「入力文」の
3構成に分けそれぞれで詳細な設定を行う

ここからは詳細なプロンプトの書き方を
説明します。

1.プロンプトの最初に指示を書く

役割や目的を明示しておくと良いでしょう

例:
あなたはFlutterで開発をしているプログラマーです
以下の条件でコードを修正してください

2.区切り文字を使用する

例:
# 命令書
・・・・・・・・

# 条件
・・・・・・・・


3.前提条件(制約)を指定する

使用できるライブラリや変数名を
細かく指定するとうまく行く確率が上がります

例:
#条件
・bodyにリストビューを追加する
・リスト表示用のデータはxxxを使用する
・・・・



4.出力形式を追加する

XXXメソッドの部分を直す等
細かく指定するほど出力される
コードの精度も上がるようです

例:
#条件
・XXメソッドの戻り値を文字列に変更する
・・・・

5.コードを入力する

コードを修正してもらいたい場合は
修正対象のコードをそのまま入力します

例:
#以下はflutterのコードです
・・・・
・・・・・

コピペしましょう



LLMを活用するための便利なツール

・OpenAI:ChatGPT
・Bing:AIチャット
・Google:Bard
・Anthropic:Claude

など、現在では使用できるLLMサービスが複数あります
一個一個使用するのは面倒くさかったりもするので
一気にまとめてプロンプトを投げられる
ツールが有ります。

「ChatHub」

Google Chromeのプラグインになるので
Google webstoreなどからインストール出来ます。

使用感は動画の方を見ていただければと思います。


今回はLLMとその活用方法について
お伝えしました。

コード作成がめちゃくちゃ捗るので
活用しない手は無いですね

是非色々活用してみて下さい
それでは。

今回は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業界の標準言語に置き換わって行くのか?
これからの開発を待ちたいと思います


それでは
 

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

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


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

今回は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を
取り上げてみました
それでは

このページのトップヘ