Open In Colab GitHub Repository

Menggunakan Pencarian Teks Lengkap dengan LlamaIndex dan Milvus

Pencarian teks lengkap menggunakan pencocokan kata kunci yang tepat, sering kali memanfaatkan algoritma seperti BM25 untuk menentukan peringkat dokumen berdasarkan relevansi. Dalam sistem Retrieval-Augmented Generation (RAG), metode ini mengambil teks yang relevan untuk meningkatkan respons yang dihasilkan AI.

Sementara itu, pencarian semantik menafsirkan makna kontekstual untuk memberikan hasil yang lebih luas. Menggabungkan kedua pendekatan ini menciptakan pencarian hibrida yang meningkatkan pengambilan informasi—terutama dalam kasus di mana satu metode saja tidak cukup.

Dengan pendekatan Sparse-BM25 pada Milvus 2.5, teks mentah secara otomatis dikonversi menjadi vektor spars. Hal ini menghilangkan kebutuhan akan pembuatan embedding spars secara manual dan memungkinkan strategi pencarian hibrida yang menyeimbangkan pemahaman semantik dengan relevansi kata kunci.

Dalam tutorial ini, Anda akan mempelajari cara menggunakan LlamaIndex dan Milvus untuk membangun sistem RAG menggunakan pencarian teks lengkap dan pencarian hibrida. Kita akan mulai dengan mengimplementasikan pencarian teks lengkap saja, lalu menyempurnakannya dengan mengintegrasikan pencarian semantik untuk hasil yang lebih komprehensif.

Sebelum melanjutkan tutorial ini, pastikan Anda sudah memahami pencarian teks lengkap dan dasar-dasar penggunaan Milvus di LlamaIndex.

Prasyarat

Instal dependensi

Sebelum memulai, pastikan Anda telah menginstal dependensi berikut:

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

Jika Anda menggunakan Google Colab, Anda mungkin perlu memulai ulang runtime (Buka menu “Runtime” di bagian atas antarmuka, lalu pilih “Restart session” dari menu dropdown.)

Siapkan akun

Tutorial ini menggunakan OpenAI untuk embedding teks dan pembuatan jawaban. Anda perlu menyiapkan kunci API OpenAI.

import openai

openai.api_key = "sk-"

Untuk menggunakan penyimpanan vektor Milvus, tentukan alamat server Milvus Anda URI (dan secara opsional dengan TOKEN). Untuk memulai server Milvus, Anda dapat menyiapkan server Milvus dengan mengikuti panduan instalasi Milvus atau cukup mencoba Zilliz Cloud secara gratis.

Pencarian teks lengkap saat ini didukung di Milvus Standalone, Milvus Distributed, dan Zilliz Cloud, tetapi belum di Milvus Lite (direncanakan untuk implementasi di masa mendatang). Hubungi support@zilliz.com untuk informasi lebih lanjut.

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

Unduh data contoh

Jalankan perintah berikut untuk mengunduh dokumen contoh ke direktori “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]

Mengintegrasikan pencarian teks lengkap ke dalam sistem RAG menyeimbangkan pencarian semantik dengan pengambilan berbasis kata kunci yang tepat dan dapat diprediksi. Anda juga dapat memilih untuk hanya menggunakan pencarian teks lengkap, meskipun disarankan untuk menggabungkan pencarian teks lengkap dengan pencarian semantik guna mendapatkan hasil pencarian yang lebih baik. Di sini, untuk tujuan demonstrasi, kami akan menunjukkan pencarian teks lengkap saja dan pencarian hibrida.

Untuk memulai, gunakan SimpleDirectoryReaderLoad untuk memuat esai “What I Worked On” karya 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 ...

Pencarian Teks Lengkap dengan BM25

MilvusVectorStore dari LlamaIndex mendukung pencarian teks lengkap, sehingga memungkinkan pencarian berbasis kata kunci yang efisien. Dengan menggunakan fungsi bawaan seperti sparse_embedding_function, sistem ini menerapkan penilaian BM25 untuk menentukan peringkat hasil pencarian.

Pada bagian ini, kami akan mendemonstrasikan cara mengimplementasikan sistem RAG menggunakan BM25 untuk pencarian teks lengkap.

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.

Kode di atas memasukkan dokumen contoh ke dalam Milvus dan membangun indeks untuk mengaktifkan pemeringkatan BM25 guna pencarian teks lengkap. Kode ini menonaktifkan dense embedding dan menggunakan BM25BuiltInFunction dengan parameter default.

Anda dapat menentukan bidang masukan dan keluaran dalam parameter ` BM25BuiltInFunction `:

  • input_field_names (str): Bidang teks masukan (default: “text”). Bidang ini menunjukkan bidang teks mana yang diterapkan oleh algoritma BM25. Ubah nilai ini jika Anda menggunakan koleksi Anda sendiri dengan nama bidang teks yang berbeda.
  • output_field_names (str): Bidang tempat hasil fungsi BM25 ini disimpan (default: “sparse_embedding”).

Setelah penyimpanan vektor disiapkan, Anda dapat melakukan kueri pencarian teks lengkap menggunakan Milvus dengan mode kueri “sparse” atau "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.

Menyesuaikan penganalisis teks

Penganalisis memainkan peran penting dalam pencarian teks lengkap dengan memecah kalimat menjadi token dan melakukan pemrosesan leksikal, seperti stemming dan penghapusan kata penghubung. Penganalisis biasanya spesifik untuk bahasa tertentu. Untuk detail lebih lanjut, lihat Panduan Penganalisis Milvus.

Milvus mendukung dua jenis penganalisis: Penganalisis Bawaan dan Penganalisis Kustom. Secara default, BM25BuiltInFunction menggunakan penganalisis bawaan standar, yang memecah teks menjadi token berdasarkan tanda baca.

Untuk menggunakan penganalisis yang berbeda atau menyesuaikan penganalisis yang ada, Anda dapat memberikan nilai ke argumen ` 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,
)

Pencarian Hibrida dengan Reranker

Sistem pencarian hibrida menggabungkan pencarian semantik dan pencarian teks lengkap, sehingga mengoptimalkan kinerja pengambilan data dalam sistem RAG.

Contoh berikut menggunakan embedding OpenAI untuk pencarian semantik dan BM25 untuk pencarian teks lengkap:

# 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
)

Cara kerjanya

Pendekatan ini menyimpan dokumen dalam koleksi Milvus dengan kedua bidang vektor:

  • embedding: Embedding padat yang dihasilkan oleh model embedding OpenAI untuk pencarian semantik.
  • sparse_embedding: Embedding jarang yang dihitung menggunakan BM25BuiltInFunction untuk pencarian teks lengkap.

Selain itu, kami telah menerapkan strategi perankingan ulang menggunakan “RRFRanker” dengan parameter default-nya. Untuk menyesuaikan reranker, Anda dapat mengonfigurasi hybrid_ranker dan hybrid_ranker_params sesuai dengan Panduan Perankingan Ulang Milvus.

Sekarang, mari kita uji sistem RAG dengan kueri contoh:

# 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.

Pendekatan hibrida ini memastikan respons yang lebih akurat dan peka konteks dalam sistem RAG dengan memanfaatkan pencarian berbasis semantik dan kata kunci.

Diterjemahkan olehDeepL

Coba Milvus yang Dikelola secara Gratis

Zilliz Cloud bebas masalah, didukung oleh Milvus dan 10x lebih cepat.

Mulai
Umpan balik

Apakah halaman ini bermanfaat?