メインコンテンツへスキップ
これはインタラクティブなノートブックです。ローカルで実行するか、以下のリンクを使用できます。

Weave と OpenAI を使用したコード生成

適切な構造、ドキュメント、テストを備えた高品質なコードを生成するのは、簡単なことではありません。このガイドでは、コード生成パイプラインの実装方法を紹介します。humaneval テストスイートに対して高品質な Python 関数を生成する、コード生成パイプラインの作成方法を学べます。 評価の比較とトラッキングには Weave を使用し、構造化出力を用いたコード生成には OpenAI の GPT モデルを使用します。
評価

Weave を使用する理由

このチュートリアルでは、Weave を使用してコード生成パイプラインを実装し、評価します。以下のことを学びます。
  1. LLM パイプラインをトラッキングする: コード生成プロセスの入力、出力、中間 step をログします。
  2. LLM の出力を評価する: 豊富なデバッグツールと可視化機能を使用して、生成したコードの評価を作成し、比較します。

環境を設定する

まず、環境を設定し、必要なライブラリをインポートしましょう。
Weave は、入力、出力、メタデータを含む OpenAI API の呼び出しを自動的にトラッキングします。つまり、OpenAI とのやり取りのために追加のログ用コードを記述する必要はありません。Weave がバックグラウンドでシームレスに処理します。

structured outputs と Pydantic モデルの活用

このコード生成パイプラインでは、言語モデルから一貫性があり、適切に整形されたレスポンスを安定して得るために、OpenAI の structured outputs mode と Pydantic モデルを使用します。このアプローチには、いくつかの利点があります。
  1. タイプ安全性: 期待する出力に対して Pydantic モデルを定義することで、生成されるコード、プログラムランナー、ユニットテストに厳密な構造を強制できます。
  2. パースのしやすさ: structured outputs モードを使うと、モデルのレスポンスを事前定義した Pydantic モデルに直接パースできるため、複雑な後処理の必要性を減らせます。
  3. 信頼性の向上: 期待する形式を明示することで、言語モデルから予期しない出力や形式が不正な出力が返される可能性を低減できます。
以下は、Pydantic モデルをどのように定義し、OpenAI の structured outputs と組み合わせて使用するかを示す例です。

コードフォーマッタの実装

一貫性のある整ったコード出力を確保するため、Weave operationsを使用して CodeFormatter クラスを実装します。このフォーマッタは、生成されたコード、プログラムランナー、ユニットテストに対して、さまざまなlintルールとスタイルルールを適用します。
この CodeFormatter クラスは、生成されたコードをクリーンアップして整形するための複数の Weave operations を提供します。
  • エスケープされた改行を実際の改行に置き換える
  • 未使用の import と変数を削除する
  • import を並べ替える
  • PEP 8 に準拠した形式を適用する
  • 不足している import を追加する

CodeGenerationPipeline を定義する

Code Generation Pipeline
それでは、コード生成の中核ロジックを実装しましょう。 weave.Model を使うことで、変更時に自動でバージョン管理されます。また、model_name も属性として保持しておくことで、これを使って試行しやすくなり、Weave で差分の確認や比較も簡単に行えます。さらに、@weave.op で関数呼び出しをトラッキングすることで、入出力がログされ、エラーの追跡やデバッグに役立ちます。
この CodeGenerationPipeline クラスは、コード生成ロジックを Weave Model としてカプセル化しており、次のような重要な利点があります。
  1. 自動的な実験トラッキング: Weave は、モデルの各 run について、入力、出力、パラメーターを自動的に記録します。
  2. バージョン管理: モデルの属性やコードへの変更は自動的にバージョン管理されるため、コード生成パイプラインが時間とともにどのように進化したかを明確な履歴として残せます。
  3. 再現性: バージョン管理とトラッキングにより、コード生成パイプラインの過去の結果や設定を簡単に再現できます。
  4. ハイパーパラメーター管理: モデル属性 (model_name など) は明確に定義され、異なる run にわたってトラッキングされるため、実験を進めやすくなります。
  5. Weave エコシステムとのインテグレーション: weave.Model を使うことで、評価やサービング機能など、他の Weave ツールとシームレスに連携できます.

評価メトリクスを実装する

生成されたコードの品質を評価するために、weave.Scorer のサブクラスを使って、シンプルな評価メトリクスを実装します。これにより、データセット内のすべての model_output に対して score が実行されます。model_output は、weave.Modelpredict 関数の出力です。prompt はデータセット human-eval から取得されます。
これらの評価関数は生成されたコードを実行し、そのコードがデータセットで提供されたテストに合格したかどうかを示すブール値を返します。
評価

Weave データセットを作成して評価を実行する

パイプラインを評価するため、Weave データセットを作成して評価を実行します。
このコードでは、サンプルプロンプトを含むデータセットを作成し、humaneval テスト用のスコアラーを定義して、コード生成パイプラインを評価します。
最終評価

結論

この例では、Weave と OpenAI の言語モデルを使ってコード生成パイプラインを実装する方法を紹介しました。具体的には、次のことを行いました。
  1. コード生成プロセスの各 step に対応する Weave operations を作成する
  2. トラッキングと評価を容易に行えるよう、パイプラインを Weave Model でラップする
  3. Weave operations を使ってカスタム評価メトリクスを実装する
  4. データセットを作成し、パイプラインを評価する
Weave のシームレスなインテグレーションにより、コード生成プロセス全体を通して入力、出力、および中間 step をトラッキングできるため、LLM application のデバッグ、最適化、評価が容易になります。 Weave とその機能の詳細については、Weave ドキュメント を参照してください。この例は、より大規模なデータセットに対応できるように拡張したり、より高度な評価メトリクスを実装したり、他の LLM workflow と統合したりできます。