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
veembeddings
modeli dağıtma- 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
,tenacity
azure-cosmos
pymongo
azure-core
python-dotenv
vegradio
gibinumpy
paketler 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
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.
6.1 Vektör Araması Yapma
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ı
Sonraki adım
Geri Bildirim
https://aka.ms/ContentUserFeedback.
Çok yakında: 2024 boyunca, içerik için geri bildirim mekanizması olarak GitHub Sorunları’nı kullanımdan kaldıracak ve yeni bir geri bildirim sistemiyle değiştireceğiz. Daha fazla bilgi için bkz.Gönderin ve geri bildirimi görüntüleyin