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.
Last modified: Ağustos 2, 2026
United States / English
Slovensko / Slovenčina
Canada / Français
Türkiye / Türkçe