メインコンテンツへスキップ
Colab で開く Instructor は、LLM から JSON などの構造化データを簡単に取得できる軽量ライブラリです。

トレース

開発時と本番環境の両方で、言語モデルアプリケーションのトレースを一元的に保存することが重要です。これらのトレースは、デバッグに役立つだけでなく、アプリケーションの改善に役立つデータセットとしても活用できます。 Weave は Instructor のトレースを自動的に収集します。トラッキングを開始するには、weave.init(project_name="<YOUR-WANDB-PROJECT-NAME>") を呼び出してから、通常どおりライブラリを使用します。
import instructor
import weave
from pydantic import BaseModel
from openai import OpenAI


# 出力構造を定義する
class UserInfo(BaseModel):
    user_name: str
    age: int

# Weave を初期化する
weave.init(project_name="instructor-test")

# OpenAI クライアントにパッチを適用する
client = instructor.from_openai(OpenAI())

# 自然言語から構造化データを抽出する
user_info = client.chat.completions.create(
    model="gpt-3.5-turbo",
    response_model=UserInfo,
    messages=[{"role": "user", "content": "John Doe is 30 years old."}],
)
構造化出力抽出ワークフローを使用した Weave 内の Instructor LM トレース
Weave は、Instructor を使用して行われたすべての LLM calls をトラッキングしてログするようになりました。これらのトレースは、Weave の Web インターフェースで確認できます。

独自のopsをトラッキングする

関数を@weave.opでラップすると、inputs、outputs、アプリのロジックのキャプチャが始まり、データがアプリ内をどのように流れるかをデバッグできるようになります。opsは深くネストできるため、トラッキングしたい関数のツリーを構築できます。また、試行錯誤を進める中でコードのバージョン管理も自動的に始まり、gitにコミットされていないアドホックな詳細もキャプチャできます。 @weave.opでデコレートした関数を作成するだけです。 以下の例では、extract_person関数が@weave.opでラップされたメトリクス関数です。これにより、OpenAIのChat Completion callのような中間stepも確認できます。
import instructor
import weave
from openai import OpenAI
from pydantic import BaseModel


# 希望する出力構造を定義する
class Person(BaseModel):
    person_name: str
    age: int


# Weave を初期化する
weave.init(project_name="instructor-test")

# OpenAI クライアントにパッチを適用する
lm_client = instructor.from_openai(OpenAI())


# 自然言語から構造化データを抽出する
@weave.op()
def extract_person(text: str) -> Person:
    return lm_client.chat.completions.create(
        model="gpt-3.5-turbo",
        messages=[
            {"role": "user", "content": text},
        ],
        response_model=Person,
    )


person = extract_person("My name is John and I am 20 years old")
構造化オブジェクト、関数の入力、出力、Pydantic モデルの検証を含む Instructor の op トレース
extract_person 関数を @weave.op でデコレートすると、その入力、出力、および関数内で行われるすべての内部 LM calls がトレースされます。Weave は、Instructor によって生成された構造化オブジェクトも自動的にトラッキングしてバージョン管理します。

実験しやすくするために Model を作成する

構成要素が多いと、実験内容を整理するのは難しくなります。Model クラスを使用すると、system prompt や使用しているモデルなど、アプリの実験に関する詳細を記録して整理できます。これにより、アプリのさまざまな試行を整理して比較しやすくなります。 Model は、コードのバージョン管理や入力/出力の記録に加えて、アプリケーションの動作を制御する構造化されたパラメーターも記録するため、どのパラメーターが最も効果的だったかを簡単に検索できます。また、Weave Models は serve (以下を参照) や Evaluation と組み合わせて使用することもできます。 以下の例では、PersonExtractor を使って実験できます。これらのいずれかを変更するたびに、PersonExtractor の新しい version が作成されます。
import asyncio
from typing import List, Iterable

import instructor
import weave
from openai import AsyncOpenAI
from pydantic import BaseModel


# 出力構造を定義する
class Person(BaseModel):
    person_name: str
    age: int


# Weave を初期化する
weave.init(project_name="instructor-test")

# OpenAI クライアントにパッチを適用する
lm_client = instructor.from_openai(AsyncOpenAI())


class PersonExtractor(weave.Model):
    openai_model: str
    max_retries: int

    @weave.op()
    async def predict(self, text: str) -> List[Person]:
        model = await lm_client.chat.completions.create(
            model=self.openai_model,
            response_model=Iterable[Person],
            max_retries=self.max_retries,
            stream=True,
            messages=[
                {
                    "role": "system",
                    "content": "You are a perfect entity extraction system",
                },
                {
                    "role": "user",
                    "content": f"Extract `{text}`",
                },
            ],
        )
        return [m async for m in model]


model = PersonExtractor(openai_model="gpt-4", max_retries=2)
asyncio.run(model.predict("John is 30 years old"))
モデルバージョンとトレース履歴を備えた Instructor Weave Model のトレースおよびバージョン管理インターフェース
Model を使用した call のトレースとバージョン管理

Weave Model をサービングする

weave.Model オブジェクトの weave reference があれば、FastAPI サーバーを起動して serve できます。
FastAPI サーバーの設定とモデルのサービングオプションを備えた Instructor の serve インターフェース
任意の weave.Model の weave reference は、モデルの画面に移動して UI からコピーすることで取得できます。
ターミナルで次のコマンドを実行すると、モデルをサーブできます:
weave serve weave://your_entity/project-name/YourModel:<hash>