🎄

技術記事をどうやって書くか & アドベントカレンダーについて

2024/12/11に公開

こんにちは!逆瀬川 ( @gyakuse ) ちゃんです!

今日は最近書いたいくつかの記事を紹介し、どんなふうに普段書いているかについてまとめてみたいと思います。

ソロアドベントカレンダーチャレンジについて

12月といえばアドベントカレンダーの季節です。生成AI Advent Calendar 2024に投稿しようかな〜と思ってだらだらしていたところ、定員が埋まってしまい、じゃあやってみるか〜と雑に立ち上げたのが生成AIプロダクト Advent Calendar 2024です。

ソロアドベントカレンダーを立ち上げたのは初めてだったのですが、最初のイメージとしては、30分で企画して、30分でネタ出しして、30分で執筆すれば1日1.5時間くらいでできるでしょ〜みたいな軽いノリでした。この時点で11月29日です。急がねばなりません。

https://www.youtube.com/watch?v=drV0RYUbYUA

この桜井さんの動画はめちゃくちゃタメになり、ガッとやることの重要性がわかります。幸い、11月30日と12月1日は土日であったため、若干の余裕があります。とりあえず、

  • ネタを25日分考える
  • 下書きもざっと書けるところは書いておく
  • 各投稿日は軽い実装と執筆だけで済ませる

という戦略を立て望みました。

アドベントカレンダーの方針を考える

生成AIプロダクトアドベントカレンダーと言っても、1日でやるアドベントカレンダーなのでカレンダー名から類推される話を続けなければならない制約はありません。名前被りを防止するためにこうしただけで、カレンダーを立てたタイミングではその中身についてはあんまり考えていませんでした。

自分にとっての目的、読者にとっての嬉しさ、あとネタの出しやすさと一貫性について考えると、方針が見えてきそうです。自分にとっての目的は、いろんなことを書き、各分野に詳しい人と仲良くなることです。自分はまだまだDeepLearningについてはひよっこなので、詳しい人と仲良くなっておくと、相談したりもでき、また書いた文章につっこんでくれるので嬉しみがあります。

また読者にとっての嬉しさですが、その前にターゲット層を絞っておく必要があります。どのくらいの知識を前提とするかは難しい問題ですが、今回はPythonやWeb、MLの知識が一定程度ある人たちに向けて書くことにします。そしてこの連載で生成AIやその周辺で働く人が少しハッピーになれるような記事、というのを意識してみることにします。

これらを加味し、自分の知識をもとに書ける領域に制限すると、以下のようなパターンが見えてきます

  • 基礎、ライブラリ、fine-tuning、応用とステップアップしていくパターン
  • 面白いモデル・簡単なプロダクトを25個作成するパターン
  • ごちゃまぜパターン

11月29日時点では、最初 面白いモデル・簡単なプロダクトを25個作成するパターン で行こうと思っていました。12月11日現在時点では記事一覧を見れば分かる通り、ごちゃまぜになっています。方針が変わるのはよくあります。

記事のネタを洗い出す

面白いモデル・簡単なプロダクトを25個作成するパターンをもとに記事のネタ候補をガッと書いていきます。

  • 言語系
    • RAG徹底比較用AIチャットアプリ
    • 物語生成
  • 音声系
    • 会議脱線管理くん (音声認識 + 話者推定 + LLM)
    • リアルタイム通訳
  • 画像系
    • viton系 (服きせかえ)
    • florenceベースの麻雀点数自動計算くん gradio or streamlit
  • 合せ技系
    • ゲームプレイのあるAI Tuber
    • ノート作成、ポッドキャスト生成するやつ
    • スライドの図を生成するやつ
    • PCを自動的に操作してくれるやつ
  • 閑話系
    • MCPの話、local LLMでMCPする
    • fine-tuning等に必要なGPU、最安はどれだ!選手権
    • v0, cursor等を使った効率的なPoC開発
  • その他
    • PDFからtable, 図, テキストを適切な構造で抽出するやつ
    • ショート動画自動で作ってくれるやつ
    • カロリーapp
    • 競馬予想app
    • 株価予想app

上記がこのとき書いたネタ候補になります。25個には達していませんが、なんとかなる気がしてきました。

下書きを書く

ネタを書いたら次は下書きを書く必要があります。
下書きは product template や issue template のようにテンプレを作ったあと、それを埋めていくと便利です。今回作ったテンプレはこちらです。

  • これはなに?
  • なにが嬉しい? (課題やうれしさ等)
  • 誰が喜ぶ?
  • なにを使う? (ライブラリ、フレームワーク、モデル等について)
    • フレームワーク:
    • ライブラリ:
    • モデル等:
  • どう見せる? (画面等)
  • 具体的にどうする? (処理の流れ、実装等の詳細、アイデアについて)
  • その他

これをもとに書いたものの例がこちらです。

  • 画像からいい感じの確信度つき構造的データ抽出をするアプリ
    • gradio or streamlit
    • 読み取りの確信度を出してくれる
    • LLMの出した数字をそのまま信じるのって難しいよね
    • 複数のvision系のAIを組み合わせる
      • OCR (microsoft), LLM (gemini, openai)
      • 判断が分かれる部分はあやしい…
      • もっとシンプルなOCRも混ぜてもいい
    • これはなに?
      • レシート等をいい感じに構造的データ抽出してくれるやつ
        • レシートに限定しない
      • いい感じの確信度を入れてくれる
    • なにが嬉しい? (課題やうれしさ等)
      • gpt-4o等のLMMで普通に抽出すると、ミスる。手書き文字だとCAR (文字単位の正確度) はかなり下がる
      • 一方で、間違って検出された文字列でも、LLMの特性上、『それっぽい』ものを出してしまう
      • 画像からのデータ抽出作業のサポートとしてLMMを導入したいが、安易に導入するとリスクがあるので、それの解決策を検討する
    • 誰が喜ぶ?
    • なにを使う? (ライブラリ、フレームワーク、モデル等について)
      • フレームワーク:
      • ライブラリ:
      • モデル等:
    • どう見せる? (画面等)
    • 具体的にどうする? (処理の流れ、実装等の詳細、アイデアについて)
    • その他
      • 確信度は一般的な課題と思われるから先行研究があるはず。既存の手法を調べる
      • gpt-4vの既存のOCRのSOTAモデルとのOCR性能比較

これを8本くらい書いたところで12月1日が来ました。あわわ…

記事を書く

記事を書くときはとりあえずアウトラインを書くのが一番です。
1日目のMCPの回ではこんな感じでサクッとアウトラインを書いてから進めました。

  • Agentに必要なものを考える
    • MCPの必要性を理解する
  • MCPとはなにか
    • MCPの概要を理解する
  • MCPサーバーを作ってみる
    • 簡易的なMCPのサーバー実装を理解する
  • Claudeと切り離されたMCPを作る
    • ローカルLLM + MCPでエージェントの未来を見る

次に、実装をやってしまいます。
GPT-4o等にサポートを受けつつ、実装し、動くのを確かめます。

そして最後に文章を書いていきます。

記事作成にかかる時間

これまで10本程度書いてきましたが、おおむね1本3時間くらいかかっています。
想定の1.5時間よりも長大になっている理由としては、VCR GTAが始まってよそ見しながら書いていることなどが挙げられますが、そもそも1つの記事を書くのって意外ときついです。サーベイを行ったハルシネーション回では8時間程度かかっており、合成データセット作成 & fine-tuningを行った麻雀牌の物体検出回では4時間程度かかりました。とはいえ、日々のバイトをしつつ、VCR GTAも見つつ書かなければならないので、一定程度は妥協をしつつ書いています。先に触れた麻雀回ではアプリケーション構築まで行う予定でしたが、これは諦めています。

記事を書く意義

そんなこんなでアドベントカレンダーを書いていますが、なんで書くんだろう?と改めて考えると、一番大事にしているのは、自分の文章を残すため、というモチベーションが強いです。いずれ自分の文章をもとにLLMをトレーニングすることを予定しているため、十分な文章が残っていると嬉しさがあるためです。残り15日、アドベントカレンダーがありますが、なんとか完走できたらいいなぁと思っています。なお、完走したら自動的にQiitaぬいぐるみがもらえます。

書いた記事の紹介

1日目: MCPについての記事

https://qiita.com/sakasegawa/items/b091ad9931cea378099b

この記事ではClaudeが発表したMCPについて解説しました。MCPはClaudeに依存しないただのLLM向けツールサーバーのプロトコルなのですが、Claudeベースの話ばかり上がってきていたため、ここではgpt-4oとfunction callingを使ってその価値を明らかにしました。

2日目: speech-to-speechサーバー

https://qiita.com/sakasegawa/items/46547233c6a96ca704c8

speech-to-speechモデルをend-to-endに作るのは難しいですが、音声認識、LLM、音声合成と分割するとわりと簡単に作れます。speech-to-speechを作っていて一番たいへんだったのはwebhookの部分です。

3日目: チャットアプリ開発RTA

https://qiita.com/sakasegawa/items/5d466a6076fb3c55d198

gpt-4oを使うと一瞬でWebアプリケーションが作れます。じゃあどのくらいで作れるのか、というのをRTA形式で示したものです。記事執筆含めて27分で作れました。

4日目: 確信度を出すOCR

https://qiita.com/sakasegawa/items/c7173648aea662451dbd

画像文章からgpt-4o等を使って情報抽出するケースが増えていますが、ハルシネーションが起きた場合、従来のOCRのミスとは違い、「それっぽい、見分けづらいミス」が増えます。このアプリケーションでは複数のOCR/LMMを組み合わせることで、確信度の高さで色分けすることに成功しました。

5日目: クラウドGPU比較

https://qiita.com/sakasegawa/items/0c7c36b943b9dc21f882

トレーニング等でGPUが必要なときにどれを使えばいいかわからん!みたいなのの助けになればと思って書きました。vast.aiやRunpodを使っておけば間違いありません。

6日目: LLMの推論部分の理解補助

https://qiita.com/sakasegawa/items/ef913d570882b3bb9251

LLMのアーキテクチャを解説した記事は大量にありますが、encoder-decoderを説明してもgpt-4oのようなものがどうなっているのかは分かりづらいです。ここではLlamaのコードをベースに推論部分、とくにデコード戦略について絞って解説を行いました。

7日目: ハルシネーションについて詳しくなる

https://qiita.com/sakasegawa/items/8b95c36e54521dddf132

2024年の流行語大賞はハルシネーションな気がしますが、ちゃんとハルシネーションについて理解をしておくと便利です。ということで、ハルシネーションの分類や歴史的経緯、最近の改善アプローチや検出手法について論文をサーベイし、自分なりにまとめました。

8日目: o1 Pro を使ってプロダクトを作る

https://qiita.com/sakasegawa/items/ecaba2286bd292e22eaf

出たばかりの o1 Pro を使って『アイデア考案』『ピッチ資料』『仕様書』『実装』というプロダクトの一連の流れをやってみるテストをしてみました。

9日目: 麻雀の点数計算 (オンライン麻雀編)

https://qiita.com/sakasegawa/items/0344e0e495a5e8daa0ff

架空の社長からの依頼というテーマで、オンライン麻雀のリーチ後 (テンパイ後) の点数推定をする、というタスクをやってみました。点数計算の方法と画像からの情報抽出の限界がわかります。

10日目: 麻雀牌の物体検出 (リアル麻雀編)

https://qiita.com/sakasegawa/items/676edabb25ed562d61d9

今度はリアルの麻雀牌の物体検出をするタスクです。Unity Perceptionを使って合成データセットを作り、Florence2をFine-Tuningするところまでやっています。ネタ記事なので、ぜひ読んでみて下さい。

まとめ

というわけで、わたしの記事の書き方を紹介し、1-10日目までの記事を振り返りました。
アニメでもあるように、総集編回は素晴らしい発明です。この記事をアドベントカレンダー11日目とし、省力化を測ります。

Discussion