😄

Micorsoftのguidanceをgpt-3.5-turboで試してみた

2024/02/24に公開

はじめに

Micorsoftが公開しているguidanceをgpt-3.5-turboなどで簡単に試してみました。

guidanceとは ※翻訳文
ガイダンスは、従来のプロンプトやチェイニングに比べて優れた制御と効率を提供するプログラミングパラダイムである。これにより、ユーザーは(正規表現やCFGなどで)生成を制約したり、制御(条件分岐やループ)と生成をシームレスにインターリーブしたりすることができる。

とのことです。
詳細は下記ページをチェックしてみてください。
https://github.com/guidance-ai/guidance

使ってみる

guidanceのversion: 0.1.10を使って、簡単に実験してみました。以前とは書き方が変わってるようです。なお、gpt-3.5-turboとgpt-3.5-turbo-instructを使っています。

必要なものをインストール
今回使ったPythonバージョン
Python version 3.9.18

pip install guidance

バージョンを確認

pip show guidance
Name: guidance
Version: 0.1.10

作成するファイル
適当にディレクトリを作成(例 test_guidance)

  • /test_guidance/.env
  • /test_guidance/test.py
    を作成します。

ENVファイル
OpenAIのAPI KEY情報を記述します。

OPENAI_API_KEY='************'

test.py
質問に回答するだけのものです。gpt-3.5-turboとgpt-3.5-turbo-instructとで2つ実験。

import os
from dotenv import load_dotenv
import guidance
from guidance import models, gen, instruction, system, user, assistant

load_dotenv()
api_key = os.getenv("OPENAI_API_KEY")
gpt35 = models.OpenAI("gpt-3.5-turbo", api_key=api_key)
gpt35_instruct = models.OpenAI("gpt-3.5-turbo-instruct", api_key=api_key)


@guidance
def chat_turbo(lm, sys_prompt: str, user_question: str):
    with system():
        lm = gpt35 + sys_prompt
    with user():
        lm += user_question
    with assistant():
        # いくつかパターンを書いておきます
        # lm += gen(name="answer", stop=".")
        # lm += gen(name="answer", stop="対象文字")
        # lm += gen(name="answer", max_tokens=100)
        lm += gen(name="answer", max_tokens=1000, temperature=0.5, stop=".")

    return lm


@guidance
def chat_instruction(lm, user_question: str):
    with instruction():
        lm = gpt35_instruct + user_question

    lm += gen(name="answer", stop=".")

    return lm


# 実行する
results = gpt35 + chat_turbo(
    sys_prompt="あなたはアイスクリームの専門家です",
    user_question="最も美味しいバニラアイスとは?",
)
print(results)
print("---------------------------")
print(results["answer"])

print("---------------------------")

results = gpt35_instruct + chat_instruction(
    user_question="アインシュタインの有名な方程式は?"
)
print(results)
print("---------------------------")
print(results["answer"])

実行してみる
ターミナルから実行します。
python test.py

出力結果
2つとも実行して結果を表示しています。name="answer"と指定していますので、print(results["answer"])とすると、AIからの回答だけを表示します。

<|im_start|>system
あなたはアイスクリームの専門家です<|im_end|><|im_start|>user
最も美味しいバニラアイスとは?<|im_end|><|im_start|>assistant
バニラアイスの美味しさは、その香り、風味、クリーミーさ、そして口当たりによって評価されます。最も美味しいバニラアイスは、高品質なバニラビーンズを使用して作られ、新鮮な牛乳やクリームをたっぷりと使っているものがおすすめです。また、しっかりとしたバニラの風味が感じられ、口の中で溶けるような滑らかな食感が特徴です。手作りや地元の製造業者から購入することで、より本物のバニラの味を楽しむことができるでしょう。<|im_end|>
---------------------------
バニラアイスの美味しさは、その香り、風味、クリーミーさ、そして口当たりによって評価されます。最も美味しいバニラアイスは、高品質なバニラビーンズを使用して作られ、新鮮な牛乳やクリームをたっぷりと使っているものがおすすめです。また、しっかりとしたバニラの風味が感じられ、口の中で溶けるような滑らかな食感が特徴です。手作りや地元の製造業者から購入することで、より本物のバニラの味を楽しむことができるでしょう。
---------------------------
アインシュタインの有名な方程式は?<|endofprompt|>

E=mc^2
---------------------------


E=mc^2

まとめ

応答に結構時間かかっているのが気になりました。
ドキュメントが少ないので、正しい書き方なのかは自信ありません。

この他にも下記ディレクトリにあるchat.ipynbには、プランを考えて回答させるものやArgentや複数の専門家から回答させる例などいくつかサンプルコードが記載されています。
https://github.com/guidance-ai/guidance/tree/main/notebooks/tutorials

Discussion