向量存储

本指南将帮助您了解如何作为开发者使用 Rememberizer 向量存储。

Rememberizer 向量存储简化了处理向量数据的过程,使您能够专注于文本输入,并利用向量的力量用于搜索和数据分析等各种应用。

介绍

Rememberizer 向量存储提供了一个易于使用的接口,用于处理向量数据,同时抽象掉向量嵌入的复杂性。由 PostgreSQL 和 pgvector 扩展驱动,Rememberizer 向量存储允许您直接处理文本。该服务处理文本数据的分块、向量化和存储,使您能够更专注于核心应用逻辑。

要深入了解向量嵌入和向量数据库背后的理论概念,请参见 什么是向量嵌入和向量数据库?

技术概述

向量存储是如何工作的

Rememberizer 向量存储将文本转换为高维向量表示(嵌入),以捕捉语义意义。这使得:

  1. 语义搜索:根据意义而不仅仅是关键词查找文档

  2. 相似性匹配:识别概念上相关的内容

  3. 高效检索:快速从大型数据集中定位相关信息

关键组件

  • 文档处理:文本被分割成最佳大小的块,具有重叠边界以保持上下文

  • 向量化:块使用最先进的模型转换为嵌入

  • 索引:专门的算法组织向量以实现高效的相似性搜索

  • 查询处理:搜索查询被向量化并与存储的嵌入进行比较

架构

Rememberizer 使用以下方式实现向量存储:

  • 带有 pgvector 扩展的 PostgreSQL:用于高效的向量存储和搜索

  • 基于集合的组织:每个向量存储都有自己独立的集合

  • API 驱动的访问:所有操作的简单 RESTful 端点

开始使用

创建向量存储

  1. 在您的仪表板中导航到向量存储部分

  2. 点击“创建新向量存储”:

    • 将出现一个表单,提示您输入详细信息。

  3. 填写详细信息:

    • 名称:为您的向量存储提供一个唯一的名称。

    • 描述:写一个简短的向量存储描述。

    • 嵌入模型:选择将文本转换为向量的模型。

    • 索引算法:选择向量如何组织以便搜索。

    • 搜索度量:定义向量之间相似性的计算方式。

    • 向量维度:向量嵌入的大小(通常为768-1536)。

  4. 提交表单:

    • 点击“创建”按钮。您将收到成功通知,新存储将出现在您的向量存储列表中。

配置选项

嵌入模型

模型
维度
描述
最佳用途

openai/text-embedding-3-large

1536

来自 OpenAI 的高精度嵌入模型

需要最大精度的生产应用

openai/text-embedding-3-small

1536

来自 OpenAI 的更小、更快的嵌入模型

具有更高吞吐量要求的应用

索引算法

算法
描述
权衡

IVFFLAT (默认)

反向文件与平面压缩

速度和准确性的良好平衡;适用于大多数数据集

HNSW

层次可导航小世界

对于大数据集更好的准确性;更高的内存要求

搜索指标

指标
描述
最适合

余弦 (默认)

测量向量之间的角度

通用相似性匹配

内积 (ip)

向量之间的点积

当向量大小重要时

L2 (欧几里得)

向量之间的直线距离

当空间关系重要时

管理向量存储

  1. 查看和编辑向量存储:

    • 访问管理仪表板以查看、编辑或删除向量存储。

  2. 查看文档:

    • 浏览特定向量存储中的单个文档及其相关元数据。

  3. 统计信息:

    • 查看详细统计信息,例如存储的向量数量、查询性能和操作指标。

API 密钥管理

API 密钥用于验证和授权访问 Rememberizer 向量存储的 API 端点。正确管理 API 密钥对于维护您的向量存储的安全性和完整性至关重要。

创建 API 密钥

  1. 前往您的向量存储详细信息页面

  2. 导航到 API 密钥管理部分:

    • 它可以在“配置”选项卡中找到

  3. 点击 “添加 API 密钥”

    • 将出现一个表单,提示您输入详细信息。

  4. 填写详细信息:

    • 名称:为 API 密钥提供一个名称,以帮助您识别其用例。

  5. 提交表单:

    • 点击“创建”按钮。新的 API 密钥将被生成并显示。确保复制并安全存储它。此密钥用于验证对该特定向量存储的请求。

撤销 API 密钥

如果不再需要 API 密钥,您可以删除它以防止任何潜在的滥用。

出于安全原因,您可能希望定期更换您的 API 密钥。这涉及生成一个新密钥并撤销旧密钥。

使用向量存储 API

在创建向量存储并生成 API 密钥后,您可以使用 REST API 与其进行交互。

代码示例

import requests
import json

API_KEY = "your_api_key_here"
VECTOR_STORE_ID = "vs_abc123"  # 替换为您的向量存储 ID
BASE_URL = "https://api.rememberizer.a

# 将文档上传到向量存储
def upload_document(file_path, document_name=None):
    if document_name is None:
        document_name = file_path.split("/")[-1]
    
    with open(file_path, "rb") as f:
        files = {"file": (document_name, f)}
        headers = {"x-api-key": API_KEY}
        
        response = requests.post(
            f"{BASE_URL}/vector-stores/{VECTOR_STORE_ID}/documents",
            headers=headers,
            files=files
        )
        
        if response.status_code == 201:
            print(f"文档 '{document_name}' 上传成功!")
            return response.json()
        else:
            print(f"上传文档时出错:{response.text}")
            return None

# 将文本内容上传到向量存储
def upload_text(content, document_name):
    headers = {
        "x-api-key": API_KEY,
        "Content-Type": "application/json"
    }
    
    data = {
        "name": document_name,
        "content": content
    }
    
    response = requests.post(
        f"{BASE_URL}/vector-stores/{VECTOR_STORE_ID}/documents/text",
        headers=headers,
        json=data
    )
    
    if response.status_code == 201:
        print(f"文本文件 '{document_name}' 上传成功!")
        return response.json()
    else:
        print(f"上传文本时出错:{response.text}")
        return None

# 搜索向量存储
def search_vector_store(query, num_results=5, prev_chunks=1, next_chunks=1):
    headers = {"x-api-key": API_KEY}
    
    params = {
        "q": query,
        "n": num_results,
        "prev_chunks": prev_chunks,
        "next_chunks": next_chunks
    }
    
    response = requests.get(
        f"{BASE_URL}/vector-stores/{VECTOR_STORE_ID}/documents/search",
        headers=headers,
        params=params
    )
    
    if response.status_code == 200:
        results = response.json()
        print(f"找到 {len(results['matched_chunks'])} 个与 '{query}' 匹配的结果")
        
        # 打印顶部结果
        if results['matched_chunks']:
            top_match = results['matched_chunks'][0]
            print(f"最佳匹配(距离: {top_match['distance']}):")
            print(f"文档: {top_match['document']['name']}")
            print(f"内容: {top_match['matched_content']}")
        
        return results
    else:
        print(f"搜索错误: {response.text}")
        return None

# 示例用法
# 上传文档("path/to/document.pdf")
# upload_text("这是一个要被向量化的示例文本", "sample-document.txt")
# search_vector_store("向量相似性是如何工作的?")

迁移最佳实践

遵循以下建议以确保成功迁移:

  1. 提前规划

    • 估算迁移所需的数据量和时间

    • 在低流量时段安排迁移

    • 在开始大规模迁移之前增加磁盘空间

  2. 先进行测试

    • 在 Rememberizer 中创建一个测试向量存储

    • 迁移一小部分数据(100-1000 个向量)

    • 使用关键查询验证搜索功能

  3. 数据验证

    • 比较迁移前后的文档计数

    • 运行基准查询以确保结果相似

    • 验证元数据是否正确保留

  4. 优化性能

    • 使用批量操作以提高效率

    • 考虑源数据库和目标数据库的地理共址

    • 监控 API 速率限制并相应调整批量大小

  5. 迁移后的步骤

    • 验证在 Rememberizer 中创建索引

    • 更新应用程序配置以指向新的向量存储

    • 在迁移验证之前保留源数据库作为备份

有关详细的 API 参考和端点文档,请访问 向量存储 API 页面。


确保安全处理 API 密钥,并遵循 API 密钥管理的最佳实践。

Last updated