インターンシップ 2025:AIを用いた自動手順書作成ツールの開発

はじめに 

 はじめまして。2025年の11月から三か月間株式会社モルフォでインターンをしておりました、東京大学精密工学科三年の高木悠貴哉と申します。 今回は「AIを用いた自動手順書作成ツールの開発」というテーマのもと、近年話題となっているLLMを用いて作業記録から手順書を作成するアプリ開発に取り組みました。 この記事ではインターンシップを通して私が作成した成果物を紹介していきたいと思います

背景

モルフォには、社員が自身の「やりたい(Will)」を起点として自律的に研究開発や業務改善に取り組むことを後押しする、「Will型開発」という独自の仕組みがあります。その一環として行われた「Will型アイデアハッカソン」にて、「画面録画による作業ログ探索」というテーマで試作された「Morpho Work Logger」というデモツールがあり、本テーマはそこから着想を得ました。

「Will型アイデアハッカソン」の開催レポートはこちら

techblog.morphoinc.com

Morpho Work Logger
このアプリは、作業を記録したスクリーンショット群にOCRをかけることで、画像データを圧縮しつつ過去の作業ログを検索できるようにするというものでした。このアプリの課題としては、OCRの精度やVLMを用いた意味的検索が挙げられており、今回のインターンの成果物もこの課題に対するアプローチの一つとなっております。画像にOCRをかけるのではなく、画像をLLMに読み込ませて説明させればより良い結果が得られるのではというモチベーションのもと、操作説明という部分に焦点を当て、LLMを用いた画面ログからのマニュアル作成を開発の目標に据えました。

ローカルLLMを用いた自動マニュアル作成アプリ

今回私が実装したのは、作業を記録した映像、画像をもとに、ローカルLLMが作業についてのマニュアルを自動で作成するアプリです。ローカルLLMを用いた理由としては、セキュリティ面、コンパクトさ、そして外部APIに依存しない堅牢さなどが挙げられます。

実装内容の大まかな流れ
図は、実装した機能の概要をわかりやすく表したものです。動画ファイルからキーフレームを抽出し、抽出した画像群とプロンプトをローカルLLMにわたすことで、元の画像とLLMの出力が記載されたWordファイルが作られるという流れになっています。 ローカルLLMとしては、Googleが開発したオープンLLMであるGemma 3 4Bを用い、それをローカルで運用するために Ollamaを使用しました。その他諸々の実装はPythonを用いて行いました。

具体的な実装内容

以下、実装した機能を説明してます。

  • 動画からキーフレームを抽出

一秒ごとにフレームを取得し、前後のフレームの差分を比較し、一定以上の変化を検知したものをキーフレームとして保存する仕様にしました。判定方法については、画面を16分割し、いずれかの領域内の平均差分が閾値(経験則的に決定)をこえていればキーフレームとみなすことにしました。また、処理の最後に必要のないキーフレームを削除する機能を追加しました。

必要のないキーフレームを削除するUI

  • Ollamaに渡す画像の処理

画面を16分割し、その領域内の変化が一定以下ならそこを透明化して画像を渡す仕様にしました。 この処理により変化が強調され、よりLLMが変化部分に着目して文書を説明する効果が期待されます。

変化のない領域の切り抜き

  • Ollamaによる手順書作成、評価

Ollamaに一連の画像と画像間の作業を説明する文書を渡し、出力をWordに保存する仕様にしました。文書は専用UIで記入できるようになっています。加えて、画像からカーソル位置を検出して作業説明に組み込む機能、Wordファイルの品質チェック機能を導入しました。スコアによる自動判定を行い、品質が不十分な場合には具体的なフィードバックを反映した上で、再生成までを一貫して行います。

作業の説明を入力するUI

"""
Ollamaに渡すプロンプトの詳細
"""
prompt = f"これらはすべて「{instruction}」についての画像です。全画像を確認し、作業の手順をまとめて日本語で説明してください。"
prompt += "\n以下に各画像間の操作内容と各画像が撮影された際のマウスの相対位置を示します。適切に補足、説明をくわえてください。"
#正規表現でマウス位置を取得
#coord_pattern = re.compile(r'x(\d+)_y(\d+)')

for j, entry in enumerate(explain_entries):
    explain_text = entry.get()
    if explain_text.strip():
        prompt += f"\n・{j+1}枚目と{j+2}枚目の間の操作: {explain_text}"

#マウスの位置
cursor_info_list = []
for image_name in images:
    pos = cursor_cache.get(image_name) # キャッシュから取得
    if pos:
        cursor_info_list.append(f"相対位置(x:{pos[0]}, y:{pos[1]})")
    else:
        cursor_info_list.append("座標情報なし")
prompt += "\n・各画像撮影時のマウスの相対位置:\n" + "\n".join(cursor_info_list)
"""
評価用のプロンプト詳細
"""
#評価関数を定義
def evaluate_report(instruction, generated_text):
    #evaluation promptの作成
    system_instruction = f"""
    あなたは専門知識を持つ客観的な採点者です。
    以下の指示内容に基づいて、生成されたレポートが適切かどうかを評価してください。
    なお、評価は・情報の正確さ・簡潔さ・読みやすさ・再現性の観点から行います。

    指示内容: {instruction}

    必ず以下のJSON形式でのみ出力してください:
    {{"score":数値(1.0~5.0), "feedback":"修正すべき点(日本語)"}}
    """

結果

実際に出力したレポートがこちらです。

Ollamaの出力結果

出力結果より、作成されたマニュアルが画像の順番通りの作業を流れに沿って説明できていることが分かります。しかし、いろんな作業について手順書を生成していくと、細かい指示やコマンドに誤りが生じたり、指示が曖昧になったりすることがあったりしました。 この出力結果を評価するために社内でアンケートを実施しました。以下が詳細な実施内容です。

アンケート内容の詳細
各アンケート結果は以下のとおりです。
アンケート結果

上のアンケート結果と寄せられた感想、改善点より、LLMを活用したマニュアル作成の利点と課題が明らかになりました。 評価された点としては以下が挙げられます。

  • LLMの補足説明でその手順を行う目的や前提条件まで説明されていた点

  • 指示が直感的で操作しやすいと答えた人が多かった点

一方、問題点としては以下が挙げられます。

  • 操作が難解になるとマニュアルの精度が落ちる点

  • 手順書内で画像が操作の説明のすぐ後に来ていないのが読みにくさにつながっている点

  • 画像の解像度が低いので詰まったときに画像を参照して軌道修正できない点

これらの結果は、LLMによって作られたマニュアルの質を保証するものではありませんが、既存の機能を改善する際、方向性を決めるのに役立ちます。

まとめ

今回のインターンでは、ローカルLLMを用いた自動マニュアル作成アプリを作成し、その機能を作成されたマニュアルから評価しました。 今後の課題としては

  • LLMのファインチューニング(内容の精度向上、構成の最適化)

  • より定量的な評価基準の選定(評価項目の細分化、ほかのLLMを用いるアプローチ)

  • 動画内容の言語化(画像間の説明入力の省略、キーフレーム取得方法の改善)

  • GIFなどを用いた動画to動画の手順書作成(より分かりやすいマニュアル形態)

  • 自動手順書作成の現実世界への拡張(実際の動作を映した動画からの手順書作成)

などが挙げられます。

今回のインターンを通して、エンジニアの成果やプロセスを間近で拝見し、仕事を体験する中で、大まかなフローや空気感、必要な技能や知識を身をもって知ることができました。サポートしてくださったメンターの皆様をはじめとして、技術的にアドバイスをくださった方々、アンケートに協力してくださった方々等、モルフォ社員の方々にこの場を借りてお礼申し上げます。ありがとうございました。