DSPyの内部:知っておく必要のある新しい言語モデルプログラミングフレームワーク
DSPyの内部:新しい言語モデルプログラミングフレームワークの概要
スタンフォードの研究者によって作成されたこのフレームワークは、LangChainやLlamaIndexに興味深い代替手段を提供しています。
最近、AIに特化した教育ニュースレターを開始しました。現在、すでに16万人以上の購読者がいます。TheSequenceは、5分で読めるML指向のニュースレターであり、ハイプやニュースなどの要素は一切ありません。このニュースレターでは、機械学習プロジェクト、研究論文、概念について最新情報を提供します。ぜひ以下から購読して試してみてください。
TheSequence | Jesus Rodriguez | Substack
機械学習、人工知能、データの最新動向を把握するための最良の情報源です。
thesequence.substack.com
言語モデルプログラミング(LMP)フレームワークの世界は、ここ数ヶ月間で急速に拡大しています。LangChainやLlamaIndexなどのフレームワークは、確かにLLMコミュニティ内での採用レベルを高めており、MicrosoftのSemantic Kernelは印象的な能力を持っています。最近、DSPyという新しい代替手段がLMPの場に登場しました。
DSPyは、Stanford大学の研究者によって作成され、さまざまなLMPタスクに対して改善された抽象化を提供することを目指しています。DSPyは、プロンプティングではなくプログラミングを優先し、より洗練されたLMPアプリケーションの開発を可能にしようとしています。現在のLLMの制約の一部は、ループや条件文などの制御ロジックにおいて効果的ではなく、ファインチューニングや知識拡張などのタスクには基本的に異なる構造が必要です。DSPyは、プログラミング中心のアプローチでこれらの問題に取り組もうとしています。
- 「WavJourney:オーディオストーリーライン生成の世界への旅」
- 「ChatGPTをより優れたソフトウェア開発者にする:SoTaNaはソフトウェア開発のためのオープンソースAIアシスタントです」
- 「第一の汎用ビジュアルと言語のAI LLaVA」
DSPyの経験と原則は、ディープラーニングの領域でのPyTorchといくつかの類似点があります。PyTorchを使用してディープラーニングアプリケーションを構築する際、データサイエンティストは特定のニューラルネットワークをモデリングし、宣言的なレイヤーや最適化アルゴリズムを使用して所望のロジックを組み込みます。同様に、DSPyにはChainOfThoughtやRetrieveなどの構築ブロックが含まれ、プログラムをコンパイルし、特定のメトリックに基づいてプロンプトを最適化します。LMPでは新しいアプローチのように感じるかもしれませんが、このアプローチは非常に伝統的です。
DSPy
DSPyは、プロンプティングタスクよりもプログラミングを優先し、プロンプティングとファインチューニングの両方の言語モデル(LM)に関する戦略を統一します。このフレームワークは、推論とツール/検索の拡張を推進し、Pythonicな操作の簡潔なコレクションを通じてこれらのテクニックを学習可能で組み合わせ可能なものにします。
DSPyのフレームワーク内には、LLMをガイドするための組み合わせ可能で宣言的なモジュールが存在します。特に、DSPyはプログラム内の宣言的なステージの実行を教育する自動コンパイラを導入しています。このコンパイラはプログラムの実行を内部的にトレースし、タスクの複雑さに適した高品質のプロンプトを作成します。これにより、より大規模なLMに適したプロンプトや小規模なLMの自動ファインチューニングのトレーニングが可能となり、タスクのニュアンスを内部化することができます。
DSPyは、言語モデル(LM)および検索モデル(RM)を含む複雑なタスクに対する包括的なソリューションとして機能し、プロンプティングとファインチューニングの両方のアプローチを調和させ、推論およびツール/検索の拡張方法にも対応しています。DSPyを介して、これらの手法はPythonicなモジュールのコンパクトなアンサンブルによってカプセル化され、組み合わせや学習を容易にします。
DSPyのフレームワークは、Pythonのユーザーにとってなじみのある形式で構成される組み合わせ可能で宣言的なモジュールを提供することで可能になっています。この進歩により、手動の文字列操作手法から多様なタスクに適応可能な柔軟なモジュラー手順への「prompting techniques」(例:chain-of-thoughtやself-reflection)が向上しました。
特に、DSPyは手順の中間ステップに手動のラベルが必要なく、プログラム内の手段としての「prompt engineering」の従来の手法とは異なります。代わりに、DSPyは脆弱な手動プロセスを置き換える体系的なアプローチを提供し、構造化されたモジュラーでトレーニング可能なコンポーネントの領域を探索する可能性を開きます。
DSPyプログラミングの経験は、2つの基本的な構造、シグネチャとテレプロンプタに基づいています。
I. シグネチャ: LLMの振る舞いを作成する
DSPyの領域では、タスクがLMに割り当てられる際、振る舞いの特異性はシグネチャを通じて表現されます。シグネチャは、DSPyモジュールに関連付けられた入出力の振る舞いパターンの宣言的表現をカプセル化します。
LLMをサブタスクに導くための努力を払う代わりに、シグネチャはDSPyユーザーにサブタスクの性質を明確にする力を与えます。その後、DSPyコンパイラは指定されたシグネチャ、提供されたデータ、および既存のパイプラインに合わせて、大規模なLMまたは小規模なLLMに合わせた複雑なプロンプトを考案する責任を負います。
シグネチャは3つの基本要素から構成されます:
1) LMが対処するサブタスクの簡潔な明示。
2) 1つ以上の入力フィールド(例:入力質問)の詳細。
3) LMによって生成されると予想される1つ以上の出力フィールド(例:質問の回答)の説明。
次のコードは、ChainOfThoughtモジュールに基づいたシグネチャを示しています:
class GenerateSearchQuery(dspy.Signature): """複雑な質問に答えるのに役立つシンプルな検索クエリを記述します。""" context = dspy.InputField(desc="関連する事実を含む場合があります") question = dspy.InputField() query = dspy.OutputField()### プログラムの__init__関数の中でself.generate_answer = dspy.ChainOfThought(GenerateSearchQuery)を実行します
II. dspy.telepromptを使用したプログラムの最適化の有効化
コンパイルはDSPyの体験の中心です。
コンパイルは、潜在的にコンパクトなトレーニングデータセット、検証用メトリック、およびDSPyのレパートリーからのテレプロンプタの選択に依存します。これらのテレプロンプタは、DSPyに埋め込まれたパワフルな最適化ツールであり、任意のプログラムのモジュールに適した効果的なプロンプトの作成をマスターすることができます(「teleprompter」の「tele-」接頭辞は「遠隔」を意味し、自動的なプロンプトの特性を参照しています)。
驚くべきことに、DSPyのラベリングに対する要求は非常に控えめです。例えば、質問と人間によって注釈付けされた回答を含む少数のインスタンスでも、retrieve augmented generation(RAG)パイプラインの場合には十分です。基本的なRAGモデルでは、コンテキストの検索、考えの連鎖、そして最終的な回答という複数の複雑なステージを含む場合でも、ラベルは最初のクエリと最終的な応答にのみ必要です。DSPyは、パイプライン構造に変更が加えられた場合でも、ブートストラップされたデータが変更されたセットアップに合わせて動的に進化するように工夫されています。
RAGトレーニングセットのインスタンスは次のように構成できます:
my_rag_trainset = [ dspy.Example( question="ゲーリー・ズーカフの最初の本はどの賞を受賞しましたか?", answer="国家図書賞" ), ...]
その後、検証基準を明確にすることが重要です。このロジックは、プログラムの振る舞いやモジュールの性能に制約を課します。たとえば、RAGの検証関数は以下のようなチェックを行う場合があります:
def validate_context_and_answer(example, pred, trace=None):answer_match = example.answer.lower() == pred.answer.lower()context_match = any((pred.answer.lower() in c) for c in pred.context)return answer_match and context_match
異なるテレプロンプタのオプションには、コスト最適化と品質向上のトレードオフが関連しています。RAGの文脈では、BootstrapFewShotテレプロンプタが選択肢となる場合があります。これには、テレプロンプタ自体をカスタムの検証関数(例:my_rag_validation_logic)で初期化し、指定されたトレーニングセット(my_rag_trainset)に対してコンパイルを実行するという手順が含まれます。
from dspy.teleprompt import BootstrapFewShotteleprompter = BootstrapFewShot(metric=my_rag_validation_logic)compiled_rag = teleprompter.compile(RAG(), trainset=my_rag_trainset)
コンパイルされたRAGインスタンスを使用すると、LMを詳細なプロンプトで呼び出すフェーズが開始されます。これらのプロンプトには、一意のデータセットに合わせたchain-of-thought検索を補完した質問回答が簡潔に示されています。
DSPyはまだ非常に初期の段階ですが、すでにいくつかの有望なアイデアを示しています。PyTorchの経験に似たシンプルで一貫したプログラミングモデルと、LMP開発者が非常に洗練された体験を構築できるモジュラーな体験が可能です。私はDSPyがこの初期段階からLangChainとLlamaIndexに匹敵するスタックに進化することを願っています。なぜなら、このフレームワークのアイデアの多くは、確かにLMPの領域で必要とされているからです。
We will continue to update VoAGI; if you have any questions or suggestions, please contact us!
Was this article helpful?
93 out of 132 found this helpful
Related articles
- 機械学習なしで最初の自動修正を作成する
- 効率的なディープラーニング:モデルの圧縮のパワーを解き放つ
- このAI論文では、Complexity-Impacted Reasoning Score(CIRS)を紹介していますこれは、大規模な言語モデルの推論能力を向上させるためのコードの複雑さの役割を評価するものです
- 「脳に触発された学習アルゴリズムにより、人工およびスパイキングニューラルネットワークにメタプラスティシティを可能にする」
- メタAIのコンピュータビジョンにおける公平性のための2つの新しい取り組み:DINOv2のためのライセンス導入とFACETのリリースの紹介
- 『AnomalyGPTとは:産業異常を検出するための大規模ビジョン言語モデル(LVLM)に基づく新しいIADアプローチ』
- 「セマンティックカーネルへのPythonistaのイントロ」