DeNA AI技術開発部AIイノベーショングループ
2025-12-18
Qiita: @birdwatcher X: @birdwatcherYT
ユーザーごとにモデル保持するのは非現実的なので、基本このパターンになるはず
STEP: 事前学習 → ファインチューニング → 強化学習
LLMを使う多くの企業は、プロンプトチューニングとファインチューニングだけやる
Q:首都は?
A:東京
回答A > 回答B
GOOD/BAD
プロンプトチューニングで限界ならファインチューニングが候補に入る。強化学習まで必要なケースは稀。
事前学習済みモデルを特定タスクに微調整する
低ランクの小さな重みを付け加えるPEFT(Parameter-Efficient Fine Tuning)のLoRA(Low-Rank Adaptation)が主流
強化学習でもLoRAを使う
RLHF (Reinforcement Learning from Human Feedback) / DPO (Direct Preference Optimization)
入出力データセットを与えるとプロンプトを調整してくれるもの:
最近Gemini-2.5系の廃止計画が発表されたり、GPT-4o APIの廃止計画が発表されたり... → LLMをプロダクトに組み込んでいると、一斉にモデルリプレース作業に追われる
文章から趣味を抽出するtoy-problemで試してみた モデル: gemma3、初期プロンプト: "趣味は?"(あえてテキトーなものに) データセット (train: 56件, validation: 14件, test: 28件):
"趣味は?"
{"sentence": "映画鑑賞が趣味で、毎週1本は必ず観ています", "hobby": "映画鑑賞"}, {"sentence": "休日に散歩して鳥の写真を撮ります", "hobby": "バードウォッチング"}
【結果】 accuracy: 78.6% ← 手動チューニングだとなかなかここまでいけない
optimized prompt:
Given a sentence describing a person’s activity, identify and state the hobby being practiced. Output only the hobby.
selected few-shot examples:
{"sentence": "週末は公園でスケッチをして過ごします", "hobby": "スケッチ"}, {"sentence": "陶芸教室に通って、自分で器を作っています", "hobby": "陶芸"}, {"sentence": "旅行が好きで、日本全国を巡っています", "hobby": "旅行"}
API呼び出し回数が多いのでRateLimitに引っかかりやすい
評価指標を定めるのが難しい
さらに、強化学習も簡単にできそう(Open AIも同様)
jsonl形式で データセット作って 投げるだけ
最適化は モデル側の損失関数 で決まっているため 利用者は決めない (トークン単位の 最適化なので)
↓ LLMに与える情報を管理してあげる必要がある
無数に増えていく(ユーザーの)情報を
このあとコンテキストエンジニアリングの一種とみなせるRAGの説明をしますが、一般的なRAGは既にいろんなクラウドサービスが実装しています。
典型的なRAGシステムの全体像:
USER: 社内の経費精算の締め切りはいつ? AI: 月末です USER: それを過ぎたらどうなる?
それを過ぎたらどうなる?
経費精算の締め切りを過ぎた場合のペナルティや対応
USER: PCが重いときの対処法は?
PC 動作 遅い 対処
システム パフォーマンス 低下 原因
メモリ不足 解消方法
CPU使用率 高い
全文検索: 文字列完全一致で検索(インデックスで高速化) ベクトル検索:
モデル性能はembedding leaderboardで検索!
PostgreSQLのpgvector拡張やFirestore、Vertex AIなど
3. リランキング: さらなる絞り込み!
4. 応答 + グラウンディング:
チャンキング:
あらかじめ想定質問を生成しておくパターンもある(工夫はいろいろあるようだ)
実はさっきのRAGはNotebookLMの中身の推測でした (OSSでNotebookLMを目指しているレポジトリは先程のような構成)
ここからの話は非エンジニアの方は「へーそんなのもあるんだ」くらいで聞いてください。
ツール群: Web検索, コード実行, 画像生成, ファイル検索, コンテキスト取得 → ツール群にコンテキスト取得が入るとAgentic RAGになる
世の中の賢いエージェントはこうした工夫を取り入れて設計されている
@tool def func_add(a: int, b: int) -> int: # 自作関数 """足し算をする""" # Agentは、docstringを読んで判定してくれる print("called func_add") return a + b @tool def func_mul(a: int, b: int) -> int: """掛け算をする""" print("called func_mul") return a * b agent = create_agent( # 関数を渡す model=ChatVertexAI(model="gemini-2.5-flash-lite"), tools = [func_add, func_mul] ) result = agent.invoke( {"messages": [("human", "3と4を足した値に1+3を足した値同士を掛け算するとどうなる?")]} )
たとえばこんな例だと中身はどうなるでしょうか?
内部でループが回り、 3回LLMが呼ばれている 事がわかる
参考:ADKのLlmAgent も同様に内部でReActの ような構造を持っていた
エージェント賢そうだし全部エージェントに全部任せればいいのか?
自然に考えるとこう書けるでしょう:
オープンソースでもいくつか出ています
プロダクト実装で特定のタスクを実装する場合、 応答速度や制御性の観点からワークフロー型になるケースが多い気がする
今日の資料
LLM勉強会の資料
時計/タイマー
タイトルのみページ番号スキップ
中央寄せ