# Multilingual embedding 在构建非英语 RAG 系统时很重要

嵌入是现代生成式 AI 的基石,默默地驱动着我们每天与之交互的许多系统的功能。简单地说,嵌入是文本的数字表示——有效地将单词、句子甚至整个文档转换为数字。这些数字远非随机;它们经过精心设计,可以捕捉文本中的含义和关系。例如,“狗”和“小狗”的嵌入在数字空间中比“汽车”的嵌入更接近,反映了它们的语义相似性。这种将含义编码为可测量形式的能力使得嵌入对于搜索、推荐系统和高级 AI 应用程序(如检索增强生成 (RAG))等任务不可或缺。

在这里插入图片描述

这种数字转换使 AI 能够以有意义的方式比较和理解文本。在处理大量数据时(RAG 系统中经常出现这种情况),嵌入变得至关重要。这些系统将嵌入的功能与称为矢量数据库的专用存储解决方案相结合。与搜索精确匹配的传统数据库不同,矢量数据库经过优化,可根据含义找到最接近的匹配。此功能使 RAG 系统能够从庞大的知识库中检索最相关的信息,并使用它来生成精确的、符合上下文的响应。通过将原始数据和智能检索连接起来,嵌入和矢量数据库共同构成了 RAG 系统成功的支柱。

多语言系统的挑战

构建在英语中运行良好的 RAG 系统已经是一项复杂的任务,但将其扩展到其他语言则带来了一系列全新的挑战。由于训练数据丰富且语言结构简单,英语嵌入通常经过高度优化。但是,将这些英语训练的嵌入用于其他语言可能会导致严重的不准确性。不同的语言有自己的细微差别、语法和文化背景,而主要在英语文本上训练的标准嵌入模型通常无法捕捉到这些差别。虽然存在一些多语言嵌入模型来弥补这一差距,但它们在各种语言中的效果并不相同,特别是对于那些训练数据有限或语言特征独特的语言。这使得构建对非英语语言和英语一样准确可靠的 RAG 系统变得困难。

为什么英语嵌入更准确?

1. 大量高质量训练数据

英语在数字领域占据主导地位,可供训练的高质量内容数量空前庞大。维基百科、书籍、研究论文和社交媒体等数据集中的英语比其他语言丰富得多。相比之下,许多语言,尤其是资源匮乏的语言,缺乏多样化和标准化的数据集,这限制了在这些语言上训练的嵌入的质量。

2. 模型优化偏差

BERT 和 GPT 等 NLP 模型最初是针对英语开发和优化的,即使在多语言版本中也经常优先考虑英语。多语言模型在同一参数空间内平衡多种语言的学习,这可能会降低代表性较低的语言的性能,而有利于英语等主导语言。

3. 语言复杂性和多样性

与许多其他语言相比,英语的形态相对简单。例如,英语中的词形往往保持一致(例如“run”和“running”),而土耳其语或芬兰语等语言具有高度的词形变化,其中一个词根可以有几十种变体。此外,具有不同语法或词序的语言,例如日语(主语-宾语-动词)或阿拉伯语(灵活词序),对针对类似英语的结构进行优化的模型提出了额外的挑战。

4. 语义和文化一致性

跨语言捕捉语义意义绝非易事。单词和短语通常带有无法直接翻译的细微含义。例如,英语单词“love”在其他语言中有多个文化上不同的对应词(例如西班牙语中的“amor”,希腊语中的“eros”或“agape”)。无法解释这些差异的嵌入将难以进行多语言对齐。

5. 基准测试和评估偏差

许多基准测试数据集和评估方法都是以英语为设计理念的。这种以英语为中心的关注可能会人为地夸大模型在英语中的感知性能,同时掩盖其在其他语言中的局限性。

对 RAG 系统的影响

当嵌入无法处理其他语言的复杂性时,对 RAG 系统的影响可能非常严重。检索结果通常会变得不那么相关,甚至完全错误,因为嵌入可能难以捕捉非英语查询的细微含义。这不仅会影响准确性,还会破坏用户信任和系统的整体效用。检索过程中可能会遗漏关键文本块,从而阻止系统访问生成准确且上下文相关的响应所需的信息。

为了使多语言 RAG 系统表现良好,它需要能够跨语言语义对齐的嵌入,同时考虑到其独特的结构和文化复杂性。投资高质量的多语言嵌入并针对特定语言或任务对其进行微调至关重要。这可确保 RAG 系统能够满足任何语言(而不仅仅是英语)用户的需求。

但是,不同的嵌入在非英语环境中的实际表现如何?为了探索这一点,我们将使用荷兰数据集将英语嵌入模型与多语言嵌入模型进行比较。该测试将揭示不同的嵌入方法如何影响多语言 RAG 系统中检索准确性和生成的响应的质量。

比较荷兰语 RAG 系统的嵌入模型

为了了解不同的嵌入模型如何处理荷兰语等非英语语言,我们将比较 Amazon Bedrock 上的两种模型:Cohere Embed English v3 和 Cohere Embed Multilingual v3。这些模型代表了不同的嵌入方法——一种专门针对英语进行了优化,另一种专为多语言任务而设计。下表总结了它们的主要属性:

在这里插入图片描述

构建嵌入

为了评估嵌入模型的性能,我们将使用 LangChain 框架构建本地向量存储。在此次评估中,我们将使用荷兰语编写的消防员指南作为数据集。此文档包含技术和程序信息,使其成为非英语语言语义检索的现实且具有挑战性的用例。以下是用于创建本地向量存储和索引文档块的干净且精简的代码。我们将使用此设置来测试两个嵌入模型:Cohere Embed English v3 和 Cohere Embed Multilingual v3。

import os
from langchain_community.document_loaders import DirectoryLoader
from langchain.text_splitter import RecursiveCharacterTextSplitter
from langchain.vectorstores import FAISS
from langchain_aws import BedrockEmbeddings
import boto3

# Step 1: Load documents
loader = DirectoryLoader('data', glob="**/*.pdf")  # Adjust 'data' to your document directory
documents = loader.load()

print(f"You have {len(documents)} documents")
print(f"Document 1 contains {len(documents[0].page_content)} characters")

# Step 2: Split documents into smaller chunks
text_splitter = RecursiveCharacterTextSplitter(chunk_size=400, chunk_overlap=50)
chunks = text_splitter.split_documents(documents)

print(f"You have {len(chunks)} chunks")
print(f"The first chunk is {len(chunks[0].page_content)} characters long")

# Step 3: Set up Bedrock embeddings
bedrock_client = boto3.client("bedrock-runtime", region_name='us-east-1')
bedrock_embeddings = BedrockEmbeddings(model_id="cohere.embed-multilingual-v3", client=bedrock_client)

# Step 4: Build the FAISS vectorstore
vectorstore = FAISS.from_documents(chunks, bedrock_embeddings)

# Save the vectorstore locally for reuse
vectorstore.save_local("faiss_cohere_multilingual")

评估嵌入模型

为了评估嵌入模型的性能,我们将提出以下问题:“Welke rangen zijn er bij de brandweer?”,翻译为“消防部门内有哪些等级?”。之所以选择这个问题,是因为我们的文档仅使用了术语“hiërarchie”,它在荷兰语中的语义含义与“rangen”相似。然而,在英语中,“hierarchy”和“ranks”并不具有语义相似性。

在这里插入图片描述

这种区别对于我们的测试至关重要。我们预计 Cohere Embed English v3 模型会难以处理此查询,因为它依赖于英语语义,而术语之间没有关联。另一方面,经过训练可以理解荷兰语语义的 Cohere Embed Multilingual v3 模型应该能够从文档中检索正确的信息,从而展示其处理非英语语言中的语义细微差别的能力。

通过提出这个问题,我们旨在强调语义对齐如何影响荷兰 RAG 系统中的检索性能。此测试将清晰地比较模型处理非英语查询和检索相关信息的能力。结果将展示多语言嵌入对于在非英语环境中实现准确检索的重要性。

要实现和测试此设置,我们可以使用以下代码。此脚本演示了如何查询向量存储并利用 RAG 链将嵌入与语言模型相结合以回答问题。请注意,在测试不同的嵌入时(例如,Cohere Embed English v3 与 Cohere Embed Multilingual v3),您需要确保使用相应的嵌入模型构建了 vectorstore。将 vectorstore 替换为使用要测试的嵌入模型索引的 vectorstore,以获得准确的结果。

from langchain.prompts import ChatPromptTemplate
from langchain_aws import ChatBedrock
from langchain_core.runnables import RunnablePassthrough
from langchain_core.output_parsers import StrOutputParser

instructions = """Je bent een brandweer expert. Beantwoord de vraag, maak gebruik van de context"""

human = """
Dit is de context: {context}
Dit is de vraag: {question}
"""

prompt = ChatPromptTemplate(
    messages=[
        SystemMessagePromptTemplate.from_template(instructions),
        HumanMessagePromptTemplate.from_template(human), #User query will go here
    ],
    input_variables=['context','question'], # context provided by retriever and question by the user
)
model = ChatOpenAI(
    model="gpt-4",  # or "gpt-3.5-turbo" based on your needs
    temperature=0,
    max_tokens=512
)

# Function to merge text chunks
def format_docs(docs):
    return "\n\n".join(doc.page_content for doc in docs)


# RAG chain
rag_chain = (
        {"context": vectorstore.as_retriever(k=10) | format_docs, "question": RunnablePassthrough()}
        | prompt
        | model
        | StrOutputParser()
)

rag_chain.invoke("Welke rangen zijn er bij de brandweer?")

嵌入模型的结果

为了评估两个嵌入模型的性能,我们提出了一个问题:“Welke rangen zijn er bij de brandweer?” (翻译:“消防部门内有哪些级别?”)。以下是每个模型生成的响应:

Cohere Embed English v3

回复:

“De tekst geeft geen specifieke informatie over de verschillende rangen binnen de brandweer. Echter, in veel brandweerorganisaties zijn er verschillende rangen zoals brandweerman, luitenant, kapitein, bataljonschef, assistent-chef en brandweerchef. De specifieke rangen kunnen variëren afhankelijk van het land en de specifieke organisatie.”

“文本没有提供有关消防队内不同级别的具体信息。然而,在许多消防组织中,有不同的级别,如消防员、中尉、队长、营长、助理队长和消防队长。具体排名可能会根据国家和具体组织的不同而有所不同。”

分析:

该响应是通用的,不依赖于荷兰文档中提供的上下文。这是预料之中的,因为英语嵌入模型很难连接“层次结构”(在文档中使用)和“排名”(在查询中使用)之间的语义相似性。因此,它默认为有关消防部门等级的一般知识。

Cohere Embed Multilingual v3

回复:

“Binnen de brandweer zijn er verschillende rangen. Deze zijn onderverdeeld in het basiskader en het middenkader. In het basiskader hebben we de B01 brandweerman en de B02 korporaal. In het middenkader, dat bestaat uit onderofficieren, hebben we de M01 sergeant en de M02 adjudant. Deze rangen worden aangeduid op het diensttenue, het uitgaanstenue en op de interventiekledij.”

“消防队内有不同的级别。分为基础管理和中层管理。在基本框架中,我们有B01消防员和B02下士。在由士官组成的中层管理中,我们有M01中士和M02副官。这些级别都标在常务制服、外出制服和干预服装上。”

分析:

此响应高度相关并准确地从文档中检索信息。多语言嵌入模型成功识别了“层次结构”(上下文)和“排名”(查询)之间的语义关系。它直接根据文档内容提供详细答案,展示了其有效处理荷兰语特定语义的能力。

要点

Cohere Embed English v3:由于查询和文档术语之间缺乏语义对齐,英语模型无法从荷兰语文档中检索相关上下文。这凸显了在非英语任务中使用特定于英语的嵌入的局限性。

Cohere Embed Multilingual v3:多语言模型在本次测试中表现出色,从荷兰语文档中检索和利用上下文相关信息。这证明了多语言嵌入对于实现准确检索和有效回答非英语查询的重要性。

结论

本次评估突出了一个关键见解,对于任何为非英语语言构建检索增强生成 (RAG) 系统的人来说:嵌入很重要,尤其是当任务需要跨语言的细微理解时。Cohere Embed English v3 和 Cohere Embed Multilingual v3 模型之间的性能对比说明了非英语环境中英语特定嵌入的局限性以及多语言模型的巨大价值。

当被要求回答荷兰语查询时,多语言模型表现出色,直接从文档中检索准确且上下文丰富的信息。与此同时,英语嵌入模型默认为通用的、不相关的知识,表明它无法弥合查询和文档内容之间的语义差距。

对于在全球多语言环境中开发 AI 系统的组织来说,这项测试强调了为手头的任务选择正确的嵌入模型的重要性。多语言嵌入不仅仅是一个“好有”的功能;它们对于确保非英语应用程序中的准确性、相关性和用户信任至关重要。

随着生成式人工智能的影响力不断扩大,通过更好的嵌入来拥抱语言多样性将成为在全球范围内提供有意义且有影响力的解决方案的关键。通过优先考虑多语言能力,企业可以创建不仅更智能而且更具包容性的系统——为跨语言和文化的用户提供支持。

如何学习大模型

现在社会上大模型越来越普及了,已经有很多人都想往这里面扎,但是却找不到适合的方法去学习。

作为一名资深码农,初入大模型时也吃了很多亏,踩了无数坑。现在我想把我的经验和知识分享给你们,帮助你们学习AI大模型,能够解决你们学习中的困难。

下面这些都是我当初辛苦整理和花钱购买的资料,现在我已将重要的AI大模型资料包括市面上AI大模型各大白皮书、AGI大模型系统学习路线、AI大模型视频教程、实战学习,等录播视频免费分享出来,需要的小伙伴可以扫取。

一、AGI大模型系统学习路线

很多人学习大模型的时候没有方向,东学一点西学一点,像只无头苍蝇乱撞,我下面分享的这个学习路线希望能够帮助到你们学习AI大模型。

在这里插入图片描述

二、AI大模型视频教程

在这里插入图片描述

三、AI大模型各大学习书籍

在这里插入图片描述

四、AI大模型各大场景实战案例

在这里插入图片描述

五、结束语

学习AI大模型是当前科技发展的趋势,它不仅能够为我们提供更多的机会和挑战,还能够让我们更好地理解和应用人工智能技术。通过学习AI大模型,我们可以深入了解深度学习、神经网络等核心概念,并将其应用于自然语言处理、计算机视觉、语音识别等领域。同时,掌握AI大模型还能够为我们的职业发展增添竞争力,成为未来技术领域的领导者。

再者,学习AI大模型也能为我们自己创造更多的价值,提供更多的岗位以及副业创收,让自己的生活更上一层楼。

因此,学习AI大模型是一项有前景且值得投入的时间和精力的重要选择。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值