Vespaにチャレンジ

Vespa(ベスパ)について、紹介していこうと思います。

Vespaは高機能な検索エンジンです。ベクトル検索(ANN)、語彙検索、構造化データの検索が一つのクエリで可能です。さらに、統合された機械学習の推論を利用することで、データをリアルタイムで分析し、AIでの解析もできます。大規模なデータも扱えるので、様々なプロジェクトで利用できると思います。

Vespa自体は、歴史がある検索エンジンで、2017年にApacheライセンスでオープンソースとして、公開されています。過去には、Yahooのサービスなどでも利用されていたりもしたので、実績もあると思います。最近では、Vespa自体がスピンアウトして、会社になったようなので、普及に向けて、やる気を出してきた感じがあります。その会社では、クラウドサービスであるVespa Cloudを提供していく感じだと思います。

とはいえ、現状、普及している感じがない気がしてます…。ちょっと理由を考えていくと、

そもそもVespaという単語をググると、ほぼバイクしか、ヒットしないので、ググって情報を探すというのも困難です。あとは、公式サイトのドキュメントは充実している感じはあるのですが、欲しい情報を得るまでにいろいろと見ないとよくわからない、という学習コストの高さがあるようにも思います(個人的な見解ですが…)。

他にもrank-profile的なスキーマを書かないといけないところも難易度を上げている気もします。Elasticsearchでいうなら、マッピングを定義した後に、独自のSimilarityも定義しないといけないみたいな…。

それら以外にも、Yahooが提供している日本語の情報もあったりするのですが、古いので、手順通りにはできないので、雰囲気を掴むくらいにしか使えなかったりと…。欲しい情報にたどり着くのに苦労する感が…。

という感じの壁を乗り越えないと、使えない感じだと思います。ですが、他にはない興味深い機能があったりと、製品としては魅了があるものだと思います。

とりあえず、この敷居を下げるために(&自分自身の学習のために)、いろいろと情報を提供していければと思います。

まずは、簡単に使ってみましょう。Vespaを試すためには、

  • Docker (4GB以上のメモリーが利用可能であること)
  • vespaコマンド

があれば、試すことができます。詳しくはQuick Startとかを参照してください。

まず、vespaコマンドをインストールします。Macであれば、brewコマンドでインストールできます。

$ brew install vespa-cli

Linuxとかであれば、リリースサイトからVespa CLIをダンロードして、vespaコマンドにパスを通せばよいです。

では、早速、Dockerで起動しましょう。

$ docker run --detach --name vespa --hostname vespa-container \
--publish 8080:8080 --publish 19071:19071 \
vespaengine/vespa

8080ポートが検索やインデクシングするときに利用するもので、19071ポートはConfigサーバーのエンドポイントになります。

Vespaを利用するにはアプリをデプロイする必要があります。今回は、vespaコマンドでサンプルアプリを作成&デプロイします。

以下のコマンドを実行して、myappディレクトリにアプリが作られます。

$ vespa clone album-recommendation myapp && cd myapp

いくつかファイルが作成されますが、schemas/music.sdがスキーマ定義で、services.xmlがサービスの設定になります。この2つがわかれば、何とかなります。

今回は、さくっと試すだけなので、それらの中身の話は置いておいて、デプロイしてしまいましょう。

$ vespa deploy --wait 300

とすると、デプロイされます。

デプロイされたら、ext/documents.jsonlにあるドキュメントをフィードしましょう(データをインデクシングしましょう)。

$ vespa feed ext/documents.jsonl
{
  "feeder.seconds": 0.230,
  "feeder.ok.count": 5,
  "feeder.ok.rate": 5.000,
  "feeder.error.count": 0,
  "feeder.inflight.count": 0,
  "http.request.count": 5,
  "http.request.bytes": 724,
  "http.request.MBps": 0.001,
  "http.exception.count": 0,
  "http.response.count": 5,
  "http.response.bytes": 658,
  "http.response.MBps": 0.001,
  "http.response.error.count": 0,
  "http.response.latency.millis.min": 227,
  "http.response.latency.millis.avg": 227,
  "http.response.latency.millis.max": 227,
  "http.response.code.counts": {
    "200": 5
  }
}

フィードすると、情報が出力されます。”feeder.ok.count”が5なので、5件登録しました。

検索はYQLを利用して、たとえば、以下の感じで検索できます。albumにheadが含まれるもの的な。

$ vespa query "select * from music where album contains 'head'" \
language=en-US
{
    "root": {
        "id": "toplevel",
        "relevance": 1.0,
        "fields": {
            "totalCount": 1
        },
        "coverage": {
            "coverage": 100,
            "documents": 5,
            "full": true,
            "nodes": 1,
            "results": 1,
            "resultsFull": 1
        },
        "children": [
            {
                "id": "id:mynamespace:music::a-head-full-of-dreams",
                "relevance": 0.16343879032006287,
                "source": "music",
                "fields": {
                    "sddocname": "music",
                    "documentid": "id:mynamespace:music::a-head-full-of-dreams",
                    "artist": "Coldplay",
                    "album": "A Head Full of Dreams",
                    "year": 2015,
                    "category_scores": {
                        "type": "tensor<float>(cat{})",
                        "cells": {
                            "pop": 1.0,
                            "rock": 0.20000000298023224,
                            "jazz": 0.0
                        }
                    }
                }
            }
        ]
    }
}

あとは、ID指定で取得もできます。

$ vespa document get id:mynamespace:music::a-head-full-of-dreams
{
    "pathId": "/document/v1/mynamespace/music/docid/a-head-full-of-dreams",
    "id": "id:mynamespace:music::a-head-full-of-dreams",
    "fields": {
        "artist": "Coldplay",
        "year": 2015,
        "category_scores": {
            "type": "tensor<float>(cat{})",
            "cells": {
                "pop": 1.0,
                "rock": 0.20000000298023224,
                "jazz": 0.0
            }
        },
        "album": "A Head Full of Dreams"
    }
}

今回は、この辺にして、Dockerでstopすれば終了します。

$ docker stop vespa

以上の感じで、DockerとVespa CLIがあれば簡単に試すことができます。

今後もこんな感じで、いろいろと紹介できれば良いなと思います。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です