NLWebを体験してみた

2025年の Microsoft Build で「NLWeb」(Natural Language Web)が発表されました。
Microsoftは考案したプロジェクトであり、
自然言語でWebサイトのコンテンツを照会できることを目標としているそうです。

現状、この仕組みで実現される未来像は見えてないですが、amazonで「来週キャンプに行くからキャンプ道具一式買いたい」と入力したら、LLMで必要なキャンプ用品を列挙して、それぞれのamazonでの購入ページを教えてくれるという仕組みが簡単に作れるということですかね?

NLWebの仕組み

Githubリポジトリでフロー図が記載されてます。がよくわかりません。
ざっくり以下だと理解してます。

  1. ユーザーが検索文字列を投げる
  2. ユーザーからの検索内容を分析しつつ、DBに格納されたWebの情報を照会
  3. ???
  4. DBの情報をユーザーのリクエストに合う順にランク付け
  5. ユーザーに結果を返却

NLWeb起動してみた。

Githubリポジトリにクイックスタートの方法がありますので、実際に動かしてみました。
OSはWindows11で基本は記載通りの手順通りにできました。

1-4は手順通りで問題ないです。ソースコードダウンロードして、pythonの実行環境を準備してます。

git clone https://github.com/microsoft/NLWeb
cd NLWeb
python -m venv myenv
myenv\Scripts\activate
cd code
pip install -r requirements.txt
copy .env.template .env

5ではLLMのAPIKeyが必要になります。
私はAzure OpenAIを利用しました。デフォルトではgpt-4.1、gpt-4.1-mini、text-embedding-3-smallを使うように設定されており、それぞれモデルのデプロイが必要だと思います。

#config_llm.yaml
  openai:
    api_key_env: OPENAI_API_KEY
    api_endpoint_env: OPENAI_ENDPOINT
    models:
      high: gpt-4.1
      low: gpt-4.1-mini # gpt-4.1に書き換えて動かしました。
#config_embedding.yaml
  azure_openai:
    api_key_env: AZURE_OPENAI_API_KEY
    api_endpoint_env: AZURE_OPENAI_ENDPOINT
    api_version_env: "2024-10-21"  # Specific API version for embeddings
    model: text-embedding-3-small

config_llm.yamlのlow: gpt-4.1-miniはgpt-4.1に書き換えて動かしました。
というのも、Azure OepnAIにはクォータという制限があるようで、申請しないと任意のリージョンでモデルを立てられないようです。また、各モデルで建てられるリージョンも限られており、とりあえず動かしたかったのでモデル変えてます。
デプロイしてないモデルだと以下のエラーが出ました。

openai.BadRequestError: Error code: 400 - {'error': {'code': 'unavailable_model', 'message': 'Unavailable model: gpt-4.1-mini', 'details': 'Unavailable model: gpt-4.1-mini'}}

Azure OpenAIで必要なモデルをデプロイした後は

手順4でコピーした.envの以下のところに設定します。

# .\NLWeb\code\.env

AZURE_OPENAI_ENDPOINT="https://TODO.openai.azure.com/" #②を設定
AZURE_OPENAI_API_KEY="<TODO>" #①を設定

また、手順通りconfig_retrieval.yamの1行目をqdrant_localに書き換えました。

#config_retrieval.yam
preferred_endpoint: qdrant_local 

手順6では参照するWebサイトのRSSを設定します。
このサイトから日頃見ているサイトであるGIGAZINEとZennを設定しました。

python -m tools.db_load https://gigazine.net/news/rss_2.0/ gigazine
python -m tools.db_load https://zenn.dev/feed zenn

最後にサーバー起動して完了です。

python app-file.py

NLWeb動かしてみた

起動すると以下の画面が表示されます。

「AIのニュースを教えて」と聞くとそれっぽい記事を挙げてくれました。

EdgeのMicrosoft CopilotではAIが自律的に検索するので、あまりサイトの指定ができないですが、
NL Webだと指定したサイトに特化してAIが検索+回答してくれるということですかね。
以下の点はわかってないです。

  • どれくらいコストがかかるのか。
  • LLMはどこから情報を持ってきているのか。手順6で登録時に持ってきた情報のみですかね?
    そうなると、対象にRSSデータを保持+公開してないといけないですね。
  • 複数モデルを指定したが、どのモデルの制度がどの部分に効いてくるのか

今後、ブラウジングの体験がどのような進化を遂げていくのか楽しみですね。