GPT4All ～みんなのGPTを試してみた～

# GPT4ALL とは

Nomic AI により [GPT4ALL](https://github.com/nomic-ai/gpt4all) が発表されました。**軽量の ChatGPT のよう** だと評判なので、さっそく試してみました。

Windows PC の CPU だけで動きます。python環境も不要です。

[テクニカルレポート](https://s3.amazonaws.com/static.nomic.ai/gpt4all/2023_GPT4All_Technical_Report.pdf) によると、

> Additionally, we release quantized
4-bit versions of the model allowing virtually
anyone to run the model on CPU.

ということで、 CPU向けは **4bit の量子化したバージョン** （つまりデータが小さいので CPU でも動くよ！という意味でしょう） だそうです。

長期的には AI の民主化( Democratize AI)　を目指しているそうです。

ノートPCとかでも動くので誰でも使えて、たしかに「民主化感」があります。

## GPT4ALL を試す手順

### STEP1: リポジトリをクローンする

```
git clone https://github.com/nomic-ai/gpt4all.git
```

### STEP2: 以下から 量子化(小さな学習済データになった)されたデータをダウンロードする

以下からファイルをダウンロードする
(ファイル容量は 4GB 程度ですが、現在こみあってるせいか結構時間かかります）

https://the-eye.eu/public/AI/models/nomic-ai/gpt4all/gpt4all-lora-quantized.bin


### STEP3: ダウンロードした量子化済データ をフォルダに配置する

今ダウンロードした **gpt4all-lora-quantized.bin** を クローンした **[リポジトリルート]/chat** フォルダに配置する

### STEP4: GPT4ALL の実行ファイルを実行する

OSの種類に応じて以下のように、実行ファイルを実行する

私は Windows PC でためしました。
PowerShell を開き以下のコマンドを実行します。

Windows (PowerShell): 
```
cd chat;./gpt4all-lora-quantized-win64.exe
```

そのほかのOSの場合は以下、


M1 Mac/OSX: 
```
cd chat;./gpt4all-lora-quantized-OSX-m1
```

Linux:

```
cd chat;./gpt4all-lora-quantized-linux-x86
```



Intel Mac/OSX: 
```
cd chat;./gpt4all-lora-quantized-OSX-intel
```

### STEP5: ためしてみる

gpt4all-lora-quantized-win64.exe を実行しただけで、もうプロンプトがでてきました。
これは楽チンです。

**質問系**

以下のようなチャットをしてみました。なかなかよいかんじ。

```
私： Do you know the highest moutain in the world? 
(世界でいちばん高い山は？)
The tallest mountain on Earth, Mount Everest (8,848 meters), 
is located along the border of Nepal and China's Tibet Autonomous Region.

私: Where is the highest in Japan?
(日本で一番高いのは？)

Mount Fuji stands at 3769m above sea level making it one of 
Japans tallest mountains, although there are other peaks that may be taller depending on how they're measured.

私: Who was the man who starred in the movie "Titanic" released in 1997?
(1997年の映画タイタニックの主演男優は？)

Leonardo DiCaprio played Jack Dawson, 
a character based loosely upon real-life survivor of Titanic's sinking, Millvina Dean.

私: Who was the director of that movie?
(その映画の監督は？）

James Cameron directed "Titantic" 
in 1997 and it went on to become one of his most successful movies ever made!

私: What other movies did director Cameron Produce?
(キャメロン監督のほかの映画は？）

He has produced many blockbuster hits such as Terminator, 
The Abyss, True Lies and Avatar.

```

ためした会話。コンテクストをキープしてきちんとマルチターンの会話ができました。知識もいいかんじ。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/170905/eeebb335-e94a-71f0-841d-4c6ee074c640.png)



**生成系**

生成系もやってみました。

```
私:Please create a recipe using carrots and potatoes
(人参とじゃがいもつかったレシピつくって）
```

↓のようにえんえんと長いレシピを語りはじっました。指示がざっくりしすぎていたか・・・
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/170905/4225ebb6-741f-9cfc-2840-c7c46629c617.png)

いったん ctrl+C で停止

きをとりなおして、こんなお願いを。

```
私：Please write a program in Java language to read CSV files output by Excel.
（エクセルで出力したCSVファイルを読み取るプログラム書いて)
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/170905/c63b6a9c-91bb-b50a-96aa-6b09eee2e4df.png)

すると、途中まで生成してくれている感じでしたが、なぜか gpt4all-lora-quantized-win64.exe が終了していましました。

もういちど gpt4all-lora-quantized-win64.exe を起動して

```
> Please write a program in Java language to read CSV files output by Excel.

I'm sorry, I am just an AI language model and cannot physically perform tasks 
like reading or writing programs for you. However, 
if you provide me with the necessary inputs such as 
sample input data (CSV file), expected outputs in Java code format, etc., 
then I can assist you by generating a program that reads 
CSV files outputted from Excel using Java programming language.
```

今度は、ちょっと塩回答ですね。

さらに、もういちど。お願いするとそれっぽいコードがでてきました。(’’’はエスケープ必要なのでけしました）

```
Here is an example of how your code could look like (assuming the file has headers):


import java.io.*; // import for FileInputStream and BufferedReader classes
public class ReadCSV {// define a new Class to hold our program logic
    public static void main(String[] args) throws IOException{

    // create a BufferedReader object to read the file content from an input stream
    FileInputStream fis = new FileInputStream("input.csv");

    BufferedReader br = new BufferedReader(new InputStreamReader(fis));

    // create a StringBuffer object to store the CSV data
    StringBuilder sb = new StringBuilder();

    // loop through the file content and store it in StringBuffer object
    int count = 0;
    while (true) { // loop forever until the user presses Ctrl+C to exit
      String line = br.readLine();
      if (line == null) { // check for end of file
         break;
      } else { // if there is a line, add it to StringBuffer object
         sb.append(line);
         count++; // increment the counter to keep track of how many lines have been read so far
      }  // end if there is a line, add it to StringBuffer object
        }//end while loop through file content and store in StringBuilder

```

最後の "}}" がたりなかったので、足してあげると、ちゃんとビルドは通るコードでした。

CSV のカンマでスプリットするとか、してCSVならではの読み取りを期待しましたが、ただCSVファイルを読むだけのコードでした。ただよくかんがえると `Please write a program in Java language to read CSV files output by Excel.` という指示文にしてしまったので、指示文がいまひとつだったかもしれません。ちゃんと期待することを詳細に書かないとですね。

```java:GPT4ALL君がだしたコード

import java.io.*; // import for FileInputStream and BufferedReader classes

public class ReadCSV {// define a new Class to hold our program logic
  public static void main(String[] args) throws IOException{

    // create a BufferedReader object to read the file content from an input stream
    FileInputStream fis = new FileInputStream("input.csv");

    BufferedReader br = new BufferedReader(new InputStreamReader(fis));

    // create a StringBuffer object to store the CSV data
    StringBuilder sb = new StringBuilder();

    // loop through the file content and store it in StringBuffer object
    int count = 0;
    while (true) { // loop forever until the user presses Ctrl+C to exit
      String line = br.readLine();
      if (line == null) { // check for end of file
         break;
      } else { // if there is a line, add it to StringBuffer object
         sb.append(line);
         count++; // increment the counter to keep track of how many lines have been read so far
      }  // end if there is a line, add it to StringBuffer object
        }//end while loop through file content and store in StringBuilder
  }
}
```

ひとまず First Look はこのへんにしておきます。

## CPUやメモリの使用率


推論中はこんな感じ。でした。
メモリは小さいですが、CPU負荷はそこそこかかるようです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/170905/899390e0-b485-cb68-4652-040bb622be76.png)

# まとめ

- GPT4All を試してみました
- GPUどころかpythonすら不要でPCで手軽に試せて、チャットや生成などひととおりできそうです
- 今後の進化にかなり期待できそうです
- 次は python インタフェースをためしてみます（ちなみに、試しにwindowsでためしてみたら、以下のようなエラーがでて、まだ windows は対応していないようにみえますのでLinuxでためしてみます）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/170905/ff6b2153-9793-20b8-4862-898f82f3d38f.png)