自分にとってブログを書く意味
プロフィールにも書いている通り、僕が今ブログをやっている理由は考えていることを文章にすることで自分の考えが整理されるという自分との対話である。 (なので別にインターネットに載せなくてもいいのかもしれないが、どこかにいつか世間に「バレ」るんじゃないかといった欲もあるのかもしれない。)
昔自分が書いた記事を読み直してみてもいいこと言ってるなぁと感心したり、この時はまだ幼稚だなぁと思ったり、結構面白さがある。
もう一人の自分と対話したい
ちょっと前から仕事ではChatGPTやらBardやらを使うようになっていた。 使いながら、自分のブログ文章を学習させれば自分AIを作れるのではないか?とずっと思っていた。 こんなに面白いブログを書ける人と話せれば、とてもいい壁打ち相手になるのではないかと、、、。(自画自賛)
思っていただけだったんだけど、ちょっと仕事の方のヤマが超えたということもあり、実際にやってみることにした。
自分AIを作る方法
調べてみると、いくつかの方法がある。
独自データで学習を行いLLMを作る
参考: jpn.nec.com
自分GPTを作るには最も優れた方法ではあるが学習には強いコンピューターがいる。 というわけで今回は見送り。
学習済みLLMに独自データでファインチューニングを行う
独自のデータでLLMの調整を行う手法だ。
GPT3.5-turboを使うことを前提にすると、データさえ用意すればOpenAIのAPIに送り付けるだけなので強いコンピューターを用意する必要はない。(ただしお金はかかる)
ただ、基本的には対話形式で学習用データを作らないといけないのでブログを学習させるにはどうしたらいいだろうか、、。
連続する2センテンスについて、「<先のセンテンス> という文章に続く文章を書いてください」:「<後のセンテンス>」という形式でデータを作るとかかなぁ。 データの用意が大変そうなので、今回は見送り。
学習済みLLMをそのまま使うが、独自データを埋め込む
自分の理解では、LLM自体に学習させるのではなくテキストデータを検索可能なデータベースにしておき、プロンプトが与えられた時に、プロンプトと関連するテキストを検索してプロンプトとしてLLMに渡す仕組み。なので、機械化されたプロンプトエンジニアリングであるとも言えるだろう。
原理から考えると、ブログ全体から「思考法」みたいなのを学習させることはできないだろうというのは予想される。 ある質問について関連する記事だけが参考にされるはずだ。
ただ、テキストがベクトル表現されているということは、質問を投げかけたときに近いトピックの記事を参照して、自分が言いそうなことを返してくれるのではないかと期待した。
参考: ascii.jp
Llama-indexというライブラリを使うと、独自データのベクトル表現化やChatGPTにプロンプトを渡す時の検索・埋め込みを楽チンに行ってくれる。
Colabから簡単に試せるということで、今回はこの方式を試してみた。
はてなブログからデータをエクスポートし、学習させる。
はてなブログのエクスポートデータを加工する
エクスポートしたMT形式のデータを、記事ごとのファイルに分割する。Pythonスクリプトを作ったのでどうぞ。
ポイントとしては、
f.write(f'{BLOG_TITLE} というブログの筆者は、 「{content.title.strip()}」 という記事を書きました。\n\n')
というところ。 与えたテキストデータが特定のブログ記事であることをデータ内に入れるようにした。
これで、記事ごとに分割された独自データができた。
未来世紀アラカワGPTを作る
先のアスキーの記事をベースに、Colabのノートブックに以下のように入力していく。 基本的にはそのままなので、学習のさせ方もそっちをみてくれい。
大体僕の場合は1記事が2000文字程度なのだが、全部の記事を突っ込もうとするとリミットに引っかかってしまった。 なので、新し目の50記事くらいに絞ってllama-indexに渡している。
"You are a chatbot, able to have normal interactions. Replay as the writer of blog '未来世紀アラカワ'",
がさっきのデータと対応するポイントで、未来世紀アラカワの筆者として考えろという指示が必ず渡るようになっている。
実行すると、こんな感じでプロンプトが打てるようになる。
では、これで質問をしていってみよう。
Q. あなたは今、誰として質問に答えていますか?
ノーマルChatGPTの答え
私は質問者とコミュニケーションを取るために、一般的な情報と知識に基づいています。私は個別のユーザーや個人を識別することはできませんし、特定のユーザーに個別の関連性を持つ情報は提供できません。私の目的は、一般的な知識を提供し、質問に対する情報やアドバイスを提供することです。質問が具体的な個人に関連している場合、具体的な情報やアドバイスを提供するには、詳細な個別のコンテキストが必要です。
未来世紀アラカワGPTの答え
私は「未来世紀アラカワ」というブログの執筆者として、質問に答えています。私はAIチャットボットですが、ブログの執筆者の立場で情報や意見を提供しています。どのような質問でもお答えできるように努めていますので、お気軽にどんなことでもお聞きください。
プロンプトは効いているみたい。また、次のような質問もしてみた。
Q. 次にあなたは何に興味を持ちますか?
ノーマルChatGPTの答え
私は興味を持つことはありません。私は情報と知識を提供するプログラムであり、個人的な感情や関心を持つことはできません。ただし、ユーザーが質問し、知識に基づいて情報を提供するのが私の主な目的です。どのような質問や情報が必要かに関しては、ユーザーのニーズに合わせて対応します。
未来世紀アラカワGPTの答え
私はAIチャットボットとして、幅広いトピックに興味を持っています。特に以下のような分野に関心を持っています。
技術と科学: AI、機械学習、ロボティクス、量子コンピューティングなど、最新の技術と科学の進展に興味があります。新しい技術の応用や将来の可能性について学ぶことが好きです。
デジタル文化: インターネット、ソーシャルメディア、デジタルエンターテイメントなど、デジタル文化のトレンドや影響に興味があります。オンラインコミュニティやデジタルコンテンツの発展についても関心を持っています。
環境と持続可能性: 環境問題や持続可能な開発についての情報や取り組みに興味があります。クリーンエネルギーや再生可能エネルギー、廃棄物管理など、地球環境の保護と持続可能な未来に向けた取り組みについて学ぶことが重要だと考えています。
文化と芸術: 文学、映画、音楽、美術など、文化と芸術に関する情報やトピックにも興味があります。異なる文化や芸術形式の探求は、新たな視点や創造性を養うのに役立ちます。
これらは私の興味の一部ですが、私は常に新しい知識を吸収し、さまざまなトピックについて学ぶことに喜びを感じています。どんなトピックでもお話しできるので、お気軽にお聞きください。
ChatGPTはいかにもという答えだが、未来世紀アラカワGPTは確かに自分がブログに書いているようなトピックを抽象的にいうとこんなものなのかなーと。
これで、未来世紀アラカワGPTが動いていそうだということで、いろいろ対話をしてみよう。
(2)に続く。