Menggunakan Pencarian Teks Lengkap dengan LlamaIndex dan Milvus
Pencarian teks lengkap menggunakan pencocokan kata kunci yang tepat, dan sering kali memanfaatkan algoritme 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 oleh AI.
Sementara itu, pencarian semantik menginterpretasikan makna kontekstual untuk memberikan hasil yang lebih luas. Menggabungkan kedua pendekatan tersebut menciptakan pencarian hibrida yang meningkatkan pencarian informasi-terutama dalam kasus-kasus di mana metode tunggal gagal.
Dengan pendekatan Sparse-BM25 dari Milvus 2.5, teks mentah secara otomatis diubah menjadi vektor jarang. Hal ini menghilangkan kebutuhan untuk pembuatan sematan jarang secara manual dan memungkinkan strategi pencarian hibrida yang menyeimbangkan pemahaman semantik dengan relevansi kata kunci.
Dalam tutorial ini, Anda akan belajar cara menggunakan LlamaIndex dan Milvus untuk membangun sistem RAG menggunakan pencarian teks lengkap dan pencarian hybrid. Kita akan mulai dengan mengimplementasikan pencarian teks lengkap saja dan kemudian menyempurnakannya dengan mengintegrasikan pencarian semantik untuk hasil yang lebih komprehensif.
Sebelum melanjutkan dengan tutorial ini, pastikan Anda sudah terbiasa dengan pencarian teks lengkap dan dasar-dasar penggunaan Milvus di LlamaIndex.
Prasyarat
Instal dependensi
Sebelum memulai, pastikan Anda sudah menginstal dependensi berikut ini:
$ $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 (Arahkan ke menu "Runtime" di bagian atas antarmuka, dan pilih "Restart session" dari menu tarik-turun).
Menyiapkan akun
Tutorial ini menggunakan OpenAI untuk penyematan teks dan pembuatan jawaban. Anda perlu menyiapkan kunci API OpenAI.
import openai
openai.api_key = "sk-"
Untuk menggunakan penyimpanan vektor Milvus, tentukan server Milvus Anda URI (dan secara opsional dengan TOKEN). Untuk memulai server Milvus, Anda dapat mengatur server Milvus dengan mengikuti panduan instalasi Milvus atau 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 = ""
Mengunduh data contoh
Jalankan perintah berikut untuk mengunduh dokumen contoh ke dalam 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]
RAG dengan Pencarian Teks Lengkap
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 untuk hasil pencarian yang lebih baik. Di sini, untuk tujuan demonstrasi, kami akan menunjukkan pencarian teks lengkap saja dan pencarian gabungan.
Untuk memulai, gunakan SimpleDirectoryReaderLoad untuk memuat esai "What I Worked On" oleh 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 ...
Penelusuran Teks Lengkap dengan BM25
MilvusVectorStore milik LlamaIndex mendukung pencarian teks lengkap, sehingga memungkinkan pengambilan berbasis kata kunci yang efisien. Dengan menggunakan fungsi bawaan sebagai sparse_embedding_function, ia 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 menyisipkan contoh dokumen ke dalam Milvus dan membangun indeks untuk mengaktifkan pemeringkatan BM25 untuk pencarian teks lengkap. Kode ini menonaktifkan penyematan padat dan menggunakan BM25BuiltInFunction dengan parameter default.
Anda dapat menentukan bidang input dan output di parameter BM25BuiltInFunction:
input_field_names (str): Bidang teks masukan (default: "teks"). Ini menunjukkan bidang teks mana yang diterapkan algoritme BM25. Ubah ini jika menggunakan koleksi Anda sendiri dengan nama bidang teks yang berbeda.output_field_names (str): Bidang tempat output dari 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 penghilangan kata berimbuhan. Penganalisis biasanya bersifat spesifik untuk bahasa tertentu. Untuk lebih jelasnya, lihat Panduan Penganalisis Milvus.
Milvus mendukung dua jenis penganalisis: Penganalisis Bawaan dan Penganalisis Khusus. Secara default, BM25BuiltInFunction menggunakan penganalisis bawaan standar, yang menandai teks berdasarkan tanda baca.
Untuk menggunakan penganalisis yang berbeda atau menyesuaikan penganalisis yang sudah ada, Anda dapat mengoper 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 Perangking Ulang
Sistem pencarian hibrida menggabungkan pencarian semantik dan pencarian teks lengkap, mengoptimalkan kinerja pengambilan dalam sistem RAG.
Contoh berikut ini menggunakan penyematan 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
)
Bagaimana cara kerjanya
Pendekatan ini menyimpan dokumen dalam koleksi Milvus dengan kedua bidang vektor:
embedding: Sematan padat yang dihasilkan oleh model sematan OpenAI untuk pencarian semantik.sparse_embedding: Sematan jarang yang dihitung menggunakan BM25BuiltInFunction untuk pencarian teks lengkap.
Selain itu, kami telah menerapkan strategi perankingan ulang menggunakan "RRFRanker" dengan parameter default. Untuk menyesuaikan reranker, Anda dapat mengonfigurasi hybrid_ranker dan hybrid_ranker_params dengan mengikuti Panduan Perangkingan Ulang Milvus.
Sekarang, mari kita uji sistem RAG dengan contoh kueri:
# 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 sesuai konteks dalam sistem RAG dengan memanfaatkan pengambilan berbasis semantik dan kata kunci.