Open In Colab GitHub Repository

Utilização da pesquisa de texto completo com o LlamaIndex e o Milvus

A pesquisa de texto completo utiliza a correspondência exata de palavras-chave, recorrendo frequentemente a algoritmos como o BM25 para classificar documentos por relevância. Nos sistemas de Geração Aumentada por Recuperação (RAG), este método recupera texto pertinente para melhorar as respostas geradas pela IA.

Por outro lado, a pesquisa semântica interpreta o significado contextual para fornecer resultados mais abrangentes. A combinação de ambas as abordagens cria uma pesquisa híbrida que melhora a recuperação de informação — especialmente nos casos em que um único método se revela insuficiente.

Com a abordagem Sparse-BM25 do Milvus 2.5, o texto bruto é automaticamente convertido em vetores esparsos. Isto elimina a necessidade de geração manual de embeddings esparsos e permite uma estratégia de pesquisa híbrida que equilibra a compreensão semântica com a relevância das palavras-chave.

Neste tutorial, irá aprender a utilizar o LlamaIndex e o Milvus para construir um sistema RAG utilizando a pesquisa de texto completo e a pesquisa híbrida. Começaremos por implementar apenas a pesquisa de texto completo e, em seguida, iremos aperfeiçoá-la através da integração da pesquisa semântica para obter resultados mais abrangentes.

Antes de prosseguir com este tutorial, certifique-se de que está familiarizado com a pesquisa de texto completo e com os conceitos básicos da utilização do Milvus no LlamaIndex.

Pré-requisitos

Instalar dependências

Antes de começar, certifique-se de que tem as seguintes dependências instaladas:

$ $pip install llama-index-vector-stores-milvus
$ $pip install llama-index-embeddings-openai
$ $pip install llama-index-llms-openai

Se estiver a utilizar o Google Colab, poderá ser necessário reiniciar o ambiente de execução (navegue até ao menu «Runtime» na parte superior da interface e selecione «Restart session» no menu suspenso).

Configurar contas

Este tutorial utiliza a OpenAI para incorporações de texto e geração de respostas. É necessário preparar a chave da API da OpenAI.

import openai

openai.api_key = "sk-"

Para utilizar o armazenamento de vetores Milvus, especifique o endereço do seu servidor Milvus URI (e, opcionalmente, com o TOKEN). Para iniciar um servidor Milvus, pode configurá-lo seguindo o guia de instalação do Milvus ou simplesmente experimentando o Zilliz Cloud gratuitamente.

A pesquisa de texto completo é atualmente suportada no Milvus Standalone, no Milvus Distributed e no Zilliz Cloud, mas ainda não no Milvus Lite (implementação prevista para o futuro). Contacte support@zilliz.com para obter mais informações.

URI = "http://localhost:19530"
# TOKEN = ""

Descarregar dados de exemplo

Execute os seguintes comandos para descarregar documentos de amostra para o diretório «data/paul_graham»:

$ mkdir -p 'data/paul_graham/'
$ $wget 'https://raw.githubusercontent.com/run-llama/llama_index/main/docs/docs/examples/data/paul_graham/paul_graham_essay.txt' -O 'data/paul_graham/paul_graham_essay.txt'
--2025-03-27 07:49:01--  https://raw.githubusercontent.com/run-llama/llama_index/main/docs/docs/examples/data/paul_graham/paul_graham_essay.txt
Resolving raw.githubusercontent.com (raw.githubusercontent.com)... 185.199.108.133, 185.199.109.133, 185.199.110.133, ...
Connecting to raw.githubusercontent.com (raw.githubusercontent.com)|185.199.108.133|:443... connected.
HTTP request sent, awaiting response... 200 OK
Length: 75042 (73K) [text/plain]
Saving to: ‘data/paul_graham/paul_graham_essay.txt’

data/paul_graham/pa 100%[===================>]  73.28K  --.-KB/s    in 0.07s   

2025-03-27 07:49:01 (1.01 MB/s) - ‘data/paul_graham/paul_graham_essay.txt’ saved [75042/75042]

A integração da pesquisa de texto completo num sistema RAG equilibra a pesquisa semântica com uma recuperação precisa e previsível baseada em palavras-chave. Também pode optar por utilizar apenas a pesquisa de texto completo, embora seja recomendável combiná-la com a pesquisa semântica para obter melhores resultados de pesquisa. Aqui, para fins de demonstração, iremos mostrar a pesquisa de texto completo isoladamente e a pesquisa híbrida.

Para começar, utilize SimpleDirectoryReaderLoad para carregar o ensaio «What I Worked On», de Paul Graham:

from llama_index.core import SimpleDirectoryReader

documents = SimpleDirectoryReader("./data/paul_graham/").load_data()

# Let's take a look at the first document
print("Example document:\n", documents[0])
Example document:
 Doc ID: 16b7942f-bf1a-4197-85e1-f31d51ea25a9
Text: What I Worked On  February 2021  Before college the two main
things I worked on, outside of school, were writing and programming. I
didn't write essays. I wrote what beginning writers were supposed to
write then, and probably still are: short stories. My stories were
awful. They had hardly any plot, just characters with strong feelings,
which I ...

Pesquisa de texto completo com BM25

O MilvusVectorStore do LlamaIndex suporta a pesquisa de texto completo, permitindo uma recuperação eficiente baseada em palavras-chave. Ao utilizar uma função integrada como o sparse_embedding_function, aplica a pontuação BM25 para classificar os resultados da pesquisa.

Nesta secção, vamos demonstrar como implementar um sistema RAG utilizando o BM25 para a pesquisa de texto completo.

from llama_index.core import VectorStoreIndex, StorageContext
from llama_index.vector_stores.milvus import MilvusVectorStore
from llama_index.vector_stores.milvus.utils import BM25BuiltInFunction
from llama_index.core import Settings

# Skip dense embedding model
Settings.embed_model = None

# Build Milvus vector store creating a new collection
vector_store = MilvusVectorStore(
    uri=URI,
    # token=TOKEN,
    enable_dense=False,
    enable_sparse=True,  # Only enable sparse to demo full text search
    sparse_embedding_function=BM25BuiltInFunction(),
    overwrite=True,
)

# Store documents in Milvus
storage_context = StorageContext.from_defaults(vector_store=vector_store)
index = VectorStoreIndex.from_documents(documents, storage_context=storage_context)
Embeddings have been explicitly disabled. Using MockEmbedding.

O código acima insere documentos de exemplo no Milvus e cria um índice para permitir a classificação BM25 na pesquisa de texto completo. Desativa a incorporação densa e utiliza o BM25BuiltInFunction com parâmetros predefinidos.

Pode especificar os campos de entrada e saída nos parâmetros de ` BM25BuiltInFunction `:

  • input_field_names (str): O campo de texto de entrada (padrão: «text»). Indica a que campo de texto o algoritmo BM25 foi aplicado. Altere este valor se estiver a utilizar a sua própria coleção com um nome de campo de texto diferente.
  • output_field_names (str): O campo onde são armazenados os resultados desta função BM25 (padrão: «sparse_embedding»).

Depois de configurar o armazenamento de vetores, pode realizar consultas de pesquisa de texto completo utilizando o Milvus com o modo de consulta «sparse» ou «text_search»:

import textwrap

query_engine = index.as_query_engine(
    vector_store_query_mode="sparse", similarity_top_k=5
)
answer = query_engine.query("What did the author learn at Viaweb?")
print(textwrap.fill(str(answer), 100))
The author learned several important lessons at Viaweb. They learned about the importance of growth
rate as the ultimate test of a startup, the value of building stores for users to understand retail
and software usability, and the significance of being the "entry level" option in a market.
Additionally, they discovered the accidental success of making Viaweb inexpensive, the challenges of
hiring too many people, and the relief felt when the company was acquired by Yahoo.

Personalizar o analisador de texto

Os analisadores desempenham um papel vital na pesquisa de texto completo, dividindo as frases em tokens e realizando o processamento lexical, como a redução a raiz e a remoção de palavras de stop. Normalmente, são específicos para cada idioma. Para mais detalhes, consulte o Guia do Analisador do Milvus.

O Milvus suporta dois tipos de analisadores: Analisadores Integrados e Analisadores Personalizados. Por predefinição, o BM25BuiltInFunction utiliza o analisador integrado padrão, que tokeniza o texto com base na pontuação.

Para utilizar um analisador diferente ou personalizar o existente, pode passar um valor ao argumento ` analyzer_params `:

bm25_function = BM25BuiltInFunction(
    analyzer_params={
        "tokenizer": "standard",
        "filter": [
            "lowercase",  # Built-in filter
            {"type": "length", "max": 40},  # Custom cap size of a single token
            {"type": "stop", "stop_words": ["of", "to"]},  # Custom stopwords
        ],
    },
    enable_match=True,
)

Pesquisa híbrida com Reranker

Um sistema de pesquisa híbrido combina a pesquisa semântica e a pesquisa de texto completo, otimizando o desempenho da recuperação num sistema RAG.

O exemplo seguinte utiliza a incorporação da OpenAI para a pesquisa semântica e o BM25 para a pesquisa de texto completo:

# Create index over the documnts
vector_store = MilvusVectorStore(
    uri=URI,
    # token=TOKEN,
    # enable_dense=True,  # enable_dense defaults to True
    dim=1536,
    enable_sparse=True,
    sparse_embedding_function=BM25BuiltInFunction(),
    overwrite=True,
    # hybrid_ranker="RRFRanker",  # hybrid_ranker defaults to "RRFRanker"
    # hybrid_ranker_params={},  # hybrid_ranker_params defaults to {}
)

storage_context = StorageContext.from_defaults(vector_store=vector_store)
index = VectorStoreIndex.from_documents(
    documents,
    storage_context=storage_context,
    embed_model="default",  # "default" will use OpenAI embedding
)

Como funciona

Esta abordagem armazena documentos numa coleção Milvus com ambos os campos vetoriais:

  • embedding: Embeddings densos gerados pelo modelo de embedding da OpenAI para a pesquisa semântica.
  • sparse_embedding: Embeddings esparsos calculados utilizando a função BM25BuiltInFunction para a pesquisa de texto completo.

Além disso, aplicámos uma estratégia de reclassificação utilizando o «RRFRanker» com os seus parâmetros predefinidos. Para personalizar o reclassificador, pode configurar hybrid_ranker e hybrid_ranker_params seguindo o Guia de Reclassificação do Milvus.

Agora, vamos testar o sistema RAG com uma consulta de exemplo:

# Query
query_engine = index.as_query_engine(
    vector_store_query_mode="hybrid", similarity_top_k=5
)
answer = query_engine.query("What did the author learn at Viaweb?")
print(textwrap.fill(str(answer), 100))
The author learned several important lessons at Viaweb. These included the importance of
understanding growth rate as the ultimate test of a startup, the impact of hiring too many people,
the challenges of being at the mercy of investors, and the relief experienced when Yahoo bought the
company. Additionally, the author learned about the significance of user feedback, the value of
building stores for users, and the realization that growth rate is crucial for the long-term success
of a startup.

Esta abordagem híbrida garante respostas mais precisas e sensíveis ao contexto num sistema RAG, tirando partido tanto da recuperação semântica como da baseada em palavras-chave.

Traduzido porDeepL

Experimente o Milvus gerenciado gratuitamente

O Zilliz Cloud é descomplicado, powered by Milvus e 10x mais rápido.

Começar
Feedback

Esta página foi útil?