SingleStore هو نظام قاعدة بيانات متعدد النماذج قوي ومنصة مصممة لدعم مجموعة واسعة من حالات الاستخدام التجارية. تسمح ميزاته المميزة للشركات بتوحيد أنظمة قواعد البيانات المتعددة في منصة واحدة، مما يقلل من تكلفة الملكية الكلية ويبسط سير عمل المطورين عن طريق القضاء على الحاجة إلى أدوات التكامل المعقدة.
في هذه المقالة، سنستكشف كيف يمكن لـ SingleStore تحويل حملات البريد الإلكتروني لشركة تحليلات الويب، مما يتيح إنشاء محتوى بريد إلكتروني شخصي ومستهدف بشكل كبير.
يتوفر ملف الدفتر في المقالة على GitHub.
المقدمة
تعتمد شركة تحليلات الويب على حملات البريد الإلكتروني للتفاعل مع العملاء. ومع ذلك، يفوت النهج العام لاستهداف العملاء فرص تحقيق الإمكانات التجارية القصوى. من الحلول الأكثر فعالية سيكون استخدام نموذج لغوي كبير (LLM) لصياغة رسائل بريد إلكتروني شخصية.
فكر في سيناريو حيث تتم تخزين بيانات سلوك المستخدم في قاعدة بيانات NoSQL مثل MongoDB، بينما تتواجد الوثائق القيمة في قاعدة بيانات نصية، مثل Pinecone. يمكن أن يصبح إدارة هذه الأنظمة المتعددة معقدة وتتطلب الكثير من الموارد، مما يبرز الحاجة إلى حل موحد.
SingleStore ، قاعدة بيانات متعددة النماذج متعددة الاستخدامات ، تدعم تنسيقات بيانات متنوعة ، بما في ذلك JSON ، وتوفر وظائف ناقلة مدمجة. إنه يدمج بسلاسة مع LLMs ، مما يجعله بديلاً قويًا لإدارة أنظمة قواعد البيانات المتعددة. في هذه المقالة ، سنوضح كيف يمكن لـ SingleStore بسهولة أن تحل محل كل من MongoDB و Pinecone ، مبسطة العمليات دون المساس بالوظائف.
في تطبيقنا المثالي ، سنستخدم LLM لإنشاء عناوين بريد إلكتروني فريدة لعملائنا. لمساعدة LLM في تعلم كيفية استهداف عملائنا ، سنستخدم عددًا من شركات التحليل المعروفة كمواد تعليمية لـ LLM.
سنقوم بتخصيص المحتوى بناءً على سلوك المستخدم. تخزن بيانات العملاء في MongoDB. يتم تخزين مراحل مختلفة من سلوك المستخدم في Pinecone. سيسمح سلوك المستخدم لـ LLM بإنشاء رسائل بريد إلكتروني شخصية. أخيرًا ، سنوحد البيانات المخزنة في MongoDB و Pinecone باستخدام SingleStore.
إنشاء حساب SingleStore Cloud
أظهرت مقالة سابقة الخطوات لإنشاء حساب SingleStore Cloud مجاني. سنستخدم الطبقة القياسية ونأخذ الأسماء الافتراضية لمجموعة مساحة العمل ومساحة العمل. سنمكن أيضًا SingleStore Kai.
سنقوم بتخزين مفتاح API المفتوح لـ OpenAI ومفتاح API Pinecone في سرد المفاتيح باستخدام OPENAI_API_KEY
و PINECONE_API_KEY
على التوالي.
استيراد الدفتر
سنقوم بتحميل الدفتر من GitHub.
من اللوحة التنقل اليمنى في بوابة SingleStore cloud, سنختار “DEVELOP” > “Data Studio.”
في أعلى الصفحة الويب، سنختار “New Notebook” > “Import From File.” سنستخدم المعالج لتحديد مكان واستيراد الدفتر الذي قمنا بتحميله من GitHub.
تشغيل الدفتر
قالب البريد الإلكتروني العام
سنبدأ بإنشاء قوالب بريد إلكتروني عامة ثم استخدام LLM لتحويلها إلى رسائل مخصصة لكل عميل. بهذه الطريقة، يمكننا معالجة كل مستلم باسمه وتقديمه لفوائد منصتنا لتحليلات الويب.
يمكننا إنشاء بريد إلكتروني عام كالتالي:
people = ["Alice", "Bob", "Charlie", "David", "Emma"]
for person in people:
message = (
f"Hey {person},\n"
"Check out our web analytics platform, it's Awesome!\n"
"It's perfect for your needs. Buy it now!\n"
"- Marketer John"
)
print(message)
print("_" * 100)
على سبيل المثال، سترى آليس الرسالة التالية:
Hey Alice,
Check out our web analytics platform, it's Awesome!
It's perfect for your needs. Buy it now!
- Marketer John
سيتلقى المستخدمون الآخرون نفس الرسالة، ولكن بذكر اسمهم على التوالي.
2. إضافة نموذج لغوي كبير (LLM)
يمكننا بسهولة إدخال LLM إلى تطبيقنا عن طريق تزويده بدور وإعطائه بعض المعلومات، كما يلي:
system_message = """
You are a helpful assistant.
My name is Marketer John.
You help write the body of an email for a fictitious company called 'Awesome Web Analytics'.
This is a web analytics company that is similar to the top 5 web analytics companies (perform a web search to determine the current top 5 web analytics companies).
The goal is to write a custom email to users to get them interested in our services.
The email should be less than 150 words.
Address the user by name.
End with my signature.
"""
سنقوم بإنشاء وظيفة لاستدعاء LLM:
def chatgpt_generate_email(prompt, person):
conversation = [
{"role": "system", "content": prompt},
{"role": "user", "content": person},
{"role": "assistant", "content": ""}
]
response = openai_client.chat.completions.create(
model = "gpt-4o-mini",
messages = conversation,
temperature = 1.0,
max_tokens = 800,
top_p = 1,
frequency_penalty = 0,
presence_penalty = 0
)
assistant_reply = response.choices[0].message.content
return assistant_reply
بتكرار القائمة من المستخدمين واستدعاء LLM، ستنتج رسائل بريد إلكتروني فريدة:
openai_client = OpenAI()
# Define a list to store the responses
emails = []
# Loop through each person and generate the conversation
for person in people:
email = chatgpt_generate_email(system_message, person)
emails.append(
{
"person": person,
"assistant_reply": email
}
)
على سبيل المثال، هذا ما قد تراه آليس:
Person: Alice
Subject: Unlock Your Website's Potential with Awesome Web Analytics!
Hi Alice,
Are you ready to take your website to new heights? At Awesome Web Analytics, we provide cutting-edge insights that empower you to make informed decisions and drive growth.
With our powerful analytics tools, you can understand user behavior, optimize performance, and boost conversions—all in real-time! Unlike other analytics platforms, we offer personalized support to guide you every step of the way.
Join countless satisfied customers who have transformed their online presence. Discover how we stack up against competitors like Google Analytics, Adobe Analytics, and Matomo, but with a focus on simplicity and usability.
Let us help you turn data into your greatest asset!
Best,
Marketer John
Awesome Web Analytics
سيتم إنشاء رسائل بريد إلكتروني فريدة بالمثل للمستخدمين الآخرين.
3. تخصيص محتوى البريد الإلكتروني بناءً على سلوك المستخدم
من خلال تصنيف المستخدمين استنادًا إلى مراحل سلوكهم، يمكننا تخصيص محتوى البريد الإلكتروني بشكل أعمق ليتماشى مع احتياجاتهم الخاصة. سيساعد النموذج اللغوي العميق في صياغة رسائل البريد الإلكتروني التي تشجع المستخدمين على التقدم خلال مراحل مختلفة، مما يحسن في نهاية المطاف فهمهم واستخدامهم لمختلف الخدمات.
حاليًا، تتمتع البيانات الخاصة بالمستخدمين بتخزين في قاعدة بيانات MongoDB بنية تسجيلية مشابهة للتالي:
{
'_id': ObjectId('64afb3fda9295d8421e7a19f'),
'first_name': 'James',
'last_name': 'Villanueva',
'company_name': 'Foley-Turner',
'stage': 'generating a tracking code',
'created_date': 1987-11-09T12:43:26.000+00:00
}
سنقوم بالاتصال بـ MongoDB للحصول على البيانات على النحو التالي:
try:
mongo_client = MongoClient("mongodb+srv://admin:<password>@<host>/?retryWrites=true&w=majority")
mongo_db = mongo_client["mktg_email_demo"]
collection = mongo_db["customers"]
print("Connected successfully")
except Exception as e:
print(e)
سنقوم بتعويض <password>
و <host>
بالقيم من MongoDB Atlas.
لدينا عدد من مراحل سلوك المستخدم:
stages = [
"getting started",
"generating a tracking code",
"adding tracking to your website",
"real-time analytics",
"conversion tracking",
"funnels",
"user segmentation",
"custom event tracking",
"data export",
"dashboard customization"
]
def find_next_stage(current_stage):
current_index = stages.index(current_stage)
if current_index < len(stages) - 1:
return stages[current_index + 1]
else:
return stages[current_index]
باستخدام البيانات حول مراحل السلوك، سنطلب من النموذج اللغوي العميق تخصيص البريد الإلكتروني بشكل أعمق على النحو التالي:
limit = 5
emails = []
for record in collection.find(limit = limit):
fname, stage = record.get("first_name"), record.get("stage")
next_stage = find_next_stage(stage)
system_message = f"""
You are a helpful assistant, who works for me, Marketer John at Awesome Web Analytics.
You help write the body of an email for a fictitious company called 'Awesome Web Analytics'.
We are a web analytics company similar to the top 5 web analytics companies.
We have users at various stages in our product's pipeline, and we want to send them helpful emails to encourage further usage of our product.
Please write an email for {fname} who is on stage {stage} of the onboarding process.
The next stage is {next_stage}.
Ensure the email describes the benefits of moving to the next stage.
Limit the email to 1 paragraph.
End the email with my signature.
"""
email = chatgpt_generate_email(system_message, fname)
emails.append(
{
"fname": fname,
"stage": stage,
"next_stage": next_stage,
"email": email
}
)
على سبيل المثال، إليك بريد إلكتروني تم إنشاؤه لـ مايكل:
First Name: Michael
Stage: funnels
Next Stage: user segmentation
Subject: Unlock Deeper Insights with User Segmentation!
Hi Michael,
Congratulations on successfully navigating the funnel stage of our onboarding process! As you move forward to user segmentation, you'll discover how this powerful tool will enable you to categorize your users based on their behaviors and demographics. By understanding your audience segments better, you can create tailored experiences that increase engagement and optimize conversions. This targeted approach not only enhances your marketing strategies but also drives meaningful results and growth for your business. We're excited to see how segmentation will elevate your analytics efforts!
Best,
Marketer John
Awesome Web Analytics
4. تخصيص محتوى البريد الإلكتروني بشكل أعمق
لدعم تقدم المستخدمين، سنستخدم تضمينات Pinecone’s vector، مما يتيح لنا توجيه المستخدمين نحو الوثائق ذات الصلة لكل مرحلة. تجعل هذه التضمينات من السهل توجيه المستخدمين نحو الموارد الأساسية وتعزيز تفاعلاتهم مع منتجنا بشكل أكبر.
pc = Pinecone(
api_key = pc_api_key
)
index_name = "mktg-email-demo"
if any(index["name"] == index_name for index in pc.list_indexes()):
pc.delete_index(index_name)
pc.create_index(
name = index_name,
dimension = dimensions,
metric = "euclidean",
spec = ServerlessSpec(
cloud = "aws",
region = "us-east-1"
)
)
pc_index = pc.Index(index_name)
pc.list_indexes()
سنقوم بإنشاء التضمينات على النحو التالي:
def get_embeddings(text):
text = text.replace("\n", " ")
try:
response = openai_client.embeddings.create(
input = text,
model = "text-embedding-3-small"
)
return response.data[0].embedding, response.usage.total_tokens, "success"
except Exception as e:
print(e)
return "", 0, "failed"
id_counter = 1
ids_list = []
for stage in stages:
embedding, tokens, status = get_embeddings(stage)
parent = id_counter - 1
pc_index.upsert([
{
"id": str(id_counter),
"values": embedding,
"metadata": {"content": stage, "parent": str(parent)}
}
])
ids_list.append(str(id_counter))
id_counter += 1
سنبحث في Pinecone عن التطابقات على النحو التالي:
def search_pinecone(embedding):
match = pc_index.query(
vector = [embedding],
top_k = 1,
include_metadata = True
)["matches"][0]["metadata"]
return match["content"], match["parent"]
باستخدام البيانات، يمكننا طلب من النموذج اللغوي العميق تخصيص البريد الإلكتروني بشكل أعمق، على النحو التالي:
limit = 5
emails = []
for record in collection.find(limit = limit):
fname, stage = record.get("first_name"), record.get("stage")
# Get the current and next stages with their embedding
this_stage = next((item for item in stages_w_embed if item["stage"] == stage), None)
next_stage = next((item for item in stages_w_embed if item["stage"] == find_next_stage(stage)), None)
if not this_stage or not next_stage:
continue
# Get content
cur_content, cur_permalink = search_pinecone(this_stage["embedding"])
next_content, next_permalink = search_pinecone(next_stage["embedding"])
system_message = f"""
You are a helpful assistant.
I am Marketer John at Awesome Web Analytics.
We are similar to the current top web analytics companies.
We have users at various stages of using our product, and we want to send them helpful emails to encourage them to use our product more.
Write an email for {fname}, who is on stage {stage} of the onboarding process.
The next stage is {next_stage['stage']}.
Ensure the email describes the benefits of moving to the next stage, and include this link: https://github.com/VeryFatBoy/mktg-email-flow/tree/main/docs/{next_content.replace(' ', '-')}.md.
Limit the email to 1 paragraph.
End the email with my signature: 'Best Regards, Marketer John.'
"""
email = chatgpt_generate_email(system_message, fname)
emails.append(
{
"fname": fname,
"stage": stage,
"next_stage": next_stage["stage"],
"email": email
}
)
على سبيل المثال، إليك بريد إلكتروني تم إنشاؤه لـ ميليسا:
First Name: Melissa
Stage: getting started
Next Stage: generating a tracking code
Subject: Take the Next Step with Awesome Web Analytics!
Hi Melissa,
We're thrilled to see you getting started on your journey with Awesome Web Analytics! The next step is generating your tracking code, which will allow you to start collecting valuable data about your website visitors. With this data, you can gain insights into user behavior, optimize your marketing strategies, and ultimately drive more conversions. To guide you through this process, check out our detailed instructions here: [Generating a Tracking Code](https://github.com/VeryFatBoy/mktg-email-flow/tree/main/docs/generating-a-tracking-code.md). We're here to support you every step of the way!
Best Regards,
Marketer John.
يمكننا رؤية أننا قد عملنا على تحسين النموذج العام وطورنا رسائل بريد إلكتروني مستهدفة تمامًا.
باستخدام SingleStore
بدلاً من إدارة أنظمة قواعد بيانات منفصلة، سنقوم بتبسيط عملياتنا باستخدام SingleStore. بفضل دعمه لـ JSON والنصوص وتضمينات المتجهات، يمكننا تخزين جميع البيانات الضرورية بكفاءة في مكان واحد، مما يقلل من التكلفة الإجمالية للامتلاك (TCO) ويبسّط عمليات التطوير لدينا.
سنقوم باستيراد البيانات من MongoDB باستخدام خط أنابيب مشابه لما يلي:
USE mktg_email_demo;
CREATE LINK mktg_email_demo.link AS MONGODB
CONFIG '{"mongodb.hosts": "<primary>:27017, <secondary>:27017, <secondary>:27017",
"collection.include.list": "mktg_email_demo.*",
"mongodb.ssl.enabled": "true",
"mongodb.authsource": "admin",
"mongodb.members.auto.discover": "false"}'
CREDENTIALS '{"mongodb.user": "admin",
"mongodb.password": "<password>"}';
CREATE TABLES AS INFER PIPELINE AS LOAD DATA LINK mktg_email_demo.link '*' FORMAT AVRO;
START ALL PIPELINES;
سنقوم باستبدال <primary>
و<secondary>
و<secondary>
و<password>
بالقيم من MongoDB Atlas.
سيتم إنشاء جدول العملاء بواسطة خط الأنابيب. يمكن إنشاء تضمينات المتجهات لمراحل السلوك كما يلي:
df_list = []
id_counter = 1
for stage in stages:
embedding, tokens, status = get_embeddings(stage)
parent = id_counter - 1
stage_df = pd.DataFrame(
{
"id": [id_counter],
"content": [stage],
"embedding": [embedding],
"parent": [parent]
}
)
df_list.append(stage_df)
id_counter += 1
df = pd.concat(df_list, ignore_index = True)
سنحتاج إلى جدول لتخزين البيانات:
USE mktg_email_demo;
DROP TABLE IF EXISTS docs_splits;
CREATE TABLE IF NOT EXISTS docs_splits (
id INT,
content TEXT,
embedding VECTOR(:dimensions),
parent INT
);
ثم يمكننا حفظ البيانات في الجدول:
df.to_sql(
"docs_splits",
con = db_connection,
if_exists = "append",
index = False,
chunksize = 1000
)
سنبحث في SingleStore عن التطابقات كما يلي:
def search_s2(vector):
query = """
SELECT content, parent
FROM docs_splits
ORDER BY (embedding <-> :vector) ASC
LIMIT 1
"""
with db_connection.connect() as con:
result = con.execute(text(query), {"vector": str(vector)})
return result.fetchone()
باستخدام البيانات، يمكننا أن نطلب من LLM تخصيص البريد الإلكتروني كما يلي:
limit = 5
emails = []
# Create a connection
with db_connection.connect() as con:
query = "SELECT _more :> JSON FROM customers LIMIT :limit"
result = con.execute(text(query), {"limit": limit})
for customer in result:
customer_data = customer[0]
fname, stage = customer_data["first_name"], customer_data["stage"]
# Retrieve current and next stage embeddings
this_stage = next((item for item in stages_w_embed if item["stage"] == stage), None)
next_stage = next((item for item in stages_w_embed if item["stage"] == find_next_stage(stage)), None)
if not this_stage or not next_stage:
continue
# Get content
cur_content, cur_permalink = search_s2(this_stage["embedding"])
next_content, next_permalink = search_s2(next_stage["embedding"])
# Create the system message
system_message = f"""
You are a helpful assistant.
I am Marketer John at Awesome Web Analytics.
We are similar to the current top web analytics companies.
We have users that are at various stages in using our product, and we want to send them helpful emails to get them to use our product more.
Write an email for {fname} who is on stage {stage} of the onboarding process.
The next stage is {next_stage['stage']}.
Ensure the email describes the benefits of moving to the next stage, then always share this link: https://github.com/VeryFatBoy/mktg-email-flow/tree/main/docs/{next_content.replace(' ', '-')}.md.
Limit the email to 1 paragraph.
End the email with my signature: 'Best Regards, Marketer John.'
"""
email = chatgpt_generate_email(system_message, fname)
emails.append(
{
"fname": fname,
"stage": stage,
"next_stage": next_stage["stage"],
"email": email,
}
)
على سبيل المثال، إليك بريد إلكتروني تم إنشاؤه لجوزيف:
First Name: Joseph
Stage: generating a tracking code
Next Stage: adding tracking to your website
Subject: Take the Next Step in Your Analytics Journey!
Hi Joseph,
Congratulations on generating your tracking code! The next step is to add tracking to your website, which is crucial for unlocking the full power of our analytics tools. By integrating the tracking code, you will start collecting valuable data about your visitors, enabling you to understand user behavior, optimize your website, and drive better results for your business. Ready to get started? Check out our detailed guide here: [Adding Tracking to Your Website](https://github.com/VeryFatBoy/mktg-email-flow/tree/main/docs/adding-tracking-to-your-website.md).
Best Regards,
Marketer John.
ملخص
من خلال هذا العرض العملي، رأينا كيف يُحسن SingleStore حملاتنا البريدية بفضل قدراته المتعددة النماذج والتخصيص المدفوع بالذكاء الاصطناعي. باستخدام SingleStore كمصدرنا الوحيد للحقائق، قمنا بتبسيط سير العمل لدينا وضمان أن حملاتنا البريدية تحقق أقصى تأثير وقيمة لعملائنا.
الشكر والتقدير
أشكر ويس كينيدي على رمز العرض الأصلي، الذي تم تكييفه لهذا المقال.
Source:
https://dzone.com/articles/how-to-build-a-chatgpt-super-app