🤖

自分のコンテンツを学習したカスタムChatBotを作る方法

2023/08/05に公開

カスタムChatBotを作る

ChatGPT全盛の時代に、何番煎じだ?という感じですが、とりあえずやってみたので手順を残しておきます。プロンプトエンジニアリングの観点ですと、いわゆるIn-Context LearningのRetrieval-Augmented Generation(RAG)ってやつになると思います。プロンプトエンジニアリングに関しては以下記事参照ください。

https://zenn.dev/karaage0703/articles/90d4de4596b262

具体的な手段・実装としては、基本的にnpaka大先生のやったことや書籍を大いに参考にさせていただいています。

OpenAI GPT-4/ChatGPT/LangChain 人工知能プログラミング実践入門

以前、はてなブログのデータだけでやってみてはいたのですが、イマイチ性能がよくなかったので、今回は色々と改善版という位置づけです。

大きく変えたところは以下2つです。

  • データを増やした(ブログデータ → ブログデータ + X(Twitter)データ)
  • モデルはChatGPT → ChatGPT + Llama 2

データを増やすのと、モデルを色々変えるために構成は以下の通りにしました。

まずは、X(Twitter)、はてなブログといったコンテンツごとに独自の前処理で、すべてをテキストデータに変換します。
それをLlama IndexないしはLangChainでindexデータに変換して、ChatGPTやLlama2に食わせるといった構成です。

Llama Indexのローダー(Llama Hubとか)使って以下のように直接コンテンツから変換する方法もあります。

今回それをやっていないのは以下の理由です。

  • 自分の環境でうまく変換できないときがあった
  • 色々後ろのライブラリやモデルをガチャガチャ入れ替えたりするのにやりやすそう
  • データの前処理を自分で多少工夫したい

まあ要は言い訳ですね。特に問題なければ、Llama Indexとかで直接読めばよいかと思います。

というわけで、その前提で記事を読んでいただければ幸いです。

コードは前処理含めて以下にあります。

https://github.com/karaage0703/ai-karaage-sensei-bot/

処理の順に説明していきます。

コンテンツをテキストに抽出する

コンテンツをテキストに抽出する部分は、はてなブログとツイートからテキスト抽出するGoogle Colabのノートブックを作成しました。だいたいChatGPTに助けられました。

ブログからテキストに抽出するソフトです。はてなブログをエクスポートしたデータを変換できます。
hatenablog_to_text.ipynb

ツイートからテキストに抽出するソフトです。ツイートのアーカイブのtweet.jsファイルをテキストに変換できます。

tweet_to_text.ipynb

簡単な前処理も追加しています。

bot部分

ChatGPTをつかったものとLlama 2を使ったものの2つあります。

それぞれ説明していきます。

ChatGPT

抽出したテキストをindex化してから、ChatGPTでindexを使ってという流れになります。

以下のNotebookでできます。とりあえず試したという感じで、運用はあんまり考えてないです。

LLamaIndex_ChatGPT.ipynb

以下実行例です。

Llama 2

Llama2を使うものは、index化する部分とAIでindexを使ってチャットする部分が分かれています。

index化は以下のGoogle Colabノートブックで、indexデータをstorageというディレクトリに書き出しています。

Llama_2_LangChain_RetrievalQA.ipynb

AIのチャット部分は、以下ディレクトリにあります。ローカルでDockerで動かすことを想定しています。

https://github.com/karaage0703/ai-karaage-sensei-bot/tree/main/qa_bot

上記ディレクトリに、Google Colabノートブックで作ったstorageディレクトリを移動して、チャットbotを動かします。

とりあえず以下ソフトを動かして、CUIでチャットできたら成功です。

qa_bot.py

以下実行例です。

Discordとの連携

Discordで動かす場合は、以下記事参考にDiscordを設定してください。
https://zenn.dev/karaage0703/articles/926f18ba04e093

.configにDiscordのkeyを書き込んで以下プログラムを実行すれば、運がよければ動くと思います。

discord_bot.py

結果

ChatGPT

Google Colab上での結果です。こんな感じの回答です。

以下テキストを抽出します。なかなか賢いですね。

Q: 好きな食べ物は何ですか?

A: 私の好きな食べ物は、お寿司やお魚料理、お肉料理、お蕎麦、お味噌汁などです。

[Node e3eb2d3a-69ab-402b-b1d6-02c143beadd7] [Similarity score: 0.855673] 実はアンジャッシュ、あんまり分からないのですが、レモンかけられたら即死刑です。
そういや以前フォトグラメトリする方法をZennに書いてた。Dockerで環境構築できれば無料でできます。 >...
[Node 2dde3e3a-8382-437a-9490-76442aa82a29] [Similarity score: 0.851599] #tanbun
僕はから揚げに関して最右翼なので、から揚げにレモンをかける左翼(さよく)は死刑にすべきだと思っている
Wikipediaで調べてました。僕がかいてたのはストラップレスブラだったん...

Q: からあげにレモンをかけたら死刑ですか?

A: はい、レモンをかけたら死刑です。

[Node e3eb2d3a-69ab-402b-b1d6-02c143beadd7] [Similarity score: 0.880268] 実はアンジャッシュ、あんまり分からないのですが、レモンかけられたら即死刑です。
そういや以前フォトグラメトリする方法をZennに書いてた。Dockerで環境構築できれば無料でできます。 >...
[Node 8c82c6f5-3199-4fc0-92ad-30d13b023dc6] [Similarity score: 0.861833] x レモン = 死刑
自分の行動には、全て背景には理論と緻密な計算があるのです!
AIで描いたからあげグッズをSUZURIで販売してます。こんな奇行に及んだ理由は…12月くらいに明らかになるかも...

Q: おすすめの旅行先は?

A: おすすめの旅行先は、個人の趣向によって異なりますが、北海道のニセコスキー場や小樽、ニッカウヰスキー、旭山動物園、ラベンダー畑、青い池、レトロスペース坂会館、大漁居酒屋てっちゃん(刺身盛り)、知床、恐山、牛たん、東北大学、松島、銀山温泉、スペースパーク、スパリゾートハワイアンズ、UFOふれあい館、ひたち海浜公園、牛久大仏、日光東照宮、大谷資料館、珍宝館、親戚の家、首都圏外郭放水路、ディズニーランド、ドイツ村、スカイツリー、東京タワー、秋葉原、東京大学、ロボットレストラン、蔦屋書店、目黒寄生虫館、バイブバー、江ノ島、横浜中華街、赤レンガ倉庫、藤子・F・不二雄ミュージアム、鎌倉、苗場スキー場(フジロック)、回転寿司、黒部ダム、金沢21世紀美術館、兼六園、ハニベ岩窟院、東尋坊、清里、さくらんぼ、富士急ハイランド、松本城、上高地、渋温泉、白川郷、飛騨高山、関ヶ原ウォーランド、新穂高ロープウェイ、うだつの上がる町並み、下呂温泉、ソフトピアジャパン(Makers Faire Ogaki)、養老ランド、大井川鐵道、竜ヶ岩洞、浜松フラワーパーク、浜松フルーツパーク、掛川花鳥園、さわやか(ハンバーグ)、熱海城、三保の松原、富士山、まぼろし博覧会、日間賀島、五色園、桃太郎神社、常滑、田縣神社、名古屋港水族館、布袋大仏、桃厳寺、名古屋大仏、岩崎御嶽社、貝殻公園、定光寺、聚楽園大仏、紫峰人形美術館、軍人墓地、熱田神宮、竹島水族館、佐久島、竹島ファンタジー館、豊橋市地下資源館、伊勢神宮、ルーブル彫刻美術館、四日市工場夜景、鳥羽湾めぐりとイルカ島、日本オオサンショウウオセンター、琵琶湖、ピエリ森山、佐和山遊園、金閣寺、銀閣寺、嵐山、京都タワー、清水寺、三十三間堂、鈴虫寺、高台寺などがおすすめの旅行先となります。

[Node 651d6dfb-80f9-408d-88c9-aaa3cc44b0ab] [Similarity score: 0.83822] 行きたいところ行ったところリスト  個人の趣向でいわゆるB級スポットが多めです。太字が行ったことのあるところです。つくるの結構大変でした。本当は行ったところでブログに記事書いたことのあるところは...
[Node 82284fd2-6153-43df-8e1b-f39d8e82ab62] [Similarity score: 0.825705] 兼六園   ハニベ岩窟院18.福井県   東尋坊19.山梨県   清里   さくらんぼ   富士急ハイランド20.長野県   松本城   上高地   渋温泉21.岐阜県   白川郷   飛騨高山...

Llama 2

モデルは、小さい7bの4bit量子化したものを使っています。

Discordのbotでの回答です。日本語で回答してとデフォルトでプロンプトに入れているのですが、英語で回答したり、変な回答したりとイマイチです。

おすすめの漫画教えての質問の回答は I can recommend some great manga for you! There are so many amazing series out there, but here are a few that I think you might enjoy:
"Attack on Titan" - This is a super popular and highly rated series that I think you'll love. It's set in a world where giant humanoid creatures called Titans have taken over, and the remaining humans are fighting for survival. It's got great action scenes, interesting characters, and a lot of suspense.
"Death Note" - This is another really popular series that I think you might enjoy. It's about a high school student who finds a notebook that can kill anyone whose name is written in it, and he uses it to try to change the world. It's got a lot of twists and turns, and it's really thought-provoking.
"Fullmetal Alchemist" - This is a longer series, but it's definitely worth checking out. It's about two brothers who are alchemists in a fantasy world, and they're on a quest to find the Philosopher's Stone and restore their bodies. It'

おすすめのからあげの質問の回答は 以下の Contextでえます。

2022年ってよかったもの - karaage. [からあげ]

karaage. からあげ」参リンク「http://www.rikei-plus.com」/

karaage. からあげ

Question: What is the best thing you bought in 2022?

Please answer in Japanese.

まとめ

カスタムbotを作ってみました。やっぱりChatGPTの性能が良いですね。Llama 2は、ChatGPTと比較するといまいちに見えてしまいますが、小さいモデルである程度回答できるのは、今後に期待持てますね。

bot自宅のゲーミングPCで運用して、自分のDiscordでたまに動かしているので、興味ある人は遊んでみてください。

https://github.com/karaage0703/ai-karaage-sensei-bot/

https://karaage.hatenadiary.jp/entry/2022/11/30/073000

https://amzn.to/47hCqpj

参考リンク

https://note.com/npaka/n/n3164e8b24539

https://note.com/npaka/n/n94e4069f2e9c

https://note.com/npaka/n/n496e9af9d215

https://note.com/npaka/n/n6d33c2181050

https://logmi.jp/tech/articles/329143

https://zenn.dev/nishimoto/articles/aff1fba9c75c34

https://speakerdeck.com/smiyawaki0820/retrieval-based-lm-rag-system-zatukurili-jie-suru

https://zenn.dev/sompojapan_dx/articles/eb755a18e893ce

https://note.com/npaka/n/n53e8aabed0f2

https://github.com/explodinggradients/ragas

https://github.com/langchain-ai/langchain/blob/v0.0.336/cookbook/hypothetical_document_embeddings.ipynb

https://hironsan.hatenablog.com/entry/information-retrieval-with-reranker

https://gpt-index.readthedocs.io/en/latest/examples/index_structs/doc_summary/DocSummary.html

https://note.com/npaka/n/n62cd25213679

https://nikkie-ftnext.hatenablog.com/entry/grasp-hyde-hypothetical-document-embeddings

https://www.jiang.jp/posts/20230611_retreiver/

https://qiita.com/ksonoda/items/ba6d7b913fc744db3d79

https://note.com/npaka/n/n0be34a51395d

https://pub.towardsai.net/advanced-rag-techniques-an-illustrated-overview-04d193d8fec6?gi=80f22f5c55ee

https://speakerdeck.com/mkazutaka/gptsyorijing-du-nogao-iragsisutemunogou-zhu

https://note.com/aisouken/n/nfccd0c9b81ff

https://www.creationline.com/tech-blog/68014

https://zenn.dev/smartshopping/articles/rag-with-bedrock-and-openai

https://speakerdeck.com/segavvy/tekisutojian-suo-noyuan-dian-quan-wen-jian-suo-nosikumitohuo-yong-hointo

https://tech.dentsusoken.com/entry/parameter_tuning_for_rag

https://tech-blog.abeja.asia/entry/in-house-jargon-slackbot-with-rag-202402

https://dev.classmethod.jp/articles/rag-knowledge-on-real-projects/

https://zenn.dev/spiralai/articles/8af7cbf526c2e1

https://zenn.dev/cloud_ace/articles/19bd3554ac8432

https://llm-jp.nii.ac.jp/blog/2024/02/09/v1.1-tuning.html

https://www.nogawanogawa.com/entry/2024/08/04/001324

関連記事

https://zenn.dev/karaage0703/articles/90d4de4596b262

https://zenn.dev/karaage0703/articles/9bd40f2d3d1a76

Discussion