0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

AIに段取り丸投げ!LFM2-1.2Bで自動WBS生成

Last updated at Posted at 2025-08-20

【はじめに】

プロジェクトの計画(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を使ったアプリを作っています。
機械学習関連の情報を発信しています。

Twitter
Medium

0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?