Vertex AI Matching Engineを使ってみる
より新しい記事: Vertex AI ベクトル検索を使ってみる
Vertex AIを有効化しておく
Matching Engine APIを使用してインデックスを作成できます
https://gyazo.com/c92a2439f14717a64bc395c50be79b2a
実験のうちは最も安いリージョンを選んでおく
初期データを保存するGCSバケットも同じリージョンに作ること。multi regionはだめ。
Vertex AI: Node.js Client
Node.jsから呼び出してみよう
どのAPIが関係するかは叩きながら考える
Cloud Run jobsを触ったときと雰囲気が似ている
未実装のメソッドが多くて結局これは使えず、素朴にfetchするしかなかった daiiz.icon
実験リポジトリ
https://github.com/daiiz/vertexai-matching-engine-demo
v.icon Create Index #1
OpenAIの text-embedding-ada-002 で得られる1536次元のembeddingを使った
v.icon Create IndexEndpoint #2
v.icon Deploy Index #3
v.icon Run Query #4
v.icon Create STREAM_UPDATE Index #5
1で作ったIndexはindexUpdateMethodがBATCH_UPDATEだったので作り直し
Vertex AI Index "projects/349.../locations/us-central1/indexes/568..." compaction finished
v.icon Undeploy an Index from a IndexEndpoint #6
v.icon Upsert datapoints #7
v.icon Remove datapoints #8
PaLM API textembedding-geckoでembeddingを生成する #9
PaLM APIの textembedding-gecko@001 で得られる768次元のembeddingを試す
PaLM API textembedding-gecko 日本語未対応、残念!
v.icon やっぱりOpenAIのembeddingを使う #10
あとで読みたくなりそう
Manage indexes | Vertex AI | Google Cloud
REST Resource: projects.locations.indexes | Vertex AI | Google Cloud
インデックスを構成する | Vertex AI | Google Cloud
Deploy and manage index endpoints | Vertex AI | Google Cloud
public endpoint (認証必須) の作成方法
GoogleCloudPlatform/matching-engine-tutorial-for-image-search
これそのものは目指さないけれど参考になる
https://gyazo.com/ca0e5e173636033340d2fa79442985ba
さらに先: 検索クエリ発行
Match_service.find_neighbors
matching_engine_for_indexing.ipynb
stream_update_for_matching_engine.ipynb
ベクトル一致をフィルタする | Vertex AI | Google Cloud
この論理フィルタは柔軟で凄い
検索時にどうやって指定するのか
Matching Engine: Queries with filtering do not work as expected #1230
Vertex AI Matching Engineでフィルタ機能を使う (Python)
Update and rebuild an active index | Vertex AI | Google Cloud
Protocol Buffersの定義を読み解く
Node.jsのClient libraryを使ったサンプルコードが世に無いので自分で引数を考えて組み立てるしかない
https://github.com/googleapis/google-cloud-node/blob/main/packages/google-cloud-aiplatform/samples/generated/v1beta1/match_service.find_neighbors.js (findNeighbors関数の呼び出し)
https://github.com/googleapis/google-cloud-node/blob/main/packages/google-cloud-aiplatform/protos/google/cloud/aiplatform/v1/match_service.proto#L64 (FindNeighborsRequest, Query)
https://github.com/googleapis/google-cloud-node/blob/main/packages/google-cloud-aiplatform/protos/google/cloud/aiplatform/v1/index.proto#L126 (IndexDatapoint)
https://github.com/googleapis/google-cloud-node/blob/main/packages/google-cloud-aiplatform/protos/google/cloud/aiplatform/v1/match_service.proto#L126 (FindNeighborsResponse)
~~~
https://github.com/googleapis/google-cloud-node/blob/main/packages/google-cloud-aiplatform/protos/google/cloud/aiplatform/v1/index_service.proto#L242 (UpsertDatapointsRequest)
upsertDatapoints
疑問
STREAM_UPDATEモードでupsertしてから検索可能になるまでの時間
ただちに可能
upsertされたデータポイントはインデックス作成時に指定したGCSに永続化されるの?
されない。Elasticsearchの運用と同様に永続化は別でやっておくべき。upsertする前にGCSに保存しておけばいい。次回のインデックス構築時の初期データとしてもそのまま使える。
ストリーミング更新で追加されたものを含めてデータポイント数を確認するには?
不明
大きいneighbor_countで検索して全件取得する方法しか思いつかない daiiz.icon