【はじめに】
プロジェクトの計画(WBS作成)は時間がかかる作業です。
そこで今回は、LiquidAIが公開している小型高速モデル LFM2-1.2Bを使って、Google Colab上で 自動的にタスク分解を生成する実験 を行いました。
【LFM2-1.2Bとは?】
LFM2-1.2B は LiquidAI が開発した Liquid Foundation Models v2 (LFM2) シリーズのひとつで、
1.2Bパラメータ規模の軽量言語モデルです。
特徴は次の通り:
・小型でも高性能:同規模のQwenやLlama系モデルと同等以上の精度
・高速動作:CPU推論でも軽快に動作し、スマホやエッジ端末にも展開可能
・多用途に対応:知識・数学・指示理解・多言語など幅広いタスクで安定
特に 「省メモリで高速に使いたい」 ニーズに合うモデルで、大規模GPUがなくても実用的な処理をこなせます。
【おすすめの用途】
LFM2-1.2Bは「軽量・速い」を活かした使い道がぴったりです。
✅ 文章要約・言い換え
ニュース・議事録を短くまとめたり、文体を丁寧語に変換するタスク
✅ タスク分解・計画作成
目標を与えると、実行可能な作業に分解してくれる(今回の実験内容)
✅ 小規模RAG(FAQ応答)
数十件〜百件規模のFAQを読み込ませ、引用元付きの回答を生成
✅ 会話アシスタント
ChatML形式のテンプレに対応しているので、シンプルなチャットボットに向いている
逆に、大規模な知識ベースや高度なコード推論には不向きで、***軽量かつ用途特化で使うのがおすすめです。
【出力結果】
指示↓
goal = "LFM2-1.2Bの紹介記事を作成して公開する(要約デモとタスク分解の実例を含む)
WBS項目 | タスク名 | 所要時間 (HH:MM) | 依存関係 | 成果物 | 担当 (仮) | リスク/注意 |
---|---|---|---|---|---|---|
1. 要件定義 | マークダウン表作成 | 2:30 | - | マークダウン表 | A | 要件の不完全な定義リスク |
2. 要約デモ | 要約デモ準備 | 4:00 | - | 要約デモ資料 | B | デモ資料作成の遅延リスク |
3. 記事執筆 | 記事本文作成 | 8:00 | 1.1 | 記事本文 | C | 著作権問題の可能性 |
4. 画像作成 | 関連画像の収集 | 3:00 | - | 画像資料 | D | 画像の著作権問題 |
5. 記事編集 | 記事の校正と編集 | 6:00 | 4.0 | 最終版記事 | C | 編集ミスのリスク |
6. 公開準備 | 公開プラットフォームへのアップロード | 5:00 | 5.0 | 公開準備完了 | A, B, D, C | 公開時の技術的な問題 |
7. 広報活動 | SNSでの告知 | 7:00 | 6.0 | 記事の閲覧数予測 | B, C | 広報活動の効果測定の難しさ ######合計所要時間: 38:00 |
もう一つ生成してみました。
指示↓
"小規模イベント(40名)の企画・告知・当日運営・レポート公開までを実施する"
WBS項目 | タスク名 | 所要時間 (HH:MM) | 依存関係 | 成果物 | 担当 (仮) | リスク/注意 |
---|---|---|---|---|---|---|
計画 | イベントコンセプト作成 | 8時間 | - | イベントコンセプト資料 | A | ターゲット参加者数不足のリスク |
予算策定 | 6時間 | - | 予算案 | B | 予算超過の可能性 | |
広報戦略立案 | 5時間 | A | 広報計画書 | C | 効果的な広報手段の不足 | |
会場選定 | 4時間 | A | 会場候補リスト | D | 会場のキャンセル |
タスク名・所要時間・依存関係・成果物・担当(仮)・リスク/注意 が一括出力されました。
【気づきと課題】
・分解は十分実用レベル:短時間でタスク構造が見えるのは便利。
・JSON抽出は未完成:今回の出力はMarkdown表止まり。自動処理に使うには、JSON強制プロンプトを追加する必要があります。
・プロンプト次第で精度が変動:件数や粒度の指定があると安定。
【手順】
1. セットアップ
!pip -q install --upgrade transformers accelerate sentencepiece
import torch
from transformers import AutoTokenizer, AutoModelForCausalLM
MODEL_ID = "LiquidAI/LFM2-1.2B"
DTYPE = torch.bfloat16 if torch.cuda.is_available() else torch.float32
tok = AutoTokenizer.from_pretrained(MODEL_ID, use_fast=True)
model = AutoModelForCausalLM.from_pretrained(
MODEL_ID,
torch_dtype=DTYPE,
device_map="auto",
low_cpu_mem_usage=True
)
def chat(messages, max_new_tokens=512, temperature=0.2, top_p=0.9):
# Chatテンプレート(モデルカードに準拠)
prompt = tok.apply_chat_template(messages, tokenize=False, add_generation_prompt=True)
inputs = tok(prompt, return_tensors="pt").to(model.device)
with torch.no_grad():
out = model.generate(
**inputs,
max_new_tokens=max_new_tokens,
temperature=temperature,
top_p=top_p,
do_sample=temperature > 0,
pad_token_id=tok.eos_token_id
)
text = tok.decode(out[0], skip_special_tokens=True)
# 生成文末の余計な前置きを軽く除去
return text.split("assistant")[-1].strip()
2. タスク分解プロンプト
TASK_PROMPT = """以下のゴールを、実行しやすいWBSに分解してください。
# 出力仕様
- マークダウンの表と、その下に同内容のJSONを返す
- 表の列: WBS, タスク名, 所要時間(見積/HH:MM), 依存関係(親WBS), 成果物, 担当(仮), リスク/注意
- 粒度: 5〜9タスク(必要ならサブタスクを 1.1, 1.2 のように付番)
- 合計所要時間も最後に記載
- 実行順序が分かるよう依存関係を明示
# 追加条件
{extra}
# ゴール
{goal}
"""
def decompose(goal, extra="現実的な順序・短サイクルで検証可能な計画にする。"):
messages = [
{"role":"system","content":"あなたは段取り設計に長けたプロジェクトプランナーです。日本語で簡潔・具体的に出力します。"},
{"role":"user","content":TASK_PROMPT.format(goal=goal, extra=extra)}
]
return chat(messages)
# サンプル(そのまま実行OK)
goal = "LFM2-1.2Bの紹介記事を作成して公開する(要約デモとタスク分解の実例を含む)"
print(decompose(goal))
3.バリエーション用プロンプト
def decompose_with_raci(goal):
prm = """以下のゴールをタスク分解し、RACIを付けてください。
- マークダウン表: WBS, タスク名, 所要時間, 依存関係, 成果物, R(実行), A(最終責任), C(相談), I(共有)
- JSONも併記
- 合理的な仮担当を設定
ゴール: {goal}
"""
return chat([
{"role":"system","content":"あなたはプロジェクトを素早く立ち上げるPMです。"},
{"role":"user","content":prm.format(goal=goal)}
])
def decompose_with_risks(goal):
prm = """以下のゴールについて、(1)WBS表、(2)主要リスクTop5(確率×影響/緩和策)、(3)1週間スプリント計画 を返す。
ゴール: {goal}"""
return chat([
{"role":"system","content":"あなたはリスク管理が得意なPMです。日本語で具体的に出力します。"},
{"role":"user","content":prm.format(goal=goal)}
])
# 例
print(decompose_with_raci("社内FAQ 30件を使った軽量RAGを構築して試験運用する"))
4.JSON抽出用の小さなヘルパー関数
import re, json
def extract_json(text):
# ```json ... ``` または { で始まるブロックを抽出
m = re.search(r"```json\s*(\{.*\})\s*```", text, flags=re.S)
if not m:
m = re.search(r"(\{(?:.|\n)*\})", text)
if not m:
return None, text
try:
return json.loads(m.group(1)), None
except Exception:
return None, text
result = decompose("小規模イベント(40名)の企画・告知・当日運営・レポート公開までを実施する")
parsed, raw = extract_json(result)
print(parsed if parsed else raw[:800])
まとめ
・LFM2-1.2Bは 軽量で高速、かつタスク分解や要約に強い
・Colab上で簡単に試せるので、WBS作成や議事録整理など業務効率化に活用できる
・今後は JSON化 → CSV/カレンダー連携 に発展させれば、実務ツールとしてさらに便利になる
こんにちは、だいすけです。
ぼくはフリーランス・エンジニアで、 AR や 機械学習のアプリの実装をしています。
お仕事のご相談こちらまで。
rockyshikoku@gmail.com
Core MLを使ったアプリを作っています。
機械学習関連の情報を発信しています。