NLWebで広がる新たな対話型ウェブサイトの世界
はじめに
2025年の Microsoft Build で「NLWeb」(Natural Language Web)が発表されました。
ウェブサイトを対話型のAIアプリにするための「NLWeb」について紹介します。
NLWebは、ウェブ上で自然言語を用いた対話型のインターフェースを実現するための基盤となることを目指しています。これにより、ユーザーは従来のクリック操作や検索機能に頼らず、チャットしながらサイト内の情報を直接問い合わせることができます。
NLWebとは何か?
ウェブサイトにAIによる対話型インターフェースを実装することは、個々のウェブサイトで実装が必要であり、コストがかかります。NLWebは、これを簡単に実現できるように設計されたオープンプロトコルとオープンソースツールの集合体です。
-
自然言語APIの統一性
NLWebは、自然言語での問い合わせインターフェースを提供するだけでなく、同じAPIを人間だけでなくAIエージェント(チャットボットやアシスタント)にも利用できる仕組みを、ネイティブにMCP(Model Context Protocol)をサポートします。 -
Webサイトの構造化データの活用
ウェブサイトで利用されているSchema.orgやRSSなどの構造化フォーマットは、意味のあるデータ層(セマンティックレイヤー)として機能しています。NLWebはこれらのフォーマットを活用し、自然言語インターフェースの構築を大幅に簡素化します。 -
AI Webの基盤としての役割
HTMLがかつてウェブにおける情報共有を変えたように、NLWebはAI時代のウェブの基盤となることを目指しているようです。
プラットフォームやAI・データストアとの互換性
NLWebは非常にプラットフォーム・ベンダーに依存しない設計となっており、以下の点が特徴です。
-
マルチプラットフォーム対応
Windows、MacOS、Linuxなどの主要OSで動作できます。 -
多様なベクトルデータベースとの連携
Qdrant、Snowflake、Milvus、Azure AI Searchなどとの連携ができます。
(CosmosDBが入ってほしいな...) -
複数のLLM(大規模言語モデル)のサポート
OpenAI(OAI)、Deepseek、Gemini、Anthropic、Inceptionなど、主要なモデルにも対応しています。 -
軽量かつスケーラブル
クラウドの大規模クラスターから個人のラップトップ、さらには近い将来はスマートフォン上でも稼働できる設計になっているようです。
ウェブサイト運営者へのメリットと導入事例
NLWebの導入により、ウェブサイトはユーザーに対して、従来の静的なナビゲーションではなく、会話形式での情報提供が可能になります。たとえば、レストランサイトで「今夜予約できるイタリアンは?」と問い合わせると、条件に合致した店舗情報が瞬時に返ってくるといった利用シーンが考えられます。
NLWebとMCP(Model Context Protocol)
MCPは、AIアシスタントやチャットボットが各種ツールと連携して動作するための新たなプロトコルです。
すべてのNLWebインスタンスはMCPサーバーとして動作します。サイトに対して自然言語で質問を投げ、その回答としてSchema.orgに基づく情報が返されます。
HTTPとHTMLの関係性に例えるなら、MCPは、NLWebにおけるHTTPのような役割を担い、ウェブ上での統一されたコミュニケーション手段の役割ですね
NLWebの仕組み
NLWebは、大きく「プロトコル」と「実装」の2つの要素から構成されています。
1. 自然言語プロトコルとレスポンスフォーマット
-
自然言語でのインターフェース
ユーザーがウェブサイトに対して自然言語で問い合わせできるようにします。 -
JSONとSchema.orgベースのフォーマット
サイトから返される回答は、JSON形式とSchema.orgを組み合わせた形式を採用しており、これにより、返答内容が構造化された形で提供されます。 -
REST APIのドキュメント
後述のREST APIの章で解説します。
2. マークアップを活用したシンプルな実装
-
既存マークアップの有効活用
製品情報、レシピ、観光地、レビューなど、リスト形式で表現できるコンテンツを対象とし、既存のマークアップ情報を利用して対話型インターフェースを構築します。 -
UIウィジェットとの連携
使いやすいユーザーインターフェースを組み合わせることで、サイト利用者が自然言語で問い合わせを行える環境を提供します。 -
チャットクエリの処理
後述の「チャットクエリの処理の流れ」セクションで詳しく解説します。
NLWebのREST APIについて
NLWebでウェブサイトに対話型インターフェースを簡単に実装できる仕組みとしてREST APIが用意されています。
NLWebのAPIエンドポイント
NLWebには、以下の2つの主要なAPIエンドポイントがあります。
-
/ask
- ユーザーの自然言語の質問を受け取り、最適な回答を返します。
-
/mcp
- MCP(Model Context Protocol)対応のフォーマットで回答を返します。
- MCPクライアント向けに最適化されており、追加のコア機能(
list_tools
、list_prompts
、call_tool
、get_prompt
)をサポート。
この2つのAPIはほぼ同じ機能を提供しますが、/mcp
エンドポイントはAIエージェント同士のやりとりを考慮したフォーマットで結果を返します。
APIリクエストの仕組み
必須のパラメータ
APIを利用する際に、必須となるパラメータは以下の1つだけです。
-
query
(自然言語の質問)
例:{ "query": "近くのおすすめのレストランは?" }
オプションのパラメータ
より細かく制御するために、以下のオプションパラメータを指定できます。
パラメータ | 説明 |
---|---|
site |
特定のサイトのデータのみを対象に検索するための識別トークン |
prev |
過去のクエリのリスト(コンマ区切り) |
decontextualized_query |
文脈を整理したクエリ(これを提供すると、サーバー側の処理は不要) |
streaming |
デフォルトは true 。リアルタイムで結果を返さない場合は 0 や false を指定 |
query_id |
クエリID(指定なしの場合は自動生成) |
mode |
list (デフォルト)、summarize 、generate
|
mode
の種類
-
list
(デフォルト)- 問い合わせた内容に最も関連性の高い情報のリストを取得
-
summarize
- リストの情報を要約し、要約と詳細リストの両方を返す
-
generate
- LLM(大規模言語モデル)を利用し、RAG(Retrieval-Augmented Generation)の仕組みで回答を生成
APIのレスポンス構造
APIから返されるデータは、JSON形式のオブジェクトで提供されます。
レスポンスの構造
{
"query_id": "123456",
"results": [
{
"url": "https://example.com/restaurant",
"name": "美味しいレストラン",
"site": "グルメ情報サイト",
"score": 0.85,
"description": "このレストランは地元で人気のイタリアンです。",
"schema_object": { /* Schema.org形式のデータ */ }
}
]
}
レスポンスの主な要素
フィールド | 説明 |
---|---|
query_id |
クエリの一意な識別子 |
results |
検索結果のリスト |
url |
結果の情報があるウェブサイトのURL |
name |
検索結果のタイトル |
site |
情報の提供元サイト |
score |
検索結果の関連度スコア(高いほど関連性が高い) |
description |
LLMによって生成された説明文 |
schema_object |
Schema.org形式のデータ(構造化された情報) |
チャットクエリの処理の流れ(Life of a Chat Query)
「リスト型のデータを持つサイト」(レシピ、イベント、商品、書籍、映画など)に適しており、すでに多くのサイトで採用されているSchema.orgの構造化データを活用することで、AIによる検索や応答ができます。
NLWebのチャットクエリの特徴はこれらです。
✅ Schema.orgを活用した高精度検索
✅ データベースから直接情報取得(誤情報の回避)
✅ AIによる文脈整理・スコアリングで最適化
✅ 高速検索のためのFast Trackルート搭載
✅ 要約機能や高度な応答処理も可能
NLWebがユーザーの質問(チャットクエリ)をどのように処理し、最適な回答を生成するかの流れを整理します。
1. ユーザーが質問を送信
まず、NLWebは、ユーザーから自然言語での質問を受け取ります。例えば、レストランの情報サイトで「今夜予約できるイタリアンレストランは?」という質問をした場合、NLWebはその質問の意味を理解し、適切な回答を提供するための準備を始めます。
2. クエリの分析・処理
質問が送信されると、NLWebは以下の複数のステップを並行して処理します。
-
関連性のチェック
質問がサイトの内容と関連性があるかを確認します。 -
文脈を整理(デコンテキスト化)
過去の会話履歴を参照し、質問が正しく理解されるように調整します。例えば、以前の質問が「近くのレストランは?」だった場合、次の質問「イタリアンは?」を「近くのイタリアンレストランは?」のように補完します。 -
記憶するべき情報の抽出
ユーザーが今後の会話で利用する可能性がある情報を識別し、必要であれば一時的に保持します。
場合によっては、質問が複数の小さな質問に分割されることもあります。また、質問の内容によっては、さらに詳しい情報が必要と判断し、さらなる情報を求める応答を返すこともあります。
3. 高速検索の最適化(Fast Track)
多くの質問は「検索クエリに近い」傾向があるため、NLWebは迅速な処理を行うための「Fast Track(高速検索)」ルートを用意しています。
Fast Trackルートでは、質問の文脈整理や分析を軽量に実行し、適切な回答を素早く検索できます。
4. データベース検索と回答生成
-
データベースへの問い合わせ
質問(デコンテキスト化後のクエリ)がデータベースに送信され、適切な回答を取得します。
NLWebは、ベクトルデータベースを利用し、検索結果をTF-IDFスコアと構造化データの条件を組み合わせた方法で抽出します。
データはSchema.orgのフォーマットを用いたJSONオブジェクトとして返されます。 -
検索結果のスコアリング
取得した検索結果に対して、LLM(大規模言語モデル)を使い、関連性のスコアを算出します。スコアが一定のしきい値を超えた結果をユーザーに提供します。 -
オプション:結果の要約
もしユーザーが要約を求めた場合は、検索結果を統合して簡潔な回答を作成します。
LLMが複数の情報を組み合わせて要約を生成します。
5. ユーザーへの回答の表示
最終的に、整理された情報がJSON形式で返され、NLWebのUIやAPIを通じてユーザーに表示されます。
返されるデータの構造
{
"query_id": "123456",
"results": [
{
"url": "https://example.com/restaurant",
"name": "イタリアンレストラン A",
"site": "グルメ情報サイト",
"score": 0.85,
"description": "このレストランは地元で人気のイタリアンです。",
"schema_object": { /* Schema.orgの構造化データ */ }
}
]
}
主な要素
フィールド | 説明 |
---|---|
query_id |
クエリの一意な識別子 |
results |
検索結果のリスト |
url |
該当情報のURL |
name |
結果のタイトル(レストラン名など) |
site |
情報の提供元サイト |
score |
関連性スコア(高いほど精度が高い) |
description |
LLMによる要約された説明 |
schema_object |
Schema.org形式で整理された構造化データ |
まとめ
ウェブサイトに自然言語での対話型インターフェースを実装するためのNLWebを紹介しました。
実際に動かした結果や、さらなる詳細についても確認してみようと思います。
Discussion