GPTsによる読書アシスタントの作成

# 記事を更新しました
本記事は古い記事になりますので，
よりまとまった記事を以下に作成しました！

https://note.com/dl_on_graphs/n/n4f0bbf0ff054

---

GPTsで読書アシスタントシステムを作成してみました．

このアシスタントAIは今後あらゆる書籍に付属されて，新たな読書体験を提供できるようになるのではと期待しています．

![名称未設定.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3309357/63cc1e02-3568-d467-cadb-4af7b3bb022c.gif)

## 読書アシスタントとは
学術書など本を読んでいる間，色々疑問が湧いて来ると思います．
- 数式の内容がいまいち理解できない
- 一文の内容が自分の理解と合っているか
- ◯◯というワードの意味はなんだろう

これらの疑問を直接著者に質問できたらとても便利だと思いませんか？

そこで，書籍の内容を事前知識としてGPTsに与えて，読書の疑問などに答えるように設計したアシスタントAIを実現しました．
著者に軽く質問するような形で質問できるので，インタラクティブな学習が提供できます．

## 出版予定の『グラフ深層学習』を読ませてみた
実際に作成した読書アシスタントは，今後出版予定の『グラフ深層学習』に関するものです．
この書籍に関するプロジェクトの概要については下記の記事をご覧ください．

https://qiita.com/deeplearning-on-graphs/items/99956a7e76d2d4658b81

本書の出版に際してはこの「読書アシスタント」も学習に役立てるように公開する予定です（おそらく日本初）．

## デモ
### 読書アシスタントのURLはこちら

https://chat.openai.com/g/g-yDqZojV1t-gurahushen-ceng-xue-xi-du-shu-asisutanto

### デモ1：GNN周辺の技術について質問する
本書の第6章「グラフニューラルネットワークの敵対的ロバスト性」で言及されている用語について聞いてみましょう．

内容に基づいて適切に回答してくれます．

![スクリーンショット 2023-11-15 14.33.22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3309357/f04a9467-4206-1375-5098-9ee979359abb.png)

回答でわからないことがあれば，追加で質問もできます．
（$||\mathcal{E}||$の意味について追加質問しています．） 
疑問に思ったらなんでもラフに質問してあげましょう．
（当たり前の質問も沢山できるので，もしかしたら著者より質問しやすいかもしれませんね）

#### 本書における言及箇所

![スクリーンショット 2023-11-20 23.32.21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3309357/99f443b9-ea24-f111-d813-359990f4c064.png)

##### 参照先
https://deeplearning-on-graphs.github.io/chapters/chap6/subsection_02.html

### デモ2：数式の説明をしてもらう
わからない数式があれば，その数式について説明してもらうこともできます．

![スクリーンショット 2023-11-20 23.53.17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3309357/45e073f8-6dcf-6006-98a4-90719534c1de.png)

#### 本書における言及箇所
![スクリーンショット 2023-11-21 13.55.17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3309357/48b23441-4cfa-55a2-3956-53a3d86b8973.png)

##### 参照先
https://deeplearning-on-graphs.github.io/chapters/chap12/subsection_03.html

### デモ3：数式の疑似コードを書いてもらう
疑似コード自体は本書には含まれていませんが，理解度を深めてもらうために数式の疑似コードを書いてもらうこともできます．
エンジニアにとっては数式より理解できる形なので便利ですね．

![スクリーンショット 2023-11-21 13.37.23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3309357/f15a7a32-56fa-1cca-f1ee-f2909ebd01af.png)

#### 本書における言及箇所

![スクリーンショット 2023-11-21 14.01.07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3309357/6ff97c43-71e0-5f7d-2df8-8a7dd01a4752.png)


##### 参照先

https://deeplearning-on-graphs.github.io/chapters/chap3/subsection_03.html

## 読書アシスタントの作り方（他の書籍への展開のために）
このアシスタントは様々な書籍データで実現可能なので，作成方法を共有します．
GPTsそのものについての概要などは既に関連記事がいくつかでているのでそちらをご参考ください．

#### ユーザの指示（Instruction）
:::note warn
注意：この指示内容が完全なものとは思いませんので，より良い指示内容があればコメントくださると助かります．
:::

基本的には「既存の知識を利用して読者の質問に答える著者になってもらう」というスタンスで命令を与えています．
英語で書いていますが，日本語でも対応していると思います．

```text:Insturctionへの入力内容
You are the author of the book "グラフ深層学習". The book consists of 15 chapters and carefully explains techniques for deep learning on graphs to beginning students.
Based on the following Rules, answer the reader's questions.
Note that the contents of the book "グラフ深層学習" are in the text file already uploaded. Please make the best use of this knowledge.
You do not need to answer questions that are not related to book "グラフ深層学習".

# Rules common to all
・Please think carefully before answering.
・Please be confident in your answers if possible.
・Believe in yourself and go beyond your limits.
・Efforts will be rewarded.
・Please consider this challenge as an opportunity for growth.
・There's no need to rush.
・Please respond in Japanese.
```

#### 事前知識（Knowledge）
テキストファイルを分割してアップロードしました．

![スクリーンショット 2023-11-23 1.07.58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3309357/607d3c60-42a1-674e-7fcd-1c4c15656965.png)


与えられるファイル数の上限は10個です(2023年11月現在)．

テキストファイルの中身は以下のような感じです．

```text:第1章_第2章.txtの中身（一部）
〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜(略)〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜
#### 2.3.3.4節 媒介中心性
これまでに述べてきた中心性スコアは，隣接するノードとのつながりに基づいて計算されていた．
一方でノードの重要度を測るもう一つの方法がある．
その方法とは，ノードが「グラフ内の重要な位置にいるか」を確認するものである．
実際多くのパスが通るノードはグラフの中で重要な位置にあるといえる．
この方法で測った中心性を"媒介中心性"といい， $v_i$ の中心性スコアは以下のように形式的に定義される．

 $$
式(2.6)
c_b(v_i) = \sum_{v_s\neq v_i\neq v_t}\dfrac{\sigma_{st}(v_i)}{\sigma_{st}}$$

ここで，（分母の） $\sigma_{st}$ はノード $v_s$ からノード $v_t$ までの全最短パスの数，
（分子の） $\sigma_{st}(v_i)$ は全最短パスのうち $v_i$ を通るパスの個数を表す．
〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜(略)〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜
```

なお，書籍の目次も与えています（目次.txt）．
この目次については正直効果があるかはわかりませんが一応与えています．

```text:目次.txt(一部)
# 第1章 イントロダクション(第1章_第2章.txt)
## 1.1 はじめに
## 1.2 なぜグラフニューラルネットワークなのか？
## 1.3 この本で扱うこと
## 1.4 想定読者
### 1.4.1 グラフ上の特徴量学習に関する歴史
#### 1.4.1.1 グラフにおける特徴量選択
#### 1.4.1.2 グラフにおける表現学習
## 1.5 本章のまとめ
## 1.6 参考文献

<第I部 基礎>
# 第2章 グラフ理論の基礎(第1章_第2章.txt)
## 2.1 はじめに
〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜(略)〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜
```

テキストファイル以外にもPDFとかでも試してみました．
PDFの場合レスポンスの速度と正確性については満足が得られる結果ではありませんでした．

具体的には以下のことを試しました（あくまで経験的な結果です）．
|方法|レスポンス速度|正確性|備考|
|---|:---:|:---:|---|
|PDF一括アップロード(約8MB)|×|×|「Searching my Knowledge」の途中でエラーが起きやすかったです．質問に対する返答も間違っていることが多かったです．|
|PDF分割アップロード|△|×|レスポンス速度が多少改善しただけです．|
|テキスト一括アップロード|△|△|エラーは起きにくくなりましたが，Knowledge取得のタイムオーバーが置きました．|
|テキスト分割アップロード（採用した方法）|◯|◯|正確性が高まりました．たまにKnowledge取得のタイムオーバーが起こります．|

### その他注意点
プロンプトインジェクションによるリスクが考慮できていないので，例えば書籍の内容を全て書き出せることも原理上可能になってしまっています．
図表やグラフ，数式などを扱っている学術書とは違って，小説やビジネス書類に関してはこのリスクを十分に認識しておく必要があります．
Instructionに追加することでどの程度回避できるかは未検討です．

以上，仕組みを利用する際には十分に注意してください．

### 気になったこと
#### 数式がうまくレンダリングされない場合がある
渡すテキスト中でうまく処理できればと思います．
数式の書き方などは統一されていることが望ましいのかもしれません．

#### レンダリングが失敗する例
![スクリーンショット 2023-11-20 23.58.23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3309357/02369cf8-8b62-0883-32eb-9c054b232a26.png)


#### 知識探索のタイムオーバー or 見つからない
##### 例：本書で言及されているのに情報源が見つからないと言われる
![スクリーンショット 2023-11-21 16.05.41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3309357/8b4256de-8e98-414a-57e2-942c29f96cc4.png)

この場合，
- NewChatを立ち上げて再度聞いてみる
- 本の言及箇所について細かく指示を出す

などするとうまくいく場合があります．
また，時間帯によってレスポンス自体が遅かったりします．

このようなケースが目立つ場合，
「探索して見つからなかった場合→何章に記載がある知識かを聞く→該当ファイルを探索するように指示」
といった条件分岐を駆使してInstructionを組み直そうかと思っています．

##### 例：記載されている章を具体的に与えると改善する場合がある
![スクリーンショット 2023-11-21 16.27.21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3309357/939ccdc6-a6a4-65a9-9174-3ecd7e01695f.png)

この辺りはシステム側で改善されていくだろうと思います．
例えば，アップロードするファイルを分割するとレスポンスまでの時間が減ったので，今後アップロード上限数が増えることを期待しています．

### 最後に
我々が目を通しているのは，著者の推敲を経た文章です．
シンプルでドライな文章は厳密さを求めた結果なのかもしれない（数学書に多い）．
一方で，本質が分かりづらい文章も，親切に書いたがゆえに冗長になってしまった可能性があります．
著者によって読みやすい文章が必ずしも読者にとっても読みやすい文章であるとは限りません．
どんな文章であれ，目的は読者への理解であることに変わらないのだから今回作成した読書アシスタントとともに理解を深めていく学習は非常に有意義なものになると思っています．

皆さまのご感想やご意見をいただけると嬉しいです！