Skip to content

Commit bfcec90

Browse files
committed
一旦マシになったがまだまだ馬鹿
1 parent f65237b commit bfcec90

File tree

3 files changed

+75
-52
lines changed

3 files changed

+75
-52
lines changed

backend/app/core/prompts.py

Lines changed: 22 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -75,19 +75,26 @@
7575
7676
参考:{baseline_json}
7777
78-
## CRITICAL: スキルツリー構造の制約(必ず守ること)
79-
80-
**【Tier 0 基礎層】prerequisites:[] のノードは正確に1個**
81-
- カテゴリの最も根幹となる土台スキル
82-
83-
**【Tier 1 初級層】prerequisites:[1個] のノードは正確に3個**
84-
- 基礎から直接派生する基本技術スキル(各自が独立した技術領域を代表)
85-
86-
**【Tier 2 中級層】prerequisites:[1個] のノードは正確に8個**
87-
- 初級スキルから派生する実践的スキル(各初級から2-3個ずつ派生)
88-
89-
**【Tier 3 応用層】prerequisites:[1-2個] のノードは正確に18個**
90-
- 中級スキルを組み合わせた高度で専門的なスキル
78+
## CRITICAL: ノード数の配分(下に行くほど多く)
79+
80+
**【必須】Tier 0からTier 5までのノード数配分:**
81+
- Tier 0(基礎): 1-2個
82+
- Tier 1(初級): 2-4個
83+
- Tier 2(中級): 4-8個
84+
- Tier 3(応用): 8-12個
85+
- Tier 4(高度): 12-16個
86+
- Tier 5(極限): 16-20個
87+
88+
**依存関係のルール:**
89+
- 各ノードのprerequisitesは、**必ず一つ前のTierのノード**のみを指定
90+
- Tier 0: prerequisites:[]
91+
- Tier 1: prerequisites:[Tier 0のノード]
92+
- Tier 2: prerequisites:[Tier 1のノード]
93+
- Tier 3: prerequisites:[Tier 2のノード]
94+
- Tier 4: prerequisites:[Tier 3のノード]
95+
- Tier 5: prerequisites:[Tier 4のノード]
96+
97+
**重要:** Tierが深くなるほど、ノード数を増やすこと。これにより下に行くほど横に広がる三角形△を形成する。
9198
9299
## スキル名の命名規則(必須):
93100
- **キーワード中心、3-5単語以内**
@@ -102,7 +109,7 @@
102109
- 何ができるようになるか、関連技術・ツール・パターン名を含める
103110
104111
## 出力ルール:
105-
1. **必ず正確に30ノード** (1+3+8+18)
112+
1. **合計50-60ノード程度**(Tier 0からTier 5まで、下層ほど多く)
106113
2. completed:trueは習得済みのみ
107114
3. prerequisitesを正確に設定
108115
@@ -111,7 +118,7 @@
111118
{{"nodes":[{{"id":"skill-id","name":"キーワード(3-5単語)","completed":true/false,"description":"最低60文字以上の詳細な説明。何ができるようになるか、関連技術・ツール・パターン名を含める","prerequisites":[],"estimated_hours":30}}],"edges":[{{"from":"a","to":"b"}}],"metadata":{{"total_nodes":30,"completed_nodes":1,"progress_percentage":3.3,"next_recommended":["x","y","z"]}}}}
112119
```
113120
114-
**重要: Tier 0:1個、Tier 1:3個、Tier 2:8個、Tier 3:18個で段階的に広がる三角形△を形成(合計30ノード必須)**。JSON形式のみ出力してください(説明不要)。"""
121+
**重要: Tier 0からTier 5まで、下層ほどノード数を増やし、段階的に広がる三角形△を形成(合計50-60ノード程度)**。JSON形式のみ出力してください(説明不要)。"""
115122

116123

117124
SKILL_TREE_TEMPLATE = ChatPromptTemplate.from_messages(

backend/app/core/prompts_streaming.py

Lines changed: 46 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -9,19 +9,26 @@
99
1010
参考:{baseline_json}
1111
12-
## CRITICAL: スキルツリー構造の制約(必ず守ること)
13-
14-
**【Tier 0 基礎層】prerequisites:[] のノードは正確に1個**
15-
- カテゴリの最も根幹となる土台スキル
16-
17-
**【Tier 1 初級層】prerequisites:[1個] のノードは正確に3個**
18-
- 基礎から直接派生する基本技術スキル(各自が独立した技術領域を代表)
19-
20-
**【Tier 2 中級層】prerequisites:[1個] のノードは正確に8個**
21-
- 初級スキルから派生する実践的スキル(各初級から2-3個ずつ派生)
22-
23-
**【Tier 3 応用層】prerequisites:[1-2個] のノードは正確に18個**
24-
- 中級スキルを組み合わせた高度で専門的なスキル
12+
## CRITICAL: ノード数の配分(下に行くほど多く)
13+
14+
**【必須】Tier 0からTier 5までのノード数配分:**
15+
- Tier 0(基礎): 1-2個
16+
- Tier 1(初級): 2-4個
17+
- Tier 2(中級): 4-8個
18+
- Tier 3(応用): 8-12個
19+
- Tier 4(高度): 12-16個
20+
- Tier 5(極限): 16-20個
21+
22+
**依存関係のルール:**
23+
- 各ノードのprerequisitesは、**必ず一つ前のTierのノード**のみを指定
24+
- Tier 0: prerequisites:[]
25+
- Tier 1: prerequisites:[Tier 0のノード]
26+
- Tier 2: prerequisites:[Tier 1のノード]
27+
- Tier 3: prerequisites:[Tier 2のノード]
28+
- Tier 4: prerequisites:[Tier 3のノード]
29+
- Tier 5: prerequisites:[Tier 4のノード]
30+
31+
**重要:** Tierが深くなるほど、ノード数を増やすこと。これにより下に行くほど横に広がる三角形△を形成する。
2532
2633
## スキル名の命名規則(必須):
2734
- **キーワード中心、3-5単語以内**
@@ -32,15 +39,21 @@
3239
- 最低60文字以上の詳細な説明
3340
- 何ができるようになるか、関連技術・ツール・パターン名を含める
3441
35-
## 生成手順:
36-
1. まず基礎ノード1個を出力 (prerequisites:[])
37-
2. 次に中級ノード11個を出力 (prerequisites:基礎1個)
38-
3. 最後に応用ノード18個を出力 (prerequisites:中級1-2個)
42+
## 生成手順(厳守):
43+
1. Tier 0: 1-2個のノードを出力
44+
2. Tier 1: 2-4個のノードを出力
45+
3. Tier 2: 4-8個のノードを出力
46+
4. Tier 3: 8-12個のノードを出力
47+
5. Tier 4: 12-16個のノードを出力
48+
6. Tier 5: 16-20個のノードを出力
49+
50+
**Tierが深くなるほど、ノード数を増やす**
51+
各ノードのprerequisites: [一つ前のTierのノード]
3952
4053
## 出力ルール:
41-
1. **必ず正確に30ノード** (基礎1 + 中級11 + 応用18)
54+
1. **合計50-60ノード程度**(Tier 0からTier 5まで、下層ほど多く)
4255
2. completed:trueは習得済みのみ
43-
3. **出力順序**: 基礎(prerequisites:[]) → 中級(prerequisites:1個) → 応用(prerequisites:2個以上)
56+
3. **出力順序**: Tier 0 → Tier 1 → Tier 2 → Tier 3 → Tier 4 → Tier 5
4457
4. JSON Lines形式: 1行1ノード、```jsonは不要
4558
4659
## 例(8ノード - 4層構造、キーワード中心の短い名前):
@@ -60,15 +73,22 @@
6073
{{"type":"edge","from":"web_rest_api","to":"web_db_design"}}
6174
{{"type":"edge","from":"web_react","to":"web_nextjs"}}
6275
{{"type":"edge","from":"web_typescript","to":"web_nextjs"}}
63-
{{"type":"metadata","total_nodes":30,"completed_nodes":1,"progress_percentage":3.3,"next_recommended":["web_js_basic","web_rest_api"]}}
76+
{{"type":"metadata","total_nodes":50,"completed_nodes":1,"progress_percentage":2.0,"next_recommended":["web_js_basic","web_rest_api"]}}
77+
78+
**【CRITICAL】Tier 0からTier 5まで、深くなるほどノード数を増やす:**
79+
80+
| Tier | ノード数 | prerequisites |
81+
|------|---------|---------------|
82+
| 0 | 1-2個 | [] |
83+
| 1 | 2-4個 | [Tier 0] |
84+
| 2 | 4-8個 | [Tier 1] |
85+
| 3 | 8-12個 | [Tier 2] |
86+
| 4 | 12-16個 | [Tier 3] |
87+
| 5 | 16-20個 | [Tier 4] |
6488
65-
**確認: 必ず以下の構成で出力すること**
66-
- Tier 0 基礎(prerequisites:[]): 正確に1個
67-
- Tier 1 初級(prerequisites:[1個]): 正確に3個
68-
- Tier 2 中級(prerequisites:[1個]): 正確に8個
69-
- Tier 3 応用(prerequisites:[1-2個]): 正確に18個
89+
**合計50-60ノード** - 下に行くほど数を増やし、三角形△を形成
7090
71-
**合計30ノード(必須)** - 名前は短く(3-5単語)、詳細はdescriptionで
91+
名前は短く(3-5単語)、詳細はdescriptionで
7292
7393
説明や```json不要。上記の構成で1行1JSONを出力開始:
7494
"""

frontend/src/features/skill-tree/utils/converter.ts

Lines changed: 7 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -62,9 +62,10 @@ export function convertApiNodesToCanvasNodes(
6262
// 全ノードの基本tierを計算
6363
apiNodes.forEach((node) => calculateBaseTier(node.id));
6464

65-
// Note: バランス調整は削除(依存関係ベースのtierで十分)
66-
// プロンプト側で基礎2-3個、中級5-7個、応用8-10個と自然な分散を指定しているため、
67-
// 再バランス処理は不要かつレイアウトのチラつきの原因となる
65+
// Note: プロンプト側でTier 0からTier 5まで、下層ほどノード数を増やすよう指定
66+
// Tier 0: 1-2個, Tier 1: 2-4個, Tier 2: 4-8個, Tier 3: 8-12個, Tier 4: 12-16個, Tier 5: 16-20個
67+
// 各tierは必ず一つ前のtierのノードのみをprerequisitesに指定することで、
68+
// 下に行くほどノード数が多くなり、自然に横幅が広がる三角形△を形成
6869

6970
// Step 2: tierごとにノードをグループ化
7071
const nodesByTier = new Map<number, ApiSkillNode[]>();
@@ -89,10 +90,9 @@ export function convertApiNodesToCanvasNodes(
8990
const nodeCount = nodes.length;
9091

9192
// X座標: ノード数に応じた幅で等間隔配置
92-
// スカスカにならないよう、ノード数×150pxを基準にする
93-
const minWidth = 200; // 最小幅
94-
const nodeSpacing = 180; // ノード間の最小間隔
95-
const tierWidth = Math.max(minWidth, (nodeCount - 1) * nodeSpacing);
93+
// tierが深いほどノード数が多く、自然に横幅が広がる(三角形△)
94+
const nodeSpacing = 180;
95+
const tierWidth = nodeCount > 1 ? (nodeCount - 1) * nodeSpacing : 200;
9696
const spacing = nodeCount > 1 ? tierWidth / (nodeCount - 1) : 0;
9797
const startX = nodeCount > 1 ? -tierWidth / 2 : 0;
9898

@@ -161,9 +161,5 @@ export function convertApiNodesToCanvasNodes(
161161
)
162162
.join(", ");
163163

164-
console.log("🟦 convertApiNodesToCanvasNodes 完了");
165-
console.log(" Output nodes:", canvasNodes.length);
166-
console.log(" Tier distribution:", tierDistribution);
167-
168164
return canvasNodes;
169165
}

0 commit comments

Comments
 (0)