Sign In
Free Sign Up
  • English
  • Español
  • 简体中文
  • Deutsch
  • 日本語
Sign In
Free Sign Up
  • English
  • Español
  • 简体中文
  • Deutsch
  • 日本語

如何快速上手 MyScale

数据是当今几乎所有组织的核心。随着数据量的不断增长,公司必须找到有效存储、处理和分析数据的方法。这导致了数据库市场的爆炸,公司既使用传统的 SQL 数据库,也使用较新的向量数据库来完成不同的任务。

然而,每种类型的数据库都有其权衡。传统的 SQL 数据库为结构化数据提供了一致性、准确性和易用性,而向量数据库则针对速度和可扩展性进行了优化,尤其是在处理大量非结构化数据时。但如果你不必选择呢?如果有一种数据库可以让你兼得两全呢?

在本博客中,我们将从创建表和定义索引到高级 SQL 向量搜索,逐步介绍 MyScale。最后,我们将比较 MyScale 与市场上其他数据库的优劣之处,看看为什么 MyScale 更好。那么,让我们开始吧。

# 什么是 MyScale

MyScale (opens new window) 是一款基于云的 SQL 向量数据库,专为管理大量用于 AI 应用的数据而设计。它基于 ClickHouse (opens new window)(一种 SQL 数据库)开发,将向量相似性搜索的能力与完整的 SQL 支持相结合。在单个界面中,SQL 查询可以同时快速利用不同的数据模态来处理复杂的 AI 需求。

与专门的向量数据库不同,MyScale 将向量搜索算法与结构化数据库和谐地结合在一起,使得可以在同一个数据库中管理向量和结构化数据。这种集成带来了诸如简化的通信、可适应的元数据过滤、对 SQL 和向量联合查询的支持以及与通用多用途数据库常用工具的兼容性等优点。实质上,MyScale 提供了一个统一的解决方案,提供了一种全面、高效且易于学习的方法来解决 AI 数据管理的复杂性。

# 如何在 MyScale 中启动集群

在开始使用 MyScale 进行项目开发之前,你需要创建一个帐户以及一个集群来存储你的数据。操作步骤如下:

  • myscale.com (opens new window) 上登录/注册 MyScale 帐户
  • 创建帐户后,单击页面右侧的“+ 新建集群”按钮
  • 输入集群名称,然后点击“下一步”按钮
  • 等待集群创建完成,这将需要几秒钟

集群创建完成后,你将在弹出窗口上看到文本“集群启动成功”。

注意:

在集群创建完成后,如果你没有自己的数据,你还可以选择将现成的示例数据导入到您的集群中。但是,在本教程中,我们将加载自己的数据。

现在,下一步是设置工作环境并访问正在运行的集群。

# 设置环境

要在你的环境中使用 MyScale,你需要:

pip install clickhouse-connect

执行完成后,通过输入以下命令来确认安装:

pip show clickhouse-connect

如果库已安装,你将看到有关该软件包的信息;否则,你将看到一个错误。

# 与集群建立连接

下一步是将 Python 应用程序与集群连接,为此,我们需要以下详细信息:

  • 集群主机
  • 用户名
  • 密码

要获取这些详细信息,您可以返回到 MyScale 个人资料,并将鼠标悬停在“操作”文本下方的三个垂直对齐的点上,然后单击“connection details”。

连接详细信息页面

单击“连接详细信息”后,您将看到以下框:

连接详细信息

这些是你连接到集群所需的连接详细信息。只需在你的目录中创建一个 Python 笔记本文件,将以下代码复制粘贴到你的笔记本单元格中,并运行该单元格。它将与你的集群建立连接。

# 创建数据库

下一步是在集群上创建一个数据库:

client.command("""
    CREATE DATABASE IF NOT EXISTS getStart;
""") 

此命令首先检查是否存在同名数据库,如果不存在,则创建一个名为 getStart 的数据库。

# 使用 MyScale 创建表格

在 MyScale 中创建表格的基本语法如下:

CREATE TABLE [IF NOT EXISTS] db_name.table_name
(
    column_name1 data_type [options],
    column_name2 data_type [options],
    ...
)
ENGINE = engine_type
[ORDER BY expression]
[PRIMARY KEY expression];

在上述语法中,你可以根据需要替换 db_nametable_name。在括号内,你定义表格的列。每个列(column_name1column_name2 等)都使用其相应的数据类型(data_type)进行定义,并且你可以选择包括其他列选项([options]),例如默认值或约束。

注意:

我们只是看一下在 MyScale 中如何创建表格。下一步我们将根据我们的数据创建一个实际的表格。

ENGINE = engine_type 子句在确定数据存储和处理方式方面非常重要。你可以指定 ORDER BY expression,它确定数据在表格中的物理存储方式。PRIMARY KEY expression 用于提高数据检索的效率。与传统的 SQL 数据库不同,ClickHouse 中的主键不强制唯一性,而是作为一种性能优化工具用于加速查询处理。

# 导入表格数据并创建索引

让我们通过导入一个数据集来进行实际操作,然后你将了解如何根据数据集创建一个列。

import pandas as pd
# URL of the data
url = 'https://d3lhz231q7ogjd.cloudfront.net/sample-datasets/quick-start/categorical-search.csv'
# Reading the data directly into a pandas DataFrame
data = pd.read_csv(url)

这将从提供的 URL 下载数据集并将其保存为 DataFrame。数据应该如下所示:

| id    | data                                              | date       | label    |
|-------|---------------------------------------------------|------------|----------|
| 0     | [0,0,1,8,7,3,2,5,0,0,3,5,7,11,31,13,0,0,0,...     | 2030-09-26 | person   |
| 1     | [65,35,8,0,0,0,1,63,48,27,31,19,16,34,96,114,3... | 1996-06-22 | building |
| 2     | [0,0,0,0,0,0,0,4,1,15,0,0,0,0,49,27,0,0,0,...     | 1975-10-07 | animal   |
| 3     | [3,9,45,22,28,11,4,3,77,10,4,1,1,4,3,11,23,0,...  | 2024-08-11 | animal   |
| 4     | [6,4,3,7,80,122,62,19,2,0,0,0,32,60,10,19,4,0,... | 1970-01-31 | animal   |
| ...   | ...                                               | ...        | ...      |
| 99995 | [9,69,14,0,0,0,1,24,109,33,2,0,1,6,13,12,41,...   | 1990-06-24 | animal   |
| 99996 | [29,31,1,1,0,0,2,8,8,3,2,19,19,41,20,8,5,0,0,6... | 1987-04-11 | person   |
| 99997 | [0,1,116,99,2,0,0,0,0,2,97,117,6,0,5,2,101,86,... | 2012-12-15 | person   |
| 99998 | [0,20,120,67,76,12,0,0,8,63,120,55,12,0,0,0,...   | 1999-03-05 | building |
| 99999 | [48,124,18,0,0,1,6,13,14,70,78,3,0,0,9,15,49,4... | 1972-04-20 | building |

下一步是在 MyScale 集群上创建一个实际的表格并存储这些数据。

client.command("""
    CREATE TABLE getStart.First_Table (
        id UInt32,
        data Array(Float32),
        date Date,
        label String,
        CONSTRAINT check_data_length CHECK length(data) = 128
    ) ENGINE = MergeTree()
    ORDER BY id
    """) 

上述命令将创建一个名为 First_Table 的表格。在此处还给出了列名和数据类型。选择约束的原因是我们希望数据列的向量完全相同,因为在后面的部分中我们将对该列应用向量搜索。

Boost Your AI App Efficiency now
Sign up for free to benefit from 150+ QPS with 5,000,000 vectors
Free Trial
Explore our product

# 将数据插入已定义的表格

在表格创建过程之后,下一步是将数据插入表格中。因此,我们将插入之前下载的数据。

# Convert the data vectors to float, so that it can meet the defined datatype of the column
data['data'] = data['data'].apply(lambda x: [float(i) for i in ast.literal_eval(x)])

# Convert the 'date' column to the 'YYYY-MM-DD' string format
data['date'] = pd.to_datetime(data['date']).dt.date

# Define batch size and insert data in batches
batch_size = 1000  # Adjust based on your needs

num_batches = len(data) // batch_size

for i in range(num_batches):
    start_idx = i * batch_size
    end_idx = start_idx + batch_size
    batch_data = data[start_idx:end_idx]

    client.insert("getStart.First_Table", batch_data.to_records(index=False).tolist(), column_names=batch_data.columns.tolist())
    print(f"Batch {i+1}/{num_batches} inserted.")

上述代码根据定义的表格更改了某些列的数据类型。由于数据量较大,我们以批处理的形式插入数据。因此,我们将数据创建为 1000 的批次。

# 创建向量索引

接下来让我们看看如何创建向量索引。

client.command("""
ALTER TABLE getStart.First_Table
    ADD VECTOR INDEX vector_index data
    TYPE MSTG
""")

注意:

创建向量索引的时间取决于表中的数据。

MSTG 向量索引由 MyScale 内部创建,并在速度、准确性和成本效益方面远远超过竞争对手。

要检查向量索引是否成功创建,我们将尝试运行以下命令:

get_index_status="SELECT status FROM system.vector_indices WHERE table='First_Table'"
print(f"The status of the index is {client.command(get_index_status)}")

代码的输出应该是 "索引的状态是 Built"。单词 "Built" 表示索引已经建立成功。

注意:

目前,MyScale 只允许在一个表中创建一个索引。但将来,您将能够在一个表中创建多个索引。

# 使用 MyScale 编写不同类型的 SQL 查询

MyScale 允许您从基础查询到复杂查询编写不同类型的查询。让我们从一个非常基本的查询开始。

result=client.query("SELECT * FROM getStart.First_Table ORDER BY date DESC LIMIT 1")
for row in result.named_results():
    print(row["id"], row["date"], row["label"],row["data"])

你还可以使用向量的相似度分数找到实体的最近邻。让我们获取提取的结果并找到其最近邻:

results = client.query(f"""
    SELECT id, date, label,
    distance(data, {result.first_item["data"]}) as dist FROM getStart.First_Table ORDER BY dist LIMIT 10
""")
for row in results.named_results():
    print(row["id"], row["date"], row["label"])

注意:

first_item 方法从结果数组中获取第一个元素。

这将打印给定条目的前 10 个最近邻。

# 使用 MyScale 编写自然语言查询

你还可以使用自然语言查询来查询 MyScale,但是为此,我们将创建另一个包含来自神经网络的新数据特征的表。

在创建表之前,让我们加载数据。原始文件可以在此处 (opens new window)下载。

with open('/`../../modules/state_of_the_union.txt`', 'r', encoding='utf-8') as f:
    texts = [line.strip() for line in f if line.strip()] 

此命令将加载文本文件并将其拆分为单独的文档。为了将这些文本文档转换为向量嵌入,我们将使用 OpenAI API。要安装它,请打开终端并输入以下命令:

pip install openai

安装完成后,你可以设置嵌入模型并获取嵌入向量:

import os
# Import OPENAI
import openai
# Import pandas
import pandas as pd
# Set the environment variable for OPENAI API Key
os.environ["OPENAI_API_KEY"] = "your_api_key_here"

# Get the embedding vectors of the documents
response = openai.embeddings.create(
            input = texts,
            model = 'text-embedding-ada-002')

# The code below creates a dataframe. We will insert this dataframe directly to the table
embeddings_data = []
for i in range(len(response.data)):
    embeddings_data.append({'id': i, 'data': response.data[i].embedding, 'content': texts[i]})
# Convert to Pandas DataFrame
df_embeddings = pd.DataFrame(embeddings_data)

上述代码将文本文档转换为嵌入向量,然后创建一个将插入表中的数据框。现在,让我们继续创建表。

client.command("""
               CREATE TABLE getStart.natural_language (
                    id UInt32,
                    content String,
                    data Array(Float32),
                    CONSTRAINT check_data_length CHECK length(data) = 1536
                ) ENGINE = MergeTree()
                ORDER BY id;
               """) 

下一步是将数据插入表中。

# Set the batch size to 20
batch_size = 20
# Find the number of batches
num_batches = len(df_embeddings) // batch_size

# Insert the data in the form of batches
for i in range(num_batches + 1):
    # Define the starting point for each batch
    start_idx = i * batch_size
    # Define the last index for each batch
    end_idx = min(start_idx + batch_size, len(df_embeddings))
    # Get the batch from the main DataFrame
    batch_data = df_embeddings[start_idx:end_idx]
    
    # Insert the data
    if not batch_data.empty:
        client.insert("getStart.natural_language", 
                      batch_data.to_records(index=False).tolist(), 
                      column_names=batch_data.columns.tolist())
        
        print(f"Batch {i+1}/{num_batches + 1} inserted.")

数据插入过程可能需要一些时间,具体取决于数据的大小,但您可以像这样监视进度。现在,让我们继续创建表的索引。

client.command("""
ALTER TABLE getStart.natural_language
ADD VECTOR INDEX vector_index_new data
TYPE MSTG
""")

索引创建完成后,您就可以开始进行查询了。

# Convert the query to vector embeddigs
response = openai.embeddings.create(
# Write your query in the input parameter
input = 'What did the president say about Ketanji Brown Jackson?',
model = 'text-embedding-ada-002'
)

# Get the results
results = client.query(f"""
    SELECT id,content,
    distance(data, {list(response.data[0].embedding)}) as dist FROM getStart.natural_language ORDER BY dist LIMIT 5
""")

for row in results.named_results():
    print(row["id"] ,row["content"], row["dist"])

它应该输出以下结果:

| ID  | Text                                                                                                             | Score               |
| --- | ---------------------------------------------------------------------------------------------------------------- | ------------------- |
| 269 | And I did that 4 days ago, when I nominated Circuit Court of Appeals Judge Ketanji Brown Jackson...              | 0.33893799781799316 |
| 331 | The Cancer Moonshot that President Obama asked me to lead six years ago.                                         | 0.4131550192832947  |
| 80  | Vice President Harris and I ran for office with a new economic vision for America.                               | 0.4235861897468567  |
| 328 | This is personal to me and Jill, to Kamala, and to so many of you.                                               | 0.42732131481170654 |
| 0   | Madam Speaker, Madam Vice President, our First Lady and Second Gentleman. Members of Congress and the Cabinet... | 0.427462637424469   |

这只是一些查询的示例,您可以根据自己的需求和项目编写任意复杂的查询。

Join Our Newsletter

# MyScale 引领 SQL 向量数据库的发展

MyScale 在 SQL 向量数据库市场上凭借无与伦比的准确性性能成本效益脱颖而出。它在与 pgvector 等集成向量数据库和 Pinecone 等专用向量数据库相比方面表现出色,实现了更好的搜索准确性、更快的查询处理速度和更低的成本。除了性能,SQL 接口对开发人员非常友好,提供了最大的价值和最小的学习成本。

MyScale 不仅仅是通过向量实现更好的搜索;在涉及复杂元数据过滤器的场景中,它在准确性和每秒查询(QPS)方面提供了高精度。此外,最重要的是:**如果您注册,您可以免费使用S1 pod,该pod可以处理高达500万个向量。**对于任何需要强大而又具有成本效益的向量数据库解决方案的人来说,这是首选。

# MyScale 通过 AI 集成赋予应用程序更强大的功能

MyScale 通过与 AI 技术的集成增强了其功能,使您能够通过与 AI 技术的集成创建更强大的应用程序。让我们看一下其中一些集成,您可以通过这些集成改进您的 MyScale 应用程序。

  • 与 LangChain 的集成:在当今世界,AI应用的用例日益增多,仅通过将LLM与数据库结合起来无法创建强大的AI应用程序。您需要使用不同的框架和工具来开发更好的应用程序。在这方面,MyScale 提供了与 LangChain 的完整集成 (opens new window),允许用户使用先进的检索策略创建更有效和可靠的AI应用程序。特别是,MyScale的自查询检索器 (opens new window)实现了一种灵活而强大的方法,将文本转换为元数据过滤的向量查询,在许多实际场景中实现了高准确性。

  • 与 OpenAI 的集成:通过将MyScale与OpenAI集成,AI 应用程序的准确性和稳健性显著提高。OpenAI 允许用户获取最佳的嵌入向量,保持上下文和语义。当你使用自然语言查询进行向量搜索或从数据中提取嵌入向量时,这非常重要,是提高应用程序的精度和准确性的关键。要了解更详细的信息,可以阅读我们的与 OpenAI 的集成 (opens new window)文档。

    最近,OpenAI 发布了 GPT,使开发人员能够轻松定制GPT和聊天机器人。MyScale 适应了这一变化,通过将服务器端上下文无缝注入 GPT 模型,改变了RAG 系统的开发方式。MyScale 通过 SQL WHERE 子句中的结构化数据过滤和语义搜索优化了上下文注入,以经济高效的方式优化知识库存储,并实现了在GPT 之间的共享。欢迎在 GPT Store 上体验 MyScaleGPT (opens new window),或者使用 MyScale 将知识库连接到 GPT (opens new window)

# 结论

随着 AI 和机器学习应用的增长,对于像 MyScale 这样专为现代 AI 应用而设计的数据库的需求也在不断增加。MyScale 是先进的 SQL 向量数据库,将传统数据库的速度和功能与最先进的向量搜索能力相结合。

最重要的是,由于 MyScale 与 SQL 语法完全兼容,任何熟悉 SQL 的开发人员都可以快速上手 MyScale。此外,MyScale 的成本明显低于其他类型的向量数据库。 (opens new window)这使得 MyScale 成为企业管理大量数据的明智选择,因为它在使用熟悉且强大的 SQL 的同时提供了明显的优势,可以构建生产级的 GenAI 应用程序。如果您希望及时了解 MyScale 的最新动态,请加入我们的Discord (opens new window)Twitter (opens new window)

Keep Reading
images
秘密武器:SQL向量数据库如何使RAG性能飞跃

检索增强生成(RAG)是自然语言处理(NLP)领域的重大突破。由于其简单性和高效性,它优化了大多数NLP任务。通过结合检索系统(向量数据库)和生成模型(LLM)的优势,RAG显著提高了人工智能系统在文本生成、翻 ...

images
MyScale vs Weaviate:为您的AI应用选择合适的向量数据库

向量数据库正在兴起,其应用无处不在。它们具有超高的速度(想象一下在几分之一秒内搜索数十亿条记录),并且需要更少的资源(不需要任何GPU)。尽管如此,它们的性能出色,足以在公共卫生、金融和生物识别等领域使用。 现有许多向量数据库,其中MyScale是其中一个特殊的向量数据库,它是一种基于SQL的向量数据库。无论您是已经是向量数据库用户还是对它们还不熟悉,选择其中之一可能会很棘手;它取决于许多因素, ...

Start building your Al projects with MyScale today

Free Trial
Contact Us