
最近,许多嵌入模型和大型语言模型 (LLM) 在英语环境中表现出巨大的优势。由于英语是世界上使用人数最多的语言,许多语言模型在英语方面表现出色。然而,由于语义搜索和生成式 AI 应用程序需要能够处理除英语以外的语言,许多具有多语言能力的语言模型已经发布。这篇博文的灵感来自于论坛上最近的一个问题,询问是否可以使用 Weaviate 处理日语。

一般来说:是的,使用 Weaviate 向量数据库进行非英语语言的语义和生成式搜索是可行的,前提是使用的嵌入模型和 LLM 支持您选择的语言。
这篇博文探讨了如何在您的搜索和生成式 AI 应用程序中使用 Weaviate 处理非英语语言。具体而言,这篇博文讨论了非英语语言的挑战,例如需要能够胜任的语言模型以及无法使用 ASCII 编码的语言的复杂性,例如中文、印地语或日语。最后,它讨论了在使用非英语语言时 Weaviate 的当前限制。
使用 Weaviate 处理非英语语言的挑战
不同的语言,例如词汇、语法和字母表,在许多方面都存在差异。这些差异导致在搜索或生成式 AI 应用程序中使用非英语语言时出现两个主要挑战。
语言模型
无论您使用的是英语还是任何其他语言,您都需要确保使用的嵌入模型和 LLM 支持您的特定语言。例如,text2vec-cohere 的 embed-multilingual-v3.0 或 text2vec-openai 的 text-embedding-ada-002 都支持多种语言。请务必检查所选 向量化模块的文档,以确保嵌入模型支持您选择的语言。同样适用于 生成器集成。
字符编码
不同的语言可以使用不同的字母表,这些字母表在计算机科学中以不同的方式表示。标准的 ASCII 格式可以表示英语字母表,它在单个字节内编码 128 个指定的字符。但是,您需要 Unicode 编码标准来表示具有更多字符的字母表。
Unicode 是一种广泛使用的编码标准,用于表示所谓的代码点中的字符。您可能之前已经见过如下字符串
'\u8da3\u5473\u306f\u91ce\u7403\u3067\u3059\u3002'
这是一个转义的 Unicode 字符序列,可以轻松转换为人类可读的日语字符(”趣味は野球です。”,意思是“我的爱好是棒球。”)。
如何使用 Weaviate 处理非英语语言
本节使用我们的标准 快速入门教程,展示一个在日语文本数据上进行简单语义搜索查询的示例,而不是英语。示例数据点来自 论坛问题。您可以在 我们的 GitHub 仓库中找到相关的 Notebook。
步骤 1:创建 Weaviate 数据库并安装客户端库
前几个步骤与任何语言完全相同。
首先,您需要创建一个 Weaviate 实例来使用。为了测试目的,我们建议在 Weaviate Cloud (WCD) 上创建一个免费的云沙盒实例,方法是按照 WCD 快速入门 说明进行操作。
接下来,您需要安装您首选的 Weaviate 客户端,以便使用您首选的编程语言。
pip install "weaviate-client==3.*"
步骤 2:连接到 Weaviate 并定义一个数据集合
要连接到您的 Weaviate 实例,您需要您的 Weaviate 实例的 URL 和 API 密钥(从 WCD 的 Details 选项卡获取)。您还需要用于推断服务的 API 密钥。如“语言模型”中所讨论的那样,请确保您的模型支持您打算使用的语言。在本例中,OpenAI 的 text-embedding-ada-002 模型支持日语。
运行以下示例代码以连接到 Weaviate。您可以在后续步骤中重用结果 client 对象。
import weaviate
import json
import os
client = weaviate.Client(
url = os.environ["WEAVIATE_URL"],
auth_client_secret=weaviate.AuthApiKey(api_key=os.environ["WEAVIATE_API_KEY"]),
additional_headers = {
"X-OpenAI-Api-Key": os.environ["OPENAI_API_KEY"]
}
)
接下来,我们定义一个数据集合来存储对象。以下模式配置了一个名为 MyCollection 的类对象和一个向量化模块 text2vec-openai,默认情况下通过 OpenAI 的 text-embedding-ada-002 模型配置 OpenAI。此外,该模式定义了一个文本属性 content。最后,您可以使用此模式创建该类。
schema = {
"class": "MyCollection",
"vectorizer": "text2vec-openai",
"moduleConfig": {
"text2vec-openai": {},
},
"properties" : [
{
"name" : "content",
"dataType" : ["text"],
}
]
}
client.schema.create_class(schema)
步骤 3:添加日语数据对象
现在您可以将对象添加到 Weaviate。定义的 vectorizer 在导入期间自动为每个对象创建一个向量嵌入。以下代码加载示例数据并单独将数据对象添加到目标类 (MyCollection)。
data = [
"私の名前は鈴木(Suzuki)です。趣味は野球です。", # My name is Suzuki. My hobby is baseball.
"私の名前は佐藤(Sato)です。趣味はサッカーです。", # My name is Sato. My hobby is soccer.
"私の名前は田中(Tanaka)です。趣味はテニスです。" # My name is Tanaka. My hobby is tennis.
]
client.batch.configure(batch_size=10) # Configure batch
# Batch import all objects
# (Yes, batch import is an overkill for 3 objects, but it is recommended for large volumes of data)
with client.batch as batch:
for item in data:
properties = {
"content": item
}
# the call that performs data insert
batch.add_data_object(
class_name="MyCollection",
data_object=properties,
)
步骤 4:语义搜索查询
最后,您可以在 Weaviate 实例上运行一个简单的语义搜索查询。在本例中,nearText 搜索查找 Weaviate 中向量与给定输入文本的向量最相似的对象。运行以下代码以搜索向量与 バトミントン (badminton) 的向量最相似的对象。
response = (
client.query
.get("MyCollection", ["content"])
.with_near_text({"concepts": ["バトミントン"]})
.with_limit(2)
.do()
)
print(json.dumps(response, indent=4, ensure_ascii=False))
如果您在打印响应时将 ensure_ascii=False 设置为您的 json.dumps() 函数,您应该看到类似以下的结果
{
"data": {
"Get": {
"MyCollection": [
{
"content": "私の名前は鈴木(Suzuki)です。趣味は野球です。"
},
{
"content": "私の名前は田中(Tanaka)です。趣味はテニスです。"
}
]
}
}
}
响应包括一个列表,其中包含向量与单词 バトミントン 最相似的对象。
请注意,如果您未设置 ensure_ascii=False,则默认值为 ensure_ascii=True,因此您将看到转义的 Unicode 结果
{
"data": {
"Get": {
"MyCollection": [
{
"content": "\u79c1\u306e\u540d\u524d\u306f\u9234\u6728(Suzuki)\u3067\u3059\u3002\u8da3\u5473\u306f\u91ce\u7403\u3067\u3059\u3002"
},
{
"content": "\u79c1\u306e\u540d\u524d\u306f\u7530\u4e2d(Tanaka)\u3067\u3059\u3002\u8da3\u5473\u306f\u30c6\u30cb\u30b9\u3067\u3059\u3002"
}
]
}
}
}
要探索不同的查询,例如带有过滤器的语义搜索或生成式搜索,请查看相关的 GitHub 上的 Jupyter Notebook。
使用 Weaviate 处理非英语语言的当前限制
如您所见,您可以使用 Weaviate 向量数据库进行非英语语言的语义和生成式搜索应用程序。但是,我们目前没有对非英语语言的任何官方支持/策略,这导致了一些限制。
此限制主要影响 Weaviate 的基于关键字的搜索功能 BM25,因为我们目前只有标准的英语分词器。这意味着 BM25 搜索将为大多数非字母语言返回错误,尤其是需要 Unicode 编码的语言。
此限制还影响 Weaviate 的混合搜索功能。虽然您可以执行混合搜索查询而不会收到错误,但所有 alpha != 0 的混合搜索查询将返回与纯语义搜索相同的结果。具有 alpha = 0(纯基于关键字的搜索)的混合搜索将返回一个空结果列表。
如您所见,Weaviate 目前尚未完全支持非英语语言。然而,我们非常希望在未来支持其他语言。目前,我们正在试验实现 日语和中文的分词器。如果您有兴趣参与添加非英语语言支持,请通过 Slack 联系我们。
总结
这篇博客展示了您可以使用 Weaviate 进行语义和生成式搜索,支持非英语语言,例如日语,应用于您的搜索和生成式 AI 应用。为了启用此功能,您需要考虑以下两点:
- 确保您的嵌入模型(以及生成式搜索的 LLM)支持所选语言。
- 确保在打印响应时,通过在
json.dumps()函数中添加ensure_ascii=False来将转义的 Unicode 字符转换为人类可读的字符。
您可以立即参与并使用相关的 GitHub 上的 Jupyter Notebook 探索不同的查询。
如果您有兴趣参与添加非英语语言支持,请通过 Slack 联系我们。
准备开始构建了吗?
请查看 快速入门教程,或使用 Weaviate Cloud (WCD) 的免费试用版构建令人惊叹的应用程序。