さて､ JupyterLabのこのセッションは､ ついにベクトルを直接見ることができるということで､ 期待に胸を膨らませていることだろう｡
だから､ あなたが5週目のフォルダに入っていて､ 3日目に入っていて､ これまで以上に私についてきてくれることを願っている｡
今回はビジュアルが重要で､ 何が起こっているのかを実感できるだろうからね｡
だから､ これは前日の重複にさらに追加しただけだ｡
まずはインポートをいくつか用意し､ そのインポートにこれから取り組む特別なものを追加した｡
今日は
OpenAIのエンベッディングをインポートします｡ これはLang Lang chain OpenAIパッケージの一部です｡
ラングチェーンchromaからクロマをインポートする｡
t-SNEと呼ばれるものについてはこれから説明します｡
それからPlotlyのもので､ 素敵な図を作成することができます｡
インポートを全部やろう｡
よし､ 定数を調べてみよう｡
環境変数を持ってくる｡
もちろん､ これはもうお馴染みだろう｡
ナレッジベースを読み込むためにローダーを使っている｡
テキスト分割ツールを使ってチャンク（123個）を作っている｡
そして､ 契約､ 製品､ 従業員､ 会社の4つのフォルダごとにチャンクがある｡
そこで､ エンベッディングと自動エンコーディングLMSについて､ もう1度思い出していただきたいのですが､
これまでのコースのほとんどで､ 自動回帰LMSについてお話ししてきました｡
今回は､ 入力全体を受け取り､ それを使って1つの出力（この場合はベクトル）を作成するオートエンコーディングLMSについて初めて見ていく｡
そして､ 自動エンコーディングのアラームの例がバートだ｡
これからこれを使う｡
OpenAIのエンベッディング｡
それを実行しよう｡
オーケー｡
クロマはこれからクロマ・データ・ストアを作るところだ｡
そして､ もしすでにデータベースがある場合は､ 削除するか空にするために､ この小さなセクションをここに入れました｡
そうしないと､ このコードを実行するたびに､ また別のベクトルが追加され､ ある種の重複したベクトル・セットとなり､
混乱することになる｡
これはデータベースをリフレッシュするのに役立つ｡
すでに1度実行したことがある人なら想像がつくと思うが､ 私はすでに1度か2度実行しているので､ これは私にとって便利なものだ｡
削除します｡
このフォルダーの中にあるvector db umは､ DB名で､ DB名がvector DBであることを示すために一番上に設定した定数だ｡
SQLiteをベースにしている｡
この中に入ってみると､ SQLiteが使われているのがわかるだろう｡
つまり､ あなたが選んだデータベース名の中に､ さまざまなファイルが並んでいるだけなのだ｡
この場合はベクトルdb｡
それでは､ ベクターデータベースを作成し､ ベクターを入れてみましょう｡
そして､ 私はここでまたグラディオの瞬間を迎えることになる｡
ドキュメントの束をベクトル化し､ それをベクトル化してベクトル・データベースに保存するプロセスは､
それなりに高度なもので､ 少なくとも数セルは必要だと思うかもしれない｡
しかし､ もちろん､ 1つのセルで､ 1行のコードでできることがわかるだろう｡
そしてそれはもちろん､ ラング・チェインが素晴らしいグルーコードをたくさん用意してくれたおかげだ｡
手作業でそれを繰り返し､ それぞれの埋め込みを､ それぞれのチャンクをベクトルに変換し､
それをクロマに保存するのは､ 実際にはそれほど難しいことではない｡
うーん､ でも､ こうやってひとつにまとめられたら､ もっとシンプルになるよね｡
そして､ これのもうひとつの素晴らしいところは､ 別のベクター・データ・ストアを試してみても､
ラング・チェーンからインポートされた別のベクター・ストアを使うだけで同じことができるということです｡
でも､ この1行を走らせてみたら走った｡
そして､ ベクターストアは123のドキュメントで作られている｡
123個のチャンクがあったのだから｡
だから､ ベクター・データ・ストアに同じ数のドキュメントがあるのはいいことだ｡
Chromeを作成して戻ってきたベクターストアオブジェクトに､
チャンク､ 埋め込み（OpenAIの埋め込み）､ そしてデータベース名を渡しました｡
この3つは私たちが提供したもので､ まったく理にかなっている｡
ベクターストアを作るために必要なことはこれだけだ｡
そして､ このベクターストアは､ underscore collection dot countを呼び出して､ ベクターストア内のドキュメント数を取得することができる｡
そこで､ これらのベクトルが何次元かを調べ､ これでコレクションからベクトルを取得できるようにしよう｡
つまり､ このアンダースコア・コレクションをベクター・ストアから呼び出すと､ コレクションが生成されます｡
そこでドットゲットを呼び出せばいい｡
制限内でパスできる｡
欲しいのは1つだけだ｡
ベクトルそのものであるエンベッディングを持ち帰らせたいのだ｡
その大きさを見てみよう｡
寸法は1536｡
つまり､ 1536の数字がこの塊を構成している｡
では､ これを印刷できるように自分で見てみよう｡
埋め込みのサンプルを印刷してみましょう｡
すごい｡
たくさんの数字だ｡
つまり､ 数字の羅列だ｡
あなたや私にとっては無意味なことだ｡
ええと､ でもこの数字は何らかの形で
私たちは､ これらの数字が何らかの形で､ その数字に関連するチャンクの意味を反映していると見ている｡
いずれ分かることだ｡
すぐにチャンクと関連付ける｡
だから､ トンデモナイ数字なんだ｡
これは1536個の数字で､ 1536次元空間の座標を表していると解釈できる｡
そして､ その座標は､ ベクトル空間において近い位置にある､ 似たような座標を持つ他のベクトルが同じような意味を持つように選ばれている｡
それがこの構想のすべてだ｡
では､ ちょっとイメージしてみよう｡
そうすれば､ このようなコメントもなくなるだろう｡
これは､ 舞台裏で何が起こっているのかを本当に調査することができる､ 素晴らしい､ ええと､ ええと､ ええと､ いい方法になるだろう｡
だから､ Collectiongettyを呼び出して､ エンベッディング､ ドキュメント､ メタデータを求めることができる｡
それができたら､ ベクターを置くことができる｡
埋め込みをベクターの配列に入れ､ docタイプをdocタイプというものに入れる｡
それから､ 見ての通り､ いくつかの色を作るつもりだ｡
だから､ これは準備のためのプレワークにすぎない｡
今ひとつ問題なのは､ 人間には3次元以上のものを視覚化する能力がないということだ｡
つまり､ 1536次元で何かを視覚化することは､ 実に難しいことなのだ｡
でも､ 幸運なことに､ 投影法とか､ 次元を2次元に縮小して､
多次元表現に忠実であるように､ 可能な限り物事を分離できるようにする方法とか､
いろいろなテクニックがあるんだ｡
だから､ これらすべての次元で離れているものを､ 2次元に投影してもまだかなり離れているようにしようとする｡
そういうことだ｡
そのためのテクニックはいろいろあるが､ ここでは割愛する｡
これはt-SNEと呼ばれるもので､ T-distributed Stochastic
Neighbor embeddingの略です｡
何次元がいい？
千差万別なものを二次元に投影してほしい｡
そしてこのランダム・ステートは､ ランダム・シードを設定する方法であり､ これを呼び出すたびに同じものが得られるので､
これを再現できる｡
そして､ このt-SNEオブジェクトのfit transformメソッドを呼び出すだけで､ 縮小されたベクトルを得ることができます｡
それから､ 素晴らしいライブラリplotlyを使って散布図を作っています｡
そして､ これはすべて､ コピー＆ペーストして好きなように再利用できるコードのようなものなんだ｡
でも､ ここで設定したドキュメントの種類によってマーカーの色を変えたり､
ポップアップ・テキストでチャンク自体の最初の100文字を表示させたりしています｡
つまり､ ここで見たいのは､ ベクター・データベースでドキュメントがどのように見えるか､ ということだ｡
そして､ これらの異なるベクトルそれぞれについて､ どのような文書であるかによって色分けする｡
そして､ テキストにカーソルを合わせる｡
だから､ このチャンクが表すテキストの断片を少し読むことができる｡
だから､ これがうまくいくかどうか見てみよう｡
それはとてもクールだ｡
もちろん､ 効果があることは知っている｡
もう試したよ｡
これだ｡
オーケー｡
では､ 私たちは何を見ているのか｡
つまり､ 私たちは多次元ベクトルを2次元に投影して可視化したものを見ているのであって､ X軸とY軸に特別な意味はない｡
いろいろなポイントを分散させる最善の方法なんだ｡
さて､ いくつか気になることがある｡
ここに見える緑の点は従業員を表している｡
赤い点がそれを表している｡
従業員というのは､ 従業員の文書から抜き出したテキストのかたまりという意味だ｡
赤いのは契約書から出てくるテキストの塊｡
青は製品ドキュメントから､ 黄色はアバウトなドキュメントから｡
さて､ OpenAIのエンベッディングは､ テキストの塊をベクトル化するときに､
ドキュメントタイプを知らなかった｡
メタデータは伝えていない｡
夏の従業員､ 夏の製品､ 夏の契約ということは伝えていない｡
テキストの塊を渡して､ これをベクターに変換してくれ､ と言っただけだ｡
それしかなかった｡
だから､ そのチャンクに基づいて､ これらのチャンクがベクトル空間で分離され､ 空間内の異なる領域を占めるというのは､
ある意味不思議なことなんだ｡
内容や象徴する意味という点では､
ある程度似ているからね｡
契約はこっちで､ 製品はこっちだ｡
契約情報の一部が､ 商品と同じ近辺にあるように見えるかもしれない｡
そして､ それは一瞬驚くかもしれない｡
何かが間違っているように見えるかもしれない｡
しかし､ そうではなく､ これらの塊にカーソルを合わせると､ これが契約書の特定のテキストの塊であり､
そのクライアントが契約した主な機能が記述されていることがわかる｡
そこにテキストを入力してください｡
2行目のテキストと書いてあるところにカーソルを合わせると､ それがベクター空間のその場所に置かれたチャンクから抽出されたもので､
1つのAIパワーのマッチングから始まっているのがわかると思います｡
そして､ ここでもう一つ探してみよう｡
ええと､ AIを使ったリスク評価機能です｡
同じことだよ｡
つまり､ 契約には機能的な情報も含まれているということだ｡
そしてその機能は､ 他の製品情報と同じようなベクトル空間に存在する｡
だから､ あー､ 理解してもらえるといいんだけど｡
空間上の適切な位置と文書の背後にある意味を結びつけるのが､ これまた不気味なくらいうまいんだ｡
そして最後のポイントは､ これは言い過ぎかもしれないが､ 本当にこういうことだと思う｡
会社に関する3つの文書があることにお気づきだろう｡
この3人が真ん中だね｡
彼らはこれらの異なる文書のちょうど真ん中にいる｡
それは､ 従業員や契約､ 製品に関連する情報も含まれているからだと思う｡
ええと､ それはすべてに関連する中心的な情報なんだ｡
だからこそ､ 他のすべての情報の真ん中にあるような場所にあるんだ｡
それはとても魅力的なことだ｡
深読みしすぎかもしれないが､ 私にはそう見える｡
ベクター・データベースに好きなテキストのかたまりを入れて試してみるのもいい｡
ここで読み込んだドキュメントに､ 他のドキュメントを追加することができる｡
ファイルを直接指定するか､
テキストを追加するか､
既存のドキュメントにテキストを追加するだけです｡
それが全体のアイデアなんだ｡
この2D表現は本当にクールだった｡
ええと､ 2Dで表現するよりもいいものがありますか？
もちろんある｡
3D表現があり､ それが次にやることだ｡
2という数字を3という数字に変えるだけで､ ベクトルを3Dで視覚化することができる｡
それほど単純なことではなかった｡
ここに3Dも入れなければならなかったし､ 他のベクターもいじらなければならなかった｡
そして､ タイトルも2Dから3Dに変更しなければならなかった｡
とにかく､ これがどう見えるか見てみよう｡
これだ｡
これが､ 2Dではなく3Dに投影されたベクトルです｡
ええと､ まずお気づきになるかもしれないのは､ 実は､ これは映画のように､ 3Dが必ずしも2Dより優れているわけではない､
稀な時代のひとつだということです｡
ちょっとごちゃごちゃしているように見えるね｡
ちょっと見づらいけど｡
黄色が真ん中にあるようにまた見える｡
そして､ 緑､ 赤､ 青がはっきりと分かれている｡
しかし､ 以前見たように､ 予想通り､ いくつか組み合わされたものもある｡
でも､ これのいいところは､ 積極的に､ あー､ インタラクティブにこれで遊ぶことができるんだ｡
このように回転させることができる｡
そうだろう？
そして､ これを使うことで､ どのようにレイアウトされているかを把握することができる｡
そして､ 両者の間に区別があることを感じさせてくれる｡
うーん､ でも､ 2Dの表現ほど明確ではないことは認めざるを得ないね｡
あー､ それにしても､ いい感じだね｡
カーソルを合わせると､ ポイントの背後にある意味を見ることができる｡
もちろん､ 前回と同じように､ 黄色はすべての真ん中に位置しているように見える｡
3Dで表現するのも楽しいけど､ 2Dの方がもう少しわかりやすい部分もあるかもしれない｡
とにかく､ これでベクトルを使った遊びは終わりですが､ 大きな収穫があります｡ それは､ これらの図を見て､
さまざまなテキストのかたまりを調べるだけでなく､ あなた自身のテキストのかたまりを追加することです｡
簡単な方法は､ ドキュメントをナレッジ・ベース・ディレクトリに置くことだ｡
そうするだけで､ すぐにうまくいく｡
しかし､ 単にドキュメントをそこにドロップするのではなく､ ラング・チェイン・コードを使ってチャンクを追加するために､ テキスト・ローダー・クラスを弄ることもできる｡
しかし､ チャンクを入れたら､ ベクタースペースのどこに配置されるかを見て､ それがどのように機能するか感覚をつかんでほしい｡
あるいは､ ナレッジ・ベース・ディレクトリを丸ごと置き換えて､ 別の名前に変更し､
新しいディレクトリを作成し､ その中に非常に単純なものを入れるだけで､ ドキュメントがベクター・スペース内のさまざまな場所にどのように配置されるかを実験することができます｡
これは超重要な宿題で､ 次のパート､ つまり本格的にボロを出すときのいい基礎になるからだ｡
まず､ スライドに戻ろう｡