Airbyte: Infrastruktur Pergerakan Data Sumber Terbuka
Airbyte adalah infrastruktur pergerakan data sumber terbuka untuk membangun pipa data ekstrak dan beban (EL). Infrastruktur ini dirancang untuk keserbagunaan, skalabilitas, dan kemudahan penggunaan. Katalog konektor Airbyte hadir "di luar kotak" dengan lebih dari 350 konektor yang sudah jadi. Konektor-konektor ini dapat digunakan untuk mulai mereplikasi data dari sumber ke tujuan hanya dalam beberapa menit.
Komponen-komponen Utama Airbyte
1. Katalog Konektor
- 350+ Konektor yang Sudah Dibangun Sebelumnya: Katalog konektor Airbyte hadir "out-of-the-box" dengan lebih dari 350 konektor yang sudah jadi. Konektor-konektor ini dapat digunakan untuk mulai mereplikasi data dari sumber ke tujuan hanya dalam beberapa menit.
- Pembuat Konektor Tanpa Kode: Anda dapat dengan mudah memperluas fungsionalitas Airbyte untuk mendukung kasus penggunaan khusus Anda melalui alat seperti No-Code Connector Builder.
2. Platform
Platform Airbyte menyediakan semua layanan horizontal yang diperlukan untuk mengonfigurasi dan menskalakan operasi perpindahan data, tersedia dalam bentuk cloud-managed atau self-managed.
3. Antarmuka Pengguna
Airbyte memiliki fitur UI, PyAirbyte (library Python), API, dan Terraform Provider untuk berintegrasi dengan tooling dan pendekatan yang Anda inginkan untuk manajemen infrastruktur.
Dengan kemampuan Airbyte, pengguna dapat mengintegrasikan sumber data ke dalam cluster Milvus untuk pencarian kemiripan.
Sebelum Anda Memulai
Anda akan membutuhkan
- Akun Zendesk (atau sumber data lain yang ingin Anda sinkronkan datanya)
- Akun Airbyte atau instance lokal
- Kunci API OpenAI
- Milvus cluster
- Python 3.10 yang terinstal secara lokal
Menyiapkan Milvus Cluster
Jika Anda telah menggunakan cluster K8s untuk produksi, Anda dapat melewati langkah ini dan langsung menggunakan Milvus Operator. Jika belum, Anda dapat mengikuti langkah-langkah untuk menggunakan cluster Milvus dengan Milvus Operator.
Entitas individual (dalam kasus kami, tiket dukungan dan artikel basis pengetahuan) disimpan dalam sebuah "koleksi" - setelah cluster Anda disiapkan, Anda perlu membuat koleksi. Pilih nama yang sesuai dan atur Dimension ke 1536 untuk mencocokkan dimensi vektor yang dihasilkan oleh layanan penyematan OpenAI.
Setelah pembuatan, catat info titik akhir dan autentikasi.
Menyiapkan Koneksi di Airbyte
Basis data kita sudah siap, mari kita pindahkan beberapa data! Untuk melakukan ini, kita perlu mengonfigurasi koneksi di Airbyte. Daftar akun cloud Airbyte di cloud.airbyte.com atau jalankan instance lokal seperti yang dijelaskan dalam dokumentasi.
Mengatur Sumber
Setelah instance Anda berjalan, kita perlu menyiapkan koneksi - klik "New connection" dan pilih konektor "Zendesk Support" sebagai sumber. Setelah mengklik tombol "Test and Save", Airbyte akan memeriksa apakah koneksi dapat dibuat.
Di Airbyte cloud, Anda dapat dengan mudah mengautentikasi dengan mengklik tombol Autentikasi. Saat menggunakan instance Airbyte lokal, ikuti petunjuk yang diuraikan pada halaman dokumentasi.
Mengatur Tujuan
Jika semuanya bekerja dengan benar, langkah selanjutnya adalah mengatur tujuan untuk memindahkan data. Di sini, pilih konektor "Milvus".
Konektor Milvus melakukan tiga hal:
- Chunking and Formatting - Memisahkan catatan Zendesk menjadi teks dan metadata. Jika teks lebih besar dari ukuran chunk yang ditentukan, catatan akan dipecah menjadi beberapa bagian yang dimuat ke dalam koleksi satu per satu. Pemecahan teks (atau chunking) dapat, misalnya, terjadi pada kasus tiket dukungan yang besar atau artikel pengetahuan. Dengan memecah teks, Anda dapat memastikan bahwa pencarian selalu memberikan hasil yang berguna.
Mari kita mulai dengan ukuran chunk 1000 token dan bidang teks body, judul, deskripsi, dan subjek, karena ini akan ada di data yang akan kita terima dari Zendesk.
- Penyematan - Menggunakan model Machine Learning mengubah potongan teks yang dihasilkan oleh bagian pemrosesan menjadi penyematan vektor yang kemudian dapat Anda cari kesamaan semantiknya. Untuk membuat penyematan, Anda harus menyediakan kunci API OpenAI. Airbyte akan mengirimkan setiap potongan ke OpenAI dan menambahkan vektor yang dihasilkan ke entitas yang dimuat ke dalam cluster Milvus Anda.
- Pengindeksan - Setelah Anda membuat vektor potongan, Anda dapat memuatnya ke dalam database. Untuk melakukannya, masukkan informasi yang Anda dapatkan ketika menyiapkan klaster dan koleksi Anda di klaster Milvus. Mengklik "Test and save" akan memeriksa apakah semuanya sudah tersusun dengan benar (kredensial yang valid, koleksi ada dan memiliki dimensi vektor yang sama dengan penyematan yang dikonfigurasi, dll.)
Mengatur aliran sinkronisasi aliran
Langkah terakhir sebelum data siap mengalir adalah memilih "stream" mana yang akan disinkronkan. Sebuah stream adalah kumpulan dari record-record yang ada di source. Karena Zendesk mendukung sejumlah besar stream yang tidak relevan dengan kasus penggunaan kita, mari kita hanya memilih "tiket" dan "artikel" dan menonaktifkan yang lainnya untuk menghemat bandwidth dan memastikan hanya informasi yang relevan yang akan muncul dalam pencarian:

Segera setelah koneksi disiapkan, Airbyte akan mulai menyinkronkan data. Diperlukan waktu beberapa menit untuk muncul di koleksi Milvus Anda.
Jika Anda memilih frekuensi replikasi, Airbyte akan berjalan secara teratur untuk menjaga koleksi Milvus Anda tetap mutakhir dengan perubahan pada artikel Zendesk dan masalah yang baru dibuat.
Alur pemeriksaan
Anda dapat memeriksa di Milvus cluster UI bagaimana data terstruktur dalam koleksi dengan menavigasi ke taman bermain dan mengeksekusi kueri "Query Data" dengan filter yang disetel ke "_ab_stream == \"tickets\"".

Membangun aplikasi Streamlit yang menanyakan koleksi
Data kita sudah siap - sekarang kita perlu membangun aplikasi untuk menggunakannya. Dalam hal ini, aplikasi akan menjadi formulir dukungan sederhana bagi pengguna untuk mengirimkan kasus dukungan. Ketika pengguna menekan tombol kirim, kita akan melakukan dua hal:
- Mencari tiket serupa yang dikirimkan oleh pengguna dari organisasi yang sama
- Mencari artikel berbasis pengetahuan yang mungkin relevan dengan pengguna
Dalam kedua kasus tersebut, kita akan memanfaatkan pencarian semantik menggunakan sematan OpenAI. Untuk melakukan hal ini, deskripsi masalah yang dimasukkan pengguna juga disematkan dan digunakan untuk mengambil entitas yang serupa dari klaster Milvus. Jika ada hasil yang relevan, hasil tersebut akan ditampilkan di bawah formulir.
Menyiapkan lingkungan UI
Anda akan membutuhkan instalasi Python lokal karena kita akan menggunakan Streamlit untuk mengimplementasikan aplikasi.
Pertama, instal Streamlit, pustaka klien Milvus, dan pustaka klien OpenAI secara lokal:
pip install streamlit pymilvus openai
Untuk membuat formulir dukungan dasar, buatlah file python basic_support_form.py
:
import streamlit as st
with st.form("my_form"):
st.write("Submit a support case")
text_val = st.text_area("Describe your problem")
submitted = st.form_submit_button("Submit")
if submitted:
# TODO check for related support cases and articles
st.write("Submitted!")
Untuk menjalankan aplikasi Anda, gunakan Streamlit run:
streamlit run basic_support_form.py
Ini akan merender formulir dasar:

Menyiapkan layanan kueri backend
Selanjutnya, mari kita periksa tiket terbuka yang mungkin relevan. Untuk melakukan hal ini, kita menyematkan teks yang dimasukkan pengguna menggunakan OpenAI, lalu melakukan pencarian kemiripan pada koleksi kita, memfilter tiket yang masih terbuka. Jika ada satu dengan jarak yang sangat rendah antara tiket yang disediakan dan tiket yang ada, beri tahu pengguna dan jangan kirimkan:
import streamlit as st
import os
import pymilvus
import openai
with st.form("my_form"):
st.write("Submit a support case")
text_val = st.text_area("Describe your problem?")
submitted = st.form_submit_button("Submit")
if submitted:
import os
import pymilvus
import openai
org_id = 360033549136 # TODO Load from customer login data
pymilvus.connections.connect(uri=os.environ["MILVUS_URL"], token=os.environ["MILVUS_TOKEN"])
collection = pymilvus.Collection("zendesk")
embedding = openai.Embedding.create(input=text_val, model="text-embedding-ada-002")['data'][0]['embedding']
results = collection.search(data=[embedding], anns_field="vector", param={}, limit=2, output_fields=["_id", "subject", "description"], expr=f'status == "new" and organization_id == {org_id}')
st.write(results[0])
if len(results[0]) > 0 and results[0].distances[0] < 0.35:
matching_ticket = results[0][0].entity
st.write(f"This case seems very similar to {matching_ticket.get('subject')} (id #{matching_ticket.get('_id')}). Make sure it has not been submitted before")
else:
st.write("Submitted!")
Ada beberapa hal yang terjadi di sini:
- Koneksi ke cluster Milvus sudah diatur.
- Layanan OpenAI digunakan untuk menghasilkan penyematan deskripsi yang dimasukkan pengguna.
- Pencarian kemiripan dilakukan, memfilter hasil berdasarkan status tiket dan id organisasi (karena hanya tiket terbuka dari organisasi yang sama yang relevan).
- Jika ada hasil dan jarak antara vektor penyematan tiket yang ada dan teks yang baru dimasukkan berada di bawah ambang batas tertentu, panggil fakta ini.
Untuk menjalankan aplikasi baru, Anda perlu mengatur variabel lingkungan untuk OpenAI dan Milvus terlebih dahulu:
export MILVUS_TOKEN=...
export MILVUS_URL=https://...
export OPENAI_API_KEY=sk-...
streamlit run app.py
Ketika mencoba mengirimkan tiket yang sudah ada, seperti inilah hasilnya:

Tampilkan informasi yang lebih relevan
Seperti yang dapat Anda lihat pada keluaran debug hijau yang tersembunyi di versi final, dua tiket cocok dengan pencarian kami (dalam status baru, dari organisasi saat ini, dan dekat dengan vektor penyematan). Namun, yang pertama (relevan) memiliki peringkat yang lebih tinggi daripada yang kedua (tidak relevan dalam situasi ini), yang tercermin dalam nilai jarak yang lebih rendah. Hubungan ini ditangkap dalam vektor penyematan tanpa mencocokkan kata secara langsung, seperti dalam pencarian teks lengkap biasa.
Sebagai penutup, mari kita tampilkan informasi yang berguna setelah tiket dikirimkan untuk memberikan informasi yang relevan kepada pengguna sebanyak mungkin.
Untuk melakukan hal ini, kita akan melakukan pencarian kedua setelah tiket dikirimkan untuk mengambil artikel basis pengetahuan yang paling cocok:
......
else:
# TODO Actually send out the ticket
st.write("Submitted!")
article_results = collection.search(data=[embedding], anns_field="vector", param={}, limit=5, output_fields=["title", "html_url"], expr=f'_ab_stream == "articles"')
st.write(article_results[0])
if len(article_results[0]) > 0:
st.write("We also found some articles that might help you:")
for hit in article_results[0]:
if hit.distance < 0.362:
st.write(f"* [{hit.entity.get('title')}]({hit.entity.get('html_url')})")
Jika tidak ada tiket dukungan terbuka dengan skor kemiripan yang tinggi, tiket baru akan dikirimkan dan artikel pengetahuan yang relevan akan ditampilkan di bawah ini:

Kesimpulan
Meskipun UI yang ditampilkan di sini bukanlah formulir dukungan yang sebenarnya, melainkan sebuah contoh untuk mengilustrasikan kasus penggunaan, kombinasi Airbyte dan Milvus adalah kombinasi yang sangat kuat - ini memudahkan untuk memuat teks dari berbagai macam sumber (dari basis data seperti Postgres melalui API seperti Zendesk atau GitHub hingga sumber yang sepenuhnya dibuat khusus dengan menggunakan SDK Airbyte atau pembangun konektor visual) dan mengindeksnya dalam bentuk yang disematkan di Milvus, sebuah mesin pencari vektor yang kuat dan dapat menskalakan ke data dalam jumlah yang sangat besar.
Airbyte dan Milvus adalah open source dan sepenuhnya gratis untuk digunakan pada infrastruktur Anda, dengan penawaran cloud untuk membebani operasi jika diinginkan.
Di luar kasus penggunaan pencarian semantik klasik yang diilustrasikan dalam artikel ini, pengaturan umum juga dapat digunakan untuk membangun bot obrolan penjawab pertanyaan menggunakan metode RAG (Retrieval Augmented Generation), sistem pemberi rekomendasi, atau membantu membuat iklan menjadi lebih relevan dan efisien.