👋

DSPy AIシステム最適化のためのフレームワーク

2024/02/29に公開

DSPyというAIシステム最適化のためのフレームワークライブラリについて調べましたので、内容をまとめます。
AIシステム最適化フレームワークの考え方や設計を学ぶことで、より具体的な最適化の方法や、プロンプトを含んだAIシステムに対するフレームワークの考え方について知見を広げることができると思います。

参照URL: https://github.com/stanfordnlp/dspy

イントロ

githubによるとDspyというのは、一つ以上の言語モデルをシステムパイプライン上で利用する際に、その呼び出し重みやプロンプトの最適化のためのフレームワークです。
例えば、システム内でプロンプトを使ったLLMからの出力を直列に3つ繋げた場合を想像します。
LLM呼び出しAの出力はプロンプトAと初期値(ユーザー入力)に依存します。
LLM呼び出しBの出力はプロンプトBとAからの出力に依存します。
LLM呼び出しCの出力はプロンプトCとAからの出力に依存します。

ここには以下の課題が存在します。

  1. 単純なAIシステムでさえ、LLMの出力が互いに影響し合い出力制御が困難になる。
  2. その制御のためにはCoTなどの技術により、洗練されたプロンプトを使う必要があるが、メンテナンスが難しい。
  3. ユーザー入力に対して自動で最適化するのが望ましいが、プロンプトがあるためその最適化がシンプルな重み調整だけでは達成されない。

このような問題に対して、そのシステムをモジュールに分割し、それぞれに言語モデルによるプロンプトと呼び出し重みの最適化というアプローチを取ります。そのためにはフレームワーク利用者が評価指標を設定することができます。

構文

モジュールを使って例文はこちらのようになります。 例文ではシンプルなRAGシステムを構築しているようです。

    def __init__(self, num_passages=3):
        super().__init__()
        self.retrieve = dspy.Retrieve(k=num_passages)
        self.generate_answer = dspy.ChainOfThought("context, question -> answer")
    
    def forward(self, question):
        context = self.retrieve(question).passages
        answer = self.generate_answer(context=context, question=question)
        return answer     

init()でシステムのコンポーネントを定義して、forward()で動作するイメージですね。
機械学習系のパッケージでpytorchに影響を受けて開発が進められているようなので、かなり構文自体も似ていると思います。
実際の利用シーンで動きがpytorchと似ているかはわかりませんが、あるドメインでの基本となる構文があるのは理解がしやすいので非常に助かります。
このモジュールを定義する時点では、プロンプトやパラメーターの最適化は行われません。
次に示すSignituire, TelePromptersにより最適化を行います。

最適化

最適化のためには、まず①どういったデータに対して最適化を行うのかを定義する必要があります。また②そのデータに対してどういった動作をするとよいのかを定義する必要があります。
TelePromptersが①をSignitureが②を行います。

Signituireでは以下のようにシステムのコンポーネント(ここではCOTをする)に対してどういった動作を行うのかを示します。ここでの情報は最適化の時に期待する動作になるものです。

TelePromprtsでプログラムのコンパイルを行い、プロンプトなどを各ステップで最適化します。
最適化のパラメーターとして学習データ、評価指標、選択したTelePrmopterの種類などがあります。

終わりに

今回はDSPyというLLMシステムの最適化フレームワークライブラリを紹介しました。
この記事が良いと思ったり、今後もRAGに関する記事が見たいと思ってくださったら、いいねお願いします! 
投稿の励みになります!

Discussion