業務フロー認識
最終更新日: 2025年4月1日
業務フローのスキーマを認識するための処理
Acsimで作成した現場業務(AsIs)とあるべき姿(ToBe)をLLMが把握できるようにするための基本ステップです。
他のAcsimプロンプトを使用する前に、まず最初にこの処理を実行してください。これによりLLMが業務フローの構造を理解できるようになります。
プロンプト実行方法
Claudeを開く
Claudeにアクセスします。
業務フローJSONファイルを準備する
業務フローのJSONファイルをダウンロードしておきます。
以下のプロンプトを実行する
- 取得した業務フローJSONファイルをLLMに添付してください
- 以下のプロンプトをコピーして貼り付けてください
- 送信して実行してください
※重要: ファイルサイズが大きい場合は、無料プランでは処理できない場合があります。その場合は有料プランにアップグレードするか、ファイルを分割して処理してください。
成果物のスキーマを認識する内容は以下の通りです。
以下の zod schema が業務フローのjson仕様です。こちらを読込み、何も出力せず、次の質問に答えなさい。
/**
* 成果物のスキーマ
*/
const artifactSchema = schemaForType<Artifact>()(
z
.object({
id: z.string().trim().min(1).describe("成果物の一意の識別子"),
name: z.string().trim().min(1).describe("成果物の名称"),
})
.describe("業務フローで使用される成果物の定義")
);
/**
* 業務パターンのスキーマ
*/
const businessPatternSchema = schemaForType<BusinessPattern>()(
z
.object({
id: z.string().trim().min(1).describe("業務パターンの一意の識別子"),
name: z.string().trim().min(1).describe("業務パターンの名称"),
percentage: z.number().describe("業務パターンの割合(%)"),
})
.describe("業務フローで使用される業務パターンの定義")
);
/**
* エッジの基本データスキーマ
*/
const baseEdgeDataSchema = z
.object({
id: z.string().trim().min(1).describe("エッジの一意の識別子"),
source: z.string().trim().min(1).describe("接続元ノードのID"),
target: z.string().trim().min(1).describe("接続先ノードのID"),
sourceHandle: z.string().trim().min(1).describe("接続元ハンドルの識別子"),
targetHandle: z.string().trim().min(1).describe("接続先ハンドルの識別子"),
})
.describe("業務フローのエッジ(ノード間の接続)の基本データ構造");
/**
* エッジのスキーマ
*/
const businessFlowEdgeSchema = schemaForType<TBusinessFlowEdge>()(
z.discriminatedUnion("type", [
z
.object({
...baseEdgeDataSchema.shape,
type: z.literal(BUSINESS_FLOW_EDGE_TYPE.ACTIVE).describe("アクティブな接続を表すエッジタイプ"),
data: z.object({
source: z.enum(["action", "condition"]).describe("エッジのソース"),
target: z.enum(["action", "condition"]).describe("エッジのターゲット"),
}),
})
.describe("アクティブな業務フローを表すエッジ"),
z
.object({
...baseEdgeDataSchema.shape,
type: z.literal(BUSINESS_FLOW_EDGE_TYPE.INACTIVE).describe("非アクティブな接続を表すエッジタイプ"),
data: z.object({
source: z.enum(["action", "condition"]).describe("エッジのソース"),
target: z.enum(["action", "condition"]).describe("エッジのターゲット"),
}),
})
.describe("非アクティブな業務フローを表すエッジ"),
z
.object({
...baseEdgeDataSchema.shape,
type: z.literal(BUSINESS_FLOW_EDGE_TYPE.MEMO).describe("Memo用の接続を表すエッジタイプ"),
data: z.object({
source: z.enum(["memo"]).describe("エッジのソース"),
target: z.enum(["action", "condition"]).describe("エッジのターゲット"),
}),
})
.describe("Memo用の接続を表すエッジ"),
z
.object({
...baseEdgeDataSchema.shape,
type: z.literal(BUSINESS_FLOW_EDGE_TYPE.ISSUE).describe("Issue用の接続を表すエッジタイプ"),
data: z.object({
source: z.enum(["issue"]).describe("エッジのソース"),
target: z.enum(["action", "condition"]).describe("エッジのターゲット"),
}),
})
.describe("Issue用の接続を表すエッジ"),
])
);
/**
* ノードの基本スキーマ
*/
const baseNodeSchema = z
.object({
id: z.string().trim().min(1).describe("ノードの一意の識別子"),
position: z
.object({
x: z.number().describe("ノードのX座標位置"),
y: z.number().describe("ノードのY座標位置"),
})
.describe("ノードの座標位置"),
measured: z
.object({
width: z.number().describe("ノードの幅"),
height: z.number().describe("ノードの高さ"),
})
.describe("ノードのサイズ"),
})
.describe("業務フローのノードの基本データ構造");
/**
* ノードのスキーマ
*
* Nodeの意味的な階層
* - section
* - actor
* - subSection
* - nodes:type:action or nodes:type:condition
*/
const businessFlowNodeSchema = schemaForType<TBusinessFlowNode>()(
z.discriminatedUnion("type", [
z
.object({
...baseNodeSchema.shape,
type: z
.literal(BUSINESS_FLOW_NODE_TYPE.ACTOR)
.describe("システム/人などの登場するステークホルダーを表すノードタイプ"),
data: z.object({
name: z.string().trim().min(1).describe("アクターの名称"),
type: z.enum(["human", "system"]).describe("アクターの種類"),
index: z.number().describe("アクターの並び順"),
}),
})
.describe("業務フローのアクターを表すノード"),
z
.object({
...baseNodeSchema.shape,
type: z.literal(BUSINESS_FLOW_NODE_TYPE.SECTION).describe("セクションを表すノードタイプ"),
parentId: z.string().trim().min(1).describe("sectionAreaのID"),
extent: z.literal("parent").optional().default("parent").describe("親の範囲内に配置されることを示す"),
data: z.object({
name: z.string().trim().min(1).describe("セクションの名称"),
}),
})
.describe("業務フローのセクションを表すノード"),
z
.object({
...baseNodeSchema.shape,
type: z
.literal(BUSINESS_FLOW_NODE_TYPE.SECTION_AREA)
.describe("セクションが配置されるエリアを表すノードタイプ"),
data: z.object({}),
})
.describe("業務フローのセクションが配置されるエリアを表すノード"),
z
.object({
...baseNodeSchema.shape,
type: z.literal(BUSINESS_FLOW_NODE_TYPE.SUB_SECTION).describe("アクターに紐づく作業の塊を示すノードタイプ"),
parentId: z.string().trim().min(1).describe("subSectionAreaのID"),
extent: z.literal("parent").optional().default("parent").describe("親の範囲内に配置されることを示す"),
data: z.object({
name: z.string().trim().min(1).describe("サブセクションの名称"),
actorId: z.string().trim().min(1).describe("紐づくアクターのID"),
sectionId: z.string().trim().min(1).nullable().describe("紐づくセクションのID"),
}),
})
.describe("業務フローのサブセクションを表すノード"),
z
.object({
...baseNodeSchema.shape,
type: z
.literal(BUSINESS_FLOW_NODE_TYPE.SUB_SECTION_AREA)
.describe("サブセクションが配置されるエリアを表すノードタイプ"),
parentId: z.string().trim().min(1).describe("actorのID"),
data: z.object({}),
})
.describe("業務フローのサブセクションが配置されるエリアを表すノード"),
z
.object({
...baseNodeSchema.shape,
type: z.literal(BUSINESS_FLOW_NODE_TYPE.ACTION).describe("作業、業務内容を表すノードタイプ"),
data: z.object({
content: z.string().trim().describe("作業、業務内容"),
operationMode: z.enum(["manual", "automatic"]).nullable().describe("作業、業務内容の実施方法"),
duration: z.number().nullable().describe("1回あたりの作業時間を示す"),
frequency: z.number().nullable().describe("週に何回実施するかの頻度"),
actorId: z
.string()
.trim()
.min(1)
.nullable()
.describe("作業を実施するステークホルダー(NodesのType:actorのIDを示す)"),
sectionId: z
.string()
.trim()
.min(1)
.nullable()
.describe("紐づくセクションのID(NodesのType:sectionのIDを示す)"),
subSectionId: z
.string()
.trim()
.min(1)
.nullable()
.describe("紐づくサブセクションのID(NodesのType:subSectionのIDを示す)"),
isChecked: z.boolean().describe("レビュー完了(true)、レビュー未完了(false)"),
inputs: z
.array(
z.object({
id: z.string().trim().min(1).describe("一意の識別子"),
artifactId: z.string().trim().min(1).describe("紐づく成果物のID(artifactsのIDを示す)"),
})
)
.describe("この業務を遂行するために必要なインプット"),
outputs: z
.array(
z.object({
id: z.string().trim().min(1).describe("一意の識別子"),
artifactId: z.string().trim().min(1).describe("紐づく成果物のID(artifactsのIDを示す)"),
})
)
.describe("この業務内容における成果物"),
businessPatternIds: z
.array(z.string().trim().min(1).describe("紐づく業務パターンのID(businessPatternsのIDを示す)"))
.describe("この業務を実行する業務パターン"),
}),
})
.describe("業務フローの作業、業務内容を表すノード"),
z
.object({
...baseNodeSchema.shape,
type: z
.literal(BUSINESS_FLOW_NODE_TYPE.CONDITION)
.describe("作業、業務内容のうち、分岐が発生する場合に活用するノードタイプ"),
data: z.object({
content: z.string().trim().describe("分岐の内容"),
conditionOptions: z
.array(
z.object({
id: z.string().trim().min(1).describe("一意の識別子"),
content: z.string().trim().describe("分岐名"),
percentage: z.number().describe("分岐の割合"),
})
)
.describe("条件分岐"),
operationMode: z.enum(["manual", "automatic"]).nullable().describe("作業、業務内容の実施方法"),
duration: z.number().nullable().describe("1回あたりの作業時間を示す"),
frequency: z.number().nullable().describe("週に何回実施するかの頻度"),
judgementCriteria: z.enum(["human", "ruleBase", "ruleWithException"]).nullable().describe("判断の軸"),
actorId: z
.string()
.trim()
.min(1)
.nullable()
.describe("作業を実施するステークホルダー(NodesのType:actorのIDを示す)"),
sectionId: z
.string()
.trim()
.min(1)
.nullable()
.describe("紐づくセクションのID(NodesのType:sectionのIDを示す)"),
subSectionId: z
.string()
.trim()
.min(1)
.nullable()
.describe("紐づくサブセクションのID(NodesのType:subSectionのIDを示す)"),
isChecked: z.boolean().describe("レビュー完了(true)、レビュー未完了(false)"),
businessPatternIds: z
.array(z.string().trim().min(1).describe("紐づく業務パターンのID(businessPatternsのIDを示す)"))
.describe("この業務を実行する業務パターン"),
}),
})
.describe("業務フローの作業、業務内容の分岐を表すノード"),
z
.object({
...baseNodeSchema.shape,
type: z.literal(BUSINESS_FLOW_NODE_TYPE.MEMO).describe("メモを表すノードタイプ"),
data: z.object({
content: z.string().trim().describe("メモの内容"),
url: z.string().trim().url().or(z.literal("")).describe("メモのURL"),
/** 画像はすべてないものとして扱う */
image: z.preprocess(() => null, z.null()).describe("メモの画像"),
actorId: z
.string()
.trim()
.min(1)
.nullable()
.describe("メモを作成したステークホルダー(NodesのType:actorのIDを示す)"),
sectionId: z
.string()
.trim()
.min(1)
.nullable()
.describe("紐づくセクションのID(NodesのType:sectionのIDを示す)"),
subSectionId: z
.string()
.trim()
.min(1)
.nullable()
.describe("紐づくサブセクションのID(NodesのType:subSectionのIDを示す)"),
isChecked: z.boolean().describe("レビュー完了(true)、レビュー未完了(false)"),
createdBy: z.string().trim().min(1).describe("メモを作成した人"),
}),
})
.describe("業務フローのメモを表すノード"),
z
.object({
...baseNodeSchema.shape,
type: z.literal(BUSINESS_FLOW_NODE_TYPE.ISSUE).describe("Issueを表すノードタイプ"),
data: z.object({
content: z.string().trim().describe("Issueの内容"),
url: z.string().trim().url().or(z.literal("")).describe("IssueのURL"),
actorId: z
.string()
.trim()
.min(1)
.nullable()
.describe("Issueを作成したステークホルダー(NodesのType:actorのIDを示す)"),
sectionId: z
.string()
.trim()
.min(1)
.nullable()
.describe("紐づくセクションのID(NodesのType:sectionのIDを示す)"),
subSectionId: z
.string()
.trim()
.min(1)
.nullable()
.describe("紐づくサブセクションのID(NodesのType:subSectionのIDを示す)"),
isChecked: z.boolean().describe("レビュー完了(true)、レビュー未完了(false)"),
createdBy: z.string().trim().min(1).describe("Issueを作成した人"),
}),
})
.describe("業務フローのIssueを表すノード"),
])
);
export const businessFlowStorageSchema = schemaForType<Omit<BusinessFlowStorage, "type">>()(
z
.object({
nodes: z.array(businessFlowNodeSchema).describe("業務フローのノード"),
edges: z.array(businessFlowEdgeSchema).describe("業務フローのエッジ"),
artifacts: z.array(artifactSchema).describe("業務フロー中で作られる成果物"),
businessPatterns: z.array(businessPatternSchema).describe("業務フローを分類する業務パターン"),
})
.describe("業務フローのデータ構造")
.brand("BusinessFlowStorage")
);