From 3db6d72624078768a778abd83e98b188935b5a1f Mon Sep 17 00:00:00 2001 From: ika-2-2 <219417869+ika-2-2@users.noreply.github.com> Date: Sun, 10 Aug 2025 14:33:00 +0900 Subject: [PATCH] =?UTF-8?q?=E4=BC=9A=E8=A9=B1=E3=82=B5=E3=83=BC=E3=83=93?= =?UTF-8?q?=E3=82=B9=E3=81=AE=E8=82=AF=E5=AE=9A/=E5=90=A6=E5=AE=9A?= =?UTF-8?q?=E5=88=A4=E5=AE=9A=E3=83=AD=E3=82=B8=E3=83=83=E3=82=AF=E3=82=92?= =?UTF-8?q?=E6=94=B9=E5=96=84,=E3=83=97=E3=83=AD=E3=83=B3=E3=83=97?= =?UTF-8?q?=E3=83=88=E3=82=92=E6=94=B9=E5=96=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/api/src/services/conversationsService.ts | 31 +++++++++++++------ apps/api/src/services/prompts.ts | 14 ++++----- 2 files changed, 27 insertions(+), 18 deletions(-) diff --git a/apps/api/src/services/conversationsService.ts b/apps/api/src/services/conversationsService.ts index 987934f..3e56ce3 100644 --- a/apps/api/src/services/conversationsService.ts +++ b/apps/api/src/services/conversationsService.ts @@ -117,12 +117,11 @@ export class ConversationService { }); const isPositive = - /はい|OK|お願い|進めて|いい|わかった|了解|うん|ええ|賛成|ぜひ|おねがい|おk|ok|うい|大丈夫|y(es)?/i.test( + /はい|OK|お願い|進めて|いいよ|わかった|了解|うん|ええ|賛成|ぜひ|おねがい|おk|ok|うい|大丈夫|y(es)?/i.test( userMessage, ); - const isNegative = /いいえ|やめ|不要|戻|no|嫌|いえ|いや|保留|まだ/i.test( - userMessage, - ); + const isNegative = + /いいえ|やめ|不要|戻|no|嫌|いえ|いや|保留|やだ|まだ/i.test(userMessage); console.log("🔍 デバッグ: 肯定/否定判定", { userMessage, @@ -146,7 +145,7 @@ export class ConversationService { } } else if (isNegative) { const stayMessage = - "承知いたしました。では、もう少し現在のフェーズについてお話ししましょう。他に何か追加したいことや、修正したい点はありますか?"; + "承知いたしました。では、もう少し現在のフェーズについてお話ししましょう。他に何か追加したいことはありますか?"; return this.saveMessage(sessionId, "ai", stayMessage); } // 肯定/否定どちらでもない曖昧な返答は、そのまま通常フローに続行 @@ -157,11 +156,16 @@ export class ConversationService { return this.saveMessage(sessionId, "ai", proceedMessage); } if (isNegative) { - const reviseMessage = - "承知しました。Issue登録は保留します。修正したい点を教えてください。"; - return this.saveMessage(sessionId, "ai", reviseMessage); + const holdMessage = + "承知しました。Issue登録は保留します。再開する場合は『はい』と返答してください。"; + return this.saveMessage(sessionId, "ai", holdMessage); } - // ここも曖昧な返答は通常フローに続行 + // 曖昧な返答: はい/いいえを促す(通常フローに落とさない) + return this.saveMessage( + sessionId, + "ai", + 'リポジトリ選択に進むかどうか、"はい" または "いいえ" でお答えください。', + ); } if (wasIssueGenerationConfirmation) { @@ -188,7 +192,14 @@ export class ConversationService { return this.saveMessage( sessionId, "ai", - "承知しました。要件定義書のどこを修正したいですか?", + "承知しました。Issue案の生成は保留します。再開する場合は『はい』と返答してください。", + ); + } else { + // 曖昧な返答: はい/いいえを促す + return this.saveMessage( + sessionId, + "ai", + 'Issue案を生成してもよろしいですか?\n進める場合は "はい"、中止する場合は "いいえ" とお答えください。', ); } } diff --git a/apps/api/src/services/prompts.ts b/apps/api/src/services/prompts.ts index e4bc7c5..b97ece4 100644 --- a/apps/api/src/services/prompts.ts +++ b/apps/api/src/services/prompts.ts @@ -2,7 +2,7 @@ export const PROMPT_TEMPLATE = ` # [Prism] AI ペルソナ & 全体指示書 ## 1. あなたの役割 (Role) -あなたは「Prism」という名前の、経験豊富なソフトウェアアーキテクト兼プロジェクトマネージャーである。 +あなたは「Prism」という名前の、明るい性格な経験豊富なプロジェクトマネージャーである。 あなたの唯一の使命は、ユーザーとの対話を通じて、彼らの曖昧なアイデアを、明確で実行可能なGitHub Issueにまで落とし込むこと。あなたは専門家として、ユーザーの思考を整理し、プロジェクトの解像度を高めるためのファシリテーターに徹しなさい。 ## 2. 全体ルール @@ -11,13 +11,11 @@ export const PROMPT_TEMPLATE = ` - **記憶の活用**: 提供される「これまでの対話履歴」を常に参照し、同じ質問を繰り返したり、文脈に合わない質問をしたりしないようにしなさい。 - **復唱禁止**: ユーザーの文面をそのまま繰り返さない。必要な場合のみ、1文で短く要約しなさい。 - **会話トーン**: 先頭に短い相槌を1文だけ入れる。 -- **浅く、広く聞くこと**: あなたの役割は、詳細な仕様を詰めることではない。各フェーズで定められた必須項目について、**ユーザーから1つ、主要な回答を得たら、すぐに次の項目に移る**ことを徹底しなさい。同じ項目について、連続して2回以上質問してはならない。 -- **ユーザーの指示を最優先**: ユーザーが「次へ進んで」「タスク化して」のように、明確に次のステップへ進む意思を示した場合、あなたの判断を待たずに、即座に'[TRANSITION_SUGGESTION]'を出力しなさい。 +- **質問や疑問**: ユーザーからの質問や疑問が返ってきた場合、あなた自身の言葉で会話しなさい。 ### 2.1. 会話トーンの制御 -- **相槌の多様化**: ユーザーの発言に対しては、毎回必ず短い相槌から始めること。ただし、毎回「素晴らしいアイデアですね!」を使うのではなく、文脈に応じて以下の言葉を使い分け、自然な応答を心がけなさい。 - - **肯定的な相槌の例**: 「承知いたしました。」「なるほど、理解しました。」「面白いですね!」「具体的で分かりやすいです。」 - - **強い賞賛**: 「素晴らしいアイデアですね!」のような強い賞賛は、**ユーザーが特にユニークな発想を提示した時**に限定して使用しなさい。同じ賞賛を繰り返さないこと。 +- **相槌の多様化**: ユーザーの発言に対しては、毎回必ず短い相槌から始めること。ただし**うん**という返事は絶対しない。あなた自身の言葉で共感したり褒めたり、何も感じなければ普通の返しをすればいい。 +- **強い賞賛**: 「素晴らしいアイデアですね!」のような強い賞賛は、**ユーザーが特にユニークな発想を提示した時**に限定して使用しなさい。同じ賞賛を繰り返さないこと。 ### 2.2. 具体例の提示制御 - **例の抑制**: ユーザーが答えに迷いそうな、少し複雑な質問をする場合にのみ、「例えば〜」という具体例を提示してください。 @@ -52,14 +50,14 @@ export const PROMPT_TEMPLATE = ` **行動**: 1. 対話履歴が空の場合、最初の挨拶として「こんにちは!Prismです。どんなアプリを作りたいですか?一言で教えてください。」とだけ返しなさい。 2. 「ターゲットユーザー」「解決する課題」「競合サービスとの差別化ポイント」の3つの必須項目について、それぞれ**1つずつ**主要な回答をユーザーから引き出しなさい。 -3. 上記**3つのの3つの必須項目について、それぞれ**1つずつ**主要な回答をユーザーから引き出しなさい。**、それ以上深掘りせず、速やかに'[TRANSITION_SUGGESTION]'を出力しなさい。 +3. 上記3つの必須項目について、それぞれ**1つずつ**主要な回答をユーザーから引き出しなさい。**、それ以上深掘りせず、速やかに'[TRANSITION_SUGGESTION]'を出力しなさい。 ### フェーズが "requirements" の場合 **目的**: アイデアを実現するために必要な機能要件・非機能要件を洗い出すこと。 **深掘りポイント**: 以下の3つのポイントのみに絞り、各ポイント最大2-3回の質問で完了させる。 1. 主要機能の洗い出し(最低限必要な機能) 2. ユーザーインターフェース(どんな画面や操作が必要か) -3. 非機能要件(技術スタック、セキュリティ、UXなど) +3. 非機能要件(使用する言語やAPI、セキュリティ、UXなど) **行動**: 1. もし前のフェーズから移行した直後であれば、「ありがとうございます。では、このアプリに必要な機能を一緒に考えていきましょう。まずは思いつくままに、どんな機能がほしいかリストアップしてもらえますか?」という文章が自動で送信される。