milvus-logo
LFAI
Home
  • Integrações
    • Engenharia do conhecimento

Integrar Milvus com WhyHow

Este guia demonstra como usar o whyhow.ai e o Milvus Lite para realizar a recuperação baseada em regras.

Visão geral

WhyHow é uma plataforma que fornece aos programadores os blocos de construção necessários para organizar, contextualizar e recuperar de forma fiável dados não estruturados para realizar RAG complexos. O pacote Rule-based Retrieval é um pacote Python desenvolvido pela WhyHow que permite criar e gerir aplicações Retrieval Augmented Generation (RAG) com capacidades avançadas de filtragem.

Instalação do pacote

Antes de começar, instale todos os pacotes python necessários para uso posterior.

pip install --upgrade pymilvus, whyhow_rbr

Em seguida, precisamos de inicializar o cliente Milvus para implementar a recuperação baseada em regras utilizando o Milvus Lite.

from pymilvus import MilvusClient

# Milvus Lite local path
path="./milvus_demo.db" # random name for local milvus lite db path

# Initialize the ClientMilvus
milvus_client = ClientMilvus(path)

Também é possível inicializar o cliente Milvus através do Milvus Cloud

from pymilvus import MilvusClient

# Milvus Cloud credentials
YOUR_MILVUS_CLOUD_END_POINT = "YOUR_MILVUS_CLOUD_END_POINT"
YOUR_MILVUS_CLOUD_TOKEN = "YOUR_MILVUS_CLOUD_TOKEN"

# Initialize the ClientMilvus
milvus_client = ClientMilvus(
        milvus_uri=YOUR_MILVUS_CLOUD_END_POINT, 
        milvus_token=YOUR_MILVUS_CLOUD_TOKEN,
)

Criar coleção

Definição das variáveis necessárias

# Define collection name
COLLECTION_NAME="YOUR_COLLECTION_NAME" # take your own collection name

# Define vector dimension size
DIMENSION=1536 # decide by the model you use

Adicionar esquema

Antes de inserir qualquer dado no banco de dados do Milvus Lite, precisamos primeiro definir o campo de dados, que aqui é chamado de schema. Através de create object CollectionSchema e add data field através de add_field(), podemos controlar o nosso tipo de dados e as suas caraterísticas. Este passo é obrigatório antes de inserir qualquer dado no Milvus.

schema = milvus_client.create_schema(auto_id=True) # Enable id matching

schema = milvus_client.add_field(schema=schema, field_name="id", datatype=DataType.INT64, is_primary=True)
schema = milvus_client.add_field(schema=schema, field_name="embedding", datatype=DataType.FLOAT_VECTOR, dim=DIMENSION)

Criar índice

Para cada esquema, é preferível ter um índice para que a consulta seja muito mais eficiente. Para criar um índice, precisamos primeiro de um index_params e, mais tarde, adicionamos mais dados de índice a este objeto IndexParams.

# Start to indexing data field
index_params = milvus_client.prepare_index_params()
index_params = milvus_client.add_index(
    index_params=index_params,  # pass in index_params object
    field_name="embedding",
    index_type="AUTOINDEX",  # use autoindex instead of other complex indexing method
    metric_type="COSINE",  # L2, COSINE, or IP
)

Este método é um invólucro fino em torno da implementação oficial do Milvus(documentação oficial).

Criar coleção

Depois de definir todos os campos de dados e de os indexar, precisamos agora de criar a coleção da base de dados para podermos aceder aos nossos dados de forma rápida e precisa. O que é necessário mencionar é que inicializámos o enable_dynamic_field para ser verdadeiro, de modo a que possa carregar quaisquer dados livremente. O custo é que a consulta de dados pode ser ineficiente.

# Create Collection
milvus_client.create_collection(
    collection_name=COLLECTION_NAME,
    schema=schema,
    index_params=index_params
)

Carregar documentos

Depois de criar uma coleção, estamos prontos para a preencher com documentos. Em whyhow_rbr, isso é feito usando o método upload_documents do MilvusClient. Ele executa as seguintes etapas:

  • Pré-processamento: Ler e dividir os ficheiros PDF fornecidos em partes
  • Incorporação: Incorporação de todos os pedaços utilizando um modelo OpenAI
  • Inserção: Carregar as incorporações e os metadados para o Milvus Lite
# get pdfs
pdfs = ["harry-potter.pdf", "game-of-thrones.pdf"] # replace to your pdfs path

# Uploading the PDF document
milvus_client.upload_documents(
    collection_name=COLLECTION_NAME,
    documents=pdfs
)

Resposta às perguntas

Agora podemos finalmente passar para a geração aumentada de recuperação.

# Search data and implement RAG!
res = milvus_client.search(
    question='What food does Harry Potter like to eat?',
    collection_name=COLLECTION_NAME,
    anns_field='embedding',
    output_fields='text'
)
print(res['answer'])
print(res['matches'])

Regras

No exemplo anterior, todos os documentos do nosso índice foram considerados. No entanto, às vezes pode ser benéfico recuperar apenas documentos que satisfaçam algumas condições predefinidas (por exemplo, filename=harry-potter.pdf). Em whyhow_rbr através do Milvus Lite, isto pode ser feito através do ajuste dos parâmetros de pesquisa.

Uma regra pode controlar os seguintes atributos de metadados

  • filename nome do ficheiro
  • page_numbers lista de números inteiros correspondentes aos números de página (indexação 0)
  • id identificador único de um fragmento (este é o filtro mais "extremo")
  • Outras regras baseadas em expressões booleanas
# RULES(search on book harry-potter on page 8):
PARTITION_NAME='harry-potter' # search on books
page_number='page_number == 8'

# first create a partitions to store the book and later search on this specific partition:
milvus_client.crate_partition(
    collection_name=COLLECTION_NAME,
    partition_name=PARTITION_NAME # separate base on your pdfs type
)

# search with rules
res = milvus_client.search(
    question='Tell me about the greedy method',
    collection_name=COLLECTION_NAME,
    partition_names=PARTITION_NAME,
    filter=page_number, # append any rules follow the Boolean Expression Rule
    anns_field='embedding',
    output_fields='text'
)
print(res['answer'])
print(res['matches'])

Neste exemplo, começamos por criar uma partição que armazena pdfs relacionados com Harry Potter e, através da pesquisa nesta partição, podemos obter a informação mais direta. Além disso, aplicamos números de página como um filtro para especificar a página exacta em que pretendemos pesquisar. Lembre-se, o parâmetro filer tem de seguir a regra booleana.

Limpar

Por fim, depois de implementar todas as instruções, pode limpar a base de dados chamando drop_collection().

# Clean up
milvus_client.drop_collection(
    collection_name=COLLECTION_NAME
)

Traduzido porDeepL

Try Managed Milvus for Free

Zilliz Cloud is hassle-free, powered by Milvus and 10x faster.

Get Started
Feedback

Esta página foi útil?