💰

chatGPTを使用するアプリを開発するとき, テストのコストを最適化するLangChainとFakeクラスの使い方

2024/05/20に公開

概要

chatGPT + Langchain を使用してウェブアプリを開発しています.
機能が増えるにつれてテスト料が増えてきてe2eテストを流すだけでお金が飛んでいく状態になってしまいました.
Langchain には Fake* クラスが存在しあらかじめ設定しておいた文字列を順番に出力してくれます.

使い方

入力した文章からタイトルを考える
以下のように 環境変数を使用して分岐させるようにしています.
responses に BaseMessage を継承したクラスを使用して出力を準備しておく必要があります.
そしてこの配列に登録した文章が llm.invoke が呼ばれた際に順番に文字列が吐き出されます.

template = """
# PDF の要約文
{essence}
# PDF の先頭部分のテキスト
{head_text}
# 指示
PDF の要約文とPDFファイルのテキストの一部から簡潔なタイトルを作成してください.
出力はタイトルのみにしてください.
"""

prompt_template = PromptTemplate(template=template,
                                 input_variables=["essence",
                                                  "head_text"])
prompt_text = prompt_template.format(essence=essence, head_text=head_text)

# 環境変数を使用してMock を有効にするか分岐させます
env = environ.Env()
MOCK_MODE = env('MOCK_MODE', default=False)
if MOCK_MODE:
    # ここでモックのモデルを作成します.
    responses = [AIMessage(content="タイトル: これはテストです。")]
    llm = FakeMessagesListChatModel(responses=responses)
else:
    llm = ChatOpenAI(model_name='gpt-4o')
response = llm.invoke(prompt_text)

response ではなく responsesです. 一回はまりました

Discussion