Weaviate 是一个开源的向量搜索引擎数据库,由德国公司 SeMI Technologies 开发。它结合了向量搜索和图数据库技术,旨在为 AI 应用提供高效的数据存储和检索能力。

核心功能

  1. 向量搜索‌:Weaviate 支持高效的向量索引和近似最近邻(ANN)搜索,能够在数百万个对象中实现毫秒级的 10-NN 邻近搜索。
  2. 图数据结构‌:采用图数据结构来组织数据,支持复杂的查询和分析。
  3. 机器学习模块支持‌:Weaviate 提供了丰富的机器学习模块支持,能够与 OpenAI、Hugging Face 等流行服务和模型集成,实现数据的自动向量化。
  4. 模块化设计‌:Weaviate 的模块化设计允许开发者根据需求选择不同的功能模块,如文本嵌入、生成式 AI 等。
  5. 强大查询语言‌:Weaviate 提供了基于 GraphQL 的强大查询语言,支持复杂的向量和结构化数据查询。

部署方式

Weaviate 提供了多种部署选项,以满足不同用户和用例的需求:

  1. Weaviate 云‌:利用 Weaviate 官方的云服务,支持数据复制、零停机更新和无缝扩展,非常适合评估、开发和生产环境。
  2. Docker 部署‌:通过 Docker 容器进行 Weaviate 向量数据库的部署,适用于评估和开发场景。
  3. K8s 部署‌:在 Kubernetes 环境中部署 Weaviate 向量数据库,适合用于开发和生产场景。
  4. 嵌入式 Weaviate‌:基于本地文件的 Weaviate 向量数据库构建方式,适用于评估场景。但嵌入式 Weaviate 仅支持 Linux 和 macOS 系统,不支持 Windows。

使用示例

以 Docker 部署为例,Weaviate 的使用流程通常包括以下几个步骤:

  1. 下载并安装 Docker‌:在本地下载并安装 Docker。
  2. 拉取 Weaviate 镜像‌:使用 docker pull semitechnologies/weaviate:latest 命令拉取最新版本的 Weaviate 镜像。
  3. 启动 Weaviate 容器‌:使用 docker run -p8080:8080 -p50051:50051 semitechnologies/weaviate:latest 命令启动 Weaviate 容器。其中,8080 是 HTTP 的端口,50051 是 gRPC 的端口。
  4. 连接 Weaviate‌:使用 Python SDK 或其他客户端库连接 Weaviate 数据库。
  5. 创建集合‌:在 Weaviate 中创建集合,类似于传统关系型数据库中的表,用于管理特定类型的数据/数据对象。
  6. 插入数据‌:向集合中插入数据,包括向量和结构化属性。
  7. 查询数据‌:使用向量或结构化属性查询数据,实现高效的语义搜索。

优势与特点

  1. 低延迟‌:Weaviate 提供毫秒级的响应时间,适用于实时场景。
  2. 灵活扩展‌:支持数十亿级数据对象,模块化架构可集成自定义模型(如 PyTorch、TensorFlow)。
  3. 多模态支持‌:适配文本、图像、音视频等多种数据类型。
  4. 云原生设计‌:提供 GraphQL 和 REST API,无缝对接现有技术栈(如 LangChain)。

应用场景

Weaviate 适用于需要高效处理和查询向量数据的应用程序,如语义搜索、问答系统、推荐系统等。通过集成不同的机器学习模块,Weaviate 可以在多种应用场景下发挥重要作用。

使用Weaviate进行向量搜索涉及多个步骤,从环境准备到数据插入,再到执行搜索查询。以下是一个详细的指南,帮助你理解如何使用Weaviate进行向量搜索:

一、环境准备

  1. 安装Weaviate‌:

    • 你可以通过Docker快速启动Weaviate实例,使用以下命令:

      docker pull semitechnologies/weaviate:latest
      docker run -p 8080:8080 semitechnologies/weaviate:latest

    • 或者,你可以在Kubernetes、云服务(如AWS、GCP)上部署Weaviate,甚至使用Weaviate Cloud服务。
  2. 安装客户端库‌:

    • Weaviate提供了多种编程语言的客户端库,如Python、JavaScript等。以Python为例,你可以使用pip安装:

      pip install weaviate-client

二、创建集合与类

  1. 连接到Weaviate‌:

    • 使用客户端库连接到你的Weaviate实例。例如,在Python中:

      import weaviate
      client = weaviate.Client("http://localhost:8080")

  2. 创建集合(Class)‌:

    • 集合在Weaviate中类似于关系型数据库中的表,用于存储特定类型的数据对象。
    • 你可以定义一个包含向量属性的集合。例如,创建一个名为Article的集合,其中包含一个名为content_vector的向量属性:
      class_obj = {
          "class": "Article",
          "vectorizer": "none",  # 如果你打算自己提供向量,则设置为"none"
          "properties": [
              {
                  "name": "title",
                  "dataType": ["string"]
              },
              {
                  "name": "content_vector",
                  "dataType": ["number[]"],  # 假设向量是浮点数数组
                  "vectorIndexType": "hnsw"  # 使用HNSW算法进行向量索引
              }
          ]
      }
      client.schema.create_class(class_obj)
      

三、插入数据

  1. 准备数据‌:

    • 你需要准备要插入的数据对象,包括向量。向量通常是通过预训练的模型(如BERT、GPT等)将文本、图像等数据转换而来的。
  2. 插入数据对象‌:

    • 使用客户端库将数据对象插入到Weaviate中。例如:
      article_data = {
          "title": "Weaviate向量搜索指南",
          "content_vector": [0.1, 0.2, 0.3, ...]  # 假设这是一个128维的向量
      }
      client.data_object.create(article_data, "Article")
      

四、执行向量搜索

  1. 构建查询‌:

    • 使用Weaviate的查询语言(基于GraphQL)来构建向量搜索查询。你需要提供查询向量和搜索参数(如最近邻的数量)。
  2. 执行搜索‌:

    • 使用客户端库执行搜索查询。例如,在Python中:
      query_vector = [0.1, 0.2, 0.3, ...]  # 与插入数据时的向量维度相同
      result = client.query.get("Article", ["title"]) \
          .with_near_vector({"vector": query_vector, "certainty": 0.7}) \
          .with_limit(5) \
          .do()
      
      for article in result['data']['Get']['Article']:
          print(article['title'])
      

    • 在这个例子中,with_near_vector方法用于指定查询向量和搜索参数(如certainty,表示搜索的确定性阈值),with_limit方法用于限制返回的结果数量。

五、优化与扩展

  1. 优化向量索引‌:

    • 根据你的数据特性和查询需求,调整向量索引的参数(如HNSW的efConstructionef等),以提高搜索性能。
  2. 扩展Weaviate实例‌:

    • 随着数据量的增长,你可能需要扩展Weaviate实例以处理更多的数据和查询。Weaviate支持水平扩展,可以通过添加更多的节点来提高性能。
Logo

中国智能体开发者社区,聚焦智能体与大模型开发,提供前沿资讯、实用工具链、开源项目及行业案例。通过技术沙龙、开发者大赛等活动,促进经验交流与协作,助力开发者快速构建创新智能应用。

更多推荐