Depois de configurar o modelo de embeddings, o próximo passo é transformar os documentos em representações vetoriais e armazená-las de forma persistente. Antes disso, é necessário realizar uma limpeza e posterior segmentação dos dados, garantindo que o conteúdo seja adequado para a recuperação semântica.
Existem diversas formas de carregar dados com o LangChain. A seguir, vemos um exemplo prático utilizando arquivos PDF.
Crie um arquivo chamado preparar_base.py no caminho /root/autodl-tmp:
import re
from langchain_community.document_loaders import PyMuPDFLoader
from langchain.text_splitter import RecursiveCharacterTextSplitter
from testEmbeddings import BGEM3Embeddings
from transformers import AutoTokenizer, AutoModel
from langchain_community.vectorstores import Chroma
# Carrega o documento PDF
caminho_pdf = "/root/autodl-fs/dataset/LLM-v1.0.0.pdf"
carregador = PyMuPDFLoader(caminho_pdf)
paginas = carregador.load()
# Limpa o conteúdo das páginas
padrao_quebra = re.compile(r'[^\u4e00-\u9fff](\n)[^\u4e00-\u9fff]', re.DOTALL)
for pagina in paginas:
pagina.page_content = re.sub(padrao_quebra, lambda m: m.group(0).replace('\n', ''), pagina.page_content)
pagina.page_content = pagina.page_content.replace('•', '').replace(' ', '')
# Parâmetros de segmentação
TAMANHO_BLOCO = 500
SOBREPOSICAO = 50
divisor = RecursiveCharacterTextSplitter(
chunk_size=TAMANHO_BLOCO,
chunk_overlap=SOBREPOSICAO,
separators=["\n\n", "\n", " ", "", "。", ","]
)
documentos_divididos = divisor.split_documents(paginas)
# Inicializa o modelo de embeddings local
nome_modelo = "bge-m3"
tokenizador = AutoTokenizer.from_pretrained(nome_modelo)
modelo = AutoModel.from_pretrained(nome_modelo)
embedding = BGEM3Embeddings(modelo, tokenizador)
# Define o diretório de persistência
caminho_persistencia = "/root/autodl-tmp/vectorDatabase/chroma"
# Cria e persiste a base vetorial
base_vetorial = Chroma.from_documents(
documents=documentos_divididos,
embedding=embedding,
persist_directory=caminho_persistencia
)
base_vetorial.persist()
print(f"Quantidade de vetores armazenados: {base_vetorial._collection.count()}")
Antes de executar, crie o diretório /root/autodl-tmp/vectorDatabase e, dentro dele, a pasta chroma, onde os vetores serão armazenados em disco. Se o número de vetores retornado for maior que zero, a vetorização e a persistência foram bem-sucedidas.
Para validar a recuperação dos dados, crie o arquivo consultar_base.py:
from testEmbeddings import BGEM3Embeddings
from transformers import AutoTokenizer, AutoModel
from langchain_community.vectorstores import Chroma
nome_modelo = "bge-m3"
tokenizador = AutoTokenizer.from_pretrained(nome_modelo)
modelo = AutoModel.from_pretrained(nome_modelo)
embedding = BGEM3Embeddings(modelo, tokenizador)
caminho_persistencia = "/root/autodl-tmp/vectorDatabase/chroma"
base_carregada = Chroma(
persist_directory=caminho_persistencia,
embedding_function=embedding
)
# Realiza busca por similaridade
consulta = "insira aqui uma frase relacionada ao conjunto de dados"
resultados = base_carregada.similarity_search(consulta, k=5)
for indice, documento in enumerate(resultados):
print(f"Resultado {indice}: \n{documento.page_content}")
print("--------------")
Se tudo estiver configurado corretamente, o script retornará trechos do documento que apresentam semelhança com a consulta. Eventuais imprecisões nesse estágio não são problemáticas, pois o modelo de linguagem utilizará esses trechos como contexto para construir respostas mais precisas posteriormente.