見出し画像

ChatGPTに渡す文章の適切な区切り線について検証した記事

はじめに

大規模言語モデルであるChatGPTに文章を渡す際、適切な区切り線の使用は、情報の正確な伝達や解釈に大いに役立ちます。
この記事では、区切り線に適切なものを検証します。

区切り線とは?使い方

区切り線は文章を区切る時に使用する文字列のことです。
例えば下記のようなものです。
また、使い方をまとめた記事もあるので参考にしてください。

def test()
    a = "a"
    b = "b"
    c = a + b
    print(c)

================================ ←これが区切り線

上記のコードについて教えてください

結論

先に結論を言うと、4個~16個連続した「-」か「=」
もしくは8の倍数の「-」か「=」が区切り線としてはベストでした。

----
----------------
--------------------------------
====
================
================================

なぜ区切り線が必要なのか

ChatGPT等のAIには文章を文字列として入力しますが、一つの入力で複数の独立した文章や命令を渡したいケースも多々あります。以下にいくつかの具体例を挙げます。

  1. 質問と補足情報の分離:主要な質問文とその補足情報を明確に区切りたい場合。

  2. 複数の命令:一度の入力で複数の動作を指示したい場合。

  3. 文章の構造化:長い文章やレポートを段落やセクションに分けて整理したい場合。

このような場合に、適切な区切り線を使用することで意図が明確になり、ChatGPTの返答の質を大きく向上させることができます

区切り線として検証した種類

  • -:ハイフン

  • :ダッシュ

  • =:イコール

  • *:アスタリスク

  • ~:チルダ

  • #:ハッシュ

  • _:アンダースコア

検証の方法

1,トークン数のチェック

初めに、各区切り文字がトークンとしてどのように解釈されるかを検証します。これは、特定の区切り文字が単一のトークンとして扱われるか、それとも複数のトークンとして分解されるかを判断するためです。
適切な区切り線は1Tokenで解釈されるであろうと仮定します。
それに複数TokenになるとTokenがもったいないですし。

2,GPT-4への質問での確認

次に、GPT-4にどの区切り文字が最も効果的であるかを聞きます。
ご本人に聞いてしまうのが一番です。

※トークナイザーについて

この検証で使用しているトークナイザーはcl100k_baseです。これはChatGPT3.5及びChatGPT4で採用されているトークナイザーです。トークナイザーとは、文字列を言語モデルが理解しやすい形に変換するソフトウェアの一部です。文章を単語等に分解してくれます。詳細はググってくれい。

使用したコード

以下に、検証で使用したPythonコードを示します。

import tiktoken
from tiktoken.core import Encoding
import pandas as pd

encoding: Encoding = tiktoken.get_encoding('cl100k_base')

# Initialize an empty list to store the formatted output
formatted_output = []

# Temporary list to hold the entries for sorting
temp_list = []

# Loop through each special character
for char in ['-', '―', '=', '*', '~','_','#']:
    for i in range(1, 101):
        # Assume encoding.encode() returns the encoded string as a list of token IDs
        encoded = encoding.encode(char * i)
        
        # Create a formatted string
        token_ids_str = ', '.join(map(str, encoded))
        formatted_str = f"文字:{char}{i}個, トークン数:{len(encoded)}, 番号:[{token_ids_str}]"
        
        # Append to temporary list along with the token count for sorting
        temp_list.append((len(encoded), char, formatted_str))

# Sort the list first by token count, then by character
temp_list.sort(key=lambda x: (x[0], x[1]))

# Extract the formatted strings and add them to the final output
formatted_output = [entry[2] for entry in temp_list]

# Print the formatted output
for line in formatted_output:
    print(line)

このコードは、各区切り文字を1から100個まで増やしながら、それが何個のトークンとして解釈されるかを確認しています。

検証開始

検証1:トークンの確認
検証2:GPT4に下記の中で別の意味のあるものを聞く(#1文字=ハッシュタグ、##や###はマークダウンの見出し等意味があるのがあるため区切り線として以外の意味も持ち合わせており混乱のもとになる為)
検証3:GPT4に区切り線どれがいい?と聞く

検証1

上記のコードを実行し、トークンが1つのものの結果のみをまとめました。
それを見やすいようにそろえると下記のようになりました。
連続している箇所は~中略~してあります。
(文字数が見た目と個数で違う?GPT君のミスです。無視してください。文字は偽で個数が正です。)

|文字|個数|トークン数|番号|
|--------------|------|-----------|--------|
|#|1|1|2|
~中略~
|########|8|1|1381|
|############|12|1|17913|
|################|16|1|2488|
|########################|24|1|85399|
|###########################|28|1|89200|
|################################|32|1|5134|
|########################################|40|1|83678|
|################################################|48|1|30954|
|#####################################################|56|1|91138|
|##########################################################|60|1|98944|
|#############################################################|64|1|13367|
|###################################################################|72|1|70161|
|######################################################################|76|1|33141|
|###############################################################################|80|1|41586|
|*|1|1|9|
~中略~
|********|8|1|601|
|****************|16|1|903|
|********************|20|1|33047|
|*****************************|24|1|13745|
|************************************|28|1|36866|
|****************************************|32|1|1724|
|********************************************************|40|1|41172|
|****************************************************************|48|1|47676|
|*************************************************************************|56|1|54247|
|*******************************************************************************|64|1|4169|
|**************************************************************************************|72|1|5713|
|************************************************************************************************|76|1|34618|
|*****************************************************************************************************|80|1|62793|
|-|1|1|12|
~中略~
|----------------|16|1|776|
|---------------------|20|1|98804|
|--------------------------|28|1|28914|
|----------------------------|30|1|86226|
|-------------------------------|32|1|1434|
|----------------------------------------|48|1|9411|
|----------------------------------------------|64|1|3597|
|----------------------------------------------------|70|1|54364|
|---------------------------------------------------------|76|1|23151|
|----------------------------------------------------------------|80|1|44549|
|-------------------------------------------------------------------------|96|1|99574|
|=|1|1|28|
~中略~
|================|16|1|1547|
|=======================|32|1|3134|
|=====================================|48|1|19311|
|====================================================|64|1|8315|
|========================================================================|80|1|64494|
|_|1|1|62|
~中略~
|____|5|1|10819|
|_______|8|1|4067|
|_______________|12|1|42483|
|____________________|16|1|7841|
|__________________________________|32|1|17924|
|_______________________________________________|64|1|48032|
|~|1|1|93|
|~~|2|1|5940|
|~~~~|4|1|10526|
|~~~~~~~~|8|1|18368|
|~~~~~~~~~~~~~~~|16|1|33643|
|~~~~~~~~~~~~~~~~~~~~~~|32|1|66748|
|―|1|1|63072|

検証2

GPT4君に意味のある記号を出してもらいました。

興味深い質問ですね。それぞれの記号について、一般的な用途を考慮して説明しましょう。

ハッシュ記号(#)
#1個 (#): Markdownで見出しを作成する際や、プログラミング言語でコメントを書く際に使用される。
#2個 (##): Markdownでサブ見出しを作成する際に使用。
#3個 (###) ~ #6個 (######): Markdownでさらに下位の見出しを作成。
アスタリスク(*)
1個 (*): Markdownで斜体にする際、または箇条書きのリストを作成する際に使用。
2個 (**): Markdownで太字にする際に使用。
3個 (***): Markdownで斜体と太字を組み合わせる際に使用。
ハイフン(-)
1個 (-): 箇条書きリストを作成する際や、数学的な減算、またはダッシュとして使用。
2個 (--): エンダッシュを模倣する際に使用。
3個 (---): エムダッシュを模倣する際に使用。
イコール(=)
1個 (=): プログラミングで代入演算子として、または数学で等しいを意味する際に使用。
2個 (==): プログラミングで等価性をテストする際に使用。
チルダ(~)
1個 (~): 約を意味する際や、Unix系システムでホームディレクトリを指す際に使用。
2個 (~~): Markdownで取り消し線を作成する際に使用。
アンダーバー(_)
1個 (_): プログラミングで変数名に使用されることが多い。また、Markdownで斜体を表すのにも使われます。
2個 (__): Pythonなどのプログラミング言語で特殊メソッドやプライベート変数を指定する際に使われることがあります。
以上のように、これらの記号は多くの文脈で特定の用途に使用されます。
それ以外の多くの記号や記号の組み合わせは、特定の用途があるわけではないことが多いです。

その結果、それぞれ下記のものは意味があるとのことなので結果から除外します。

  • ハッシュ記号(#)1-6個

  • アスタリスク(*)1-3個

  • ハイフン(-)1-3個

  • イコール(=)1-2個

  • チルダ(~)1-2個

  • アンダーバー(_)1-2個

以上の結果を踏まえると、区切り線として使えるのは下記のようになります

  • ハッシュ記号(#)7,8,12,16,24,28,32,40,48,56,60,64,72,76,80

  • アスタリスク(*)4,5,6,7,8,16,20,24,28,32,40,48,56,64,72,76,80

  • ハイフン(-)4,5,6,7,8,9,10,11,12,13,14,15,16,20,28,30,32,48,64,70,76,80,96

  • イコール(=)3,4,5,6,7,8,9,10,11,12,13,14,15,16,32,48,64,80

  • チルダ(~)4,8,16,32

  • アンダーバー(_)3,4,5,8,12,16,32,64

検証3

先ほどの結果を元に、全ての文字に共通してある個数は8個と16個なので、その2つをGPT4君投げて聞いてみました。

8個
 
個人的には、例4"========"が一番わかりやすいと感じます。
理由としては、"="記号が他の記号よりも目立ち、区切り線としての役割を果たしていると感じたからです。
また、プログラミングにおいて"="は代入を意味するため、
コードの区切りとしても適していると思います。
ただし、これは個々の視覚的な好みに大きく依存するため、
他の人にとっては異なる記号が一番わかりやすいかもしれません。
 
では2番目はなんですか?
 
2番目にわかりやすいと感じるのは例3"--------"です。
理由としては、ハイフンは一般的に文章の区切りや一時的な中断を示すためによく使われる記号であり、
そのため区切り線としての役割を果たすのに適していると感じるからです。
また、視覚的にもシンプルで読みやすいと感じます。
16個
 
個人的には、例4"===="が一番わかりやすいと感じます。
その理由は、"===="が最も目立ち、区切りとしての機能を果たしているからです。
また、一般的にプログラミングにおいて"===="は区切り線としてよく使われます。
 
では2番目はなんですか?
 
2番目にわかりやすいと感じるのは例3"----------------"です。
理由としては、"-"記号も目立ち、また一般的に文章の区切り線としてよく使われるため、
視覚的に区切りとして認識しやすいと感じるからです。

はい。以上の結果から、GPT君はイコール「=」の連続したものが区切り線として一番わかりやすい。と述べています。
その次はハイフン「-」だそうです。

結論

以上の結果から、ChatGPTに文章を渡す際に区切り線として適しているのは
4個~16個連続した「-」「=」か、もしくは8の倍数の「-」か「=」
らしいです。

====
========
================
========================
================================
----
--------
----------------
------------------------
--------------------------------


まあ結果としてざわきんさんのサイトと内容は一緒です。
今も一緒なのかなーというのと、実際に自分もやって検証してみよーという動機で書いた記事でした。

参考サイト:

https://zenn.dev/zawawahoge/articles/4519112f1ad5ed

この記事が気に入ったらサポートをしてみませんか?