最先進的檢索增強 LLM: bge-large-en-v1.5

引言

您是否對尖端檢索增強技術感興趣 LLM 'bge-large-en-v1.5'?加入我們的博客,深入探討這個模型。您將發現嵌入模型的作用及其實際應用。我們將指導您在程式碼中部署“bge-large-en-v1.5”,對其進行微調,並將其與 LLM API。準備好在嵌入模型和 LLMs!

bge-large-en-v1.5 是什麼?

簡而言之,bge-large-en-v1.5 是由 BAAI 創建的開源嵌入模型。 

具體來說,「bge-large-en-v1.5」中的「bge」代表「BAAI General Embedding」。 BAAI,在 Github 上也稱為“FlagEmbedding”,是一家致力於人工智慧研發的私人非營利組織。專注於檢索增強大型語言模型(LLMs),BAAI已啟動多個相關項目。其中包括長上下文 LLM (啟動信標)、LM 微調(LM-Cocktail)、密集檢索(BGE-M3、 LLM Embedder,BGE Embedding)、重新排序模型(BGE Reranker)以及基準測試(C-MTEB)。 Bge-large-en-v1.5 屬於 BGE Embedding 模式系列,專為密集檢索目的而開發。

密集檢索的嵌入模型扮演什麼角色?

用於密集檢索的嵌入模型將文字資料轉換為密集的語義表示,以捕捉輸入的含義和上下文。密集檢索器使用這些密集表示來有效地檢索相關資訊。以下是它的工作原理和一些示例:

將文字轉換為密集表示

嵌入模型將句子、段落或整個文件作為輸入,並將其轉換為固定長度的向量(嵌入)。這些向量對文字的語義資訊進行編碼,從而可以實現除了簡單的關鍵字匹配之外的更細緻的理解。

LLM通常將嵌入模型作為其架構的一部分。例如,BERT 使用嵌入技術來表​​示單字和輸入序列,然後透過其轉換器層進行處理。 LLM透過利用嵌入模型捕捉語義關係和上下文細微差別的能力,我們可以從嵌入模型中受益,這對於在對話生成或機器翻譯等任務中產生連貫且適合上下文的反應至關重要。

密集獵犬的作用

密集檢索器利用這些嵌入來執行檢索任務。與依賴精確關鍵字匹配或索引的傳統稀疏檢索方法不同,密集檢索器直接計算查詢嵌入和文件嵌入之間的相似度分數。這種方法可以更準確地檢索各種長度的文字輸入,從短句到長文件。

應用實例

在資訊檢索任務中,例如搜尋引擎或問答系統,這些密集的表示能夠有效、準確地檢索相關文件或段落。 

例如,「COVID-19 的症狀是什麼?」這樣的查詢可以轉換為嵌入向量。同樣,討論 COVID-19 症狀的文件也被轉換成嵌入。透過比較查詢嵌入和文件嵌入之間的相似性(使用餘弦相似度等技術),可以快速識別和排序最相關的文件。

另一個例子是推薦系統。在這種情況下,嵌入有助於透過了解使用者偏好和內容相似性來推薦產品、文章或影片。

總體而言,密集檢索的嵌入模型與密集檢索器相結合,在現代人工智慧應用中發揮著至關重要的作用,它們將文字轉換為有意義的表示,並根據語義相似性有效地檢索相關資訊。

如何在程式碼中使用 bge-large-en-v1.5?

將 bge-large-en-v1.5 與 Langchain 結合使用

您可以使用 bge 在 langchain 中像這樣:

from langchain.embeddings import HuggingFaceBgeEmbeddings
model_name = "BAAI/bge-large-en-v1.5"
model_kwargs = {'device': 'cuda'}
encode_kwargs = {'normalize_embeddings': True} # set True to compute cosine similarity
model = HuggingFaceBgeEmbeddings(
    model_name=model_name,
    model_kwargs=model_kwargs,
    encode_kwargs=encode_kwargs,
    query_instruction="Generate a representation for this sentence to be used for retrieving relevant articles:"
)
model.query_instruction = "Generate a representation for this sentence to be used for retrieving relevant articles:"

將 bge-large-en-v1.5 與 Huggingface Transformers 結合使用

使用 transforms 套件,您可以像這樣使用模型:首先,將您的輸入傳遞給 transforms 模型,然後選擇第一個標記的最後一個隱藏狀態(即 [CLS])作為句子嵌入。

from transformers import AutoTokenizer, AutoModel
import torch
# Sentences we want sentence embeddings for
sentences = ["Sample Data-1", "Sample Data-2"]

# Load model from HuggingFace Hub
tokenizer = AutoTokenizer.from_pretrained('BAAI/bge-large-en-v1.5')
model = AutoModel.from_pretrained('BAAI/bge-large-en-v1.5')
model.eval()
# Tokenize sentences
encoded_input = tokenizer(sentences, padding=True, truncation=True, return_tensors='pt')
# for s2p(short query to long passage) retrieval task, add an instruction to query (not add instruction for passages)
# encoded_input = tokenizer([instruction + q for q in queries], padding=True, truncation=True, return_tensors='pt')
# Compute token embeddings
with torch.no_grad():
    model_output = model(**encoded_input)
    # Perform pooling. In this case, cls pooling.
    sentence_embeddings = model_output[0][:, 0]
# normalize embeddings
sentence_embeddings = torch.nn.functional.normalize(sentence_embeddings, p=2, dim=1)
print("Sentence embeddings:", sentence_embeddings)

有關 bge 模型使用的更多信息,您可以訪問 Github 上的 FlagEmbedding。

如何微調 bge-large-en-v1.5?

步驟 1 安裝

  • 使用 pip 安裝: pip install -U FlagEmbedding
  • 或在克隆存儲庫並導航到其中後從來源安裝: pip install .
  • 對於開發,請使用可編輯安裝: pip install -e .

步驟 2 資料準備

  • 訓練資料應為 JSON 格式,每行作為包含以下內容的字典 querypos (正面文字清單),以及 neg (負面文字列表)。
  • 如果沒有負面文本,可以從語料庫中隨機抽取。

步驟 3 挖硬負例

  • 使用腳本挖掘硬否定以提高句子嵌入品質。
  • 您可以按照以下命令挖掘硬底片:
python -m FlagEmbedding.baai_general_embedding.finetune.hn_mine \
--model_name_or_path BAAI/bge-base-en-v1.5 \
--input_file toy_finetune_data.jsonl \
--output_file toy_finetune_data_minedHN.jsonl \
--range_for_sampling 2-200 \
--negative_number 15 \
--use_gpu_for_searching
  • 輸入文件:包含用於微調的資料的 JSON 文件,其中腳本識別每個查詢的前 k 個文檔,然後從這前 k 個結果中隨機選擇負面範例,排除任何已經提供的正面範例。
  • 輸出文件:JSON 檔案的目標位置,該檔案現已豐富了新採樣的硬負片,將儲存以供微調過程使用。
  • 負片數量:指定要收集多少個負樣本。
  • 採樣範圍:定義抽取負樣本的範圍。例如,2-100 的範圍表示將從前 2 到前 200 個文件中取得否定結果。擴大這個範圍,例如到 60-300,透過考慮更廣泛的文檔,可以降低底片的選擇難度。
  • 回收池:腳本將從中提取文件以進行檢索的來源。預設情況下,這是輸入檔案中所有負片的集合,格式與預訓練資料相同。如果指定了特定的檢索池,則腳本將使用該集合來尋找反面範例。
  • GPU基於搜尋:用於指示是否 GPU-應利用加速的 faiss-gpu 來提高負檢索過程的效率。

第四步 訓練

torchrun --nproc_per_node {number of gpus} \
-m FlagEmbedding.baai_general_embedding.finetune.run \
--output_dir {path to save model} \
--model_name_or_path BAAI/bge-large-en-v1.5 \
--train_data ./toy_finetune_data.jsonl \
--learning_rate 1e-5 \
--fp16 \
--num_train_epochs 5 \
--per_device_train_batch_size {large batch size; set 1 for toy data} \
--dataloader_drop_last True \
--normlized True \
--temperature 0.02 \
--query_max_len 64 \
--passage_max_len 256 \
--train_group_size 2 \
--negatives_cross_device \
--logging_steps 10 \
--save_steps 1000 \
--query_instruction_for_retrieval ""
  • 每台設備的訓練批次大小:每個訓練批次處理的樣本數。通常,增加批量大小可以提高模型效能。您可以透過利用半精度訓練等選項來擴大這個規模(--fp16), DeepSpeed 配置 (--deepspeed ./df_config.json,其中 df_config.json 也可以表示為 ds_config.json) 和梯度檢查點 (--gradient_checkpointing).
  • 培訓小組規模:確定訓練期間每個查詢使用的總範例(正面和負面)。由於存在保證的正例,因此此設定決定了負例數量(計算方式為 train_group_size - 1)。請注意,此數字不應超過數據中可用的負數 neg 列表。除了這些組底片之外,批次內的其他底片也被納入微調過程。
  • 跨裝置負面分享:允許在所有可用資料集上分佈負面範例 GPUs,有效增加訓練中使用的負片總數。
  • 學習率:選擇適合您的特定型號的值。對於大型、基礎或小型模型,通常建議使用 1e-5、2e-5 或 3e-5 等值。
  • 溫度因素:影響相似度分數分佈的擴散。建議值範圍從 0.01 到 0.1。
  • 最大查詢長度:查詢長度的上限,應與資料集中的平均查詢長度相對應。
  • 最大通道長度:段落長度的上限,根據您資料中段落的平均長度設定。
  • 檢索查詢指令:為了檢索目的而附加到每個查詢的可選指令。如果不需要額外的上下文,您可以將其設定為空字串,將其留空。
  • 批次內負面使用狀況:一個標誌,指示是否將來自同一批次的段落視為訓練中的反面例子。預設為啟用 (True)。
  • 檢查點保存間隔:根據完成的訓練步驟數定義儲存模型檢查點的頻率。

步驟5模型載入

一旦 BGE 模型經過微調,您就可以輕鬆地加載它,如本例所示。如果您為 --query_instruction_for_retrieval 在微調階段,確保替換 query_instruction_for_retrieval 因此。

步驟6模型載入

對於模型評估,您可以運行此 腳本 由 FlagEmbedding 提供。

透過微調來調整基礎 bge 模型可以帶來更好的特定任務效能,但也可能導致模型在目標領域之外的整體有效性顯著下降(例如,c-mteb 任務的效能下降)。有關解決方案(使用 LM-Cocktail)以及微調過程的信息,請查看 Github 上的“FlagEmbedding/examples/finetune”。

如何將 bge-large-en-v1.5 與 LLM API?

將嵌入模型與 LLM 豐富AI的自然語言處理能力,實現更精細的語意搜尋、上下文理解和個人化互動。這種整合對於增強基於內容的推薦、文件聚類、異常檢測、跨語言處理和知識圖譜建構等任務特別有用。它還支援機器學習模型的高級文字摘要和功能增強,從而提高情緒分析和主題分類的表現。

第 1 步:設定您的環境

首先,請確保您已安裝必要的 Python 環境和所需的軟體套件。

pip install openai
# Install other necessary packages, e.g., requests, numpy, etc.

步驟 2:初始化 Novita AI API 用戶端

您已經提供了初始化程式碼 Novita AI API 客戶。以下是供參考:

from openai import OpenAI

client = OpenAI(
    base_url="https://api.novita.ai/v3/openai",
    api_key="<YOUR Novita AI API Key>",  # Replace with your actual API key
)
model = "nousresearch/nous-hermes-llama2-13b"

步驟3:取得嵌入模型

假設您可以訪問 bge-large-en-v1.5 模型,您將加載它。如果是 Hugging Face 模型,你可以使用 transformers 像這樣的函式庫:

from transformers import AutoModel, AutoTokenizer

tokenizer = AutoTokenizer.from_pretrained("BAAI/bge-large-en-v1.5")
model = AutoModel.from_pretrained("BAAI/bge-large-en-v1.5")

步驟 4:定義一個函數來取得嵌入

建立一個函數來從 bge-large-en-v1.5 模型。

def get_embeddings(text):
    inputs = tokenizer(text, return_tensors="pt")
    with torch.no_grad():
        embeddings = model(**inputs)[0].mean(dim=1)
    return embeddings.numpy()

步驟 5:集成 Novita AI LLM API

現在,將嵌入模型與 LLM API 來增強 API 的回應或執行語意搜尋等任務。

def enhanced_llm_response(prompt):
    # Get initial response from LLM
    response = client.completions.create(
        model=model,
        prompt=prompt,
        stream=True,
        max_tokens=512,
    )
    
    # Process the response (e.g., extract text)
    # This is a placeholder for the actual response processing
    response_text = next(response)['choices'][0]['text'].content
    
    # Get embeddings for the response
    response_embeddings = get_embeddings(response_text)
    
    # Here, you can use the embeddings for various purposes,
    # such as semantic search, filtering, etc.
    
    return response_text, response_embeddings

步驟 6:使用增強功能

現在您可以使用 enhanced_llm_response 函數來獲取來自 LLM 並用嵌入模型處理。

prompt = "A chat between a curious user and an artificial intelligence assistant"
response, embeddings = enhanced_llm_response(prompt)
print(response)
# Do something with the embeddings, e.g., store them, search for similar texts, etc.

步驟 7:錯誤處理和日誌記錄

在您的程式碼中新增錯誤處理和日誌記錄,以管理 API 限制、請求失敗和其他潛在問題。

步驟 8:測試和迭代

徹底測試整合並根據結果進行迭代。您可能需要調整參數、處理更多邊緣情況或最佳化效能。

請注意,實際實施細節可能因具體能力和要求而異 Novita AI LLM API 和 bge-large-en-v1.5 模型。您可以聯繫 Novita AI 技術支援團隊: 支持@novita.ai.

結語

總之,我們對「bge-large-en-v1.5」的探索強調了它在密集檢索任務中不可或缺的作用,並深入探討了它的功能、應用和實際實現。從介紹模型及其在嵌入領域的意義到展示其在程式碼中的使用及其微調過程,我們制定了全面的指南。此外,與 Novita AI LLM API 體現了該模型的放大潛力 LLM的語意理解和檢索準確性。 

請繼續關注更多更新 LLMs!

常見問題(FAQ)

1. BGE 重新排序器如何運作?

透過向重新排序器輸入查詢和段落,您可以獲得相關性分數。此分數可以使用 S 型函數轉換為 [0, 1] 範圍內的浮點值。此流程旨在確保排名靠前的結果更相關、品質更高,從而提高整體系統效能。

2.BGE的上下文長度是多少?

最新型號bge-m3的上下文長度為8kb。

3.bge m3嵌入的尺寸是多少?

它可以處理不同長度的輸入,從短句子到包含最多 8192 個標記的長文件。

Novita AI 是助力您實現 AI 抱負的一體化雲端平台。透過無縫整合的 API、無伺服器運算和 GPU 加速,我們提供您快速建置和擴展 AI 驅動業務所需的經濟高效的工具。消除基礎設施難題並免費開始使用 — Novita AI 讓您的 AI 夢想成為現實。

推薦閱讀

什麼是 LLM 嵌入:你需要知道的一切

揭秘 BGE Large 的強大功能:文本嵌入的未來


探索 Novita 的更多內容

訂閱以將最新貼文發送到您的電子郵件。

發表評論

回到頁首

探索 Novita 的更多內容

立即訂閱以繼續閱讀並存取完整檔案。

繼續閱讀