1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

軽いのに頼れる相棒!LFM2-1.2Bで体験する要約&言い換えAI

Last updated at Posted at 2025-08-19

概要

Liquid AI が公開している LFM2-1.2B は、端末やColab上でも軽快に動かせる小型言語モデルです。日本語にも対応しており、要約・言い換えといったタスクにぴったり。この記事では、実際に Colabで要約・言い換えボットを動かした手順 と、試したサンプル文章をまとめます。


【LFM2-1.2Bとは何か?】

LFM2-1.2B は、Liquid AI が公開した「Liquid Foundation Models」シリーズの軽量言語モデルです。
・パラメータ数は約12億とコンパクトながら、多言語(日本語含む)での理解・生成に対応しています。
・エッジ端末やColab環境でも動かしやすいよう最適化されており、推論速度が速いのが特徴です。
・32kトークンまで扱える長文コンテキストにも対応しているため、議事録やレポートの要約などにも使えます。

つまり「大規模モデルほどの重さは不要。でも日本語で実用的に要約や言い換えをしたい」というニーズにぴったりのLLMです。

【おすすめの用途】

LFM2-1.2B は以下のような場面で特に便利です。
・社内資料や議事録の要約
 → 長い会議メモや報告書を、3〜5点の箇条書きに整理。決定事項や次のアクションを抜き出すのに最適。
・文章の言い換え・整形
 → 砕けたチャット文をビジネスメール調に変換、逆にかたい文章をフランクに直すなど、トーン変換に強み。
・多言語短文の処理
 → 英語・中国語・韓国語などを含むテキストを、日本語に要約・言い換えできる。海外とのやりとりにも活用可能。
・オンデバイスでの利用
 → ColabやローカルPCでも動く軽さなので、外部に出せない文章を安全に処理できる。


実際にcolabで動かしてみました。

要約

【元の文章】(ニュース記事風)
世界的な気候変動の影響は、ここ数十年で加速しています。日本でも、夏の平均気温は年々上昇し、真夏日や猛暑日の回数が増加しています。環境省の報告によれば、東京の平均気温は100年前と比べて約3度上昇しており、これは都市化の影響も含まれるものの、地球温暖化の大きな要因となっています。
一方で、豪雨や台風による災害も深刻さを増しています。特に西日本や九州地方では、短時間で非常に強い雨が降る「線状降水帯」による洪水や土砂災害が頻発しています。これにより、住宅やインフラに甚大な被害が出ており、自治体の防災計画の見直しが急務となっています。
経済への影響も無視できません。農業では高温や水不足により作物の収穫量が減少し、価格の高騰を招いています。観光業においても、酷暑や自然災害のリスクが来訪者の減少につながる懸念が出ています。また、冷房需要の増加による電力消費の拡大は、エネルギー政策の課題にも直結しています。
こうした中、国や地方自治体は、再生可能エネルギーの導入促進や災害に強いインフラ整備、地域ごとの適応策を進めています。さらに、市民レベルでも節電や公共交通の利用、災害への備えなど、小さな取り組みの積み重ねが重要視されています。

【要約後】

  1. 気候変動の影響 - 日本では気温上昇と異常気象が増加し、自然災害のリスクが高まっています。
  2. 地域別影響 - 特に都市部と沿岸部で被害が顕著で、経済的・社会的課題が複雑化しています。
  3. 産業への影響 - 農業や観光業など多くの産業に悪影響を与え、経済的損失が懸念されています。
  4. 対策の必要性 - 再生可能エネルギーの導入や防災インフラの強化など、持続可能な社会への転換が急務です。

言い換えボット

【元の文章(カジュアル → ビジネス)】
山田さん

この前の打ち合わせありがとう!
新サービスの件、うちでもだいぶ前向きに検討してるよ。
ただ、導入事例とかコスト感がまだはっきり分からなくて、
そのへんの情報もらえると助かります。

来週社内会議あるから、できれば今週の金曜くらいまでに
資料送ってもらえるとめっちゃ助かります!

よろしくー
鈴木

【変換後】
田中さん

ご連絡ありがとうございます。

新しいサービスについて前向きに検討しているとのことですが、
まだ導入事例やコストに関する詳細が不明な点があります。
それを把握するために、今週金曜日までに資料をお送りいただけると助かります。

よろしくお願いいたします。
鈴木


【レビュー・感想】

実際に Colab で LFM2-1.2B を動かしてみて感じたのは、まず 軽さと速さ です。推論は驚くほどスムーズで、GPU環境ではレスポンスが一瞬で返ってきました。大規模モデルと比べると表現の幅はやや控えめですが、要約や言い換えといった実務タスクにおいては十分に実用的です。
特に良かった点は以下です。

・日本語要約の安定性:箇条書き指定や「ですます」指定がしっかり効くため、会議メモやレポート整理にそのまま使えます。

・言い換えの柔軟さ:カジュアル文→ビジネス文への変換が自然で、メール文の下書き補助として実用的に感じました。

・軽快な動作:Colabの無料GPUでもストレスなく利用でき、ローカル用途にも現実的です。

一方で気になった点としては、高度な推論や創造的な生成はやや弱めで、大規模モデルのように複雑なタスクを丸ごと任せるのは難しい場面もありました。しかし「要点整理」「文体変換」といった明確な用途に絞ると、むしろ軽量で取り回しやすい利点が際立ちます。


【手順】

1 依存関係のインストール

!pip -q install "transformers>=4.41.0" accelerate sentencepiece gradio>=4.31

2 モデルの読み込み

from transformers import AutoTokenizer, AutoModelForCausalLM
import torch, os

MODEL_ID = "LiquidAI/LFM2-1.2B"

device = "cuda" if torch.cuda.is_available() else "cpu"
dtype  = torch.float16 if device == "cuda" else torch.float32

tok = AutoTokenizer.from_pretrained(MODEL_ID, use_fast=True)
model = AutoModelForCausalLM.from_pretrained(
    MODEL_ID,
    torch_dtype=dtype,
    device_map="auto" if device=="cuda" else None
).to(device)

# 安定動作用の設定
if tok.pad_token_id is None:
    tok.pad_token = tok.eos_token
model.config.pad_token_id = tok.pad_token_id
torch.backends.cuda.matmul.allow_tf32 = True

def chat_generate(prompt:str, max_new_tokens=512, temperature=0.5, top_p=0.9, repetition_penalty=1.05):
    sys = "あなたは丁寧で簡潔に答える日本語アシスタントです。事実の捏造を避け、指示に厳密に従います。"
    tmpl = f"<|system|>\n{sys}\n<|user|>\n{prompt}\n<|assistant|>\n"
    inputs = tok(tmpl, return_tensors="pt").to(model.device)
    with torch.no_grad():
        out = model.generate(
            **inputs,
            max_new_tokens=max_new_tokens,
            do_sample=True,
            temperature=float(temperature),
            top_p=float(top_p),
            repetition_penalty=float(repetition_penalty),
            pad_token_id=tok.pad_token_id,
            eos_token_id=tok.eos_token_id
        )
    text = tok.decode(out[0], skip_special_tokens=True)
    return text.split("<|assistant|>")[-1].strip()

3 ユーティリティ(長文チャンク要約+最終要約、言い換え)

import re, math, textwrap

def chunk_text(text, chunk_chars=1800):
    # 段落ごとに緩く分割し、所定文字数で束ねる(トークン化しない軽量方式)
    paras = [p.strip() for p in re.split(r"\n\s*\n", text) if p.strip()]
    chunks, buf = [], ""
    for p in paras:
        if len(buf) + len(p) + 2 <= chunk_chars:
            buf = f"{buf}\n\n{p}".strip()
        else:
            if buf: chunks.append(buf)
            # pが極端に長い場合は強制折り
            if len(p) > chunk_chars:
                for i in range(0, len(p), chunk_chars):
                    chunks.append(p[i:i+chunk_chars])
                buf = ""
            else:
                buf = p
    if buf: chunks.append(buf)
    return chunks

def summarize_long(text, bullets=3, style="ですます", temperature=0.2):
    text = text.strip()
    if not text:
        return "(入力が空です)"
    chunks = chunk_text(text, 1800)
    partial_summaries = []
    for i, ch in enumerate(chunks, 1):
        prompt = (
            f"次の文章を**{bullets}点の箇条書き**で要約し、語尾は「{style}」で統一してください。\n"
            f"冗長な表現は避け、固有名詞と数値は保持します。\n\n"
            f"[対象テキスト({i}/{len(chunks)})]\n{ch}"
        )
        s = chat_generate(prompt, max_new_tokens=350, temperature=temperature, top_p=0.9)
        partial_summaries.append(s)

    # 部分要約を統合して最終要約
    joined = "\n".join(partial_summaries)
    final_prompt = (
        f"以下は複数の部分要約です。重複を統合し、**全体の要約を{bullets}〜{bullets+1}点**で出力してください。"
        f"最後に**15字以内の見出し**を1行で付けてください。語尾は「{style}」。\n\n{joined}"
    )
    final = chat_generate(final_prompt, max_new_tokens=400, temperature=0.2, top_p=0.9)
    return final

def paraphrase(text, tone="ですます", constraints="冗長表現を削る。情報は削らない。"):
    text = text.strip()
    if not text:
        return "(入力が空です)"
    prompt = (
        f"次の文章を日本語で言い換えてください。語尾は「{tone}」に統一し、{constraints}\n"
        f"表記ゆれを整え、箇条書きは維持してください。\n\n[入力]\n{text}"
    )
    return chat_generate(prompt, max_new_tokens=600, temperature=0.5, top_p=0.9)

4 Gradio UI(要約タブ/言い換えタブ)

import gradio as gr

def ui_summarize(text, bullets, style, temperature):
    return summarize_long(text, bullets=int(bullets), style=style, temperature=float(temperature))

def ui_paraphrase(text, tone, constraints):
    return paraphrase(text, tone=tone, constraints=constraints)

with gr.Blocks(title="LFM2 ローカル要約・言い換えボット") as demo:
    gr.Markdown("## 🧠 LFM2-1.2B ローカル要約・言い換えボット(端末内で完結)")

    with gr.Tab("要約 / Summarize"):
        inp_sum = gr.Textbox(label="テキストを貼り付け", lines=12, placeholder="ここに長文を貼り付けてください")
        with gr.Row():
            bullets = gr.Slider(2, 6, value=3, step=1, label="要約の箇条書き数")
            style = gr.Radio(choices=["ですます","常体"], value="ですます", label="文体")
            temp  = gr.Slider(0.1, 0.9, value=0.2, step=0.05, label="温度(低いほど堅実)")
        out_sum = gr.Textbox(label="要約結果", lines=12)
        gr.Button("要約する").click(ui_summarize, [inp_sum, bullets, style, temp], [out_sum])

    with gr.Tab("言い換え / Paraphrase"):
        inp_para = gr.Textbox(label="テキストを貼り付け", lines=12, placeholder="ここに文章を貼り付けてください")
        with gr.Row():
            tone = gr.Dropdown(choices=["ですます","常体","ビジネス","砕けた"], value="ですます", label="トーン")
            constraints = gr.Textbox(label="制約(任意)", value="冗長表現を削る。事実関係は保持。敬語を整える。")
        out_para = gr.Textbox(label="言い換え結果", lines=12)
        gr.Button("言い換える").click(ui_paraphrase, [inp_para, tone, constraints], [out_para])

    gr.Markdown(
        "### コツ\n"
        "- 長文は自動で分割→部分要約→統合します。\n"
        "- 要約は温度を低め(0.2〜0.4)に、言い換えは0.5前後が無難です。\n"
        "- 重要語(固有名詞・数値)は保持するようにプロンプトで明示しています。"
    )

demo.launch()

【まとめ】

LFM2-1.2Bは「軽量・高速・多言語対応」を武器にした実用モデルです。
・社内文書の要約
・議事録のアクション項目抽出
・チャット文のビジネスメール化
といった日常業務に直結するタスクに強く、“ちょうどいいサイズの日本語LLM” という印象を持ちました。


フリーランスエンジニアです。
お仕事のご相談こちらまで
rockyshikoku@gmail.com

Core MLを使ったアプリを作っています。
機械学習関連の情報を発信しています。

Twitter
Medium

1
0
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
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?