Upgrade to Pro — share decks privately, control downloads, hide ads and more …

LanceDB入門

 LanceDB入門

第67回 MLOps/LLMOps/AgentOps 勉強会 (https://mlops.connpass.com/event/401457/) の発表資料です。

Avatar for Tomoko Uchida

Tomoko Uchida

August 11, 2026

More Decks by Tomoko Uchida

Other Decks in Technology

Transcript

  1. LanceDB “LanceDB is the AI-native Multimodal Lakehouse, the unified foundation

    to accelerate training dataset development.” LanceDBは、AIネイティブなマルチモーダル・レイクハウスであり、トレーニング用 データセットの開発を加速させるための統合基盤です。 https://www.lancedb.com/ OSS版: https://github.com/lancedb/lancedb コアはRustで書かれていて、Pythonなどのバインディングあり 5
  2. マルチモーダルレイクハウス?? 最近は、マルチモーダル対応のEmbeddingモデルも増えてきた • Gemini Embedding 2 • Jina Embedding v5

    omni などなど Embeddingモデルについては以下スライドも参照ください 【2026年版】 ベクトル検索とEmbedding最前線 7
  3. DuckDBとの違い 似ている点 • Object Storage + Embedded Database + SQL

    Query Engine と いう構成の点で、とてもよく似ている。 異なる点 • • LanceDBは、RRFなど検索に特化した機能が充実していて full-fledged検索エンジンとしても使える。 LanceDBは、後述のファイルレイアウトレベル(Lance)で、ベクトル 検索やマルチモーダルデータへの最適化を目指している。 ◦ LanceのDuckDB拡張もある。 10
  4. AWS S3 Vectorsとの違い 似ている点 • S3をバックエンドストレージとして使う。スケーラビリティやコスト面 で類似。 異なる点 • •

    LanceDBはAWS S3, Google Cloud Storage, Azure Blob Storageを統一的に扱う。(arrow-rs-object-store) LanceDBは全文検索も備える。S3 Vectorsに全文検索はない。 参考記事: 話題の組み込み型のベクトルデータベース LanceDB を Amazon S3 と Amazon Bedrock で試してみた - DevelopersIO 12
  5. 検索エンジニアから見る LanceDB 「AI検索アプリケーション開発に必要な機能全部入りのデータ層 」 • • • • • •

    • Full Text Search Index (全文検索) ANN Index (ベクトル検索) RRF support (ハイブリッド検索) BTree/Bitmap Index (メタデータフィルタリング) Embedding Model Integration Reranker Integration Blob Storage (マルチモーダルデータの保存) さらに Object Storage + Embedded DBな構成で、検索クラスタ構築が不 要 13
  6. 検索エンジニアから見る LanceDB Object Storage + Embedded DBってプロダクションの検索エンジンとして使え るの? => 勉強中でプロダクション運用はしたことがないのでわかりません

    😅 => 事例(後述)はちらほら見える => レイテンシやトラフィック要件によっては合いそう => ワークロード次第だがコストメリットは大きそう => もし運用できることになったら続報を出したいと思います 14
  7. インストール(公式 SDK) Python $ pip install lancedb TypeScript $ npm

    install @lancedb/lancedb Rust $ cargo add lancedb 16
  8. ストレージ・ DB接続 Local File System >> db = lancedb.connect("/path/to/db_dir") Object

    Storage >> db = lancedb.connect("s3://bucket/path") # AWS S3 >> db = lancedb.connect("gs://bucket/path") # GCS >> db = lancedb.connect("az://bucket/path") # Azure Blob 18
  9. テーブル操作 - CREATE TABLE # From JSON / Object list

    data = [ {"id": "C0001", "name": "ステンレスタンブラー", …}, {"id": "B0002", "name": "オープンイヤーイヤホン", …}, {"id": "D0003", "name": "コットンTシャツ", …} ] table = db.create_table("products", data) 19
  10. テーブル操作 - CREATE TABLE # From Pandas (or Polars) Dataframe

    data = pd.DataFrame({ "id": ["C0001", "B0002", "D0003"], "name": ..., …, }) table = db.create_table("products", data) 20
  11. テーブル操作 - CREATE TABLE # From Arrow Schema schema =

    pa.schema([ pa.field("id", pa.string()), pa.field("name", pa.string()), …, ]) table = db.create_table("products", schema=schema) 21
  12. テーブル操作 - CREATE TABLE # From Pydantic Model # LanceModelはPydantic

    BaseModelの拡張 class Product(LanceModel): id: str name: str … table = db.create_table("products", schema=Product) 22
  13. テーブル操作 - CREATE TABLE w/ Embedder # Configure Embedding Provider

    for Ollama model = ( get_registry().get("ollama") .create( name="qwen3-embedding:4b", host="http://localhost:11434") ) 23
  14. テーブル操作 - CREATE TABLE w/ Embedder # Pydantic Model with

    Embedding Provider class Product(LanceModel): id: str name: str = model.SourceField() vector: Vector(model.ndims()) = model.VectorField() … table = db.create_table("products", schema=Product) (Embedding Providerは使わずにvector fieldのみ定義も可) 24
  15. テーブル操作 - ADD/DELETE ROW # Add rows new_data = [{"id":

    "F0004", "name": "LEDランタン", ...}] table.add(new_data) # Delete rows # 削除フラグを立てるのみで物理削除はcompaction時に実行 table.delete('name = "LEDランタン "') 25
  16. テーブル操作 - ADD/DROP Column # Add columns new_cols = {"in_stock":

    "cast(true as boolean)"} table.add_columns(new_cols) # Drop columns table.drop_columns(["in_stock"]) 26
  17. テーブル操作 - VERSIONING data = [ {"id": "C0001", "name": "ステンレスタンブラー",

    …}, … ] table = db.create_table("products", data) print(f"Version:{table.version}, Rows:{table.count_rows()}") => Version:1, Rows:3 初期データにバージョン1が振られる 28
  18. テーブル操作 - VERSIONING new_data = [ {"id": "F0004", "name": "LEDランタン",

    …, ] table.add(new_data) print(f"Version:{table.version}, Rows:{table.count_rows()}") => Version:2, Rows:4 スキーマ・データ更新操作の都度バージョンがインクリメントされる 29
  19. テーブル操作 - VERSIONING # Restore previous version table.restore(1) print(f"Version:{table.version}, Rows:{table.count_rows()}")

    => Version:3, Rows:3 リストアするとバージョンはインクリメントされる 30
  20. テーブル操作 - COMPACTION # Optimize table # バージョン更新の都度増えるFragmentファイルを大きなファイルに マージする #

    削除フラグを立てた行をデータファイルから削除する table.optimize() # Clean up old versions table.optimize(cleanup_older_than=timedelta(days=1)) 31
  21. インデックス操作 - CREATE SCALAR INDEX # Create BTree index table.create_index("price",

    config=BTree()) # Create Bitmap index table.create_index("category", config=Bitmap()) # Create LabelList index table.create_index("color", config=LabelList()) 32
  22. インデックス操作 - CREATE FTS INDEX # Create FTS index with

    Lindera Tokenizer for Japanese table.create_index("name", config=FTS(base_tokenizer="lindera/ipadic")) # Create FM index table.create_index("id", config=Fm()) 33
  23. インデックス操作 - CREATE VECTOR INDEX # Create IVF-PQ index with

    Cosine similarity table.create_index("vector", config=IvfPq(distance_type="cosine")) # Create IVF-HNSW-SQ index with Cosine similarity table.create_index("vector", config=IvfHnswSq(distance_type="cosine")) 35
  24. 検索 - Filtering by Scalar index # Filter results by

    scalar indices result = ( table.search() .where("price >= 3000") .where("category = 'audio'") .to_pandas() ) 37
  25. 検索 - Full text search result = ( table.search( query="コットン",

    query_type="fts", fts_columns=["name"]) .limit(10) .to_pandas() ) 38
  26. 検索 - Vector search w/ Embedder result = ( table.search(

    query="コップ", query_type="vector", vector_column_name="vector") .limit(10) .to_pandas() ) (Embedding Providerは使わずにfloat列を直接指定しても良い) 39
  27. 検索 - Hybrid search w/ RRF Reranker result = (

    table.search( query="コップ ", query_type="hybrid", fts_columns=["name"], vector_column_name="vector") .rerank(RRFReranker()) .limit(10) .to_pandas() ) 40
  28. Lance (Lance Format) “The open lakehouse format for multimodal AI.”

    マルチモーダルAIのためのオープンなレイクハウスフォーマット https://lance.org/ ソースコード: https://github.com/lance-format/lance もうちょっと技術的にわかりやすく言うと、新しい列指向データフォーマットとその操作の 集合です。 開発は非常にアクティブ(毎日数十個のissue/PRが更新されて追いきれない...) 42
  29. LanceDBを支える技術 Lanceはデータフォーマット定義とデータ操作の集合 • • • • File Format (Apache Parquet相当)

    Table Format (Apache Iceberg相当) Index Format Catalog Format/Spec (Apache Polaris相当) フォーマット定義はProtobufで書かれている データ操作はRustで書かれている 解説記事:Lance / LanceDBとは何か - Bering Note – formerly 流沙河鎮 44
  30. なぜ新しいフォーマット? データレイク・レイクハウスのファイルフォーマットといえば、Apache Parquet が実質的に業界標準 AI開発用途におけるParquetの課題 • • 基本はフルスキャン向けに設計されていて、ランダムアクセス向き ではない ◦

    ベクトル検索の性能はランダムアクセス性能に大きく依存する Blobストレージ向けの設計ではない ◦ 画像、動画、音声などの格納先は通常別のストレージを用意 する必要がある 45
  31. Lanceの目指すもの 1. 2. 3. 4. 5. Expressive hybrid search Lightning-fast

    random access Native multimodal data Data/schema evolution Rich ecosystem integrations What is Lance? Lanceは大きなソフトウェアなので、今回はもっとも 低レベルのファイル・フォーマットに関連する2と3 の特徴について紹介します。 ココ 46
  32. 高速なランダムアクセスの実現 Paper: Lance: Efficient Random Access in Columnar Storage through

    Adaptive Structural Encodings (arXiv) • • Disk Pages / No Paruque-Style Row Groups Search Cache (metadata & location info) File Structure 47
  33. マルチモーダルデータのネイティブサポート マルチモーダルデータ ≒ Blob Blob Columns Blob列をfirst-class citizenとしてサポートする • •

    payloadまたはfile-like objectとして取得 file-like objectはfileのように遅延ロードやseekに対応 Blob Page Layout Blob専用のファイルレイアウトとエンコーディングを備える 48
  34. Appendix その他の重要な周辺技術スタック • • Apache Arrow ◦ Lanceがディスク上の列指向フォーマットであるのに対し、 Apache Arrowはメモリ上の列指向データ表現。

    ◦ Lanceのインメモリデータフォーマットとして採用されている。 ◦ Apache Arrowの開発者がLanceにも関わっている。 Apache DataFusion ◦ Rust製のOSSクエリエンジン。 ◦ LanceのビルトインSQLクエリエンジンとして採用されている。 51
  35. Appendix Lanceがサポートする Scalarインデックス タイプ 用途 BTree 汎用クエリ、ソート Bitmap low-cardinalityフィールドの絞り込み Label

    List multi-label (tags)フィールドの絞り込み Zone Map 高速なscan pruning向け RTree 2-D空間・地理情報フィールドの絞り込み Lance v10.0.0 時点。まだLanceDBにはexposeされていないものもある 52
  36. Appendix Lanceがサポートするベクトルインデックス IVFクラスタリングをベースとして、サブインデックス(Flat/HNSW)と量子化アルゴリズムの組み合わせを 指定する。 タイプ 説明 IVF-PQ IVFクラスタリング + 直積量子化

    IVF-HNSW-SQ IVFクラスタリング + HNSW近似 + スカラー量子化 IVF-SQ IVFクラスタリング + スカラー量子化 IVF-RQ IVFクラスタリング + RabitQ量子化 IVF-FLAT IVFクラスタリング + exact search 54
  37. Multimodal Datalake / Model Training Lance/LanceDBのファーストターゲット。大規模マルチモーダルデータを 持っている企業はそうそう多くはないが、大手の採用事例あり。 • • How

    ByteDance’s Volcano Engine Rebuilt Its AI Stack on Lance, From Data Lake to Agent Memory at 100K+ QPS From Facts & Metrics to Media Machine Learning: Evolving the Data Engineering Function at Netflix 56
  38. Vector Search / Semantic Search プレイヤーが多いレッドオーシャン領域。機能面の優位性は薄いが、導 入の容易さとコストパフォーマンスの高さが訴求ポイント。 • • •

    How CodeRabbit Leverages LanceDB for AI-Powered Code Reviews Meet Dosu - the Intelligent Knowledge Base for Software Teams and Agents A scalable, elastic database and search solution for 1B+ vectors built on LanceDB and Amazon S3 57
  39. Agent Memory AI Agentが使う組み込みDBとして、この用途は今後増えそう。 • • • Why CrewAI Rebuilt

    Agent Memory on LanceDB, Powering 2B+ Agent Executions Semantic Memory for Hermes Agent with LanceDB Why LanceDB Is the Most Natural Memory Layer for OpenClaw 58
  40. 宣伝② We Are Hiring! 󰟲󰞦 LegalOn Technologiesでは一緒に働く仲間を募集しています! • • AI

    Engineer - DealOn (左) AI Engineering Internship (右) その他オープン中の開発職JDはこちら https://herp.careers/v1/legalforce/requisition-groups/d2e157cc-12 0b-4ade-8879-0326c32127bd 61