Mengintegrasikan Fungsi Penyisipan Teks Milvus dengan LangChain
Panduan ini mendemonstrasikan cara menggunakan Fungsi Penyematan Teks Milvus 2.6 (juga dikenal sebagai Data In Data Out) dengan LangChain. Fitur ini memungkinkan server Milvus untuk secara otomatis mengubah teks mentah menjadi penyematan vektor, menyederhanakan kode sisi klien dan memusatkan manajemen kunci API.
Milvus adalah basis data vektor open-source tercanggih di dunia, yang dibuat khusus untuk mendukung pencarian kemiripan dan aplikasi AI. LangChain adalah kerangka kerja untuk mengembangkan aplikasi yang didukung oleh model bahasa besar (LLM). Dengan mengintegrasikan Fungsi Penyematan Teks Milvus, Anda dapat mencapai solusi pencarian vektor yang lebih sederhana dan lebih efisien dalam aplikasi LangChain Anda.
Prasyarat
Sebelum menjalankan tutorial ini, pastikan Anda telah menginstal dependensi berikut:
! pip install --upgrade langchain-milvus langchain-core langchain-openai
Jika Anda menggunakan Google Colab, untuk mengaktifkan dependensi yang baru saja diinstal, Anda mungkin perlu memulai ulang runtime (klik menu "Runtime" di bagian atas layar, dan pilih "Restart session" dari menu tarik-turun).
Mengkonfigurasi Server Milvus
Penting: Fungsi Penyematan Teks (Data In Data Out) hanya tersedia di Milvus Server. Milvus Lite tidak mendukung fitur ini. Anda perlu menggunakan server Milvus yang digunakan dengan Docker/Kubernetes.
Sebelum menggunakan Fungsi Penyematan Teks, Anda perlu mengonfigurasi kredensial untuk penyedia layanan penyematan pada server Milvus.
Deklarasikan kunci Anda di bawah kredensial:
Anda dapat mencantumkan satu atau banyak kunci API-beri masing-masing label yang Anda ciptakan dan akan direferensikan nanti.
# milvus.yaml
credential:
apikey_dev:
apikey: <YOUR_OPENAI_API_KEY>
Beri tahu Milvus kunci mana yang akan digunakan untuk panggilan OpenAI
Di dalam berkas yang sama, arahkan penyedia OpenAI ke label yang Anda inginkan untuk digunakan.
function:
textEmbedding:
providers:
openai:
credential: apikey_dev
# url: https://api.openai.com/v1/embeddings # (optional) custom url
Untuk metode konfigurasi lebih lanjut, silakan lihat dokumentasi Fungsi Penyematan Milvus.
Memulai Layanan Milvus
Pastikan bahwa Milvus Server sedang berjalan dan fitur penyematan diaktifkan. Anda dapat menggunakan server Milvus menggunakan Docker atau Kubernetes. Catatan: Milvus Lite tidak mendukung Fungsi Penyematan Teks.
Memahami Penyematan: Sisi Klien vs Sisi Server
Sebelum masuk ke dalam penggunaan, mari kita pahami terlebih dahulu perbedaan antara dua pendekatan embedding.
Penyematan menggunakan kelas Embeddings milik LangChain (Sisi Klien)
Dalam pendekatan LangChain tradisional, pembuatan embedding terjadi di sisi klien dengan menggunakan kelasEmbeddings . Aplikasi Anda perlu menggunakan metode embed_query dari kelas tersebut untuk memanggil API penyematan, lalu menyimpan vektor yang dihasilkan di Milvus.
from langchain_openai import OpenAIEmbeddings
from langchain_milvus import Milvus
# Generate embedding on client side
embeddings = OpenAIEmbeddings()
vector = embeddings.embed_query("Hello, world!")
# [0.123, -0.456, ...] A vector of floats
vector_store = Milvus(
embedding_function=embeddings,
connection_args={"uri": "http://localhost:19530"},
collection_name="traditional_approach_collection",
)
Diagram Urutan:
Karakteristik:
- Klien secara langsung memanggil API penyematan
- Perlu mengelola kunci API di sisi klien
- Aliran data: Teks → Klien → API Penyematan → Vektor → Milvus
Fungsi Penyematan Teks Milvus (Data Masuk Data Keluar Sisi Server)
Fungsi Penyematan Teks Milvus 2.6 (Data In Data Out) memungkinkan server Milvus untuk secara otomatis mengubah teks mentah menjadi penyematan vektor. Klien hanya perlu menyediakan teks, dan Milvus akan secara otomatis menangani pembuatan embedding.
Diagram Urutan:
Karakteristik:
- Server Milvus memanggil API penyematan
- Kunci API dikelola secara terpusat di sisi server
- Aliran data: Teks → Milvus → Embedding API → Vektor (disimpan di Milvus)
Perbandingan Kedua Metode
| Fitur | Penyematan Rantai Bahasa (Sisi Klien) | Fungsi Penyematan Teks Milvus (Sisi Server) |
|---|---|---|
| Lokasi Pemrosesan | Aplikasi klien | Server Milvus |
| Panggilan API | Klien secara langsung memanggil API penyematan | Server Milvus memanggil API penyematan |
| Manajemen Kunci API | Perlu dikelola di sisi klien | Dikelola secara terpusat di sisi server, lebih aman |
| Kompleksitas Kode | Perlu mengelola kunci API dan panggilan di sisi klien | Hanya perlu mengonfigurasi sekali dalam konfigurasi Milvus |
| Kasus Penggunaan | - Membutuhkan kontrol sisi klien atas proses penyematan - Perlu menyimpan hasil penyematan di sisi klien - Perlu mendukung peralihan beberapa model penyematan | - Menyederhanakan kode sisi klien - Mengelola kunci API secara terpusat di sisi server - Perlu memproses dokumen dalam jumlah besar secara batch - Ingin mengurangi interaksi sisi klien dengan API eksternal - Perlu digabungkan dengan fitur bawaan Milvus seperti BM25 |
| Persyaratan Versi Milvus | Semua versi (termasuk Milvus Lite) | Milvus Lite tidak didukung |
Tutorial ini terutama memperkenalkan metode Fungsi Penyisipan Teks (Data In Data Out) sisi server Milvus, yang merupakan fitur baru yang diperkenalkan pada Milvus 2.6 yang secara signifikan dapat menyederhanakan kode sisi klien dan meningkatkan keamanan.
Menggunakan Fungsi Penyematan Teks
Contoh 1: Hanya Penyematan di Sisi Server
Ini adalah kasus penggunaan yang paling sederhana, yang sepenuhnya bergantung pada server Milvus untuk menghasilkan penyematan. Klien tidak memerlukan fungsi penyematan apa pun.
from langchain_milvus import Milvus
from langchain_milvus.function import TextEmbeddingBuiltInFunction
from langchain_core.documents import Document
# Create Text Embedding Function
text_embedding_func = TextEmbeddingBuiltInFunction(
input_field_names="text", # Input field name (field containing text)
output_field_names="vector", # Output field name (field storing vectors)
dim=1536, # Vector dimension (must specify)
params={
"provider": "openai", # Service provider
"model_name": "text-embedding-3-small", # Model name
"credential": "apikey_dev", # Optional: use credential label configured in milvus.yaml
},
)
# Create Milvus vector store
# Note: embedding_function=None, because embedding is done on server side
vector_store = Milvus(
embedding_function=None, # Do not use client-side embedding
builtin_function=text_embedding_func,
connection_args={"uri": "http://localhost:19530"},
collection_name="my_collection",
# consistency_level="Strong", # Strong consistency level, default is "Session"
auto_id=True,
# drop_old=True, # If you want to drop old collection and create a new one
)
Untuk connection_args:
- Harus menggunakan Server Milvus: Fitur Fungsi Penyematan Teks hanya tersedia di Milvus Server, Milvus Lite tidak didukung.
- Gunakan uri server, seperti
http://localhost:19530(penerapan Docker lokal) atauhttp://your-server:19530(server jarak jauh). - Jika menggunakan Zilliz Cloud, gunakan Public Endpoint sebagai
uridan atur parametertoken.
Saat menambahkan dokumen, Anda hanya perlu menyediakan teks, tidak perlu menghitung vektor terlebih dahulu. Milvus akan secara otomatis memanggil OpenAI API untuk menghasilkan embedding.
# Add documents (only need to provide text, no need to pre-compute vectors)
documents = [
Document(page_content="Milvus simplifies semantic search through embeddings."),
Document(
page_content="Vector embeddings convert text into searchable numeric data."
),
Document(
page_content="Semantic search helps users find relevant information quickly."
),
]
vector_store.add_documents(documents)
[462726375729313252, 462726375729313253, 462726375729313254]
Selama pencarian, langsung gunakan kueri teks, dan Milvus akan secara otomatis mengubah kueri teks menjadi vektor untuk pencarian.
# Search (directly use text query)
results = vector_store.similarity_search(
query="How does Milvus handle semantic search?", k=2
)
for doc in results:
print(f"Content: {doc.page_content}")
print(f"Metadata: {doc.metadata}\n")
WARNING: All log messages before absl::InitializeLog() is called are written to STDERR
I0000 00:00:1765186679.227345 12227536 fork_posix.cc:71] Other threads are currently calling into gRPC, skipping fork() handlers
Content: Milvus simplifies semantic search through embeddings.
Metadata: {'pk': 462726375729313252}
Content: Semantic search helps users find relevant information quickly.
Metadata: {'pk': 462726375729313254}
Contoh 2: Menggabungkan Penyematan Teks dan BM25 (Pencarian Hibrida)
Menggabungkan pencarian semantik (Penyematan Teks) dan pencarian kata kunci (BM25) memungkinkan kemampuan pencarian hibrida yang lebih kuat. Pencarian semantik unggul dalam memahami maksud kueri, sedangkan pencarian kata kunci unggul dalam pencocokan yang tepat.
from langchain_milvus import Milvus
from langchain_milvus.function import TextEmbeddingBuiltInFunction, BM25BuiltInFunction
# Text Embedding Function (semantic search)
text_embedding_func = TextEmbeddingBuiltInFunction(
input_field_names="text",
output_field_names="vector_dense",
dim=1536,
params={
"provider": "openai",
"model_name": "text-embedding-3-small",
},
)
# BM25 Function (keyword search)
bm25_func = BM25BuiltInFunction(
input_field_names="text",
output_field_names="vector_sparse",
)
# Create Milvus vector store
vector_store = Milvus(
embedding_function=None,
builtin_function=[text_embedding_func, bm25_func],
connection_args={"uri": "http://localhost:19530"},
vector_field=["vector_dense", "vector_sparse"],
collection_name="hybrid_search_collection",
# consistency_level="Strong", # Strong consistency level, default is "Session"
auto_id=True,
# drop_old=True, # If you want to drop old collection and create a new one
)
# Add documents
documents = [
Document(page_content="Machine learning and artificial intelligence"),
Document(page_content="The cat sat on the mat"),
]
vector_store.add_documents(documents)
[462726375729313255, 462726375729313256]
Gunakan WeightedRanker untuk mengontrol bobot pencarian semantik dan pencarian kata kunci. Ketika bobot padat lebih tinggi, hasil akan lebih condong ke arah kemiripan semantik; ketika bobot jarang lebih tinggi, hasil akan lebih condong ke arah pencocokan kata kunci.
# Hybrid search, use WeightedRanker to control weights
# 70% semantic search, 30% keyword search
results = vector_store.similarity_search(
query="AI technology",
k=2,
ranker_type="weighted",
ranker_params={"weights": [0.7, 0.3]},
)
# If you want to be more biased towards keyword matching, you can adjust weights
# 30% semantic search, 70% keyword search
results_keyword_focused = vector_store.similarity_search(
query="cat mat",
k=2,
ranker_type="weighted",
ranker_params={"weights": [0.3, 0.7]},
)
results
[Document(metadata={'pk': 462726375729313255}, page_content='Machine learning and artificial intelligence'),
Document(metadata={'pk': 462726375729313256}, page_content='The cat sat on the mat')]
results_keyword_focused
[Document(metadata={'pk': 462726375729313256}, page_content='The cat sat on the mat'),
Document(metadata={'pk': 462726375729313255}, page_content='Machine learning and artificial intelligence')]
Ringkasan
Selamat! Anda telah mempelajari cara menggunakan fitur Fungsi Penyematan Teks (Data In Data Out) Milvus dengan LangChain. Dengan memindahkan pembuatan embedding ke sisi server, Anda dapat menyederhanakan kode sisi klien, mengelola kunci API secara terpusat, dan dengan mudah mengimplementasikan pencarian hybrid. Dikombinasikan dengan Fungsi Penyematan Teks dan BM25, Milvus memberi Anda kemampuan pencarian vektor yang kuat.