بناء وكيل ذكاء اصطناعي مستقل باستخدام Agentic RAG و Next.js

أنظمة RAG التقليدية تتبع نمطاً خطياً: يُدخل المستخدم سؤالاً، يُبحث في قاعدة البيانات، ثم يُولَّد الجواب. لكن ماذا لو أردت وكيلاً ذكياً يقرر بنفسه متى يحتاج للبحث، وفي أي مصدر، وهل يحتاج لمزيد من السياق؟
هذا هو Agentic RAG — النموذج الذي يحوّل الذكاء الاصطناعي من مجرد مُجيب إلى وكيل مستقل يفكر ويتصرف ويتعلم من نتائجه.
لماذا Agentic RAG في 2026؟ مع تزايد اعتماد الشركات على وكلاء الذكاء الاصطناعي، أصبح النمط الوكيلي (Agentic) هو المعيار الجديد. بدلاً من خطوط أنابيب ثابتة، يقرر الوكيل بذكاء متى يستخدم كل أداة.
ما ستتعلمه
بنهاية هذا الدرس، ستكون قادراً على:
- فهم الفرق بين RAG التقليدي و Agentic RAG
- بناء وكيل ذكاء اصطناعي مع أدوات متعددة باستخدام
ToolLoopAgent - تنفيذ بحث متجهي كأداة يستدعيها الوكيل بشكل مستقل
- إضافة أدوات حسابية وتحليلية يختار الوكيل استخدامها
- ربط كل شيء بواجهة محادثة في Next.js
- فهم أنماط التصميم للوكلاء في بيئات الإنتاج
ما الفرق بين RAG التقليدي و Agentic RAG؟
RAG التقليدي
سؤال المستخدم → بحث في قاعدة البيانات → توليد الإجابة
في هذا النمط، يتم البحث دائماً بغض النظر عن طبيعة السؤال. إذا سأل المستخدم "مرحباً، كيف حالك؟" سيبحث النظام في قاعدة البيانات بلا فائدة.
Agentic RAG
سؤال المستخدم → الوكيل يفكر → يقرر: هل أحتاج للبحث؟
↓ نعم ↓ لا
يبحث في المصدر يجيب مباشرة
المناسب
↓
هل أحتاج معلومات إضافية؟
↓ نعم
يبحث مرة أخرى أو يستخدم أداة أخرى
↓
يولّد الإجابة النهائية
الوكيل يتخذ قرارات ذكية في كل خطوة:
- متى يبحث: فقط عندما يحتاج لمعلومات خارجية
- أين يبحث: يختار المصدر المناسب من بين عدة مصادر
- كم مرة يبحث: يمكنه إجراء عدة عمليات بحث متتالية
- ماذا يفعل بالنتائج: يحلل، يقارن، يحسب، ثم يجيب
المتطلبات الأساسية
قبل البدء، تأكد من توفر:
- Node.js 20+ مثبت على جهازك
- مفتاح OpenAI API مع وصول إلى نماذج
gpt-4oوtext-embedding-3-small - معرفة أساسية بـ TypeScript و React
- إلمام بـ Next.js App Router
- محرر كود (VS Code موصى به)
ملاحظة: سنستخدم قاعدة بيانات متجهية في الذاكرة (in-memory) لتبسيط الدرس. في بيئة الإنتاج، استبدلها بـ Supabase pgvector أو Pinecone أو أي قاعدة بيانات متجهية أخرى.
الخطوة 1: إعداد المشروع
ابدأ بإنشاء مشروع Next.js جديد مع الاعتماديات المطلوبة:
npx create-next-app@latest agentic-rag-demo --typescript --tailwind --app --src-dir
cd agentic-rag-demoثبّت حزم AI SDK والأدوات المساعدة:
npm install ai @ai-sdk/openai zodأنشئ ملف .env.local لتخزين مفتاح API:
OPENAI_API_KEY=sk-your-api-key-hereالخطوة 2: بناء قاعدة المعرفة المتجهية
أولاً، سننشئ طبقة بسيطة لقاعدة البيانات المتجهية. أنشئ ملف src/lib/vector-store.ts:
import { embed, embedMany, cosineSimilarity } from "ai";
// نوع المستند المخزّن
interface Document {
id: string;
content: string;
embedding: number[];
metadata: {
source: string;
category: string;
};
}
// قاعدة البيانات المتجهية في الذاكرة
class VectorStore {
private documents: Document[] = [];
// إضافة مستندات مع توليد التضمينات
async addDocuments(
docs: { content: string; metadata: { source: string; category: string } }[]
) {
const { embeddings } = await embedMany({
model: "openai/text-embedding-3-small",
values: docs.map((d) => d.content),
});
const newDocs: Document[] = docs.map((doc, i) => ({
id: `doc-${Date.now()}-${i}`,
content: doc.content,
embedding: embeddings[i],
metadata: doc.metadata,
}));
this.documents.push(...newDocs);
return newDocs.length;
}
// بحث دلالي بالتشابه
async search(query: string, topK: number = 3): Promise<Document[]> {
const { embedding } = await embed({
model: "openai/text-embedding-3-small",
value: query,
});
const results = this.documents
.map((doc) => ({
...doc,
similarity: cosineSimilarity(embedding, doc.embedding),
}))
.sort((a, b) => b.similarity - a.similarity)
.slice(0, topK);
return results;
}
// بحث مع تصفية حسب التصنيف
async searchByCategory(
query: string,
category: string,
topK: number = 3
): Promise<Document[]> {
const { embedding } = await embed({
model: "openai/text-embedding-3-small",
value: query,
});
const results = this.documents
.filter((doc) => doc.metadata.category === category)
.map((doc) => ({
...doc,
similarity: cosineSimilarity(embedding, doc.embedding),
}))
.sort((a, b) => b.similarity - a.similarity)
.slice(0, topK);
return results;
}
// الحصول على التصنيفات المتاحة
getCategories(): string[] {
return [...new Set(this.documents.map((d) => d.metadata.category))];
}
get size(): number {
return this.documents.length;
}
}
// نسخة واحدة مشتركة (Singleton)
export const vectorStore = new VectorStore();الخطوة 3: ملء قاعدة المعرفة ببيانات تجريبية
أنشئ ملف src/lib/seed-data.ts لملء القاعدة ببيانات شركة افتراضية:
import { vectorStore } from "./vector-store";
export async function seedVectorStore() {
// تحقق من أن القاعدة غير مملوءة مسبقاً
if (vectorStore.size > 0) return;
const documents = [
// سياسات الشركة
{
content:
"سياسة الاسترجاع: يمكن للعملاء استرجاع المنتجات خلال 30 يوماً من تاريخ الشراء بشرط أن يكون المنتج في حالته الأصلية مع الفاتورة. يتم رد المبلغ خلال 5-7 أيام عمل إلى نفس طريقة الدفع الأصلية.",
metadata: { source: "company-policies", category: "سياسات" },
},
{
content:
"سياسة الشحن: التوصيل المجاني للطلبات فوق 200 دينار. التوصيل العادي يستغرق 3-5 أيام عمل بتكلفة 7 دنانير. التوصيل السريع خلال 24 ساعة متاح بتكلفة 15 دينار.",
metadata: { source: "company-policies", category: "سياسات" },
},
{
content:
"سياسة الضمان: جميع المنتجات الإلكترونية مشمولة بضمان سنة كاملة ضد عيوب التصنيع. لا يشمل الضمان الأضرار الناتجة عن سوء الاستخدام أو الحوادث.",
metadata: { source: "company-policies", category: "سياسات" },
},
// معلومات المنتجات
{
content:
"لابتوب ProBook X1: معالج Intel Core i7 الجيل الرابع عشر، 16 جيجا رام، 512 جيجا SSD، شاشة 14 بوصة FHD. السعر: 2,500 دينار. متوفر بالألوان: فضي، رمادي غامق.",
metadata: { source: "product-catalog", category: "منتجات" },
},
{
content:
"لابتوب ProBook X2: معالج Apple M3 Pro، 18 جيجا رام، 1 تيرا SSD، شاشة 16 بوصة Liquid Retina. السعر: 4,200 دينار. متوفر بالألوان: فضي، أسود كوني.",
metadata: { source: "product-catalog", category: "منتجات" },
},
{
content:
"سماعات AirSound Pro: إلغاء ضوضاء نشط، بلوتوث 5.3، عمر بطارية 30 ساعة، مقاومة للماء IPX5. السعر: 350 دينار.",
metadata: { source: "product-catalog", category: "منتجات" },
},
{
content:
"شاشة UltraView 27: شاشة 27 بوصة 4K HDR، معدل تحديث 144Hz، دعم USB-C، حامل قابل للتعديل. السعر: 1,800 دينار.",
metadata: { source: "product-catalog", category: "منتجات" },
},
// الأسئلة الشائعة
{
content:
"كيف أتابع طلبي؟ يمكنك تتبع حالة طلبك عبر صفحة 'طلباتي' في حسابك، أو عبر رابط التتبع المرسل إلى بريدك الإلكتروني عند شحن الطلب.",
metadata: { source: "faq", category: "دعم" },
},
{
content:
"طرق الدفع المتاحة: بطاقة ائتمان (Visa, Mastercard)، تحويل بنكي، الدفع عند الاستلام (متاح فقط داخل تونس الكبرى)، فلوسي (Flouci).",
metadata: { source: "faq", category: "دعم" },
},
{
content:
"ساعات عمل خدمة العملاء: من الاثنين إلى الجمعة، 9 صباحاً - 6 مساءً. السبت 9 صباحاً - 1 ظهراً. يمكن التواصل عبر الهاتف، البريد الإلكتروني، أو المحادثة المباشرة.",
metadata: { source: "faq", category: "دعم" },
},
];
await vectorStore.addDocuments(documents);
console.log(`تم تحميل ${vectorStore.size} مستند في قاعدة المعرفة`);
}الخطوة 4: بناء الوكيل مع أدواته
هنا يأتي الجزء الأهم. سننشئ الوكيل الذي يمتلك عدة أدوات ويقرر بنفسه أيها يستخدم. أنشئ ملف src/lib/agent.ts:
import { ToolLoopAgent, tool, streamText, generateText } from "ai";
import { openai } from "@ai-sdk/openai";
import { z } from "zod";
import { vectorStore } from "./vector-store";
// أداة 1: البحث في قاعدة المعرفة
const searchKnowledgeBase = tool({
description:
"البحث في قاعدة معرفة الشركة عن معلومات حول المنتجات والسياسات والدعم. استخدم هذه الأداة عندما يسأل المستخدم عن منتج أو سياسة أو يحتاج مساعدة تقنية.",
inputSchema: z.object({
query: z
.string()
.describe("نص البحث - سؤال أو كلمات مفتاحية للبحث عنها"),
category: z
.enum(["منتجات", "سياسات", "دعم"])
.optional()
.describe("تصنيف البحث لتضييق النتائج"),
}),
execute: async ({ query, category }) => {
const results = category
? await vectorStore.searchByCategory(query, category)
: await vectorStore.search(query);
if (results.length === 0) {
return { found: false, message: "لم يتم العثور على نتائج مطابقة." };
}
return {
found: true,
results: results.map((r) => ({
content: r.content,
source: r.metadata.source,
category: r.metadata.category,
})),
};
},
});
// أداة 2: الآلة الحاسبة
const calculator = tool({
description:
"حساب تعبيرات رياضية. استخدم هذه الأداة لحساب الأسعار والخصومات والضرائب وتكاليف الشحن.",
inputSchema: z.object({
expression: z.string().describe("التعبير الرياضي المراد حسابه"),
context: z
.string()
.optional()
.describe("سياق الحساب لتوضيح النتيجة"),
}),
execute: async ({ expression, context }) => {
try {
// حساب آمن للتعبيرات الرياضية البسيطة
const sanitized = expression.replace(/[^0-9+\-*/().% ]/g, "");
const result = Function(`"use strict"; return (${sanitized})`)();
return {
expression: sanitized,
result: Number(result.toFixed(2)),
context: context || "نتيجة الحساب",
};
} catch {
return { error: "تعبير رياضي غير صالح", expression };
}
},
});
// أداة 3: مقارنة المنتجات
const compareProducts = tool({
description:
"مقارنة منتجين أو أكثر جنباً إلى جنب. استخدم هذه الأداة عندما يطلب المستخدم مقارنة بين منتجات.",
inputSchema: z.object({
productNames: z
.array(z.string())
.min(2)
.describe("أسماء المنتجات المراد مقارنتها"),
}),
execute: async ({ productNames }) => {
const results = [];
for (const name of productNames) {
const searchResults = await vectorStore.searchByCategory(
name,
"منتجات",
1
);
if (searchResults.length > 0) {
results.push({
name,
details: searchResults[0].content,
});
}
}
return {
productsFound: results.length,
comparison: results,
};
},
});
// أداة 4: الحصول على التصنيفات المتاحة
const getAvailableCategories = tool({
description:
"الحصول على قائمة التصنيفات المتاحة في قاعدة المعرفة. استخدم هذه الأداة لمعرفة أنواع المعلومات المتوفرة.",
inputSchema: z.object({}),
execute: async () => {
return {
categories: vectorStore.getCategories(),
totalDocuments: vectorStore.size,
};
},
});
// تعريف تعليمات الوكيل
const AGENT_INSTRUCTIONS = `أنت مساعد ذكي لشركة تقنية تونسية. تتحدث باللغة العربية بأسلوب مهني وودود.
قواعد سلوكك:
1. عندما يسأل المستخدم عن منتج أو سياسة أو دعم، استخدم أداة البحث في قاعدة المعرفة.
2. إذا كان السؤال يتطلب حساباً (أسعار، خصومات، تكاليف شحن)، استخدم الآلة الحاسبة.
3. إذا طُلبت مقارنة بين منتجات، استخدم أداة المقارنة.
4. للأسئلة العامة مثل التحية أو المحادثات اليومية، أجب مباشرة بدون استخدام أي أداة.
5. إذا لم تجد معلومات كافية، أخبر المستخدم بصراحة واقترح التواصل مع خدمة العملاء.
6. يمكنك استخدام عدة أدوات في نفس المحادثة إذا كان ذلك ضرورياً.
7. الأسعار بالدينار التونسي (TND).
أسلوب الإجابة:
- كن مختصراً ومفيداً
- استخدم التنسيق المناسب (قوائم، أرقام) لتنظيم المعلومات
- اذكر المصدر عند الاقتباس من قاعدة المعرفة`;
// إنشاء الوكيل
export const supportAgent = new ToolLoopAgent({
model: openai("gpt-4o"),
system: AGENT_INSTRUCTIONS,
tools: {
searchKnowledgeBase,
calculator,
compareProducts,
getAvailableCategories,
},
});لاحظ الفرق الجوهري: في RAG التقليدي، كنت ستبحث في قاعدة البيانات مع كل رسالة. هنا، الوكيل يقرر بذكاء: هل هذا السؤال يحتاج للبحث أم يمكنني الإجابة مباشرة؟
الخطوة 5: بناء نقطة نهاية API
أنشئ ملف src/app/api/chat/route.ts لمعالجة الطلبات:
import { supportAgent } from "@/lib/agent";
import { seedVectorStore } from "@/lib/seed-data";
// ملء قاعدة المعرفة عند أول طلب
let isSeeded = false;
export async function POST(req: Request) {
if (!isSeeded) {
await seedVectorStore();
isSeeded = true;
}
const { messages } = await req.json();
const result = await supportAgent.stream({
messages,
});
return result.toDataStreamResponse();
}الخطوة 6: بناء واجهة المحادثة
أنشئ ملف src/app/page.tsx لواجهة المستخدم:
"use client";
import { useChat } from "@ai-sdk/react";
import { useState } from "react";
export default function ChatPage() {
const { messages, input, handleInputChange, handleSubmit, isLoading } =
useChat({
api: "/api/chat",
});
// أمثلة على أسئلة يمكن تجربتها
const exampleQuestions = [
"ما هي سياسة الاسترجاع؟",
"قارن بين ProBook X1 و ProBook X2",
"كم سيكلفني ProBook X1 مع الشحن السريع؟",
"مرحباً، كيف حالك؟",
];
return (
<div
className="flex flex-col h-screen bg-gray-50"
dir="rtl"
>
{/* العنوان */}
<header className="bg-white border-b px-6 py-4">
<h1 className="text-xl font-bold text-gray-800">
🤖 مساعد Agentic RAG
</h1>
<p className="text-sm text-gray-500">
وكيل ذكي يقرر بنفسه متى وكيف يبحث عن المعلومات
</p>
</header>
{/* منطقة الرسائل */}
<div className="flex-1 overflow-y-auto p-6 space-y-4">
{messages.length === 0 && (
<div className="text-center py-12">
<h2 className="text-lg font-semibold text-gray-600 mb-4">
جرّب أحد هذه الأسئلة:
</h2>
<div className="flex flex-wrap justify-center gap-2">
{exampleQuestions.map((q, i) => (
<button
key={i}
onClick={() => {
handleInputChange({
target: { value: q },
} as React.ChangeEvent<HTMLInputElement>);
}}
className="bg-white border rounded-full px-4 py-2 text-sm
text-gray-700 hover:bg-blue-50 hover:border-blue-300
transition-colors"
>
{q}
</button>
))}
</div>
</div>
)}
{messages.map((message) => (
<div
key={message.id}
className={`flex ${
message.role === "user" ? "justify-start" : "justify-end"
}`}
>
<div
className={`max-w-[80%] rounded-2xl px-4 py-3 ${
message.role === "user"
? "bg-blue-600 text-white"
: "bg-white border text-gray-800"
}`}
>
<div className="whitespace-pre-wrap">{message.content}</div>
{/* عرض استدعاءات الأدوات */}
{message.toolInvocations &&
message.toolInvocations.length > 0 && (
<div className="mt-2 pt-2 border-t border-gray-200">
{message.toolInvocations.map((tool, i) => (
<div
key={i}
className="text-xs text-gray-400 flex items-center gap-1"
>
<span>🔧</span>
<span>استخدم: {tool.toolName}</span>
</div>
))}
</div>
)}
</div>
</div>
))}
{isLoading && (
<div className="flex justify-end">
<div className="bg-white border rounded-2xl px-4 py-3 text-gray-400">
يفكر...
</div>
</div>
)}
</div>
{/* حقل الإدخال */}
<form
onSubmit={handleSubmit}
className="border-t bg-white p-4"
>
<div className="flex gap-2 max-w-4xl mx-auto">
<input
value={input}
onChange={handleInputChange}
placeholder="اكتب سؤالك هنا..."
className="flex-1 border rounded-xl px-4 py-3 focus:outline-none
focus:ring-2 focus:ring-blue-500"
disabled={isLoading}
/>
<button
type="submit"
disabled={isLoading || !input.trim()}
className="bg-blue-600 text-white rounded-xl px-6 py-3
hover:bg-blue-700 disabled:opacity-50 transition-colors"
>
إرسال
</button>
</div>
</form>
</div>
);
}الخطوة 7: تشغيل التطبيق واختباره
شغّل خادم التطوير:
npm run devافتح المتصفح على http://localhost:3000 وجرّب هذه السيناريوهات:
سيناريو 1: سؤال يتطلب بحثاً
المستخدم: ما هي سياسة الاسترجاع؟
الوكيل (يستخدم أداة searchKnowledgeBase): يمكنك استرجاع المنتجات خلال 30 يوماً من تاريخ الشراء بشرط أن يكون المنتج في حالته الأصلية مع الفاتورة...
سيناريو 2: سؤال لا يتطلب بحثاً
المستخدم: مرحباً، كيف حالك؟
الوكيل (يجيب مباشرة بدون أدوات): مرحباً! أنا بخير، شكراً لسؤالك. كيف يمكنني مساعدتك اليوم؟
سيناريو 3: سؤال يتطلب أدوات متعددة
المستخدم: كم سيكلفني ProBook X1 مع خصم 10% وتوصيل سريع؟
الوكيل (يستخدم searchKnowledgeBase ثم calculator):
- سعر ProBook X1: 2,500 دينار
- الخصم (10%): -250 دينار
- الشحن السريع: +15 دينار
- الإجمالي: 2,265 دينار
سيناريو 4: مقارنة بين منتجات
المستخدم: قارن بين ProBook X1 و ProBook X2
الوكيل (يستخدم compareProducts): يقدم جدول مقارنة تفصيلي...
الخطوة 8: أنماط متقدمة للإنتاج
نمط 1: إضافة ذاكرة للمحادثة
في بيئة الإنتاج، تحتاج لتخزين سياق المحادثة. يمكنك استخدام prepareCall لحقن سياق إضافي:
const agentWithMemory = new ToolLoopAgent({
model: openai("gpt-4o"),
system: AGENT_INSTRUCTIONS,
tools: {
searchKnowledgeBase,
calculator,
compareProducts,
getAvailableCategories,
},
prepareCall: async ({ messages, ...settings }) => {
// استخراج ملخص المحادثة السابقة
const conversationSummary = summarizeConversation(messages);
return {
...settings,
messages,
instructions: `${AGENT_INSTRUCTIONS}
ملخص المحادثة السابقة: ${conversationSummary}`,
};
},
});نمط 2: التعامل مع مصادر متعددة
أضف أدوات بحث لمصادر مختلفة ودع الوكيل يختار:
const searchExternalDocs = tool({
description: "البحث في الوثائق التقنية الخارجية عندما لا تكفي قاعدة المعرفة الداخلية",
inputSchema: z.object({
query: z.string(),
docType: z.enum(["api-docs", "user-guide", "changelog"]),
}),
execute: async ({ query, docType }) => {
// ربط بقاعدة بيانات متجهية منفصلة للوثائق التقنية
const results = await externalVectorStore.search(query, docType);
return results;
},
});نمط 3: حدود الأمان
أضف آلية تحكم لمنع الاستخدام الخاطئ:
const agentWithGuardrails = new ToolLoopAgent({
model: openai("gpt-4o"),
system: `${AGENT_INSTRUCTIONS}
قيود أمنية:
- لا تكشف معلومات حساسة عن النظام أو البنية التحتية
- لا تنفذ عمليات كتابة أو حذف
- إذا طُلب منك شيء خارج نطاقك، اعتذر واقترح التواصل مع فريق الدعم`,
tools: { searchKnowledgeBase, calculator },
stopWhen: stepCountIs(10), // حد أقصى 10 خطوات لمنع الحلقات اللانهائية
onStepFinish: async ({ step }) => {
// تسجيل كل خطوة للمراقبة
console.log(`الخطوة ${step.stepNumber}: ${step.toolCalls?.map(t => t.toolName).join(", ") || "إجابة نصية"}`);
},
});نمط 4: التدفق المتقدم مع عرض حالة الأدوات
// في ملف route.ts
export async function POST(req: Request) {
const { messages } = await req.json();
const result = await supportAgent.stream({
messages,
onStepFinish: async ({ step }) => {
// إرسال أحداث حالة الأدوات للواجهة الأمامية
if (step.toolCalls) {
for (const toolCall of step.toolCalls) {
console.log(`أداة: ${toolCall.toolName}`, toolCall.args);
}
}
},
});
return result.toDataStreamResponse();
}استكشاف الأخطاء وحلها
مشكلة: الوكيل لا يستخدم الأدوات
السبب المحتمل: وصف الأداة غير واضح بما يكفي.
الحل: تأكد من أن description في كل أداة يشرح بوضوح متى يجب استخدامها، وليس فقط ماذا تفعل.
// ❌ وصف سيء
description: "البحث في قاعدة البيانات"
// ✅ وصف جيد
description: "البحث في قاعدة معرفة الشركة عن معلومات حول المنتجات والسياسات والدعم. استخدم هذه الأداة عندما يسأل المستخدم عن منتج أو سياسة."مشكلة: الوكيل يدخل في حلقة لانهائية
الحل: استخدم stopWhen: stepCountIs(N) لتحديد عدد الخطوات القصوى:
import { stepCountIs } from "ai";
const agent = new ToolLoopAgent({
// ...
stopWhen: stepCountIs(10),
});مشكلة: نتائج البحث غير دقيقة
الحل: حسّن جودة التضمينات وأضف تصفية حسب التصنيف:
// بدلاً من بحث عام
const results = await vectorStore.search(query);
// استخدم بحثاً مصنفاً
const results = await vectorStore.searchByCategory(query, "منتجات");الخطوات التالية
بعد إتقان هذا الدرس، يمكنك التوسع في عدة اتجاهات:
- قاعدة بيانات متجهية حقيقية: استبدل المخزن المؤقت بـ Supabase pgvector أو Pinecone
- وكلاء متعددون: أنشئ نظام تسليم بين وكلاء متخصصين
- بروتوكول MCP: حوّل أدواتك إلى خادم MCP لمشاركتها مع Claude Desktop و Cursor
- المراقبة: أضف تتبع الأداء والتكاليف باستخدام LangSmith أو Helicone
- اختبار الوكلاء: استخدم أُطر تقييم مثل TruLens لقياس جودة الإجابات
الخلاصة
في هذا الدرس، بنينا وكيل ذكاء اصطناعي يتجاوز نمط RAG التقليدي. بدلاً من البحث الأعمى في كل طلب، يُفكر الوكيل في كل خطوة ويقرر:
- هل أحتاج لمعلومات خارجية؟ إذا لا، يجيب مباشرة
- من أي مصدر أبحث؟ يختار التصنيف المناسب
- هل أحتاج لحسابات؟ يستخدم الآلة الحاسبة
- هل أحتاج لمقارنة؟ يستخدم أداة المقارنة
- هل النتائج كافية؟ إذا لا، يبحث مرة أخرى
هذا النمط الوكيلي هو مستقبل تطبيقات الذكاء الاصطناعي — أنظمة تفكر وتتصرف بشكل مستقل بدلاً من اتباع خطوات محددة مسبقاً.
ناقش مشروعك معنا
نحن هنا للمساعدة في احتياجات تطوير الويب الخاصة بك. حدد موعدًا لمناقشة مشروعك وكيف يمكننا مساعدتك.
دعنا نجد أفضل الحلول لاحتياجاتك.
مقالات ذات صلة

بناء وكلاء الذكاء الاصطناعي من الصفر باستخدام TypeScript: إتقان نمط ReAct مع Vercel AI SDK
تعلّم كيفية بناء وكلاء الذكاء الاصطناعي من الأساس باستخدام TypeScript. يغطي هذا الدليل التعليمي نمط ReAct، واستدعاء الأدوات، والاستدلال متعدد الخطوات، وحلقات الوكلاء الجاهزة للإنتاج مع Vercel AI SDK.

بناء أول خادم MCP باستخدام TypeScript: الأدوات والموارد والقوالب
تعلم كيف تبني خادم MCP جاهزاً للإنتاج من الصفر باستخدام TypeScript. هذا الدرس العملي يغطي الأدوات والموارد والقوالب ونقل البيانات عبر stdio والربط مع Claude Desktop و Cursor.

بناء روبوت محادثة RAG باستخدام Supabase pgvector و Next.js
تعلم بناء روبوت محادثة ذكاء اصطناعي يجيب على الأسئلة باستخدام بياناتك الخاصة. يغطي هذا الدليل تضمينات المتجهات والبحث الدلالي و RAG مع Supabase و Next.js.