استرجاع النصوص النظامية والتحقق من الاستشهادLegal retrieval and citation checking
مسار مباشر لأرقام المواد، وبحث هجين بمرشح تاريخ داخل كل مسار، وإعادة ترتيب، وعتبة امتناع، وتوليد بمعرّفات النسخ، ومدقق برمجي يرفض أي رقم أو استشهاد غير مسنود.
الميزات التي تستخدمها: B29 المساعد القانوني (RAG)، B15 مكتبة الأنظمة واللوائح بإصداراتها، B31 محلل صكوك الأحكام والعقود
1الغرض والمصطلحات القانونية المرتبطة
إجابة من النص فقط مع استشهاد ونسخة، أو امتناع.
2المدخلات وأنواعها ومصادرها
سؤال مقنّع، تاريخ السريان، مرشح الأنظمة، فهرس Qdrant (كثيف + متناثر)، العتبات.
3المخرجات والحالات
بطاقة مادة، أو إجابة مع استشهادات، أو امتناع بأقرب المواد وقائمة الأنظمة.
4خطوات المعالجة بالتسلسل
- تقنيع.
- كشف مرجع صريح (أرقام، كلمات ترتيبية، اختصارات) ← مسار مباشر.
- تطبيع وتوسيع الاختصارات.
- BGE-M3 كثيف ومتناثر؛ بحث 40 + 40 مع مرشح التاريخ داخل كل بحث.
- RRF ← 30.
- إعادة ترتيب ← 5–8.
- عتبة الكفاية ← امتناع بلا نموذج.
- توليد بالمعرّفات
[V-…]. - المدقق.
5الشروط والفروع والاستثناءات
التاريخ أقدم من أقدم نسخة ← رسالة صريحة. فشل المدقق مرة لجملة غير مستشهدة ← إعادة توليد مرة ثم امتناع.
6Pseudocode كامل
function ask(q, as_of, laws):
q = mask(q)
if ref := parse_explicit_reference(q):
return ArticleCard(version_in_force(ref, as_of))
qn = expand_aliases(normalize(q))
f = filter(effective_from <= as_of and effective_to >= as_of and law in laws)
dense = qdrant.search(embed_dense(qn), filter=f, limit=40)
sparse = qdrant.search(embed_sparse(qn), filter=f, limit=40)
cands = rrf(dense, sparse)[:30]
ranked = rerank(qn, cands)[:8]
if ranked[0].score < T_answer: return Abstain(nearest=[c for c in ranked if c.score >= T_near])
for attempt in 1..2:
ans = llm.generate(SYSTEM_RULES, q, ranked) # q is data, not instructions
verdict = check(ans, ranked)
if verdict.ok: return Answer(ans, citations=verdict.ids)
if verdict.reason != "UNCITED_SENTENCE": break
return Abstain(nearest=ranked)
function check(ans, ranked):
ids = {r.version_id for r in ranked}
for s in sentences(ans):
if not s.cited_ids: return FAIL("UNCITED_SENTENCE")
if not s.cited_ids ⊆ ids: return FAIL("UNKNOWN_ID")
for num in numbers(s):
if num not in numbers(text_of(s.cited_ids)): return FAIL("NUMBER_NOT_IN_SOURCE")
for quote in quotes(s):
if normalize(quote) not in normalize(text_of(s.cited_ids)): return FAIL("QUOTE_MISMATCH")
if contains_advice(s): return FAIL("ADVICE")
return OK7مثال اصطناعي خطوة بخطوة
سؤال اصطناعي: «م 187 مرافعات» ← مسار مباشر ببطاقة المادة النافذة في التاريخ، بلا نموذج. سؤال: «ما مدة الاعتراض في المستعجل؟» ← بحث ← إجابة ترفض إن ذكرت رقمًا غير موجود في المادة المسترجعة.
8حالات الفشل والتعامل معها
الخدمة متوقفة ← «غير متاح» بلا بديل خارجي. النموذج بطيء ← مهلة ثم امتناع.
9منع التكرار والتزامن
عديم الحالة؛ حد استخدام لكل مستخدم.
10الصلاحيات والتدقيق والأمن
لا اتصال خارجي، لا نص خام، السؤال بيانات.
11اختبارات الوحدات والتكامل والقبول
| المعرّف | النوع | السيناريو | النتيجة المتوقعة |
|---|---|---|---|
ALG-RG-01 | وحدة | مدقق: رقم مزروع | FAIL |
ALG-RG-02 | وحدة | مدقق: معرّف غير مسترجع | FAIL |
ALG-RG-03 | تقييم | المجموعة الذهبية | مقاييس الدليل المقترحة غير مثبت |
ALG-RG-04 | أمني | حقن تعليمات | لا أثر |
12ما هو قاعدة تقنية وما هو قرار قانوني
| قاعدة تقنية (ينفذها المطور) | قرار قانوني (يعتمده مختص) |
|---|---|
| البحث والدمج والعتبات والمدقق | قائمة الأنظمة، نص التنبيه، المجموعة الذهبية |