Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Sign up for free
Menu
Search
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Pricing
Search
Sign in
Sign up for free
Symfonyが 簡単にAI agentになる
Search
hideki kinjyo
PRO
August 19, 2026
Programming
160
1
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
Symfonyが 簡単にAI agentになる
PHP勉強会@東京 第190回の発表資料です。
https://phpstudy.connpass.com/event/401438/
hideki kinjyo
PRO
August 19, 2026
More Decks by hideki kinjyo
See All by hideki kinjyo
Composerだって音楽を奏でたい
o0h
PRO
0
7
phperだってパンチカードでコーディングしたい
o0h
PRO
0
570
yield再入門 #phpcon
o0h
PRO
0
1.9k
PHPで使える日時の表現と、その知り方 #frontend_phpcon_do
o0h
PRO
0
520
Composerを使ったサプライチェーン攻撃の様子を眺めてみる #phpstudy
o0h
PRO
3
420
ソースコード→AST→オペコード、の旅を覗いてみる
o0h
PRO
1
400
PCOVから学ぶコードカバレッジ #phpcon_odawara
o0h
PRO
0
680
夢の無限スパゲッティ製造機 -実装篇- #phpstudy
o0h
PRO
0
310
夢の無限スパゲッティ製造機 #phperkaigi
o0h
PRO
0
1.1k
Other Decks in Programming
See All in Programming
AWS CDKを理解するために公式の定義を深掘って解説してみる / Understanding AWS CDK by Digging into Its Official Definition
akihisaikeda
2
260
AI-Powered Domain-Driven Design
ziobrando
0
390
高橋メソッドでCVE解説シリーズ 〜CVE-2026-112816〜
hakkadaikon
0
210
[JA] Domain Modeling with Vanilla Rails: 「操作」から再考するRailsの設計論
yasaichi
4
1.8k
自作Discord音声botをLambda MicroVMsに移行した話 / Migrating My Discord Voice Bot to Lambda MicroVMs
akihisaikeda
1
290
全ての永続トークンを、生まれる前に消し去りたい!
sylph01
3
1.7k
Augmenting AI with the Power of Jakarta EE
ivargrimstad
0
570
Distance field of Julia set
kinakomoti321
0
140
作れるエンジニアから、価値を届けるエンジニアへ
ryunakayama
1
170
JIS keyboard support in Omarchy
lef237
0
180
GraphQL の onError と Nullability のこれから
quramy
0
200
学びを記事・スライド・Xへ高速展開する― AI-assisted Learning Loopで回すコンテンツ生成術
ochtum
0
190
Featured
See All Featured
RailsConf & Balkan Ruby 2019: The Past, Present, and Future of Rails at GitHub
eileencodes
141
35k
Facilitating Awesome Meetings
lara
57
7.2k
How People are Using Generative and Agentic AI to Supercharge Their Products, Projects, Services and Value Streams Today
helenjbeal
2
390
Build The Right Thing And Hit Your Dates
maggiecrowley
39
3.5k
We Are The Robots
honzajavorek
0
430
Connecting the Dots Between Site Speed, User Experience & Your Business [WebExpo 2025]
tammyeverts
11
1.1k
A Tale of Four Properties
chriscoyier
163
24k
No one is an island. Learnings from fostering a developers community.
thoeni
21
3.9k
Imperfection Machines: The Place of Print at Facebook
scottboms
270
14k
jQuery: Nuts, Bolts and Bling
dougneiner
66
8.7k
"I'm Feeling Lucky" - Building Great Search Experiences for Today's Users (#IAC19)
danielanewman
230
23k
Building Better People: How to give real-time feedback that sticks.
wjessup
371
20k
Transcript
あなたのSymfonyが 簡単にAI agentになるって 聞きました? 第190回 PHP勉強会@東京 Hideki Kinjyo GitHub: o0h
/ X: @o0h_ [公開用]
2 今日の話の前にあったこと 77webさん!! https://speakerdeck.com/77web/boost?slide=9
3 今日の登場人物 Symfony AI Agent Component AIエージェント簡単つくれる君
4 えーじぇんと? ◦◦について教えて〜 model ユーザーさん thinking...
5 えーじぇんと? ◦◦について教えて〜 コレを受け取って ユーザーさん
6 えーじぇんと? コッチに渡す役 model thinking...
7 えーじぇんと? 色々と複雑な振る舞いは modelにお任せだよ model thinking...
8 DEMO
None
None
11 のアプリが どんな風に実現しているのかを 紹介します
12 自己紹介 • 金城秀樹 / きんじょうひでき • GitHub: @o0h /
: @o0h_ • アイコンは美味しい鮭親子丼の写真です • 最近はPodcastをやっています ハッシュタグ: #readlinefm 𝕏 •
13 話すこと・話さないこと • 話すこと: symfony/ai-agentで簡単になること ➡ このパッケージ(バンドル)が何を助けているのか • 話さないこと: Symfony自体の話
➡ よくフルスタックFWに備わっている基本的な機能と繋ぎ込まれているんだな、 を感じてもらえるとハッピー
アプリの概要
15 概要 • 「Slack過去ログ調べる君」みたいなもの • 普通のSlack bot • チャットから入力文章を受けつけて、 Slackの過去ログを多段サーチして、
そこから得た知識で回答を出す
16 処理の流れ LLMの何か (AnthropicのAPIとか) Slack App 弊App Slack API
17 処理の流れ - Phase1 Slack 弊App • Slackの仕様上、 リクエストを受け取ったら素早くレスポンスを返さなければならない •
そのため、最初の応答はWeb Controllerを作って同期処理している
18 処理の流れ - Phase1.5 弊App(web) 弊App(worker) • LLM側の処理+Slack検索は凄く時間がかかる。 これを同期的に扱うと、Webリクエストがタイムアウトする •
そのため、ジョブワーカーを利用した非同期処理に流している
19 処理の流れ - Phase2 弊App(worker) LLMの何か (AnthropicのAPIとか) Slack API •
ワーカーは、指示内容を整えてLLMにリクエストを実行 • 結果が返ってきたら、Slackにチャットメッセージをポストする
Symfony + Ai Agent Bundle目線の話
21 Symfonyは強力なフレームワークだよ! • Slackとの連携だけアプリ独自の実装だけど・・・ • といっても、よくある「外部SaaS連携」の範疇 • 以下は「いつも通りのSymfony」で実装されている Web用のコントローラー(Phase 1)
• ジョブワーカー(Phase 1.5) • • 以下が「AI Bundle」が助けてくれる部分 modelに向けたリクエストの構築&リクエストの送信 • 独自サービスのTools化 •
基本的なリクエストの投げ方
23 基本的なリクエストの投げ方 https://symfony.com/doc/current/ai/index.html
24 基本的なリクエストの投げ方 プロンプトをDTOに入れて https://symfony.com/doc/current/ai/index.html
25 基本的なリクエストの投げ方 agentインスタンスは DIで入れておくと楽だし、 Symfony的に自然 https://symfony.com/doc/current/ai/index.html
26 基本的なリクエストの投げ方 作った$messagesを セットされた$agentに call()させる!それだけ! https://symfony.com/doc/current/ai/index.html
27 基本的なリクエストの投げ方 応答を取得してゴニョる https://symfony.com/doc/current/ai/index.html
設定ファイルにお任せできること
29 弊Appの設定例 config/packages/ai.php
30 弊Appの設定例 利用するプラットフォーム(LLMベンダー)は サクッと設定&乗り換えできる config/packages/ai.php
31 弊Appの設定例 複数のagent設定を持つことが可能で config/packages/ai.php
32 弊Appの設定例 リクエストのベース設定も簡単に指定OK (システムプロンプト、利用できるTools) config/packages/ai.php
33 弊Appの設定例 依存注入している様子が こんな感じになる
Toolsの用意
https://openai.com/ja-JP/index/unrolling-the-codex-agent-loop/
36 $agent->call()に「利用可能なtools」を添付しておく • 今回で言うと、 モデルに「Slack検索ツールが利用可能」という事を 最初のリクエストで提示している • そのため、 (agentは何も複雑な思考をしていないのに) モデルが気の済むまで「この検索よろしくね!」と
試行錯誤をしてくれるようになる
◦◦について教えて〜 弊App LLMの何か (AnthropicのAPIとか)
◦◦について教えて〜 ちなみに、 Slack検索ツールもあるよ 弊App LLMの何か (AnthropicのAPIとか)
OK、〇〇ね〜 弊App LLMの何か (AnthropicのAPIとか)
Slackで ◯◯検索して結果plz 弊App LLMの何か (AnthropicのAPIとか)
◯◯ [検索] Slack API 弊App ◯◯ とは〜 ◯◯ △□ 本当の◯◯
LLMの何か (AnthropicのAPIとか) 弊App ◯◯ とは〜 ◯◯ △□ 本当の◯◯
弊App LLMの何か (AnthropicのAPIとか) △□についても調べて
何度も何度も往復する 弊App LLMの何か (AnthropicのAPIとか) Agentic Loop!
45 が、とても簡単に手に入る
46 Tools
47 Tools Class Attributeで、 ツール名と説明を付けて
48 Tools __invoke()メソッドを 実装すればOK
49 Tools - 余談 1クラスで 複数メソッドを 登録することも出来るし https://symfony.com/doc/current/ai/components/agent.html#tool-return-value
50 Tools - 余談 より精緻な パラメータの 提供もできる https://symfony.com/doc/current/ai/components/agent.html#tool-return-value
Toolsの利用とイベント(オブザーバー)
52 Toolsの利用とイベント(オブザーバー) • ユーザーは、高度な出力が期待できる場合なら比 較的長い待ち時間にも寛容になりやすい。ただし 一般には、「なぜ待っているのか」を知りたいと 考える。タスクの内容を説明したり、テキストで プロセスの流れを説明したりすることで、ユー ザーに状況を伝え続けることができる。 [AIインターフェースデザイン
―AI時代の対話・可視化・制御の原則 第4章]より
53 Toolsの利用とイベント(オブザーバー) • ストリーミング表示、待機中にどのタイミングで 情報を示すかの調整、進捗インジケーターのよう な機能は、ユーザーの目的や利用状況に応じて選 択的に使うべきである。適切に使えば、明確さと 信頼を高められる。 [AIインターフェースデザイン ―AI時代の対話・可視化・制御の原則
第4章]より
None
None
56 symfony/ai-agentの場合 • Toolsの利用に関するイベントが自動で発火されている • ToolCallRequested / ToolCallArgumentsResolved / ToolCallSucceeded
/ ToolCallFailed • それらをリッスンすることで、 ユーザーに「今なにが起きているのか」の通知に(も)利用できる
57 Tools関連イベント
58 Tools関連イベント Toolの「呼び出し」「完了」の リスナーとして登録
59 Tools関連イベント • 今回は小さいアプリなので実装を端折って、 「利用されるToolはSlack検索しかない」という大胆設計! • 利用開始イベント => 「Slackを検索中」 •
実行完了イベント => 「検索結果を分析しています」
以上です!
61 いかがでしたか? • 一般的な「FWの知識・資産」をそのまま使える感じ良い◎ • DBの検索とかファイルの操作とかAPI連携とか、 そのまま「Toolsとして使う」が出来る • symfony/tuiとか繋ぎこんだら面白いことが出来そうですね!
62 関連読み物 • Symfony AI - Agent Component (Symfony Docs)
https:// symfony.com/doc/current/ai/components/agent.html • Symfony AI Bundle使ってみた - AIチャット編 - #LLM - Qiita https://qiita.com/ippey_s/items/7a6ac28d513bac9ca5e3 • symfony/aiとlaravel/boost - Speaker Deck https:// speakerdeck.com/77web/boost • symfony/mcp-bundleで、既存アプリケーションもお手軽にMCPサーバー 化 - Speaker Deck https://speakerdeck.com/o0h/phpconkagawa-lt-6
おしまい! お付き合いいただき ありがとうございました!!