技术干货

Voyage AI 嵌入和重排器用于搜索和 RAG

2024-07-26

By Haziqa Sajid

Voyage AI 嵌入和重排器用于搜索和 RAG

**引言**

过去,AI 主要用于分析和建议信息;然而,随着生成性 AI 的出现,我们现在可以生成新的、独特的内容。这听起来很酷,但有时内容可能会误导人。

进入 RAG(检索增强生成),它优化了大型语言模型的输出,提供了查询的上下文。Zilliz 和 Voyage AI 合作,使构建 RAG 管道变得简单,我们将在文章后面看到。Voyage AI 提供特定领域的定制嵌入模型和用于搜索的重排器。我们将在本文中讨论其中的一些。

**使用 Zilliz Cloud 管道和 Voyage AI 构建 RAG**

嵌入模型和 Voyage AI

计算机无法像文本或图像这样的数据一样理解信息。我们使用嵌入模型使计算机能够理解非结构化数据背后的语义。本节将介绍嵌入模型的基础知识,它们在生成性 AI 中的用途,以及为什么 RAG 是企业生成性 AI 的主要方法。

**嵌入模型简介**

嵌入模型是深度学习模型,它们为给定的数据创建向量嵌入。这些模型将提供的文字、图像、声音或任何形式的非数值或数值数据转换为紧凑的向量表示。这种表示,也称为向量嵌入,将信息映射到数值向量空间。

**将非结构化数据编码为向量嵌入**

生成性 AI 的不足

由于其自动化繁琐任务和以最少的努力产生结果的惊人能力,生成性 AI 在企业层面的使用正在激增。尽管 Gen AI 在帮助我们应对各种场景中值得称赞,但它也有不足之处。例如 ChatGPT 这样的 GenAI 模型是在数百万或数万亿来自多个领域的数据条目上训练的通用模型。这一事实有时可能会有问题。模型是概率性的,根据提供的上下文生成下一个词。当上下文有限或对模型来说是新的时,它们开始产生幻觉。这就是 RAG 闪耀的地方。

**RAG 如何减少幻觉**

RAG 技术要求使用特定领域的嵌入模型来嵌入提供的查询。然后,这个查询被带到一个向量数据库,在那里应用语义搜索来获取类似的上下文向量嵌入。向量数据库中的所有相关文档和提供的查询然后传递给模型。模型使用查询中的额外信息和上下文来制定相关、最新和准确的结果。这样,RAG 架构减少了模型的幻觉,并允许更健壮可靠的大型语言模型(LLM)。

**RAG 架构**

现在我们已经讨论了嵌入模型及其在 RAG 中的作用,让我们讨论一些 Voyage AI 嵌入模型。Voyage AI 在许多领域提供各种定制的嵌入模型,以执行有效和高效的 RAG 技术。这些模型与向量数据库(如 Zilliz 的 Milvus)相连,用于存储和检索与生成的查询相关的向量嵌入。

**Voyage AI 嵌入模型**

Voyage AI 提供许多不同高效和有效的特定领域和通用目的嵌入模型。这些模型在搜索和 RAG 中的贡献显著,它们比大多数嵌入模型提供更高的检索质量。

在多个嵌入模型中,最好的包括 voyage-code-2、voyage-law-2 和 voyage-large-2-instruct。Voyage AI 为特定的代码、法律、金融和多语言领域开发了这些模型。此外,我们可以根据特定的用例定制这些模型。让我们看看它们的最新模型:

- voyage-code-2:一个在提供与查询相关的代码方面非常熟练的模型,具有精确的准确性。下图显示了 voyage-code-2 在代码检索任务中的性能:

- voyage-law-2:一个训练有素的模型,用于获取法律文件的上下文和嵌入。这个模型在跨领域的长上下文法律文件方面提供了最佳结果,并且在跨领域的通用语料库上表现更好。下图突出了 voyage-law-2 的性能:

上图显示了 Voyage AI 嵌入模型的性能能力,它们在 Massive Text Embedding Benchmark (MTEB) 中排名靠前。

**重排器和 Voyage AI**

我们已经讨论了 RAG 如何通过减少这些模型的幻觉来提高 GenAI 输出的质量。然而,一个轻微的问题仍然与 GenAI 模型的上下文窗口有关。上下文窗口指的是 AI 模型在任何给定时间可以处理的最大信息量。窗口较小意味着模型获得的信息较少;窗口较大意味着处理成本和时间增加。

重排器通过计算它们与提供的查询的相关性得分,对从向量数据库获取的文档进行排名,以获得最佳结果。排名有助于筛选最相关(信息性)的文档以适应上下文窗口,并生成最准确的结果。

虽然 RAG 技术获取向量嵌入以提供上下文信息并协助搜索,但这些模型使用相关性得分对所有获取的嵌入进行重排,以便向 LLM 提供最相关的数据。

**简单的重排器架构**

Voyage AI 重排器

Voyage AI 开发了一个名为 rerank-lite-1 的重排器模型。这个 Voyage 模型是一个通用的重排器,针对延迟和质量进行了优化。它有一个 4000 个令牌的上下文窗口。下图显示了这个模型的性能。

**在 Zilliz Cloud 管道上使用 Voyage 嵌入**

Zilliz 和 Voyage AI 合作,简化了在 Zilliz Cloud 上将非结构化数据转换为可搜索的向量嵌入的过程。

本节将展示如何集成 Zilliz Cloud 和 Voyage AI 嵌入模型,以简化嵌入生成和检索。我们还将向您展示如何使用此集成和 Cohere(LLM)构建 RAG 应用程序。让我们开始吧。

**设置 Zilliz Cloud**

第一步是设置 Zilliz Cloud。如果您还没有 Zilliz Cloud 账户,请免费注册。

首次登录时,将显示以下控制台。

Zilliz 云控制台用于创建集群

我们将按需创建集群。Zilliz 提供免费层,用于学习、实验和原型设计,后续可以迁移到不同的生产计划。

创建新的集群后,将显示所有连接所需的信息。

连接到集群

项目 ID 可以从顶部菜单栏中的项目中检索。找到目标项目,并将 ID 复制到项目 ID 列。

项目仪表板用于项目 ID

现在,我们拥有了连接到集群所需的所有要素。是时候构建我们的管道了。我们将使用 Cohere 作为 RAG 应用程序的 LLM。为此,我们将安装 cohere。

```

%pip install cohere

```

以下是我们这个笔记本所需的导入。

```python

import os

import requests

```

在下面的代码中,我们设置了我们的 CLOUD_REGION、CLUSTER_ID、API_KEY 和 PROJECT_ID:

```python

CLOUD_REGION = 'gcp-us-west1'

CLUSTER_ID = 'your CLUSTER_ID'

API_KEY = 'your API_KEY'

PROJECT_ID = 'your PROJECT_ID'

```

**Zilliz Cloud 管道**

Zilliz Cloud 管道将非结构化数据转换为可搜索的向量集合,处理嵌入、摄取、搜索和删除过程。Zilliz Cloud 提供三种类型的管道:

摄取管道:将非结构化数据转换为可搜索的向量嵌入,并将其存储在 Zilliz Cloud 向量数据库中。它包括用于转换输入字段和保留检索的附加信息的各种功能。

搜索管道:此管道通过将查询字符串转换为向量嵌入并检索 Top-K 最相似向量及其对应的文本和元数据,启用语义搜索。它只允许一种函数类型。

删除管道:从集合中删除指定的实体,只允许一种函数类型。

**摄取管道**

在摄取管道中,您可以指定函数以根据输入数据自定义其行为。目前,它支持四个函数:

- INDEX_DOC:将文档作为输入,将其分割成块,并为每个块生成向量嵌入。它将输入字段映射到集合中的四个输出字段(doc_name、chunk_id、chunk_text 和 embedding)。

- PRESERVE:将用户定义的输入存储为集合中的附加标量字段,通常用于存储元信息,如发布者信息和标签。

- INDEX_TEXT:通过将每个文本转换为向量嵌入来处理文本,并将输入字段(text_list)映射到两个输出字段(text 和 embedding)。

- INDEX_IMAGE:通过生成图像嵌入来处理图像,将两个输入字段(image_url 和 image_id)映射到两个输出字段(image_id 和 embedding)。

在下面的代码片段中,我们将使用 requests 库向 Zilliz 云发送请求。一个 post 请求包括 URL、头部和要发送的数据。让我们设置我们的头部:

```python

headers = {

"Content-Type": "application/json",

"Accept": "application/json",

"Authorization": f"Bearer {API_KEY}"

}

```

我们将在下面的代码中定义我们的 collection_name 和 embedding_service。嵌入服务将利用 Voyage AI 模型,特别是 voyage-2,它在检索任务、技术文档和一般应用中表现出色。

```python

create_pipeline_url = f"https://controller.api.{CLOUD_REGION}.zillizcloud.com/v1/pipelines"

collection_name = 'Documents'

embedding_service = "voyageai/voyage-large

好的,让我们继续翻译:

```python

data = {

"name": "ingestion_pipeline",

"description": "A pipeline that generates text embeddings and stores title information.",

"type": "INGESTION",

"projectId": PROJECT_ID,

"clusterId": CLUSTER_ID,

"collectionName": collection_name,

"functions": [

{

"name": "index_doc",

"action": "INDEX_DOC",

"language": "ENGLISH",

"embedding": embedding_service

}

]

}

response = requests.post(create_pipeline_url, headers=headers, json=data)

print(response.json())

ingestion_pipe_id = response.json()["data"]["pipelineId"]

print(ingestion_pipe_id)

# 这是在云端创建的集合:

# 云端创建的集合

# 我们的摄取管道看起来像这样:

# Zilliz Cloud 中的摄取管道

# 搜索管道

# 搜索管道通过将查询字符串转换为向量嵌入并检索 Top-K 最接近的邻居向量来促进语义搜索。搜索管道具有 SEARCH_DOC_CHUNK 功能,需要指定集群和要搜索的集合。

# Zilliz 支持许多功能。在这里,我们将使用 SEARCH_DOC_CHUNK,它输入用户查询并返回知识库中的相关文档块。

data = {

"projectId": PROJECT_ID,

"name": "search_pipeline",

"description": "A pipeline that receives text and searches for semantically similar doc chunks",

"type": "SEARCH",

"functions": [

{

"name": "search_chunk_text",

"action": "SEARCH_DOC_CHUNK",

"inputField": "query_text",

"clusterId": f"{CLUSTER_ID}",

"collectionName": f"{collection_name}",

"embedding": embedding_service

}

]

}

response = requests.post(create_pipeline_url, headers=headers, json=data)

search_pipe_id = response.json()["data"]["pipelineId"]

# 我们已经创建了摄取和搜索管道。是时候将这篇文章插入我们的摄取管道并运行我们的搜索管道了。

# 运行摄取管道

# 摄取管道可以从对象存储服务(如 AWS S3 或 Google Cloud Storage (GCS))中摄取文件。接受的文件格式包括 .txt、.pdf、.md、.html 等。我们可以从 Zilliz 控制台运行摄取管道。让我们一步步来。

1. 从左侧转到 Pipelines 并导航到如下所示的 ingestion_pipeline:

# 云端创建的摄取管道

2. 点击 Run 后,我们将被提示到以下页面:

# 摄取管道中附加文件

附加文本文件并运行管道。成功后,文本文件将被加载到集合中。这是数据预览:

# 集合的数据预览

# 运行搜索管道

# RAG(检索增强生成)有两个主要组成部分:检索器和 LLM。创建检索器就像运行搜索管道一样简单。搜索管道接收查询并从数据库中检索最相关的块。在下面的代码中,函数 retriever 接收 query 和 topk(要选取的文档数量)并运行搜索管道。

def retriever(question, topk):

run_pipeline_url = f"https://controller.api.{CLOUD_REGION}.zillizcloud.com/v1/pipelines/{search_pipe_id}/run"

data = {

"data": {

"query_text": question

},

"params": {

"limit": topk,

"offset": 0,

"outputFields": [

"chunk_text",

"id",

"doc_name"

],

}

}

response = requests.post(run_pipeline_url, headers=headers, json=data)

return [result['chunk_text'] for result in response.json()['data']['result']]

# 使用 Cohere 作为 LLM 的 RAG 应用程序

# 检索文档后,我们将使用 Cohere 作为我们的 LLM。我们将把检索到的文档提供给 Cohere 聊天 API,并用提示包裹起来,询问有关它的信息。

import cohere

co = cohere.Client(api_key="your_api_key")

def chatbot(query, topk):

chunks = retriever(query, topk)

response = co.chat(

model="command-r-plus",

message=f"Given this information: '{[chunk for chunk in chunks]}', generate a response for the following {query}"

)

return response.text

question = "I'm looking for a good model for legal retrieving tasks?"

print(chatbot(question, 2))

# 这是聊天机器人的响应:

# 根据提供的信息,看起来您特别感兴趣的是法律检索任务中的熟练模型。在这种情况下,最适合您需求的模型是 "voyage-law-2"。

# 结论

# Voyage AI 提供特定领域的定制嵌入模型和重排器,用于高级搜索。Zilliz Cloud 管道与 Zilliz Cloud 无缝集成,使 RAG 开发更加流畅。

# 本文讨论了流行的 voyage AI 嵌入模型和重排器及其与 Zilliz Cloud 的集成。我们还演示了如何使用 Voyage AI、Zilliz Cloud 管道和 Cohere 构建 RAG。

# 更多详情,观看 Tengyu Ma 在 Zilliz 主持的非结构化数据聚会上的演讲回放。

  • Haziqa Sajid

    Haziqa Sajid

    Freelance Technical Writer

    准备好开始了吗?

    立刻创建 Zilliz Cloud 集群,存储和检索您的向量。

    免费试用 Zilliz Cloud