3
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

「もっと早く知っていたら」を減らしたい。目標と興味から挑戦先を探すOPPOを作った

3
Last updated at Posted at 2026-09-22

共同制作者:@spheal363

1. このハッカソンを知ったきっかけは、ChatGPTだった

最近、ChatGPTにイベントを聞くことが増えていました。

興味のあるハッカソンを探したり、DJ関連のイベントを教えてもらったり。今回参加しているAI HACK 2026も、ChatGPTとのやり取りを通じて知りました。

一方で、調べるうちに、興味があるのに知らなかったイベントや、知ったときにはすでに参加できなかったイベントも見つかりました。「もっと早く知っていたら、行ってみたかった」と後悔することがありました。

そこで気づいたのが、何も知らないまま、挑戦する機会を逃しているのではないかということです。

イベントや募集はWeb上に公開されています。でも、公開されていることと、自分に届くことは違います。存在を知らなければ、参加するかどうかを考えることすらできません。

この経験をきっかけに、目標や興味に合う機会を探し、参加に向けて判断できる情報まで届けるサービスを作り始めました。

名前は OPPO(Opportunity Agent) です。
image.png

2. 自分では検索しなかった機会に出会いたい

例えば、「AIエージェントを作れるエンジニアになりたい」「将来は起業したい」「音楽やDJにも興味がある」という人を考えます。

「AI ハッカソン」と検索すれば、関連するイベントは見つかるかもしれません。でも、その人にとって価値があるのは、ハッカソンだけでしょうか。

音楽技術のコミュニティ、AIと音楽を扱う企業の募集、プロダクトを作る仲間に出会える勉強会も、目標につながる可能性があります。

ただし、自分で探す場合は、そうした選択肢を思いつく必要があります。

OPPPOでは、目標と複数の興味から探索の方向を広げます。目指すのは、自分では検索しなかった機会を、行動できるうちに届けることです。

そのため、成功を「何件推薦したか」だけでは測りたくありません。見つけた機会から、応募や参加、新しい挑戦が生まれたかを大切にしたいと考えています。

3. Opportunity Agentでできること

基本的な流れは、次の4つです。

  1. 目標・興味を入力する。
  2. Agentが検索計画を立て、複数の方向から候補を探す。
  3. 推薦された機会の理由、受付状況、参加条件を確認する。
  4. 気になる機会を保存し、申込先の確認や予定の追加へ進む。
  5. 次に検索する際は、いいねなどの指標から個人にカスタマイズされます。

oppoくんが探してくれます、かわいい

oppo.gif

結果はTOP3で表示

他の候補もまとめてカレンダー表記してくれます

タップすることで詳細やリンク表示、googleカレンダー登録ができます

4. ChatGPTで探すことと、何を変えたいのか

ChatGPTでも、希望に合うイベントは探せます。私たちが差別化したいのは、発見した機会を比較し、行動につなげ、その経験を次に活かす体験です。

Opportunity Agentでは、おすすめ3件にマッチ度と理由を添え、ほかの候補を日付順に表示します。月別カレンダーで開催時期を見渡し、気になる候補を保存して掲載ページへ進めます。受付や参加条件の未確認事項も分けて伝えます。

自動探索の仕組みも接続し、毎回探し直す負担を減らします。今後は「興味を持った」「参加した」「楽しかった」という反応や成果を次の検索に反映する自己改善ループを目指します。新しい検索経路へのフィードバック反映は未実装です。

さらに、同じ機会に興味を持つ人や、一緒に挑戦する仲間との接続も構想しています。検索結果を返すだけでなく、次の一歩を選び、経験を積み重ねるための場所を作りたいと考えています。

5. システム構成:検索・読解・評価を分担する

image.png

フロントエンドはReact+Vite、バックエンドはFastAPI、保存にはSQLiteを使用し、AIの呼び出し窓口はOrcaRouterに統一しています。

当初はSerperで検索、Jinaで本文取得、Jevで粗選別する構成を試しました。しかし今回の実装・検証では、処理時間と費用に対して希望に合う候補が少なく、一覧ページから個別イベントへ進めない問題もありました。各サービス単体の優劣ではなく、組み合わせた探索設計に課題がありました。

現在は検索専用モデルの内蔵Web検索で、希望ごとに並列探索し、不足する方向を追加で調べます。候補を整理した後、AIがまとめてマッチ度と推薦理由を評価し、おすすめ3件を選びます。

結果はカード・月別カレンダー・日付順の一覧で表示します。全件の本文再取得は行わず、マッチ度と情報の確認状態を分け、掲載元へ進める設計にしました。

  1. 希望が消える、候補が減る、古い結果が混ざる――開発でぶつかった問題

最初の問題は、希望が後段へ正しく伝わらないことでした。「音楽を楽しみたい」「ポケモンのイベントに行きたい」と入力しても、要約や検索計画を通るうちに「音楽×技術」「ゲーム開発」へ置き換わっていました。そこで入力原文を保存し、それぞれの希望を独立して探索する形に変更しました。

候補が減る原因も、検索だけではありませんでした。イベント一覧を粗選別で落としていたことや、東京の会場を地域不一致と判定する不具合がありました。「結果が少ない=イベントが存在しない」とは限らず、検索・取得・判定を分けて調べる必要がありました。

さらに、ホームには全探索の候補が混ざり、以前の希望に基づくおすすめが残っていました。キャッシュを疑いましたが、原因はデータの参照先でした。最新の完了した探索を表示するよう統一し、探索時の希望も一緒に保存することで、結果と入力の対応を保つようにしました。

7. 改善の結果:速さ・費用・品質を分けて見る

最初は、検索・本文取得・評価をどう組み合わせれば、速く、安く、良い候補を探せるかを考えていました。

試したのは、TavilyとLLMを使う構成A、評価をJevへ置き換える構成B、Serper+JinaにJevの事前選別を組み合わせる構成Cです。同じ保存済み検索計画でAとCを比較すると、探索時間は132秒から100秒へ、OrcaRouter費用は約0.177ドルから約0.094ドルへ減りました。

数字だけを見ると改善です。しかし、肝心の結果は満足できませんでした。音楽イベントを探しているのに一覧ページで止まり、東京を希望しているのに沖縄の候補が混ざる。取得や判定の不具合も重なり、処理は軽くなっても、行きたいと思える機会に出会えない状態でした。

転機になったのが、OrcaRouter経由で使える検索専用モデルです。これをAgent Loopから呼び出す探索Toolとして組み込み、希望ごとに並列検索し、候補が足りない方向だけ追加で調べる構成に変えました。

希望別の並列探索では、約15.5秒・約0.23ドルで日程付き候補が10件出ました。一括依頼では拾えなかった音楽イベントやハッカソンも含まれ、イベント名・日程・会場を見て「参加したいか」を考えられる結果になりました。追加探索を含む検証では、発見工程約50.5秒・約0.62ドルで23件を提示できました。

ここで、OrcaRouterの便利さを実感しました。モデルを呼び出す窓口としてだけでなく、検索専用モデルを探索Toolとして使い、候補の評価も同じ窓口から呼び出せる。検索処理を自分たちで細かく組み立てることに集中していましたが、検索を任せ、アプリ側は希望の扱いと結果の見せ方に集中することで、体験が大きく変わりました。

ただし、新旧では処理範囲が異なるため、単純な速度・費用の比較ではありません。AとCの費用も検索・本文取得分を含まず、各1回の観測です。また、23件から20件に整理する過程には人手の訂正が含まれ、日付の誤りや過去開催の混入も残りました。

改善できたのは、まず「具体的な候補を、短い時間で比較できること」です。現在はマッチ度と情報の正確さを分け、未確認事項と掲載元を表示しています。候補を広く見つけることと、安心して行動できる情報を届けること。その両方を、引き続き改善していきます。

8. ビジネスとして成立するのか

現時点では、事業としての可能性はまだ仮説段階です。ただ、価値があるのは検索時間の短縮だけではなく、人とのつながりを通じて、知らなかった機会に出会い、参加につながることではないかと考えています。
ユーザーには「自分に合う機会や、一緒に参加する仲間を見つけたい」という需要があり、主催者には「その機会に関心のある人へ届けたい」という需要があります。この両側をつなげられれば、個人向けの継続探索・個別化や、提供者向けの告知・マッチング支援に対価を払ってもらえる可能性があります。
まず確かめたいのは、候補を何件出せたかよりも、「自分では見つけられなかった機会を知れたか」「実際に参加してよかったか」です。その体験が継続利用や支払意思につながるかを、探索・運用の原価とあわせて検証します。
収益化の方法はまだ決めていません。提供者から料金を受け取る場合も、広告と本人の希望に基づく推薦は区別し、自分のために探してくれるサービスへの信頼を守りたいと考えています。

9. 今後の展開:人と人、機会を提供する側もつなぐ

ToC:同じ機会に興味を持った人とつながる

機会を見つけても、一人で参加することにはハードルがあるかもしれません。

同じイベントに興味がある人や、近い目標を持つ人、一緒にハッカソンに出る仲間とつながれれば、発見から参加までを支えられます。

例えば「AI開発にも音楽にも興味がある人」が、同じ募集をきっかけに出会い、一緒にプロジェクトを始める。そんな体験も将来的に作りたいと考えています。ユーザー間のマッチングは、現時点では未実装です。

ToB:Personal AgentとProvider Agentをつなぐ

個人側には「自分に合う機会を見つけたい」という課題があります。一方、イベント主催者や企業、大学、コミュニティには「この機会に合う人へ届けたい」という課題があります。

将来的には、個人を支援するPersonal Agentと、提供者を支援するProvider Agentをつなぐ構想を持っています。

例えば、主催者が求める参加者像と本人の目標が合いそうなときに、Personal Agentが機会を提示します。本人が許可するまで、提供者側へ個人のプロフィールは渡さないことを原則にしたいと考えています。

収益化の候補は、Provider Agentの月額利用、マッチングに対する料金、明確な成果に対する報酬などです。どの相手に、どの成果で課金できるかは、これからの検証対象です。

推薦への信頼を守りながら広げる

提供者から収益を得るとしても、支払いだけで推薦を優先する仕組みを中心にはしたくありません。自分のために探してくれていると思えなくなれば、Personal Agentとしての価値が失われるからです。

長期的には、本人の同意のもとで「どの機会に反応し、どんな行動を取り、どんな結果につながったか」を推薦改善へつなげたいと考えています。

目標は、人と機会の両側に価値を提供するネットワークです。ただし、ユーザーが増えれば自然に成立するものではありません。まずは一人のユーザーに、参加してよかったと思える機会を届けられるかを確かめたいです。

10. 現在地と、これから

現在のOPPOは、OrcaRouter経由の検索専用モデルを探索Toolとして組み込み、希望別の並列検索、不足時の追加探索、候補の評価、画面表示までをつないでいます。探索全体の進行はアプリ側で管理し、検索はモデルの内蔵Web検索に任せる構成です。

現在できること これから取り組みたいこと
希望を独立して探索し、不足する方向を追加検索 希望ごとの取りこぼしを減らす
マッチ度・理由付きのおすすめ3件を表示 日程・会場・参加条件の正確さを高める
月別カレンダーと日付順一覧で候補を比較 参加までの操作を分かりやすくする
定期的な自動探索 新しい機会を適切なタイミングで通知する
候補の保存・フィードバックの記録 反応や参加後の感想を次の推薦に活かす
掲載元へのリンクで行動を支援 ユーザー同士やProvider Agentとの接点を作る

ただし、検索結果のすべてを本文と照合しているわけではありません。マッチ度は希望との適合度であり、情報の正確さや受付中であることの保証ではありません。現在の探索経路では、保存したフィードバックを次の検索・評価へ反映する部分も未対応です。

今回の開発で学んだのは、処理を速く安くするだけでも、候補を多く並べるだけでも足りないということでした。入力した希望がそのまま届くこと、日程を見ながら比較できること、分からないことを分からないまま示すこと。その積み重ねが、「見つかった」から「行ってみよう」への距離を縮めるのだと思います。

このハッカソンに参加できたのも、ChatGPTとの会話で情報に出会えたからでした。

今度はOPPOが、誰かにとって、新しい挑戦や人との出会いのきっかけになればと思っています。

コード・実装資料

3
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?