AIエージェントのためのテスト手法とその考え方
「この番組はエンジニアの成長は楽しい学びからをモットーに、昨日より少しだけ成長できる学びをお届けするエンタメ系テックラジオでございます」
「でございます。お願いします」
「さあ、今日はですね」
「はい」
「AIエージェント」
「ほう」
「のテスト方法についてお話をしてこうかなと思います」
「AIエージェントのテスト」

「はい」
「あー、えーと、作る側の話ですかね」
「作る側の話ですね」
「うん、うん」
「で、こちら、あの、参照してる本はですね」
「はい」
「えー、『Orally』から出てます『実践AIエージェント開発』という本でございます」
「えーと、『おさる熱』でしたっけ」

「『おさるの熱』です」
「ああ、はい、はい、はい。むずそう、実践シリーズ」
「難易度はね、そんな高くないんじゃないかな」
「うーん」
「あのー、0からのディープラーニングとかのほうがはるかに難しい気がする」
「ああ、そうなんすね」
「うん」
「なんか印象的には0からのディープラーニングぐらいのことやらされるのかと思ってたんですけど」

「うん、うん、うん、うん」
「あ、ちなみにちょっとのりさん、すいません、感想だけ聞きたいんですけど」
「はい」
「のりさん的ほしい5分の何ぐらいの本ですか、これ」
「うーんとね、4ぐらいすね、僕は」
「ああ、じゃあそこそこ」
「うん」
「そこそこいいですね」

「ただ、えーと、ちょっと懸念点というか、少し難しいなと思ってるのは」
「はい」
「なんかこれ時間の経過によって結構変わりそうだなっていうのはやっぱりあるというか」
「うん、うん、うん」
「あと、まあ最近実感してることとしては、あの、LLMのベンダーたちいるじゃないですか」
「はい」
「あの人たちが出すサービスがあまりにもなんかエージェンティックすぎて」
「はい」

「これ我々がなんか作る余地って今後あるんだろうかみたいな」
「あー、分かるかも」
「気持ちが少しあるかもしれない」
「うん、うん、うん。まあニッチなね」
「うん」
「ユースケースでは、まあ自分たちで作るみたいなことになるのかなと勝手に思ってるんですけど」
「うん、うん、うん」
「まあ本当になんか、ね、指示文打つのめんどくさいとか」

「うん」
「で、あとはなんか、向こうからこの順番で質問してほしいとか、なんかもうそういうとこぐらいですよね、なんか余地」
「そうなのよ」
「うん」
「ニッチ、そう、ニッチが残るなっていう」
「はい」
「まあそもそものこの本、どういう本かっていうとですね、まあ本当にAIエージェントを作るときの、えー、いろはが書かれてる本でございますと」
「はい、はい、はい」

「で、それこそAIエージェントがどういうアーキテクチャで作られてるかとか、じゃあそれらをどうやってテストするのかとか、じゃあ本番環境を乗せるためにはどういうステップ踏んでって、えー、実際にこうデリバリーをしていくのかみたいな。結構包括的なものになっていて。多分これ単体読んだだけだとAIエージェント作りきるのむずいなと思ってて」
「うん」
「こっから1回ちょっと気合を入れて、あのー、1エージェント作るぐらいのね、なんだ、1歩が必要かもなっていう感覚はありますね」
「うん、うん、うん」
「うん」
「なんか実際に運用してから出てくる知らんがなみたいなやつもありそうですよね」
「ありそう」
「なんか今までのものと違いすぎて」

「うん、うん、うん、うん、うん」
「そうだね。あとね、やっぱり出てくるソースコードがどうしてもね、シンプルなんすよね、結構」
「ああ、そうなんすね」
「うん。そんなにね、なんか分厚いわけでもなくて」
「うん」
「300ページちょいかな、これ」
「うーん」
「まあ薄くもないんですけど」

「並みの『Orally』、『Bonson』ぐらいですか」
「じゃないかな」
「はい、はい」
「なので、そのー、コードがあんまりこう複雑な事例では出てこない」
「そんなに複雑になるんすかね、コードって。そこまんま分かってないです」
「あんまならないのかもしれないなあ」
「うん」
「もしかすると」

「うん、うん」
「なんか基本的にあの、LangGraphっていうフレームワーク、エージェントフレームワーク使って書いてて」
「はい」
「で、えー、なんとなく、あ、こういうふうに使うんだみたいなのをイメージつかめるんですけど、ほんとにこんなシンプルなのかって思いながら書いてる自分がいたから」
「うん、うん、うん」
「まあもうちょい、うーん、自分でこう試行錯誤しながらやってかないと、実践で使えるようなものはちょっと難しそうっていう印象ですね」
「うん、うん、うん」
「うん。ただ、そのアーキテクチャとかがけ、結構分かりやすいので」

「はい」
「あー、こういうふうに作ってけば確かにちゃんと動きそうっていう感覚はつかめると思います」
「うん。なるほど」
「うん。で、その中でもね、ちょっと僕的にはね、テストのところが結構普通のシステム開発とちょっと毛色異なるなって感覚がありまして」
「うん」
「なのでちょっと今日はね、その話をしていくという回にしようかなと思います」
「気になります」
「個人的にはこのAIエージェントのテストって、通常のシステムより結構難しいなっていう印象なんですよ」

「いわゆる決定論的じゃなさそうですよね」
「まさにそのとおりで。もうユーザーの入力もさ、結構無限の可能性を秘めてるじゃないですか」
「はい」
「大体、あの、自然言語で指示出すと思うので」
「うん」
「もうまず入力のパターンが無限の可能性を秘めてると」
「うん」
「で、それに応じて、まあエージェントなんでいろんなツール使ったりとか、必要に応じてメモリ参照したりとか」

「うん」
「っていうようないろんなパスがあって、最終的に出てくる出力にも無限の可能性があるっていう」
「なんか多段に、ね、LLM挟んでる時点で、なんか」
「うん」
「もう同じ入力しても同じ出力出るんかとかも、なんか怪しいんじゃないかと思ってしまう」
「うん、そう、そうなんです。そうなんですよ。なんで品質担保するなら余計テスト重要だし、重要なのに難しいなと思って」
「うん」
「いますと」

「はい」
「ただこれも分解すると、あ、確かにこうしたらいけるのかもっていう気持ちが少し湧いてくるんで」
「うん」
「まあ今日は、あー、テストするならそうやればいいのかっていうような感覚をつかんでもらいたいなという気持ちですね」
「気になりますね。お願いします」
「はい。まずAIエージェントの、えー、簡単にモジュールというか、えー、大体AIエージェントってどうやって作ってんのよっていうところからね、お話しします」
「はい」
「まずモジュール。これはですね、えー、全部で一般的には5個のモジュールに分かれてます」

「そんなあるんすね」
「はい。で、1つこれ分かりやすいのはモデルですね」
「分かりやすい」
「うん。もうClaudeとかChatGPT5.5とかそういうやつですね」
「うん」
「続いてツール」
「あ、ツールね」
「ツールもまあ最近はClaudeCodeとか使ってたらバシバシ出てくると思うので、イメージつきやすい部分ではあるかなと思うんですけど。ツールに関して言うと、何個かあって。まあローカル関数の場合もあれば」

「うん」
「えー、シンプルにAPIのケースもあれば」
「うん」
「MCP作られてる場合もありますよねと」
「うん」
「まあそういった、えーと、モデルが使うためのプログラム」
「うん」
「のことをツールと呼びますよと」

「うん」
「で、これはモデル単体だとどうしても非決定論的になってしまう。確率に依存した形になってしまうっていうところを、こうなるべくプログラムによって、えーと、予測可能な形にしたいよねっていうところから、まあいろんなことができるようにツールがたくさん用意されてるというわけですね」
「なんか分かりやすいのなんかないんすかね。やっぱ計算とかはそうなんでしょうけど」
「ああ」
「お金の計算とか」
「はい、はい、はい。なんかプルリク作るとかもスキルな、スキルっていうか、まあツールに入るんじゃないですかね」
「ああ、その文面はAI、モデルが考えるけど」
「うん」

「ギットハブのAPI叩いてうんぬんかんぬんはツールがやるってことっすね」
「そう、そう、そう、そう、そう、そう」
「確かに」
「とか。あとは最新のドキュメント参照とかも、まあMCPあるじゃないですか、Context7みたいな」
「うん」
「ああいうのもまあツールですよね」
「そうですね」
「うん。で、あとは、えー、モジュールその3、メモリ」

「メモリ」
「はい。メモリはね、えー、長期のメモリと短期のメモリがあるんですけど」
「うん」
「例えばLLMと会話してるその、まさに会話の流れありますよね」
「はい」
「まあこれも短期的なメモリに入りますと」
「うん、うん、うん」
「あとは、えー、これまでのなんか記憶をこう保存する機能があったりとか。あとは別にその機能に関してじゃなくても、えーと、AIエージェントの場合だと、例えば過去にこういうやり取りあったよねみたいなところをこうデータベースに蓄積してったりとか」

「うん」
「まあそういうのをやってく、まあ部分がこうメモリですね」
「なんかやっぱ聞けば聞くほど」
「うん」
「そのAIモデルとやり取りをするネイティブチャットアプリっていうんですか、あの」
「うん、うん、うん」
「あれ」
「うん」

「あれーですね」
「もうね、あれはエージェントですよ」
「本当に、完全に」
「えっと、ツールもあって」
「うん」
「で、メモリも、まあ設定でオンオフできますけど、短期メモリはチャットの中で生きてるし。長期メモリは、あのー、なんかAIに学習させるようにしますかみたいな」
「うん、うん、うん、うん」
「ところに当たるイメージで合ってますか。学習っていうのはあの」

「学習させますか」
「覚えとくみたいな。そのキャラクターを」
「はい」
「名前覚えてもらえるとか」
「うん、うん」
「そういえば別のチャットでこういうこと言ってたからこういうの言おうみたいなことをしてくれるみたいなやつ」
「そうね。あれもね、もちろんメモリですね」
「うん、うん」

「あと」
「えー、例えばコード中にさ、あの、保存されてるドキュメント系とかも、まあメモリと言ってしまえばメモリなのかなって気がしますけどね」
「うん、うん、うん、うん」
「あの、AIの、まあAgent.mdとかClaude.mdとか」
「はい、はい」
「あれも言ってしまえばメモリだよねっていう」
「確かに。まあほんとにモデルが処理するときに食わせる事前情報を」
「うん」

「セッション単位で持ってるか、セッション横断で持つかみたいな」
「うん」
「感じなんすね」
「そう、そう」
「はい」
「そう、そう、そう、そう、そう」
「で、えー、モジュールその4」
「あと1個なんだ。今まで出てきてないの。UI」

「UIではない」
「えー、オーケストレーションです」
「あー、なるほど。オーケストレーションか」
「はい。プランニングとも呼ばれてるんですけど。えーと、要はどのタイミングでモデルを呼ぶかとか」
「うん」
「えーと、どのタイミングでツール呼ぶかとかメモリとか参照するかみたいなところの流れをコントロールしてる、えー、コントローラ的なブレインですね」
「うん、うん、うん。そのブレインは」
「うん」

「モデルを使って実現されるものなのか」
「うん」
「はたまた別のなんかプログラムで実現されるものなのかで言うとどっちですか」
「えーとね、これは双方関係してると思います」
「ほう、どういうことですか」
「まず、まあモデルってこう自分で考えて呼ぶツールとかメモリとかなんか選択してるじゃないですか」
「はい」
「なんですけど、実際になんかLangGraphとか書くとめっちゃ分かりやすいんですけど。あれってモデルに何のツール使わせるかを判定させて」

「うん」
「で、えー、戻ってきた、えーと、値を元になんか条件分岐させてツールを呼ぶみたいなことしてるんすね」
「はい、はい、はい」
「なんで、モデルも考えてるし、え、そのモデルの決定を実際に動かしてるのがオーケストレーションの部分っていうイメージかな」
「AIエージェントの開発で言うと、そのオーケストレーションを作るっていうフェーズがあるんですよね」
「ありますね」
「で、そのオーケストレーションを作るっていうのは、なんか例えば具体的にどんな感じで作るんですか」
「えーとですね、オーケストレーションに関して言うといろんなパターンがあって」

「はい」
「えーと、じゃあ例えばツールを呼び出すにしても、いろんな呼び出しのパターンあるんですよ」
「ほう」
「で、えー、これはなんか結構ね、デザインパターンに近い感じなんですけど。1つはシンプルなやつ、単一ツール実行」
「うん」
「って呼ばれてるものだと、まあほんとに単一のツールを実行してその結果を渡すだけのもう一直線」
「うん、うん」
「ほぼオーケストレーションしてる意味ないだろぐらいのやつですね」

「うん、うん」
「で、えっと、まあちょっとこれだけだと分かりにくいんですけど、えー、ほかのパターンでも並行ツール実行とかグラフっていうパターンがあって」
「うん」
「並行ツール実行は、まあ同時に一気に何個もツールを呼び出して、全部の結果を集めてから、えー、それを、え、モデルに渡して、えー、推論させるみたいな」
「うん」
「っていうようなことをやったりとか。あとグラフの場合だと、えーと、この条件のときはこのツールを呼び出すみたいなのがある、あらかじめそのコードで書かれていて。で、えーと、まあその判断をそもそも、えーと、モデルがやったりとか。まあそういう呼び出しの順番みたいなやつってなんかある程度こう書かれてるんすよね、コードで」
「はい、はい」
「そういういろんな呼び出しのツールのパターンがあって、それをあらかじめ定義しておくためのやつっていう感じっすね、オーケストレーション」

「えっと、ClaudeCodeとかで言うと、まあどのAIコーディングエージェントでもあると思うんすけど、エージェントとサブエージェントみたいなのがあると思うんすけど」
「うん、うん、うん」
「なんかエージェントとサブエージェントでいうそのサブエージェントの親玉」
「うん」
「の、そのだからモデルからモデルを呼び出す親モデルって」
「うん、うん」
「オーケストレーションに入りますか」
「入りますね」

「ああ、じゃあそれも入るっすね。じゃあほんとにあのモデルの外側にある、まあまずなんか、えーとこのモデルを」
「うん」
「呼び出してこういう作業をさせますみたいなところも」
「うん」
「オーケストレーションだし」
「うん」
「その中でモデルがなんか最終的にどういう判断をする。例えばA、B、Cいずれかのツールを呼び出してくださいみたいなのをモデルに投げて、モデルが判断するのもオーケストレーションっていうCっていう」
「ああ、そう、そう、そう、そう」

「AIエージェント全体の作業を、まあオーケストレーションする。なんて言うんだ。えー、まあコントロールするところを」
「そうっすね」
「オーケストレーションと呼ぶ感じなんすね」
「そうですね」
「じゃあもうそうするとやっぱMeC警察が出てきますね」
「あー、まあそれはあり得るかも」
「はい。なんか全部ひっくるめてって感じがしますけど。なんかはい、感覚分かりました」
「まあそれで言うとね、あのMeC警察はもうモデルとツールの時点から実はあって」

「ほう」
「さっきで言うサブエージェントは要はツールみたいなもんなんすよね。そのエージェント、別のエージェントから見たエージェントは」
「ああ、そうなんですか。へー」
「はい」
「なるほど」
「うん」
「じゃあ警察ですね」
「だからここはね、結構。ちなみに次もね、警察出てくると思います」

「分かりました。ちょっと警察ちょっと構えときます」
「警察構えといたほうがいいっす」
「分かりました」
「はい。で、次のモジュールが、まあ最後なんすけど、学習の仕組みっすね」
「学習の仕組み」
「はい」
「はい、はい、はい」
「これはエージェントがその活動を通じてどんどんレベルアップしていくための仕組みみたいな」

「うん、うん、うん、うん」
「で、えー、まあじゃあそれって何するのっていうので、まあ2パターンあるんすけど、パラメトリック手法とノンパラメトリック手法ってのがあって」
「あ、MeCですね」
「あそこはね。そこはMeC」
「はい」
「うん。MeC警察すぎるだろ。まあここのパラメトリックは、まあほんとにファインチューニングみたいなのが分かりやすいっすよね」
「もうちょっと詳しくお願いします」
「えーとね、パラメトリック手法ってのは要はそのモデルのパラメーターをいじって、えーと、エージェントの動きを調整しますよっていう学習手法ですと」

「うん、うん」
「で、これは1番分かりやすいのだとファインチューニング。例えば教師ありデータを、うん、教師ありデータ」
「教師あり学習」
「まあほんとにモデルを再学習させるみたいな感じっすね」
「はい。もう出来上がってるやつに対して、めっちゃ優秀なやつに対して追加で」
「うん」
「やってっていう」
「そう」

「プリトレインドなモデルに対してみたいなやつですね」
「ああ、そう、そう、そう、そう。で、それをやることによって例えばドメイン特化させたりとか」
「うん」
「っていうようなことをやったりとかしますよっていうのがパラメトリック手法で。ノンパラメトリック手法は、まあめっちゃ雑に言ってしまえばプロンプトをいじりますよっていうほうに近いかもしれない」
「うーん。なんか一般的にはこっちのがやりそう」
「まずはこっちをやってくださいって推奨されてます」
「そうですよね」
「うん」

「モデルって超デリケートだからな」
「モデル超デリケートだし、あとアップデートとかのことも考えないといけないんで」
「確かに」
「モデル自体の」
「確かに。なんか1年持たなそう」
「そう。だからね、パラメトリック手法はマジで最終奥義ですぐらいで念押しされますね」
「ああ、でもいいですね、それは。すごい大事なことですね」
「そう。で、この学習っていうのは、えー、いろんな方法あるんですけど、例えば毎回毎回こうAIに振り返らせて」

「うん」
「えー、プロンプト調整してくってこともできますし」
「うん」
「複数のデータをバーって蓄積して、その中から見つけたインサイトをこう反映させるっていう手法とかもありますし」
「ふーん」
「まあ今のはね、1回なのかバッチなのかの違いみたいなところはあるけど」
「なんかその蓄積してったっていうのは、なんかいわゆるそのお客さんというかユーザーが実際に使ってる中で、なんかたまーにこのやり取りの日は1から5で評価してねみたいなのを食わせて。で、そのうちなんか1とか2つけられたやつ分析して」
「うん」

「その1から2が少し良くなるように、まあAI自身にちょっと振り返らせて改善するみたいなイメージですか」
「もあるし、えっと単純に例えばツールの呼び出しとかでエラーが出たときに」
「ああ、なるほど」
「えっとそれを振り返らせるみたいなこともありえますね」
「それは確かに分かりやすいな」
「とかあとあのーChatGPTとかさ、なんか2択の回答出してきてさ、どっちがいいですかみたいな聞いてくるやつあるじゃないですか」
「はい」
「あれとかもあのーその学習に使ってると思われますね」

「うーん、なるほどね」
「で、これはそういう学習内容とかをメモリに保存してるので、まあそのへんはまあMeCではないなっていう感じですね」
「うん、うん、うん、うん」
「うん」
「なんかオーケストレーションとツールの一部と」
「うん」
「えーと、なんだっけ、学習するための仕組み」
「うん」

「っていうのがまずあって」
「うん」
「オーケストレーションの下になんかモデルやら」
「うん、うん」
「なんなのか。ほかになん、ほかに何ありましたっけ」
「えー、モデル、ツール、メモリ、オーケストレーション、学習っすね」
「みたいななんかイメージをしました」
「うん」

「まあはい。でもだいぶ、だいぶ、だいぶ解像度が上がりました」
「はい。で、これらの、えっと、まあモジュールがあって、それをテストしていけますよと」
「うん」
「いう話なんですよ。ちょ、テストの前段階でめちゃくちゃ時間使ってるんですけど」
「はい。まあでもこのぐらい必要かなと思います」
「で、単体テストとE2Eテスト」
「うん」
「どっちも大事です」

「はい」
「ただ、なんかこれシステムテスト、システム、ん?ソフトウェアのテスト?いや、でもこれもソフトウェアだからなんと言うんだろう。これまでのプログラムのテスト」
「はい」
「の単体テストとかとちょっとイメージ違うかも」
「へー」
「まあ関数単体ではないというか」
「あー、まあじゃあなんか内部結合テストみたいになってるんですね、その」
「うん」

「一部のモジュールをバコッと取り出してそれの単位でやるみたいな」
「うん。てかなんならまあこれちょっとE2Eの中でやってんじゃないかなぐらいの気持ちもあるんですけど」
「ほう」
「まずモデルは、あのー、まあ基本モデルベンダーがやってるんであんまここはテストできないはず」
「うん」
「てかまあこの本には書かれてなかったっすね」
「うん、うん、うん」
「まあできるとしたらなんだろうね。まあ自分たちのタスクがどれくらいこれに向いてるかみたいなのをなんか質問投げまくってテストとかはできるかもしんないけど」

「うん」
「まあテストしたとて、あの改善というか、まあモデル差し替えみたいなことしかできないしねっていう」
「まあでも差し替えはまあ大事なんじゃないですかね」
「まあ確かに」
「うん」
「うん。なんでまあモデルはまあベンダーがやってくれよっていう範囲かなと」
「うん」
「で、えーとツール。ツールはこれテストしやすいっすね。あのツール単体がまあ、あのある程度こう動作が決定論的なものが多いので」

「うん」
「これはほんとに入力に対して出力が期待値どおりかっていうのをまあテストできるはずですと」
「そうですね。もうツールに関しては」
「うん」
「もうそっちはそっちの領域でユニットテストやらE2Eテストがされる感じですね」
「そうだね。だからそっちのE2Eテストがこのモジュールの単体テストに近いかもしんない、イメージ」
「うん、うん。MCPとかテスト超簡単だろうな、多分」
「あー、えっと」

「ほぼないんじゃないか、テストパス」
「あー、そのレイヤーでってことか」
「はい」
「うん」
「てか、ど、ん?テスト、そうだよな」
「うん」
「なんか実際に何呼ぶかはモデルがやるから」
「まあそうだね」

「まああんまりなんかMCPも単体で、まあテストしないわけ、絶対入れないとは言わないっすけど、そんなに価値なさそうだな」
「うん。で、続いてオーケストレーションのテスト」
「単体?」
「はい」
「オーケストレーション単体?」
「単体」
「え、モデルが中には入ってますよね?」
「えー、入ってます」

「なんかオーケストレーションのテストとE2Eのテストの違いがちょっとあんまりイメージつかないっすね」
「うーん、それで言うと、プラン、えー、このオーケストレーションのテストに関して言うと、モデルとオーケストレーションをテストしてるに近いかもしんない」
「ほう」
「だからまあさっきのあの、まあ要は結局これMeCじゃないよねっていうところがめちゃくちゃ影響してると思うんだけど」
「はい」
「オーケストレーションって単体だと、あのー、そんなに何もないから」
「はい。そのイメージ」
「だから結局、うーん、モデルは使う」

「うん。はい」
「で、ここでは何をテストするかというと、ツールの呼び出しをテストするんすよ」
「まあ、なんか処理が流れるかなみたいなことですか、ちゃんとその意図したとおりに」
「えっとそう。で、えー、もうちょい具体的に言うと、正しいツールを無駄なく適切、適切なパラメーターで呼び出せたかどうかをテストするっていう」
「あー、なるほど。じゃあ、あの動かしたあとの間のここの処理、なんの引数、引数っていうかパラメーターを」
「うん」
「渡してるかなみたいな目まで」
「うん」

「見るってことですね?」
「そう。で、えーとあとはその正しいツール全部呼び出せてるかどうかとか。あと逆に無駄なツールを呼び出してないかとか」
「うん」
「そういうのも含めて、えー、ツール呼び出しのところをテストしていく感じになりますね」
「すいません、なんのフレームワーク使ってるって言いましたっけ?ラングチェーン?」
「えーとね、ランググラフ」
「ランググラフ?」
「うん」

「ランググラフ、Pythonですか?」
「Python。てかあのー、ラングチェーンの発展バージョンみたいなやつ」
「だからPythonもあれですよね、なんかそのパラメーター見るテストかけるんでPytestって」
「うん、うん、うん」
「そういうのでなんか見ていく感じなんですかね?」
「ログの取り方はどうなるんだろうな」
「Mockとかするのかな。Mockとかしないのかな、それ。パラメーター見るのは多分Mockしなきゃいけないから。Mockとかはしないのかな」
「そこまではね、書いてなかったな、でも」

「でもMockしないとパラメーター見れないよな、多分」
「スパイとかねじ込むのかな」
「ね。とかは思いますけど。まあでもそこまでするんかっていう。なんか結果良ければすべて良しにするのか」
「うん」
「そこまで見るかっていうところですね」
「うん、うん、うん、うん」
「まあなんかモデル挟むならなんか見といてもいい気がするけどな」
「うん」

「なんか今後多分新しいモデル出たり、あとはなんかコストダウンのために、じゃあちょっとClaudeからGPTに変えましょうみたいなのがあったときに」
「うん」
「やっぱなんか細かいとこ見たいはずなんで、多分」
「うん、うん、うん、うん、うん」
「そういうことはやっとくのかなって素人は思いました」
「うーん。まあちょっと具体的な手法はちょっと煮え切らない感じになってるんですけど」
「はい」
「チェックしたい項目はそのへんっていう感じですね」

「うん、うん」
「で、あとメモリのテスト」
「メモリのテスト?」
「うん」
「残ってるかをテストするのか?」
「あ、そういうこと、そういうこと」
「あー、なるほど」
「だから書き込んだデータがちゃんとそこから正しく取得できるかとか」

「うん」
「あと、えーっと、こ、これはどうやってテストするんだろうなっていう疑問はやや残ってるんですけど。あのデータ量が増大したりとか、あと状況が複雑になったときにも適切にほしい情報を取り出せるかっていう」
「へー。えー。なんかこのモデルはこの情報まで取れるけど、このモデルはこの情報まで取れないみたいなのがあると思ってて」
「あー」
「多分コンテキストが増えると」
「いや、えっとね、これモデルというか、これはね、多分データベースとかになると思うよ」
「あ、そうなんですか」
「うん」

「あんまりちょ、データベースって言ってるのって」
「うん」
「NoSQLのなんかのデータベースですか」
「えっとね、ベクトルデータベースっぽいことは書かれてる」
「で、そのベクトルデータベースからデータを参照するのって」
「うん」
「モデルがツールを経由して参照するんすよね、なんか」
「あー、てか待って、これね、えーとデータベースで言うと、まず複数あるわ」

「はい、はい、はい、はい」
「あの普通に、あのなんだ、ナレッジとして保存しておきたい情報とかもあるだろうから」
「そうですね」
「うん。あれ、ちょっと待って、今なんだっけ、質問なんだっけ」
「データベースってNoSQLか何か?」
「あー、まあそれは場合によるんじゃないかな。多分、えー、RDBの場合もあるだろうし」
「はい」
「NoSQLのケースもあると思う」

「はい、はい。まあでもデータベースエンジンがある何かのことをやっぱ指すんですよね?」
「うん」
「で、そこにアクセスするのはモデルが直接行ってるわけじゃなくて、ツール経由でモデルがデータを見に行くってことですよね?」
「そうなる」
「で、つまりデータベースにはなんかデータは多分とにかく蓄積されていって」
「うん」
「で、そこから適切なデータが参照できるかってモデルのさじ加減ってことで合ってますか」
「モデルのさじ加減なのかな。いや、でもセマンティック検索とかした結果正しい情報が取れてるかとかなんじゃないかな」

「セマンティック検索とは?」
「えーと、あれですね、あのーベクトルデータベースとかにまず情報を埋め込むじゃないですか」
「はい」
「で、えーそれを取り出すときの検索手法というか」
「はい」
「要は意味的に近いものが取られるみたいな」
「うん、うん、うん」
「ベクトル検索っすね」

「あー、じゃあそれはなんか何かしらの距離計算がプログラム的にされて」
「うん」
「で、それで近いものの上位何件か未伝数を」
「うん」
「バコッと渡すみたいな」
「あー、そう、そうだと思う」
「あー、それは確かにモデル関係ないかもしんないっすね」
「そう、そっちの取り出し側の、えーテストと思われる。っていうのも、えーとじゃあそのなんだ、データ量が増大したりとか状況が複雑になったりしても正常に動くかっていうのを試すためにいろんなことをするらしいんすけど」

「うん」
「書き込んですぐ取得するみたいなことをやったりとか。あと時間、時間を置いて取得するみたいなことやったりとか」
「それで変わるんすね?変わる可能性があるからやるんすね、そんなこと」
「まあ忘却されないようにみたいなことなんじゃないかな」
「あー、データベースはなんか永続的に残るものではなくて」
「うん」
「なんか永続的じゃないし、なんなら鮮度も何かしらの優先順位に関わるってことなんすね?」
「えーとね」

「その可能性があるというか」
「多分それ、これも使ってるデータベースによるんじゃないかなって気がするんだけど」
「あ、でもエンジニアがそういう情報をキャッシュに残しておくみたいな仕組みになってる場合とかだったら」
「はい」
「ほかの処理挟んだことによってそのキャッシュが吹き飛ばないかどうかみたいなこともテストするだろうしっていうイメージかな」
「へー、めんどくさ」
「うん。めんどくさいね、それは。めんどくさいっすね」
「そう。で、あとなんか、うーん、検索の精度みたいなところもテストするんですけど」

「はい」
「えーっと、例えばじゃあなんか同じような情報が時系列順にいろいろ入ってたとして」
「うん」
「古い情報を取ってしまわないかとか」
「うん」
「あとは言い回しとか意味が似てるけど関係ないデータとかが引っ張ってこられないかとか」
「うん、うん、うん、うん」
「そういう検索精度の部分をテストすることもあるし。あとは大量に情報が入ったときに、あのー検索時間がかかりすぎて、あの性能が落ちないかどうかみたいな。なんかこれはまあ普通に性能テストみたいな」

「はい、はい」
「のをやることもあるしっていう」
「へー、おもろ」
「で、あとあれだね、あのーデータベースとかが例えば止まってて、えー、あーちょっとこれは単体と言えるのかどうか微妙なんだけど。データベース、データベースが利用できない状況になってるときに、えーとエージェントが変な動きしないかとか」
「あー、まあ異常系の」
「うん」
「テストですね」
「そう、そう、そう、そう。へー、あーでもなんか、なるほど」

「うん」
「なるほどね。なんか、ま、モデルっていう不確実なやつが入り込んでるせいで、なんかやっぱユニットテストというよりは、なんだろうな、なんか非機能試験味があるというか」
「あるね、そう。だからなんかユニット、ユニット、まあ単体テストとは呼ばれてたんだけど、あんまりこれまでのシステムどおりのなんか単体テストとは考えないほうが良いかなっていう」
「うん、うん。そうですね」
「うん。やっぱなんかデータ量が多いときにどうなるかとかってね」
「うん、うん」
「機能試験じゃ絶対やんないから」
「これあれかもね、NotebookLMをテストしようと思ったときになんか想像すると分かりやすいかもしれないな」

「あ、そうなんだ。なんかNotebook」
「面白くないっすか」
「ね、NotebookLMってさ、結構その保存したさ」
「はい」
「あのソースに対して忠実に回答するみたいな」
「はい、はい」
「守られてるじゃないっすか」
「はい」

「だから多分これって、えーとメモリ機能としてはその保存されたファイルに対してのアクセスだと思うんすよ」
「うん」
「で、一方例えばじゃあこの障害に対するロバスト性みたいなのをテストしないといけないってなったときは、例えばそのファイルにアクセスできなかったときに、モデルが持ってる知識で回答しちゃわないかどうかのテストをしてるみたいな」
「うん」
「まあきっとそういうことをしてるんだろうなっていう」
「うん、うん、うん」
「なるほど」
「うん」

「いや、おもしろいですね」
「奥深いっすよね、これ」
「これなんかまだどうなんだろう、ちょっと手探り感あるんで」
「うん、うん、うん」
「今後もうちょっと整備されてくんじゃないかな」
「うーん。いや、絶対まだ発展段階でしょうね、このへんは」
「そうですね」
「で、あとラスト、あの学習に対しても単体テストあるんですけど」

「ん?学習に対するテスト?」
「学習に対するテスト?」
「どういうこと?」
「えっと、これはまあ、うーん、まあパラメトリックもノンパラメトリックもそうなんだけど、学習したことによって」
「はい」
「まあソースとかパラメーターがちゃんと更新されてるかどうかのテストとか」
「うん」
「あとは、えーそれをやったことによって一般化性能が落ちてないかの検証とか」

「へー。このぐらいの授業をしたんだから、こいつはこのぐらい算数の点数が上がるだろう。そして国語の点数は下がんねえだろうっていうテストするんすね?」
「そう、そう、そう、そう、そう、そう」
「いいですね」
「シビアな世界ですね」
「そう。まあっていうのを、まあ単体としてはまず積み上げていきますよと」
「だから結構意味あんのかな、それ。なんか算数の点数、このぐらい上がるかもしんないですけど」
「うん、うん、うん」
「それでもなんか別の算数のテストしたら下がってるかもしんないし」

「うん」
「だから別の国語のテストしたら、あとなんだ、だから、えー数歩の白い馬のテストの点数は下がんないけど」
「うん」
「権吉野の点数下がるみたいなことありそうじゃないですか」
「ありますね」
「ってことは」
「うん」
「それはテストとして機能してるのかという」

「まあでも全部テストしきるのはそもそも無理なんじゃないかなっていうスタンスでやんなきゃいけない気がする」
「うん、うん」
「うん」
「まあやんないよりはいいよねみたいな考え方なんすかね?」
「と思うよ」
「うん、まあ確かに派手にぶっ壊れたときはちょっと気づきたいっすね、さすがに」
「そう、そう、そう、そう、そう、そう」
「うん。まあそれはあるか」

「で、その上で単体やった上でE2Eやる必要がありますよと」
「うん」
「結局それぞれのモジュールが全部確率論的に動くので、モデルが関わってくることによって」
「はい」
「ってなったときにE2Eテストで一貫性をまずテストしましょうと」
「うわー、大変そうだなー」
「で、ここで言う一貫性は、あのー入力が多少ぶれても、同じようなことを言ってるなら同じような回答をしてほしいっていう一貫性ですね」
「うん、うん」

「へー、じゃあ何回かやるんすね」
「そう」
「このへんはまあ、あのベクトル検索に近いような手法で一致してるかどうかをチェックしてったりとかするらしいっすね」
「これずれてたらどうすんだろう。ユニットテストは通ってるけどE2Eでやってみたら一貫性がない、どうしようってなってどうしようってなりそう」
「いやー、まああとそうなると、でもあれじゃない?結局その単体、単体の部分のさ、ログとかは残してるだろうから」
「どこでずれたかを、が分かるか」
「気合いで探すんじゃない?」
「はい、はい」

「え、Diffyとか触ったことある?」
「ありますよ、はい」
「あのーDiffyってなんかワークフローをこう、なんだ、ノーコードでつないでって」
「フローズみたいな感じで」
「うん。で、それでまあ自分でAIエージェントっぽい動き作れますよみたいなツールですと。で、えーと、あれって入力に対してレスポンス返ってくるチャットボット作れるんすけど」
「うん」
「えー各ノードで何を入力されて何を出力したかっていうログが事細かに残るんすね」
「なんかね、クリックすると出るんすよね?そのパートを」

「あ、そう、そう、そう、そう、そう、そう、そう。だから、なんか出力にな、なんか入力に対して出力変だなってなったとき、1個1個のノードが何の入力を受けて何を出力してるかをこうチェックしてって、あ、ここがおかしいんじゃいってなって直すみたいな」
「うん、うん、うん」
「そういうことをするんですけど、まあ結構それに近いことが今回だったら単体テストを積み上げてることによってできるんじゃないかなという」
「まあ確かに」
「うん」
「あんまり作ったことないからだ、なんのかもしんないですけど、納期読みづらそうだな。なんかどっ、変なとこで詰まったりしそうだな」
「うーん、納期ね、確かに」
「はい。いや、おもしろい」

「うーん。で、あとコヒーレンス」
「ちょっと、あの聞いたことあるけどよく分かんないワードですね、コヒーレンス」
「コヒーレンスも、あのー個人的にはコヒーレンスのほうが一貫性っぽいなって感じの意味だったんすけど」
「はい」
「これは会話のラリーの中で整合性整ってるかどうかっすね」
「いや、評価もむずそうだな。どうやって評価するんだろう、それ。AIがやるのかな」
「ああ、そう、AIがやる」
「ああ、やっぱそうですよね」

「あまあ人がやるケースもあるけど」
「はい」
「まあAIでやったほうがいいよねって言ってたね」
「まあなんか人間はちょっとね」
「うん」
「職人じゃないとできないっすね」
「し、あのー量やれないよね」
「はい。ほんとに」

「うん」
「一貫、一貫性の鉄人じゃないと」
「うん」
「なんでこのコヒーレンスもチェックしていく必要があると」
「うん」
「で、あとハルシネーションチェック」
「えー、それどうやるの?」
「これもAIでチェックするのと人力チェックしかないんじゃないって気するけどね」

「まあそうですよね」
「で、これはなるべくAIをだますような文言入れたりとか」
「ほう、どういうことっすか」
「じゃあちょっと飲食店の予約みたいなイメージでいいっすか」
「はい」
「例えば、うーんと7月1日の19時に食べ放題コースを予約したいんですが、いくらですかっていう質問を投げるとするじゃないっすか」
「うん」
「で、これってちょっと難しいポイントとしては、料金を聞いてるのか予約したいのかが分からないっていう」

「あー、そうなんですね。なるほど」
「分からないというか、えー、やる可能性がある」
「はい、はい。うわ、なんか結構職人技ですね、それも」
「そうだよね」
「はい。そういうことなんすね」
「で、こういう絶妙な質問したときにAIが、えー相手の意図をちゃんと汲み取れてるかどうかとか」
「うわー。うわ、なんかセンスだな、それ」
「あとこれなんかモデルの性能にもめっちゃ依存するなと思ってて」

「そうですね」
「昔のモデルだとさ、例えば、あのハルシネーションを起こさせたいときに」
「はい」
「あ、もう1回僕あのClaude本気であのだまそうとして」
「え、何やってんすか」
「あのいろんなこうハルシネーション起きやすい文章みたいなやつをこうChatGPTに作ってもらったんすよ」
「はい」
「そしたら例えば、その100年前にあのニュースになったあの空飛ぶ座布団の事例について教えてくださいっていう質問すると」

「あー、なるほど」
「あった前提で回答を作ろうとするみたいな」
「うん、うん、うん、うん、うん」
「ま、そういう系のやつをいろいろ試すとかだよね、多分このへんは」
「うーん」
「とかあとエイ、エージェントだったら、うーん目的があるじゃないっすか」
「はい」
「あ、汎用すぎなければ」

「うん」
「だからその目的と全然関係ないやつ。例えばなんか医療のサポートのためのAIエージェントに、えーおすすめのラーメン屋さん教えてくださいっつって」
「うん」
「どう回答してほしいかみたいな」
「あー、なるほど」
「ちょっとハルシネーションとは違ったかもしんないけど」
「まあでも必要ですよね」
「そう、そういうなんか一筋縄じゃいかない質問に対してちゃんとあの一貫性を持って期待した回答をしてくれるかどうかのテストをしなきゃいけない」

「うーん、なんか一般的には何々以外は答えられませんって言ってよねっていうことになってるんですかね?」
「まあそうじゃないかな」
「うん」
「特に目的が明確なエージェントは」
「はい。まあだからなんかいろんな角度の質問に対する、なんか、てかそういう作りのほうがテストしやすいですよね」
「そう思う。そうだよね」
「だから関係ないことを言ってきたものに対して、えーすごくウィットに、とん、飛んだ感じでうまくかわしてくださいみたいな」
「うーん、うん、うん」

「そういうことを意図してる場合すごくテストむずそうですもんね」
「確かにね。それむずいな、確かに」
「はい」
「まあていうのを、まあE2Eのテストのときはチェックしていきますよと」
「うわー、大変だ」
「大変なんですよ。で、えーもっと言うと、えーここで結局全部をテストすることはできないと。まあこれ別に普通のプログラムも同じじゃないっすか。全パターンをテストするのはちょっと現実的じゃないっていう問題あるじゃないっすか」
「はい」
「で、えーそこで、えーそれがより顕著なのがこのまあAIエージェントなんですけど」

「うん」
「えーそうなったときに、えー監視が超重要になってきますよと」
「ほう」
「要はリアルタイムでAIエージェントがどう振る舞ったかをしっかり監視していって、変な動きしてないかっていうのをチェックするのが結局1番大事だよねっていう」
「うん、うん、うん、うん」
「で、そのためにログを取って可視化できるようにして、みたいな体制を築いて、えーAIエージェントの動きを常に監視していきましょうっていうのが、まあ1番安全な方法というかすごい重要になってきますよ」
「うん」
「っていうふうに言われてましたね」

「エーアイエージェントがなんか商用で動いてるときに1番やっちゃいけないことってなんですか」
「えー?」
「エラーが起きるってこと?それともなんか本当に不適切なこと言うとかってこと?」
「うーん、それはサービスの性質によりそうじゃない、なんか」
「はい。なんか監視をしていきましょうっていうのはなんか一体何を監視するんだろうという」
「あー、そういうことか」
「エラー率?」
「エラー率とかもじゃない?とか。あとはまあなんか、うーん。結局このE2Eテストでやってたことを監視でやってくんじゃないかなって気するけどね」

「うーん」
「一貫性とか。ハルシネーションとか」
「リリース後に一貫性を監視し続ける必要があるのは」
「うん」
「リリースしたあとに勝手に学習するからですか」
「いや、あれじゃない?あの結局確率論だから」
「はい」
「変なこと言うときあるよねっていう」

「あー」
「あ、まあもちろん学習も関係あると思うよ。あの学習した結果、なんだ、本番で動いてる環境の中で学習続けてった結果、変な動きするようになるみたいなこともあり得ると思う」
「あー、なるほど。なんかバグ、エラーバジェットだ。エラーバジェットの考え方みたいな感じで」
「うん」
「まあなんか100回に1回やべえ動きしてるけどまあいっかみたいな」
「うん、うん、うん、うん」
「そういう考え方もありつつ、なんか閾値超えないか見るみたいなイメージなんすかね?」
「あ、そうそうそうそうそうそうそう」

「はいはいはい。まあでもそうですよね。なんか全部潰すのは多分絶対無理だから」
「そう」
「なんかまあ自分たちなりにサービス品質考えて」
「うん」
「で、それを満たすような動きをしてるかを監視していくような感じなんすね?」
「そうなりますね」
「うーん。外形監視とかやんのかな?」
「うーん、どうなんだ。そういうところやるんじゃないか、もしかしたら」

「大変そうだけどな。まあやってたらおもしろいな。はい、ありがとうございます、すごい」
「まあていう」
「勉強になった」
「あらゆるパーツで不確実な動きをするっていう特徴があるんで、特、特性か。特性があるんで。えー結構テストも大変なんですけど。まあこういうふうに分解してテスト積み上げて、E2Eで。えー、まあ最終的な動きをチェックして、でそれを本番で監視し続けましょうっていうのがね、このAIエージェントにおけるテストのポイントになってます」
「うーん。ありがとうございます。いやなんか、そのAIエージェント、Diffy使ったことありますけど、あんまり作ったことがなくて」
「うん、うん、うん」
「で、今ののりさんの話を聞いて非常に解像度が上がったんですけど」
「はい」

「やっぱりなんか自分では使うことはいっぱいあるんで」
「うん」
「それこそね、ClaudeCodeとかもそうだと思うんすけど」
「うん、うん、うん」
「あのへんをなんかうまく使いこなすためにも、やっぱ1回自分で作ってみるの大事だなってやっぱ思いましたね、話を聞いてて」
「あー、確かにね」
「うん。いや、かっこよくない?」
「ハックしやすくねそう」

「まだ作ってないからなー」
「え、でもこれからなんすよね?」
「これからね。あー、まあDiffyとかでは作ってるけど。あれは」
「でもDiffyとかで使、作ってれば十分じゃないんすかね、概念」
「十分か」
「うん」
「個人的にはなんかあのー、アンソ、アンソロピックのさー、えーなんだっけ、エージェントビルダーみたいなやつ」
「あ、作ったことない。はい」

「なんだっけ、エージェントビルダーはOpenAIだっけ?」
「ググりましょうか」
「ちょっと特に名前ついてなさそうでした」
「はい」
「ClaudeConsoleって書いてます、左上に」
「特に名前ついてなさそうですね」
「で、多分OpenAIがエージェントビルダーだわ。まあなんかそういうのを使って作ってみたいもんですね」
「やりましょう」

「社内のプロジェクトマネジメントできるやつ作りたいわ」
「社内のプロジェクトマネジメントなー。切実ですね」
「弊社には明らかに欠落してるから」
「じゃあまあ、見えてる課題でいいですね」
「まあというAIエージェントのテストのお話でございました」
「ありがとうございます」
「いや、だいぶいったね」
「なかなか守備範囲じゃなくて。ありがたい」

「あー、まあ、な、まあ、なかなかまだやらんよな、このへん多分」
「やってる人はいるんですけどね。社内でもね、そのAIエージェントを開発してる案件はいくつかあるんで」
「あー、そうなんだ」
「はい。やってる人はいるんですけど」
「うん、うん、うん」
「ありがたい」
「まあちょっと」
「あと息継ぎ入ったら下がろうという気持ちだけ」

「いいね」
「あれやろうかな。えっと親族だけがアクセスできるアプリをホスティングしてるので」
「うん、うん、うん、うん」
「我が家の近況を聞いたらなんでも教えてくれるAIエージェントとか作ってみようかな」
「大丈夫かな、それ。コミュニケーション減らないかな」
「良くないかな。まあ良くないかもしんないっすね、確かに。ビデオ通話つなげばいいのにね」
「さあ、アフタートークいいっすか」
「いいですよ。さくっと。ここまで来たらすごい尺で」

「ね」
「はい」
「最近?」
「はい」
「朝?」
「はいはいはい」
「ジムに行ってるんですよ」
「あ、はい。なんか最近言ってますね」

「超人になろうの続きで」
「はい」
「マジ筋トレをさあ、1人でさあ、追い込む方法知りたいっす」
「はい。あー」
「マジです。心が、心が頑張れない」
「うわー、わかる。めっちゃわかる」
「追い込めねーってなる、なんか」
「実はめっちゃわかります」

「マジ?」
「なんかやっぱアドレナリン出てないといけないっすよね、その限界」
「あー、なんかダンスは結構さあ、なんだろうな、うーん、この動きをしようと思ってやってたら、ありえないぐらい力を使ってるみたいなことがあり得るんだけど」
「はい」
「筋トレってなんか、その集中、なんだろうな、その追い込みとさあ、やることがリンクしすぎてて」
「はいはいはいはいはいはい」
「頑張れないんだよなって感覚あるんだよね」
「えっと、これはじゃあちょっと教科書的なことを1つ言ってみていいですか」

「あるんだ、理論が」
「あー、あります」
「ほう」
「筋トレにおいて、えー、追い込むには負荷を軽くしていく。終盤にかけて」
「うーん」
「まあその負荷を軽くした上でどこまで追い込めるかはまああれなんすけど」
「うん、うん、うん」
「なんでしょうね、その使い切るイメージっていうんですかね」

「うーん、うん、うん、うん」
「なんかやっぱ負荷を軽くして、で、や、やり切るというか出し切ると追い込めるっていうのが、まあ教、教科書的によく言われるものですね」
「そうなんだ」
「はい。僕もあのハードな腕立てするときとかは」
「うん」
「腕立てって普通足と手ついてやるじゃないですか」
「足と手ついてやりますよ」
「はい。けど僕はハードな腕立てをするときは」

「うん」
「もう上がんなくなるんで膝ついてやるとか」
「ハードな腕立てが何?」
「えっと1つ、あの音声ではなかなか伝わりづらいんですけど、結構アクロバットの腕立てがあるんですけど」
「そうなんだ」
「はい」
「え、足ついてないとかそういうこと?」
「いや、いや、足はついてます、はい」

「足ついてんだ」
「ついてるんですけど」
「はいはい」
「でもそれだと負荷が高いとやっぱり追い込みきれないんで」
「うーん」
「で、膝ついて、で上がんなくなるまでやると、もう大変なことになります」
「あ、無事?」
「はい、無事」

「無事大変なことになる?」
「はい」
「そうなんだ」
「でウェイトとかも結局そうっていうんで。まあ自重取ればなかなか難しいんですけど、フォーム変えないと負荷は変えれないんですけど、ウェイトもやっぱり、あの本気マッチョのYouTube見てると」
「うん」
「やっぱウェイトを軽くしてってますよね」
「あー、そうなんだ」
「3セット目とか」

「いやー、そっか。ちょっとやってみます、明日」
「ちょっと、あのー、数時間後トライしてみてください」
「ほんとだね。また睡眠不足になりそうだ」
「いやー、素晴らしすぎる。いいっすね。ちょっと僕も」
「うん」
「行く気は入ったらジム契約するんで」
「マジで?」
「はい。ちょっと今、本当にやろうという気持ちを持たないまま宣言したんでやろうと思います」

「あー、マジか」
「はい。そういうの大事だよね」
「大事」
「俺も今のジムに乗り換えた瞬間、結構ノリで行ったんだよな」
「うわ、素晴らしいっすね」
「駅前でティッシュ配ってて」
「まんまと?」
「そう」

「もらってそのまま行って」
「あー、意味あるんだ、あのティッシュ。俺、ティッシュ絶対意味ねーだろって思ってたんすよ、世の中のティッシュ」
「はい。あー、まあ、えっと、それで言うと、もう元々、もう駅前に超目立つ形で、これからオープンします、ドーンみたいになってたから」
「はい」
「えっとね、別にそのティッシュが、あー、まあ決め手ではあったか」
「はい、だから意味あるね」
「認知には関係なかった。あー、でもそうね」
「うん」

「そのまま行く人あんまりいないんじゃないかな」
「まあでもそのちょっとのね、一押しをができればね」
「うん」
「ひとつ、一押しでが1人だけだったら多分割り合わないけど。それは何人、何人、10人ぐらいいるわ」
「いや、でもだいぶあれじゃない?ライフタイムバリュー高いんじゃない?」
「あ、そうか、確かにジムはそうか」
「うん」
「1人でも回収できんのか、確かに。できそう」

「ね。まあというので、ちょっとじゃあ軽くして追い込んでいきます」
「ちょっと追い込んでみてください。これでだめだったらちょっとまた相談してください」
「わかりました。え、やっぱ1パーツずつのがいいのかな?」
「いや、別になんでしょうね、そのメニューによって聞く場所違うじゃないですか」
「違う」
「で、複数箇所に聞くやつもあるじゃないですか」
「うん、うん。スクワットとか」
「あー、そうそうそう。それはそれでいいんじゃないですか」

「いいのかな」
「1パーツずつってどういう意味ですか」
「あ、いや、なんかさ、筋肉痛の場所があまりに多すぎたらさ」
「あ、そういうこと」
「なんか回復効果下がるとかないかなと思って」
「あー、どうなんだろう。確かになんか栄養分散するはずですよね、普通に考えてね」
「そうだよね」
「え、でも疲労感の問題ぐらいなんじゃないですかね?」

「あー、疲労感、まあそうな」
「まあ一部とは言わないっすけど、まあなんか体をね、4分割ぐらいして1/4ずつぐらいがいいんじゃないですか」
「4分割。あー、なるほどね」
「はい」
「腕、胴、足、ケツ」
「みたいな?」
「はい」
「みたいな。まあちょっと僕ジム、ね、順平のりさんに比べたら行ってる回数だいぶ少ないんで」

「でも理論知ってるから」
「まあ理論は」
「うん」
「社会人1年目から3年目まで行ってましたね、ジム」
「あ、そうなんだ」
「はい。朝起きて。行ってたな、偉」
「へー、そんな時期が」
「あー、いや、やめましたけどね、はい」

「やめたんだ」
「引っ越しをして、はい」
「あー、そういうことね」
「そう」
「あー、まあそれはあるあるだな」
「うん」
「引っ越しでジムなくなる説」
「そう。通える場所じゃないとね」

「うーん、うん、うん」
「ちょっとぜひ、あの、筋トレがちでリスナーにいると思うので、たくさん」
「いそうだね」
「のりさんに、追い込めないのりさんにちょっとアドバイスお願いします」
「もしくは応援の声をよろしくお願いします」
「確かに」
「はい。では締めていきます」
「はい」

「はい、この番組は皆様からの感想をSNSのXで募集しております。ハッシュタグ、ひまじんプログラマーを付けて投稿していただくと、僕らがそれを探して、えー、読み込んでいきますので、ぜひともよろしくお願いします」
「AIエージェント運用してる人のノウハウ教えてください」
「生の声聞きたいっすね、確かに」
「うん」
「あるあるとか聞きたい。なんかAIエージェントあるあるみたいな」
「あるあるね」
「おもしろあるあるいっぱいありそうだけどな」
「なんかそういうさ、あのー、なんて言うんだろうな、知らないけど近いあたりのさ、あるあるっておもしろいもんな」

「おもしろい」
「えー、あとは我々に直接こう質問をしたいとか感想を届けたいという方は、番組のエピソードの説明欄にあるGoogleフォームから投稿していただくと、我々がくまなくチェックをして、えー、そちらに対していいねという気持ちを持っていきますので、こちらもぜひともよろしくお願いいたします」
「全部読んでできる限り回答します」
「はい、努力します」
「またSlackでオンラインコミュニティ、ひまプロ談話室というものを運用しております。こちらですね、今現在300人ぐらいのエンジニアが、エンジニアとか、エンジニアになりたい人とか、もしくはエンジニアに近しいけどエンジニアではない方々とかが集まり」
「そうっすね」
「えー、日々こういうのをやりましたっていう報告に刺激を受け、受けつつ、受けられつつ。ん?受けつ与えつ」
「うん」

「持ちつ持たれつの関係で続けているコミュニティでございます。こちらもご興味ある方は番組の説明欄のGoogleフォームからお申し込みいただくと、サンクスページに参加用のリンクが貼られておりますので、そちらからご参加いただけると幸いです。入ったらぜひ自己紹介してみてください」
「バイバイしましょう」
「はい。えー、最後にこの番組は各種ポッドキャストプラットフォームで配信しております。参考になったという方がいらっしゃいましたら、ぜひとも星を付けて評価していただけると、番組配信の励みになっていきますので、こちらもご協力よろしくお願いします」
「お願いします」
「それではまた次回」
「バイバイ」
「初めて触ったMacBook。思い出がいっぱいのチーム開発。再起動したら直った謎のバグ。僕たち」
「私たちは卒業します」

「駆け出しエンジニアを卒業したあなたへ。ひまじんプログラマーの週末エンジニアリングレッスン、各種ポッドキャストで配信中」