直感LLM
感想
体系的に書かれていてすごく良かった。
メモ
エンコーダーのみを使う表現モデルと、デコーダーのみを使う生成モデル
BERT:一部をマスクし、その部分を予測させることで、より正確な(中間的な)入力表現を作成できる。これにより転移学習などに用いられる、タスク分類などのタスク向けにファインチューニングされる。
Word2Vec:文脈を考慮せず、「単語の共起関係」に基づいて意味ベクトルを学習。高速で軽量。単語の類似度などに使える。
言語モデルは学習済みのトークナイザーによって、対応するトークン埋め込みを用いて学習が行われる。例えば、BERTではWordPieceトークナイザーが用いられる。GPT-2,4ではバイト対符号化。
トークナイザーによって言語の得意不得意がある。
トークナイザーは、まず文字レベルに分解し、頻度に基づくトークン結合により語彙を生成する。例えば、Galacticaは科学分野に特化している。
トークナイザーの語彙を言語モデルが文脈を考慮したトークン埋め込みを学習する。
LLMの出力について。
temperatureを0にすると貪欲法となり、最も確率の高い単語を出力する。
単語長の制限
理論上はいくらでも入力できるが、計算量とメモリ量がO(n^2)かかるため、制限されている。GPT-4-turbo最大128kはえぐい(GPT-3.5は4096)。何で綺麗に動作するんやろ?調べたい。
次トークン予測するのに(出力はされないが)他のトークンも計算されるの資源勿体無い気がしてまう。→キーバリューキャッシュ
Hugging Faceにある何千もの事前学習済みモデルを全て試すことは現実ではない。以下信頼できるモデル。
BERTベースモデル、RoBERTaベースモデル、DistilBERTベースモデル、DeBERTaベースモデル、bert-tiny、ALBERT base v2
ラベルがない時のゼロショット分類
映画レビューの正負を分類するとき、["A negative review", "A Positive review"]との類似度を計算することでクラス分類。
ChatGPTを用いたクラス分類のプロンプト例
prompt="""Predict whether the following document is a positive or negative movie review:
[document]
If it is positive return 1 and if it is negative return 0. Do not give any other answers.
"""
プロンプトエンジニアリング
具体性
何を達成したいのか明確に記述する。例えば、「商品の説明を書いてください」と指示する代わりに、「商品の説明を2文以内で、フォーマルなトーンで書いてください」といった具体的な指示を与える。
幻覚
「答えを知っている場合のみ返答し、知らない場合は「わかりません」と答えるように」と指示するのが効果的。
順序
指示は最初か最後におくのが効果的。
高度なプロンプトエンジニアリング
ペルソナ
どのような役割を担わせるか。天体物理学に関する質問を行う場合は、「あなたは天体物理学の専門家です」のように指示する。
指示
タスクそのものを記述する。できるだけ具体的に、解釈の余地を最小限にする。
文脈
問題やタスクの背景情報を記述する。例えば「なぜこのような指示をしたのか?」といった質問に答える形で記述する。
形式
生成すべきテキストの形式を指定する。形式をしていないと、独自の形で出力するため、後続の処理が難しくなる。
対象者
テキストの想定読者やレベルを指定する。
トーン
生成するテキストで使用する口調やスタイルを指定する。
データ
タスクに直接関連する主要なデータ。
プロンプトの連鎖:問題の段階的な解決
CoTを提案した論文で使われた例:
思考の連鎖で回答する
cot_prompt = [
# ロジャーは5個のテニスボールを持っています。
# さらに2缶のテニスボールを購入しました。
# 1缶には3個のテニスボールが入っています。
# 彼は今、合計で何個のテニスボールを持っているでしょうか?
{"role": "user", "content": "Roger has 5 tennis balls. He buys 2 more cans of tennis balls. Each can has 3 tennis balls. How many tennis balls does he have now?"},
# まずロジャーは5個のボールを持っていました。
# 2缶にはそれぞれ3個のボールが入っているので、6個のボールが追加されます。
# 5 + 6 = 11。答えは11個です。
{"role": "assistant", "content": "Roger started with 5 balls. 2 cans of 3 tennis balls each is 6 tennis balls. 5 + 6 = 11. The answer is 11."},
# 食堂にはリンゴが23個ありました。
# 20個をランチに使い、新たに6個購入した場合、リンゴは何個あるでしょうか?
{"role": "user", "content": "The cafeteria had 23 apples. If they used 20 to make lunch and bought 6 more, how many apples do they have?"}
]
出力を生成
outputs = pipe(cot_prompt)
print(outputs[0]["generated_text"])
他にも効果的な方法として、「ステップバイステップで考えましょう(Let's think step-by-step.)」というフレーズがある。
自己整合性
思考の木
Zero-shot tree-of-thought
zeroshot_tot_prompt = [
# 3人の異なる専門家がこの質問に答える様子を想像してください。
# 各専門家は、まず1ステップずつ考えを紙に書き、それを他の専門家と共有します。
# その後、次のステップに進むという形で進行します。
# 途中で誰かが自分の間違いに気づいた場合、その場を離れます。
# 質問は「食堂にはもともと23個のリンゴがありました。
# 昼食に20個使って、さらに6個買いました。
# 今、リンゴはいくつあるでしょう?」です。
# 結果について必ず議論してください。
{"role": "user", "content": "Imagine three different experts are answering this question. All experts will write down 1 step of their thinking, then share it with the group. Then all experts will go on to the next step, etc. If any expert realizes they're wrong at any point then they leave. The question is 'The cafeteria had 23 apples. If they used 20 to make lunch and bought 6 more, how many apples do they have?' Make sure to discuss the results."}
]
高度なテキスト生成
LandChain:抽象化を通じてLLMを使いやすくするフレームワーク。
他には、DSPy、Haystackといったフレームワークが注目されている。
量子化
LLMのパラメータを表現するのに必要なビット数を減らしつつ、元の情報をできるだけいじしようとする技術。
Langchain
from langchain import LLMChain
# ストーリーのタイトルのためのチェインを作成する
# {summary}に関するストーリーのタイトルを作成してください。タイトルのみを返すこと。
template = """<s><|user|>
Create a title for a story about {summary}. Only return the title.<|end|>
<|assistant|>"""
title_prompt = PromptTemplate(template=template, input_variables=["summary"])
title = LLMChain(llm=llm, prompt=title_prompt, output_key="title")
# あらすじとタイトルを使って主人公の説明のためのチェインを作成する
# {summary}に関するタイトル{title}が付いたストーリーの主人公を説明してください。
# 2文で説明すること。
template = """<s><|user|>
Describe the main character of a story about {summary} with the title {title}. Use only two sentences.<|end|>
<|assistant|>"""
character_prompt = PromptTemplate(
template=template, input_variables=["summary", "title"]
)
character = LLMChain(llm=llm, prompt=character_prompt, output_key="character")
# あらすじ、タイトル、主人公の説明を使ってストーリーのためのチェインを作成する
# {summary}に関するタイトル{title}が付いたストーリーを作成してください。
# 主人公は{character}です。ストーリーのみを1段落以内で返すこと。
template = """<s><|user|>
Create a story about {summary} with the title {title}. The main character is: {character}. Only return the story and it cannot be longer than one paragraph. <|end|>
<|assistant|>"""
story_prompt = PromptTemplate(
template=template, input_variables=["summary", "title", "character"]
)
story = LLMChain(llm=llm, prompt=story_prompt, output_key="story")
# 3つのチェインを組み合わせて1つのチェインを作成する
llm_chain = title | character | story
llm_chain.invoke("a girl that lost her mother")
{'summary': 'a girl that lost her mother',
'title': ' "In Loving Memory: A Journey Through Grief"',
'character': ' The protagonist, Emily, is a resilient young girl who struggles to cope with her overwhelming grief after losing her beloved and caring mother at an early age. As she embarks on a journey of self-discovery and healing, she learns valuable life lessons from the memories and wisdom shared by those around her.',
'story': " In Loving Memory: A Journey Through Grief revolves around Emily, a resilient young girl who loses her beloved mother at an early age. Struggling to cope with overwhelming grief, she embarks on a journey of self-discovery and healing, drawing strength from the cherished memories and wisdom shared by those around her. Through this transformative process, Emily learns valuable life lessons about resilience, love, and the power of human connection, ultimately finding solace in honoring her mother's legacy while embracing a newfound sense of inner peace amidst the painful loss."}
主人公の説明:「主人公のエミリーは、幼い頃に最愛の母を亡くし、
胸が張り裂けるような悲しみに対処しようと奮闘する、たくましい少女です。
自分自身を見つめ直し、癒しを求める旅に出たエミリーは、周囲の人々から学んだ思い出や知恵から、
人生の大切な教訓を学びます。」
ストーリー:「『喪失のささやき:悲しみを乗り越える旅』は、幼い頃に
最愛の母を亡くしたエミリーを中心に展開されます。胸が張り裂けるような悲しみに
対処しようと奮闘する彼女は、自分自身を見つめ直し、癒しを求める旅に出て、
周囲の人々から受け取る思い出や知恵に支えられます。この変化を通じて、エミリーは
たくましさや愛、人と人とのつながりの力といった人生の大切な教訓を学び、最終的には、
母の遺したものを大切にしながら、喪失の悲しみの中にあっても心の平穏を見出します。」
Discussion