
Harap baca seri blog "Rags to Riches" lengkap:
https://dev.to/aws-heroes/rags-to-riches-part-1-generative-ai-retrieval-4pd7
Aplikasi obrolan kain berbasis openai ini yang dapat membantu Anda belajar tentang pola pengambilan AI. Teknologi di sini ramah pemula dan mudah digunakan ke AWS Lambda. Saat kebutuhan Anda tumbuh, jangan ragu untuk memproduksi aplikasi ini dengan komponen yang lebih kuat. Apa itu lap? Dari IBM Research:
Rag adalah kerangka kerja AI untuk mengambil fakta dari basis pengetahuan eksternal ke model bahasa besar (LLM) tentang informasi terkini yang paling akurat dan untuk memberikan wawasan kepada pengguna tentang proses generatif LLMS.


Anda harus memiliki kunci API OpenAI untuk menjalankan aplikasi ini. Anda bisa mendapatkannya secara gratis menggunakan ini di mana saya menemukan kunci API rahasia saya? memandu. Setelah Anda memiliki kunci openai, buat file .env.development.local di root proyek ini dengan yang berikut, mengganti sk... dengan kunci Anda:
OPENAI_API_KEY=sk...
Proyek ini mendukung wadah pengembangan yang berarti Anda dapat menggunakan VS Code untuk membuka folder ini dalam wadah dan lingkungan pengembangan Anda akan dibuat untuk Anda. Jalankan perintah berikut di terminal terintegrasi Anda atau di mesin lokal Anda dengan asumsi Anda memiliki simpul yang diinstal.
./bin/setup
./bin/serverPerintah server akan memulai server pengembangan ujung depan dan belakang. Gunakan URL ini untuk mengakses aplikasi Anda. http: // localhost: 5173
Aplikasi demo ini menggunakan arsitektur split-stack. Artinya ada front-end dan back-end yang berbeda. Front-end adalah aplikasi vue.js? Pinia untuk negara bagian dan ⚡️ Vite untuk pengembangan. Front-end juga digunakan? Tailwind CSS bersama? Daisyui untuk gaya. Back-end adalah? Aplikasi Node.js yang menggunakan ❎ Express untuk Kerangka HTTP, dan? SQLite3 VSS bersama? lebih baik-sqlite3 untuk penyimpanan dan pencarian vektor.
Sepanjang posting kami akan mengeksplorasi berbagai teknologi secara lebih rinci dan bagaimana mereka membantu kami membangun aplikasi RAG sambil mempelajari dasar -dasar integrasi yang digerakkan AI dan rekayasa cepat. Ini adalah ruang yang menyenangkan. Saya harap Anda menikmatinya seperti saya!
Jadi mari kita mulai dengan tujuan akhir. Demo Lambdarag kami berjalan secara lokal untuk membuatnya mudah dikembangkan dan dipelajari. Pada titik tertentu meskipun Anda mungkin ingin mengirimkannya ke produksi atau berbagi pekerjaan dengan orang lain. Jadi mengapa digunakan untuk Lambda dan manfaat apa yang ditawarkan opsi penempatan itu? Beberapa pemikiran:
Dari semua ini, saya pikir streaming respons adalah yang paling kuat. Fitur yang relatif baru untuk Lambda, ini memungkinkan kain kami untuk streaming teks kembali ke klien web seperti chatgpt. Ini juga memungkinkan Lambda untuk memecahkan muatan respons 6MB dan batas waktu batas 30 -an. Beberapa baris dalam template.yaml proyek ini. Yl bersama dengan adaptor web Lambda memungkinkan semuanya.
FunctionUrlConfig :
AuthType : NONE
InvokeMode : RESPONSE_STREAM Sebelum Anda menjalankan ./bin/deploy untuk pertama kalinya. Pastikan Anda masuk ke konsol AWS dan menavigasi ke toko parameter SSM terlebih dahulu. Dari sana buat parameter string rahasia dengan path /lambda-rag/OPENAI_API_KEY dan tempel di kunci API openai Anda.
Backend kami memiliki modul src/utils/openai.js yang sangat mendasar. Ini mengekspor klien openai serta fungsi pembantu untuk membuat embeddings. Kami mencakup embeddings secara singkat di bagian arsitek dasar dari bagian pertama dari seri ini. Fungsi ini hanya mengubah kueri pengguna menjadi embedding vektor yang kemudian ditanyakan terhadap database SQLite kami. Ada banyak cara untuk membuat dan meminta embeddings. Untuk saat ini kita akan membuatnya tetap sederhana dan menggunakan model Openai text-embedding-ada-002 yang menghasilkan embeddings 1536 dimensi.
import { OpenAI } from "openai" ;
export const openai = new OpenAI ( {
apiKey : process . env . OPENAI_API_KEY ,
} ) ;
export const createEmbedding = async ( query ) => {
const response = await openai . embeddings . create ( {
model : "text-embedding-ada-002" ,
input : query ,
} ) ;
return JSON . stringify ( response . data [ 0 ] . embedding ) ;
} ;Jadi bagaimana cara kerja API Openai untuk membuat antarmuka obrolan dan bagaimana jendela konteks yang dibahas di bagian satu berperan? Pertimbangkan tangkapan layar berikut di mana saya memberi tahu Lambdarag nama saya dan kemudian tanyakan apakah itu ingat.
ChatGPT bersifat stateless, seperti kebanyakan aplikasi web. Tidak memiliki sesi untuk model LLM. Setiap kali Anda mengirim pesan, Anda harus mengirim semua pesan (konteks) sebelumnya ke titik akhir penyelesaian. Inilah mengapa kami menggunakannya? Pinia untuk manajemen negara sisi klien. Jadi dari perspektif API, itu akan terlihat seperti ini di bawah ini.
await openai . chat . completions . create ( {
model : "gpt-3.5-turbo-16k" ,
messages : [
{ role : "user" , content : "Hello my name is Ken Collins." } ,
{ role : "assistant" , content : "Hello Ken Collins! How can I..." } ,
{ role : "user" , content : "Do you remember my name?" } ,
]
} ) ; Apakah Anda memperhatikan bagaimana asisten merespons tidak hanya dengan nama saya tetapi juga tahu itu di sini untuk membantu kami dengan pakaian mewah? Ini adalah teknik yang disebut dorongan peran. Kami melakukan ini dalam demo Lambdarag dengan mempersiapkan peran ini ke pesan pertama pengguna di file src-frontend/utils/roleprompt.js .
Anda mungkin telah memperhatikan bahwa demo Lambdarag sepenuhnya ditulis? Javascript vs. Python. Ketika Anda mempelajari lebih lanjut tentang membangun aplikasi AI, Anda mungkin pada akhirnya harus belajar python serta kerangka kerja yang lebih canggih seperti? ️? Langchain atau wajah memeluk? Transformers.js. Yang semuanya memiliki versi JavaScript. Saya berharap tren menyediakan klien JavaScript ini akan berlanjut. Rasanya seperti bahasa yang lebih mudah diakses.
Di bagian berikutnya, kami akan membahas cara membuat embeddings dengan data dan permintaan Anda untuk dokumen menggunakan ekstensi VSS baru SQLite.
? ♂️ Aplikasi demo Lambdarag berisi database SQLite yang siap digunakan dengan ~ 5.000 produk dari dataset pakaian mewah di Kaggle. Ini juga memiliki embeddings vektor pra-unggulan dan siap digunakan!
Sebelum kita menggali ke SQLite-VSS, saya ingin menjelaskan mengapa saya pikir ekstensi ini sangat menakjubkan. Sampai saat ini, saya telah menemukan SQLite-VSS cara termudah dan tercepat untuk menjelajahi embeddings vektor. Banyak proyek Genai menggunakan Supabase yang tampaknya hebat tetapi sulit dijalankan secara lokal. Tujuannya di sini adalah untuk belajar!
Ketika aplikasi Anda tumbuh, saya sangat merekomendasikan melihat Amazon OpenSearch Serverless. Ini adalah layanan yang sepenuhnya dikelola, sangat terukur, dan hemat biaya yang mendukung pencarian kesamaan vektor. Bahkan mendukung pra-filter dengan FAISS.
Mari kita lihat SQLite-VSS sedikit lebih dekat. Artikel ini ekstensi sqlite untuk pencarian vektor melakukan pekerjaan luar biasa yang mencakup penciptaan tabel standar serta tabel virtual untuk embeddings dan cara menanyakan keduanya. Demo Lambdarag mengikuti semua pola ini secara erat dalam file db/create.js kami. Skema kami yang dihasilkan adalah:
CREATE TABLE products (
id INTEGER PRIMARY KEY ,
name TEXT ,
category TEXT ,
subCategory TEXT ,
description TEXT ,
embedding BLOB
);
CREATE TABLE IF NOT EXISTS " vss_products_index " (rowid integer primary key autoincrement, idx);
CREATE TABLE sqlite_sequence (name,seq);
CREATE TABLE IF NOT EXISTS " vss_products_data " (rowid integer primary key autoincrement, _);
CREATE VIRTUAL TABLE vss_products using vss0 (
embedding( 1536 )
); Jika Anda ingin membuat kembali database SQLite atau membangun dataset khusus, Anda dapat melakukannya dengan mengubah db/create.js dan menjalankan npm run db:create . Ini akan menjatuhkan database yang ada dan membuatnya kembali dengan data dari file CSV apa pun, skema pendukung, atau proses yang ingin Anda kode.
> npm run db:create
> [email protected] db:create
> rm -rf db/lambdarag.db && node db/create.js
Using sqlite-vss version: v0.1.1
Inserting product data...
██████████████████████████████████░░░░░░ 84% | ETA: 2s | 4242/5001 Setelah itu Anda perlu menjalankan skrip npm run db:embeddings yang menggunakan API OpenAI untuk membuat embeddings untuk setiap produk. Ini membutuhkan beberapa menit untuk menyelesaikan semua panggilan API. Tugas ini mencakup cache lokal untuk membuatnya lebih cepat untuk menjalankan kembali. Terakhir, ada npm run db:clean Script yang memanggil VACUUM pada DB untuk menghapus ruang yang terbuang untuk tabel virtual. Sekali lagi, semua ini hanya diperlukan jika Anda ingin membuat kembali database atau membangun dataset khusus. Ada skrip pembungkus ./bin/setup-db yang melakukan semua langkah ini untuk Anda.
Oke, jadi kami memiliki basis data produk dan embeddings vektor yang cocok untuk digunakan untuk pencarian semantik. Bagaimana cara membuat kode dari obrolan ke mengambil item dari database? Openai memiliki fitur luar biasa bernama Calling Function. Dalam demo kami, ini memungkinkan LLM untuk mencari produk dan menggambarkan hasilnya kepada Anda.
Tapi bagaimana cara tahu? Anda cukup menggambarkan serangkaian fungsi yang diterapkan oleh aplikasi Anda dan selama panggilan API penyelesaian obrolan. OpenAi akan 1) secara otomatis membuat penentuan fungsi harus dipanggil 2) Mengembalikan nama fungsi untuk menelepon bersama dengan parameter yang diperlukan. Permintaan Anda terlihat seperti ini.
await openai . chat . completions . create ( {
model : "gpt-3.5-turbo-16k" ,
functions : '[{"search_products":{"parameters": {"query": "string"}}}]' ,
messages : [
{ role : "user" , content : "I need a cool trucker hat." }
]
} ) ; Jika suatu fungsi telah dipilih, respons akan mencakup nama fungsi dan parameter. Tanggung jawab Anda adalah memeriksa ini, kemudian hubungi kode aplikasi Anda yang cocok dengan fungsi dan parameter. Untuk Lambdagpt, ini akan menanyakan database dan mengembalikan baris yang cocok. Kami melakukan ini di file src/models/products.js kami.
Untuk OpenAi untuk merespons dengan hasilnya, kami mengirimkan permintaan lain yang sekarang memiliki dua pesan tambahan. Yang pertama adalah tipe "fungsi" dan termasuk nama dan parameter fungsi yang diminta untuk Anda hubungi. Yang kedua adalah tipe "pengguna" yang mencakup data JSON dari produk yang dikembalikan dari proses pengambilan kami. Openai sekarang akan merespons seolah -olah memiliki pengetahuan ini selama ini!
await openai . chat . completions . create ( {
model : "gpt-3.5-turbo-16k" ,
functions : '[{"search_products":{"parameters": {"query": "string"}}}]' ,
messages : [
{ role : "user" , content : "I need a cool trucker hat." } ,
{ role : "function" , name : "search_products" , content : '{"query":"trucker hats"}' } ,
{ role : "user" , content : '[{"id":3582,"name":"Mens Patagonia Logo Trucker Hat..."}]' } ,
]
} ) ; Karena semua pesan dikelola dalam keadaan sisi klien, Anda dapat melihatnya menggunakan teknik debug yang rapi. Buka file src-frontend/components/Message.vue dan buat perubahan berikut.
'border-b-base-300': true,
'bg-base-200': data.role === 'user',
- 'hidden': data.hidden,
+ 'hidden': false,Anda sekarang dapat melihat semua status pesan di UI. Ini adalah cara yang bagus untuk men -debug aplikasi Anda dan melihat apa yang terjadi.
Saya harap Anda menemukan ikhtisar cepat tentang bagaimana penyelesaian obrolan Openai dapat ditambah untuk pengambilan pengetahuan. Ada banyak lagi yang harus dijelajahi dan dilakukan. Berikut beberapa ide untuk Anda mulai:
fetchResponse di src-frontend/stores/messages.js Pinia Store melakukan semua pekerjaan di sini dan mengelola keadaan sisi klien.src/utils/functions.json . Misalnya, metode find_style dengan ID yang akan secara langsung menanyakan database.❤️ Saya harap Anda menikmati posting ini dan menemukan aplikasi demo Lambdarag yang berguna dalam mempelajari cara menggunakan AI untuk pengambilan pengetahuan. Jangan ragu untuk mengajukan pertanyaan dan berbagi pemikiran Anda tentang posting ini. Terima kasih!