إشعار
يتطلب الوصول إلى هذه الصفحة تخويلاً. يمكنك محاولة تسجيل الدخول أو تغيير الدلائل.
يتطلب الوصول إلى هذه الصفحة تخويلاً. يمكنك محاولة تغيير الدلائل.
في هذا الدرس، تقوم ببناء مولد إعلانات مدعوم ب الذكاء الاصطناعي باستخدام Azure DocumentDB وOpenAI لإنشاء محتوى إعلاني ديناميكي ومخصص. يستخدم التطبيق البحث التشابه المتجه لمطابقة عناصر المخزون مع مواضيع الإعلان، ثم يستخدم GPT-4 وDALL-E 3 لتوليد نصوص إعلانات وصور جذابة من خلال مساعد الذكاء الاصطناعي يدعى هيلي.
يعمل التطبيق عن طريق توليد تضمينات متجهية لوصف المخزون باستخدام تضمينات OpenAI، والتي تلتقط المعنى الدلالي لوصف المنتجات. يتم تخزين هذه المتجهات وفهرستها في Azure DocumentDB، مما يتيح عمليات بحث قوية في التشابه المتجه. عندما تحتاج إلى إنشاء إعلان، يقوم التطبيق بتحويل موضوع الإعلان للعثور على أفضل عناصر المخزون المتطابقة من خلال البحث المتجه. ثم يستخدم عملية توليد السحب المعزز (RAG) لإرسال أفضل التطابقات إلى OpenAI، التي تصنع محتوى إعلاني جذاب يشمل شعارات جذابة وصور واقعية.
في هذا البرنامج التعليمي، سوف تتعلّم:
- قم بإعداد بيئة بايثون الخاصة بك مع الحزم المطلوبة
- Configure Azure OpenAI وAzure DocumentDB clients
- إنشاء تضمينات متجهة من أوصاف المنتجات
- قم بإعداد قاعدة بيانات Azure DocumentDB مع فهرسة المتجهات
- تنفيذ البحث التشابه المتجه للعثور على المنتجات ذات الصلة
- إنشاء محتوى إعلاني باستخدام GPT-4 و DALL-E 3
- بناء واجهة ويب تفاعلية مع Gradio
في حال لم يكن لديك اشتراك Azure، فأنشئ حساباً مجانيّاً قبل البدء.
Prerequisites
اشتراك Azure
- إذا لم يكن لديك اشتراك Azure، فقم بإنشاء حساب مجاني
مجموعة Azure DocumentDB موجودة
- إذا لم يكن لديك عنقود، أنشئ عنقود جديد
جدار الحماية تم تعيينه للسماح بالوصول إلى عنوان IP الخاص بالعميل الخاص بك
-
text-embedding-ada-002نموذج التضمين المنشورgpt-4نموذج الإكمال الذي تم تطبيقه
Python 3.12 أو أحدث
احصل على بيانات عينة
في هذا الدرس، تعمل مع مجموعة بيانات من منتجات الأحذية التي تتضمن أوصاف المنتجات وتضمينات متجهات محسوبة مسبقا. تحتوي بيانات العينة على معلومات المخزون التي يستخدمها التطبيق لإثبات تشابه المتجهات والبحث وتوليد الإعلانات.
حمل ملف البيانات النموذجي من مستودع GitHub:
curl -o data/shoes_with_vectors.json https://raw.githubusercontent.com/jayanta-mondal/ignite-demo/main/data/shoes_with_vectors.jsonأنشئ مجلدا
dataفي مجلد مشروعك واحفظ الملفshoes_with_vectors.jsonبداخله. يحتوي الملف على معلومات المنتجات بما في ذلك الأسماء، والوصف، والأسعار، والتضمينات المتجهية التي تتيح وظيفة البحث الدلالي.
قم بإعداد بيئة بايثون الخاصة بك
قم بإعداد بيئة بايثون الخاصة بك مع الحزم اللازمة وقم بتكوين عملاء Azure لمصادقة الطلبات إلى واجهة برمجة تطبيقات OpenAI وخدمات Azure.
افتح جهازك الطرفي وثبت حزم بايثون المطلوبة:
pip install numpy pip install openai==1.2.3 pip install pymongo pip install python-dotenv pip install azure-core pip install azure-cosmos pip install tenacity pip install gradioتحقق من تثبيت حزمة OpenAI:
pip show openaiأنشئ ملف بايثون جديد لمشروعك (على سبيل المثال،
ad_generator.py).أضف الكود التالي لاستيراد المكتبات المطلوبة وتكوين عميل Azure OpenAI:
import json import time import openai from dotenv import dotenv_values from openai import AzureOpenAI # Configure the API to use Azure as the provider openai.api_type = "azure" openai.api_key = "<AZURE_OPENAI_API_KEY>" # Replace with your actual Azure OpenAI API key openai.api_base = "https://<OPENAI_ACCOUNT_NAME>.openai.azure.com/" # Replace with your OpenAI account name openai.api_version = "2023-06-01-preview" # Initialize the AzureOpenAI client with your API key, version, and endpoint client = AzureOpenAI( api_key=openai.api_key, api_version=openai.api_version, azure_endpoint=openai.api_base )استبدل القيم المؤقتة ببيانات اعتماد Azure OpenAI الفعلية الخاصة بك:
-
<AZURE_OPENAI_API_KEY>: مفتاح واجهة برمجة التطبيقات Azure OpenAI من المتطلبات المسبقة -
<OPENAI_ACCOUNT_NAME>: اسم حسابك في Azure OpenAI
-
إنشاء تضمينات متجهة
إنشاء تضمينات متجهة من أوصاف المنتجات لالتقاط معناها الدلالي بشكل يمكن للآلات فهمه ومعالجته. يوضح الرسم البياني التالي بنية الحل:
أنشئ تضمينات متجهية باستخدام Azure OpenAI بإضافة الدالة التالية إلى ملف بايثون الخاص بك:
import openai def generate_embeddings(text): try: response = client.embeddings.create( input=text, model="text-embedding-ada-002") embeddings = response.data[0].embedding return embeddings except Exception as e: print(f"An error occurred: {e}") return Noneتأخذ هذه الدالة مدخلا نصيا وتستخدم الطريقة
client.embeddings.createلإنشاء تضمين متجه. يحول النموذجtext-embedding-ada-002النص إلى متجه عالي الأبعاد يلتقط المعنى الدلالي.اختبر وظيفة التضمين الخاصة بك مع وصف منتج نموذجي:
embeddings = generate_embeddings("Shoes for San Francisco summer") if embeddings is not None: print(embeddings)إذا نجحت، تقوم الدالة بطباعة التضمينات المولدة؛ وإلا، فإنه يتعامل مع الاستثناءات عن طريق طباعة رسالة خطأ.
Connect to Azure DocumentDB
أنشئ اتصالا مع Azure DocumentDB لتخزين وفهرسة التضمينات في قاعدة بيانات تدعم البحث في التشابه المتجه.
أضف الكود التالي لإنشاء اتصال مع مجموعة Azure DocumentDB الخاصة بك:
import pymongo # Replace <username>, <password>, and <cluster-name> with your actual credentials mongo_conn = "mongodb+srv://<username>:<password>@<cluster-name>.mongocluster.cosmos.azure.com/?tls=true&authMechanism=SCRAM-SHA-256&retrywrites=false&maxIdleTimeMS=120000" mongo_client = pymongo.MongoClient(mongo_conn)استبدل القيم المؤقتة ببيانات اعتماد MongoDB الفعلية من المتطلبات المسبقة:
-
<username>: اسم المستخدم الخاص بك في MongoDB -
<password>: كلمة مرور MongoDB الخاصة بك -
<cluster-name>: اسم عنقود vCore الخاص بك
-
إنشاء قاعدة بيانات ومجموعة
تخزين بيانات الإعلان ومخزون المنتجات عن طريق إنشاء قاعدة بيانات ومجموعة داخل نسخة Azure DocumentDB الخاصة بك.
أضف الكود التالي لإنشاء قاعدة بيانات ومجموعة:
DATABASE_NAME = "AdgenDatabase" COLLECTION_NAME = "AdgenCollection" mongo_client.drop_database(DATABASE_NAME) db = mongo_client[DATABASE_NAME] collection = db[COLLECTION_NAME] if COLLECTION_NAME not in db.list_collection_names(): # Creates a unsharded collection that uses the database's shared throughput db.create_collection(COLLECTION_NAME) print("Created collection '{}'.\n".format(COLLECTION_NAME)) else: print("Using collection: '{}'.\n".format(COLLECTION_NAME))هذا الكود يحدد أسماء قواعد البيانات والمجموعات، ويحذف أي قاعدة بيانات موجودة تحمل نفس الاسم لإعداد نظيف، وينشئ قاعدة بيانات ومجموعة جديدة، ويطبع رسائل تأكيد.
إنشاء فهرس متجه
أنشئ فهرس متجهات لتمكين عمليات البحث الفعالة في التشابه بين المتجهات داخل مجموعتك. يدعم Azure DocumentDB أنواعا مختلفة من فهارس المتجهات: فهرس الملفات المقلوب (IVF) والعالم الصغير القابل للتنقل الهرمي (HNSW).
اختر خوارزمية الفهرسة بناء على مستوى العنقود:
- IVF: خوارزمية افتراضية تعمل على جميع مستويات العنقود، وتستخدم نهج أقرب الجيران التقريبي (ANN)
- HNSW: هيكل قائم على الرسوم البيانية، أسرع ودقة أعلى، متوفر فقط على طبقات العنقود M40 وأعلى
لإنشاء مؤشر IVF، قم بتشغيل الأمر التالي:
db.runCommand({ 'createIndexes': 'AdgenCollection', 'indexes': [ { 'name': 'vectorSearchIndex', 'key': { "contentVector": "cosmosSearch" }, 'cosmosSearchOptions': { 'kind': 'vector-ivf', 'numLists': 1, 'similarity': 'COS', 'dimensions': 1536 } } ] });(اختياري) إذا كنت تستخدم طبقة عنقود M40 أو أعلى، يمكنك إنشاء مؤشر HNSW بدلا من ذلك:
db.runCommand({ "createIndexes": "AdgenCollection", "indexes": [ { "name": "VectorSearchIndex", "key": { "contentVector": "cosmosSearch" }, "cosmosSearchOptions": { "kind": "vector-hnsw", "m": 16, "efConstruction": 64, "similarity": "COS", "dimensions": 1536 } } ] })
Important
يمكنك إنشاء فهرس واحد فقط لكل خاصية متجه. إذا كنت ترغب في تغيير نوع الفهرس (على سبيل المثال ، من IVF إلى HNSW) ، فيجب عليك إسقاط الفهرس أولا قبل إنشاء فهرس جديد.
بيانات مخزون التحميل
أدرج بيانات الجرد، التي تشمل وصف المنتجات وتضمينات المتجهات المقابلة لها، في مجموعتك.
أضف الكود التالي لتحميل البيانات وأدخلها في مجموعتك:
data_file = open(file="./data/shoes_with_vectors.json", mode="r") data = json.load(data_file) data_file.close() result = collection.insert_many(data) print(f"Number of data points added: {len(result.inserted_ids)}")يفتح هذا الكود ملف JSON، ويقوم بتحميل البيانات، ويدرج جميع المستندات في المجموعة باستخدام
insert_many()، ويطبع عدد المستندات المضافة.
تنفيذ البحث المتجه
استخدم البحث المتجه للعثور على أكثر العناصر صلة بناء على الاستعلام. الفهرس المتجه الذي أنشأته يتيح عمليات البحث الدلالية داخل مجموعة البيانات.
أضف الدالة التالية لإجراء عمليات البحث عن التشابه المتجه:
def vector_search(query, num_results=3): query_vector = generate_embeddings(query) embeddings_list = [] pipeline = [ { '$search': { "cosmosSearch": { "vector": query_vector, "numLists": 1, "path": "contentVector", "k": num_results }, "returnStoredSource": True }}, {'$project': { 'similarityScore': { '$meta': 'searchScore' }, 'document' : '$$ROOT' } } ] results = collection.aggregate(pipeline) return resultsتولد هذه الدالة تضمين متجه لاستعلام البحث، وتنشئ خط أنابيب تجميع يستخدم وظائف Azure DocumentDB
$search، وتجد أقرب العناصر المتطابقة بناء على تشابه المتجه، وتعيد النتائج بدرجات التشابه.اختبر وظيفة البحث المتجهة باستخدام نموذج استعلام:
query = "Shoes for Seattle sweater weather" results = vector_search(query, 3) print("\nResults:\n") for result in results: print(f"Similarity Score: {result['similarityScore']}") print(f"Title: {result['document']['name']}") print(f"Price: {result['document']['price']}") print(f"Material: {result['document']['material']}") print(f"Image: {result['document']['img_url']}") print(f"Purchase: {result['document']['purchase_url']}\n")يقوم هذا الكود بإجراء بحث متجه ويعرض أفضل ثلاثة منتجات مطابقة مع درجات التشابه وتفاصيلها.
إنشاء محتوى إعلاني
اجمع جميع المكونات لصنع إعلانات جذابة باستخدام GPT-4 من OpenAI للنص وDALL-E 3 للصور.
أضف الوظيفة التالية لإنشاء عناوين إعلانية جذابة باستخدام GPT-4:
from openai import OpenAI def generate_ad_title(ad_topic): system_prompt = ''' You are Heelie, an intelligent assistant for generating witty and captivating taglines for online advertisements. - The ad campaign taglines that you generate are short and typically under 100 characters. ''' user_prompt = f'''Generate a catchy, witty, and short sentence (less than 100 characters) for an advertisement for selling shoes for {ad_topic}''' messages=[ {"role": "system", "content": system_prompt}, {"role": "user", "content": user_prompt}, ] response = client.chat.completions.create( model="gpt-4", messages=messages ) return response.choices[0].message.contentأضف الوظيفة التالية لإنشاء صور إعلانية باستخدام DALL-E 3:
def generate_ad_image(ad_topic): daliClient = OpenAI( api_key="<DALI_API_KEY>" ) image_prompt = f''' Generate a photorealistic image of an ad campaign for selling {ad_topic}. The image should be clean, with the item being sold in the foreground with an easily identifiable landmark of the city in the background. The image should also try to depict the weather of the location for the time of the year mentioned. The image should not have any generated text overlay. ''' response = daliClient.images.generate( model="dall-e-3", prompt= image_prompt, size="1024x1024", quality="standard", n=1, ) return response.data[0].urlاستبدلها
<DALI_API_KEY>بمفتاح OpenAI API الخاص بك.أضف الدالة التالية لدمج جميع العناصر في إعلان HTML كامل:
def render_html_page(ad_topic): # Find the matching shoes from the inventory results = vector_search(ad_topic, 4) ad_header = generate_ad_title(ad_topic) ad_image_url = generate_ad_image(ad_topic) with open('./data/ad-start.html', 'r', encoding='utf-8') as html_file: html_content = html_file.read() html_content += f'''<header> <h1>{ad_header}</h1> </header>''' html_content += f''' <section class="ad"> <img src="{ad_image_url}" alt="Base Ad Image" class="ad-image"> </section>''' for result in results: html_content += f''' <section class="product"> <img src="{result['document']['img_url']}" alt="{result['document']['name']}" class="product-image"> <div class="product-details"> <h3 class="product-title" color="gray">{result['document']['name']}</h2> <p class="product-price">{"$"+str(result['document']['price'])}</p> <p class="product-description">{result['document']['description']}</p> <a href="{result['document']['purchase_url']}" class="buy-now-button">Buy Now</a> </div> </section> ''' html_content += '''</article> </body> </html>''' return html_contentتقوم هذه الوظيفة بإجراء بحث متجه للعثور على المنتجات المتطابقة، وتولد عنوان إعلان باستخدام GPT-4، وتولد صورة إعلانية باستخدام DALL-E 3، وتجمع كل شيء في صفحة HTML مع قوائم المنتجات.
بناء واجهة تفاعلية
إنشاء واجهة ويب تفاعلية تتيح للمستخدمين إدخال مواضيع الإعلان وتولد وتعرض الإعلانات الناتجة بشكل ديناميكي.
أضف الكود التالي لإنشاء واجهة الويب:
import gradio as gr css = """ button { background-color: purple; color: red; } <style> </style> """ with gr.Blocks(css=css, theme=gr.themes.Default(spacing_size=gr.themes.sizes.spacing_sm, radius_size="none")) as demo: subject = gr.Textbox(placeholder="Ad Keywords", label="Prompt for Heelie!!") btn = gr.Button("Generate Ad") output_html = gr.HTML(label="Generated Ad HTML") btn.click(render_html_page, [subject], output_html) btn = gr.Button("Copy HTML") if __name__ == "__main__": demo.launch()احفظ ملف بايثون الخاص بك (على سبيل المثال،
ad_generator.py).شغل التطبيق من جهازك الطرفي:
python ad_generator.pyافتح متصفح الويب الخاص بك وانتقل إلى عنوان URL المعروض في الطرفية (عادة
http://localhost:7860).أدخل كلمات الإعلانات واختر إنشاء إعلان لرؤية إعلانك الذكاء الاصطناعي.
راقب الإعلان الذي تم إنشاؤه. يجمع الإعلان المولد بين نتائج البحث المتجهة والمحتوى الذكاء الاصطناعي لإنشاء إعلان جذاب ومخصص. التطبيق ينشئ لك عدة أشياء. أولا، يصنع شعارا جذابا باستخدام الذكاء الاصطناعي. ثم يخلق صورة إعلانية واقعية مع DALL-E 3. كما يجد المنتجات التي تطابق موضوعك باستخدام البحث المتجه. وأخيرا، يعرض لك تفاصيل المنتج الكاملة مع صور، وصف، وروابط لشرائها.
تنظيف الموارد
إذا أنشأت موارد خصيصا لهذا الدرس ولم تعد بحاجة إليها، فاحذفها لتجنب تحمل الرسوم.
قم بحذف قاعدة بيانات Azure DocumentDB عن طريق الانتقال إلى مورد Azure DocumentDB الخاص بك في بوابة Azure، واختيار Data Explorer، والنقر بزر الفأرة الأيمن على
AdgenDatabase، واختيار حذف قاعدة البيانات.(اختياري) قم بحذف عمليات نشر Azure OpenAI عن طريق التنقل إلى مورد Azure OpenAI الخاص بك في بوابة Azure، واختيار نشرات النماذج، وحذف عمليات GPT-4 و text-embedding-ada-002 إذا أنشأتها فقط لهذا الدرس.
(اختياري) إذا أنشأت مجموعة موارد مخصصة لهذا الدرس، احذف مجموعة الموارد بالكامل لإزالة جميع الموارد المرتبطة.