
يرجى قراءة سلسلة مدونة "Rags to Riches" الكاملة:
https://dev.to/aws-heroes/rags-to-riches-bart-1-generative-ai-retrival-4pd7
تطبيق دردشة RAT القائم على Openai يمكن أن يساعدك في التعرف على أنماط استرجاع الذكاء الاصطناعي. التقنيات هنا صديقة للمبتدئين وسهلة النشر في AWS Lambda. مع نمو احتياجاتك ، لا تتردد في إنتاج هذا التطبيق مع مكونات أكثر قوة. ما هي خرقة؟ من IBM Research:
RAG هو إطار منظمة العفو الدولية لاسترداد الحقائق من قاعدة المعرفة الخارجية إلى نماذج لغة كبيرة (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 جنبا إلى جنب مع؟ أفضل SQLITE3 لتخزين المتجهات والبحث.
في جميع أنحاء المنشور ، سنستكشف العديد من التقنيات بمزيد من التفصيل وكيف تساعدنا في بناء تطبيق خرقة مع تعلم أساسيات التكامل المدفوعة من الذكاء الاصطناعي والهندسة السريعة. هذه مساحة ممتعة. أتمنى أن تستمتع به بقدر ما أفعل!
لذلك دعونا نبدأ مع وضع النهاية في الاعتبار. يعمل العرض التوضيحي Lambdarag محليًا لتسهيل التطوير والتعلم. في مرحلة ما على الرغم من أنك قد ترغب في شحنه إلى الإنتاج أو مشاركة عملك مع الآخرين. فلماذا تنتشر في Lambda وما هي الفوائد التي يقدمها خيار النشر هذا؟ بعض الأفكار:
من بين كل هذه ، أعتقد أن تدفق الاستجابة هو الأقوى. ميزة جديدة نسبيا لـ Lambda ، وهذا يمكّن RAT من إعادة إرسال الرسائل النصية إلى عميل الويب تمامًا مثل ChatGPT. كما يسمح Lambda بكسر حمولة استجابة 6 ميجابايت وحد المهلة 30S. هذه الأسطر القليلة في template.yaml المشروع. yaml جنبا إلى جنب مع محول الويب Lambda تجعل الأمر ممكنًا.
FunctionUrlConfig :
AuthType : NONE
InvokeMode : RESPONSE_STREAM قبل الركض ./bin/deploy لأول مرة. تأكد من تسجيل الدخول إلى وحدة التحكم في AWS والانتقال إلى متجر المعلمات SSM أولاً. من هناك ، قم بإنشاء معلمة سلسلة سرية مع PATH /lambda-rag/OPENAI_API_KEY والصق في مفتاح Openai API الخاص بك.
الواجهة الخلفية لدينا لديها وحدة src/utils/openai.js أساسية للغاية. هذا يصدر عميل Openai وكذلك وظيفة المساعد لإنشاء التضمين. نغطي التضمين لفترة وجيزة في قسم المهندس المعماري الأساسي في الجزء الأول من هذه السلسلة. تقوم هذه الوظيفة ببساطة بتحويل استعلام المستخدم إلى تضمين متجه يتم الاستعلام عنه لاحقًا مقابل قاعدة بيانات SQLite الخاصة بنا. هناك طرق عديدة لإنشاء التضمينات والاستعلام. في الوقت الحالي ، سنبقيه بسيطًا ونستخدم نموذج Openai 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 ) ;
} ;فكيف تعمل واجهة برمجة تطبيقات 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 مقابل Python. عندما تتعلم المزيد عن بناء تطبيقات الذكاء الاصطناعي ، قد تضطر في النهاية إلى تعلم Python بالإضافة إلى أطر أكثر تقدماً مثل؟ ️؟ Langchain أو معانقة الوجه؟ Transformers.JS. جميعها لديها إصدارات javaScript. آمل أن يستمر هذا الاتجاه المتمثل في توفير عملاء JavaScript. يبدو وكأنه لغة أكثر سهولة.
في القسم التالي ، سنغطي كيفية إنشاء تضمينات مع بياناتك والاستعلام عن المستندات باستخدام امتداد VSS الجديد من SQLite.
؟ يحتوي تطبيق Lambdarag التجريبي على قاعدة بيانات SQLite جاهزة للاستخدام مع حوالي 5000 منتج من مجموعة بيانات الملابس الفاخرة على Kaggle. كما أن لديها تضمينات متجه مسبقًا وجاهزة للاستخدام!
قبل أن نحفر في SQLite-VSS ، أود أن أشرح لماذا أعتقد أن هذا الامتداد مذهل للغاية. حتى الآن ، وجدت SQLite-VSS أسهل وأسرع طريقة لاستكشاف تضمينات المتجهات. تستخدم العديد من مشاريع Genai Supabase التي تبدو رائعة ولكن من الصعب تشغيلها محليًا. الهدف هنا هو التعلم!
مع نمو التطبيق الخاص بك ، أوصي بشدة بالنظر إلى Amazon OpenSearch Serverless. إنها خدمة تتم إدارتها بالكامل وقابلة للتطوير للغاية وفعالة من حيث التكلفة تدعم البحث عن تشابه المتجه. حتى أنه يدعم المرشح المسبق مع Faiss.
دعونا نلقي نظرة على sqlite-vss أقرب قليلاً. هذه المقالة تمحد SQLite للبحث عن Vector يقوم بعمل رائع تغطي إنشاء الجداول القياسية وكذلك الجداول الافتراضية للتضمينات وكيفية الاستعلام عنها. يتبع عرض 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 الذي يستخدم API Openai لإنشاء تضمينات لكل منتج. هذا يستغرق بضع دقائق لإكمال جميع مكالمات API. تتضمن المهمة ذاكرة التخزين المؤقت المحلية لجعلها أسرع لإعادة تشغيلها. أخيرًا ، هناك برنامج npm run db:clean Script يدعو VACUUM على DB لإزالة المساحة الضائعة للجداول الافتراضية. مرة أخرى ، كل هذا مطلوب فقط إذا كنت ترغب في إعادة إنشاء قاعدة البيانات أو إنشاء مجموعة بيانات مخصصة. هناك برنامج نصي ./bin/setup-db
حسنًا ، لذلك لدينا قاعدة بيانات للمنتجات وتضمينات المتجهات المطابقة لاستخدامها في البحث الدلالي. كيف نرمز من الانتقال من الدردشة إلى استرداد العناصر من قاعدة البيانات؟ Openai لديه هذه الميزة المذهلة المسماة استدعاء الوظيفة. في العرض التوضيحي الخاص بنا ، يسمح لـ 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,يمكنك الآن رؤية جميع الرسائل في واجهة المستخدم. هذه طريقة رائعة لتصحيح طلبك ومعرفة ما يحدث.
آمل أن تكون قد وجدت هذه نظرة عامة سريعة على كيفية زيادة إكمال دردشة Openai لاسترجاع المعرفة. هناك الكثير لاستكشافه والقيام به. فيما يلي بعض الأفكار لتبدأ:
fetchResponse في src-frontend/stores/messages.js Pinia Store بجميع العمل هنا ويدير حالة جانب العميل.src/utils/functions.json . على سبيل المثال ، طريقة find_style by id التي من شأنها الاستعلام مباشرة عن قاعدة البيانات.❤ أتمنى أن تستمتع بهذه المنشورات وأن تجد تطبيق Lambdarag التجريبي مفيدًا في تعلم كيفية استخدام الذكاء الاصطناعي لاسترجاع المعرفة. لا تتردد في طرح الأسئلة ومشاركة أفكارك في هذا المنشور. شكرًا لك!