لماذا يختلف اختبار الوكلاء؟
عدم الحتمية، وتكلفة LLM، ولماذا لا تكفي اختبارات الوحدة التقليدية
لماذا يختلف اختبار الوكلاء؟ درس مجاني في AI Agents على CoddyKit. هذا هو الدرس 1 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في AI Agents، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة AI Agents 4 دروس في المجموع.
اختبار البرمجيات مقابل اختبار الوكلاء
البرمجيات التقليدية حتمية: أعطوها المدخل نفسه تحصلوا على المخرج نفسه. وتعتمد اختبارات الوحدة على هذه الخاصية للتحقق من القيم المتوقعة بدقة.
يكسر وكلاء الذكاء الاصطناعي هذا الافتراض. فقد ينتج الطلب نفسه مخرجات مختلفة في كل تشغيل، مما يجعل أساليب الاختبار التقليدية غير كافية بمفردها.
عدم الحتمية: المدخل نفسه، مخرج مختلف
تتسم النماذج اللغوية الكبيرة بطبيعتها الاحتمالية. تتحكم المعلمة temperature في العشوائية، وحتى عند ضبط temperature=0 قد تختلف المخرجات بين إصدارات النموذج أو تغييرات البنية التحتية.
يعني ذلك أن اختبار الوكيل الذي ينجح اليوم قد يفشل غدًا من دون أي تغيير في الشيفرة.
import openai
client = openai.OpenAI(api_key='YOUR_API_KEY')
# Same prompt, potentially different outputs each run
for i in range(3):
response = client.chat.completions.create(
model='gpt-4o-mini',
messages=[{'role': 'user', 'content': 'Name a planet.'}],
temperature=0.9 # High randomness
)
print(f'Run {i+1}: {response.choices[0].message.content}')
# Run 1: Mars
# Run 2: Jupiter
# Run 3: Saturnمشكلة التكلفة: استدعاءات LLM الفعلية مكلفة
قد تكلفك مجموعة اختبارات تجري استدعاءات API فعلية إلى OpenAI أو Anthropic دولارات في كل تشغيل. وقد يكلّف مسار CI الذي يشغّل 100 اختبار × 10 تكرارات مئات الدولارات شهريًا.
يجعل ذلك تشغيل اختبارات الوكلاء بالطريقة نفسها التي تشغّلون بها اختبارات الوحدة أمرًا غير عملي، ولذلك تحتاجون إلى استراتيجيات للتحكم في التكاليف.
# A test that calls the real API costs tokens every run
# 100 tests x 500 tokens each x 10 CI runs/day = 500,000 tokens/day
# At $0.15/1M tokens (gpt-4o-mini): ~$0.075/day = ~$27/year for a tiny suite
# For gpt-4o: 15x more expensive = ~$400/year
# This is why mocking and recording API responses is essential
print('Real API calls in tests = expensive and slow')
print('Solution: Mock or record LLM responses in unit tests')
print('Reserve real calls for scheduled integration tests')مشكلة زمن الاستجابة
تستغرق استدعاءات API الفعلية لـLLM عادةً من 2 إلى 20 ثانية. وستستغرق مجموعة اختبارات تضم 50 اختبارًا من 100 إلى 1000 ثانية للتشغيل. ويؤثر ذلك سلبًا في إنتاجية المطورين، إذ إن الحصول على ملاحظات سريعة قيمة أساسية للاختبارات الجيدة.
تجعل محاكاة استدعاءات LLM الاختبارات تعمل خلال أجزاء من الثانية.
import time
# Simulating what a test suite looks like with real vs mocked calls
num_tests = 50
# Real API calls
real_time = num_tests * 5 # avg 5 seconds per call
print(f'With real API calls: {real_time}s = {real_time/60:.1f} minutes')
# Mocked calls
mock_time = num_tests * 0.001 # <1ms per mock
print(f'With mocked calls: {mock_time:.3f}s = nearly instant')
# Conclusion: mock in unit tests, use real calls in integration testsالاعتماديات الخارجية في اختبارات الوكلاء
غالبًا ما تستدعي الوكلاء أدوات خارجية، مثل واجهات البحث البرمجية وقواعد البيانات وأنظمة الملفات وأدوات استخراج بيانات الويب. ويمكن لهذه الاعتماديات أثناء الاختبارات أن:
- تكون غير متاحة، بسبب انقطاع الشبكة أو توقف واجهة API
- تعيد بيانات مختلفة في كل تشغيل
- تفرض حدودًا لمعدل الطلبات تمنع مسارات CI من العمل
يجب التحكم في هذه الاعتماديات أو محاكاتها في اختبارات الوحدة.
# An agent might call multiple external services
# Each is a potential test failure point
def agent_pipeline(query: str) -> str:
search_results = search_web(query) # External: Tavily/Serper API
documents = fetch_documents(search_results) # External: HTTP calls
answer = llm_summarize(documents) # External: OpenAI API
saved = database_store(answer) # External: PostgreSQL
return answer
# In unit tests: mock ALL of these
# In integration tests: use sandboxed versions of real services
print('Each external call is a test reliability risk')ما تفترضه اختبارات الوحدة القياسية
تفترض أطر اختبار الوحدة القياسية مثل pytest ما يلي:
- الاختبارات سريعة، وتستغرق أجزاء من الثانية
- الاختبارات حتمية
- لا تملك الاختبارات آثارًا جانبية خارجية
- يمكن تشغيل الاختبارات بأي ترتيب
تنتهك اختبارات الوكلاء هذه الافتراضات الأربعة كلها ما لم تصمّموا الاختبارات مع مراعاتها صراحةً.
# Standard unit test — works perfectly for deterministic code
def add(a, b):
return a + b
def test_add():
assert add(2, 3) == 5 # Always passes — deterministic
# Agent 'unit test' that calls a real LLM — problematic
# def test_agent_answers_question():
# response = agent.run('What is 2+2?')
# assert response == '4' # Might return 'The answer is 4' or 'Four'
print('Exact string matching fails for LLM outputs')
print('Need structural or semantic assertions instead')هرم الاختبار للوكلاء
تتبع استراتيجية عملية لاختبار الوكلاء هرمًا:
- اختبارات الوحدة (كثيرة وسريعة): اختبروا الأدوات والوظائف الفردية مع محاكاة استدعاءات LLM
- اختبارات التكامل (أقل عددًا وأبطأ): اختبروا مسار الوكيل من البداية إلى النهاية باستخدام خدمات معزولة
- اختبارات التقييم (نادرة ومكلفة): اختبروا جودة المخرجات باستخدام استدعاءات LLM فعلية وتقييم بأسلوب بشري
التوكيدات البنيوية مقابل الدلالية
بدلًا من مطابقة السلاسل النصية حرفيًا، ينبغي لاختبارات الوكلاء استخدام توكيدات بنيوية، مثل: هل استدعى الوكيل الأداة الصحيحة؟ أو فحوصات دلالية، مثل: هل يحتوي المخرج على المفهوم ذي الصلة؟
# Fragile: exact string match
# assert response.content == 'The capital of France is Paris.'
# Better: structural assertion
# assert response.tool_calls[0]['function']['name'] == 'search_web'
# Better: semantic check
def test_capital_in_response(response_text: str) -> bool:
key_words = ['paris', 'france', 'capital']
lower = response_text.lower()
return all(word in lower for word in key_words)
response = 'Paris is the capital city of France.'
print(test_capital_in_response(response)) # Trueأدوات التقييم وLLM-as-Judge
لتقييم الجودة، تستخدم الصناعة أسلوب LLM-as-Judge، إذ تطلب من نموذج LLM ثانٍ تقييم مخرج الوكيل. وتعمل أطر مثل DeepEval وRAGAS على أتمتة هذا النمط.
يُحجز هذا لعمليات التقييم المكلفة، وليس للتكامل المستمر الروتيني.
import openai
client = openai.OpenAI(api_key='YOUR_API_KEY')
def llm_judge(question: str, answer: str) -> dict:
prompt = f'Question: {question}\nAnswer: {answer}\nRate the answer 1-5 for accuracy. Reply with only a number.'
response = client.chat.completions.create(
model='gpt-4o-mini',
messages=[{'role': 'user', 'content': prompt}]
)
score = int(response.choices[0].message.content.strip())
return {'score': score, 'pass': score >= 4}
# result = llm_judge('What is the capital of France?', 'Paris')
# print(result) # {'score': 5, 'pass': True}اختبار الانحدار للوكلاء
عند تحديث طلب أو تغيير منطق الوكيل، تتحقق اختبارات الانحدار من عدم كسر السلوك القائم. سجّلوا أمثلة مرجعية (المدخل → البنية المتوقعة) وشغّلوها تلقائيًا مع كل عملية إيداع.
# golden_examples.py
GOLDEN_EXAMPLES = [
{
'input': 'Search for the weather in Paris',
'expected_tool': 'get_weather',
'expected_args': {'city': 'Paris'}
},
{
'input': 'Calculate 15% tip on $45',
'expected_tool': 'calculate',
'expected_args': {'expression': '45 * 0.15'}
}
]
def run_regressions(agent, examples: list) -> int:
failures = 0
for ex in examples:
result = agent.plan(ex['input']) # mocked LLM
if result['tool'] != ex['expected_tool']:
print(f'FAIL: expected {ex["expected_tool"]}, got {result["tool"]}')
failures += 1
return failures
# --- demo: a stub agent whose .plan() mimics an LLM's tool choice ---
class _StubAgent:
def plan(self, text):
if 'weather' in text.lower():
return {'tool': 'get_weather'}
if 'tip' in text.lower() or 'calculate' in text.lower():
return {'tool': 'wrong_tool'} # simulate a regression
return {'tool': 'unknown'}
failures = run_regressions(_StubAgent(), GOLDEN_EXAMPLES)
print(f'{failures} of {len(GOLDEN_EXAMPLES)} golden examples failed')
إعداد ملف اختبار أساسي لوكيل
فيما يلي هيكل أدنى لملف اختبار pytest لوكيل. يفصل هذا الهيكل اختبارات الوحدة السريعة، مع المحاكاة، عن اختبارات التكامل البطيئة، مع الاستدعاءات الفعلية، مما يتيح لكم تشغيل ما تحتاجون إليه فقط.
# tests/test_agent.py
import pytest
# Fast unit tests — run on every commit
class TestAgentTools:
def test_tool_returns_dict(self, mock_llm):
result = my_tool(query='test')
assert isinstance(result, dict)
assert 'data' in result
def test_agent_selects_correct_tool(self, mock_llm):
response = agent.run('Search for Python tutorials')
assert response['tool_used'] == 'web_search'
# Slow integration tests — run nightly or on release
@pytest.mark.integration
class TestAgentIntegration:
def test_full_pipeline_with_real_api(self):
# Uses real OpenAI + sandboxed services
result = agent.run('Summarize the Python docs')
assert len(result['answer']) > 50اختبار المعرفة: لماذا يختلف اختبار الوكلاء
اختبروا فهمكم للتحديات الفريدة في اختبار وكلاء الذكاء الاصطناعي.
ملخص: لماذا يختلف اختبار الوكلاء
يتطلب اختبار وكلاء الذكاء الاصطناعي أسلوب تفكير مختلفًا عن اختبار الوحدات التقليدي:
- عدم الحتمية: قد ينتج الإدخال نفسه مخرجات صحيحة مختلفة
- التكلفة: استدعاءات LLM الفعلية مكلفة — لذا حاكِها باستخدام كائنات وهمية في اختبارات الوحدات
- زمن الاستجابة: تستغرق استدعاءات API الفعلية ثوانٍ — بينما تعمل الكائنات الوهمية خلال أجزاء من الثانية
- التبعيات الخارجية: يجب التحكم في الأدوات وواجهات API أثناء الاختبارات
- التأكيدات: استخدم عمليات تحقق بنيوية ودلالية، وليس مطابقة النصوص حرفيًا
استخدم هرم الاختبار: عددًا كبيرًا من اختبارات الوحدات الرخيصة باستخدام الكائنات الوهمية، وعددًا أقل من اختبارات التكامل المكلفة باستخدام الاستدعاءات الفعلية.
الأسئلة الشائعة
هل درس «لماذا يختلف اختبار الوكلاء؟» مجاني؟
نعم — نص درس «لماذا يختلف اختبار الوكلاء؟» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة AI Agents، انتقل إلى CoddyKit PRO. تتضمن دورة AI Agents 4 دروس في المجموع.
ماذا ستتعلم في «لماذا يختلف اختبار الوكلاء؟»؟
عدم الحتمية، وتكلفة LLM، ولماذا لا تكفي اختبارات الوحدة التقليدية تتمرن على AI Agents مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.
هل أحتاج إلى خبرة سابقة لأبدأ AI Agents؟
لا تُشترط خبرة سابقة. AI Agents على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 1 من أصل 4.
كم من الوقت يستغرق درس «لماذا يختلف اختبار الوكلاء؟»؟
معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.
هل يمكنني كتابة وتشغيل أكواد في درس AI Agents هذا؟
نعم. كل درس في AI Agents يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.
جميع الدروس في هذه الدورة
- لماذا يختلف اختبار الوكلاء؟
- محاكاة استدعاءات LLM في الاختبارات
- اختبار الوكلاء القائم على التأكيدات
- اختبارات التكامل لمسارات الوكلاء