クロードのトリガアイとLangChainを使った自己改良型プロンプトエンジニアリング
Published on
はじめに
Anthropicの強力なAIアシスタントであるClaudeは、驚異的な言語理解と生成能力を示しています。特に、最近リリースされたClaude 3モデル、特にOpusのバリアントは、プロンプトエンジニアリング(言語モデルから高品質な出力を引き出すための効果的なプロンプトの設計の芸術)において優れた能力を発揮します。
これにより、興味深い可能性が開けます:Claudeのプロンプトエンジニアリング能力を活用して、自己改良型のプロンプトを作成できるのではないでしょうか?初期プロンプトから生成された出力の品質をClaude 3が分析し、改善案を提案することで、与えられたタスクのためのプロンプトを最適化するための自動フィードバックループを作成することができます。
この記事では、Claude 3 Opusと言語モデルを使用したこの自己改良型プロンプト戦略を実装する方法を解説します。AI研究者であるエルビス・サラヴィア(Twitter:@omarsar0 (opens in a new tab))の魅力的なスタイルで学術論文の要約を行うタスクに適用してみましょう。
プロンプトエンジニアリングのワークフロー
Alex Albert(Twitter:@alexalbert__ (opens in a new tab))は最近、Claude 3 Opusを使用した効果的なプロンプトエンジニアリングのワークフローを共有しました:
- タスクのための初期プロンプトを書く
- プロンプトを評価するためのテストセットを生成する
- テストケースでプロンプトを実行する
- 出力を手動でレビューし、評価する製品
- 評価された例をClaude 3 Opusにフィードバックし、プロンプトを改訂してもらう
- 繰り返す
Will Hinthorn(Twitter:@WHinthorn (opens in a new tab))とRoss Lance Martin(Twitter:@rlancemartin (opens in a new tab))は、LangSmithを使用してこのプロセスを効率化する方法を示しています:
- テストケースのデータセットを作成する
- 生成された出力にフィードバックを注釈付けする
- フィードバックをClaude 3 Opusに渡し、プロンプトを書き直す
- これを反復的に改善する
では、TwitterのAI研究者であるエルビス・サラヴィアの優れたスタイルで学術論文を要約するタスクに、このアプローチを実装してみましょう。
ステップ1:データセットに論文をロードする
まず、エルビスがツイートしたいくつかの論文を選択し、LangChainのArxivLoaderを使用してロードします:
from langchain_community.document_loaders import ArxivLoader
ids = ["2403.05313", "2403.04121", "2402.15809"]
docs = []
for paper_id in ids:
doc = ArxivLoader(query=paper_id, load_max_docs=1).load()
docs.extend(doc)
次に、論文のテキストをLangSmithのデータセットに追加します:
from langsmith import Client
client = Client()
ds_name = "Tweet Generator"
ds = client.create_dataset(dataset_name=ds_name)
client.create_examples(
inputs=[{"paper": doc.page_content} for doc in docs], dataset_id=ds.id
)
ステップ2:初期プロンプトでテストする
次に、Claude 3 Opusが論文の要約ツイートを生成するための妥当な初期プロンプトを書きます:
from langchain_anthropic import ChatAnthropic
from langchain_core.prompts import ChatPromptTemplate
chat = ChatAnthropic(temperature=0, model_name="claude-3-opus-20240229")
system = (
"<role>あなたは学術論文またはオープンソースプロジェクトを要約するTweetを生成するアシスタントです。</role>"
)
human = "Tweetに変換するための論文は以下です:<paper> {paper} </paper>"
current_prompt_str = system + human
prompt = ChatPromptTemplate.from_messages([("system", system), ("human", human)])
tweet_generator = prompt | chat
以下の例の論文に対してテストすることができます:
tweet_example = tweet_generator.invoke({"paper": docs[0].page_content})
print(tweet_example)
これにより、論文のまとめの初期のツイートが生成されます。
ステップ3:データセットで実行する
プロンプトをより詳細に評価するために、全データセットの論文に対して実行します:
res = client.run_on_dataset(
dataset_name=ds_name,
llm_or_chain_factory=tweet_generator,
)
ステップ4:出力を手動で評価する
LangSmithの注釈キューの機能を使用して、生成されたツイートを手動でレビューし、フィードバックを提供できます:
q = client.create_annotation_queue(name="Tweet Generator")
client.add_runs_to_annotation_queue(
q.id,
run_ids=[
r.id
for r in client.list_runs(project_name=res["project_name"], execution_order=1)
],
)
評価をガイドするために、エルビスの実際の論文の要約ツイートのいくつかを参考にすることができます。
ステップ5:プロンプトを改善する
出力を注釈付きのフィードバックとしてフィードバックします:
formatted_feedback = get_formatted_feedback(res["project_name"])
次に、LangChain Hubからプロンプト最適化テンプレートを使用して、フィードバックをClaude 3 Opusにフィードバックします:
from langchain import hub
from langchain_core.output_parsers import StrOutputParser
optimizer_prompt = hub.pull("rlm/prompt-optimizer-tweet-drafts")
optimizer = optimizer_prompt | chat | StrOutputParser() | extract_new_prompt
new_prompt_str = optimizer.invoke(
{
"current_prompt": current_prompt_str,
"annotated_predictions": "\n\n".join(formatted_feedback).strip(),
}
)
このマークダウンファイルは、Elvisの執筆スタイルとスレッド構造により適合するようにフィードバックを組み込んだ改良されたプロンプトを生成します。
ステップ6:新しいプロンプトの評価
最後に、改良されたプロンプトをデータセット上で再実行して改善を確認できます:
new_prompt = ChatPromptTemplate.from_messages([("user", new_prompt_str)])
tweet_generator_v2 = new_prompt | chat
updated_results = client.run_on_dataset(
dataset_name=ds_name,
llm_or_chain_factory=tweet_generator_v2,
)
元のプロンプトと改訂版のプロンプトの出力を比較すると、Claude 3 Opusとのフィードバックループが効果的で、Elvisスタイルの論文要約をより魅力的に生み出すためのプロンプトを調整することができました。
例えば、新しいテスト論文の初期プロンプトと改善されたプロンプトによって生成されるツイートは以下の通りです:
初期プロンプト:
大規模な言語モデル(LLM)を使用した表形式データの予測、生成、および質問応答などのタスクに関する新しい調査。シリアライズ、プロンプトエンジニアリング、およびベンチマークのような主要な技術のカバーも行っています。機会と課題を明らかにします。
改善されたプロンプト:
表形式データにおけるLLMのポテンシャルの解放 🔑
この包括的な調査では、大規模な言語モデルを予測、生成、理解のために表形式データに適用する方法について探究します。
主要な技術のカバー範囲:
- テーブルをLLMが読み取れる形式にシリアライズする
- 文脈の長さに合わせたテーブルの操作
- プロンプトエンジニアリングのテクニック
- 終端までのシステムの構築
この論文は、各応用領域に対するデータセット、評価尺度、および手法の分類を提供します。また、現在の制約と将来の研究方向についても議論しています。
LLMは、適切な前処理ステップとプロンプト戦略との組み合わせによって、構造化データとの取り組みにおいて素晴らしいポテンシャルを示しています。これは、表形式データを分析するためのより知的で自動化されたシステムの魅力的な可能性を生み出します。
構造化データへのLLMの他の革新的な応用については、どのような予測ができますか? 🤔
改訂されたツイートは、主要なポイントをより分かりやすく示し、視覚的な興味を引くために絵文字を追加し、観客の関与を喚起する思考を促す質問で締めくくっています。これらはすべてElvisスタイルの特徴的な要素です。
結論
Claude 3 Opusのプロンプトエンジニアリングの機能とLangChain、LangSmithのフレームワークを組み合わせることで、特定の執筆スタイルで論文を要約するためのプロンプトを進行的に最適化するための自動フィードバックループを作成することができました。
これは、特定の仕様に従って言語モデルを調整し、目標のスタイルをエミュレートするための強力な一般的なアプローチを示しています。同じ技術は、さまざまな他のテキスト生成タスクのプロンプトを自動的に改善するために適用することができます。
言語モデルが進化し続けるにつれて、最大限のポテンシャルを引き出すためのプロンプトエンジニアリングツールやワークフローがより高度になることが期待されます。LangChainのようなフレームワークは、これをより広範な開発者に利用可能にし、魅力的な新しいアプリケーションを開く上で重要な役割を果たします。