Armazenamentos de Vetores
Este guia ajudará você a entender como usar o Armazenamento Vetorial Rememberizer como um desenvolvedor.
O Armazenamento de Vetores Rememberizer simplifica o processo de lidar com dados vetoriais, permitindo que você se concentre na entrada de texto e aproveite o poder dos vetores para várias aplicações, como pesquisa e análise de dados.
Introdução
O Rememberizer Vector Store fornece uma interface fácil de usar para lidar com dados vetoriais, enquanto abstrai a complexidade das incorporações vetoriais. Alimentado pelo PostgreSQL com a extensão pgvector, o Rememberizer Vector Store permite que você trabalhe diretamente com texto. O serviço lida com a fragmentação, vetorização e armazenamento dos dados de texto, facilitando para você se concentrar na lógica central de sua aplicação.
Para uma compreensão mais profunda dos conceitos teóricos por trás das incorporações vetoriais e bancos de dados vetoriais, veja O que são Incorporações Vetoriais e Bancos de Dados Vetoriais?.
Visão Técnica
Como Funcionam os Armazenamentos de Vetores
Os Armazenamentos de Vetores Rememberizer convertem texto em representações vetoriais de alta dimensão (embeddings) que capturam o significado semântico. Isso possibilita:
Busca Semântica: Encontrar documentos com base no significado em vez de apenas palavras-chave
Correspondência de Similaridade: Identificar conteúdo conceitualmente relacionado
Recuperação Eficiente: Localizar rapidamente informações relevantes em grandes conjuntos de dados
Componentes Chave
Processamento de Documentos: O texto é dividido em pedaços de tamanho otimizado com limites sobrepostos para preservação de contexto
Vetorização: Os pedaços são convertidos em embeddings usando modelos de ponta
Indexação: Algoritmos especializados organizam vetores para busca de similaridade eficiente
Processamento de Consultas: Consultas de busca são vetorizadas e comparadas com embeddings armazenados
Arquitetura
Rememberizer implementa armazenamentos de vetores usando:
PostgreSQL com extensão pgvector: Para armazenamento e busca de vetores eficientes
Organização baseada em coleções: Cada armazenamento de vetores tem sua própria coleção isolada
Acesso orientado a API: Pontos finais RESTful simples para todas as operações
Começando
Criando um Armazenamento de Vetores
Navegue até a Seção de Armazenamentos de Vetores no seu painel
Clique em "Criar novo Armazenamento de Vetores":
Um formulário aparecerá solicitando que você insira os detalhes.
Preencha os Detalhes:
Nome: Forneça um nome único para o seu armazenamento de vetores.
Descrição: Escreva uma breve descrição do armazenamento de vetores.
Modelo de Embedding: Selecione o modelo que converte texto em vetores.
Algoritmo de Indexação: Escolha como os vetores serão organizados para busca.
Métrica de Busca: Defina como a similaridade entre vetores é calculada.
Dimensão do Vetor: O tamanho das embeddings de vetores (tipicamente 768-1536).
Envie o Formulário:
Clique no botão "Criar". Você receberá uma notificação de sucesso, e o novo armazenamento aparecerá na sua lista de armazenamentos de vetores.

Opções de Configuração
Modelos de Embedding
openai/text-embedding-3-large
1536
Modelo de embedding de alta precisão da OpenAI
Aplicações de produção que exigem máxima precisão
openai/text-embedding-3-small
1536
Modelo de embedding menor e mais rápido da OpenAI
Aplicações com requisitos de maior taxa de transferência
Algoritmos de Indexação
IVFFLAT (padrão)
Arquivo invertido com compressão plana
Bom equilíbrio entre velocidade e precisão; funciona bem para a maioria dos conjuntos de dados
HNSW
Mundo Pequeno Navegável Hierárquico
Melhor precisão para grandes conjuntos de dados; maiores requisitos de memória
Métricas de Busca
cosseno (padrão)
Mede o ângulo entre vetores
Correspondência de similaridade de propósito geral
produto interno (ip)
Produto escalar entre vetores
Quando a magnitude do vetor é importante
L2 (Euclidiana)
Distância em linha reta entre vetores
Quando relações espaciais são importantes
Gerenciando Armazenamentos de Vetores
Visualizar e Editar Armazenamentos de Vetores:
Acesse o painel de gerenciamento para visualizar, editar ou excluir armazenamentos de vetores.
Visualizando Documentos:
Navegue por documentos individuais e seus metadados associados dentro de um armazenamento de vetores específico.
Estatísticas:
Veja estatísticas detalhadas, como o número de vetores armazenados, desempenho de consultas e métricas operacionais.

Gerenciamento de Chaves de API
As chaves de API são usadas para autenticar e autorizar o acesso aos endpoints da API do Rememberizer Vector Store. O gerenciamento adequado das chaves de API é essencial para manter a segurança e a integridade dos seus armazéns de vetores.
Criando Chaves de API
Vá para a página de detalhes do seu Vector Store
Navegue até a Seção de Gerenciamento de Chaves de API:
Ela pode ser encontrada na aba "Configuração"
Clique em "Adicionar Chave de API":
Um formulário aparecerá solicitando que você insira os detalhes.
Preencha os Detalhes:
Nome: Forneça um nome para a chave de API para ajudá-lo a identificar seu caso de uso.
Envie o Formulário:
Clique no botão "Criar". A nova chave de API será gerada e exibida. Certifique-se de copiá-la e armazená-la com segurança. Esta chave é usada para autenticar solicitações a esse vetor store específico.

Revogando Chaves de API
Se uma chave de API não for mais necessária, você pode excluí-la para evitar qualquer uso indevido potencial.
Por razões de segurança, você pode querer girar suas chaves de API periodicamente. Isso envolve gerar uma nova chave e revogar a antiga.
Usando a API do Armazenamento Vetorial
Após criar um Armazenamento Vetorial e gerar uma chave de API, você pode interagir com ele usando a API REST.
Exemplos de Código
import requests
import json
API_KEY = "sua_chave_api_aqui"
VECTOR_STORE_ID = "vs_abc123" # Substitua pelo seu ID de armazenamento de vetores
BASE_URL = "https://api.rememberizer.a
# Carregar um documento para o armazenamento vetorial
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"Documento '{document_name}' carregado com sucesso!")
return response.json()
else:
print(f"Erro ao carregar o documento: {response.text}")
return None
# Carregar conteúdo de texto para o armazenamento vetorial
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"Documento de texto '{document_name}' carregado com sucesso!")
return response.json()
else:
print(f"Erro ao carregar texto: {response.text}")
return None
# Pesquisar no armazenamento vetorial
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"Encontrados {len(results['matched_chunks'])} correspondências para '{query}'")
# Imprimir o melhor resultado
if results['matched_chunks']:
top_match = results['matched_chunks'][0]
print(f"Melhor correspondência (distância: {top_match['distance']}):")
print(f"Documento: {top_match['document']['name']}")
print(f"Conteúdo: {top_match['matched_content']}")
return results
else:
print(f"Erro ao pesquisar: {response.text}")
return None
# Exemplo de uso
# upload_document("path/to/document.pdf")
# upload_text("Este é um texto de exemplo para ser vetorizado", "sample-document.txt")
# search_vector_store("Como funciona a similaridade de vetores?")
Considerações de Desempenho
Em breve: Diagrama de Arquitetura do Armazenamento Vetorial
Este diagrama de arquitetura técnica ilustrará:
A arquitetura de fundação PostgreSQL + pgvector
Estruturas de algoritmos de indexação (IVFFLAT vs. HNSW)
Como as métricas de busca funcionam no espaço vetorial (comparação visual)
Processo de fragmentação de documentos com visualização de sobreposição
Considerações de desempenho visualizadas em diferentes escalas
Otimizando para Diferentes Volumes de Dados
Pequeno (<10k documentos)
IVFFLAT, similaridade cosseno
Configuração simples proporciona bom desempenho
Médio (10k-100k documentos)
IVFFLAT, garantir reindexação regular
Equilíbrio entre velocidade de busca e manutenção do índice
Grande (>100k documentos)
HNSW, considerar aumentar as dimensões do vetor
Maior uso de memória, mas mantém desempenho em escala
Estratégias de Fragmentação
O processo de fragmentação impacta significativamente a qualidade da busca:
Tamanho do Fragmento: Rememberizer utiliza um tamanho de fragmento padrão de 1024 bytes com uma sobreposição de 200 bytes
Fragmentos Menores (512-1024 bytes): Correspondências mais precisas, melhores para perguntas específicas
Fragmentos Maiores (1500-2048 bytes): Mais contexto em cada correspondência, melhores para tópicos mais amplos
Sobreposição: Garante que o contexto não seja perdido nas fronteiras dos fragmentos
Otimização de Consulta
Janelas de Contexto: Use
prev_chunks
enext_chunks
para recuperar conteúdo ao redorContagem de Resultados: Comece com 3-5 resultados (
n
parameter) e ajuste com base nas necessidades de precisãoLimite: Ajuste o parâmetro
t
para filtrar resultados por pontuação de similaridade
Uso Avançado
Reindexação
Rememberizer aciona automaticamente a reindexação quando a contagem de vetores excede os limites predefinidos, mas considere a reindexação manual após:
Carregar um grande número de documentos
Alterar o modelo de incorporação
Modificar o algoritmo de indexação
Aprimoramento de Consulta
Para melhores resultados de busca:
Seja específico nas consultas de busca
Inclua contexto quando possível
Use linguagem natural em vez de palavras-chave
Ajuste parâmetros com base na qualidade do resultado
Migrando de Outras Bases de Dados Vetoriais
Se você está atualmente usando outras soluções de banco de dados vetoriais e deseja migrar para o Rememberizer Vector Store, os seguintes guias o ajudarão a transitar seus dados de forma eficiente.
Visão Geral da Migração
Migrar dados vetoriais envolve:
Exportar dados do seu banco de dados vetorial de origem
Converter os dados para um formato compatível com o Rememberizer
Importar os dados para o seu Armazenamento Vetorial Rememberizer
Verificar se a migração foi bem-sucedida
Benefícios da Migração para Rememberizer
Fundação PostgreSQL: Construído sobre tecnologia de banco de dados madura com backup e recuperação integrados
Ecossistema Integrado: Conexão perfeita com outros componentes do Rememberizer
Gerenciamento Simplificado: Interface unificada para operações vetoriais
Segurança Avançada: Segurança em nível de linha e controles de acesso granulares
Arquitetura Escalável: Otimização de desempenho à medida que seus dados crescem
Migrando do Pinecone
import os
import pinecone
import requests
import json
import time
# Configurar cliente Pinecone
pinecone.init(api_key="PINECONE_API_KEY", environment="PINECONE_ENV")
source_index = pinecone.Index("seu-indice-pinecone")
# Configurar cliente do Armazenamento Vetorial Rememberizer
REMEMBERIZER_API_KEY = "your_rememberizer_api_key"
VECTOR_STORE_ID = "vs_abc123" # Seu ID de armazenamento vetorial Rememberizer
BASE_URL = "https://api.rememberizer.ai/api/v1"
# 1. Defina o tamanho do lote para migração (ajuste com base no tamanho dos seus dados)
BATCH_SIZE = 100
# 2. Função para obter vetores do Pinecone
def fetch_vectors_from_pinecone(index_name, batch_size, cursor=None):
# Use a operação de lista se disponível na sua versão do Pinecone
try:
result = source_index.list(limit=batch_size, cursor=cursor)
vectors = result.get("vectors", {})
next_cursor = result.get("cursor")
return vectors, next_cursor
except AttributeError:
# Para versões mais antigas do Pinecone sem operação de lista
# Esta é uma abordagem simplificada; a implementação real depende do seu padrão de acesso a dados
query_response = source_index.query(
vector=[0] * source_index.describe_index_stats()["dimension"],
top_k=batch_size,
include_metadata=True,
include_values=True
)
return {item.id: {"id": item.id, "values": item.values, "metadata": item.metadata}
for item in query_response.matches}, None
# 3. Função para enviar vetores para Rememberizer
def upload_to_rememberizer(vectors):
headers = {
"x-api-key": REMEMBERIZER_API_KEY,
"Content-Type": "application/json"
}
for vector_id, vector_data in vectors.items():
# Converter dados do vetor Pinecone para o formato Rememberizer
document_name = vector_data.get("metadata", {}).get("filename", f"pinecone_doc_{vector_id}")
content = vector_data.get("metadata", {}).get("text", "")
if not content:
print(f"Pulando {vector_id} - nenhum conteúdo de texto encontrado nos metadados")
continue
data = {
"name": document_name,
"content": content,
# Opcional: incluir metadados adicionais
"metadata": vector_data.get("metadata", {})
}
response = requests.post(
f"{BASE_URL}/vector-stores/{VECTOR_STORE_ID}/documents/text",
headers=headers,
json=data
)
if response.status_code == 201:
print(f"Documento '{document_name}' enviado com sucesso!")
else:
print(f"Erro ao enviar o documento {document_name}: {response.text}")
# Adicionar um pequeno atraso para evitar limitação de taxa
time.sleep(0.1)
# 4. Função principal de migração
def migrate_pinecone_to_rememberizer():
cursor = None
total_migrated = 0
print("Iniciando a migração do Pinecone para o Rememberizer...")
while True:
vectors, cursor = fetch_vectors_from_pinecone("your-pinecone-index", BATCH_SIZE, cursor)
if not vectors:
break
print(f"Buscou {len(vectors)} vetores do Pinecone")
upload_to_rememberizer(vectors)
total_migrated += len(vectors)
print(f"Progresso: {total_migrated} vetores migrados")
if not cursor:
break
print(f"Migração completa! {total_migrated} vetores migrados para o Rememberizer")
# Execute a migração
# migrate_pinecone_to_rememberizer()
Migrando do Qdrant
import requests
import json
import time
from qdrant_client import QdrantClient
from qdrant_client.http import models as rest
# Configurar cliente Qdrant
QDRANT_URL = "http://localhost:6333" # ou sua URL da nuvem Qdrant
QDRANT_API_KEY = "your_qdrant_api_key" # se estiver usando a nuvem Qdrant
QDRANT_COLLECTION_NAME = "sua_colecao"
qdrant_client = QdrantClient(
url=QDRANT_URL,
api_key=QDRANT_API_KEY # Apenas para a nuvem Qdrant
)
# Configurar cliente do Armazenamento Vetorial Rememberizer
REMEMBERIZER_API_KEY = "your_rememberizer_api_key"
VECTOR_STORE_ID = "vs_abc123" # Seu ID de armazenamento vetorial Rememberizer
BASE_URL = "https://api.rememberizer.ai/api/v1"
# Tamanho do lote para processamento
BATCH_SIZE = 100
# Função para buscar pontos do Qdrant
def fetch_points_from_qdrant(collection_name, batch_size, offset=0):
try:
# Obter informações da coleção para determinar a dimensão do vetor
collection_info = qdrant_client.get_collection(collection_name=collection_name)
# Rolagem através dos pontos
scroll_result = qdrant_client.scroll(
collection_name=collection_name,
limit=batch_size,
offset=offset,
with_payload=True,
with_vectors=True
)
points = scroll_result[0] # Tupla de (pontos, próximo_offset)
next_offset = scroll_result[1]
return points, next_offset
except Exception as e:
print(f"Erro ao buscar pontos do Qdrant: {e}")
return [], None
# Função para enviar vetores para Rememberizer
def upload_to_rememberizer(points):
headers = {
"x-api-key": REMEMBERIZER_API_KEY,
"Content-Type": "application/json"
}
results = []
for point in points:
# Extrair dados do ponto Qdrant
point_id = point.id
metadata = point.payload
text_content = metadata.get("text", "")
document_name = metadata.get("filename", f"qdrant_doc_{point_id}")
if not text_content:
print(f"Pulando {point_id} - nenhum conteúdo de texto encontrado na carga útil")
continue
data = {
"name": document_name,
"content": text_content,
# Opcional: incluir metadados adicionais
"metadata": metadata
}
try:
response = requests.post(
f"{BASE_URL}/vector-stores/{VECTOR_STORE_ID}/documents/text",
headers=headers,
json=data
)
if response.status_code == 201:
print(f"Documento '{document_name}' enviado com sucesso!")
results.append({"id": point_id, "success": True})
else:
print(f"Erro ao enviar o documento {document_name}: {response.text}")
results.append({"id": point_id, "success": False, "error": response.text})
except Exception as e:
print(f"Exceção ao enviar o documento {document_name}: {str(e)}")
results.append({"id": point_id, "success": False, "error": str(e)})
# Adicionar um pequeno atraso para evitar limitação de taxa
time.sleep(0.1)
return results
# Função principal de migração
def migrate_qdrant_to_rememberizer():
offset = None
total_migrated = 0
print("Iniciando a migração do Qdrant para o Rememberizer...")
while True:
points, next_offset = fetch_points_from_qdrant(
QDRANT_COLLECTION_NAME,
BATCH_SIZE,
offset
)
if not points:
break
print(f"Buscou {len(points)} pontos do Qdrant")
results = upload_to_rememberizer(points)
success_count = sum(1 for r in results if r.get("success", False))
total_migrated += success_count
print(f"Progresso: {total_migrated} pontos migrados com sucesso")
if next_offset is None:
break
offset = next_offset
print(f"Migração completa! {total_migrated} pontos totais migrados para o Rememberizer")
# Execute a migração
# migrate_qdrant_to_rememberizer()
Migrando do Supabase pgvector
Se você já está usando o Supabase com pgvector, a migração para o Rememberizer é particularmente simples, uma vez que ambos usam PostgreSQL com a extensão pgvector.
import psycopg2
import requests
import json
import time
import os
from dotenv import load_dotenv
# Carregar variáveis de ambiente
load_dotenv()
# Configuração do PostgreSQL do Supabase
SUPABASE_DB_HOST = os.getenv("SUPABASE_DB_HOST")
SUPABASE_DB_PORT = os.getenv("SUPABASE_DB_PORT", "5432")
SUPABASE_DB_NAME = os.getenv("SUPABASE_DB_NAME")
SUPABASE_DB_USER = os.getenv("SUPABASE_DB_USER")
SUPABASE_DB_PASSWORD = os.getenv("SUPABASE_DB_PASSWORD")
SUPABASE_VECTOR_TABLE = os.getenv("SUPABASE_VECTOR_TABLE", "documents")
# Configuração do Rememberizer
REMEMBERIZER_API_KEY = os.getenv("REMEMBERIZER_API_KEY")
VECTOR_STORE_ID = os.getenv("VECTOR_STORE_ID") # por exemplo, "vs_abc123"
BASE_URL = "https://api.rememberizer.ai/api/v1"
# Tamanho do lote para processamento
BATCH_SIZE = 100
# Conectar ao Supabase PostgreSQL
def connect_to_supabase():
try:
conn = psycopg2.connect(
host=SUPABASE_DB_HOST,
port=SUPABASE_DB_PORT,
dbname=SUPABASE_DB_NAME,
user=SUPABASE_DB_USER,
password=SUPABASE_DB_PASSWORD
)
return conn
except Exception as e:
print(f"Erro ao conectar ao Supabase PostgreSQL: {e}")
return None
# Buscar documentos do Supabase pgvector
def fetch_documents_from_supabase(conn, batch_size, offset=0):
try:
cursor = conn.cursor()
# Ajuste esta consulta com base na estrutura da sua tabela
query = f"""
SELECT id, content, metadata, embedding
FROM {SUPABASE_VECTOR_TABLE}
ORDER BY id
LIMIT %s OFFSET %s
"""
cursor.execute(query, (batch_size, offset))
documents = cursor.fetchall()
cursor.close()
return documents
except Exception as e:
print(f"Erro ao buscar documentos do Supabase: {e}")
return []
# Carregar documentos para o Rememberizer
def upload_to_rememberizer(documents):
headers = {
"x-api-key": REMEMBERIZER_API_KEY,
"Content-Type": "application/json"
}
results = []
for doc in documents:
doc_id, content, metadata, embedding = doc
# Analisar metadados se estiver armazenado como string JSON
if isinstance(metadata, str):
try:
metadata = json.loads(metadata)
except:
metadata = {}
elif metadata is None:
metadata = {}
document_name = metadata.get("filename", f"supabase_doc_{doc_id}")
if not content:
print(f"Pulando {doc_id} - nenhum conteúdo encontrado")
continue
data = {
"name": document_name,
"content": content,
"metadata": metadata
}
try:
response = requests.post(
f"{BASE_URL}/vector-stores/{VECTOR_STORE_ID}/documents/text",
headers=headers,
json=data
)
if response.status_code == 201:
print(f"Documento '{document_name}' carregado com sucesso!")
results.append({"id": doc_id, "success": True})
else:
print(f"Erro ao carregar o documento {document_name}: {response.text}")
results.append({"id": doc_id, "success": False, "error": response.text})
except Exception as e:
print(f"Exceção ao carregar o documento {document_name}: {str(e)}")
results.append({"id": doc_id, "success": False, "error": str(e)})
# Adicionar um pequeno atraso para evitar limitação de taxa
time.sleep(0.1)
return results
# Função principal de migração
def migrate_supabase_to_rememberizer():
conn = connect_to_supabase()
if not conn:
print("Falha ao conectar ao Supabase. Abortando a migração.")
return
offset = 0
total_migrated = 0
print("Iniciando a migração do pgvector do Supabase para o Rememberizer...")
try:
while True:
documents = fetch_documents_from_supabase(conn, BATCH_SIZE, offset)
if not documents:
break
print(f"Buscou {len(documents)} documentos do Supabase")
results = upload_to_rememberizer(documents)
success_count = sum(1 for r in results if r.get("success", False))
total_migrated += success_count
print(f"Progresso: {total_migrated} documentos migrados com sucesso")
offset += BATCH_SIZE
finally:
conn.close()
print(f"Migração completa! {total_migrated} documentos migrados para o Rememberizer")
# Execute a migração
# migrate_supabase_to_rememberizer()
Melhores Práticas de Migração
Siga estas recomendações para uma migração bem-sucedida:
Planeje com Antecedência:
Estime o volume de dados e o tempo necessário para a migração
Programe a migração durante períodos de baixo tráfego
Aumente o espaço em disco antes de iniciar grandes migrações
Teste Primeiro:
Crie um vetor de teste no Rememberizer
Migre um pequeno subconjunto de dados (100-1000 vetores)
Verifique a funcionalidade de busca com consultas-chave
Validação de Dados:
Compare a contagem de documentos antes e depois da migração
Execute consultas de benchmark para garantir resultados semelhantes
Valide se os metadados estão corretamente preservados
Otimize para Desempenho:
Use operações em lote para eficiência
Considere a colocação geográfica dos bancos de dados de origem e destino
Monitore os limites de taxa da API e ajuste os tamanhos dos lotes conforme necessário
Etapas Pós-Migração:
Verifique a criação do índice no Rememberizer
Atualize as configurações do aplicativo para apontar para o novo vetor de armazenamento
Mantenha o banco de dados de origem como backup até que a migração seja verificada
Para referência detalhada da API e documentação de endpoints, visite a página Documentação do Armazenamento Vetorial.
Certifique-se de manusear as chaves da API de forma segura e siga as melhores práticas para gerenciamento de chaves da API.
Last updated