Karena kemampuan LLM (model bahasa besar) dan alat yang berdekatan seperti model penyematan tumbuh secara signifikan selama setahun terakhir, semakin banyak pengembang yang mempertimbangkan mengintegrasikan LLM ke dalam aplikasi mereka.
Karena LLM sering membutuhkan perangkat keras khusus dan sumber daya komputasi yang signifikan, mereka paling umum dikemas sebagai layanan jaringan yang menyediakan API untuk akses. Beginilah API untuk LLM memimpin seperti OpenAi atau Google Gemini Work; Bahkan alat run-your-own-llm seperti Ollama membungkus LLM di API REST untuk konsumsi lokal. Selain itu, pengembang yang memanfaatkan LLMS dalam aplikasi mereka sering membutuhkan alat tambahan seperti database vektor, yang paling sering digunakan sebagai layanan jaringan juga.
Dengan kata lain, aplikasi bertenaga LLM sangat mirip dengan aplikasi cloud-asli modern lainnya: mereka membutuhkan dukungan yang sangat baik untuk protokol istirahat dan RPC, konkurensi dan kinerja. Ini kebetulan adalah area di mana Go unggul, menjadikannya bahasa yang fantastis untuk menulis aplikasi bertenaga LLM.
Posting blog ini berfungsi melalui contoh penggunaan Go for a Simple-bertenaga LLM. Dimulai dengan menggambarkan masalah yang sedang dipecahkan oleh aplikasi demo, dan hasilnya dengan menyajikan beberapa varian aplikasi yang semuanya menyelesaikan tugas yang sama, tetapi menggunakan paket yang berbeda untuk mengimplementasikannya. Semua kode untuk demo posting ini tersedia secara online.
Server kain untuk tanya jawab
Teknik aplikasi bertenaga LLM yang umum adalah generasi augmented rag – pengambilan. Rag adalah salah satu cara yang paling dapat diskalakan untuk menyesuaikan basis pengetahuan LLM untuk interaksi khusus domain.
Kami akan membangun a Server kain di Go. Ini adalah server HTTP yang menyediakan dua operasi untuk pengguna:
- Tambahkan dokumen ke basis pengetahuan
- Ajukan pertanyaan LLM tentang basis pengetahuan ini
Dalam skenario dunia nyata yang khas, pengguna akan menambahkan kumpulan dokumen ke server, dan melanjutkan untuk mengajukan pertanyaan. Misalnya, perusahaan dapat mengisi basis pengetahuan server RAG dengan dokumentasi internal dan menggunakannya untuk menyediakan kemampuan tanya jawab LLM untuk pengguna internal.
Berikut diagram yang menunjukkan interaksi server kami dengan dunia eksternal:
Selain pengguna yang mengirim permintaan HTTP (dua operasi yang dijelaskan di atas), server berinteraksi dengan:
- Model embedding untuk menghitung embeddings vektor untuk dokumen yang dikirimkan dan untuk pertanyaan pengguna.
- Database vektor untuk menyimpan dan mengambil embeddings secara efisien.
- LLM untuk mengajukan pertanyaan berdasarkan konteks yang dikumpulkan dari basis pengetahuan.
Secara konkret, server memaparkan dua titik akhir HTTP kepada pengguna:
/add/: POST {"documents": [{"text": "..."}, {"text": "..."}, ...]}
: mengirimkan urutan dokumen teks ke server, untuk ditambahkan ke basis pengetahuannya. Untuk permintaan ini, server:
- Menghitung embedding vektor untuk setiap dokumen menggunakan model embedding.
- Menyimpan dokumen bersama dengan embeddings vektor mereka di vektor db.
/query/: POST {"content": "..."}
: mengirimkan pertanyaan ke server. Untuk permintaan ini, server:
- Menghitung embedding vektor pertanyaan menggunakan model embedding.
- Menggunakan pencarian kesamaan DB vektor untuk menemukan dokumen yang paling relevan dengan pertanyaan dalam database pengetahuan.
- Menggunakan rekayasa cepat sederhana untuk merumuskan kembali pertanyaan dengan dokumen yang paling relevan yang ditemukan pada langkah (2) sebagai konteks, dan mengirimkannya ke LLM, mengembalikan jawabannya kepada pengguna.
Layanan yang digunakan oleh demo kami adalah:
Seharusnya sangat sederhana untuk menggantikannya dengan layanan lain yang setara. Sebenarnya, inilah varian kedua dan ketiga dari server! Kami akan mulai dengan varian pertama yang menggunakan alat ini secara langsung.
Menggunakan API Gemini dan Weaviate secara langsung
Baik Gemini API dan Weaviate memiliki GO SDK yang nyaman (pustaka klien), dan varian server pertama kami menggunakan ini secara langsung. Kode lengkap varian ini ada di direktori ini.
Kami tidak akan mereproduksi seluruh kode di posting blog ini, tetapi berikut adalah beberapa catatan yang perlu diingat saat membacanya:
Struktur: Struktur kode akan akrab bagi siapa saja yang menulis server HTTP di Go. Perpustakaan Klien untuk Gemini dan untuk Weaviate diinisialisasi dan klien disimpan dalam nilai negara yang diteruskan ke penangan HTTP.
Pendaftaran rute: Rute HTTP untuk server kami sepele untuk diatur menggunakan peningkatan perutean yang diperkenalkan di GO 1.22:
mux := http.NewServeMux()
mux.HandleFunc("POST /add/", server.addDocumentsHandler)
mux.HandleFunc("POST /query/", server.queryHandler)
Konkurensi: Penangan HTTP dari server kami menjangkau layanan lain melalui jaringan dan menunggu tanggapan. Ini bukan masalah untuk pergi, karena setiap penangan HTTP berjalan secara bersamaan di goroutine sendiri. Server RAG ini dapat menangani sejumlah besar permintaan bersamaan, dan kode masing -masing penangan linier dan sinkron.
API BATCH: Sejak An /add/
Permintaan dapat memberikan sejumlah besar dokumen untuk ditambahkan ke basis pengetahuan, memanfaatkan server API BATCH untuk kedua embeddings (embModel.BatchEmbedContents
) dan Weaviate DB (rs.wvClient.Batch
) untuk efisiensi.
Menggunakan Langchain untuk Go
Varian Server Rag Kedua kami menggunakan Langchaingo untuk menyelesaikan tugas yang sama.
Langchain adalah kerangka Python yang populer untuk membangun aplikasi bertenaga LLM. Langchaingo setara dengan Go. Kerangka kerja ini memiliki beberapa alat untuk membangun aplikasi dari komponen modular, dan mendukung banyak penyedia LLM dan database vektor dalam API umum. Ini memungkinkan pengembang untuk menulis kode yang dapat bekerja dengan penyedia dan mengubah penyedia dengan sangat mudah.
Kode lengkap untuk varian ini ada di direktori ini. Anda akan melihat dua hal saat membaca kode:
Pertama, ini agak lebih pendek dari varian sebelumnya. Langchaingo menangani pembungkus API lengkap database vektor dalam antarmuka umum, dan lebih sedikit kode diperlukan untuk menginisialisasi dan menangani weaviate.
Kedua, Langchaingo API membuatnya cukup mudah untuk beralih penyedia. Katakanlah kami ingin mengganti Weaviate dengan vektor lain DB; Dalam varian kami sebelumnya, kami harus menulis ulang semua kode yang menghubungkan vektor DB untuk menggunakan API baru. Dengan kerangka kerja seperti Langchaingo, kita tidak perlu lagi melakukannya. Selama Langchaingo mendukung DB vektor baru yang kami minati, kami harus dapat mengganti beberapa baris kode di server kami, karena semua DBS menerapkan antarmuka umum:
type VectorStore interface {
AddDocuments(ctx context.Context, docs []schema.Document, options ...Option) ([]string, error)
SimilaritySearch(ctx context.Context, query string, numDocuments int, options ...Option) ([]schema.Document, error)
}
Menggunakan Genkit untuk Go
Awal tahun ini, Google memperkenalkan GenKit untuk GO-kerangka kerja open-source baru untuk membangun aplikasi bertenaga LLM. Genkit berbagi beberapa karakteristik dengan Langchain, tetapi berbeda dalam aspek lain.
Seperti Langchain, ini menyediakan antarmuka umum yang dapat diimplementasikan oleh penyedia yang berbeda (sebagai plugin), dan dengan demikian membuat beralih dari satu ke yang lain lebih sederhana. Namun, itu tidak mencoba meresepkan bagaimana komponen LLM yang berbeda berinteraksi; Sebagai gantinya, ia berfokus pada fitur produksi seperti manajemen dan rekayasa yang cepat, dan penyebaran dengan alat pengembang terintegrasi.
Varian server Rag Ketiga kami menggunakan GenKit untuk pergi untuk menyelesaikan tugas yang sama. Kode lengkapnya ada di direktori ini.
Varian ini cukup mirip dengan langchaingo – antarmuka umum untuk LLM, embedders dan DB vektor digunakan sebagai pengganti API penyedia langsung, membuatnya lebih mudah untuk beralih dari satu ke yang lain. Selain itu, menggunakan aplikasi bertenaga LLM untuk produksi jauh lebih mudah dengan Genkit; Kami tidak menerapkan ini dalam varian kami, tetapi jangan ragu untuk membaca dokumentasi jika Anda tertarik.
Ringkasan – Pergi untuk aplikasi bertenaga LLM
Sampel dalam posting ini hanya memberikan rasa apa yang mungkin untuk membangun aplikasi bertenaga LLM di Go. Ini menunjukkan betapa sederhananya membangun server kain yang kuat dengan kode yang relatif kecil; Yang paling penting, sampel mengemas tingkat kesiapan produksi yang signifikan karena beberapa fitur GO mendasar.
Bekerja dengan layanan LLM sering kali berarti mengirim permintaan istirahat atau RPC ke layanan jaringan, menunggu tanggapan, mengirim permintaan baru ke layanan lain berdasarkan itu dan sebagainya. GO EXCELS di semua ini, menyediakan alat yang hebat untuk mengelola konkurensi dan kompleksitas layanan juggling jaringan.
Selain itu, kinerja dan keandalan GO yang hebat sebagai bahasa cloud-asli menjadikannya pilihan alami untuk mengimplementasikan blok bangunan yang lebih mendasar dari ekosistem LLM. Untuk beberapa contoh, lihat proyek seperti Ollama, Localai, Weaviate atau Milvus.
Kredit: Eli Bendersky
Foto oleh Verne Ho di Unsplash
Artikel ini tersedia di