Open5

パッシブゴールクリエイター(Passive Goal Creator)

Sho YamaneSho Yamane

AIエージェントがユーザーの要求に対して適切に対応するためには要求を明確にする必要がある。

  • あいまい
  • 複数の要求が混ざっている

のような要求を分解して明確にするエージェントデザインパターン

引用元一覧

Sho YamaneSho Yamane

手順

  1. ユーザーからテキストを受け取る
  2. テキストの中から要求を抽出する
  3. 要求をAIエージェントが処理しやすい構造化された形にする(リスト形式やyamlなど)
  4. 要求の優先順位付けや依存関係を洗い出す
  5. 構造化されて明確になった目標を次のエージェントに渡す
Sho YamaneSho Yamane

プロンプト例

ユーザーの入力を分析し、明確で実行可能な目標を生成してください。

### 要件 ###
1. 目標は具体的かつ明確であり、実行可能なレベルで詳細化されている必要があります。
2. あなたが実行可能な行動は以下の行動だけです。
    - インターネットを利用して、目標を達成するための調査を行う。
    - ユーザーのためのレポートを生成する。
3. 決して2.以外の行動を取ってはいけません。

### ユーザーの入力 ###
カレーライスの作り方教えて
Sho YamaneSho Yamane

結果

インターネットでカレーライスの作り方を調査し、
初心者でも簡単に作れるレシピをまとめたレポートをユーザーに提供する。
Sho YamaneSho Yamane

コード

import { ChatPromptTemplate } from "@langchain/core/prompts";
import { type ChatOpenAI } from "@langchain/openai";
import { StructuredOutputParser } from "langchain/output_parsers";
import { z } from "zod";

class Goal {
  constructor(public description: string) {}

  get text(): string {
    return `${this.description}`;
  }
}

// PassiveGoalCreatorクラスの定義
class PassiveGoalCreator {
  private llm: ChatOpenAI;

  constructor(llm: ChatOpenAI) {
    this.llm = llm;
  }

  async run(query: string): Promise<Goal> {
    const prompt = ChatPromptTemplate.fromTemplate(
      "ユーザーの入力を分析し、明確で実行可能な目標を生成してください。\n" +
        "要件:\n" +
        "1. 目標は具体的かつ明確であり、実行可能なレベルで詳細化されている必要があります。\n" +
        "2. あなたが実行可能な行動は以下の行動だけです。\n" +
        "   - インターネットを利用して、目標を達成するための調査を行う。\n" +
        "   - ユーザーのためのレポートを生成する。\n" +
        "3. 決して2.以外の行動を取ってはいけません。\n" +
        "ユーザーの入力: {query}",
    );

    // Goal用のZodスキーマを定義
    const goalSchema = z.object({
      description: z.string().describe("目標の説明"),
    });

    // 構造化出力用のパーサーを作成
    const parser = StructuredOutputParser.fromZodSchema(goalSchema);

    // チェーンを実行
    const chain = prompt.pipe(this.llm).pipe(parser);
    const result = await chain.invoke({ query });

    return new Goal(result.description);
  }
}