
โปรดอ่านชุดบล็อก "Rags to Riches" เต็มรูปแบบ:
https://dev.to/aws-heroes/rags-to-riches-part-1-generative-ai-retrieval-4pd7
แอปพลิเคชั่นแชท RAG ที่ใช้ OpenAI นี้ซึ่งสามารถช่วยให้คุณเรียนรู้เกี่ยวกับรูปแบบการดึง AI เทคโนโลยีที่นี่เป็นมิตรกับผู้เริ่มต้นและง่ายต่อการปรับใช้กับ AWS Lambda เมื่อความต้องการของคุณเติบโตขึ้นอย่าลังเลที่จะผลิตแอปพลิเคชันนี้ด้วยส่วนประกอบที่แข็งแกร่งยิ่งขึ้น ผ้าขี้ริ้วคืออะไร? จาก IBM Research:
RAG เป็นกรอบ AI สำหรับการดึงข้อเท็จจริงจากฐานความรู้ภายนอกไปยังแบบจำลองภาษาขนาดใหญ่ (LLMS) ในข้อมูลที่ถูกต้องและทันสมัยที่สุดและเพื่อให้ผู้ใช้ข้อมูลเชิงลึกเกี่ยวกับกระบวนการกำเนิดของ LLMS


คุณต้องมีคีย์ OpenAI API เพื่อเรียกใช้แอปพลิเคชันนี้ คุณสามารถรับได้ฟรีโดยใช้สิ่งนี้ฉันจะหาคีย์ API ลับของฉันได้ที่ไหน แนะนำ. เมื่อคุณมีคีย์ OpenAI แล้วให้สร้างไฟล์ .env.development.local ที่รูทของโครงการนี้ด้วยสิ่งต่อไปนี้แทนที่ sk... ด้วยคีย์ของคุณ:
OPENAI_API_KEY=sk...
โครงการนี้รองรับคอนเทนเนอร์การพัฒนาซึ่งหมายความว่าคุณสามารถใช้รหัส VS เพื่อเปิดโฟลเดอร์นี้ในคอนเทนเนอร์และสภาพแวดล้อมการพัฒนาของคุณจะถูกสร้างขึ้นสำหรับคุณ เรียกใช้คำสั่งต่อไปนี้ในเทอร์มินัลรวมของคุณหรือบนเครื่องในเครื่องของคุณโดยสมมติว่าคุณติดตั้งโหนดแล้ว
./bin/setup
./bin/serverคำสั่งเซิร์ฟเวอร์จะเริ่มต้นเซิร์ฟเวอร์การพัฒนาทั้งด้านหน้าและด้านหลัง ใช้ URL นี้เพื่อเข้าถึงแอปพลิเคชันของคุณ http: // localhost: 5173
แอปพลิเคชันตัวอย่างนี้ใช้สถาปัตยกรรมแบบแยกสแต็ค ความหมายมีส่วนหน้าและส่วนหลังที่แตกต่างกัน ส่วนหน้าเป็นแอปพลิเคชัน vue.js ด้วย? Pinia สำหรับรัฐและ⚡ Vite สำหรับการพัฒนา ส่วนหน้ายังใช้? Tailwind CSS พร้อมกับ? Daisyui สำหรับการออกแบบ ส่วนหลังคือ? แอปพลิเคชัน Node.js ที่ใช้❎ Express สำหรับเฟรมเวิร์ก HTTP และ? sqlite3 vss พร้อมกับ? Better-Sqlite3 สำหรับการจัดเก็บและการค้นหาเวกเตอร์
ตลอดการโพสต์เราจะสำรวจเทคโนโลยีที่หลากหลายโดยละเอียดมากขึ้นและวิธีที่พวกเขาช่วยเราสร้างแอปพลิเคชัน RAG ในขณะที่เรียนรู้พื้นฐานของการรวมระบบที่ขับเคลื่อนด้วย AI และวิศวกรรมที่รวดเร็ว นี่เป็นพื้นที่สนุก ๆ ฉันหวังว่าคุณจะสนุกกับมันมากเท่าที่ฉันทำ!
ดังนั้นเริ่มต้นด้วยจุดจบในใจ การสาธิต Lambdarag ของเราทำงานในพื้นที่เพื่อให้ง่ายต่อการพัฒนาและเรียนรู้ ในบางจุดแม้ว่าคุณอาจต้องการจัดส่งไปยังการผลิตหรือแบ่งปันงานของคุณกับผู้อื่น เหตุใดจึงนำไปใช้กับแลมบ์ดาและตัวเลือกการปรับใช้ประโยชน์ใด ๆ ความคิดเล็กน้อย:
จากทั้งหมดนี้ฉันคิดว่าการสตรีมการตอบสนองนั้นทรงพลังที่สุด ฟีเจอร์ที่ค่อนข้างใหม่สำหรับแลมบ์ดาสิ่งนี้ช่วยให้ RAG ของเราสตรีมข้อความกลับไปยังเว็บไคลเอ็นต์เช่นเดียวกับ ChatGPT นอกจากนี้ยังช่วยให้แลมบ์ดาทำลายน้ำหนักการตอบกลับ 6MB และขีด จำกัด การหมดเวลา 30 วินาที ไม่กี่บรรทัดเหล่านี้ใน template.yaml ของโครงการ YAML พร้อมกับอะแดปเตอร์เว็บแลมบ์ดาทำให้เป็นไปได้ทั้งหมด
FunctionUrlConfig :
AuthType : NONE
InvokeMode : RESPONSE_STREAM ก่อนที่คุณจะเรียกใช้ ./bin/deploy deploy เป็นครั้งแรก ตรวจสอบให้แน่ใจว่าคุณลงชื่อเข้าใช้คอนโซล AWS และนำทางไปยังการจัดเก็บพารามิเตอร์ SSM ก่อน จากนั้นสร้างพารามิเตอร์สตริงลับด้วย Path /lambda-rag/OPENAI_API_KEY และวางในคีย์ OpenAI API ของคุณ
แบ็กเอนด์ของเรามีโมดูล src/utils/openai.js ขั้นพื้นฐานมาก สิ่งนี้ส่งออกไคลเอนต์ OpenAI รวมถึงฟังก์ชั่นผู้ช่วยเพื่อสร้างการฝังตัว เราครอบคลุมการฝังตัวสั้น ๆ ในส่วนสถาปนิกพื้นฐานของส่วนแรกของซีรี่ส์นี้ ฟังก์ชั่นนี้จะเปลี่ยนการสืบค้นของผู้ใช้ให้กลายเป็นเวกเตอร์ฝังซึ่งต่อมาสอบถามกับฐานข้อมูล SQLite ของเรา มีหลายวิธีในการสร้างและการสืบค้น Embeddings สำหรับตอนนี้เราจะทำให้มันง่ายและใช้โมเดล text-embedding-ada-002 ซึ่งเอาต์พุต 1536 มิติฝังตัว
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 ) ;
} ;ดังนั้น API ของ OpenAI จะทำงานอย่างไรเพื่อสร้างอินเทอร์เฟซแชทและหน้าต่างบริบทที่กล่าวถึงในส่วนที่หนึ่งเข้ามาเล่นได้อย่างไร พิจารณาภาพหน้าจอต่อไปนี้ที่ฉันบอก Lambdarag ชื่อของฉันแล้วถามว่ามันจำได้หรือไม่
Chatgpt ไร้สัญชาติเหมือนเว็บแอปพลิเคชันส่วนใหญ่ มันไม่มีเซสชันสำหรับรุ่น LLM ทุกครั้งที่คุณส่งข้อความคุณต้องส่งข้อความก่อนหน้าทั้งหมด (บริบท) ไปยังจุดสิ้นสุด นี่คือเหตุผลที่เราใช้? Pinia สำหรับการจัดการรัฐฝั่งลูกค้า ดังนั้นจากมุมมองของ API มันจะมีลักษณะเช่นนี้ด้านล่าง
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?" } ,
]
} ) ; คุณสังเกตเห็นว่าผู้ช่วยตอบสนองไม่เพียง แต่ชื่อของฉันเท่านั้น แต่ยังรู้ว่านี่เป็นที่นี่เพื่อช่วยเราด้วยเครื่องแต่งกายหรูหรา? นี่คือเทคนิคที่เรียกว่าการกระตุ้นบทบาท เราทำสิ่งนี้ในการสาธิต Lambdarag โดยการเตรียมบทบาทนี้ให้กับข้อความแรกของผู้ใช้ในไฟล์ src-frontend/utils/roleprompt.js
คุณอาจสังเกตเห็นว่าการสาธิต Lambdarag นั้นเขียนขึ้นทั้งหมดหรือไม่? JavaScript vs. Python เมื่อคุณเรียนรู้เพิ่มเติมเกี่ยวกับการสร้างแอปพลิเคชัน AI ในที่สุดคุณอาจต้องเรียนรู้ Python รวมถึงกรอบการทำงานขั้นสูงเช่น️? Langchain หรือ Hugging Face's? Transformers.js ทั้งหมดนี้มีเวอร์ชัน JavaScript ฉันหวังว่าแนวโน้มของการจัดหาลูกค้า JavaScript จะดำเนินต่อไป รู้สึกเหมือนเป็นภาษาที่เข้าถึงได้มากขึ้น
ในส่วนถัดไปเราจะครอบคลุมวิธีการสร้าง EMBEDDING ด้วยข้อมูลและการสืบค้นของคุณสำหรับเอกสารโดยใช้ส่วนขยาย VSS ใหม่ของ SQLITE
? ♂ แอปพลิเคชันตัวอย่าง Lambdarag มีฐานข้อมูล SQLite พร้อมใช้งานพร้อมผลิตภัณฑ์ ~ 5,000 ผลิตภัณฑ์จากชุดข้อมูลเครื่องแต่งกายหรูหราบน Kaggle นอกจากนี้ยังมีเวกเตอร์ฝังตัวล่วงหน้าและพร้อมใช้งาน!
ก่อนที่เราจะขุดลงไปใน SQLite-VSS ฉันต้องการอธิบายว่าทำไมฉันถึงคิดว่าส่วนขยายนี้น่าทึ่งมาก จนถึงปัจจุบันฉันได้พบ SQLite-VSS เป็นวิธีที่ง่ายที่สุดและเร็วที่สุดในการสำรวจการฝังตัวของเวกเตอร์ โครงการ Genai หลายโครงการใช้ supabase ซึ่งดูดี แต่ยากที่จะทำงานในท้องถิ่น เป้าหมายที่นี่คือการเรียนรู้!
เมื่อแอปพลิเคชันของคุณเติบโตขึ้นฉันขอแนะนำให้ดูที่ Amazon OpenSearch Serverless มันเป็นบริการที่มีการจัดการอย่างเต็มที่ปรับขนาดได้สูงและประหยัดต้นทุนซึ่งรองรับการค้นหาความคล้ายคลึงกันของเวกเตอร์ มันยังรองรับการกรองล่วงหน้าด้วย FAISS
มาดู SQLite-VSS กันเถอะ บทความนี้ส่วนขยาย SQLite สำหรับการค้นหาเวกเตอร์ทำงานได้อย่างน่าทึ่งซึ่งครอบคลุมการสร้างตารางมาตรฐานรวมถึงตารางเสมือนจริงสำหรับการฝังตัวและวิธีการสอบถามทั้งคู่ การสาธิต Lambdarag เป็นไปตามรูปแบบทั้งหมดเหล่านี้อย่างใกล้ชิดในไฟล์ db/create.js ของเรา สคีมาผลลัพธ์ของเราคือ:
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 )
); หากคุณต้องการสร้างฐานข้อมูล SQLite หรือสร้างชุดข้อมูลที่กำหนดเองอีกครั้งคุณสามารถทำได้โดยการเปลี่ยน db/create.js และเรียกใช้ npm run db:create สิ่งนี้จะวางฐานข้อมูลที่มีอยู่และสร้างใหม่ด้วยข้อมูลจากไฟล์ CSV ใด ๆ ที่สนับสนุนสคีมาหรือกระบวนการที่คุณยินดีที่จะเขียนโค้ด
> 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 หลังจากนั้นคุณจะต้องเรียกใช้สคริปต์ npm run db:embeddings ซึ่งใช้ OpenAI API เพื่อสร้าง embeddings สำหรับแต่ละผลิตภัณฑ์ ใช้เวลาไม่กี่นาทีในการโทร API ทั้งหมดให้เสร็จสมบูรณ์ งานรวมถึงแคชท้องถิ่นเพื่อให้เร็วขึ้นในการรันอีกครั้ง สุดท้ายมี npm run db:clean Script ที่เรียกว่า VACUUM บน DB เพื่อลบพื้นที่ที่สูญเปล่าสำหรับตารางเสมือนจริง อีกครั้งสิ่งเหล่านี้จำเป็นก็ต่อเมื่อคุณต้องการสร้างฐานข้อมูลอีกครั้งหรือสร้างชุดข้อมูลที่กำหนดเอง มีสคริปต์ wrapper ./bin/setup-db ที่ทำตามขั้นตอนเหล่านี้ทั้งหมดสำหรับคุณ
ตกลงดังนั้นเราจึงมีฐานข้อมูลผลิตภัณฑ์และการจับคู่เวกเตอร์ที่จับคู่เพื่อใช้สำหรับการค้นหาความหมาย เราจะใช้รหัสจากการแชทไปจนถึงการดึงรายการจากฐานข้อมูลได้อย่างไร Openai มีคุณสมบัติที่น่าทึ่งนี้ชื่อว่า Calling Function ในการสาธิตของเราจะช่วยให้ LLM ค้นหาผลิตภัณฑ์และอธิบายผลลัพธ์ให้คุณได้
แต่มันรู้ได้อย่างไร? คุณเพียงแค่อธิบายอาร์เรย์ของฟังก์ชั่นที่แอปพลิเคชันของคุณรวมและในระหว่างการเรียก API การแชทเสร็จสิ้น OpenAI จะ 1) การกำหนดฟังก์ชันควรเรียกว่า 2) ส่งคืนชื่อของฟังก์ชั่นเพื่อโทรพร้อมกับพารามิเตอร์ที่จำเป็น คำขอของคุณมีลักษณะเช่นนี้
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." }
]
} ) ; หากมีการเลือกฟังก์ชั่นการตอบกลับจะรวมชื่อของฟังก์ชันและพารามิเตอร์ ความรับผิดชอบของคุณคือการตรวจสอบสิ่งนี้จากนั้นโทรหารหัสของแอปพลิเคชันที่ตรงกับฟังก์ชั่นและพารามิเตอร์ สำหรับ LambDagpt สิ่งนี้จะทำการสืบค้นฐานข้อมูลและส่งคืนแถวที่ตรงกัน เราทำสิ่งนี้ในไฟล์ src/models/products.js ของเรา
เพื่อให้ OpenAI ตอบกลับด้วยผลลัพธ์เราส่งคำขออื่นที่ตอนนี้มีสองข้อความเพิ่มเติม สิ่งแรกคือประเภท "ฟังก์ชั่น" และรวมถึงชื่อและพารามิเตอร์ของฟังก์ชันที่คุณถูกขอให้โทร ประการที่สองคือประเภท "ผู้ใช้" ซึ่งรวมถึงข้อมูล JSON ของผลิตภัณฑ์ที่ส่งคืนจากกระบวนการดึงข้อมูลของเรา Openai จะตอบสนองราวกับว่ามันมีความรู้นี้มาตลอด!
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..."}]' } ,
]
} ) ; เนื่องจากข้อความทั้งหมดได้รับการบำรุงรักษาในสถานะฝั่งไคลเอ็นต์คุณสามารถเห็นพวกเขาโดยใช้เทคนิคการดีบักที่ประณีต เปิดไฟล์ src-frontend/components/Message.vue และทำการเปลี่ยนแปลงต่อไปนี้
'border-b-base-300': true,
'bg-base-200': data.role === 'user',
- 'hidden': data.hidden,
+ 'hidden': false,ตอนนี้คุณสามารถเห็นสถานะข้อความทั้งหมดใน UI นี่เป็นวิธีที่ยอดเยี่ยมในการดีบักแอปพลิเคชันของคุณและดูว่าเกิดอะไรขึ้น
ฉันหวังว่าคุณจะพบภาพรวมอย่างรวดเร็วของความสมบูรณ์ของการแชทของ Openai ที่สามารถเพิ่มขึ้นสำหรับการดึงความรู้ได้อย่างไร มีอะไรอีกมากมายให้สำรวจและทำ นี่คือแนวคิดบางอย่างที่จะทำให้คุณเริ่มต้น:
fetchResponse ในร้านค้า src-frontend/stores/messages.js Pinia ทำงานทั้งหมดที่นี่และจัดการสถานะฝั่งไคลเอ็นต์src/utils/functions.json ตัวอย่างเช่นเมธอด find_style โดย ID ที่จะสอบถามฐานข้อมูลโดยตรง❤ฉันหวังว่าคุณจะสนุกกับโพสต์เหล่านี้และค้นหาแอปพลิเคชันตัวอย่าง Lambdarag ที่มีประโยชน์ในการเรียนรู้วิธีการใช้ AI สำหรับการดึงความรู้ อย่าลังเลที่จะถามคำถามและแบ่งปันความคิดของคุณในโพสต์นี้ ขอบคุณ!