Создание объявлений с расширенным интерфейсом ИИ с помощью Azure Cosmos DB для виртуальных ядер MongoDB
В этом руководстве мы покажем, как создать динамическое рекламное содержимое, которое резонирует с вашей аудиторией с помощью нашего персонализированного помощника по искусственному интеллекту, Heelie. Используя Azure Cosmos DB для виртуальных ядер MongoDB, мы используем функции поиска сходства векторов для семантического анализа и сопоставления описаний инвентаризации с разделами рекламы. Процесс становится возможным путем создания векторов для описания инвентаризации с помощью внедрения OpenAI, что значительно повышает их семантику глубины. Затем эти векторы хранятся и индексируются в ресурсе виртуальных ядер Cosmos DB для MongoDB. При создании содержимого для объявлений мы векторизируем тему рекламы, чтобы найти наиболее подходящие элементы инвентаризации. За этим следует процесс получения дополненного поколения (RAG), где первые совпадения отправляются в OpenAI для создания привлекательной рекламы. Вся база кода для приложения доступна в репозитории GitHub для ссылки.
Функции
- Поиск сходства векторов. Использует мощный поиск по сходства векторов в Azure Cosmos DB для vCore, чтобы улучшить возможности семантического поиска, что упрощает поиск соответствующих элементов инвентаризации на основе содержимого объявлений.
- Внедрение OpenAI: использует передовые внедрения из OpenAI для создания векторов для описания инвентаризации. Такой подход позволяет получить более подробные и семантические совпадения между инвентаризацией и контентом рекламы.
- Создание контента: использует расширенные языковые модели OpenAI для создания привлекательных, ориентированных на тренд рекламы. Этот метод гарантирует, что содержимое не только релевантно, но и увлекательно для целевой аудитории.
Необходимые компоненты
- Azure OpenAI. Давайте настроим ресурс Azure OpenAI. Доступ к этой службе в настоящее время доступен только приложением. Вы можете подать заявку на доступ к Azure OpenAI, выполнив форму по адресу https://aka.ms/oai/access. После получения доступа выполните следующие действия.
- Создайте ресурс Azure OpenAI после этого краткого руководства.
completions
Развертывание модели иembeddings
ее развертывания.- Запишите имена конечной точки, ключа и развертывания.
- Ресурс виртуальных ядер Cosmos DB для MongoDB: сначала создадим ресурс виртуального ядра Azure Cosmos DB для MongoDB бесплатно, следуя этому краткому руководству .
- Запишите сведения о подключении.
- Среда Python (>= 3.9 версии) с такими пакетами, как
numpy
, ,openai
,pymongo
,azure-core
tenacity
python-dotenv
azure-cosmos
и .gradio
- Скачайте файл данных и сохраните его в указанной папке данных.
Запуск скрипта
Прежде чем мы смотрим на захватывающую часть создания рекламы СИ, нам нужно настроить нашу среду. Эта настройка включает установку необходимых пакетов, чтобы обеспечить плавность работы скрипта. Ниже приведено пошаговое руководство по подготовке всего.
1.1. Установка необходимых пакетов
Во-первых, нам нужно установить несколько пакетов Python. Откройте терминал и выполните следующие команды:
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 и клиента Azure
После установки необходимых пакетов следующий шаг включает настройку наших клиентов OpenAI и Azure для сценария, что крайне важно для проверки подлинности наших запросов к API OpenAI и службам Azure.
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
)
Архитектура решения
2. Создание внедрения и настройка Cosmos DB
После настройки среды и клиента OpenAI мы переместимся в основную часть проекта создания рекламы с улучшенным искусственным интеллектом. Следующий код создает векторные внедрения из текстовых описаний продуктов и настраивает нашу базу данных в Azure Cosmos DB для виртуальных ядер MongoDB для хранения и поиска этих внедрения.
2.1 Создание внедрения
Чтобы создать убедительные объявления, сначала необходимо понять элементы в нашем инвентаризации. Для этого мы создадим векторные внедрения из описания наших элементов, что позволяет нам захватить их семантический смысл в форме, которую компьютеры могут понять и обработать. Вот как можно создать векторные внедрения для описания элемента с помощью 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
embeddings = generate_embeddings("Shoes for San Francisco summer")
if embeddings is not None:
print(embeddings)
Функция принимает текстовые данные ( например, описание продукта) и использует client.embeddings.create
метод из API OpenAI для создания векторного внедрения для этого текста. Мы используем text-embedding-ada-002
модель здесь, но вы можете выбрать другие модели на основе ваших требований. Если процесс выполнен успешно, он печатает созданные внедрения; в противном случае он обрабатывает исключения путем печати сообщения об ошибке.
3. Подключение и настройка Cosmos DB для виртуальных ядер MongoDB
После подготовки внедрения следующий шаг — хранить и индексировать их в базе данных, поддерживающей поиск по сходству векторов. Azure Cosmos DB для виртуальных ядер MongoDB идеально подходит для этой задачи, так как она предназначена для хранения транзакционных данных и выполнения векторного поиска во всех местах.
3.1 Настройка подключения
Чтобы подключиться к Cosmos DB, мы используем библиотеку pymongo, которая позволяет легко взаимодействовать с MongoDB. Следующий фрагмент кода устанавливает подключение к экземпляру vCore Cosmos DB для MongoDB:
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>
Замените <USERNAME>
, а также <VCORE_CLUSTER_NAME>
фактическим именем пользователя MongoDB, паролем и именем кластера виртуальных ядер соответственно.
4. Настройка индекса базы данных и векторного индекса в Cosmos DB
После установки подключения к Azure Cosmos DB следующие действия включают настройку базы данных и коллекции, а затем создание векторного индекса для обеспечения эффективного поиска сходства векторов. Давайте рассмотрим эти шаги.
4.1 Настройка базы данных и коллекции
Сначала мы создадим базу данных и коллекцию в нашем экземпляре Cosmos DB. Это делается следующим образом:
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 Создание векторного индекса
Для эффективного поиска по сходству векторов в коллекции необходимо создать векторный индекс. Cosmos DB поддерживает различные типы векторных индексов, и здесь мы обсудим два: IVF и HNSW.
IVF
IVF — это алгоритм индексирования векторов по умолчанию, который работает на всех уровнях кластера. Это приблизительный подход ближайших соседей (ANN), который использует кластеризацию для ускорения поиска аналогичных векторов в наборе данных. Чтобы создать индекс IVF, используйте следующую команду:
db.command({
'createIndexes': COLLECTION_NAME,
'indexes': [
{
'name': 'vectorSearchIndex',
'key': {
"contentVector": "cosmosSearch"
},
'cosmosSearchOptions': {
'kind': 'vector-ivf',
'numLists': 1,
'similarity': 'COS',
'dimensions': 1536
}
}
]
});
Внимание
Для каждого векторного свойства можно создать только один индекс. То есть невозможно создать несколько индексов, указывающих на одно и то же свойство вектора. Если вы хотите изменить тип индекса (например, с IVF на HNSW), необходимо сначала удалить индекс перед созданием нового индекса.
HNSW
HNSW — иерархическая структура данных на основе графа, которая секционирует векторы в кластерах и подкластерах. С помощью HNSW можно выполнять быстрый поиск ближайших соседей с более высокой скоростью с большей точностью. HNSW — это приблизительный метод (ANN). Вот как настроить его:
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
}
}
]
}
)
Примечание.
Индексирование HNSW доступно только на уровнях кластера M40 и более поздних версиях.
5. Вставка данных в коллекцию
Теперь вставьте данные инвентаризации, которые включают описания и соответствующие векторные внедрения, в только что созданную коллекцию. Чтобы вставить данные в коллекцию, мы используем метод, предоставленный insert_many()
библиотекой pymongo
. Этот метод позволяет вставить несколько документов в коллекцию одновременно. Данные хранятся в JSON-файле, который мы загрузим, а затем вставляем в базу данных.
Скачайте файл shoes_with_vectors.json из репозитория GitHub и сохраните его в каталоге в папке data
проекта.
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. Векторный поиск в Cosmos DB для виртуального ядра MongoDB
После успешной отправки данных теперь можно применить возможности векторного поиска, чтобы найти наиболее релевантные элементы на основе запроса. Созданный ранее индекс вектора позволяет выполнять семантические поиски в наборе данных.
6.1 Проведение векторного поиска
Для выполнения векторного поиска мы определяем функцию vector_search
, которая принимает запрос и количество возвращаемых результатов. Функция создает вектор для запроса с помощью generate_embeddings
функции, определенной ранее, а затем использует функции Cosmos DB $search
для поиска ближайших соответствующих элементов на основе их векторных внедрения.
# 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 Выполнение запроса векторного поиска
Наконец, мы выполняем функцию векторного поиска с определенным запросом и обработаем результаты, чтобы отобразить их:
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. Создание содержимого Ad с помощью GPT-4 и DALL. E
Мы сочетаем все разработанные компоненты для создания убедительных объявлений, используя GPT-4 OpenAI для текста и DALL· E 3 для изображений. Вместе с результатами векторного поиска они образуют полную рекламу. Мы также представляем Heelie, нашего интеллектуального помощника, с задачей создания привлекательных рекламных тегов. В предстоящем коде вы увидите Heelie в действии, расширяя процесс создания рекламы.
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. Поместите все вместе
Чтобы сделать наше создание рекламы интерактивным, мы используем библиотеку Gradio, библиотеку Python для создания простых веб-интерфейсов. Мы определяем пользовательский интерфейс, позволяющий пользователям вводить разделы объявлений, а затем динамически создавать и отображать итоговую рекламу.
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()