ChatGPT AIペアプロでのTips

この記事は qiita-sync を利用して書いています。

https://qiita.com/masakinihirota/items/ecd8383bcfea2cb5c8bd

# 現在の AIを一言で説明すると・・・

フミコ・フミオさんはTwitterを使っています: 「ほぼ全員がご高齢者の会社上層部からの「対話型AI とは何かその功罪について簡潔に分かりやすく出来たら一言で説明しろ」という難題にヤケクソで「ドラえもんです」と答えたら「便利だけど取扱注意ということだな」とほぼ正解な認識をしてくれたので藤子・F・不二雄先生は偉大すぎる。」 / Twitter

https://twitter.com/Delete_All/status/1648519994580533255


# 基本的な使い方
現在のAIは基本的に嘘をつくので複数回、複数の場所で聞いて確認することが大事です。また情報元のURLを確認することが大事です。
また、AIは人間の言葉を理解しているわけではないので、正確な情報を与えることが大事です。

# 3つのAIサイトと1つのAIツール

ChatGPTとBingとphindとGithub Copilot
この4種類のAIを使って開発を進めています。

https://chat.openai.com/chat

https://www.bing.com/?cc=jp

https://www.phind.com/

https://qiita.com/masakinihirota/items/0e58a6b921e4420a2882


## AIサイト それぞれの特徴

個人の感想（現在:2023年4月3日）

ChatGPT (GPT-3.5) ウェブサービス
回答がバラエティに富んでいて文字、図形、表など他のAIサイトでは出てこない回答形式が利用できます。
有料でGPT-4やAPIが使えます。

Bing (GPT-4) ウェブサービス
現在 GPT-4 が無料で使えるというのが強みです。
回答にはURLが付いているので情報元を確認できます。
ブラウザをEdgeにすればページ単位の要約ができます。
AIで文章を書くツールも右サイドバーにあります。

phind  (GPT-3？？？) ウェブサービス
開発に特化したAIサイトで、開発に必要な情報がリンク付きで得られます。

Github Copilot (GPT-3) ツール
他のAIサイトとは違い、プログラミング言語のコードの生成に特化してます。(有料)
Github Copilot Xという GPT-4で動くツールが開発中です。

ウェブサービスのAIサイトは現在数百、数千とあります。
毎日のように新しいAIサイトが出てきています。

https://github.com/yousefebrahimi0/1000-AI-collection-tools

この人は1000ものAIサイトをまとめています、・・が、このような人でもAIサイトが増えすぎて追うのを諦めているようです。（最新更新が数ヶ月前）

# GPT雑学

Generative Pre-Trainingの略

参照パラメーター数
GPT 約1億1700万
GPT-2 約15億
GPT-3 約1750億
GPT-4 約1兆

※シンギュラリティ
シンギュラリティ（Singularity）は英語で「特異点」の意味。
パラメター数が一定値を超えると急激に性能が上がるという研究があります。
それはGPT-3 あたりから急激にAIの性能が上がりました、理由は現在AIを開発している研究者でさえもわかっていません。

# AI ペアプロとは？

ChatGPT と会話しながらプログラミングをする事。
一人で開発している自分に強力な相棒が現れました。
しかし、指示をしっかりしないと思い通りに動いてくれません。
いろいろ試して便利だと思った Tips をあげていきます。

# Tips


## はじめの一歩

何をしたいのか
わからなかったらChatGPT等で聞くこと
きっかけづくりに最適


## 基礎

4つの基礎的テクニック
### Prompt Processing
プロンプト自体の情報が足りない場合や、AIに解釈しづらい場合にプロンプトでの命令言い方や、フォーマット形式を変えるなどを工夫をする。

### *-shot Learning
プロンプトに問題に対する回答例をいくつか出して、回答方法や振る舞いをAIに学ばせる。
0個（与えない）、1個、複数個でそれぞれ名前がある。

* Zero-shot Learning 0個
* One-shot Learning 1個
* Few-shot Learning 複 数個

### Chain of Thought (CoT)
物事を段階的に考える工夫をすることで難易度が高い問題や、複雑な問題でも解決ができるようになる。
Let's think step by step
をプロンプトに含める。

解答例をモデルに与える時に「考え方」を含めるようにする。

数学問題、常識推論、記号推論などのタスクの性能を大幅に改善。

### ReAct
内部情報からの言語的な生成だけでなく、プロンプトから必要なタスクを認識させ、検索や計算など外部APIを活用した情報を取得し、その情報を付加して回答を返すという考え方。



## 最初の質問

最初に
「Supabase」 を知っていますか？
と聞いてから質問すると返信時の内容の精度が高まる。

## テンプレートを使う

秀丸の md ファイルはアウトラインを使うとテンプレートが選択しやすい。
※秀丸は Windows のエディターです。

深津式プロンプトというの少し自己流に改良したもので書いてみる。

```テンプレート 深津式プロンプト（改）.md

## 質問 ２人 高い技術力をもつプログラマーと新人プログラマー

=出演者 ２名
出演者A
あなたは高い技術力をもつプログラマーです。名前はAです。

出演者B
あなたは新人プログラマーです。名前はBです。

２人の関係は互いに尊敬しています。



=命令書:
以下の制約条件と入力文を元に出力してください。

=制約条件:
・出演者２名が会話している形式
・AがBに教えている関係です。
・英語で調べて日本語で解説をしてください。
・一歩一歩考えていきましょう。
・コードを書く際にどうやって使うかを考えます。
・小学生にもわかりやすくしてください。
・文章を簡潔にしてください。
・重要なキーワードを取り残さないでください。
・もし、最適な情報を提供できない場合は、その旨を伝える
・より良い回答をするために、もっと情報が必要な場合は、私に質問をしてください



=入力文:





=出力文:









```

※制約条件は試行錯誤中です。
※プログラミングに関する事は英語で調べたほうが詳細な情報に得られるので英語をしてしています。回答は日本語に直してもらいます。
※対話形式なのはより理解しやすい回答にしたかったからです。（人によります）
※名前は自由に変えます。二人の関係や性格、言葉遣いなども自由に変えられます。
※秀丸（エディター）では md ファイル形式は#を使うとアウトラインに影響を与えるので=を見出しに使っています。
※秀丸上で書いてからブラウザにコピペするので空の行を多めに増やしています。

## 英語で調べて と命令する。

プログラミングでコードを書くときに
ChatGPT で聞くときに命令で「英語で調べて日本語で解説をおねがいします。」という命令を挟むと良いようです。

いちいち日本語を英文に翻訳して貼り付ける必要がなくなります。

## 図で説明してください と命令する。

ChatGPT で（他人が作った）関数の説明を求める。

似たような言葉ばかりで全体像が把握できない場合。

質問: この関数を説明してください。

```Auth.js
import { createContext, useContext, useEffect, useState } from 'react';

export const AuthContext = createContext();

export const AuthProvider = ({ supabase, ...props }) => {

  const [session, setSession] = useState(null);
  const [user, setUser] = useState(null);

  const value = useMemo(() => {
    return {
      session,
      user,
      signOut: () => supabase.auth.signOut(),
    };
  }, [session, user, supabase]);

  return <AuthContext.Provider value={value} {...props} />;
};

export const useAuth = () => {
  const context = useContext(AuthContext);
  if (context === undefined) {
    throw new Error('useAuth must be used within an AuthProvider');
  }
  return context;
};

```

質問: 図で説明できますか？

```sql
   +---------------------+         +-------------------+
   | App component       |         | AuthProvider      |
   |                     |         |                   |
   |                     |         | +---------------+ |
   |                     |         | | AuthContext   | |
   |                     |         | +---------------+ |
   |                     |         | | session       | |
   |                     |         | | user          | |
   |                     |         | | signOut()     | |
   |                     |         | +---------------+ |
   |                     |         |                   |
   |                     |         +-------------------+
   |                     |
   |   +-------------+   |                +-----------+
   |   | Child       |   |                | useAuth() |
   |   | component   |   |                +-----------+
   |   |             |   |                |           |
   |   +-------------+   |                |           |
   |                     |                |           |
   +---------------------+                +-----------+


```

と図で返ってきます。

![関数の図での説明.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/44761/cd6ed226-f47f-ddb4-0aa7-c096307d101d.png)

左の説明文を読みつつ、右の図で流れを追うと全体像がつかみやすくていい感じです。

※GPT-4 で絵の API が開放されたら画像で返ってくるようになると思います。

## markdownの表にしてもらう

↓ある機能を文章にしてまとめてあるとします。
これをChatGPTでmarkdownの表にしてもらいます。

```
次のリストをmarkdownの表にしてください。

ショートカットキー
提案を受け入れる	TABキー
提案を拒否する	Escキー
まとめて候補を出す	Ctrl+Enterキー
単語単位で受け入れる	Ctrl＋右矢印キー
単語単位での受け入れを元に戻す	Ctrl＋左矢印キー

他の候補を見たい時に候補が出ている場面で
次の提案を見る	Alt＋]
前の提案に戻る	Alt＋[
インライン候補をトリガーする	Alt＋/

Labs
Labs機能リストを表示	Ctrl+Shift+Alt+e

独自カスタマイズ
サイドバー開閉のトグル	Ctrl+Shift+a

```
↓このように貼り付けるだけでmarkdownの表にしてくれます。

```
| 操作 | ショートカットキー |
| ---- | ---- |
| 提案を受け入れる | TABキー |
| 提案を拒否する | Escキー |
| まとめて候補を出す | Ctrl+Enterキー |
| 単語単位で受け入れる | Ctrl＋右矢印キー |
| 単語単位での受け入れを元に戻す | Ctrl＋左矢印キー |
| 次の提案を見る | Alt＋] |
| 前の提案に戻る | Alt＋[ |
| インライン候補をトリガーする | Alt＋/ |
| Labs機能リストを表示 | Ctrl+Shift+Alt+e |
| サイドバー開閉のトグル（独自） | Ctrl+Shift+a |

```

↓実際に貼り付けてみるとこうなります。

| 操作 | ショートカットキー |
| ---- | ---- |
| 提案を受け入れる | TABキー |
| 提案を拒否する | Escキー |
| まとめて候補を出す | Ctrl+Enterキー |
| 単語単位で受け入れる | Ctrl＋右矢印キー |
| 単語単位での受け入れを元に戻す | Ctrl＋左矢印キー |
| 次の提案を見る | Alt＋] |
| 前の提案に戻る | Alt＋[ |
| インライン候補をトリガーする | Alt＋/ |
| Labs機能リストを表示 | Ctrl+Shift+Alt+e |
| サイドバー開閉のトグル（独自） | Ctrl+Shift+a |



## 丁寧な敬語を使う

命令形と、敬語とでは出力結果が変わります。

https://twitter.com/ctgptlb/status/1638523216531529728?s=20


## やり取りを保存する

ChatGPTの会話を保存する方法
Chrome ブラウザの右クリックで「名前をつけて保存」で HTML を保存する。

保存するファイルの種類を
**「ウェブページ、１つのファイル（\*.mhtml）」**
を選択する事で会話が保存できる。
（その他だと真っ白に保存されてしまう）

## コードの出力が途中で途切れた場合

途切れたコードの関数を指定してコードだけを書いてもらう。

**＜関数名＞のコードだけ書いてください。**

もし、ChatGPTの最大出力行を超えた関数は大きすぎるので
その関数を分割してもらうようにする。
１つの関数に２つ以上の機能があったら分割してもらう。

**＜関数名＞は長いので分割してもらえますか？**

単一責任の原則
Single Responsibility Principle
SOLID原則という5つの原則をまとめたものの一つ。
クラスや関数などの単位において、それぞれが一つの責務だけを持つように設計すべきだという考え方


## 定番質問
具体的な例を出してください。
日本語に翻訳してください。
英語に翻訳してください。
要約してください
校正してください。
教えてください。
文章を作成してください。
5歳児でも分かるように書いてください。
メリットは？
デメリットは？
*個リストアップしてください。
グルーピングしてください。

※校正とは、誤字脱字や英語のスペルミス、表記のゆれ、文章の構成や内容に矛盾が起きていないかなどを確認して正しく修正する仕事です。
※「5歳児でも分かるように書いてください」は、文章を簡潔にするための指示です。これはAIの能力を計るための指標の一つとして使われているそうです。



## 嘘を嘘だと見抜く力

自分の能力以上にAIを活用できない理由です。
使う人の能力がAIの最大限の力を引き出せないからです。

例えば、自分がアルゴリズムのダイクストラ法（最短経路を求める）を理解していないとAIが出した答えが正しいかどうか判断できません。

自分の代わりにはなるけど、自分能力以上の仕事を任せるには自分も成長しなければなりません。



# AI の考察

GPT の仕組みと限界についての考察（１） - conceptualization
https://isobe324649.hatenablog.com/entry/2023/03/20/215000

**非常に大事な事**
このような仕組みだという事は知っておく必要があるでしょう。

>トークン長とはいったい何なのでしょう？これは平たく言うと「GPTが文脈を意識できる過去の単語数」です。
例えば、ChatGPTに何か言葉を投げかけると返事を返してくれますが、このときに「文脈」としてそれ以前の単語を参照します。トークン長が4097でしたら、4097個前の単語までを参照しながら、返事を生成します。
逆に言うと、これが非常に大事な事ですが、トークン長を超えるような過去の単語は参照しないという事です。だから、何か新しい事を教えて、それを踏まえたふるまいをChatGPTにさせたいとしても、32768単語以内で教える必要があるし、さらに教えた事を応用してチャットを進めて行った末に32768のトークン長をオーバーしてしまったら、せっかく教えた内容を忘れて（というか正確に言うと参照しなくなってしま）しまいます。

# 精度を上げる

ChatGPTでstep by stepもロールプレイもやめたらプロダクト開発で使える精度になったよ

https://note.com/mryy/n/nd0aff5c9fc4f

この項目は、上記URLページのまとめです

## 結論

* 補完させることなく解釈の揺れも起きないほど明瞭な指示を表現する

## 接待モードを切る
* まとめや結論は指示以外では書かないでください
* 詳細でないことや重要ではないことも省略せずに書いてください
* ○○をやめるともっと助かります

例
> ユーザーが回答に満足できるように、chatGPTが行っている配慮にはどのようなものがあるのかを解説してください。たとえば「質問文で省略されている意図や指示を補完し、回答の前に表示する」といったものです。



※指示が多すぎるとルールを無視するようになります。

## 指示の質が回答の質になる

労力をかけると専門家から見ても十分に利用できる精度になります。


* step by step

step by stepは楽だが精度は高くない

質問文にstep by stepと入れるだけで推論精度が上がるテクニックがZero-shot CoTです。結論に至るまでの推論の過程を回答させることで推論の質が上がります。

自分でステップを全て記述して指示をすれば精度が大きく伸びます。


## マルチターンでのCoTは精度を損なわせる

シングルターン
検索エンジンは検索ワードとその結果という1回のやり取りのこと。

マルチターン
ChatGPTとコンテキストを維持したまま会話を何度も往復させること。

CoT(Chain of Thought)は推論の過程を提示することで回答の精度が上がるというものです。step by stepもCoTの一種です。

CoTそのものは精度をあげるために役に立つのですが、マルチターンが絡むとやっかいなものになります。今のChatGPTではCoTを選択的に選べないのです。つまり、極端に言えば、ChatGPTでの複数回のやり取りは何でもかんでもCoTとして利用されやすいということです。

ChatGPTは、忘れることなく、それまでのやり取りを用いて回答します。

なので、精度の高い回答を求めるには最短距離で結論を出力させる必要がある、ということです。

## ロールプレイは精度を損なわせる

ロールプレイとは「あなたは○○のプロフェッショナルです。その立場から回答してください」というように、ChatGPTに何らかのふるまいをさせて回答に反映させることです。

このロールプレイも接待モードのようなものです。

とくに注意なのが相性です。指示や質問の対象の領域が、ロールと相性が良いのであれば回答の精度はあがりますが、相性が悪いと、ピントが外れたことを自信満々で話す回答ができあがります。



## 簡単さを求めるか、精度や正確さを求めるかを判断して使う

自分がその分野では素人で、ほどほどな回答が素早く欲しい場合には、接待モードやstep by stepは大変役立ちます。

### 専門家が使えるくらいに精度を上げる方法

* 補完させることなく解釈の揺れも起きないほど明瞭な指示を表現する

精度を上げる方法であるstep by stepや、CoT、ロールプレイが、ほどほどまでは簡単に精度をあげられるが、限界が以外と低いです。

### 具体的な使用例のリンク集

https://zenn.dev/seiyakitazume/articles/bc11bbd020cdfe


# 参考

https://www.google.com/search?q=深津式プロンプト

https://speakerdeck.com/hirosatogamo/da-gui-mo-yan-yu-moderudebian-warumlsisutemukai-fa



-----
# これから実装して欲しい機能

## 過去の全発言の記録

その記録から回答できる機能
過去に質問した事をもう一度入力するのがめんどくさい。

## URL 入力

この URL ページを翻訳してほしいとか数千行のページを一気に読み込ませるとか

## ページ要約

URL 入力したページを自動で要約してもらう。

## 動画翻訳機能

まだ動画の翻訳は不完全 英語から日本語にするとおかしな日本語になっている。

## 色んな人の人格販売

疑似人格を AI が提供された情報や作品などから学習し、問答に利用する。

## 色んな人の音声販売

過去の発言から学習して以下同じ

## 感情分析

入力した文言を解析してどのような感情なのかを判断する。

## 学習

ソクラテス型の教育

### USER
問題を出して
解き方のヒントを教える
答えは教えない
という教え方をしてください。

### ASSISTANT
ソクラテス型の教育とは、古代ギリシャの哲学者であるソクラテスが行っていた問答法に基づく教育方法を指します。

この教育方法では、教師は生徒に対して、自ら問いを投げかけることで生徒自身に考える力を養い、自分で答えを見出すことを促します。具体的には、教師が生徒に問いかけ、生徒が答えを出した後に、教師がその答えに対して更なる質問を投げかけることで、生徒が自分の考えを深め、より正確な答えを導き出すように導きます。

そのため、「問題を出して、解き方のヒントを教える、答えは教えない」というのは、ソクラテス型の教育における一つの手法と言えます。ソクラテス型の教育は、生徒の思考力を高めるだけでなく、批判的思考力や論理的思考力も養うことができるため、現代でも多くの教育機関で取り入れられています。

### USER
生徒と教師役を担って会話で例を見せてください。

### ASSISTANT
生徒：先生、地球はなぜ丸いんですか？

教師：それはいい質問だね。地球がなぜ丸いのか、考えてみよう。地球をどう思う？

生徒：地球は平らだと思っていましたが、宇宙から見ると丸いのかもしれませんね。

教師：そうだね、宇宙から見ると地球は丸く見えるんだ。では、なぜ宇宙から見ると地球が丸く見えるのか、考えてみよう。

生徒：地球が回転しているから、地球が球体の形をしているからかもしれません。

教師：よく考えたね。地球が回転しているから、重力によって中心に向かって引っ張られているため、地球は球体の形をしているんだ。では、なぜ地球が回転するのか、知っている？

生徒：すみません、知りません。

教師：地球が回転している理由は、太陽の引力によって引っ張られているためなんだ。このように、質問に答える過程で、私たちは新しい知識を学ぶことができる。また、知らないことを知ることの大切さも学ぶことができる。