Armazenamento de Vetor
- Acesse Integrações para conhecer todos os mecanismos de armazenamento de vetor de terceiros oficialmente suportados pela LangChain.
A solução mais comum para armazenar e pesquisar dados não estruturados é calcular vetores de características dos dados e, em seguida, buscar vetores semelhantes com base na semelhança de vetores ao fazer consultas. Um banco de dados de vetor é responsável por fornecer mecanismos de armazenamento de dados para armazenar e consultar vetores.
Começando com o Armazenamento de Vetor LangChain
Este guia apresenta as funcionalidades básicas relacionadas aos Armazenamentos de Vetor. O componente-chave que trabalha com o armazenamento de vetor é o modelo de incorporação (responsável por calcular vetores de características). Portanto, é recomendável aprender como calcular vetores de texto com o modelo de incorporação de texto antes de estudar este capítulo.
Existem muitos mecanismos excelentes de armazenamento de vetores. Abaixo, apresentamos o uso de 3 mecanismos de armazenamento de vetor gratuitos e de código aberto no framework LangChain.
Chroma
Este capítulo utiliza o banco de dados de vetor chroma
, que roda localmente como uma biblioteca Python.
pip install chromadb
Aqui, utilizamos o modelo de incorporação da OpenAI para calcular os vetores, portanto, precisamos obter a chave da API da OpenAI.
import os
import getpass
os.environ['OPENAI_API_KEY'] = getpass.getpass('Chave da API da OpenAI:')
from langchain_community.document_loaders import TextLoader
from langchain_openai import OpenAIEmbeddings
from langchain_text_splitters import CharacterTextSplitter
from langchain_community.vectorstores import Chroma
documentos_brutos = TextLoader('../../../state_of_the_union.txt').load()
divisor_texto = CharacterTextSplitter(tamanho_segmento=1000, sobreposicao_segmento=0)
documentos = divisor_texto.dividir_documentos(documentos_brutos)
db = Chroma.from_documents(documentos, OpenAIEmbeddings())
FAISS
Este capítulo utiliza o banco de dados de vetor FAISS
, que utiliza a biblioteca Facebook AI Similarity Search (FAISS).
pip install faiss-cpu
Aqui, utilizamos o modelo de incorporação da OpenAI para calcular os vetores, portanto, precisamos obter a chave da API da OpenAI.
import os
import getpass
os.environ['OPENAI_API_KEY'] = getpass.getpass('Chave da API da OpenAI:')
from langchain_community.document_loaders import TextLoader
from langchain_openai import OpenAIEmbeddings
from langchain_text_splitters import CharacterTextSplitter
from langchain_community.vectorstores import FAISS
documentos_brutos = TextLoader('../../../state_of_the_union.txt').load()
divisor_texto = CharacterTextSplitter(tamanho_segmento=1000, sobreposicao_segmento=0)
documentos = divisor_texto.dividir_documentos(documentos_brutos)
db = FAISS.from_documents(documentos, OpenAIEmbeddings())
Lance
Neste capítulo, vamos introduzir como o framework LangChain utiliza o banco de dados de vetor LanceDB.
pip install lancedb
Aqui, utilizamos o modelo de incorporação da OpenAI para calcular vetores, portanto, precisamos obter a chave da API da OpenAI.
import os
import getpass
os.environ['OPENAI_API_KEY'] = getpass.getpass('Chave da API da OpenAI:')
from langchain_community.document_loaders import TextLoader
from langchain_openai import OpenAIEmbeddings
from langchain_text_splitters import CharacterTextSplitter
from langchain_community.vectorstores import LanceDB
import lancedb
db = lancedb.connect("/tmp/lancedb")
tabela = db.create_table(
"minha_tabela",
dados=[
{
"vetor": embeddings.embed_query("Olá Mundo"),
"texto": "Olá Mundo",
"id": "1",
}
],
modo="sobrescrever",
)
documentos_brutos = TextLoader('../../../state_of_the_union.txt').load()
divisor_texto = CharacterTextSplitter(tamanho_segmento=1000, sobreposicao_segmento=0)
documentos = divisor_texto.dividir_documentos(documentos_brutos)
db = LanceDB.from_documents(documentos, OpenAIEmbeddings(), conexão=tabela)
Busca de Semelhança
consulta = "O que o Presidente disse para Ketanji Brown Jackson?"
docs = db.similarity_search(consulta)
print(docs[0].conteúdo_da_página)
Pesquisa de Similaridade de Vetores
Utilize similarity_search_by_vector
para realizar uma busca de similaridade com base no vetor fornecido. Essa função recebe um vetor de incorporação como parâmetro, em vez de uma string.
vetor_de_incorporação = OpenAIEmbeddings().embed_query(query)
docs = db.similarity_search_by_vector(vetor_de_incorporação)
print(docs[0].page_content)
Operações Assíncronas
O armazenamento de vetores frequentemente funciona como um serviço independente e requer algumas operações de E/S. Portanto, utilize chamadas assíncronas para a interface do banco de dados de vetores. Isso pode melhorar o desempenho, pois você não precisa esperar pelas respostas de serviços externos.
O Langchain suporta operações assíncronas para o armazenamento de vetores. Todos os métodos podem ser chamados usando suas funções assíncronas com o prefixo a
, indicando async
.
Qdrant
é um armazenamento de vetores que suporta todas as operações assíncronas. Abaixo está um exemplo usando o Qdrant.
pip install qdrant-client
from langchain_community.vectorstores import Qdrant
Criação Assíncrona de Armazenamento de Vetores
db = await Qdrant.afrom_documents(documentos, incorporações, "http://localhost:6333")
Busca de Similaridade
query = "O que o Presidente disse para Ketanji Brown Jackson?"
docs = await db.asimilarity_search(query)
print(docs[0].page_content)
Busca Baseada em Vetores
vetor_de_incorporação = incorporações.embed_query(query)
docs = await db.asimilarity_search_by_vector(vetor_de_incorporação)
Busca de Relevância Marginal Máxima (MMR)
A Relevância Marginal Máxima otimiza a similaridade com a consulta e a diversidade entre os documentos selecionados. Também oferece suporte a uma API assíncrona.
query = "O que o Presidente disse para Ketanji Brown Jackson?"
docs_encontrados = await qdrant.amax_marginal_relevance_search(query, k=2, fetch_k=10)
for i, doc in enumerate(docs_encontrados):
print(f"{i + 1}.", doc.page_content, "\n")