😕

Typstと生成AIをつなぐ

2024/12/22に公開

はじめのはじめに

この記事はTypst Advent Calendar 2024の22日の記事です。

https://qiita.com/advent-calendar/2024/typst

はじめに

「Typstの中でJuliaのコードを実行する」をよんでいると、wasmで動いているのかなと思い、ソースコードに興味をもちました。
そして、GitHubでソースコードを確認すると、想定外な使い方をしており、どのようにjuliaが動いているのかというと、Juliaをバックグラウンドで動かし、Typstファイルを監視し、typstの中のjuliaコードを実行し、jsonで保存していました。
この方法をみて、「自分でもTypstを使って生成AIと接続する仕組みが作れるのでは?」と思い立ち、アドカレのネタになると思ったので実装してみました。

絵文字付きリストで文章から一番近い絵文字を考えるのは手間がかかるので、もっと簡単に自動化できないかと考え、Typstで絵文字を含むリストを自動生成できるようにしてみました。

https://github.com/jijinbei/emoji-list

以下の画像は、#emoji-list()を使ったTypstファイルで生成されたリストの例です。

勝手に文章から一番近い絵文字を考えてくれて、絵文字付きのリストを生成してくれます。

使い方

使い方は簡単で、emoji-listをクローンしrye run emoji-list <typst-source>を実行し、Typstファイルに以下のように記述します。
"emoji_list.csv"はPythonから自動生成されたものです。

#emoji-list(
  "emoji_list.csv",
  [おはようございます。],
  [こんにちは!],
  [雪、無音、窓辺にて]
)

例えば、次のようなリストが生成されます:

☀️ おはようございます。
👋 こんにちは!
❄️ 雪、無音、窓辺にて

詳細なセットアップ方法はGitHubのREADMEをご参照ください。[1]

実装方法

今回、Typstファイルを監視するためにPythonを用いました。
そして、環境構築を容易にするためにRyeを使っています。

大まかな動作は以下の通りです:

  1. typstファイルの変更をwatchdogで検知
  2. #emoji-list()内の文章を正規表現で抽出
  3. 抽出された文章をOpenAI APIで「文章から絵文字一文字に変換」するよう依頼
  4. レスポンスをCSVファイルとして保存
  5. TypstファイルがそのCSVを読み込み、絵文字付きリストを表示

実装して感じたこと

生成AIとTypstはどちらも文章を扱うものなので、相性がよいと思いました。
また、juliaのTypstパッケージから学んだ外部プログラムとの接続方法は非常に汎用性が高く、他の用途にも応用できそうです。
例えば、生成AIを使えばドキュメント全体の自動装飾や、指定したテーマに基づく動的なコンテンツ生成が可能になると考えています。

今後のやること

  • 遅延の改善
    typst-previewとPythonスクリプトを同時に実行していると遅くなるため、効率化を図りたい。
  • Typst側のパッケージ強化
    現在#emoji-list()しか実装しておらず機能が限定的。より多機能化したい。
    #emoji-list()に常にCSVファイルのパスを常に入れないといけないのを直したい[2]
  • パッケージとして公開
    卒論が終わったら、今回の仕組みをTypstの公式ライブラリとして公開することを目指します。
脚注
  1. ChatGPTのAPI代がかかります ↩︎

  2. typstのstateを使いたかったけど、使い方がよくわからなかった。詳しい記事を求ム ↩︎

Discussion