「OpenAI GPT に相談」の版間の差分

Yuko (トーク | 投稿記録)
Yuko (トーク | 投稿記録)
88行目: 88行目:
// テンプレートは以下の { ~ }, で囲まれたブロックを好きに増減させて利用できます。
// テンプレートは以下の { ~ }, で囲まれたブロックを好きに増減させて利用できます。
const PROMPT_TEMPLATE = [
const PROMPT_TEMPLATE = [
    {
        "title": "要約する",
        "prompt": "要約して。専門的な用語と思われる単語は簡単に解説も入れて。"
    },
     {
     {
         "title": "誤字脱字、不正確な表現をチェック",
         "title": "誤字脱字、不正確な表現をチェック",
         "prompt": "以下の文章の誤字脱字 (被疑も含む) と人によって認識がずれるような曖昧・不正確な表現を見つけて箇条書きで示してください。特に誤字脱字は漏れなく注視してください。【誤字脱字】【不正確な表現】セクションに分けて出力してください。"
         "prompt": "以下の2つのカテゴリーで問題点を指摘してください\n"
            + "- 【誤字脱字】:明確な誤字脱字および誤字の疑いがある箇所\n"
            + "- 【不正確・曖昧な表現】:解釈に個人差が生じる可能性がある表現、より適切な表現に改善できる箇所"
     },
     },
     {
     {
         "title": "日本語に翻訳",
         "submenu_title": "翻訳",
        "prompt": "以下の文章を日本語に翻訳してください。1段落毎に「[原文]: ...\n[日本語訳]: ...」の形式で出力すること。"
        "submenu": [
            {
                "title": "日本語に翻訳",
                "prompt": "以下の文章を日本語に翻訳してください。原文の長さに応じて出力方式を変えてください\n"
                    + "- 短文の場合: 日本語訳のみ出力すること\n"
                    + "- 長文の場合: 1段落毎に「[原文]: ...\\n[日本語訳]: ...」の形式で出力すること"
            },
            {
                "title": "英語に翻訳",
                "prompt": "以下の文章を英語に翻訳してください。"
            },
            {
                "title": "英語->日本語 スラッシュリーディング翻訳",
                "prompt": "以下の英文を日本語にスラッシュリーディング形式で翻訳してください。\n\n"
                    + "条件:\n"
                    + "- 英文の各フレーズをスラッシュ(/)で区切って表示\n"
                    + "- 各フレーズの日本語訳を括弧()内に併記\n"
                    + "- 文の終わりはダブルスラッシュ(//)で表示\n"
                    + "- 英語の語順に従って日本語訳を行う\n"
                    + "- 日本語訳は自然な日本語である必要はなく、英語の語順を反映した直訳調で構わない\n"
                    + "- 主語が省略されている場合は補って翻訳すること\n"
                    + "- 一般的な英文で頻出する表現がある場合は次の行に記載\n"
                    + "- 以下の出力例のように <英文> (日本語訳) / ... とスラッシュ区切りの繰り返しになる \n\n"
                    + "出力例:\n"
                    + "Snowstorms are forecast (暴風雪が予報されている) / to hit the Sea of Japan coasts (日本海沿岸を襲うと) / of northern to eastern Japan (北部から東部の) / from Sunday through Monday. (日曜から月曜にかけて。) //\n"
                    + "【頻出表現】\n"
                    + "- be forecast to: ~すると予報されている\n"
            },
        ]
     },
     },
     {
     {
         "title": "コードを洗練させる",
         "submenu_title": "プログラミング支援",
         "prompt": "以下のコードを洗練させてください"
        "submenu": [
            {
                "title": "コードを洗練させる",
                "prompt": "以下のコードを洗練させてください"
            },
            {
                "title": "コードをレビューする",
                "prompt": "以下のコードをセキュリティと保守性の観点でレビューしてください"
            },
            {
                "title": "エラーログをデバッグする",
                "prompt": "以下のエラーログを解析し、考えられる原因と対策を提示してください"
            },
            {
                "title": "SQLクエリを最適化する",
                "prompt": "以下のSQL文を最適化してください"
            },
            {
                "title": "PowerShell スクリプトを書く",
                "prompt": "以下の処理を行うPowerShellスクリプトを生成してください"
            },
            {
                "title": "Shell Script を書く",
                "prompt": "以下の処理を行うShell Scriptを生成してください"
            },
            {
                "title": "Linux コマンドを提案",
                "prompt": "あなたはLinuxエキスパートとして、以下のLinuxコマンドを提案してください。\n\n"
                    + "制約条件:\n"
                    + "- 多数のディストリビューションで採用されているメジャーなコマンドを使用し、ポータブルな実装にすること\n"
                    + "- bashでの実行を前提にすること\n"
                    + "- 可能な限りシンプルな実装にすること\n\n"
                    + "期待する出力:\n"
                    + "- コマンドの具体的な実装方法\n"
                    + "- 各コマンドの動作説明\n"
                    + "- 制限事項\n"
            },
         ]
    },
    {
        "submenu_title": "ビジネスドキュメント作成支援",
        "submenu": [
            {
                "title": "提案書を作成する",
                "prompt": "以下に対する対する提案書を、コスト・実現性・リスクを含めて作成してください"
            },
            {
                "title": "仕様書のアウトラインを作成する",
                "prompt": "以下の内容で仕様書のアウトラインを作成してください"
            },
            {
                "title": "手順書のアウトラインを作成する",
                "prompt": "以下の作業を行う手順書を、前提条件と注意事項を含めてアウトラインを作成してください"
            },
            {
                "title": "ユーザーマニュアルのアウトラインを作成する",
                "prompt": "以下の機能内容から、ユーザー向けマニュアルのアウトラインを作成してください"
            },
            {
                "title": "議事録を作成する",
                "prompt": "以下の会議内容から議事録を作成してください"
            },
            {
                "title": "進捗報告書を作成する",
                "prompt": "以下のタスク状況から進捗報告書を作成してください"
            },
        ]
     },
     },
     {
     {
         "title": "PowerShell スクリプトを書く",
         "submenu_title": "分析支援",
        "prompt": "以下の処理を行うPowerShellスクリプトを生成してください"
        "submenu": [
            {
                "title": "問題を分析し、課題を抽出する",
                "prompt": "以下の状況から問題や潜在的リスクを分析し、課題を抽出してください"
            },
            {
                "title": "対応策を提案する",
                "prompt": "以下の問題・課題に対する対応策を複数提案してください"
            },
            {
                "title": "傾向を見つける",
                "prompt": "以下の内容から、数値や挙動上の傾向を見つけてください"
            },
        ]
     },
     },
     {
     {
         "title": "Shell Script を書く",
         "submenu_title": "アイデア出し",
        "prompt": "以下の処理を行うShell Scriptを生成してください"
        "submenu": [
            {
                "title": "SCAMPER法でブレインストーミング",
                "prompt": "以下のテーマについて、SCAMPER法を使って15個のアイデアを出してください。制約条件は以下の通りです:"
            },
            {
                "title": "解決策の幅出し",
                "prompt": "以下の課題に対して、技術面、運用面、コスト面から実現可能な解決策を5つずつ提案してください"
            },
            {
                "title": "業務改善案の提案",
                "prompt": "以下の既存プロセスについて、効率化、コスト削減、品質向上の観点から改善案を提案してください"
            },
            {
                "title": "逆転の発想",
                "prompt": "以下の目標に対して、通常とは逆の視点からアプローチする方法を3つ提案してください"
            },
            {
                "title": "競合分析からの着想",
                "prompt": "以下の内容について、業界における競合他社の特徴を分析し、差別化できる新しいアプローチを提案してください"
            },
            {
                "title": "ユースケースの列挙",
                "prompt": "以下の製品・サービスについて、想定されるユースケースを10個列挙し、それぞれの価値提案を記載してください"
            },
        ]
     },
     },
]
]
120行目: 258行目:
// document.Tag に保持されるため、開いているファイルを閉じると履歴は消えます。
// document.Tag に保持されるため、開いているファイルを閉じると履歴は消えます。
const HISTORY_SIZE = 4;
const HISTORY_SIZE = 4;
// 生成AI応答の入力毎の遅延時間 (ミリ秒)
// 入力をゆっくりにしたいときは数字を大きくしてください。
const INPUT_DELAY = 20;


// 1回の入力での文字数
// 1回の入力での文字数
const INPUT_LENGTH = 3;
const INPUT_LENGTH = 3;


// 生成AI応答の入力毎の遅延時間 (ミリ秒)
// 入力プロンプトの最大文字数
// 入力をゆっくりにしたいときは数字を大きくしてください。
const MAX_PROMPT_LENGTH = 10000;
const INPUT_DELAY = 20;


// コンテキストメニュー番号の定義
// コンテキストメニュー番号の定義
132行目: 273行目:
const RESET_HISTORY = 2;
const RESET_HISTORY = 2;
const SET_CUSTOM_INSTRUCTION = 3;
const SET_CUSTOM_INSTRUCTION = 3;
const REEXECUTE_LAST_TEMPLATE_PROMPT = 4;
const TEMPLATE_PROMPT_THRESHOLD = 10;
const TEMPLATE_PROMPT_THRESHOLD = 10;
const TEMPLATE_PROMPT_SUBMENU_THRESHOLD = 1000;


// タグ名の定義
// タグ名の定義
const HISTORY_TAG = "gpt-history";
const HISTORY_TAG = "gpt-history";
const TEMPORARY_CUSTOM_INSTRUCTION_TAG = "gpt-temporary-custom-instruction";
const TEMPORARY_CUSTOM_INSTRUCTION_TAG = "gpt-temporary-custom-instruction";
const PREVIOUS_TEMPLATE_PROMPT_TAG = "gpt-previous-template-prompt";


// console.log に出力する内容を Mery のアウトプットバーに表示する
// console.log に出力する内容を Mery のアウトプットバーに表示する
194行目: 338行目:
     }
     }
     // 文字数が多すぎる場合はエラー
     // 文字数が多すぎる場合はエラー
     if (promptLength > 10000) {
     if (promptLength > MAX_PROMPT_LENGTH) {
         alert("プロンプトの文字数が多すぎます。10000 文字以下にしてください。");
         alert(`プロンプトの文字数が多すぎます。${MAX_PROMPT_LENGTH} 文字以内で入力してください。`);
         return;
         return;
     }
     }
202行目: 346行目:
         alert("ファイルが読み取り専用のため実行できません。");
         alert("ファイルが読み取り専用のため実行できません。");
         return;
         return;
    }
    // 直前に実行したプロンプトテンプレートの再実行の場合、menuTrack を書き換え
    if (menuTrack === REEXECUTE_LAST_TEMPLATE_PROMPT) {
        if (doc.Tag.exists(PREVIOUS_TEMPLATE_PROMPT_TAG)) {
            menuTrack = Number(doc.Tag[PREVIOUS_TEMPLATE_PROMPT_TAG]);
        } else {
            alert("直前に実行したプロンプトテンプレートがありません。");
            return;
        }
     }
     }


     // テンプレートの場合はプロンプトを変更
     // テンプレートの場合はプロンプトを変更
     const isTemplate = menuTrack >= TEMPLATE_PROMPT_THRESHOLD;
     const isTemplate = menuTrack >= TEMPLATE_PROMPT_THRESHOLD;
    const isSubmenu = menuTrack >= TEMPLATE_PROMPT_SUBMENU_THRESHOLD;
    if (isSubmenu) {
        const parentMenuTrack = Number(String(menuTrack).slice(0, 2));
        const subMenuTrack = Number(String(menuTrack).slice(2));
        promptText = PROMPT_TEMPLATE[parentMenuTrack - TEMPLATE_PROMPT_THRESHOLD].submenu[subMenuTrack].prompt
            + "\n\n---\n\n"
            + promptText;
    } else if (isTemplate) {
        promptText = PROMPT_TEMPLATE[menuTrack - TEMPLATE_PROMPT_THRESHOLD].prompt
            + "\n\n---\n\n"
            + promptText;
    }
    // テンプレートの場合は直前に実行したプロンプトテンプレートの番号としてタグに保存
     if (isTemplate) {
     if (isTemplate) {
         promptText = PROMPT_TEMPLATE[menuTrack - TEMPLATE_PROMPT_THRESHOLD].prompt + "\n\n---\n\n" + promptText;
         addPreviousTemplatePromptNumberToTag(menuTrack);
     }
     }


248行目: 416行目:
     let t = "";
     let t = "";
     if (selectionIsEmpty) {
     if (selectionIsEmpty) {
         t = "アクティブ行の内容で相談 (&Q)";
         t = "アクティブ行の内容で相談 (&A)";
     } else {
     } else {
         t = "選択範囲の内容で相談 (&Q)";
         t = "選択範囲の内容で相談 (&A)";
     }
     }
     menu.Add(t, EXECUTE_AI);
     menu.Add(t, EXECUTE_AI);
    menu.Add((document.Tag.exists(HISTORY_TAG) ? "├" : "└")
     if (doc.Tag.exists(HISTORY_TAG)) {
        + " カスタムインストラクションを変更 (&C)", SET_CUSTOM_INSTRUCTION);
         const turn = JSON.parse(doc.Tag[HISTORY_TAG]).length / 2;
     if (document.Tag.exists(HISTORY_TAG)) {
         menu.Add("├ 会話履歴をクリア (現在の会話数: " + turn + ") (&C)", RESET_HISTORY);
         const turn = JSON.parse(document.Tag[HISTORY_TAG]).length / 2;
    } else {
         menu.Add("└ 会話履歴をリセット (現在の会話数: " + turn + ") (&R)", RESET_HISTORY);
        menu.Add("├ 会話履歴をクリア (現在の会話数: 0) (&C)", RESET_HISTORY, meMenuGrayed);
    }
    menu.Add("└ カスタムインストラクションを変更 (&I)", SET_CUSTOM_INSTRUCTION);
 
 
    // テンプレート数チェック
    // 2桁まで許容
    const ITEMS_MUX = 99;
    if (PROMPT_TEMPLATE.length > ITEMS_MUX - TEMPLATE_PROMPT_THRESHOLD) {
        throw new Error("プロンプトテンプレートの数が多すぎます。");
     }
     }


270行目: 447行目:
                 accelerationKey = ` (&${i + 1})`;
                 accelerationKey = ` (&${i + 1})`;
             }
             }
             subMenu.Add(PROMPT_TEMPLATE[i].title + accelerationKey, TEMPLATE_PROMPT_THRESHOLD + i);
             const menuNum = TEMPLATE_PROMPT_THRESHOLD + i;
            if (PROMPT_TEMPLATE[i].submenu) {
                const subMenuList = PROMPT_TEMPLATE[i].submenu;
                // テンプレート数チェック
                if (subMenuList.length > ITEMS_MUX) {
                    throw new Error("プロンプトテンプレート (サブメニュー) の数が多すぎます。");
                }
                const subSubMenu = CreatePopupMenu();
                const subMenuPrefix = String(menuNum);
                for (let j = 0; j < subMenuList.length; j++) {
                    let subAccelerationKey = "";
                    if (j === 9) {
                        subAccelerationKey = " (&0)";
                    } else if (j < 10) {
                        subAccelerationKey = ` (&${j + 1})`;
                    }
                    const subMenuNum = Number(subMenuPrefix + String(j).padStart(2, '0'));
                    subSubMenu.Add(subMenuList[j].title + subAccelerationKey, subMenuNum);
                }
                subMenu.AddPopup(PROMPT_TEMPLATE[i].submenu_title + accelerationKey, subSubMenu);
            } else {
                subMenu.Add(PROMPT_TEMPLATE[i].title + accelerationKey, menuNum);
            }
         }
         }
         if (selectionIsEmpty) {
         if (selectionIsEmpty) {
278行目: 477行目:
         }
         }
         menu.AddPopup(t, subMenu);
         menu.AddPopup(t, subMenu);
        t = "└ 直前に実行したプロンプト テンプレートを再実行 (&R)";
        if (doc.Tag.exists(PREVIOUS_TEMPLATE_PROMPT_TAG)) {
            menu.Add(t, REEXECUTE_LAST_TEMPLATE_PROMPT);
        } else {
            menu.Add(t, REEXECUTE_LAST_TEMPLATE_PROMPT, meMenuGrayed);
        }
     }
     }


536行目: 742行目:


function getTemporaryCustomInstruction() {
function getTemporaryCustomInstruction() {
     const tag = document.Tag;
     const tag = doc.Tag;
     if (tag.exists(TEMPORARY_CUSTOM_INSTRUCTION_TAG)) {
     if (tag.exists(TEMPORARY_CUSTOM_INSTRUCTION_TAG)) {
         return tag[TEMPORARY_CUSTOM_INSTRUCTION_TAG];
         return tag[TEMPORARY_CUSTOM_INSTRUCTION_TAG];
545行目: 751行目:


function setTemporaryCustomInstruction(temporaryCustomInstruction) {
function setTemporaryCustomInstruction(temporaryCustomInstruction) {
     const tag = document.Tag;
     const tag = doc.Tag;
     if (temporaryCustomInstruction) {
     if (temporaryCustomInstruction) {
         tag[TEMPORARY_CUSTOM_INSTRUCTION_TAG] = temporaryCustomInstruction;
         tag[TEMPORARY_CUSTOM_INSTRUCTION_TAG] = temporaryCustomInstruction;
551行目: 757行目:
         tag.remove(TEMPORARY_CUSTOM_INSTRUCTION_TAG);
         tag.remove(TEMPORARY_CUSTOM_INSTRUCTION_TAG);
     }
     }
}
function addPreviousTemplatePromptNumberToTag(menuTrack) {
    const tag = doc.Tag;
    tag[PREVIOUS_TEMPLATE_PROMPT_TAG] = menuTrack;
}
}
</syntaxhighlight>
</syntaxhighlight>
スポンサーリンク