تمام RAG سسٹمز جن کو میں نے دیکھا ہے، بشمول اس سائٹ پر ہینڈ بک کردہ، ایک ہی بنیادی مسئلہ ہے۔
یہ نہیں سیکھتا۔
500 دستاویزات جمع کریں۔ آپ ایک سوال پوچھیں۔ سسٹم تین سب سے ملتے جلتے ٹکڑوں کو تلاش کرتا ہے اور انہیں LLM تک پہنچاتا ہے۔ درج ذیل سوالات کے لیے دہرائیں:
سسٹم بالکل اتنا ہی جانتا ہے جتنا اس نے پہلے دن کیا تھا۔ ایک لائبریری جو کارڈ کا کیٹلاگ نہیں بناتی، اپنے شیلف کا حوالہ نہیں دیتی، اور یہ بھی نہیں دیکھتی کہ تین کتابیں متضاد باتیں کہہ رہی ہیں۔
یہ وہی ہے جسے ہم نے علم کی عکاسی پرت کے ساتھ ترمیم کرنے کا فیصلہ کیا ہے۔ تمام مجموعوں کے بعد، سسٹم انڈیکس میں پہلے سے ہی معنوی طور پر متعلقہ دستاویزات تلاش کرتا ہے اور LLM سے نئے مواد کی ترکیب کرنے، ان کو جوڑنے کا طریقہ، اور کوئی بھی باقی ماندہ خلا پیدا کرنے کے لیے کہتا ہے۔ وہ مرکبات تلاش کے نتائج میں شامل، ذخیرہ، اور بہتر کیے گئے ہیں۔
آپ جتنے زیادہ مضامین شامل کریں گے، آپ کے علم کی بنیاد اتنی ہی بہتر ہوتی جائے گی۔ یہ صرف سائز میں اضافہ نہیں کرتا.
یہ ٹیوٹوریل آپ کو دکھاتا ہے کہ اسے کیسے بنایا جائے۔
انڈیکس
-
کیا تعمیر کرنا ہے
-
شرطیں
-
بنیادی نظام کو کیسے ترتیب دیا جائے۔
-
معیاری RAGs میں میموری کے مسائل کیوں ہوتے ہیں۔
-
مرحلہ 1: اپنا سکیما اپ ڈیٹ کریں۔
-
مرحلہ 2: ریفلیکشن انجن
-
مرحلہ 3: انضمام
-
مرحلہ 4: کلیکشن ہینڈلر سے جڑیں۔
-
مرحلہ 5: تلاش میں عکاسی کو بہتر بنائیں
-
مرحلہ 6: doc_type کے لحاظ سے فلٹر کریں۔
-
اس کی تعمیر کے بعد کیا تبدیلیاں آتی ہیں۔
-
تعیناتی
-
آگے کیا بنانا ہے۔
کیا تعمیر کرنا ہے
اس ٹیوٹوریل میں، آپ مندرجہ ذیل مجموعہ اور عکاسی پائپ لائن بناتے ہیں:
-
جب بھی کوئی دستاویز اکٹھا کیا جاتا ہے تو یہ خود بخود چلتا ہے۔
-
سب سے زیادہ معنوی طور پر متعلقہ دستاویزات تلاش کرتا ہے جو انڈیکس میں پہلے سے موجود ہیں۔
-
Kimi K2.5 سے تین جملوں کی بصیرت کی ترکیب کرنے کو کہیں جو ایک نئی دستاویز کو موجودہ علم سے جوڑتی ہے۔
-
عکاسی کی دکان
doc_type=reflectionآپ کی تلاش کے نتائج کی درجہ بندی میں 1.5x بہتری آئے گی۔ -
تینوں مجموعوں میں سے ہر ایک کے مظاہر کو ایک خلاصہ میں یکجا کیا گیا ہے۔
بالآخر، جب آپ نالج بیس کو تلاش کرتے ہیں، تو آپ کو خام دستاویز کے ٹکڑے اور عکاسی کے نمونے نظر آئیں گے جو نظام نے ادخال کے دوران بنائے تھے۔
شرطیں
آپ کو ضرورت ہو گی:
-
Cloudflare اکاؤنٹ – مفت درجے کے کام
-
Node.js v18+ اور Wrangler CLI انسٹال کریں (
npm install -g wrangler) -
بنیادی TypeScript واقفیت
کوئی بیرونی API کلید نہیں ہے۔ سب کچھ Cloudflare کے انفراسٹرکچر پر چلتا ہے۔
بنیادی نظام کو کیسے ترتیب دیا جائے۔
اگر آپ نے پہلے ہی میری فری کوڈ کیمپ ہینڈ بک سے آر اے جی سسٹم بنایا ہے تو اس سیکشن کو چھوڑ دیں۔ نظام عکاس تہوں کو استعمال کرنے کے لیے تیار ہے۔
اگر آپ نئے سرے سے شروعات کر رہے ہیں، تو یہ سیکشن آپ کو تقریباً 15 منٹ میں آپ کے آپریشنز کی بنیاد پر پہنچا دے گا۔
پروجیکٹ سہاروں
npm create cloudflare@latest rag-reflection-system
cd rag-reflection-system
انتخاب: Hello World مثال → TypeScript → ابھی تک کوئی تعیناتی نہیں ہے۔
ویکٹرائزڈ انڈیکس اور D1 ڈیٹا بیس بنائیں
npx wrangler vectorize create rag-index --dimensions=384 --metric=cosine
npx wrangler d1 create rag-db
wrangler.toml کنفیگریشن
name = "rag-reflection-system"
main = "src/index.ts"
compatibility_date = "2026-01-01"
[[vectorize]]
binding = "VECTORIZE"
index_name = "rag-index"
[[d1_databases]]
binding = "DB"
database_name = "rag-db"
database_id = "YOUR_DB_ID"
[ai]
binding = "AI"
نسل documents میز
-- migrations/001_init.sql
CREATE TABLE IF NOT EXISTS documents (
id TEXT PRIMARY KEY,
content TEXT NOT NULL,
source TEXT,
date_created TEXT DEFAULT (datetime('now'))
);
npx wrangler d1 execute rag-db --remote --file=./migrations/001_init.sql
اضافہ ingest اور search اختتامی نقطہ
تبدیلی src/index.ts اس کم سے کم کام کرنے والے نظام کے ساتھ:
export interface Env {
VECTORIZE: VectorizeIndex;
DB: D1Database;
AI: Ai;
}
export default {
async fetch(request: Request, env: Env, ctx: ExecutionContext): Promise {
const url = new URL(request.url);
if (url.pathname === '/ingest' && request.method === 'POST') {
const { id, content, source } = await request.json() as any;
const embResult = await env.AI.run('@cf/baai/bge-small-en-v1.5', {
text: [content.slice(0, 512)],
}) as any;
const vector = embResult.data[0];
await env.VECTORIZE.upsert([{
id,
values: vector,
metadata: { content: content.slice(0, 1000), source, doc_type: 'raw' },
}]);
await env.DB.prepare(
'INSERT OR REPLACE INTO documents (id, content, source) VALUES (?, ?, ?)'
).bind(id, content, source ?? '').run();
return Response.json({ success: true, id });
}
if (url.pathname === '/search' && request.method === 'POST') {
const { query } = await request.json() as any;
const embResult = await env.AI.run('@cf/baai/bge-small-en-v1.5', {
text: [query],
}) as any;
const vector = embResult.data[0];
const results = await env.VECTORIZE.query(vector, {
topK: 5,
returnMetadata: 'all',
});
const context = results.matches
.map(m => m.metadata?.content as string)
.filter(Boolean)
.join('\n\n');
const answer = await env.AI.run('@cf/moonshotai/kimi-k2.5', {
messages: [
{ role: 'system', content: 'Answer using only the context provided.' },
{ role: 'user', content: `Context:\n\({context}\n\nQuestion: \){query}` },
],
max_tokens: 256,
}) as any;
return Response.json({ answer: answer.response, sources: results.matches.map(m => m.id) });
}
return new Response('RAG system running', { status: 200 });
},
};
تعیناتی اور تصدیق
npx wrangler deploy
اسے آزمائیں:
# Ingest a document
curl -X POST https://your-worker.workers.dev/ingest \
-H "Content-Type: application/json" \
-d '{"id": "doc-001", "content": "Cursor pagination beats offset pagination for live-updating datasets because offset becomes unreliable when rows are inserted or deleted during pagination."}'
# Search
curl -X POST https://your-worker.workers.dev/search \
-H "Content-Type: application/json" \
-d '{"query": "what pagination approach should I use?"}'
اگر آپ کو زمینی جواب ملتا ہے تو بنیادی نظام کام کر رہا ہے۔ اگلے حصے میں ہم اس فاؤنڈیشن کے اوپر ایک عکاس تہہ شامل کریں گے۔
معیاری RAGs میں میموری کے مسائل کیوں ہوتے ہیں۔
معیاری RAG تلاشیں بے وطن ہیں۔ تمام سوالات کو ختم کر دیا جائے گا۔ اس نظام کے پاس پچھلی دریافتوں کی کوئی یاد نہیں ہے، اس کی کوئی ترکیب نہیں ہے کہ اس نے تمام دستاویزات میں کیا سیکھا ہے، اور نہ ہی اس بات کی بڑھتی ہوئی سمجھ ہے کہ کن سوالات کا جواب نہیں ملتا۔
فرض کریں کہ آپ نے اپنے پروڈکٹ کے بارے میں 200 دستاویزات جمع کی ہیں۔ ان میں سے بارہ پچھلے سال میں کیے گئے قیمتوں کے فیصلوں کا احاطہ کرتے ہیں۔ پوری تصویر کسی کے پاس نہیں ہے۔ سہ ماہی رپورٹس، میٹنگ منٹس، اندرونی سست برآمدات، چند تصوراتی صفحات پر پھیلی ہوئی ہیں۔
صارفین پوچھتے ہیں، "آپ نے اپنی قیمتوں کا ڈھانچہ کیوں تبدیل کیا؟”
معیاری RAG تین سب سے ملتے جلتے حصوں کو تلاش کرتا ہے۔ یہ بہت اچھا ہوگا اگر ان تینوں حصوں کا اجتماعی طور پر کوئی جواب ہو۔ اگر ایسا نہیں ہے (اگر آپ کو حقیقی جواب حاصل کرنے کے لیے تمام 12 دستاویزات کی ترکیب کرنے کی ضرورت ہے)، تو سسٹم کے پاس اس کے لیے کوئی طریقہ کار نہیں ہے۔ ایک ٹکڑا لوٹاتا ہے۔ ایل ایل ایم اپنا بہترین اندازہ لگاتا ہے۔
عکاس پرتیں اس مسئلے کو براہ راست حل کرتی ہیں۔ ایک بار 12ویں قیمت کا دستاویز اکٹھا کرنے کے بعد، نظام کو 11 متعلقہ دستاویزات مل جاتی ہیں، ان اشیاء کی ترکیب کرتا ہے جو ان سے منسلک ہوتے ہیں، اور اس ترکیب کو تلاش کے قابل نمونے کے طور پر محفوظ کرتے ہیں۔ اس سے پہلے کہ کوئی پوچھے، "ہم نے اپنی قیمتوں کا ڈھانچہ کیوں تبدیل کیا” کا جواب انڈیکس میں موجود ہے۔
یہ ہوشیار تلاش نہیں ہے، یہ ہوشیار اشاریہ سازی ہے۔
مرحلہ 1: اپنا سکیما اپ ڈیٹ کریں۔
عکاسی پرت کو D1 دستاویز کی میز میں دو نئے فیلڈز کی ضرورت ہے۔ درج ذیل منتقلی کو چلائیں:
-- migrations/003_add_reflection_fields.sql
ALTER TABLE documents ADD COLUMN doc_type TEXT DEFAULT 'raw';
ALTER TABLE documents ADD COLUMN reflection_score REAL DEFAULT 0;
ALTER TABLE documents ADD COLUMN parent_reflection_id TEXT;
درخواست دیں:
wrangler d1 execute mcp-knowledge-db --remote --file=./migrations/003_add_reflection_fields.sql
doc_type خام دستاویزات کے درمیان فرق کریں (raw)، واحد دستاویز کی عکاسی (reflection) اور مربوط کثیر عکاسی کا خلاصہ (summary)۔ فلٹر کرنے کے لیے اس فیلڈ کا استعمال کریں۔ یعنی، یا تو صرف ان صارفین کے لیے عکاسی کو ظاہر کریں جو ڈسٹلڈ ویو چاہتے ہیں، یا ان صارفین کی عکاسی کو خارج کردیں جو خام ماخذ کا حصہ چاہتے ہیں۔
مرحلہ 2: ریفلیکشن انجن
بنانا src/engines/reflection.ts. یہ تہوں کی کلید ہے۔
import { Env } from '../types/env';
import { resolveEmbeddingModel, resolveReflectionModel } from '../config/models';
const REFLECTION_BOOST = 1.5;
const CONSOLIDATION_THRESHOLD = 3; // consolidate every N new reflections
export async function reflect(
newDocId: string,
newDocContent: string,
env: Env
): Promise {
// 1. Find semantically related documents already in the index
const embModel = resolveEmbeddingModel(env.EMBEDDING_MODEL);
const embResult = await env.AI.run(embModel.id as any, {
text: [newDocContent.slice(0, 512)],
});
const queryVector = (embResult as any).data?.[0];
if (!queryVector) return;
const related = await env.VECTORIZE.query(queryVector, {
topK: 5,
filter: { doc_type: { $eq: 'raw' } },
returnMetadata: 'all',
});
const relatedDocs = (related.matches ?? []).filter(
m => m.id !== newDocId && (m.score ?? 0) > 0.65
);
if (relatedDocs.length === 0) return; // nothing related yet — skip
// 2. Build synthesis prompt
const relatedSummaries = relatedDocs
.slice(0, 3)
.map((m, i) => `Document \({i + 1}: \){String(m.metadata?.content ?? '').slice(0, 300)}`)
.join('\n\n');
const prompt = `You are synthesising knowledge across documents in a knowledge base.
New document:
${newDocContent.slice(0, 600)}
Related existing documents:
${relatedSummaries}
Write exactly three sentences:
1. What the new document adds that the existing documents don't already cover
2. How the new document connects to or extends the existing documents
3. What gap or question remains unanswered across all these documents
Be specific. Reference actual content. Do not summarise — synthesise.`;
// 3. Call the reflection model
const reflModel = resolveReflectionModel(env.REFLECTION_MODEL);
const llmResp = await env.AI.run(reflModel.id as any, {
messages: [{ role: 'user', content: prompt }],
max_tokens: 180,
});
const reflectionText = (llmResp as any)?.response?.trim();
if (!reflectionText || reflectionText.length < 40) return;
// 4. Embed and store the reflection
const reflEmbResult = await env.AI.run(embModel.id as any, {
text: [reflectionText],
});
const reflVector = (reflEmbResult as any).data?.[0];
if (!reflVector) return;
const reflectionId = `refl_\({newDocId}_\){Date.now()}`;
await env.VECTORIZE.upsert([
{
id: reflectionId,
values: reflVector,
metadata: {
content: reflectionText,
doc_type: 'reflection',
parent_id: newDocId,
reflection_score: REFLECTION_BOOST,
source_doc_ids: relatedDocs.map(m => m.id).join(','),
date_created: new Date().toISOString(),
},
},
]);
await env.DB.prepare(
`INSERT INTO documents
(id, content, doc_type, reflection_score, parent_id, date_created)
VALUES (?, ?, 'reflection', ?, ?, ?)`
)
.bind(reflectionId, reflectionText, REFLECTION_BOOST, newDocId, new Date().toISOString())
.run();
// 5. Check if consolidation is due
const recentCount = await env.DB
.prepare(`SELECT COUNT(*) as cnt FROM documents WHERE doc_type="reflection" AND date_created > datetime('now', '-1 hour')`)
.first<{ cnt: number }>();
if ((recentCount?.cnt ?? 0) >= CONSOLIDATION_THRESHOLD) {
await consolidate(env);
}
}
یہاں دو باتیں قابل توجہ ہیں۔
سب سے پہلے، سیمنٹک حد (score > 0.65) اہم ہے۔ اگر یہ بہت کم ہے تو آپ غیر متعلقہ دستاویزات کو کمپوز کر رہے ہیں۔ اگر یہ بہت زیادہ ہے، تو آپ بمشکل کنکشن تلاش کر پائیں گے۔ 0.65 اس کے ساتھ اچھی طرح کام کرتا ہے: bge-small. آپ اسے استعمال کرتے ہوئے 0.72 تک بڑھا سکتے ہیں: qwen3-0.6b (1024d) وہ جگہ ہے جہاں اسکور کلسٹر زیادہ ہیں۔
فوری ڈھانچہ جان بوجھ کر ہے۔ تینوں جملوں میں سے ہر ایک مخصوص کام انجام دیتا ہے۔ نیا کیا ہے، کیسے جڑنا ہے، اور کیا بچا ہے۔ یہ عکاسی کو برقرار رکھتا ہے، جو تلاش کے لیے مفید ہے۔ آزاد شکل کی ترکیب سے خوبصورت نثر پیدا ہوتا ہے جو اچھی طرح سے تلاش نہیں کرتا ہے۔ یہ ڈھانچہ تلاش کے قابل نمونے تیار کرتا ہے۔
مرحلہ 3: انضمام
جیسے جیسے مظاہر جمع ہوتے ہیں، انہیں اپنی کمپوزٹنگ پرت کی ضرورت ہوتی ہے۔ بصورت دیگر، آپ تجرید کی اعلی سطح پر شور ڈال رہے ہوں گے۔
اس میں شامل کریں src/engines/reflection.ts:
export async function consolidate(env: Env): Promise {
// Fetch recent reflections not yet consolidated
const recent = await env.DB
.prepare(
`SELECT id, content FROM documents
WHERE doc_type="reflection"
AND id NOT IN (
SELECT DISTINCT parent_id FROM documents
WHERE doc_type="summary" AND parent_id IS NOT NULL
)
ORDER BY date_created DESC
LIMIT 6`
)
.all<{ id: string; content: string }>();
if (!recent.results || recent.results.length < CONSOLIDATION_THRESHOLD) return;
const reflectionTexts = recent.results.map((r, i) => `Reflection \({i + 1}: \){r.content}`).join('\n\n');
const prompt = `You are consolidating multiple knowledge reflections into a single compressed insight.
${reflectionTexts}
Write two to three sentences that capture the most important cross-cutting pattern or tension across these reflections. What does the knowledge base now understand that it didn't before these documents were added? What's the most important open question?
Be precise. No preamble.`;
const reflModel = resolveReflectionModel(env.REFLECTION_MODEL);
const llmResp = await env.AI.run(reflModel.id as any, {
messages: [{ role: 'user', content: prompt }],
max_tokens: 320,
});
const summaryText = (llmResp as any)?.response?.trim();
if (!summaryText || summaryText.length < 40) return;
const embModel = resolveEmbeddingModel(env.EMBEDDING_MODEL);
const embResult = await env.AI.run(embModel.id as any, { text: [summaryText] });
const summaryVector = (embResult as any).data?.[0];
if (!summaryVector) return;
const summaryId = `summary_${Date.now()}`;
await env.VECTORIZE.upsert([
{
id: summaryId,
values: summaryVector,
metadata: {
content: summaryText,
doc_type: 'summary',
reflection_score: REFLECTION_BOOST * 1.2,
source_reflection_ids: recent.results.map(r => r.id).join(','),
date_created: new Date().toISOString(),
},
},
]);
await env.DB.prepare(
`INSERT INTO documents (id, content, doc_type, reflection_score, date_created)
VALUES (?, ?, 'summary', ?, ?)`
)
.bind(summaryId, summaryText, REFLECTION_BOOST * 1.2, new Date().toISOString())
.run();
}
خلاصہ بیس ریفلیکس بوسٹ کے اوپر 1.2x ضرب حاصل کرتا ہے۔ تلاش کے نتائج میں، 12 متعلقہ دستاویزات کا خلاصہ وسیع تصور کے استفسار میں کسی ایک دستاویز کے حصے سے بہتر درجہ بندی کرنا چاہیے۔ کچھ حقائق کے سوالات کے لیے، خام حصہ زیادہ اسکور کرتا ہے۔ درجہ بندی خود ترتیب دیں گے۔
مرحلہ 4: کلیکشن ہینڈلر سے جڑیں۔
عکاسی ایک پس منظر کے کام کے طور پر چلتا ہے۔ جمع کرنے کے جوابات کو مسدود نہیں کرتا ہے۔ اس کا مطلب ہے کہ ہر کلیکشن کال میں 2 سے 3 سیکنڈ کا اضافہ ہوتا ہے۔
آپ کا src/handlers/ingest.tsدستاویز کو محفوظ کرنے کے بعد:
import { reflect } from '../engines/reflection';
// ... existing ingest logic ...
// After VECTORIZE.upsert() and DB insert succeed:
ctx.waitUntil(
reflect(documentId, content, env).catch(err => {
console.warn('[reflection] failed for', documentId, err.message);
})
);
return new Response(JSON.stringify({
success: true,
documentId,
chunks: chunkCount,
// ... rest of response
}), { headers: { 'Content-Type': 'application/json' } });
ctx.waitUntil() پس منظر کے کاموں کے لیے کلاؤڈ فلیئر ورکرز پرائمیٹوز۔ ایک جواب فوری طور پر واپس آ جاتا ہے۔ عکاسی سنبھال لیتی ہے۔ ادخال API تیز رہتا ہے۔
کہ .catch() یہ ضروری ہے۔ ایک ناکام عکاسی جمع کرنے میں ناکام نہیں ہونا چاہئے۔ خام دستاویزات سچائی کا ذریعہ ہیں۔ عکاسی اخذ کردہ اقدار ہیں۔ مفید، لیکن ایک اہم راستہ نہیں.
مرحلہ 5: تلاش میں عکاسی کو بہتر بنائیں
اپنی درجہ بندی کی منطق میں عکاسی میں اضافہ شامل کریں۔ src/engines/hybrid.ts. RRF فیوژن کے بعد اور نتائج واپس آنے سے پہلے:
// Apply reflection boost
const boosted = results.map(r => ({
...r,
score: r.doc_type === 'reflection' || r.doc_type === 'summary'
? r.score * (r.reflection_score ?? 1.5)
: r.score,
}));
return boosted.sort((a, b) => b.score - a.score);
یہ پوسٹ فیوژن بوسٹ ہے، پری فیوژن رینک نہیں۔ انفرنس: ہم سب سے پہلے RRF کو تمام نتائج پر لاگو کرتے ہیں تاکہ عکاسی کو بہتر بنایا جائے اس سے پہلے کہ خام مطابقت پر پوزیشن حاصل کی جائے۔ مظاہر جو خام مماثلت کے لحاظ سے ٹاپ 20 میں نہیں ہیں صرف اس وجہ سے ظاہر نہیں ہونے چاہئیں کہ ان میں بوسٹ ضرب ہے۔
مرحلہ 6: فلٹرنگ کا معیار doc_type
تلاش کے اختتامی نقطہ کو اجازت دینی چاہیے: doc_type فلٹر کریں تاکہ کال کرنے والے کنٹرول کر سکیں کہ وہ کیا دیکھتے ہیں۔
// In your search request handler:
const docTypeFilter = body.filters?.doc_type;
// Pass to Vectorize query:
const vectorFilter: Record = {};
if (docTypeFilter) {
vectorFilter.doc_type = docTypeFilter;
}
یہ بھیجنے والے کو تین طریقوں کی پیشکش کرتا ہے:
# Only reflections and summaries
POST /search
{ "query": "pricing decisions", "filters": { "doc_type": { "$in": ["reflection", "summary"] } } }
# Only source documents
POST /search
{ "query": "pricing decisions", "filters": { "doc_type": { "$eq": "raw" } } }
# Default: all types, reflections boosted
POST /search
{ "query": "pricing decisions" }
پہلے سے طے شدہ (کوئی فلٹر نہیں) سب سے زیادہ مفید ہے۔ فروغ کو اپنا کام کرنے دیں۔ اگر اقتباسات ضروری ہوں تو براہ کرم انہیں اصل تک محدود رکھیں۔ اگر آپ ایک جامع منظر چاہتے ہیں، تو اسے مظاہر تک محدود رکھیں۔
اس کی تعمیر کے بعد کیا تبدیلیاں آتی ہیں۔
200 دستاویزات کے ساتھ، فرق نمایاں ہے۔ ایک استفسار جس نے پہلے پانچ بکھرے ہوئے ٹکڑوں کو واپس کیا تھا اب ایک عکاسی ظاہر کرتا ہے جس نے پہلے ہی ان ٹکڑوں کو مرکب کیا ہے۔ وسیع تصوراتی سوال – "ہم X کے بارے میں کیا جانتے ہیں؟” – سب سے زیادہ ملتے جلتے انفرادی پیراگراف کی بجائے واقعی مفید خلاصے واپس کرنا شروع کرتا ہے۔
2,000 دستاویزات کے ساتھ، عکاسی پرت نظام کا سب سے اہم حصہ ہے۔ خام ٹکڑے مخصوص حقائق پر مبنی سوالات کے جوابات دیتے ہیں۔ عکاسی اور خلاصے تصوراتی سوالات کے جوابات دیتے ہیں جن کا جواب کسی ایک دستاویز میں نہیں دیا جا سکتا۔ سسٹم نے ایسا مواد سیکھا جو انفرادی دستاویزات میں موجود نہیں تھا۔
ایک ناکامی موڈ جس کے بارے میں آپ کو آگاہ ہونا ضروری ہے: جب آپ کے ایمبیڈنگ ماڈل میں کلسٹرنگ کے خراب مضمرات ہوتے ہیں – پرانا bge-small مخلوط ڈومین دستاویزات کے 384d میں متعلقہ دستاویز کی بازیافت کا مرحلہ کمزور رابطوں کو ظاہر کرتا ہے اور کم عکاسی پیدا کرتا ہے۔ 0.65 کی حد اس میں سے بیشتر کو فلٹر کر دے گی، لیکن اگر آپ موضوع سے ہٹ کر عکاسی دیکھتے ہیں، تو ایمبیڈنگ پہلی چیز ہونی چاہیے جسے آپ چیک کرتے ہیں۔
تعیناتی
wrangler d1 execute mcp-knowledge-db --remote --file=./migrations/003_add_reflection_fields.sql
wrangler deploy
پھر کچھ دستاویزات جمع کریں اور دیکھیں کہ کیا ہوتا ہے۔
# Ingest document 1
curl -X POST https://your-worker.workers.dev/ingest \
-H "Authorization: Bearer YOUR_KEY" \
-H "Content-Type: application/json" \
-d '{"id": "doc-001", "content": "Your document text here..."}'
# After a few seconds, check if a reflection was created
curl "https://your-worker.workers.dev/search" \
-H "Authorization: Bearer YOUR_KEY" \
-H "Content-Type: application/json" \
-d '{"query": "your topic", "filters": {"doc_type": {"$eq": "reflection"}}}'
عکاسی اس وقت تک ظاہر نہیں ہوتی جب تک کہ جامع کرنے کے لیے کوئی متعلقہ دستاویز نہ ہو۔ ایک جیسے موضوعات پر مضامین دیکھنے سے پہلے کم از کم تین مضامین جمع کرنے کی کوشش کریں۔
آگے کیا بنانا ہے۔
یہاں بیان کردہ عکاسی پرت ہر حصول کے بعد چلتی ہے۔ بڑے مجموعے مہنگے ہو سکتے ہیں۔ اگر میں بیچوں میں 10,000 دستاویزات لا رہا ہوں، تو میں 10,000 انفرادی عکاسی کالز نہیں چاہتا ہوں۔
بلک جمع کرنے کے لیے، گیٹ پروسیسنگ: کال کریں۔ reflect() یہ صرف اس صورت میں لاگو ہوتا ہے جب دستاویز کی مماثلت تلاش کی واپسی 0.8 سے زیادہ یا اس کے برابر ہوتی ہے، یا اگر بلک امپورٹ مکمل ہونے کے بعد بیچ کے عمل کی عکاسی واپس آتی ہے۔ کہ POST /ingest/batch پورے ذخیرے کا اختتامی نقطہ یہ کرتا ہے۔
تعمیر کرنے کے قابل دوسری چیز بصری امتیاز کے ذریعہ UI میں عکاسی کو بیرونی بنانا ہے۔ عکاسی شدہ تلاش کے نتائج خام حصوں سے مختلف نظر آنے چاہئیں۔ ریپوزٹری میں موجود ڈیش بورڈ پر ریفلیکشن ہے۔ 💡 بیج اور "N دستاویزات سے ترکیب شدہ” نوٹ۔
github.com/dannwaneri/Vectorize-mcp-worker پر مکمل ماخذ — ریفلیکشن انجن، انٹیگریشنز، بیچ کلیکشن، ڈیش بورڈ، اوپن اے پی آئی اسپیک۔
کوڈبیس TypeScript ہے اور اسے واحد کے طور پر تقسیم کیا جاتا ہے۔ wrangler deployروزانہ 10,000 سوالات پر کارروائی کرتے وقت یہ تقریباً $1-$5 ماہانہ چلتا ہے۔
معیاری RAG تلاش۔ یہ سیکھا ہے۔