国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

Elasticsearch:向量搜索 (kNN) 實施指南 - API 版

這篇具有很好參考價值的文章主要介紹了Elasticsearch:向量搜索 (kNN) 實施指南 - API 版。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

作者:Jeff Vestal

Elasticsearch:向量搜索 (kNN) 實施指南 - API 版,Elasticsearch,AI,Elastic,elasticsearch,大數據,搜索引擎,全文檢索,人工智能,圖搜索算法

本指南重點介紹通過 HTTP 或 Python 使用 Elasticsearch API 設置 Elasticsearch 以進行近似 k 最近鄰 (kNN) 搜索。

對于主要使用 Kibana 或希望通過 UI 進行測試的用戶,請訪問使用 Elastic 爬蟲的語義搜索入門指南。你也可以參考文章 “ChatGPT 和 Elasticsearch:OpenAI 遇見私有數據(二)”。

如果你想切入主題并在 Jupyter Notebook 中運行一些代碼,我們可以為你提供隨附的 notebook。

Elastic Learned Sparse Encoder

如果你使用的文本是英文文本,請考慮使用 Elastic Learned Sparse Encoder。

Elastic Learned Sparse EncodeR(或 ELSER)是由 Elastic 訓練的 NLP 模型,使你能夠使用稀疏向量表示來執(zhí)行語義搜索。 語義搜索不是根據搜索詞進行字面匹配,而是根據搜索查詢的意圖和上下文含義來檢索結果。

否則,請繼續(xù)閱讀下文,了解有關使用近似 kNN 搜索進行語義向量搜索的信息。

高層架構

在 Elastic 中實現向量搜索有四個關鍵組件:

  1. 嵌入模型:機器學習模型,將數據作為輸入并返回數據的數字表示(向量,也稱為 “嵌入(embedding)”)
  2. 推理端點:將機器學習模型應用于文本數據的 Elastic Inference API 或 Elastic Inference 管道處理器。 當你提取數據和對數據執(zhí)行查詢時,你都可以使用推理端點。 **注意:**對于非文本數據(例如圖像文件),請在你的 ML 模型中使用外部腳本,以便生成你將在 Elastic 中存儲和使用的嵌入。
  3. 搜索:Elastic 將嵌入與元數據一起存儲在其索引中,然后執(zhí)行(近似)k 最近鄰搜索以查找查詢與數據最接近的匹配項(在向量空間中,也稱為“嵌入空間”)
  4. 應用程序邏輯:你的應用程序在核心向量搜索之外所需的一切,例如與用戶通信或應用你的業(yè)務邏輯。

Elasticsearch:向量搜索 (kNN) 實施指南 - API 版,Elasticsearch,AI,Elastic,elasticsearch,大數據,搜索引擎,全文檢索,人工智能,圖搜索算法

集群注意事項

集群大小估計

內存注意事項

為了提高性能,向量需要 “適合” 數據節(jié)點上的堆外 RAM。 從 Elasticsearch 版本 8.7+ 開始,向量所需的粗略估計為

NumVectors×4×(NumDimensions+12)

注意:該公式適用于 float 類型向量。

使用 20,000 個向量字段的快速示例(我們假設每個文檔有 1 個向量):

20,000,000×4×(768+12)≈115 GB of RAM off heap

注意:添加的每個副本都需要相同數量的額外 RAM(例如,對于上面的示例,1 個主副本和 1 個副本,我們估計需要 2 倍的 RAM,即 130GB)。

性能測試

由于每個用戶的數據都不同,估計 RAM 需求的最佳方法是通過測試。 我們建議從單個節(jié)點、單個主分片、無副本開始,然后進行測試,以找出在性能下降之前有多少向量 “適合” 節(jié)點。

實現這一目標的一種方法是使用 Elastic 的基準測試工具 Rally。

如果所有向量都相當小(例如,64GB 節(jié)點上的 3GB),你可以簡單地加載向量并一次性開始測試。

使用上面的估計公式,將向量數量的 75% 加載到單個節(jié)點中,運行挑戰(zhàn),并評估響應時間指標。 逐漸增加向量計數,重新運行測試,直到性能下降到可接受的水平以下。 響應時間可接受的最大計數通??梢员徽J為是單個節(jié)點的向量數量。 從那里你可以橫向擴展節(jié)點和副本。

Jupyter Notebook Code

Elasticsearch:向量搜索 (kNN) 實施指南 - API 版,Elasticsearch,AI,Elastic,elasticsearch,大數據,搜索引擎,全文檢索,人工智能,圖搜索算法

下面的所有代碼都可以在 python Jupyter Notebook 中找到 該代碼可以完全從瀏覽器中運行,使用 Google Colab,以便使用隨附的 notebook 進行快速設置和測試

集群配置

每個字段單個向量與每個字段多個向量

向量布局的標準方法是每個字段一個向量。 這就是我們下面將遵循的方法。 但是,從 8.11 開始,Elasticsearch 支持嵌套向量,允許每個字段使用多個向量。 有關設置該方法的信息,請查看 Elasticsearch Labs 博客 “通過攝取管道對大型文檔進行分塊加上嵌套向量等于簡單的段落搜索”。

加載嵌入模型

嵌入模型在機器學習節(jié)點上運行。 確保你部署了一個或多個 ML 節(jié)點。

要將嵌入模型加載到 Elasticsearch 中,你需要使用 Eland。 Eland 是一個 Python Elasticsearch 客戶端,用于使用熟悉的 Pandas 兼容 API 探索和分析 Elasticsearch 中的數據。

  • 你可以使用 Docker 從 Hugging Face 快速加載模型。
  • 嗎還可以在 Colab 中使用 jupyter 筆記本快速加載模型(后續(xù)“部署NLP模型”)
  • 對于無法直接連接到 Hugging Face 的環(huán)境,請按照文檔在氣隙環(huán)境中使用 Eland 加載嵌入模型中概述的步驟操作

攝取管道設置

有多種方法可以生成新文檔的嵌入。 最簡單的方法是創(chuàng)建攝取管道并配置針對索引的數據,以自動使用管道通過推理處理器調用模型。

在下面的示例中,我們將創(chuàng)建一個帶有一個處理器(推理處理器)的管道。 該處理器將:

  • 將我們要為其創(chuàng)建嵌入的字段 my_text 映射到嵌入模型在本例中期望的名稱 text_field
  • 通過 model_id 配置要使用的模型。 這是 Elasticsearch 中模型的名稱
  • 監(jiān)控可能出現錯誤時進行處理。
PUT _ingest/pipeline/vector_embedding_demo
{
  "processors": [
    {
      "inference": {
        "field_map": {
          "my_text": "text_field"
        },
        "model_id": "sentence-transformers__all-distilroberta-v1",
        "target_field": "ml.inference.my_vector",
        "on_failure": [
          {
            "append": {
              "field": "_source._ingest.inference_errors",
              "value": [
                {
                  "message": "Processor 'inference' in pipeline 'ml-inference-title-vector' failed with message '{{ _ingest.on_failure_message }}'",
                  "pipeline": "ml-inference-title-vector",
                  "timestamp": "{{{ _ingest.timestamp }}}"
                }
              ]
            }
          }
        ]
      }
    },
    {
      "set": {
        "field": "my_vector",
        "if": "ctx?.ml?.inference != null && ctx.ml.inference['my_vector'] != null",
        "copy_from": "ml.inference.my_vector.predicted_value",
        "description": "Copy the predicted_value to 'my_vector'"
      }
    },
    {
      "remove": {
        "field": "ml.inference.my_vector",
        "ignore_missing": true
      }
    }
  ]
}

索引映射/模板設置

嵌入(向量)存儲在 Elasticsearch 中的密集向量字段類型中。 接下來,我們將在索引文檔和生成嵌入之前配置索引模板。

下面的 API 調用將創(chuàng)建一個索引模板來匹配具有 my_vector_index-* 模式的任何索引

它會:

  1. 如文檔中所述,為 my_vector 配置密集向量。
  2. 建議從 _source 中排除向量字段
  3. 我們還將在本示例中包含一個文本字段 my_text,它將作為生成嵌入的源。
PUT /_index_template/my_vector_index
{
  "index_patterns": [
    "my_vector_index-*"
  ],
  "priority": 1,
  "template": {
    "settings": {
      "number_of_shards": 1,
      "number_of_replicas": 1,
      "index.default_pipeline": "vector_embedding_demo"
    },
    "mappings": {
      "properties": {
        "my_vector": {
          "type": "dense_vector",
          "dims": 768,
          "index": true,
          "similarity": "dot_product"
        },
        "my_text": {
          "type": "text"
        }
      },
      "_source": {
        "excludes": [
          "my_vector"
        ]
      }
    }
  }
}

索引數據

有多種方法可以將數據索引到 Elasticsearch 中。 下面的示例顯示了要索引到示例索引中的一組快速測試文檔。 當推理處理器對嵌入模型進行內部 API 調用時,嵌入將由攝取管道在攝取中生成。

POST my_vector_index-01/_bulk?refresh=true
{"index": {}}
{"my_text": "Hey, careful, man, there's a beverage here!", "my_metadata": "The Dude"}
{"index": {}}
{"my_text": "I’m The Dude. So, that’s what you call me. You know, that or, uh, His Dudeness, or, uh, Duder, or El Duderino, if you’re not into the whole brevity thing", "my_metadata": "The Dude"}
{"index": {}}
{"my_text": "You don't go out looking for a job dressed like that? On a weekday?", "my_metadata": "The Big Lebowski"}
{"index": {}}
{"my_text": "What do you mean brought it bowling, Dude? ", "my_metadata": "Walter Sobchak"}
{"index": {}}
{"my_text": "Donny was a good bowler, and a good man. He was one of us. He was a man who loved the outdoors... and bowling, and as a surfer he explored the beaches of Southern California, from La Jolla to Leo Carrillo and... up to... Pismo", "my_metadata": "Walter Sobchak"}

查詢數據

Approximate k-nearest neighbor

GET my_vector_index-01/_search
{
  "knn": [
    {
      "field": "my_vector",
      "k": 1,
      "num_candidates": 5,
      "query_vector_builder": {
        "text_embedding": {
          "model_id": "sentence-transformers__all-distilroberta-v1",
          "model_text": "Watchout I have a drink"
        }
      }
    }
  ]
}

具有倒數排名融合技術預覽的混合搜索(kNN + BM25)

GET my_vector_index-01/_search
{
  "size": 2,
  "query": {
    "match": {
      "my_text": "bowling"
    }
  },
  "knn":{
      "field": "my_vector",
      "k": 3,
      "num_candidates": 5,
      "query_vector_builder": {
        "text_embedding": {
          "model_id": "sentence-transformers__all-distilroberta-v1",
          "model_text": "He enjoyed the game"
        }
      }
    },
      "rank": {
        "rrf": {}
    }
}

Filtering

GET my_vector_index-01/_search
{
  "knn": {
    "field": "my_vector",
    "k": 1,
    "num_candidates": 5,
    "query_vector_builder": {
      "text_embedding": {
        "model_id": "sentence-transformers__all-distilroberta-v1",
        "model_text": "Did you bring the dog?"
      }
    },
    "filter": {
      "term": {
        "my_metadata": "The Dude"
      }
    }
  }
}

返回選擇字段的聚合

GET my_vector_index-01/_search
{
  "knn": {
    "field": "my_vector",
    "k": 2,
    "num_candidates": 5,
    "query_vector_builder": {
      "text_embedding": {
        "model_id": "sentence-transformers__all-distilroberta-v1",
        "model_text": "did you bring it?"
      }
    }
  },
  "aggs": {
    "metadata": {
      "terms": {
        "field": "my_metadata"
      }
    }
  },
  "fields": [
    "my_text",
    "my_metadata"
  ],
  "_source": false
}

kNN 調整選項

調整近似 kNN 搜索文檔中介紹了調整選項的概述

搜索的計算成本:向量數量的對數,前提是它們通過 HNSW 進行索引。 dot_product 相似度的維數略好于線性。

_search

調整近似 kNN 以提高速度或準確性文檔

距離度量的選擇

  • 只要有可能,我們建議在將向量搜索部署到生產環(huán)境時使用 dot_product 而不是余弦相似度。 使用點積可以避免每次相似性計算時都必須計算向量幅度(因為向量已提前歸一化為全部幅度為 1)。 這意味著它可以將搜索和索引速度提高約 2-3 倍。
  • 也就是說,consine 在文本應用程序中很受歡迎:查詢的長度通常比攝取的文檔短得多,因此與原始文檔的距離對相似性的測量沒有有意義的貢獻。 請記住,余弦每個元組需要 6 次運算,而點積每個維度只需要兩次(將每個元素相乘,然后求和)。 因此,我們建議僅將余弦用于測試/探索,并在投入生產時切換到點積(通過歸一化,點積畢竟會計算余弦)。
  • 在所有其他用例中首先嘗試 dot_product - 因為它的執(zhí)行速度比 L2 規(guī)范(標準歐幾里得)快得多。

Ingest

Indexing considerations Docs

索引新數據

除非你生成自己的嵌入,否則你必須在攝取新數據時生成嵌入。 對于文本,這是通過帶有調用托管嵌入模型的推理處理器的攝取管道來完成的。 請注意,這需要白金許可證。
添加更多數據也會增加 RAM - 因為你需要將所有向量保留在堆外(而傳統(tǒng)搜索則需要在磁盤上)

精確 kNN 搜索

又名強力(brute force)或腳本分數

精確 kNN 搜索文檔

不要假設你需要 ANN,因為某些用例無需 ANN 也能正常工作。 根據經驗,如果你實際排名的文檔數量(即應用過濾器后)低于 10k,那么使用強力選項可能會更好。

在本地環(huán)境中運行 jupyter notebook

在很多情況下,我們在本地電腦里來運行上面的練習。我們可以按照如下的步驟來進行:

安裝 Elasticsearch 及 Kibana

如果你還沒有安裝好自己的 Elasticsearch 及 Kibana,請參考如下的文章來進行安裝:

  • 如何在 Linux,MacOS 及 Windows 上進行安裝 Elasticsearch

  • Kibana:如何在 Linux,MacOS 及 Windows 上安裝 Elastic 棧中的 Kibana

特別注意的是:我們將以最新的 Elastic Stack 8.6.1 來進行展示。請參考 Elastic Stack 8.x 的文章進行安裝。

啟動白金版試用功能

由于上傳模型是一個白金版的功能,我們需要啟動試用功能。更多關于訂閱的信息,請參考網址:訂閱 | Elastic Stack 產品和支持 | Elastic。

Elasticsearch:向量搜索 (kNN) 實施指南 - API 版,Elasticsearch,AI,Elastic,elasticsearch,大數據,搜索引擎,全文檢索,人工智能,圖搜索算法

Elasticsearch:向量搜索 (kNN) 實施指南 - API 版,Elasticsearch,AI,Elastic,elasticsearch,大數據,搜索引擎,全文檢索,人工智能,圖搜索算法

Elasticsearch:向量搜索 (kNN) 實施指南 - API 版,Elasticsearch,AI,Elastic,elasticsearch,大數據,搜索引擎,全文檢索,人工智能,圖搜索算法

Elasticsearch:向量搜索 (kNN) 實施指南 - API 版,Elasticsearch,AI,Elastic,elasticsearch,大數據,搜索引擎,全文檢索,人工智能,圖搜索算法

這樣我們就成功地啟動了白金版試用功能。?

上傳模型

我們使用如下的命令來安裝 eland:

pip3 install eland
pip3 install -q elasticsearch eland[pytorch]

Elasticsearch:向量搜索 (kNN) 實施指南 - API 版,Elasticsearch,AI,Elastic,elasticsearch,大數據,搜索引擎,全文檢索,人工智能,圖搜索算法

然后,我們使用如下的命令來上傳所需要的模型:

eland_import_hub_model --url https://elastic:o6G_pvRL=8P*7on+o6XH@localhost:9200 \
  --hub-model-id sentence-transformers/all-distilroberta-v1 \
  --task-type text_embedding \
  --ca-certs /Users/liuxg/elastic/elasticsearch-8.11.0/config/certs/http_ca.crt \
  --start

Elasticsearch:向量搜索 (kNN) 實施指南 - API 版,Elasticsearch,AI,Elastic,elasticsearch,大數據,搜索引擎,全文檢索,人工智能,圖搜索算法

在上面,我們需要根據自己的安裝:

  • 修改上面的 elastic 超級用戶的密碼
  • 修改上面的證書路徑

完成上面的命令后,我們可以在 Kibana 中看到:

Elasticsearch:向量搜索 (kNN) 實施指南 - API 版,Elasticsearch,AI,Elastic,elasticsearch,大數據,搜索引擎,全文檢索,人工智能,圖搜索算法

Elasticsearch:向量搜索 (kNN) 實施指南 - API 版,Elasticsearch,AI,Elastic,elasticsearch,大數據,搜索引擎,全文檢索,人工智能,圖搜索算法

Elasticsearch:向量搜索 (kNN) 實施指南 - API 版,Elasticsearch,AI,Elastic,elasticsearch,大數據,搜索引擎,全文檢索,人工智能,圖搜索算法

Elasticsearch:向量搜索 (kNN) 實施指南 - API 版,Elasticsearch,AI,Elastic,elasticsearch,大數據,搜索引擎,全文檢索,人工智能,圖搜索算法

運行 Notebook

我們把 Elasticsearch 的證書拷貝到當前的項目根目錄下:

cp ~/elastic/elasticsearch-8.11.0/config/certs/http_ca.crt .

我們使用 jupyter notebook 來創(chuàng)建一個叫做?vector_search_implementation_guide_api.ipynb 的 notebook。你可以發(fā)現整個 notebook。

原文:Vector Search (kNN) Implementation Guide - API Edition — Elastic Search Labs文章來源地址http://www.zghlxwxcb.cn/news/detail-759076.html

到了這里,關于Elasticsearch:向量搜索 (kNN) 實施指南 - API 版的文章就介紹完了。如果您還想了解更多內容,請在右上角搜索TOY模板網以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網!

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。如若轉載,請注明出處: 如若內容造成侵權/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經查實,立即刪除!

領支付寶紅包贊助服務器費用

相關文章

  • Elasticsearch:調整近似 kNN 搜索

    Elasticsearch:調整近似 kNN 搜索

    在我之前的文章 “Elasticsearch:調整搜索速度”,我詳細地描述了如何調整正常的 BM25 的搜索速度。在今天的文章里,我們來進一步探討如何提高近似 kNN 的搜索速度。希望對廣大的向量搜索開發(fā)者有一些啟示。 Elasticsearch 支持近似 k 最近鄰搜索,以有效查找與查詢向量最接近

    2024年03月15日
    瀏覽(20)
  • Elasticsearch:介紹 kNN query,這是進行 kNN 搜索的專家方法

    Elasticsearch:介紹 kNN query,這是進行 kNN 搜索的專家方法

    作者:來自 Elastic?Mayya Sharipova, Benjamin Trent Elasticsearch 中的 kNN 搜索被組織為搜索請求的頂層(top level)部分。 我們這樣設計是為了: 無論分片數量多少,它總是可以返回全局 k 個最近鄰居 這些全局 k 個結果與其他查詢的結果相結合以形成混合搜索 全局 k 結果被傳遞到聚合

    2024年01月23日
    瀏覽(42)
  • Elastic Stack 8.12:通過對 ES|QL 等的改進增強了向量搜索

    Elastic Stack 8.12:通過對 ES|QL 等的改進增強了向量搜索

    作者:來自 Elastic?Tyler Perkins, Shani Sagiv, Gilad Gal, Ninoslav Miskovic Elastic? Stack 8.12 構建于 Apache Lucene 9.9(有史以來最快的 Lucene 版本)之上,基于我們對標量量化和搜索并發(fā)性的貢獻,為文本、向量和混合搜索帶來了巨大進步。 此版本還優(yōu)化了 Elasticsearch? 中的查詢并行化以及

    2024年01月22日
    瀏覽(21)
  • 增強FAQ搜索引擎:發(fā)揮Elasticsearch中KNN的威力

    增強FAQ搜索引擎:發(fā)揮Elasticsearch中KNN的威力

    英文原文地址:https://medium.com/nerd-for-tech/enhancing-faq-search-engines-harnessing-the-power-of-knn-in-elasticsearch-76076f670580 增強FAQ搜索引擎:發(fā)揮Elasticsearch中KNN的威力 2023 年 10 月 21 日 在一個快速準確的信息檢索至關重要的時代,開發(fā)強大的搜索引擎是至關重要的。隨著大型語言模型(LLM)和

    2024年02月02日
    瀏覽(60)
  • Elasticsearch:探索 k-nearest neighbor (kNN) 搜索

    Elasticsearch:探索 k-nearest neighbor (kNN) 搜索

    由于新一代機器學習模型可以將各種內容表示為向量,包括文本、圖像、事件等,人們對向量搜索的興趣激增。 通常稱為 “ 嵌入模型 (embedding models)”,這些強大的表示可以以超越其表面特征的方式捕獲兩段內容之間的相似性。 K 最近鄰 (KNN) 搜索又名語義搜索是一種簡單

    2024年02月08日
    瀏覽(19)
  • Elasticsearch:如何在 Elastic 中實現圖片相似度搜索

    Elasticsearch:如何在 Elastic 中實現圖片相似度搜索

    作者:Radovan Ondas 在本文章,我們將了解如何通過幾個步驟在 Elastic 中實施相似圖像搜索。 開始設置應用程序環(huán)境,然后導入 NLP 模型,最后完成為你的圖像集生成嵌入。 Elastic 圖像相似性搜索概覽 Elasticsearch:如何在 Elastic 中實現圖片相似度搜索 第一步是為你的應用程序設

    2024年01月22日
    瀏覽(30)
  • 增強常見問題解答搜索引擎:在 Elasticsearch 中利用 KNN 的力量

    增強常見問題解答搜索引擎:在 Elasticsearch 中利用 KNN 的力量

    在快速準確的信息檢索至關重要的時代,開發(fā)強大的搜索引擎至關重要。 隨著大型語言模型和信息檢索架構(如 RAG)的出現,在現代軟件系統(tǒng)中利用文本表示(向量/嵌入)和向量數據庫已變得越來越流行。 在本文中,我們深入研究了如何使用 Elasticsearch 的 K 最近鄰 (KNN) 搜

    2024年02月08日
    瀏覽(44)
  • Elasticsearch:使用 ELSER 釋放語義搜索的力量:Elastic Learned Sparse EncoderR

    Elasticsearch:使用 ELSER 釋放語義搜索的力量:Elastic Learned Sparse EncoderR

    在信息過載的時代,根據上下文含義和用戶意圖而不是精確的匹配來查找相關搜索結果已成為一項重大挑戰(zhàn)。 傳統(tǒng)的搜索引擎通常無法理解用戶查詢的語義上下文,從而導致相關性較低的結果。 在現代向量搜索之前,我們有 “傳統(tǒng)”的 詞袋(Bags of word?- BOW)方法。

    2024年02月15日
    瀏覽(35)
  • Elasticsearch 向量相似搜索

    Elasticsearch 向量相似搜索

    Elasticsearch 向量相似搜索的原理涉及使用密集向量(dense vector)來表示文檔,并通過余弦相似性度量來計算文檔之間的相似性。以下是 Elasticsearch 向量相似搜索的基本原理: 向量表示文檔 : 文檔的文本內容經過嵌入模型(如BERT、Word2Vec等)處理,得到一個密集向量(dense v

    2024年02月04日
    瀏覽(28)
  • Elasticsearch:使用 Elasticsearch 向量搜索和 FastAPI 構建文本搜索應用程序

    Elasticsearch:使用 Elasticsearch 向量搜索和 FastAPI 構建文本搜索應用程序

    在我的文章 “Elastic:開發(fā)者上手指南” 的 “ NLP - 自然語言處理及矢量搜索 ”,我對 Elastic Stack 所提供的矢量搜索有大量的描述。其中很多的方法需要使用到 huggingface.co 及 Elastic 的機器學習。這個對于許多的開發(fā)者來說,意味著付費使用。在那些方案里,帶有機器學習的

    2024年02月09日
    瀏覽(29)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領取紅包,優(yōu)惠每天領

二維碼1

領取紅包

二維碼2

領紅包