🇬🇧 English: Read this in English →

Açık konuşayım: piyasadaki WordPress “AI chatbot” eklentilerinin çoğu, üzerine yapay zeka etiketi yapıştırılmış SSS arama çubuklarından ibaret. Gerçekten faydalı bir chatbot senin özel ürünlerini, politikalarını ve iş bağlamını anlamak zorunda. Bu da RAG (Retrieval-Augmented Generation) gerektirir — yani yapay zekayı yanıt üretmeden önce senin gerçek içeriğinle temellendirir. Farkın tamamı burada saklı.

Açık konuşayım: kötü bir chatbot, hiç chatbot olmamasından beterdir

Teknik detaylara girmeden önce dürüst bir uyarı yapayım, çünkü bu satırı sonradan pişman olmaman için yazıyorum. Bir müşteriye yanlış fiyat söyleyen, olmayan bir iade politikası uyduran ya da stokta olmayan ürünü “hemen gönderelim” diye pazarlayan bir chatbot, sana müşteri kazandırmaz — dava ve itibar kaybı kazandırır. Ben olsam bir chatbotu ancak iki şart sağlandığında canlıya alırdım: bildiği şeyi gerçek içerikten okuyor, bilmediği şeyde ise uydurmak yerine “seni bir insana bağlayayım” diyor.

Bu yüzden aşağıdaki mimaride en önem verdiğim satır, en gösterişsiz olanı: sistem talimatındaki “yalnızca verilen bağlamı kullan, ürün detayı, fiyat veya politika uydurma” cümlesi. Gerisi teknik zanaat; asıl ürünü ayakta tutan o dürüstlük çitidir. Hype tarafına kapılıp bu çiti atlarsan, kurduğun şey akıllı bir asistan değil, hızlı bir yalancı olur.

Mimari Genel Bakış

Customer Message

→ Embed query (vector)

→ Search knowledge base (similarity)

→ Retrieve relevant context (products, policies, FAQ)

→ Send to Claude with context

→ Return answer

→ Log conversation

Temel mantık şu: yapay zeka senin ürün kataloğunu ezberlemiyor. Her müşteri sorusu için içeriğini arar, ilgili parçaları bulur ve yalnızca bulduğu şeye dayanarak bir yanıt üretir. Ezber yok, arama var — halüsinasyona kapıyı bu şekilde kapatıyoruz.

Adım 1: Bilgi Tabanınızı Oluşturun

Chatbotun tam olarak arayabildiği içerik kadar iyidir, bir gram fazlası değil. Şunları çıkar ve yapılandır:

Ürün verileri (WooCommerce’ten):

async function extractProductKnowledge() {

const products = await wooApi.get('products', { per_page: 100 });

return products.data.map(p => ({

type: 'product',

title: p.name,

content: ${p.name}. ${stripHtml(p.description)}. Price: $${p.price}. ${p.stock_status === 'instock' ? 'In stock' : 'Out of stock'}. Categories: ${p.categories.map(c => c.name).join(', ')}.,

metadata: { id: p.id, sku: p.sku, url: p.permalink }

}));

}

Politikalar (kargo, iadeler, SSS sayfaları):

async function extractPolicyPages() {

const pageIds = [123, 456, 789]; // Shipping, Returns, FAQ page IDs

const pages = await Promise.all(

pageIds.map(id => wpApi.get(pages/${id}))

);

return pages.map(p => ({

type: 'policy',

title: p.data.title.rendered,

content: stripHtml(p.data.content.rendered),

metadata: { id: p.data.id, url: p.data.link }

}));

}

Adım 2: Vektör Gömmeleri Oluşturun

Semantik arama için bilgi tabanını vektör gömmelere dönüştür:

const { PineconeClient } = require('@pinecone-database/pinecone');

async function indexKnowledge(documents) {

const pinecone = new PineconeClient();

await pinecone.init({ apiKey: process.env.PINECONE_API_KEY });

const index = pinecone.Index('wordpress-chatbot');

for (const doc of documents) {

// Generate embedding via OpenAI or Voyage AI

const embedding = await generateEmbedding(doc.content);

await index.upsert([{

id: ${doc.type}-${doc.metadata.id},

values: embedding,

metadata: {

type: doc.type,

title: doc.title,

content: doc.content.substring(0, 1000),

url: doc.metadata.url

}

}]);

}

}

Adım 3: Chat Endpoint’i

app.post('/api/chat', async (req, res) => {

const { message, session_id } = req.body;

// 1. Search knowledge base

const queryEmbedding = await generateEmbedding(message);

const searchResults = await pineconeIndex.query({

vector: queryEmbedding,

topK: 5,

includeMetadata: true

});

// 2. Build context from results

const context = searchResults.matches

.map(m => [${m.metadata.type}] ${m.metadata.title}: ${m.metadata.content})

.join('\n\n');

// 3. Get conversation history

const history = await getConversationHistory(session_id);

// 4. Generate response with Claude

const response = await anthropic.messages.create({

model: 'claude-sonnet-4-20250514',

max_tokens: 500,

system: You are a helpful customer service agent for [Store Name].

Answer questions using ONLY the provided context. If the context doesn't contain

the answer, say you'll connect them with a human agent.

Never make up product details, prices, or policies.

Be concise and friendly.

Context:

${context},

messages: [

...history,

{ role: 'user', content: message }

]

});

const answer = response.content[0].text;

// 5. Save to conversation history

await saveMessage(session_id, 'user', message);

await saveMessage(session_id, 'assistant', answer);

res.json({ answer, session_id });

});

Adım 4: Frontend Widget’ı

WordPress shortcode veya eklentisi aracılığıyla gömülen basit chat widget’ı:

class ChatWidget {

constructor(container, apiUrl) {

this.container = container;

this.apiUrl = apiUrl;

this.sessionId = this.getSessionId();

this.render();

}

getSessionId() {

let id = sessionStorage.getItem('chat_session');

if (!id) {

id = crypto.randomUUID();

sessionStorage.setItem('chat_session', id);

}

return id;

}

async sendMessage(message) {

this.addMessage('user', message);

this.showTyping();

const response = await fetch(this.apiUrl, {

method: 'POST',

headers: { 'Content-Type': 'application/json' },

body: JSON.stringify({

message,

session_id: this.sessionId

})

});

const data = await response.json();

this.hideTyping();

this.addMessage('assistant', data.answer);

}

}

Özel Durumların Ele Alınması

Ürün kullanılabilirliği soruları:

Chatbot, önbelleğe alınmış bilgi tabanı verilerine güvenmek yerine WooCommerce API’si aracılığıyla gerçek zamanlı stok kontrol eder.

Fiyat sorguları:

Fiyatı her zaman WooCommerce’ten canlı çek. Vektör veritabanındaki önbelleğe alınmış fiyatlar bayatlamış olabilir — ve yanlış fiyat, chatbotun yapabileceği en pahalı hatadır.

Sipariş durumu:

Sipariş ayrıntılarını göstermeden önce mutlaka kimlik doğrulama iste. Sadece e-posta adresine dayanarak sipariş bilgisi ifşa etme — bu, kolayca kötüye kullanılabilecek bir açık.

İnsan devri:

AI yardım edemediğinde veya müşteri sinirlendiğinde, durumu yükseltin:

const HANDOFF_TRIGGERS = [

'speak to a human', 'real person', 'manager',

'this is not helpful', 'complaint'

];

if (HANDOFF_TRIGGERS.some(t => message.toLowerCase().includes(t))) {

return { answer: "I'll connect you with our team right away.", handoff: true };

}

Başarıyı Ölçme

Şu metrikleri takip et; içlerinden birini gözden kaçırma:

Metrik Hedef
Çözüm oranı (insan gerekmez) > %60
Ortalama yanıt süresi < 3 saniye
Müşteri memnuniyeti (beğen/beğenme) > %80 pozitif
Halüsinasyon oranı (yanlış bilgi) < %2
Devir oranı < %30

Maliyet Değerlendirmeleri

Bileşen Aylık Maliyet (1.000 konuşma)
Claude API $15-30
Pinecone (Starter) $0 (ücretsiz katman)
Embedding API $2-5
Hosting (API sunucusu) $10-20
Toplam ~$30-55/ay

Şimdi bunu 1.000 konuşmayı elle işleyen bir insan temsilciyle karşılaştır: ayda 2.000-4.000 dolar. Matematik ortada — ama unutma, ucuz olması ancak doğru çalıştığında bir kazançtır.

Sonuç

Senin gerçek WordPress/WooCommerce içeriğine dayanan, RAG destekli bir chatbot gerçekten değer üretir — gerçek politikalara dayalı, gerçek ürünler hakkında, gerçek yanıtlar. Teknik yığın (vektör arama + Claude) artık olgun ve uygun fiyatlı. Ama işin anahtarı teknoloji değil veri kalitesi: chatbotun tam olarak ona verdiğin içerik kadar iyidir. Ben olsam abartıya kaçmadan ürünler ve SSS ile başlar, çözüm oranlarını ölçer ve ancak chatbotun yanıtlayamadığı gerçek sorulara bakarak kapsamı büyütürdüm. Küçük başla, kanıtla, sonra genişlet.

Bir yanıt yazın

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir

Close Search Window