
guidanceを動かしながら遊べるチュートリアルハンズオンを公開しました (Google Colab)
Microsoftが発表したguidanceは、プロンプトを介したLLMとのやり取りをより直感的・効率的に制御できるフレームワークとして注目を集めています。
ガイダンスは、従来のプロンプトやチェーンよりも効果的かつ効率的に現代の言語モデルを制御することができます。ガイダンスプログラムを使用すると、生成、プロンプト、論理制御を連続的なフローに組み込んで、言語モデルが実際にテキストを処理する方法に合わせることができます。Chain of Thoughtやその他のバリアント(ART、Auto-CoTなど)など、シンプルな出力構造は、言語モデルの性能を向上させることが示されています。GPT-4などのよりパワフルな言語モデルの登場により、さらに豊かな構造が可能になり、ガイダンスによってその構造をより簡単かつ安価に実現できます。
特徴:
・Handlebarsテンプレートに基づいたシンプルで直感的な構文。
・複数の生成、選択、条件分岐、ツールの使用などを持つ豊富な出力構造。
・Jupyter/VSCodeノートブックでのプレイグラウンドのようなストリーミング機能。
・スマートなシードベースの生成キャッシュ。
・役割ベースのチャットモデル(ChatGPTなど)のサポート。
・Hugging Faceモデルとの簡単な統合。ガイダンスを使用することで、通常のプロンプトよりも高速化された速度向上、プロンプトの最適化のためのトークン補完、形式の制約に対する正規表現パターンガイドなどが可能になります。
今回は、自分がguidanceの勉強用に作成したColabのチュートリアルハンズオンについて紹介します。
URLはこちらになります。Colabで実行・コピーなど自由に使ってもらって大丈夫です。
Google Colab チュートリアルハンズオン
https://gist.github.com/rynsuke/5a2110e51f8a239e1c9dc8ffbd6a3ce3
Setup
はじめに、Setupセクションのguidanceのインストール、ライブラリ・モデルのインポートを実行してください。
OpenAIで動作させる場合は、APIキーが必要です。実行に伴うAPI料金については自己責任でお願いします。
guidance.llmやchat_modelに別のLLMを設定して使うことも可能です。
Tutorial
前半は公式レポジトリのサンプルを題材に基本的な文法について学ぶパートになります。
{{arg}}: program実行の時に変数を埋め込める
{{gen 'result_var' stop="\n-"}}: 推論結果を生成してresult_varに入れる、"\n-"が来たら処理を終了
OpenAIのチャットモデルでは、system/user/assistantのブロックを切り替えながらプロンプトの埋め込みやテキストの生成を行う
select句: 生成する内容を複数のオプションに制限できる
geneach句: 同じ要素を繰り返し生成
each句: 配列の埋め込みに利用できる
await句: ユーザーの入力を待機する
geneach句と組み合わせることで、応答を繰り返すチャットボットを簡単に実装できる
この辺りの文法が一通り理解できれば大体のアイデアは実装できる状態になっていると思います。(あとは関数呼び出し、if句など)
Practice
後半は5つのタスクを題材に自分でguidanceを使ったコードを書いてみるパートです。
Task1. ポジネガ判定
テキストのポジティブ・ネガティブを判定する関数を実装します。
改めて、以前だったらAPIが丸々1つ必要なレベルのタスクが1つの関数に収まるレベルでサクッとかけてしまうのはヤバいですね…

Task2. JSON出力
AWSのサービス名を例に、「知りたいことについて投げたら詳細をJSONに丸めて返してくれる」という魔法の関数を実装します。
この辺りの処理をJSONのパースすらなしに簡潔に書けるところがguidanceの魅力ですね。

Task3. 日記アプリ
guidanceではプロンプト内で独自定義した関数を呼び出すことができ、その結果を元にif文を使って処理を分岐させるといった芸当も可能です。
ここでは、Task1で作成したポジネガ判定関数を使ってチャットの内容を分岐させるということをしています。


Task4. しりとり
geneachとawaitを組み合わせることで、AIとのチャットフローを簡単に実装することができます。この問題はこれを使って簡単なしりとりゲームを実装してみよう、というものです。


Task5. エージェント
@_mkazutakaさんによるguidanceを使ったAgent with Toolsの実装が早くも公開されています。
この問題は明確な解答例はありませんが、こちらのエージェント実装を実際にColab上で動かしてみて、自分だけのツールやタスクを与えてみたりしてカスタマイズしてみましょう。

さいごに
実際にguidanceを動かしてみて、改めてそのパワフルさ、コンパクトさを実感することができました。今後LLMアプリケーションのデファクトの1つとなっていく可能性も十分あると思っており、更なる改良に期待したいところです。(Semantic Kernelとの統合などもありそうですね)
この記事が皆さんのLLMライフの一助になれば幸いです!