株式会社ノベルワークス
home

TOP

keyboard_arrow_right

ブログ一覧

keyboard_arrow_right

OSS版 DeepResearchを使って、ドメイン検索エージェントを作る

ざわっち

2025/06/18

OSS版 DeepResearchを使って、ドメイン検索エージェントを作る

こんにちは!

ノベルワークス所属のザワッチです!

先日、Google GeminiのLangGraphサンプルをXで見かけて、「これ、ドメイン調査に特化させたら面白そう」って思い立って改造したら、思いのほかおもしろいものができてしまったので共有します。

はじめに:なぜドメイン調査ツールを作ろうと思ったか

新しいWebサービスを作るとき、まず最初にやることってドメイン取得ですよね。

でも、いちいちお名前.comとかムームードメインとか開いて、ドメイン検索して、WHOIS調べて、SSL証明書の状態確認して...って、めんどくさくないですか?

そこで「全部AIでぜんぶやっちゃえばいいやん」と思いつきました。

元になったプロジェクト

ベースにしたレポジトリは、汎用的なDeepResearchのような動きをする調査エージェントになります。

Web検索をしてレポートに近い出力をしてくれるReactフロントエンドとLangGraphバックエンドエージェントを使ったフルスタックアプリケーションサンプルになります。

実をいうと、このレポジトリの構造がめちゃくちゃ綺麗で改造しやすいです。

以下、実装機能をまとめます。

主な機能

ドメインさえ抽出できているという前提で、AIかまさずに実現している機能と、AI使って実現している機能があります。

あと、検索履歴をduckdb-wasmを使って実装しています。(触ってみたかっただけ)

  1. ドメイン可用性チェックcheck_domain_availability() - ソケット解決でリアルタイム確認

  2. WHOIS情報の詳細取得Google Search API経由で実際のWHOIS情報を検索登録日、有効期限、所有者履歴まで取得

  3. SSL証明書の完全分析check_ssl_certificate() - 証明書の有効性確認SSL Labs評価結果も自動取得

  4. セキュリティ評判調査マルウェア、フィッシング、ブラックリスト全チェック過去のインシデント履歴も調査

  5. トラフィック・SEO分析ドメインオーソリティ、被リンク状況推定トラフィック量も取得

  6. ローカル検索履歴(DuckDB WASM)SQLでの履歴検索ページリロードしても消えない永続化(OPFS使用)

  7. 次にとるべき行動がわかりやすいようなフォローアップ質問の生成AIの応答に基づく次のアクション提案ワンクリックでさらなる深堀り調査可能

技術的なポイント

LangGraphでの状態管理

バックエンドでは backend/src/agent/graph.py で LangGraph を使って、「検索→分析→反省→再検索→統合」という複雑なプロセスをグラフ定義で管理しています。

下が公式が出してる概要図です:

agent.png

生成にはGemini モデル活用して、
・検索クエリの自動生成
・検索結果に対しての反省(知識の抜け・偏りの検出)
・最終回答文の組み立てと引用挿入

を行います。

最初の検索結果が不十分であれば、自動で「反省」「更なる検索」「再度反省」を最大ループ数まで繰り返します。

今回は、ドメイン検索に特化するということで、ドメイン分析専用のノードを追加しました:

def domain_analysis(state: OverallState, config: RunnableConfig) -> OverallState:
      # 技術的チェック(DNS、SSL、HTTP)
      domain_info = analyze_domain_info(domain)

      # 実際のWHOIS、評判、トラフィックデータを取得
      response = genai_client.models.generate_content(
          model=configurable.query_generator_model,
          contents=formatted_prompt,
          config={"tools": [{"google_search": {}}], "temperature": 0}
      )

具体的な検索クエリの生成

ドメインの詳細調査をするにあたって、以下の項目をWebで検索させています。

実際のデータを取得するように指示をかなり強化していて、以下はその例です:

  1. WHOIS情報の詳細検索:

    "{domain} WHOIS" で検索し、登録者情報、登録日、有効期限を確認"{domain} domain registration date" で登録履歴を調査

  2. セキュリティ・評判の詳細調査:

    "{domain} malware check" でマルウェア検出状況を確認"{domain} blacklist status" でブラックリスト登録状況を確認

書ききれないほど、いろいろやっていますが、処理フローを図で起こしました。

Duckdb-wasmとOPFS

duckdbを導入したのはいいものの、永続化するにはIndexedDB使わないといけないなど、あんまりスマートじゃないなと思って色々調べていると、Origin Private File System(OPFS)という存在に気づき、使用することにしました。

https://developer.mozilla.org/ja/docs/Web/API/File_System_API/Origin_private_file_system

ブラウザ内部の仮想ファイルシステム領域を各オリジンに割り当てられており、実際の OS 上のファイルツリーとは異なり、ブラウザが内部的に管理するデータベースやストレージ領域 上に保存されます。

ということで、ユーザがそのファイルを閲覧できない点がかなりセキュアであり、ほんでもって、バイナリの読み書きという低レベルアクセスがduckdb-wasmととても相性がいいとのこと。

先駆者たちが記事を残されていたので、とても参考になりました!

https://zenn.dev/akabana/articles/24ba54f63ae9b1

https://zenn.dev/voluntas/scraps/08e6065facbefd

完璧じゃないけど、動けばよし!の精神ではありますが。

実装してみて使ってみた

ホーム画面

ほぼほぼもとのUIと一緒です。
海外のSaaSになんかありそうな感じにチューニングしました。

image.png

履歴表示画面

image.png

分析画面

動画です。

使ってみてわかったこと

  1. langgraphでエージェンティックな深堀り機能は作れる
    ちゃんとプロンプト書けば、WHOIS情報もSSL評価も検索して取ってきてくれる

  2. どこまで深ぼって調べるのかその線引きが難しい
    エージェント特有の問題ですが、コストの兼ね合いもあり、どこまで自律的に検索させていくかをちゃんと考える必要がある。

  3. 検索エージェント系はこのご時世、もうユーザ向けじゃなくてMCPサーバとして実装するべきか?
    簡単に作れちゃうというのがわかった以上、MCPサーバとしてAIによって呼び出されるのに特化してしまったほうがいい。こうなったら、フロントエンドを実装する必要がなくなってしまう。

ちょうど書いてるときにでてきたやつ↓:

おわりに

Google GeminiとLangGraphを組み合わせることで、個人的には使えるドメイン調査ツールを作ることができました。

正直、最初は「ドメインが取れるかどうかわかればいいや」くらいに思ってたんですが、作り込んでいくうちにWHOIS情報からSSL評価、トラフィック推定まで取れるようになって、自分でも驚いてます。

次は、ドメインの自動取得まで実装してみたい。。