Skip to main content

Weights & Biases Weave で Azure OpenAI と Azure AI Studio を使う方法

このステップバイステップのチュートリアルでは、Weights & Biases の Weave と Microsoft の Azure AI 製品群を組み合わせてどのように利用するかを説明します
Created on August 25|Last edited on August 25

Open In Colab



はじめに

GenAI モデルの規模と複雑さが増すにつれて、堅牢な実験フレームワークとスケーラブルなインフラの必要性が高まります。ここで重要になるのが Weights & Biases (W&B) と Azure の統合です。 Microsoft Azure の AI スイート 強力なソリューションを提供します。
Weights & Biases はこれらのモデルをファインチューニングするためのツール(W&B Models)と、その上で生成AI アプリケーションを構築するためのツール(W&B Weave)を提供します。Weave は大規模言語モデル(LLM)に伴う複雑な作業を想定して設計されており、LLM のチェーンやプロンプトの構築、デバッグ、評価のプロセスを簡素化するため、データサイエンティストや機械学習エンジニアにとって不可欠なツールです。
Microsoft Azure は、大規模な AI/ML ワークロードを支えるための必要なインフラとサービスを提供します。Azure の包括的なスイートには、次のような要素が含まれます。 Azure Machine LearningAzure AI Services、生成AIモデルの開発、トレーニング、デプロイを効率的かつ効果的に行えるようにします。
このチュートリアルでは、Azure OpenAI Service と Azure AI Studio を Weights & Biases の Weave と併用する技術的な側面を扱います。これらの強力なツールの連携を解説することで、生成AI の実験プロセスを効率化し、モデル精度を向上させ、複雑な AI アプリケーションを信頼性高くデプロイする方法を示します。


W&B Weave を使用する


Weights & Biases の Weave は、大規模言語モデル(LLM)を効率的に管理・評価するための強力なツールキットです。LLM 特有の複雑さに対応するよう設計されており、Microsoft Azure の強力な AI/ML インフラとシームレスに連携します。この組み合わせにより、生成AI ワークフローの追跡、実験、最適化を包括的に支援するソリューションが提供されます。
Weave を使用すると、次のことができます:
  • ログそしてバージョン開発から本番までの LLM のやり取りとそれに関連するデータ
  • 実験プロンプト手法、モデルの変更、およびパラメータとともに
  • 評価するあなたのモデルを評価し、進捗を測定する
大まかに言うと、Weave は以下を追跡します:
  • コード生成系AIのAPI呼び出しに関するすべてのコードをバージョン管理し、保存するようにしてください
  • データ可能な限り、データセットやナレッジストアなどはバージョン管理し保存してください
  • トレース:生成AI呼び出しを取り囲む関数のトレースを永続的に記録する
任意のPython関数をラップして @weave.op() Weave はその関数のコードをキャプチャしてバージョン管理し、入力と出力を含むすべての呼び出しのトレースを記録します。
W&B Weave の使い方を確認するには、こちらをご覧ください。 ドキュメントクイックスタート
💡

生成AI向けの Azure の理解

Microsoft Azure は、生成AI アプリケーションの開発とデプロイのための充実したサービス群を提供します。主要なサービスには Azure OpenAI Service、Azure AI Studio、Azure Machine Learning、Azure AI Services が含まれます。


Azure AI Services

Azure AI Services は、自然言語処理、コンピュータビジョン、音声認識など、幅広い API を提供します。これらの事前構築済みサービスにより、開発者は高度な AI 機能を素早くアプリケーションに統合でき、機能強化や複雑なタスクの自動化を実現できます。

Azure OpenAI Service


Azure AI Services の一部である Azure OpenAI Service は、GPT-4o のような OpenAI の高度な AI モデルへのアクセスを提供します。これらのモデルはテキスト、画像、音声、ビデオにまたがるマルチモーダルな処理が可能で、自然言語理解や生成機能をアプリケーションに組み込むのに適しています。Azure のエンタープライズ向けセキュリティとインフラストラクチャによってサポートされている点も特徴です。
次に従ってください 公式の Azure OpenAI ドキュメント 独自の GPT インスタンスを作成するために
💡

Azure Machine Learning



Azure Machine Learning は、データサイエンスや機械学習のイノベーションを加速させるための強力で柔軟なエンドツーエンドプラットフォームであり、AI 時代における組織の必須要件であるエンタープライズ向けガバナンスも提供します。機械学習の専門家やデータサイエンティスト、エンジニアは、日常のワークフローでこのプラットフォームを利用してモデルの学習とデプロイを行い、機械学習運用(MLOps)を管理できます。

Azure AI Studio



Azure AI Studio は生成AIソリューションを開発するためのハブです。OpenAI や Hugging Face といったパートナーのモデルカタログを備えており、開発者は自社データを使ってモデルを試験、比較、ファインチューニングできます。統合されたインターフェースにより、生成AIアプリの開発とデプロイを簡素化し、カスタムAIソリューションの作成を支援します。
次に従ってください 公式の Azure AI Studio ドキュメント 最新のオープンソース LLM をデプロイするために
💡
これらの Azure サービスを Weights & Biases の Weave と統合することで、開発者は生成AI ワークフローを効率化し、モデルの精度を向上させ、確実なデプロイを実現できます。この組み合わせは、LLM のトラッキング、デバッグ、評価に関する包括的なソリューションを提供し、AI 開発をより効率的かつ効果的にします。

Azure から Weights & Biases の Weave への LLM 出力の追跡、トレース、評価

前提条件のセットアップ: Weave

Weave を LLM ベンダーの SDK と統合するには、まず必要なパッケージをインストールします。これには Weave と OpenAI が含まれます:
!pip install weave openai
次に、すべてのコード、データ、トレースを格納するために Weave プロジェクトを初期化します:
import weave

weave.init('azure-weave-cookbook')

前提条件のセットアップ:Azure

OpenAI Python SDK を使って、Azure のサービスに簡単にアクセスできます。

Azure OpenAI Service の構成

クライアントを Azure OpenAI Service を使用するように設定する:
from openai import AzureOpenAI

client = AzureOpenAI(
api_key=os.getenv("AZURE_OPENAI_API_KEY"),
api_version="2024-02-01",
azure_endpoint = os.getenv("AZURE_OPENAI_ENDPOINT")
)

Azure AI Studio の構成

または、Azure AI Studio を使用している場合は、クライアントを次のように設定します:
from openai import OpenAI

client = OpenAI(
base_url=f"{os.getenv('AZURE_AI_STUDIO_API_ENDPOINT')}/v1",
api_key=os.getenv('AZURE_AI_STUDIO_API_KEY')
)

ステップ 1:LLM 呼び出しの自動ログ記録


最初のステップは、LLM とのすべてのやり取りに対して堅牢なログ記録の仕組みを確立することです。これは、時間をかけたモデルの監視、デバッグ、性能改善に不可欠です。LLM 呼び出しを自動でログ記録することで、各リクエストとレスポンスに関する詳細な情報を取得でき、トラブルシューティングや性能解析が容易になります。
@weave.op()
def call_azure_chat(model_id: str, messages: list, max_tokens: int = 1000, temperature: float = 0.5):
response = client.chat.completions.create(
model=model_id,
messages=messages,
max_tokens=max_tokens,
temperature=temperature
)
return {"status": "success", "response": response.choices[0].message.content}
最初の実験では、LLM に正しいレシピで料理を作らせることを試みます。これは、モデルに構造化されたプロンプトを送り、詳細な応答を受け取り、それを解析用にログに記録する作業を含みます。
messages = [
{"role": "system", "content": "You are a helpful assistant."},
{"role": "user", "content": "Create a snack recipe for a dish called the Azure Weav-e-ohs"}
]
if "mistral" in model_id.lower():
messages = format_messages_for_mistral(messages)
result = call_azure_chat(model_id, messages)
print(result)
自動ログ記録は、モデルとの各やり取りに対して明確な監査証跡を提供します。これにより問題の特定やモデル挙動の理解、将来の改善が容易になります。
💡

ステップ 2:実用的な LLM アプリの構築


次に、プロンプトの書式を標準化するユーティリティ関数の作成に焦点を当てます。プロンプトの書式を一貫させることは、モデル性能の安定化に不可欠であり、各入力を LLM が効果的に処理できる構造に整えることを保証します。
@weave.op()
def format_prompt(prompt: str):
"A formatting function for OpenAI models"
system_prompt_formatted = "You are a helpful assistant."
human_prompt = "{prompt}"
human_prompt_formatted = human_prompt.format(prompt=prompt)
messages = [{"role":"system", "content":system_prompt_formatted}, {"role":"user", "content":human_prompt_formatted}]
return messages
次に、この関数を使ってフォーマット済みプロンプトでチャットモデルを実行します:
@weave.op()
def run_chat(model_id: str, prompt: str):
formatted_messages = format_prompt(prompt=prompt)
if "mistral" in model_id.lower():
formatted_messages = format_messages_for_mistral(formatted_messages)
result = call_azure_chat(model_id, formatted_messages, max_tokens=1000)
return result
このステップは、プロンプトを一貫した形式に整える必要があるさまざまな LLM アプリケーションで使用します。たとえば、カスタマーサービスの応答生成や、特定のガイドラインに基づいたコンテンツ作成などが該当します。
プロンプトの書式を標準化するユーティリティ関数は、すべてのプロンプトを一貫した形式に保ち、モデル出力の信頼性と比較可能性を高めます。この一貫性は、LLM と高品質なやり取りを維持するために不可欠です。
💡

ステップ 3:モデルクラスを使った LLM アプリ属性の実験


開発プロセスをさらに効率化するために、LLM に関連するロジックとパラメータを再利用可能なクラスにまとめます。このモジュール化されたアプローチにより、異なる構成での実験が容易になり、モデル属性の管理も簡素化されます。
from dataclasses import dataclass

@dataclass
class PromptTemplate:
system_prompt: str
human_prompt: str

@weave.op()
def format_prompt(self, email_content: str):
system_prompt_formatted = self.system_prompt.format()
human_prompt_formatted = self.human_prompt.format(email_content=email_content)
messages = [{"role":"system", "content":system_prompt_formatted}, {"role":"user", "content":human_prompt_formatted}]
return messages
AzureEmailAssistant このクラスはプロンプトテンプレートを使ってメールに返信し、モデルの振る舞いとパラメータを単一の再利用可能なクラスにまとめます。
from weave import Model

class AzureEmailAssistant(Model):
model_id: str = model_id
prompt_template: PromptTemplate
max_tokens: int = 2048
temperature: float = 0.0

@weave.op()
def format_doc(self, doc: str) -> list:
messages = self.prompt_template.format_prompt(doc)
return messages

@weave.op()
def respond(self, doc: str) -> dict:
messages = self.format_doc(doc)
if "mistral" in self.model_id.lower():
messages = format_messages_for_mistral(messages)
output = call_azure_chat(
self.model_id,
messages=messages,
max_tokens=self.max_tokens,
temperature=self.temperature)
return output

@weave.op()
async def predict(self, email_content: str) -> str:
return self.respond(email_content)["response"]
このアプローチは、応答が特定の形式やスタイルに従う必要があるカスタマーサービスの自動化のようなアプリケーションに特に有用です。プロンプトのロジックとモデルのパラメータをクラスにまとめることで、さまざまなシナリオや要件に合わせてシステムを容易に適応できます。
モデルをクラスにカプセル化することで、異なるパラメータや設定の変更・検証が容易になります。このモジュール化された手法はコードの保守性と柔軟性を高め、LLM アプリケーションを適応・スケールさせやすくします。
💡

ステップ4:評価データを使って最適なLLMアプリ設定を決定する


最後に、Weave を活用して構造化されたデータセットを用い、さまざまなモデル設定の性能を体系的に評価します。このステップは、特定のユースケースに最適な構成を見極めるうえで重要です。
from weave import Dataset

dataset = Dataset(name=eval_dataset_name, rows=[
{'id': '1', 'email_content': 'Subject: Inquiry about Order Delay\n\nHello,\n\nI placed an order last week for the new UltraGlow Skin Serum, but I have not received a shipping update yet. My order number is 12345. Could you please update me on the status of my shipment?\n\nThank you,\nJane Doe'},
{'id': '2', 'email_content': 'Subject: Damaged Item Received\n\nHello,\n\nI received my order yesterday, but one of the items, a glass vase, was broken. My order number is 67890. How can I get a replacement or a refund?\n\nBest regards,\nJohn Smith'},
# Additional rows
])
weave.publish(dataset)

dataset_uri = f"weave:///{wandb_entity}/{weave_project}/object/{eval_dataset_name}:latest"
dataset = weave.ref(dataset_uri).get()
モデルの出力の簡潔さなど特定の属性を評価するために、スコア付け関数を定義します:
@weave.op()
def check_conciseness(model_output: str) -> dict:
result = len(model_output.split()) < 300
return {'conciseness': result}
次に、評価オブジェクトを作成してそれをデータセットで実行します。

evaluation = weave.Evaluation(
dataset=dataset, scorers=[check_conciseness],
)
await evaluation.evaluate(model)
この評価フレームワークは、応答の正確さ、関連性、ユーザー満足度などさまざまな指標に適用できます。たとえば、カスタマーサービスのメール応答を簡潔さや明瞭さの観点から評価することが挙げられます。
構造化されたデータセットを用いた体系的な評価により、データに基づく意思決定が可能になります。さまざまな指標にわたってモデル性能を評価することで、最も効果的な構成を特定し、それに応じてLLMアプリケーションを最適化できます。
💡

結論

Weave と Azure AI の統合により、大規模言語モデルの構築、デバッグ、評価のための強力なツール群が得られます。このステップバイステップの手法は、堅牢なログ記録と標準化されたプロンプト整形を実現するだけでなく、モジュール化された開発や体系的な評価も促進します。これらのベストプラクティスを活用することで、プロンプトエンジニアや機械学習エンジニアはワークフローを効率化し、モデル性能を向上させ、洗練されたAIアプリケーションの信頼できるデプロイを実現できます。