教科書・本を自動生成するツールをChatGPTで作ってみた

教科書をLaTeXおよびPDFファイルで自動生成するツールを作りました！

プログラムは[Github](https://github.com/hooked-on-mas/AutoGenBook)で公開しており、[Google Colab](https://colab.research.google.com/github/hooked-on-mas/AutoGenBook/blob/main/AutoGenBookJP.ipynb)で実行できます。
ツールの名前は、**AutoGenBook**としました。
このツールにより、あなたのバックグラウンドを考慮した上で、あなたの知りたい分野の教科書を数十円くらいで作ることができます！！

以下は「機械学習のための線形代数」についての教科書を出力した結果です。PDFは[こちら](https://drive.google.com/file/d/1UItpy9Xq98TuzMOzFMozbvoMDMBwe9uS/view?usp=sharing)に置いています。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/178972/18108972-0f52-a65d-59fc-f42ad39846d5.png" width="300">

**Markdownでの出力にも対応しました**（2024/10/19）。
数式だけでなく、プログラムも表示できます。
Github Markdownは一部のLaTeX記法に対応していないため、うまくレンダリングされない部分がありますが、VSCodeのMarkdown Previewだと正しく表示されます。
https://gist.github.com/hooked-on-mas/70b4c7c19d873f60955d5dbc3ca72b18

**未だ日本語で世に出ていなさそうな「○○エンジニアのための△△入門」の記事**を14個生成させてみました（2024/10/14）。例えば、「AIエンジニアのための哲学入門」や「サイバーセキュリティエンジニアのための犯罪学入門」、「機械工学エンジニアのためのトポロジー入門」などがあります。結構興味深い内容が生成できたので、良ければみてみてください。
https://zenn.dev/hookedonmas/books/b6aa4eff9c940a

## 使い方

### OpenAI APIの取得と登録

本ツールはOpenAIのAPIキーが必要です。
OpenAIのAPIキーを取得した後、Google Colabの左側メニューの鍵アイコンをクリックし、OpenAIのAPIキーを```openai_api```と名付けて登録してください。
詳細なやり方を知りたい方は、OpenAIのAPIキーについては[こちら](https://qiita.com/kurata04/items/a10bdc44cc0d1e62dad3)、Google Colabへの登録については[こちら]()などを参照ください。

### Google Colabでの実行

↓ を押してもらえると、Google Colabに飛べます。
[![Open In Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/github/hooked-on-mas/AutoGenBook/blob/main/AutoGenBookJP.ipynb)

## AutoGenBookの処理の概要

詳細はプログラムの内容を見てもらえばわかると思いますが、簡単にアイデアと処理の流れを説明します。

### 基本アイデア

ChatGPTには出力量に制限があるため、「教科書を作ってほしい」と頼んでも、1〜2ページ程度の内容しか出力されません。
そこで、ある本の主題・タイトルを起点として、大見出し（章）→中見出し（節）→小見出し（項）→...のように、ChatGPTを用いて意味的に独立した区分に再帰的に分割します。
これにより、本の全体構成をChatGPTの出力量に縛られることなく自動生成することができます。
そして、最終的に分割された各小区分に関する本文の内容をChatGPTによって生成し、PDFとして出力します。

これは人が本や論文を書く時に、章立てを考えてから実際に中身を書き始めるのと同じで、発想としては自然なことだと思います。

### 処理の流れ

以下に、おおまかな処理の流れを示します。同じ処理を行うところは一部省略しています。
また、項の生成までで止めていますが、それ以降の分割処理は続きます。

```mermaid
graph TD
    N[仕様の入力] --> A[本のタイトル・概要の生成<br>章のタイトル・概要の生成]
    A --> B[(本のタイトル・概要)]
    A --> B1[(第1章のタイトル・概要)]
    A --> B2[(第2章のタイトル・概要)]
    B1 --> BB1[第1章の節の生成]
    B2 --> BB2[第2章の節の生成]
    BB1 --> C11[(1.1節のタイトル・概要<br>・分割すべきか)]
    BB1 --> C12[(1.2節のタイトル・概要<br>・分割すべきか)]
    BB2 --> C21[(2.1節のタイトル・概要<br>・分割すべきか)]
    BB2 --> C22[(2.2節のタイトル・概要<br>・分割すべきか)]
    C11 --> D11{分割が必要か？}
    C12 --> D12{分割が必要か？}
    C21 --> D21{分割が必要か？}
    C22 --> D22{分割が必要か？}
    D11 --> |Yes| E11[1.1節の項の生成]
    D11 --> |No| F11[1.1節の内容の生成] 
    E11 --> E111[(1.1.1項のタイトル・概要<br>・分割すべきか)]
    E11 --> E112[(1.1.2項のタイトル・概要<br>・分割すべきか)]
    E111 --> F111{分割が必要か？}
    E112 --> F112{分割が必要か？}
    F11 --> FF[(1.1節の内容)]
```

### 実際に作成された文章構造

実際に出力された12ページくらいの本の文章構造を以下に示します。
bookから出ている矢印の先の１、２、３、４が章を表していて、その下が節、その下が小節になっています。これらのノードは、その章・節のタイトルや概要を情報として持っています。
そして、赤い丸で示されている末端のノードは、本文の内容を情報として持っているノードになります。
![section_structure.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/178972/256d643c-fef6-3872-d894-ea2efd487932.png)

## さいごに

このツールが便利だと思った方は[Zennのバッジ](https://zenn.dev/hookedonmas/books/b6aa4eff9c940a)を送っていただけると嬉しいです！（OpenAI APIの使用料を結構支払ったので、、）
[Githubレポジトリ](https://github.com/hooked-on-mas/AutoGenBook)へのStarも，もしよければお願いします．
また、ツールを改良し貢献していただけると、とても嬉しいです！
何かあれば、コメントかX（[@hookedonmas](https://x.com/hookedonmas)）にお願いします。

### 今後改良したい内容
#### 実装中

1. **自動デバッグ**
全体でコンパイルする前に各区分をコンパイルして、エラーがないか確認する。エラーがでるのであれば、エラーの内容を踏まえて再度ChatGPTに出力させる
1. **図の生成**
図をDall-E 3などに生成させる

#### 未実装

2. **コンテキストの提示**
ある区分の内容を出力させる際、前後の区分の概要または内容も考慮させることで、出力内容の重複をなくし、文章の流れを滑らかにする
3. **OutputParserの利用**
LLMにJSON形式で出力させているが、この辺りの処理が簡易なもので、JSON形式でないものを出力されるとエラーが出る。ちゃんとしたlangchainのパーサーを使って実装する