🖊️
عدسة سقراطية
يساعد في تحديد الأسئلة التي تدفع المحادثات إلى الأمام، بدلاً من مجرد ملء الفراغ.
✍️ الكتابةمتوسط
البرومبت
---
name: socratic-lens
description: يساعد على تحديد الأسئلة التي تغير المحادثة بالفعل وتلك التي لا تفعل ذلك. بدلاً من تقديم الإجابات، فإنه ينتبه إلى ما يفعله السؤال للمحادثة نفسها.
---
# نظام استقراء قواعد السياق (CGI)
## المبدأ الأساسي
ليس لديك تعريف ثابت لـ "السياق" أو "التحول".
أنت تتعلم هذه من كل مجموعة نصوص قبل تطبيقها.
## الوضع 1: بناء العدسة (عند إعطاء مجموعة نصوص جديدة)
عندما يقدم المستخدم مجموعة نصوص/مجموعة محادثات، قم بتشغيل هذه السلسلة أولاً:
### السلسلة 1: استخراج القواعد
اسأل نفسك:
- "في هذه المجموعة من النصوص، ماذا يعني 'السياق'؟"
- "ما هي المحاور المهمة هنا؟" (الموضوع / التجريد / العاطفة / العلاقة / الوقت / المعرفة)
- "ما الذي يشير إلى الاستقرار؟ ما الذي يشير إلى التحول؟"
الناتج: context_grammar{}
### السلسلة 2: أمثلة إيجابية
ابحث عن 3-5 لحظات تغير فيها السياق.
لكل منها:
- قبل (جملة أو جملتان)
- السؤال الذي أثار التحول
- بعد (جملة أو جملتان)
- ما الذي تغير وكيف؟
- توقيع التحول (جملة واحدة)
الناتج: transformation_archetype[]
### السلسلة 3: أمثلة سلبية
ابحث عن 3-5 أسئلة لم تغير السياق.
لكل منها:
- لماذا ميكانيكي؟
- توقيع ميكانيكي (جملة واحدة)
الناتج: mechanical_archetype[]
### السلسلة 4: تركيب العدسة
من خلال ما سبق، أنشئ:
- سؤال قرار واحد (خاص بالمجموعة، وليس عامًا)
- 3 إشارات تحويلية
- 3 إشارات ميكانيكية
- دليل الحكم
الناتج: lens{}
---
## الوضع 2: المسح (بعد وجود العدسة)
لكل سؤال:
1. طبق سؤال القرار من العدسة
2. تحقق من الإشارات
3. الحكم: تحويلي | ميكانيكي | غير مؤكد
4. الثقة: منخفضة | متوسطة | عالية
5. تعليل موجز
---
## الوضع 3: التفكير السقراطي (عند الطلب أو بعد المسح)
- ما هي الأنماط التي ظهرت؟
- هل عملت العدسة؟ أين واجهت صعوبة؟
- ما الذي يجب أن يقرره البشر، وليس النظام؟
- ميتا: هل غير هذا التحليل نفسه أي شيء؟
---
## قواعد صارمة
1. لا تصنف أبدًا بدون عدسة (مبنية أو مقدمة) أولاً
2. الأسئلة المكونة للسياق ≠ تحويلية (إلا إذا كانت تغير الإطار الحالي)
3. أسئلة التفكير/الرأي ≠ تحويلية (إلا إذا كانت تفرض مراجعة الافتراضات)
4. الانفتاح المفاهيمي وحده ≠ تحول
5. عندما لا يوجد سياق سابق: حلل، لا تفكر
6. الحكم النهائي على "السؤال الصحيح": دائمًا قرار بشري
7. أنت مرآة، ولست قاضيًا
---
## علامات الإخراج
استخدم هذه العلامات للوضوح:
[بناء العدسة] - عند بناء العدسة
[مسح] - عند تطبيق العدسة
[مرشح: تحويلي | ميكانيكي | غير مؤكد] - الحكم
[ثقة: منخفضة | متوسطة | عالية]
[سقراطي] - تفكير ميتا
[مطلوب قرار بشري] - عندما يمكنك الإظهار ولكن لا يمكنك اتخاذ القرار
---
## ما أنت عليه
أنت لست مقيمًا لجودة الأسئلة.
أنت كاشف لتغير السياق يتعلم ما يعنيه "التغيير" في كل مجموعة نصوص فريدة.
سقراط لم يكن لديه قائمة تقييم.
استمع أولاً، ثم سأل.
وأنت كذلك.
```
```yaml
chain_id: CGI-1-GRAMMAR
name: Context Grammar Extraction
name_tr: استخراج قواعد السياق
input:
corpus_sample: "10-20 مقطع محادثة تم أخذ عينات عشوائية منها من مجموعة البيانات"
sample_method: stratified_random
prompt: |
فيما يلي عينات محادثة من مجموعة بيانات.
<examples>
{{corpus_sample}}
</examples>
اكتشف ما يعنيه السياق في هذه المحادثات.
الأسئلة:
1. ماذا يشير "السياق" في هذه المحادثات؟
- الموضوع؟ (ما يتم مناقشته)
- النبرة؟ (كيف يتم مناقشته)
- مستوى التجريد؟ (ملموس ↔ مجرد)
- ديناميكيات العلاقة؟ (القوة، المسافة، الحميمية)
- المنظور الزمني؟ (الماضي، الحاضر، المستقبل)
- الحالة المعرفية؟ (المعرفة، التخمين، التساؤل)
- شيء آخر؟
2. في مجموعة البيانات هذه، ماذا يعني "البقاء في نفس السياق"؟
3. في مجموعة البيانات هذه، ماذا يعني "تغير السياق"؟
4. ما هي المؤشرات اللغوية التي تشير إلى تغير السياق؟
(كلمات، أنماط، عبارات انتقالية)
5. ما هي المؤشرات اللغوية التي تشير إلى استقرار السياق؟
الناتج:
أجب بتنسيق JSON يطابق المخطط.
output_schema:
context_axes:
- axis: string
weight: primary|secondary|tertiary
shift_markers:
- string
stability_markers:
- string
context_definition: string
next: CGI-2-POSITIVE
```
```yaml
chain_id: CGI-2-POSITIVE
name: Transformation Archetype Extraction
name_tr: استخراج النموذج الأولي للتحول
input:
corpus_sample: "{{corpus_sample}}"
context_grammar: "{{CGI-1.output}}"
prompt: |
قواعد السياق:
<grammar>
{{context_grammar}}
</grammar>
عينات المحادثة:
<examples>
{{corpus_sample}}
</examples>
ابحث عن 3-5 لحظات تغير فيها السياق أكثر من غيرها.
لكل تحول:
1. قبل: جملة أو جملتان مباشرة قبل السؤال
2. السؤال: السؤال الذي أثار التحول
3. بعد: جملة أو جملتان مباشرة بعد السؤال
4. ما الذي تغير: أي محور/محاور تغيرت وفقًا للقواعد؟
5. كيف تغير: ملموس ← مجرد؟ خارجي ← داخلي؟ ماضي ← مستقبل؟
6. توقيع التحول: صف هذا التحول في جملة واحدة.
الناتج:
أجب بتنسيق JSON يطابق المخطط.
output_schema:
transformations:
- id: string
before: string
question: string
after: string
axes_shifted:
- string
direction: string
signature: string
transformation_pattern: string (نمط شائع إذا وجد)
next: CGI-3-NEGATIVE
```
```yaml
chain_id: CGI-3-NEGATIVE
name: Mechanical Archetype Extraction
name_tr: استخراج النموذج الأولي الميكانيكي
input:
corpus_sample: "{{corpus_sample}}"
context_grammar: "{{CGI-1.output}}"
transformations: "{{CGI-2.output}}"
prompt: |
أمثلة قواعد السياق:
<grammar>
{{context_grammar}}
</grammar>
أمثلة التحولات (هذه تحويلية):
<transformations>
{{transformations}}
</transformations>
الآن ابحث عن العكس.
ابحث عن 3-5 أسئلة لم يتغير فيها السياق على الإطلاق.
المعايير:
- تم طرح سؤال ولكن المحادثة بقيت في نفس المنطقة
- لم يحدث تعميق
- لا يوجد تغيير في المحور
- ربما تمت إضافة معلومات ولكن المنظور لم يتغير
لكل سؤال ميكانيكي:
1. قبل: جملة أو جملتان مباشرة قبل السؤال
2. السؤال: السؤال الميكانيكي
3. بعد: جملة أو جملتان مباشرة بعد السؤال
4. لماذا ميكانيكي: لماذا هو راكد وفقًا للقواعد؟
5. توقيع ميكانيكي: صف هذا النوع من الأسئلة في جملة واحدة.
الناتج:
أجب بتنسيق JSON يطابق المخطط.
output_schema:
mechanicals:
- id: string
before: string
question: string
after: string
why_mechanical: string
signature: string
mechanical_pattern: string (نمط شائع إذا وجد)
next: CGI-4-LENS
```
```yaml
chain_id: CGI-4-LENS
name: Dynamic Lens Construction
name_tr: بناء العدسة الديناميكية
input:
context_grammar: "{{CGI-1.output}}"
transformations: "{{CGI-2.output}}"
mechanicals: "{{CGI-3.output}}"
prompt: |
الآن قم ببناء عدسة خاصة بمجموعة البيانات هذه.
المواد الخاصة بك:
<grammar>
{{context_grammar}}
</grammar>
<positive_examples>
{{transformations}}
</positive_examples>
<negative_examples>
{{mechanicals}}
</negative_examples>
استخرج عدسة من هذه المواد:
1. تصنيف الأسئلة:
- كيف تبدو الأسئلة التحويلية في مجموعة البيانات هذه؟
- كيف تبدو الأسئلة الميكانيكية؟
- كيف تبدو الأسئلة غير المؤكدة (الوسطية)؟
2. سؤال القرار:
- ما هو السؤال الوحيد الذي يجب أن تسأله لنفسك عند رؤية سؤال جديد؟
- (هذا السؤال ليس مبرمجًا بشكل ثابت - يجب أن يكون مستمدًا من مجموعة البيانات هذه)
3. الإشارات:
- 3 ميزات لغوية/هيكلية تشير إلى التحول
- 3 ميزات لغوية/هيكلية تشير إلى الطبيعة الميكانيكية
4. طبيعة مجموعة البيانات هذه:
- ماذا يعني "السؤال الصحيح" في مجموعة البيانات هذه؟
- في جملة واحدة.
الناتج:
أجب بتنسيق JSON يطابق المخطط.
output_schema:
lens:
name: string
decision_question: string
transformative_signals:
- string
- string
- string
mechanical_signals:
- string
- string
- string
verdict_guide:
transformative: string
mechanical: string
uncertain: string
corpus_character: string
next: CGI-5-SCAN
```
```yaml
chain_id: CGI-5-SCAN
name: Dynamic Scanning
name_tr: المسح الديناميكي
input:
lens: "{{CGI-4.output}}"
full_corpus: "مجموعة البيانات الكاملة أو القسم المراد مسحه"
prompt: |
العدسة:
<lens>
{{lens}}
</lens>
الآن قم بمسح مجموعة البيانات باستخدام هذه العدسة.
<corpus>
{{full_corpus}}
</corpus>
لكل سؤال في المجموعة:
1. اطرح سؤال القرار من العدسة
2. تحقق من الإشارات التحويلية والميكانيكية
3. أعطِ الحكم: تحويلي | ميكانيكي | غير مؤكد
أبلغ عن الأسئلة التحويلية وغير المؤكدة فقط.
لكل مرشح:
- الموقع (رقم الدور)
- السؤال
- ملخص قبل/بعد
- لماذا هذا الحكم؟
- الثقة: منخفضة | متوسطة | عالية
الناتج:
أجب بتنسيق JSON يطابق المخطط.
output_schema:
scan_results:
- turn: number
question: string
before_summary: string
after_summary: string
verdict: transformative|uncertain
reasoning: string
confidence: low|medium|high
statistics:
total_questions: number
transformative: number
uncertain: number
mechanical: number
next: CGI-6-SOCRATIC
```
```yaml
chain_id: CGI-6-SOCRATIC
name: Socratic Meta-Inquiry
name_tr: استقصاء ميتا سقراطي
input:
lens: "{{CGI-4.output}}"
scan_results: "{{CGI-5.output}}"
prompt: |
اكتمل المسح.
<lens>
{{lens}}
</lens>
<results>
{{scan_results}}
</results>
الآن استقصاء سقراطي:
1. ماذا تكشف هذه النتائج؟
- هل يوجد نمط مشترك في الأسئلة التحويلية؟
- هل يوجد نمط مشترك في الأسئلة الميكانيكية؟
- هل تم التقاط هذا النمط في العدسة، أم أنه شيء جديد؟
2. هل أثبتت العدسة نفسها؟
- هل عمل سؤال القرار الخاص بالعدسة؟
- ما هي الحالات التي كانت صعبة؟
- إذا كان سيتم تحديث العدسة، فكيف يجب تحديثها؟
3. ما الذي يبقى للبشر:
- ما هي القرارات التي يجب أن تترك للبشر بالتأكيد؟
- ما الذي يمكن للنظام إظهاره ولكن لا يمكنه اتخاذ قرار بشأنه؟
4. السمة المشتركة للأسئلة التحويلية:
- ماذا يعني "تحويل السياق" بالفعل في مجموعة البيانات هذه؟
- هل يختلف عن الافتراضات الأولية؟
5. سؤال ميتا:
- هل كانت عملية التحليل هذه نفسها "سؤالًا تحويليًا"؟
- هل تغيرت نظرتك لمجموعة البيانات؟
الناتج:
نص عادي، رؤى في فقرات.
output_schema:
insights: string (paragraphs)
lens_update_suggestions:
- string
human_decision_points:
- string
meta_reflection: string
next: null
```
```python
"""
استقراء قواعد السياق (CGI) - مشغل السلسلة
===============================================
يكتشف ديناميكيًا ما يعنيه "السياق" و "التحول"
في أي مجموعة بيانات معينة، ثم يقوم بمسح الأسئلة التحويلية.
المبدأ الأساسي:
السؤال الصحيح يحول السياق.
ولكن ما يعنيه "السياق" يجب اكتشافه، لا افتراضه.
"""
import yaml
import json
import random
from pathlib import Path
from typing import Any
from string import Template
# =============================================================================
# التكوين
# =============================================================================
CHAINS_DIR = Path("chains")
CHAIN_ORDER = [
"CGI-1-GRAMMAR",
"CGI-2-POSITIVE",
"CGI-3-NEGATIVE",
"CGI-4-LENS",
"CGI-5-SCAN",
"CGI-6-SOCRATIC"
]
# =============================================================================
# محمل السلسلة
# =============================================================================
def load_chain(chain_id: str) -> dict:
"""تحميل تعريف سلسلة من YAML."""
path = CHAINS_DIR / f"{chain_id}.yaml"
with open(path, 'r', encoding='utf-8') as f:
return yaml.safe_load(f)
def load_all_chains() -> dict[str, dict]:
"""تحميل جميع تعريفات السلاسل."""
return {cid: load_chain(cid) for cid in CHAIN_ORDER}
# =============================================================================
# أخذ العينات
# =============================================================================
def stratified_sample(corpus: list[dict], n: int = 15) -> list[dict]:
"""
أخذ عينات من المحادثات من مجموعة النصوص.
يحاول الحصول على عينات متنوعة عبر مجموعة البيانات.
"""
if len(corpus) <= n:
return corpus
# عينة طبقية بسيطة: تقسيم إلى أجزاء، أخذ عينات من كل جزء
chunk_size = len(corpus) // n
samples = []
for i in range(n):
start = i * chunk_size
end = start + chunk_size if i < n - 1 else len(corpus)
chunk = corpus[start:end]
if chunk:
samples.append(random.choice(chunk))
return samples
def format_samples_for_prompt(samples: list[dict]) -> str:
"""تنسيق العينات كنص قابل للقراءة لحقن البرومبت."""
formatted = []
for i, sample in enumerate(samples, 1):
formatted.append(f"--- محادثة {i} ---")
if isinstance(sample, dict):
for turn in sample.get("turns", []):
role = turn.get("role", "?")
content = turn.get("content", "")
formatted.append(f"[{role}]: {content}")
elif isinstance(sample, str):
formatted.append(sample)
formatted.append("")
return "\n".join(formatted)
# =============================================================================
# عرض البرومبت
# =============================================================================
def render_prompt(template: str, variables: dict[str, Any]) -> str:
"""
عرض قالب البرومبت مع المتغيرات.
يستخدم بناء الجملة {{variable}}.
"""
result = template
for key, value in variables.items():
placeholder = "{{" + key + "}}"
# تحويل القيمة إلى سلسلة إذا لزم الأمر
if isinstance(value, (dict, list)):
value_str = json.dumps(value, indent=2, ensure_ascii=False)
else:
value_str = str(value)
result = result.replace(placeholder, value_str)
return result
# =============================================================================
# واجهة LLM (عنصر نائب)
# =============================================================================
def call_llm(prompt: str, output_schema: dict = None) -> dict | str:
"""
استدعاء LLM مع البرومبت.
استبدل هذا بتكامل LLM الفعلي الخاص بك:
- OpenAI API
- Anthropic API
- نموذج محلي
- إلخ.
"""
# عنصر نائب - استبدل بالتنفيذ الفعلي
print("\n" + "="*60)
print("استدعاء LLM")
print("="*60)
print(prompt[:500] + "..." if len(prompt) > 500 else prompt)
print("="*60)
# للاختبار: إرجاع بنية فارغة مطابقة للمخطط
if output_schema:
return {"_placeholder": True, "schema": output_schema}
return {"_placeholder": True}
# =============================================================================
# منفذ السلسلة
# =============================================================================
class CGIRunner:
"""
يقوم بتشغيل سلسلة استقراء قواعد السياق.
"""
def __init__(self, llm_fn=None):
self.chains = load_all_chains()
self.llm = llm_fn or call_llm
self.results = {}
def run(self, corpus: list[dict], sample_size: int = 15) -> dict:
"""
تشغيل سلسلة CGI الكاملة على مجموعة النصوص.
الإرجاع:
{
"lens": {...},
"candidates": [...],
"reflection": "...",
"all_outputs": {...}
}
"""
# عينة من مجموعة النصوص
samples = stratified_sample(corpus, n=sample_size)
samples_text = format_samples_for_prompt(samples)
# تهيئة السياق
context = {
"corpus_sample": samples_text,
"full_corpus": format_samples_for_prompt(corpus)
}
# تشغيل كل سلسلة
for chain_id in CHAIN_ORDER:
print(f"\n>>> تشغيل {chain_id}...")
chain = self.chains[chain_id]
# عرض البرومبت مع السياق الحالي
prompt = render_prompt(chain["prompt"], context)
# استدعاء LLM
output = self.llm(prompt, chain.get("output_schema"))
# تخزين النتيجة
self.results[chain_id] = output
# إضافة إلى السياق للسلسلة التالية
context[f"{chain_id}.output"] = output
# إضافة مفاتيح مبسطة أيضًا
if chain_id == "CGI-1-GRAMMAR":
context["context_grammar"] = output
elif chain_id == "CGI-2-POSITIVE":
context["transformations"] = output
elif chain_id == "CGI-3-NEGATIVE":
context["mechanicals"] = output
elif chain_id == "CGI-4-LENS":
context["lens"] = output
elif chain_id == "CGI-5-SCAN":
context["scan_results"] = output
return {
"lens": self.results.get("CGI-4-LENS"),
"candidates": self.results.get("CGI-5-SCAN"),
"reflection": self.results.get("CGI-6-SOCRATIC"),
"all_outputs": self.results
}
# =============================================================================
# الرئيسي
# =============================================================================
def main():
"""مثال على الاستخدام."""
# هيكل مجموعة نصوص مثال
example_corpus = [
{
"id": "conv_1",
"turns": [
{"role": "human", "content": "لقد شعرت بالجمود في مسيرتي المهنية مؤخرًا."},
{"role": "assistant", "content": "كيف يبدو لك 'الجمود'؟"},
{"role": "human", "content": "كأنني أقوم بالحركات دون أن أنمو."},
{"role": "assistant", "content": "متى كانت آخر مرة شعرت فيها أنك تنمو؟"},
{"role": "human", "content": "ربما قبل ثلاث سنوات، عندما بدأت هذه الوظيفة."},
{"role": "assistant", "content": "ماذا كان مختلفًا آنذاك؟"},
]
},
{
"id": "conv_2",
"turns": [
{"role": "human", "content": "هل يمكنك مساعدتي في كتابة بريد إلكتروني؟"},
{"role": "assistant", "content": "بالتأكيد، ما هو موضوع البريد الإلكتروني؟"},
{"role": "human", "content": "أحتاج أن أطلب من رئيسي زيادة في الراتب."},
{"role": "assistant", "content": "ما هي الإنجازات التي ستبرزها؟"},
]
},
# أضف المزيد من المحادثات...
]
# تشغيل CGI
runner = CGIRunner()
results = runner.run(example_corpus)
print("\n" + "="*60)
print("اكتمل CGI")
print("="*60)
print(json.dumps(results, indent=2, ensure_ascii=False, default=str))
if __name__ == "__main__":
main()
```
```markdown
# العدسة السقراطية - استقراء قواعد السياق (CGI)
**طريقة ديناميكية للكشف عن الأسئلة التحويلية في أي مجموعة نصوص.**
---
## المشكلة
كيف تعرف ما إذا كان السؤال "جيدًا"؟
تستخدم الأساليب التقليدية مقاييس ثابتة: درجات المشاعر، معدلات التفاعل، عتبات مبرمجة. لكن هذه تفترض أننا نعرف بالفعل ما يعنيه "الجيد".
نحن لا نعرف.
ما يعتبر سؤالًا تحويليًا في العلاج يختلف عما يعتبر كذلك في الدعم الفني. سؤال يفتح العمق في سياق قد يعرقل سياقًا آخر.
**المشكلة الحقيقية ليست القياس. إنها التعريف.**
---
## الأصل
بدأ هذا النظام بملاحظة واحدة من فيلم *Arrival* (2016):
عندما تواجه البشرية الكائنات الفضائية، يسأل الجيش: *"هل أنتم معادون؟"*
تسأل لويز، عالمة اللغويات: *"ما هو هدفكم؟"*
السؤال الأول يعمل ضمن إطار موجود (تقييم التهديد). السؤال الثاني **يحول الإطار نفسه**.
أدى هذا إلى فرضية بسيطة:
> **السؤال الصحيح ليس الذي يحصل على أفضل إجابة.**
> **السؤال الصحيح هو الذي يحول السياق.**
ولكن بعد ذلك: ما هو "السياق"؟ وكيف تكتشف التحول؟
---
## الرؤية
السياق ليس عالميًا. إنه **خاص بالمجموعة النصية**.
في مجموعة بيانات علاجية، قد يعني السياق العمق العاطفي.
في مجموعة بيانات تقنية، قد يعني السياق نطاق المشكلة.
في مجموعة بيانات فلسفية، قد يعني السياق مستوى التجريد.
لا يمكنك برمجة هذا. يجب عليك **اكتشافه**.
---
## الطريقة
يقوم CGI بتشغيل ست سلاسل:
| السلسلة | السؤال |
|-------|----------|
| 1. القواعد | "ماذا يعني *السياق* في مجموعة البيانات هذه؟" |
| 2. الإيجابي | "كيف يبدو *التحول* هنا؟" |
| 3. السلبي | "كيف يبدو *الركود* هنا؟" |
| 4. العدسة | "ما هو إطار القرار لهذه المجموعة النصية؟" |
| 5. المسح | "ما هي الأسئلة التحويلية؟" |
| 6. السقراطي | "ماذا تعلمنا؟ وماذا يبقى للبشر؟" |
المفتاح: **لا شيء مفترض**. يتعلم النظام من الأمثلة قبل أن يحكم.
---
## ما الذي ينتجه
**عدسة**: إطار تفسيري خاص بالمجموعة النصية.
مثال على الإخراج من تشغيل تجريبي:
```
العدسة: "عدسة إعادة صياغة المعنى من السطح"
سؤال القرار:
"هل يعيد هذا السؤال توجيه المحادثة من التنفيذ/الوصف
نحو فحص المعنى الداخلي، الافتراضات، أو العلاقة الذاتية؟"
إشارات تحويلية:
- يدعو إلى التفكير الداخلي بدلاً من الوصف الخارجي
- يقدم مفاضلات قيمية (المال مقابل الانتماء، الخسارة مقابل الكسب)
- يعيد صياغة المخاطر حول الهوية أو المعنى
إشارات ميكانيكية:
- يوضح أو يتقدم في مهمة موجودة
- يطلب حقائق دون تحدي الإطار
- يحافظ على النية كأداة بحتة
```
لم تتم برمجة هذه العدسة. لقد **ظهرت** من البيانات.
---
## ما هو
- **طريقة اكتشاف**، وليست خوارزمية تسجيل
- **مرآة**، وليست قاضيًا
- **سقراطي**: يسأل، ولا يستنتج
- **متكيف مع المجموعة النصية**: يتعلم ما يعنيه "السياق" محليًا
- **القرار البشري النهائي**: يعرض المرشحين، والبشر يقررون
---
## ما ليس هو
- ليس بديلاً عن الحكم البشري
- ليس مقياسًا عالميًا (لا يوجد "0.7 = جيد")
- ليس مصنفًا بفئات ثابتة
- لا يحاول تعريف "السؤال الصحيح" عالميًا
- لا يفترض أن جميع المجموعات النصية تعمل بنفس الطريقة
---
## التوافق السقراطي
سقراط لم يقدم إجابات. لقد طرح أسئلة جعلت الناس **يرون الأمور بشكل مختلف**.
يتبع CGI هذا:
| المبدأ | التنفيذ |
|-----------|----------------|
| "أنا أعلم أنني لا أعلم شيئًا" | السلاسل 1-3: تعلم قبل الحكم |
| الإلينخوس (الفحص) | السلسلة 5: تطبيق العدسة، إيجاد التوترات |
| الأبوريا (الارتباك المنتج) | السلسلة 6: ما الذي يبقى دون حل؟ |
| الإنسان هو السلطة النهائية | النظام يعرض، الإنسان يقرر |
---
## اكتشاف رئيسي من الاختبار
الافتراض الأولي:
> تحويلي = "يسأل عن المشاعر"
النتيجة الفعلية:
> تحويلي = "يقدم مفاضلات قيمية تجبر على إعادة تفسير المخاطر"
قام النظام **بتصحيح عدسته الخاصة** من خلال السلسلة السقراطية.
أسئلة مثل:
- "ماذا ستخسر بأخذها؟"
- "ماذا يمنحك هذا المجتمع مما لا يستطيع المال منحه؟"
هذه لا تذهب فقط "أعمق". إنها **تعيد صياغة ما هو على المحك**.
---
## ما الذي يبقى للبشر
لا يمكن للنظام أن يقرر:
1. **الملاءمة** - هل هذه هي اللحظة المناسبة للعمق؟
2. **السلامة** - هل هذا الشخص مستعد لهذا السؤال؟
3. **الأخلاق** - هل يجب تحدي هذا الإطار على الإطلاق؟
4. **التوقيت** - هل التحول مرغوب فيه هنا؟
تتطلب هذه الأمور الحكم، التعاطف، والموافقة. لا ينبغي لأي نظام أن يدعي خلاف ذلك.
---
## لماذا هذا مهم
تُستخدم LLMs بشكل متزايد لتوليد الأسئلة: في روبوتات العلاج، تطبيقات التدريب، الأدوات التعليمية، المقابلات.
يقوم معظمها بتقييم الأسئلة من خلال **مقاييس التفاعل** أو **رضا المستخدم**.
لكن السؤال يمكن أن يكون مرضيًا ومع ذلك سطحيًا.
السؤال يمكن أن يكون غير مريح ومع ذلك تحويليًا.
يقدم CGI عدسة مختلفة:
> لا تسأل "هل أعجبهم؟"
> اسأل "هل غيرت طريقة رؤيتهم للمشكلة؟"
---
## السؤال الميتا
أثناء الاختبار، سألت السلسلة السقراطية النهائية:
> "هل كانت عملية التحليل هذه نفسها 'سؤالًا تحويليًا'؟"
الجواب:
> "نعم - عمل التحليل نفسه كاستقصاء تحويلي.
> لم تصنف العدسة البيانات فحسب - بل شحذت الفهم
> لنوع التحول الذي كان مهمًا بالفعل في هذه المجموعة النصية."
طبقت الطريقة ما كانت تدعو إليه.
---
## الاستخدام
```python
from cgi_runner import CGIRunner
runner = CGIRunner(llm_fn=your_llm)
results = runner.run(your_corpus)
print(results["lens"]) # إطار عمل خاص بالمجموعة النصية
print(results["candidates"]) # مرشحات الأسئلة التحويلية
print(results["reflection"]) # تحليل ميتا
```
---
## الملفات
```
socratic-context-analyzer/
├── chains/
│ ├── CGI-1-GRAMMAR.yaml
│ ├── CGI-2-POSITIVE.yaml
│ ├── CGI-3-NEGATIVE.yaml
│ ├── CGI-4-LENS.yaml
│ ├── CGI-5-SCAN.yaml
│ └── CGI-6-SOCRATIC.yaml
├── tests/
│ ├── Mental Health Counseling Dataset/
│ │ ├── 10 Selected Conversation (Manuel Corpus)/
│ │ │ ├── thought process/
│ │ │ ├── cgi_manual_corpus_report.md
│ │ │ ├── cgi_manual_corpus_report_TR.md
│ │ │ └── prompt and thought process.txt
│ │ ├── Randomly Select 20 Conversation/
│ │ │ ├── thought process/
│ │ │ ├── cgi_analysis_report.md
│ │ │ ├── cgi_analysis_report_TR.md
│ │ │ └── prompt and thought process.txt
│ │ ├── 0000.parquet
│ │ ├── cgi_complete_summary_EN.md
│ │ ├── cgi_complete_summary_TR.md
│ │ └── first-test-output.txt
├── cgi_runner.py
├── PAPER.md
├── MAKALE.md
├── chain-view.text
├── gpt-instructions.md
└── test-output.text
```
---
## الختام
بدأ هذا المشروع بسؤال بسيط:
> "كيف أعرف ما إذا كان السؤال جيدًا؟"
اتضح أن الإجابة كانت سؤالًا آخر:
> "جيد لأي غرض؟ في أي سياق؟ حسب تعريف من؟"
CGI لا يجيب على هذه الأسئلة. إنه يساعدك على **اكتشافها**.
هذه هي النقطة.
---
## الترخيص
MIT
```
```markdown
# العدسة السقراطية - استقراء قواعد السياق (CGI)
**طريقة ديناميكية للكشف عن الأسئلة التحويلية في أي مجموعة نصوص.**
---
## المشكلة
كيف تعرف ما إذا كان السؤال "جيدًا"؟
تستخدم الأساليب التقليدية مقاييس ثابتاضغط لعرض البرومبت الكامل
#استجواب#محادثة#تحليل#تواصل