Aracılığıyla paylaş


MongoDB için Azure Cosmos DB sanal çekirdeğini kullanarak yapay zeka ile geliştirilmiş tanıtım oluşturma

Bu kılavuzda kişiselleştirilmiş yapay zeka yardımcımız Heelie'yi kullanarak hedef kitlenizle yankı bulayan dinamik reklam içeriği oluşturmayı göstereceğiz. MongoDB sanal çekirdeği için Azure Cosmos DB'yi kullanarak, envanter açıklamalarını görsel olarak analiz etmek ve reklam konularıyla eşleştirmek için vektör benzerliği arama işlevinden yararlanıyoruz. OpenAI eklemeleri kullanılarak envanter açıklamaları için vektörler oluşturularak bu işlem mümkün hale gelir ve bu da anlam derinliğini önemli ölçüde artırır. Bu vektörler daha sonra MongoDB sanal çekirdek kaynağı için Cosmos DB içinde depolanır ve dizinlenir. Reklamlar için içerik oluştururken, en iyi eşleşen envanter öğelerini bulmak için tanıtım konusunu vektörleştiririz. Bunu, ilgi çekici bir reklam oluşturmak için üst eşleşmelerin OpenAI'ye gönderildiği bir alma artırılmış oluşturma (RAG) işlemi izler. Uygulamanın kod tabanının tamamı, başvurunuz için bir GitHub deposunda bulunur.

Özellikler

  • Vektör Benzerliği Araması: Anlamsal arama özelliklerini geliştirmek için MongoDB sanal çekirdeğinin güçlü vektör benzerliği araması için Azure Cosmos DB'yi kullanır ve reklamların içeriğine göre ilgili envanter öğelerini bulmayı kolaylaştırır.
  • OpenAI Eklemeleri: Stok açıklamaları için vektörler oluşturmak üzere OpenAI'den son teknoloji eklemeleri kullanır. Bu yaklaşım, envanter ve reklam içeriği arasında daha fazla nüanslı ve diğer açıdan zengin eşleşmeler sağlar.
  • İçerik Oluşturma: İlgi çekici, eğilim odaklı reklamlar oluşturmak için OpenAI'nin gelişmiş dil modellerini kullanıyor. Bu yöntem, içeriğin yalnızca ilgili olmasını değil aynı zamanda hedef kitleyi de cezp etmesini sağlar.

Önkoşullar

  • Azure OpenAI: Azure OpenAI kaynağını ayarlayalım. Bu hizmete erişim şu anda yalnızca uygulama tarafından kullanılabilir. adresinden formu https://aka.ms/oai/accesstamamlayarak Azure OpenAI'ye erişim için başvurabilirsiniz. Erişiminiz olduktan sonra aşağıdaki adımları tamamlayın:

    • Bu hızlı başlangıcın ardından bir Azure OpenAI kaynağı oluşturun.
    • completions ve embeddings modeli dağıtma
      • hakkında completionsdaha fazla bilgi için buraya gidin.
      • hakkında embeddingsdaha fazla bilgi için buraya gidin.
    • Uç nokta, anahtar ve dağıtım adlarınızı not edin.
  • MongoDB için Cosmos DB sanal çekirdek kaynağı: Bu hızlı başlangıç kılavuzunu izleyerek mongoDB için Azure Cosmos DB sanal çekirdek kaynağını ücretsiz oluşturarak başlayalım.

    • Bağlantı ayrıntılarını (bağlantı dizesi) not edin.
  • , , openai, tenacityazure-cosmospymongoazure-corepython-dotenvve gradiogibi numpypaketler içeren Python ortamı (>= 3.9 sürümü).

  • Veri dosyasını indirin ve belirlenen bir veri klasörüne kaydedin.

Betiği Çalıştırma

Yapay zeka ile geliştirilmiş reklamlar oluşturmanın heyecan verici kısmına geçmeden önce ortamımızı ayarlamamız gerekir. Bu kurulum, betiğimizin sorunsuz çalıştığından emin olmak için gerekli paketlerin yüklenmesini içerir. İşte her şeyi hazır etmek için adım adım kılavuz.

1.1 Gerekli Paketleri Yükleme

öncelikle birkaç Python paketi yüklemeliyiz. Terminalinizi açın ve aşağıdaki komutları çalıştırın:

 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
 pip show openai

1.2 OpenAI ve Azure İstemcisini Ayarlama

Gerekli paketleri yükledikten sonra, sonraki adım OpenAI ve Azure istemcilerimizi betik için ayarlamayı içerir. Bu, OpenAI API'sine ve Azure hizmetlerine yönelik isteklerimizin kimliğini doğrulamak için çok önemlidir.

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
)

Çözüm mimarisi

çözüm mimarisi

2. Eklemeler Oluşturma ve Cosmos DB'yi Ayarlama

Ortamımızı ve OpenAI istemcimizi ayarladıktan sonra yapay zeka destekli reklam oluşturma projemizin temel bölümüne geçiyoruz. Aşağıdaki kod, ürünlerin metin açıklamalarından vektör eklemeleri oluşturur ve bu eklemeleri depolamak ve aramak için MongoDB sanal çekirdeği için Azure Cosmos DB'deki veritabanımızı ayarlar.

2.1 Ekleme oluşturma

İlgi çekici reklamlar oluşturmak için öncelikle envanterimizdeki öğeleri anlamamız gerekir. Bunu, öğelerimizin açıklamalarından vektör eklemeleri oluşturarak yaparız. Bu sayede anlamsal anlamlarını makinelerin anlayabileceği ve işleyebileceği bir biçimde yakalayabiliriz. Azure OpenAI kullanarak bir öğe açıklaması için vektör eklemeleri şu şekilde oluşturabilirsiniz:

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

embeddings = generate_embeddings("Shoes for San Francisco summer")

if embeddings is not None:
    print(embeddings)

İşlev, ürün açıklaması gibi bir metin girişi alır ve openAI API'sinden yöntemini kullanarak client.embeddings.create bu metin için vektör ekleme oluşturur. Modeli burada kullanıyoruz text-embedding-ada-002 , ancak gereksinimlerinize göre diğer modelleri seçebilirsiniz. İşlem başarılı olursa, oluşturulan eklemeleri yazdırır; aksi takdirde, bir hata iletisi yazdırarak özel durumları işler.

3. MongoDB sanal çekirdeği için Cosmos DB'Bağlan ve ayarlama

Eklemelerimiz hazır olduğunda, sonraki adım bunları vektör benzerliği aramasını destekleyen bir veritabanında depolamak ve dizine eklemektir. MongoDB için Azure Cosmos DB sanal çekirdeği, işlem verilerinizi depolamak ve vektör aramasını tek bir yerde gerçekleştirmek için oluşturulduğundan bu görev için mükemmel bir uyum sağlar.

3.1 Bağlantıyı ayarlama

Cosmos DB'ye bağlanmak için MongoDB ile kolayca etkileşim kurmamızı sağlayan pymongo kitaplığını kullanırız. Aşağıdaki kod parçacığı MongoDB için Cosmos DB sanal çekirdek örneğimizle bir bağlantı kurar:

import pymongo

# Replace <USERNAME>, <PASSWORD>, and <VCORE_CLUSTER_NAME> with your actual credentials and cluster name
mongo_conn = "mongodb+srv://<USERNAME>:<PASSWORD>@<VCORE_CLUSTER_NAME>.mongocluster.cosmos.azure.com/?tls=true&authMechanism=SCRAM-SHA-256&retrywrites=false&maxIdleTimeMS=120000"
mongo_client = pymongo.MongoClient(mongo_conn)

, <PASSWORD>ve <VCORE_CLUSTER_NAME> değerlerini sırasıyla gerçek MongoDB kullanıcı adınız, parolanız ve sanal çekirdek küme adınızla değiştirin<USERNAME>.

4. Cosmos DB'de Veritabanı ve Vektör Dizinini Ayarlama

Azure Cosmos DB ile bağlantı kurduktan sonra, sonraki adımlar veritabanınızı ve koleksiyonunuzu ayarlamayı ve ardından verimli vektör benzerliği aramalarını etkinleştirmek için bir vektör dizini oluşturmayı içerir. Şimdi bu adımları inceleyelim.

4.1 Veritabanını ve Koleksiyonu Ayarlama

İlk olarak Cosmos DB örneğimizde bir veritabanı ve koleksiyon oluşturacağız. Bu şöyle yapabilirsiniz:

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 DBs shared throughput
    db.create_collection(COLLECTION_NAME)
    print("Created collection '{}'.\n".format(COLLECTION_NAME))
else:
    print("Using collection: '{}'.\n".format(COLLECTION_NAME))

4.2 Vektör dizinini oluşturma

Koleksiyonumuzda verimli vektör benzerliği aramaları gerçekleştirmek için bir vektör dizini oluşturmamız gerekir. Cosmos DB farklı vektör dizin türlerini destekler ve burada iki konuyu ele alıyoruz: IVF ve HNSW.

IVF

IVF, tüm küme katmanlarında çalışan varsayılan vektör dizinleme algoritması olan Ters Dosya Dizini anlamına gelir. Bu, bir veri kümesindeki benzer vektörleri aramayı hızlandırmak için kümeleme kullanan yaklaşık en yakın komşular (ANN) yaklaşımıdır. IVF dizini oluşturmak için aşağıdaki komutu kullanın:

db.command({
  'createIndexes': COLLECTION_NAME,
  'indexes': [
    {
      'name': 'vectorSearchIndex',
      'key': {
        "contentVector": "cosmosSearch"
      },
      'cosmosSearchOptions': {
        'kind': 'vector-ivf',
        'numLists': 1,
        'similarity': 'COS',
        'dimensions': 1536
      }
    }
  ]
});

Önemli

Vektör özelliği başına yalnızca bir dizin oluşturabilirsiniz. Başka bir ifadeyle, aynı vektör özelliğine işaret eden birden fazla dizin oluşturamazsınız. Dizin türünü değiştirmek istiyorsanız (örneğin, IVF'den HNSW'ye) yeni bir dizin oluşturmadan önce dizini bırakmanız gerekir.

HNSW

HNSW, vektörleri kümelere ve alt kümelere bölen grafik tabanlı bir veri yapısı olan Hiyerarşik Gezinilebilir Küçük Dünya anlamına gelir. HNSW ile daha yüksek hızlarda yaklaşık en yakın komşu aramalarını daha yüksek doğrulukla gerçekleştirebilirsiniz. HNSW yaklaşık bir (ANN) yöntemidir. Bunu şu şekilde ayarlayabilirsiniz:

db.command(
{ 
    "createIndexes": "ExampleCollection",
    "indexes": [
        {
            "name": "VectorSearchIndex",
            "key": {
                "contentVector": "cosmosSearch"
            },
            "cosmosSearchOptions": { 
                "kind": "vector-hnsw", 
                "m": 16, # default value 
                "efConstruction": 64, # default value 
                "similarity": "COS", 
                "dimensions": 1536
            } 
        } 
    ] 
}
)

Not

HNSW dizin oluşturma yalnızca M40 ve üzeri küme katmanlarında kullanılabilir.

5. Koleksiyona veri ekleme

Şimdi açıklamaları ve bunlara karşılık gelen vektör eklemelerini içeren envanter verilerini yeni oluşturulan koleksiyona ekleyin. Koleksiyonumuza veri eklemek için kitaplık tarafından pymongo sağlanan yöntemini kullanırızinsert_many(). yöntemi, koleksiyona aynı anda birden çok belge eklememizi sağlar. Verilerimiz bir JSON dosyasında depolanır. Bu dosyayı yükleyip veritabanına ekleyeceğiz.

GitHub deposundan shoes_with_vectors.json dosyasını indirin ve proje klasörünüzdeki bir data dizinde depolayın.

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)}")

6. MongoDB sanal çekirdeği için Cosmos DB'de Vektör Araması

Verilerimiz başarıyla karşıya yüklendikten sonra artık bir sorguya göre en uygun öğeleri bulmak için vektör aramasının gücünü uygulayabiliriz. Daha önce oluşturduğumuz vektör dizini, veri kümemizde anlamsal aramalar yapmamıza olanak tanır.

Vektör araması yapmak için sorguyu ve döndürülecek sonuç sayısını alan bir işlev vector_search tanımlarız. İşlev, daha önce tanımladığımız işlevi kullanarak generate_embeddings sorgu için bir vektör oluşturur ve ardından Cosmos DB'nin $search işlevselliğini kullanarak vektör eklemelerine göre en yakın eşleşen öğeleri bulur.

# Function to assist with vector search
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

6.2 Vektör arama sorgusu gerçekleştirme

Son olarak, vektör arama işlevimizi belirli bir sorguyla yürütür ve sonuçları işleyerek bunları görüntüleriz:

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")

7. GPT-4 ve DALL ile Reklam içeriği oluşturma. E

Tüm geliştirilmiş bileşenleri, metin ve DALL için OpenAI'nin GPT-4'ünü kullanarak ilgi çekici reklamlar oluşturmak için birleştiriyoruz· Görüntüler için E 3. Vektör arama sonuçlarıyla birlikte eksiksiz bir reklam oluştururlar. Ayrıca ilgi çekici reklam etiketlerini oluşturmakla görevli akıllı asistanımız Heelie'yi de tanıtıyoruz. Yaklaşan kod aracılığıyla Heelie'nin çalıştığını ve reklam oluşturma sürecimizi geliştirdiğini göreceksiniz.

from openai import OpenAI

def generate_ad_title(ad_topic):
    system_prompt = '''
    You are Heelie, an intelligent assistant for generating witty and cativating tagline for online advertisement.
        - 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

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

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

8. Hepsini bir araya getirmek

Reklam oluşturmamızı etkileşimli hale getirmek için basit web kullanıcı arabirimleri oluşturmaya yönelik bir Python kitaplığı olan Gradio'yu kullanıyoruz. Kullanıcıların reklam konularını girişine olanak tanıyan ve ardından elde edilen reklamı dinamik olarak oluşturup görüntüleyen bir kullanıcı arabirimi tanımlarız.

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()   

Çıktı

Çıkış ekranı

Sonraki adım