Skip to main content

Weave: 生成AI活用のためのシンプルなツール

Created on April 5|Last edited on April 5
本記事はShawn Lewisによる英文記事の日本語訳です。
6年前、ディープラーニングの可能性を引き出すために必要なツールは存在しませんでした。そこで、私たちはWeights & Biasesを立ち上げ、それらのツールを開発することにしたのです。私たちのツールにより、GPT-4やその他の画期的なモデルを開発するために必要な膨大な実験データを追跡し、共同作業を行うことが可能になりました。
今日、GPT-4は人類のためのアプリケーションにおいて驚くべき可能性を秘めていますが、その可能性は実際に適用する私たちの能力をはるかに超えています。これを解決するためには、ソフトウェアの構築方法について異なる視点で考える必要があります。私たちには新しいツールが必要なのです。
私たちは、AIアプリケーションを開発し、本番環境で活用するためのツールスイートであるWeaveの一般提供を発表できることを大変誇りに思います。
Weaveを使って以下のことを行いましょう:
  • 開発から本番環境まで、LLMとのやり取りや関連データをログに記録し、バージョン管理する
  • プロンプト手法、モデルの変更、パラメータの実験を行う
  • モデルを評価し、進捗状況を測定する
さあ、 https://wandb.me/weave にアクセスして始めましょう。




デモは簡単、本番は難しい

生成AIモデルは非常に強力ですが、本質的に非決定論的なブラックボックスです。私たちは今、驚くべきAIデモを作るのは簡単だが、本番アプリケーションを機能させるには相当のエンジニアリング努力が必要だということを知っています。
この難しさは、AIモデルの確率的な性質に起因しています。任意のアプリケーションの入力空間は、完全にテストするには広大すぎます。
しかし、解決策があります:モデルをブラックボックスとして扱い、機械学習の実践者がそもそもこれらのモデルを構築するために使用しているワークフローに似た科学的なワークフローに従うのです。
その仕組みは以下の通りです:
  • すべてをログに記録する:開発から本番まで、LLMとのあらゆるやり取りを記録します。このデータは生成するのにコストがかかるので、保存しておきましょう!モデルの改善や評価の構築に使用します。
  • 実験する:何が効果的かを見極めるために、様々な構成やパラメータを試してみましょう。
  • 評価する:進捗状況を測定するための評価スイートを構築します。これを行わないと、見当もつかないままです!
Weaveは、このプロセスをワークフローの自然な一部にする最小限の抽象化を導入します。


Weave Tracking

AIモデルの力を活用するための第一歩は、あなたが行うすべてのことをcentral system-of-recordに記録することです。
このデータを使用して、実験的な変更がどのような影響を与えるかを理解し、評価データセットを構築し、RAGやファインチューニングなどの高度な手法でモデルを改善します。
何をトラッキングする必要があるのでしょうか?
  • コード:生成AI APIの呼び出しに関連するすべてのコードがバージョン管理され、保存されていることを確認します。
  • データ:可能な限り、データセット、ナレッジストアなどのバージョン管理と保存を行います。
  • トレース:生成AI呼び出しを囲む関数のトレースを永続的にキャプチャします。
Weaveはこれを簡単にします。任意のPython関数を@weave.op()でラップすると、Weaveは関数のコードをキャプチャしてバージョン管理し、入力と出力を含むすべての呼び出しのトレースをログに記録します。
import openai

@weave.op()
def extract_first_person_name(doc: str) -> str:
client = openai.OpenAI()
prompt_template = 'What is first person's name in the following document: {doc}'
response = client.chat.completions.create(
model='gpt-3.5-turbo',
messages=[{'role': 'user', prompt_template.format(doc=doc))})
return response.choices[0].message.content
@weave.init("my-project") を呼び出してWeaveトラッキングを有効にし、通常通り関数を呼び出します。


関数のコードを変更して再度呼び出すと、Weaveは関数の新しいバージョンを追跡します。
このようにして、どのコードによってどの出力が生成されたかを正確に把握すること��できます。LLMを使って実験する際には、整理された状態を保つのが難しいものです。Weaveは、この最小限の抽象化によって、ユーザーからすべての組織化の負担を取り除きます。



実験を容易にするために、関数をパラメータ化すると便利なことがよくあります。Weaveでそれを行う方法は次のとおりです:
class PersonExtractor(weave.Object):
prompt_template: str

@weave.op()
def extract(doc: str) -> str:
client = openai.OpenAI()
response = client.chat.completions.create(
model='gpt-3.5-turbo',
messages=[{'role': 'user', self.prompt_template.format(doc=doc))})
return response.choices[0].message.content
Weaveオブジェクトは、内部でpydanticライブラリを使用しています。次のようにしてインスタンス化し、呼び出すことができます:
person_extractor = PersonExtractor('What is first person's name in the following document: {doc}')
name = person_extract.extract("There were three of them: Kara, Frank, and Shaun")
Weaveオブジェクトも自動的に整理され、バージョン管理されます。プロンプトテンプレートを関数の本体から抽出したので、クエリ可能になりました。プロンプトテンプレートで特定の単語を使用した呼び出しに簡単にフィルタリングできます。



あなたは開発と本番の両方でWeaveトラッキングを使用して、AI開発プロセスで生成されるすべての貴重なデータを簡単にキャプチャし、整理する必要があります。


Weave Evaluations

評価は、AIアプリケーションのユニットテストのようなものです。しかし、AIモデルは非決定論的であるため、厳密な合否アサーションの代わりにスコアリング関数を使用します。
ソフトウェアのユニットテストを作成するのと同じように、構築するAIアプリケーションのための評価スイートを継続的に進化させる必要があります���
簡単な例を次に示します:
import asyncio
import weave
import openai

@weave.op()
def score_match(expected, prediction):
return expected == prediction

eval = weave.Evaluation(
dataset=[
{
"doc": "The first person to land on the moon was Neil Armstrong.",
"expected": "Neil Armstrong",
},
{
"doc": "There were three of them: Kara, Frank, and Shaun",
"expected": "Kara",
},
{"doc": "There are two cats: Jimbob, and Zelda.", "expected": None},
],
scorers=[score_match],
)

@weave.op()
def extract_first_person_name(doc):
client = openai.OpenAI()
prompt_template = "What is the name of the first person in the following document? Just give the name and nothing else. Document: {doc}"
response = client.chat.completions.create(
model="gpt-3.5-turbo",
messages=[{"role": "user", "content": prompt_template.format(doc=doc)}],
)
return response.choices[0].message.content


weave.init("weave-announcement-draft-eval-1")

asyncio.run(eval.evaluate(extract_first_person_name))

結果はこちらです:

私たちのモデルは猫の名前も抽出しているようですね!プロンプトエンジニアリングを少し行えば、それを修正できるはずです。
評価により、傾向を把握し、リグレッションを特定し、将来のイテレーションについて情報に基づいた決定を下すことができます。


さあ、構築しましょう

今日のリリースにはまだまだ多くの発見があります。 http://wandb.me/weave にアクセスして始めましょう。
優れたツールを構築する最良の方法は、ユーザーと話をすることです。私たちはあらゆる種類のフィードバックを大切にしています。ぜひご連絡ください:Xの @weights_biases 、またはメール:support@wandb.com までご連絡ください。

💜 Weights & BiasesのShawnと開発チームより