使用Sentence Transformers构建基于阿拉伯语套娃嵌入的自定义阿拉伯语语义搜索模型以用于RAG

社区文章 发布于2024年9月25日

我们的阿拉伯语语义搜索模型,由Matryoshka嵌入提供支持,已在MTEB排行榜上获得第一名,展示了尖端的NLP卓越性。

通过微调自己的语义搜索模型来实现检索增强生成(RAG)管道是一种强大的方法,可以提高问答系统的准确性和相关性。这项技术结合了语义搜索和生成式AI的优势,使系统能够更好地理解用户问题并生成更准确、更具上下文相关性的响应。通过使用Sentence Transformers微调语义搜索模型,开发人员可以根据其特定领域定制模型,从而提高RAG管道的整体性能。

image/webp

什么是语义搜索?

自然语言处理(NLP)中的语义搜索指的是搜索引擎理解搜索查询和内容的上下文含义的能力,而不是仅仅依赖关键词匹配。通过利用词嵌入、知识图谱和自然语言理解等技术,语义搜索旨在理解用户查询背后的意图,并检索更相关和准确的结果。这种方法至关重要,因为它通过提供更直观和有效的搜索结果(尤其是在复杂或模糊的查询中)来增强用户体验。然而,尽管在英语等广泛使用的语言的语义搜索方面取得了显著进展,但在可靠的阿拉伯语嵌入模型方面仍然存在显著差距。这种缺乏强大的阿拉伯语工具阻碍了阿拉伯语地区语义搜索的开发和应用,强调了迫切需要改进特定语言的NLP资源来支持这些应用。

什么是检索增强生成(RAG)?

检索增强生成(RAG)是自然语言处理(NLP)中的一种技术,通过将生成式AI模型与外部数据源集成来增强其性能。这种方法将检索机制与生成模型相结合,使系统能够从数据库或知识库中搜索和检索相关信息,以在响应生成过程中补充其内部知识。RAG确保AI模型能够利用经过验证的外部来源提供上下文准确和最新的答案。

这种集成显著提高了AI生成响应的事实准确性,使信息更可靠和可验证。此外,它提供了一种在无需大量重新训练的情况下更新AI知识库的方法。RAG在减少AI幻觉(即模型生成不正确或无意义信息的情况)的发生方面尤其有价值。对于阿拉伯语应用程序,RAG的重要性更为突出。鉴于目前缺乏强大的阿拉伯语嵌入模型,整合外部数据源可以显著提高阿拉伯语生成式AI输出的质量和准确性。这种方法可以弥补差距,确保阿拉伯语用户受益于可靠且上下文相关的AI交互。

什么是套娃嵌入模型?

套娃表示学习(MRL)是一种新的最先进的文本嵌入模型,经过优化以生成更高维度的嵌入,用更多值表示输入文本。传统嵌入模型生成固定维度的嵌入,而旨在提高性能的改进通常会降低搜索或分类等下游任务的效率。套娃嵌入模型通过训练嵌入在截断时仍然有用,从而解决了这个问题。这些模型可以生成各种维度的有效嵌入。

套娃嵌入模型的关键特性

image/webp

这个概念灵感来源于“套娃”,也称为“俄罗斯套娃”,它们是一组尺寸递减的木偶,一个套在一个里面。类似地,套娃嵌入模型将更重要的信息存储在靠前的维度中,将不太重要的信息存储在靠后的维度中。这个特性允许截断模型生成的原始大嵌入,同时仍然保留足够的信息以在下游任务中表现良好。这些可变大小的嵌入模型在几个方面对从业者非常有价值:

  • 筛选和重新排序:您无需对完整嵌入执行下游任务(例如最近邻搜索),而是可以将嵌入缩小到较小尺寸以进行高效筛选。随后,可以使用完整维度处理剩余的嵌入。

  • 权衡:套娃模型能够根据所需的存储成本、处理速度和性能来扩展嵌入解决方案。

套娃表示学习(MRL)的核心创新在于它能够通过显式优化创建适应性强的嵌套表示。这种灵活性对于大规模分类和检索任务至关重要,在这些任务中,计算效率和准确性至关重要。

我们的贡献

在推进阿拉伯语自然语言处理(NLP)的探索中,我们做出了几项重要贡献:

  • 我们将各种句子相似性数据集翻译成阿拉伯语,这有助于我们模型的强大训练和评估。这一步对于创建能够准确处理和理解阿拉伯语文本的模型至关重要。

我们使用阿拉伯语自然语言推理(NLI)三元组数据集来训练基于不同基础模型的不同Matryoshka嵌入模型。该数据集包含锚定句、正向句和负向句对,这有助于模型学习区分相似句子和不相似句子。

  • 通过采用分层嵌入策略,我们的模型能够捕获阿拉伯语文本中复杂的语义关系,使其在各种下游任务中表现出色。这种分层方法允许模型同时处理细粒度和广义的语义上下文。

我们自豪地宣布,我们的四个Matryoshka嵌入模型在MTEB排行榜的STS17阿拉伯语-阿拉伯语(Ar-Ar)任务中名列前四。这一卓越成就凸显了我们模型在捕获阿拉伯语语义文本相似性方面的有效性和准确性。这些模型为阿拉伯语自然语言处理树立了新标准,展示了它们在理解和处理阿拉伯语复杂性方面的卓越性能。

image/webp

创建您自己的阿拉伯语语义搜索模型

创建您自己的语义搜索模型是实现高准确度和最小延迟的绝佳方法。这在将语义搜索模型部署到GPU上时尤其有效。

在本教程中,我们将使用来自Hugging Face的数据集“google/xtreme”,其中包含问题和上下文。该数据集为微调我们的语义搜索模型提供了丰富的数据源。它还提供了各种上下文和问题,使其非常适合我们的用例。

为RAG应用准备数据集

我们可以简单地使用以下代码为RAG应用准备数据集

# Load the dataset
dataset = load_dataset("google/xtreme", 'MLQA.ar.ar' , split="validation")
passages = dataset['context']

现在我们有了数据集,我们可以使用我们的阿拉伯语模型和Sentence Transformers对数据进行编码。创建一个Python脚本(确保已安装PyTorch和Sentence Transformers)。

from datasets import load_dataset
from sentence_transformers import SentenceTransformer, util
import torch

# Initialize the Hugging Face dataset and the SentenceTransformer model
model_name = 'Omartificial-Intelligence-Space/Arabert-all-nli-triplet-Matryoshka'
encoded_model_path = 'semantic_search_model.pt'

bi_encoder = SentenceTransformer(model_name)

# Load the dataset
dataset = load_dataset("google/xtreme", 'MLQA.ar.ar' , split="validation")
passages = dataset['context']

# Encode the passages
corpus_embeddings = bi_encoder.encode(
    passages, batch_size=32, convert_to_tensor=True, show_progress_bar=True)

# Save the encoded model
torch.save(corpus_embeddings, encoded_model_path)

因此,该代码下载并使用Omartificial-Intelligence-Space/Arabert-all-nli-triplet-Matryoshka作为基础模型,并用它来编码我们的数据(“我们的最佳模型,在STS17 ar-ar评估的MTEB排行榜上排名第一”)。您可以从我们的集合中选择许多可用的阿拉伯语套娃嵌入模型:https://huggingface.co/collections/Omartificial-Intelligence-Space/arabic-matryoshka-embedding-models-666f764d3b570f44d7f77d4e,具体取决于您的要求,如模型大小和用例。此外,根据您的硬件,您需要调整“batch_size”参数以加快编码过程。创建后,您可以使用以下Python脚本进行模型推理

import csv
import torch

semantic_search_model = torch.load('semantic_search_model.pt')


question_embedding = bi_encoder.encode(
    "أين يتم استخدام الحمض النووي اليوم؟", convert_to_tensor=True)
hits = util.semantic_search(
    question_embedding, semantic_search_model, top_k=3)
hits = hits[0]

result = {"search_results": [
    {"score": hit['score'], "text": passages[hit['corpus_id']]} for hit in hits]}

result["search_results"]

输出

[{'score': 0.4949629604816437,
  'text': 'تفاعل البوليميريز التسلسلي والذي يعرف اختصارًا بتحليل PCR (الحمض النووي - DNA) أصبح من الممكن إجراء تحليل DNA في هذه الأيام باستخدام كميات صغيرة جدًا من الدم: وعلى الرغم من أن هذا التحليل يستخدم كثيرًا في الطب الشرعي، فإنه أصبح الآن جزءًا من عملية تشخيص العديد من الاضطرابات.'},
 {'score': 0.4260385036468506,
  'text': 'هابلوغروب L1 الميتوكوندرية  (بالإنجليزية:  Haplogroup L1 (mtDNA)) هي مجموعة جينات مميزة من دنا متقدرة بشرية ، تتوارثها الذكور والإناث عن الأم ولكن لا تتوارث من الأب. عندما  تتابعها الدراسات فهي تدرس  تتابعها في الإناث ؛ أي توارث  تلك المجموعة الجينية للبنت من الأم من الجدة ...وهكذا في الزمن الماضي.'},
 {'score': 0.37338581681251526,
  'text': 'هذا وتتطلب بعض تحاليل الدم الصوم (أو الامتناع عن الأكل) قبل سحب عينة الدم بفترة تتراوح بين 8 و12 ساعة. ومن أمثلة هذه التحاليل تلك التحاليل التي تقيس نسبة الجلوكوز أو الكوليسترول في الدم، أو تلك التي تستخدم لتحديد وجود أي من الأمراض المنقولة بالاتصال الجنسي من عدمه.  وبالنسبة لغالبية تحاليل الدم، فإنه عادةً ما يتم الحصول على عينة الدم من وريد المريض. ومع ذلك، تتطلب تحاليل دم أخرى متخصصة، مثل تحليل غاز الدم الشرياني سحب الدم من الشريان. هذا ويستخدم تحليل غاز الدم الشرياني في المقام الأول في رصد مستويات غاز ثاني أكسيد الكربون وغاز الأكسجين المرتبطين بوظائف الرئة، ولكنه يستخدم أيضًا في قياس درجة الحموضة في الدم ومستويات البيكربونات في ظل ظروف أيض معينة.'}]

通过使用带有“top_k”参数的semantic_search_model,我们可以确定我们想要返回多少结果。在结果中,我们显示了数据集中匹配的文本以及置信度分数。这个分数很重要,因为它帮助我们决定是否接受响应。由于我们的嵌入模型已成功用于构建语义搜索模型,我们已有效地完成了检索过程。然而,语义搜索的主要局限性在于它返回数据集中的原始文本,而不能直接回答问题。这就是生成组件发挥作用的地方。通过将生成式AI与GPT3.5模型等大型语言模型(LLM)的力量结合起来,我们可以将语义搜索模型的最佳结果作为上下文传递给LLM,以生成对查询的格式化答案。

from openai import OpenAI

# Function to perform semantic search
def semantic_search(query, top_k=3):
    question_embedding = bi_encoder.encode(query, convert_to_tensor=True)
    hits = util.semantic_search(question_embedding, semantic_search_model, top_k=top_k)
    hits = hits[0]

    results = [{"score": hit['score'], "text": passages[hit['corpus_id']]} for hit in hits]
    return results

# Function to generate output using GPT-3.5 Turbo
def generate_response(context, query):
    client = OpenAI(api_key=api_key)  # Replace with your OpenAI API key
    response = client.chat.completions.create(
        model="gpt-3.5-turbo",
        messages=[
            {"role": "system", "content": "You are an assistant providing detailed and accurate information."},
            {"role": "user", "content": f"Question: {query}\n\nContext: {context}"}
        ]
    )
    return response.choices[0].message.content

通过使用此代码,我们可以使用语义搜索和生成部分来实现RAG管道。首先,我们加载了预训练的语义搜索模型,并创建了一个名为semantic_search的函数,该函数接收查询并从数据集中返回最相关的段落。该函数对查询进行编码,使用SentenceTransformers执行语义搜索,并检索最佳结果。

为了解决语义搜索返回原始文本的局限性,我们添加了使用OpenAI的GPT-3.5 Turbo的生成组件。generate_response函数从顶部搜索结果中获取上下文,并生成对用户查询的详细答案,结合了检索和生成AI的优势。

接下来,让我们尝试一些查询模型

# Example query
query = "من هو ستيفن ميلر؟"
search_results = semantic_search(query)

# Get the highest scoring context
highest_scoring_context = search_results[0]['text']
# Generate response using GPT-3.5 Turbo
response = generate_response(highest_scoring_context, query)

# Print the results
print("Search Results:", search_results)

Search Results: [{'score': 0.4687502682209015, 'text': 'ستيفن ميلر (ولد في 23 أغسطس 1985) هو أمريكي من أقصى اليمين والناشط السياسي الذي يشغل منصب مستشار سياسات الرئيس دونالد ترامب. كان مدير الاتصالات سابقا ثم المسئول عن جلسات السيناتورألاباما جيف. كما كان السكرتير الصحفي لميشيل باخمان الممثل الجمهوري و جون شديج .'}, {'score': 0.3333923816680908, 'text': 'ألكسندر بوب (بالإنجليزية: Alexander Pope) \u200f(21 مايو 1688—30 مايو 1744) هو شاعر إنجليزي شهير من القرن الثامن عشر، واشتهر بمقاطع شعرية ساخرة وبترجمته لأعمال هوميروس. وهو ثالث كاتب يتم الاقتباس منه في قاموس أكسفورد للاقتباسات، بعد شكسبير وألفريد تنيسون. واشتهر بوب باستخدام مقطع الشعر البطولي.'}, {'score': 0.31834760308265686, 'text': 'كريستيان كريستيانوفيتش ستيفن (19 يناير (30) 1781، 30 أبريل 1863) (بالروسية: Христиан Христианович Стевен) هو عالم نبات وعالم حشرات روي.'}

然后,此请求返回类似以下内容的回应:

response
ستيفن ميلر هو ناشط السياسي الذي يشغل منصب مستشار سياسات الرئيس دونالد ترامب

语义搜索模型与在向量数据库中存储嵌入有什么区别?

在检索增强生成(RAG)系统中,实现语义搜索的两种有效方法是使用本地编码数据或利用向量数据库。当您编码自己的数据时,您将数据转换为张量,然后可以将其加载到GPU上以增强性能。这种方法特别有利于实现极低的延迟,因为GPU的处理能力显著加速了计算。然而,这种方法需要每次更新数据集时重新编码数据,这对于快速变化的数据来说可能很麻烦。或者,向量数据库是一种专门的系统,旨在存储、索引和高效查询高维向量。这种方法提供了更大的灵活性,允许增量更新,而无需重新编码整个数据集。向量数据库,例如PG Vector,非常适合底层数据频繁更改的应用程序,简化了维护最新嵌入的过程。对于追求最小延迟的企业,建议将编码数据加载到GPU上。但是,对于数据频繁更改的环境,使用向量数据库可以提供更易于管理和可扩展的解决方案。

结论

在本文中,我们演示了使用套娃嵌入模型创建专为阿拉伯语自然语言处理(NLP)定制的强大语义搜索模型的过程。通过利用语义搜索和检索增强生成(RAG)的先进技术,我们突出了我们微调模型的优势,这些模型在MTEB排行榜的STS17阿拉伯语-阿拉伯语任务中取得了领先地位。这一成就强调了我们捕获阿拉伯语独特语义细微差别的有效性。我们探讨了使用多样化训练数据,重点关注阿拉伯语NLI三元组数据集来微调我们的模型并提高其性能。通过这一细致的微调过程,我们的模型在各种NLP任务中展示了卓越的准确性和鲁棒性。

我们与Matryoshka嵌入模型以及语义搜索和生成式AI技术的成功整合,为更准确、更具上下文相关性的问答系统铺平了道路。随着我们不断完善和扩展模型,我们将继续致力于推进阿拉伯语自然语言处理,并应对其丰富语言多样性带来的独特挑战。

资源

[1] 本文内容和代码灵感来自 https://nlpcloud.com/fine-tuning-semantic-search-model-with-sentence-transformers-for-rag-application.html#:~:text=RAG%20is%20a%20key%20component,a%20model%20proves%20extremely%20powerful. [2] 了解更多关于Huggingface博客文章中套娃嵌入模型的信息 https://huggingface.co/blog/matryoshka [3] 查看阿拉伯语套娃嵌入模型集合 https://huggingface.co/collections/Omartificial-Intelligence-Space/arabic-matryoshka-embedding-models-666f764d3b570f44d7f77d4e [4] 查看阿拉伯语套娃嵌入数据集集合 https://huggingface.co/collections/Omartificial-Intelligence-Space/arabic-nli-and-semantic-similarity-datasets-6671ba0a5e4cd3f5caca50c3

作者:奥马尔·纳贾尔

社区

注册登录 评论