学内の研究者の方向けに作りました。
完全ローカルAI環境で、自分の原稿PDFをアップロードすると、その内容を読み取って、学術講演用にシナリオを生成(JSON)し、それをもとに、PPTXファイルを構成、ダウンロードリンクを返すという、まあ、クラウドAIが普通にやっていることを。ただ、クラウドAIにペーパーをアップロードすることに抵抗がある、約款や設定等で不安がある、などの事情で需要はあるかなと思い、統合認証環境でローカルAIでのバイブコーディング状態で試作しました。この一部は、今年のAXIESでお話させていただこうと思っています。また、このツールを使って、JSiSEの研究会でのプレゼンファイルは基本的に編集しようと思います(というか、試作段階でテストはそれでやってたので、ベースのスライドは出来てます)。
ver.1)シンプルな文字のみの白黒PPTX
これは、本質は、PDFを読み取るライブラリを突っ込んで読み取り、それをLLMでJSON作れば本質的にはほぼ完成なので、あとはそれをPPTXに一枚1テキストオブジェクトではりつけていく処理を足せば完了。白地に黒字のPPTX。概ね300行程度。
ver.2)デザインつけたPPTX
これは、ver.1をもとに、カラフルなデザインでのPPTXを構成するバージョンです。デフォルトのレイアウトやデザインをコード内でハードコーディングしています。ローカルAI実装しているモデルの特性を試行錯誤で検証しながら、Exception処理とLoggerをコード内で随所に織り交ぜながら調査して作っていった結果、3000行程度になりました。ver.1と違い、結構苦労してて、1.5日くらいかかりました。gemma4:26bで作り始めてたのですが、この挙動にかなり悩まされました。num_ctxの設定や出力字数の調整、何故かバックエンドのollamaからのJSON破損、あるいはテキスト部分の繰り返し状態など、多数のエラー処理が必要で、このモデルの挙動とハード的な制約を加味した結果、gpt-oss:20bとqwen3.6:35bに対象を変更することにして、再度調整しました。結果、gpt-oss:20bでうまく動くようになりました。当初は、PDFからの読み取ったテキストを全部食わせて、ver.1のようにシナリオを作らせて、ということをやってたのですが、メモリが開放しきられてないうちに度々LLMを呼ぶことになって、その処理サイズを最適化するのに計算で求まるようなものでもなくて、ログをリアルタイムトレースしながらようやく。。。とにかく、まあまあ見た目も整って、単なるテキストのプレースホルダをばらまいてたver.1よりも、bulletのレイアウト中心で、カラフルなスライド構成ができました。
ver.3)OCR+レイアウトバリエーション付PPTX
これは、あまりver.2と行数的には変わらないです。もともとOCRのライブラリは環境に組み込んでたので、コードの中で、それを呼び出す関数を定義しました。で、ver.2のコード内で、PDFの内容を読み込む際に、ページ単位での読み込み字数が極めて小さいものは、そのページは画像とみなして、OCRにかけるという処理です。読み込んだ文字は、他の頁で読み込んだ文字のセットに統合してLLMを呼び出します。これで、Figureの読み飛ばし状態であったver.2からも少し進展しました。で、順序関係や比較対象などをLLMで意味的にその関係性を推論できれば、それに応じたlayoutを選択できるようにしました。プロンプトレベルでの追加処理と、コード側での処理上の修正を若干行った程度ですが、ver.2はbullet一辺倒であったものが、フローや比較を意図した構成になるようにできました。ver.3はqwen3.6:35bにbindしました。なので、gpt-oss:20b用のver.2とqwen3.6:35b用のver.3ってところから選択していただくようになります。
ver.4)まだ作ってません
画像生成環境を同じバックエンドホストで作ろうと思います。で、ページの内容に応じたイメージ画像を出力させて、それをPPTXに張り付ける処理を書き足そうと考えています。が、スタンドアロンでは画像生成を1年くらい前に実装したので、それを委嘱した方が早いかなと思ったりもしていますが。いずれにしても、そのうち作ろうと思います。それと、PDFの中から、参考文献のリスト部分を取り出して、結論の頁の後の頁にくっつけるという処理も入れておこうと思います。学術講演用にはそれがあった方が便利だろうと思うので。10件ずつくらいでページ足しながらって感じで処理すればよいかなと考え中。