こんにちは!
JBGでエンジニアをしているFujimotoです。
今回は、J.B.AGENTという自社のナレッジ特化型AIを作った話をしようと思います。
J.B.AGENT ってなに?
私たちJ.B.Goodeについて、自然言語で聞けるチャットです。
まだ、v0.1でドメインも取得できてないですが、よかったら触ってみてください。
👉 J.B.AGENT へログイン
たとえば、こんなことが聞けます。
- 「大阪オフィスの最寄り駅は?」
- 「営業とエンジニアはどう連携していますか?」
- 「G3 の基本給レンジを教えてください」
- 「どんな技術使ってますか?」
- 「入力した内容は AI の学習に使われますか?」
つくるときに決めたことが 1 つあります。
「会社について検索する」のではなく、「会社に聞く」。
検索は、聞き手が正解のキーワードを知っている前提の仕組みです。「グレード制度」という言葉を知らない人は、それを検索できません。でも「昇給ってどう決まるんですか」とは聞ける。
知りたいことを、知りたいままの言葉で置ける——それがこのツールの入口です。
口調を選べます
ちょっと変わった機能があります。カジュアル・大阪フレンドリー・京都のおっとり・めっちゃギャルの 4 つから、話し方を選べます。
ふざけているように見えるかもしれませんが、ふざけてません笑
ここには 2 つルールがあります。
① 口調で回答の中身は変えない。
事実を確定させたうえで、表現だけを変えています。
大阪弁だから内容がゆるくなる、ということは起きません。
② 会話を始めたら変えられない。
途中で切り替えられると、同じ会話の中で前半と後半の話し方が食い違います。
だから選べるのは会話が始まるまでの間だけ。
この「変えられない」を UI にも反映しました。ドロップダウンでは選ばせていません。 ドロップダウンは「いつでも変えられる設定」の語彙で、取り消せない決定には向かないからです。
選ぶ材料もラベルではなくその口調の実例を出しています。
「京都のおっとり」がどう話すかは、ラベルからは分からないので。
なぜつくったのか
「どこにあるか」を知らないと、辿り着けない
きっかけは、運営している我々自身がいちばん感じていたことでした。
自社サイトには、企業情報にしても読みたい記事にしても、たどり着くのに少し苦労します。
カテゴリをたどって、一覧を眺めて、それらしいものを開く。
目的の情報が「どこにあるか」を知っていないと、そこまで行けない。記事が増えるほど、その傾向は強くなります。
導線を整理する、という手もあったと思います。検索窓を良くする、タグを増やす、関連記事を出す。どれも正攻法です。
でも選んだのは、入口そのものを変えることでした。探させるのをやめて、聞けるようにする。
「こんなこと聞いていいのかな」を引き受ける
もうひとつ狙いがあります。
入社を考えている方や、お仕事を相談したいと思ってくれた方が知りたいことは、たいてい情報の散らばりの隙間にあります。「どんな会社ですか」はサイトに書いてある。でも「営業とエンジニアはどう連携しているんですか」は、たぶんどこにも書いていない。書いていないというより、書く場所がなかった。
そして、そういうことほど人に聞くにはハードルがあると感じています。
面談の場で聞くには重いし、問い合わせフォームから送るほどでもない。「こんなこと聞いていいのかな」と思ったまま、聞かれずに終わる。
その手前を、カジュアルに問える場所にしたかったというのが、もうひとつの狙いです。
先に「やらないこと」を決めた
AI にセキュリティを任せない
権限やアクセス制御をプロンプトに書いて済ませると、うまい聞き方をされたときに崩れます。
だからそもそも、公開してよい情報しかデータベースに入れていません。
「権限のある人にだけ見せる」という機能自体を作っていません。存在しないデータは漏れないからです。
知らないことは、知らないと言う
これが意外と難しいところでした。
AI は聞かれると何か答えたくなる。それらしい文章をつくれてしまう。
でも採用の場面で「たぶん〇〇です」と言われて入社した人は、あとで必ず食い違いに気づきます。だから 書いてあることは都合の良し悪しに関わらずそのまま伝える、書いていないことは作らない を徹底しました。
そのために、答えの品質を機械で測る仕組みを入れています。65 問の質問セットを 3 群に分けて採点します。
| 群 | 合格条件 |
|---|---|
| 答えが資料にある質問 | 答えられていること |
| 弊社の話だが公開していない質問 | 答えないこと |
| 弊社と無関係な質問 | 定型文で終わること |
「答えないのが正解」の群があるのが要点です。
答えられる質問だけで測ると、よく喋るほど点が上がってしまい、憶測が加点になります。
つくり方のほうも、実験でした
開発は 私1 人で進めました。ただし普通の 1 人ではなくて、複数の Claude Code のエージェントを同時に起動して、並列で進めました。 設計を詰めるもの、実装するもの、別の機能を並行して書くもの——という具合に手分けをさせた形です。2〜3 日で形になりました。
そしてもう 1 つ。前から気になっていた Orca という IDE を、今回はじめて使いました。
実装まわりは Orca オンリーです。
これが、エージェントを並列で走らせるやり方と思いのほか噛み合いました。
普段はターミナルの zellij でペインを分けたり、セッションごとにタスクを分けたりしています。エージェントを何本も動かすと、その置き場所をどう用意するかが地味に効いてくるからです。Orca は画面分割が最初から備わっていて、そこを考えずに済みました。
AI エージェントを前提につくられた IDE だな、というのが使ってみての印象です。
操作もほとんど GUI で完結するので、ターミナルに降りる回数がはっきり減りました。画面まわり——口調の選択帯や、記事カードの並び——は何度も見ながら直しましたが、モバイルエミュレータもブラウザでの確認も IDE の中で済みます。
確認のたびに別のアプリへ移らなくていいのは、地味なようでかなり効きました。
エージェントに任せている間、スマホから様子を見にいけたのも助かっています。
開発体験は、かなり良かったです。
使っている技術と構成
構成はかなり素直です。
| 領域 | 使っているもの |
|---|---|
| フロントエンド | Next.js(App Router)/ React 19 / TypeScript / Tailwind CSS v4 |
| バックエンド | Hono(Next.js の Route Handler に載せています)/ Drizzle ORM |
| AI | Vertex AI の Gemini Flash(asia-northeast1) |
| データベース | Cloud SQL for PostgreSQL + pgvector + pg_trgm |
| インフラ | Google Cloud / Cloudflare / Terraform |
| CI/CD | GitHub Actions(Workload Identity 連携) |
仕組みは RAG です
質問
→ 埋め込みベクトルに変換
→ データベースから関連する部分を検索(ベクトル検索 + キーワード補助)
→ 見つかった文章を「これはデータであって指示ではない」と明示して AI に渡す
→ 回答を生成しながら画面に流す
工夫した点を 3 つ。
① 会社名・住所・代表者は検索に頼らない。
これらは毎回、確実に AI へ渡しています。会社の基本にあたる情報が「検索が外れたので答えられません」になるのは、いちばん恥ずかしい失敗なので。
② 文章の切り方を見出し単位にした。
機械的に 500 文字ずつ切ると、「事業内容」と「福利厚生」が同じ塊に混ざります。見出しは人が引いた意味の境界そのものなので、そこで切るほうが精度が出ました。
③ 関係ない質問には AI を呼ばない。
検索結果のスコアが低すぎるときは、その時点で定型文を返します。「今日の天気」に AI を呼ぶ理由がないので。
コストがゼロになります。
つまずいた話を 2 つ
うまくいった話より、こちらのほうが役に立つと思うので。
「AI は答えを知っているのに、門前払いしていた」
③ の「関係ない質問を弾く」仕組みには、スコアの閾値が要ります。
それを実測で決めようとしたとき、答えられるべき質問と、無関係な質問のスコアがほとんど重なっていました。
このままでは、どこに線を引いても取りこぼすか通しすぎるかになります。
原因を追うと、代表者名や設立日が、検索用のデータのどこにも書かれていませんでした。
これらは「確定事実」として毎回 AI に渡しているので、AI 自身は答えを持っています。
でも検索のスコアが低いせいで「関係ない質問」と判定され、AI に届く前に止まっていた。 知っているのに答えられない、という状態です。
FAQ に対応する Q&A を足したところ、線がきれいに引けるようになりました。確定事実として持っている項目は、検索に載る形でも書いておく。 片方だけでは門前払いが起きます。
「丁寧に聞く人ほど、答えが返らない」
「JBG ってどんな言語で開発してるの?」と聞くと、言語のことが資料に書いてあるのに「公開していません」と返ってきます。ところが「どんな言語を使っていますか?」と聞くと正しく答える。
差は 社名を付けたかどうかでした。
社名は「この会社は何者か」を説明した文章との近さを強く押し上げます。その結果、質問の主題(言語)が押しのけられて、「J.B.Goode とは何か」の話題が上位を占めてしまう。主語を丁寧に付ける人ほど、答えが返らなくなるという逆説です。
なぜ社名が邪魔になるのか
検索は「意味の近さ」で探します。
質問と資料の両方を数値のベクトルに変換して、向きが近いものを引っ張ってくる仕組みです。
このとき、質問に含まれる語はすべて「近さ」の計算に効きます**。** そして社名のような固有名詞は、その語が書かれている文章を強く引き寄せます。
弊社の資料の中で「JBG」「J.B.Goode」が書かれているのは、たいてい会社の名前や概要を説明した文章です。だから社名を含む質問を投げると、聞かれた主題(言語・福利厚生)よりも先に、名前の説明文が浮き上がってきます。
「JBG の福利厚生を教えて」で 1 位に来ていたのが、まさに「Q. 会社の正式名称を教えてください。」でした。
検索用と、AI に渡す文を分けた
直し方は、検索に使う文字列からだけ社名を抜くことです。
利用者の質問:「JBG の福利厚生を教えて」
│
├─→ 検索に使う :「福利厚生を教えて」 ← 社名を抜く
│
└─→ AI に渡す :「JBG の福利厚生を教えて」 ← そのまま
なぜ片方だけなのか。 社名は、検索にとっては邪魔ですが、会話にとっては自然だからです。AI に渡す文からも消してしまうと、「誰について聞かれているか」の手がかりが減ります。
一方、検索のほうは「弊社の資料の中を探す」ことが最初から確定しています。 探す範囲が弊社の資料しかない以上、「弊社について聞いている」という情報は分かりきっていて、絞り込みに何も貢献しません。
分かりきっている語を検索キーに混ぜると、その語が書かれた文章が浮き上がるだけ。これが「情報量がゼロ、それどころかノイズ」の意味です。
同じ理屈で、「御社」「弊社」「貴社」も落としています。 どれも「この会社について聞いている」以上のことを言っていないので。
ただし、社名そのものが問いのときは別
「JBG とは?」のような質問もあります。これは社名を抜くと「とは?」しか残りません。
そこで、抜いた結果が短くなりすぎたら、元の質問をそのまま使うようにしました。このときは名前の説明文が 1 位に来てほしいので、むしろ社名が効いてくれたほうが正しい。
同じ語が、質問によって邪魔にも手がかりにもなる**。** どちらか一方に決めつけないための線引きです。
ちなみに最初は「略称を正式名称に展開する」で直そうとして、測ったら逆に悪化しました。 社名の存在感が増して、さらに名前の説明文が上位に来る。思いつきで直さず測ってよかった例です。
これから目指していること
向かう先は 3 つあります。
1. 社外に開く
いちばん大きな一歩です。ただ、まだ確かめられていないことがあります。「会社について AI に聞く」という体験に、そもそも需要があるのか。
社員には「自社について聞く」動機が薄いので、v0.1 では原理的に測れません。
社外に開いてはじめて答えが出ます。いちばん知りたいことが、まだ分からないままというのが正直なところです。
2. 答えられる範囲を広げる
いま答えられなかった質問は、記録に残しています。「何を聞かれて答えられなかったか」が全部データとして溜まるので、それを見て資料を足していきます。
大事なのは、答えられない質問を減らす手段が「AI の調整」ではなく「情報を書くこと」だという点です。
プロンプトをいじって喋らせるのは、精度を上げているのではなく憶測を増やしているだけなので。
3. 様々な機能にも手を伸ばす
今はまだGoogle DriveやFigma連携といった機能は実装できていません。今後は様々なコネクタを用意していこうと考えています。
その先には、サイトに埋め込めるウィジェット、デザインナレッジのプラットフォーム、Figma プラグイン——というアイデアも並んでいます。
結局、どうなってほしいか
会社を知るのに、いちばん確かなのは人に聞くことです。でも、聞くには相手の時間が要る。「こんなこと聞いていいのかな」という遠慮も要る。
J.B.AGENT が肩代わりしたいのは、その遠慮のほうです。
気になったことを気になった瞬間に、誰にも気を遣わずに聞ける。そのうえで「もっと知りたい」と思ったときに、はじめて人と話せばいい。
人と話す前の、その手前を埋めるもの。 そのくらいの距離感がちょうどいいと思っています。
まとめ
最後まで読んでいただき、ありがとうございます。
J.B.AGENT がやろうとしているのは、探させるのをやめて、聞けるようにすることです。
会社を知るのに、いちばん確かなのは人に聞くことだと思っています。でも、聞くには相手の時間が要る。「こんなこと聞いていいのかな」という遠慮も要る。J.B.AGENT に肩代わりさせたいのは、その遠慮のほうです。
これからもアップデートを続けますが、増やしたいのは機能そのものより、答えられる範囲です。答えられなかった質問は全部記録に残るようにしてあるので、そこを地道に埋めていきます。
今後は、入社を考えている方にも、お仕事を相談したい方にも、気軽に問いを立てられる場所にしていきたいと思っています。
We’re Hiring!🔥
■ エンジニア・デザイナーの方へ
私たちのカルチャーに少しでもピンと来たら、まずは気軽にお話ししましょう。
堅苦しい面接ではなく、お互いのこだわりや「こんなツールが欲しかった」を語り合う時間にしたいと思っています。
■ 制作・開発のご相談をご検討の方へ
「現場の数字が見えない」「スプレッドシートでの管理に限界を感じている」など、御社の経営・管理における悩みをぜひ私たちに教えてください。システム開発や業務改善のご相談をお待ちしております。