「OpenAI GPT に相談」の版間の差分
| 88行目: | 88行目: | ||
// テンプレートは以下の { ~ }, で囲まれたブロックを好きに増減させて利用できます。 | // テンプレートは以下の { ~ }, で囲まれたブロックを好きに増減させて利用できます。 | ||
const PROMPT_TEMPLATE = [ | const PROMPT_TEMPLATE = [ | ||
{ | |||
"title": "要約する", | |||
"prompt": "要約して。専門的な用語と思われる単語は簡単に解説も入れて。" | |||
}, | |||
{ | { | ||
"title": "誤字脱字、不正確な表現をチェック", | "title": "誤字脱字、不正確な表現をチェック", | ||
"prompt": " | "prompt": "以下の2つのカテゴリーで問題点を指摘してください\n" | ||
+ "- 【誤字脱字】:明確な誤字脱字および誤字の疑いがある箇所\n" | |||
+ "- 【不正確・曖昧な表現】:解釈に個人差が生じる可能性がある表現、より適切な表現に改善できる箇所" | |||
}, | }, | ||
{ | { | ||
"title": "日本語に翻訳", | "submenu_title": "翻訳", | ||
"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": " | "submenu_title": "分析支援", | ||
"submenu": [ | |||
{ | |||
"title": "問題を分析し、課題を抽出する", | |||
"prompt": "以下の状況から問題や潜在的リスクを分析し、課題を抽出してください" | |||
}, | |||
{ | |||
"title": "対応策を提案する", | |||
"prompt": "以下の問題・課題に対する対応策を複数提案してください" | |||
}, | |||
{ | |||
"title": "傾向を見つける", | |||
"prompt": "以下の内容から、数値や挙動上の傾向を見つけてください" | |||
}, | |||
] | |||
}, | }, | ||
{ | { | ||
"title": " | "submenu_title": "アイデア出し", | ||
"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; | ||
// | // 入力プロンプトの最大文字数 | ||
const MAX_PROMPT_LENGTH = 10000; | |||
const | |||
// コンテキストメニュー番号の定義 | // コンテキストメニュー番号の定義 | ||
| 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 > | if (promptLength > MAX_PROMPT_LENGTH) { | ||
alert( | 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) { | ||
addPreviousTemplatePromptNumberToTag(menuTrack); | |||
} | } | ||
| 248行目: | 416行目: | ||
let t = ""; | let t = ""; | ||
if (selectionIsEmpty) { | if (selectionIsEmpty) { | ||
t = "アクティブ行の内容で相談 (& | t = "アクティブ行の内容で相談 (&A)"; | ||
} else { | } else { | ||
t = "選択範囲の内容で相談 (& | t = "選択範囲の内容で相談 (&A)"; | ||
} | } | ||
menu.Add(t, EXECUTE_AI); | menu.Add(t, EXECUTE_AI); | ||
if (doc.Tag.exists(HISTORY_TAG)) { | |||
const turn = JSON.parse(doc.Tag[HISTORY_TAG]).length / 2; | |||
if ( | menu.Add("├ 会話履歴をクリア (現在の会話数: " + turn + ") (&C)", RESET_HISTORY); | ||
const turn = JSON.parse( | } else { | ||
menu.Add(" | 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, | 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 = | 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 = | 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> | ||
スポンサーリンク