Back to "StyloFlow: إشارة محيدة محدودة- تدفقات عمل مدفوعة"

This is a viewer only at the moment see the article on how this works.

To update the preview hit Ctrl-Alt-R (or ⌘-Alt-R on Mac) or Enter to refresh. The Save icon lets you save the markdown file to disk

This is a preview from the server running through my markdig pipeline

AI Architecture C# RAG Signals Workflows

StyloFlow: إشارة محيدة محدودة- تدفقات عمل مدفوعة

Sunday, 11 January 2026

لقد بنيت StyloFlow لأنني واصلت الكتابة نفس النمط مرارا وتكراراcomponents that react to what happened before, emit confidence scores, sometimes need to escalate to more expensive analysis. Existing workflow engines wanted me to think in terms of DAGs or state machines

ملاحظة: StyloFlow ليس منتجًا مكتملًا قط; لأنني أبني lucidRAG و StyloBot IM SK2m أضيف الخصائص المفقودة و polishing the API on BOTH Stylo Fllow and ephemeralMSC3 إنه 's still in active developmentMska5 but you can try it out and provide feedbackMNK6 I will update here later Mske7the SignalSink stuff for example will change for ephemerial vMST8 to be MSSK9read onlyMSP10

StyloFlow عبارة عن مكتبة الأوركستراشن قادمة من إشارة - التي تتطابق كيف أعتقد حول أنابيب الذكاء الصناعي: تشرح المكونات ما ينتجونه وما يحتاجونه

هذه هي البنية التحتية التي تدعم وضوحRAG - cross- أداة RAG للرسم البياني المتحركة التي تدمج DocSummarizer (وثائق), المزيج للبيانات (بيانات مبنية), و ImageSummarizer ( "images" ) "to a unified question" - "anwering system with knowledge graph visualization" . "It also powers ستيلوبوت (نظام حماية الروبوتات المتقدمة) ويقوم بتطبيق تقلل من RAG النمط.

واجهة lucidRAG

المصدر: GitHub - StyloFlow


ما هو هذا

StyloFlow هو نموذج عمل لنموذج الإشارات الواجهة والشكل سوف تتطور بينما أبني lucidRAG و Stylobot, لكن سياق التنفيذ والنماذج التي شرحتها هنا هي الإشارات النقيّة: كإشارات أوليةM SK2حقائق صنفية , الثقةMSC4انقسام مُحرّكَ, والإرتفاع كنمط الهيكليّ

هذا ليس ' هو لغة DSL جديدة أو عمليّة الفهم التنفيذي تم بناؤه حول الإشارات , الثقة , و التسارع المحدود . اليوم يعمل في - عملية مع التزامن المحدودة . غدا سيقوم بتوزيع المسارات عبر الآلات بينما يحافظ على الإشارات كحدود مستقرة | .


المشكلة مع تدفقات العمل التقليدية

هنا'هذا ما تبدو عليه معظم محركات تدفق العمل

// ❌ Traditional: Hardcoded dependencies
public async Task ProcessDocumentAsync(string path)
{
    var text = await ExtractTextAsync(path);
    var chunks = await ChunkTextAsync(text);
    var embeddings = await GenerateEmbeddingsAsync(chunks);
    var entities = await ExtractEntitiesAsync(chunks);
    await StoreEverythingAsync(embeddings, entities);
}

هذا يعمل حتى :

  • تريد أن تفادي استخراج الكائنات للសំណួរ البسيطة
  • تحتاج إلى تشغيل الاستخراج والدمج بشكل متوازن
  • تريد أن تتصاعد إلى نموذج أفضل مبني على الثقة
  • تحتاج إلى إضافة مرحلة معالجة جديدة دون لمس البرمجة الموجودة

وينتهي بك الأمر بـ:

  1. خطوط أنابيب صلبة التي لا يمكنها أن تكيف مع
  2. ضخمة إذا/else الأشجار للتوجيه
  3. الطبقات المقدسة التي تعرف كل شيء

المؤسسة: تنفيذ مؤقت

StyloFlow يبني على أكثر وضوحا.طفيف - مكتبة للتحديد, تنفيذ قابل للتعقب غير同期M SK2

لمحة سريعة عن ما يقدمه الطفيف:

// Bounded concurrent processing with full visibility
var coordinator = new EphemeralWorkCoordinator<DocumentJob>(
    async (job, operation, ct) => {
        await ProcessAsync(job, ct);
        operation.Signal("document.processed");
    },
    new EphemeralOptions { MaxConcurrency = 4 });

// Enqueue work
await coordinator.EnqueueAsync(new DocumentJob(filePath));

// Full observability
Console.WriteLine($"Active: {coordinator.ActiveCount}");
Console.WriteLine($"Completed: {coordinator.TotalCompleted}");

الفوائد الرئيسية من الطفيف:

  • التطابقة المحدودة (لاذاكرة متطفلة)
  • طرد الـ LRU من العمليات القديمة
  • نشر الإشارات للتنسيق التقاطعي
  • Operation pinning to prevent premature eviction

للتفصيل , consulte النار وdon't لا تنسى تماما.


ما يُمكنه هذا النموذج

هذا النموذج الأوركسترالي يمتد إلى مرحلة مادية مع :

  1. مذكرات المكونات المدفوعة YAML- - الإعداد الإعلاني
  2. المؤشرات المبنية على - - أجزاء تعمل عندما تظهر الإشارات
  3. تنسيق الموجات - الأولوية- تم تنفيذها على أساس مسارات متطابقة
  4. أنماط التسارع - اfer expensive analysis until needed
  5. إتفاقات Entity - النوع-المدخلات الآمنةM SK2الخواص المخرجية
  6. إدارة الميزانية - حدود الرموز, حد التكلفةM SK2 استراحة زمنية

هنا "مسك0" هو التحول العميقي الرئيسي "مسک1"

graph TD
    subgraph Traditional["❌ Traditional: Hardcoded"]
        T1[Component A] -->|calls| T2[Component B]
        T2 -->|calls| T3[Component C]
        T3 -->|calls| T4[Component D]
    end

    subgraph StyloFlow["✅ StyloFlow: Signal-Driven"]
        S1[Component A]
        S2[Component B]
        S3[Component C]
        S4[Component D]
        SS[Signal Sink]

        S1 -.emits.-> SS
        S2 -.emits.-> SS
        S3 -.emits.-> SS
        SS -.triggers.-> S2
        SS -.triggers.-> S3
        SS -.triggers.-> S4
    end

    style T1 stroke:#ff6b6b
    style T2 stroke:#ff6b6b
    style T3 stroke:#ff6b6b
    style T4 stroke:#ff6b6b
    style S1 stroke:#51cf66
    style S2 stroke:#51cf66
    style S3 stroke:#51cf66
    style S4 stroke:#51cf66
    style SS stroke:#339af0

المكونات لا تتصل ببعضها البعض


الفكرة الأساسية: الإشارات والملكية

الإشارات هي حقائق عن ما حدث, ليست الأوامر أو الأحداثM SK1 هي ' غير قابلة للتغيير, مكتوبة في وقتٍ محددMSC4 وتحمل نقاط الثقةMNK5 كل الذرة تملك إشاراتها - هيMRK7 غير قادرة على التغيير خارجياً S. لا شيء آخر يمكنه تعديل تلك القائمة

public record Signal
{
    public required string Key { get; init; }           // "document.chunked"
    public object? Value { get; init; }                 // Optional payload
    public double Confidence { get; init; } = 1.0;      // 0.0 to 1.0
    public required string Source { get; init; }        // Which component
    public DateTime Timestamp { get; init; }
    public Dictionary<string, object>? Metadata { get; init; }
}

نقطة معمارية حرجة: SignalSink هو نظرة تاريخية مستمرة.

إشارة سمك يقدم نظرة قابلة للبحث في جميع العمليات على جميع الموصلات التي تشاركها. الإشارات تستمر عبر دورة حياة الموصل - عندما يطرد عملية من موصلها , تبقى الإشارات في القمامة حتى يتم تنظيفها يدويًا

// Create a shared signal sink (no parameters, signals persist)
var sink = new SignalSink();

// Coordinators manage operation lifetime, NOT signal lifetime
var coordinator = new EphemeralWorkCoordinator<string>(
    ProcessAsync,
    new EphemeralOptions
    {
        MaxConcurrency = 8,
        MaxTrackedOperations = 100,         // Operations evict after this
        MaxOperationLifetime = TimeSpan.FromMinutes(5),  // Or after this time
        Signals = sink                      // Share the persistent view
    });

// Operations emit via their emitter
public async Task ProcessAsync(string docId, SignalEmitter emitter, CancellationToken ct)
{
    // Store actual data externally (cache, database, blob storage)
    await cache.SetAsync($"doc-{docId}", documentData);

    // Signal carries a REFERENCE, not the data
    emitter.Emit("document.chunked", key: docId); // Key references external data
}

// SignalSink is readonly - it cannot alter signals
// Signals persist until their operation evicts from the coordinator

سيگنالسينك يقدم نمطين من توازن TWO:

1. PushM SK1based (Subscribe):

// Subscribe to the sink for push notifications
sink.Subscribe(signal => {
    if (signal.Is("document.chunked"))
    {
        // React immediately - signal includes OperationId
        Console.WriteLine($"Op {signal.OperationId} chunked doc at {signal.Timestamp}");
    }
});

// Returns IDisposable for cleanup
using var subscription = sink.Subscribe(HandleSignal);

2. Pull-based (QueryM SK3

// Get all signals for a specific operation
var opSignals = sink.GetOpSignals(operationId);

// Detect if any operation has emitted a signal
if (sink.Detect("embeddings.generated"))
{
    // At least one operation has generated embeddings
}

// Sense all signals matching a condition
var recentErrors = sink.Sense(s =>
    s.Signal.StartsWith("error.") &&
    s.Timestamp > DateTimeOffset.UtcNow.AddMinutes(-5)
);

// Get operation summary from its signal history
var summary = sink.GetOp(operationId);
Console.WriteLine($"Operation ran for {summary?.Duration}");

لماذا يهم هذا؟

  • فقط لرؤية - SignalSink لا يستطيع أن يغير الإشارات; إنه يقدم فقط الوصول للبحث
  • الإشارات تستمر - الإشارات تبقى في المنظر إلى أن يطرد عملياتها من المخطط
  • الإشارات هي التوصيل , وليس النقل - الإشارات تحمل مفاتيح/ الاقتباسات للبيانات الخارجية , ليس البيانات نفسها
  • الاستقلال Koordinator - موصلات متعددة يمكن أن تتشارك في حوض واحد ; تاريخ الإشارات يمتد على جميعها
  • Thread-safe - قفل-قراءات مجانية لعمليات البحث
  • كلا من ضغط وسحب - Subscribe () for reactive, SenseM SK3DetectMSC4 for polling
  • عملية الترابط - كل إشارة تحتوي على OperationId للبحث عبر المخططين
  • تطابق الأنماط - السؤال عن طريق تطابق بالضبط,បុព្វيةM SK2 أو حديد مخصص

مبدأ التصميم الرئيسي: تخزين البيانات الضخمة (وثائق, الصورM SK2 векторات ) في المخازن أو قواعد البياناتMSC4 الإشارات تحمل فقط المراجع مثل "cache://doc-123" أو مفاتيح التشغيل.

كمثال coordinación:

// Operation emits signal via ISignalEmitter interface
public async Task ProcessAsync(Item item, ISignalEmitter emitter, CancellationToken ct)
{
    // Emit to the sink
    emitter.Emit("processing.started");

    await DoWorkAsync(item, ct);

    emitter.Emit("processing.completed");
}

// Wave checks if it should run by querying sink
public bool ShouldRun(string path, AnalysisContext ctx)
{
    // Pull pattern: query the sink via context
    return ctx.Detect("document.chunked");
}

// UI subscribes to sink for reactive updates
sink.Subscribe(signal => {
    if (signal.Signal.StartsWith("document."))
    {
        // Push pattern: react immediately
        UpdateProgressUI(signal);
    }
});

التصاعد يحدث على مستوىين

  1. في إطار координатор - موجات تتأكد من الثقة في الإشارة وتجري بوضع محدد التحليل الثمني
  2. بين المنظمين - EscalatorAtom routes signals from fast coordinator → expensive coordinator based on signal criteria
// Pattern 1: Intra-coordinator escalation (wave checks signals)
public bool ShouldRun(string path, AnalysisContext ctx)
{
    var quality = ctx.GetSignal("quality.score");
    return quality?.Confidence < 0.7; // Only run if quality is low
}

// Pattern 2: Inter-coordinator escalation (atom routes to another coordinator)
// Option A: Explicit escalation signal
typed.Raise("escalate.to.expensive", payload, key: "doc-123");

// Option B: EscalatorAtom examines signals and decides
new EscalatorAtomOptions<T> {
    ShouldEscalate = evt => evt.Payload.Confidence < 0.7
}

موصلات متعددة تعمل بشكل مستقل. المسارح الذاتي يراقب الإشارات من موصل واحد وينقل العمل إلى آخر عند الحاجة.

لنظرية وراء هذا , см. سحب السياق الخافت المقيد.

إشارات تحمل الإشارات, لا بيانات

حرجة: الإشارات هي أحداث تنسيق, ليست نقل البيانات. بيانات كبيرة (وثائقM SK3 صورMSC4 مداخلاتMNK5 يجب أن تعيش في مخزن خارجيMRK6

// ❌ BAD: Carrying data in signals (memory pressure, boxing)
var imageBytes = await ProcessImageAsync(input);
emitter.Emit("image.processed", metadata: new { Data = imageBytes });

// ✅ GOOD: Store externally, signal the reference
var imageBytes = await ProcessImageAsync(input);
var cacheKey = $"processed/{docId}";
await cache.SetAsync(cacheKey, imageBytes);
emitter.Emit("image.processed", key: cacheKey);

// Later: Retrieve when needed
if (sink.Detect("image.processed"))
{
    var signals = sink.GetOpSignals(operationId);
    var imageKey = signals.FirstOrDefault(s => s.Signal == "image.processed")?.Key;
    if (imageKey != null)
    {
        var bytes = await cache.GetAsync<byte[]>(imageKey);
    }
}

أفضل الممارسات:

  • إستخدم المخازن (inM SK1memory أو الموزعة) للبيانات الطفئية
  • استخدام قواعد البيانات للبيانات المستدامة
  • استخدموا تخزين البلوب للឯកសារ الكبيرة
  • إشارات الURI: "cache://key", "blob://container/file", "db://table/id"
  • احتفظ بمؤشرات منخفضة الوزن - مفاتيح بسيطة , نقاط ثقة , ضربات زمنية

المبادئ الأساسية: مذكرات المكونات

توضح الميثاقات العقد ( ما الذي يثيرني , ما أصدره ,, , ما أكلفه .) منفصلة عن التنفيذ. هذا الفصل موجود بحيث يمكنك فهم تدفق العمل دون قراءة البرمجة, وتغيير ترتيب تنفيذ بدون إعادة التجميع

name: BotDetector
priority: 10              # Lower runs first
enabled: true

# What kind of component is this?
taxonomy:
  kind: analyzer          # sensor|analyzer|proposer|gatekeeper
  determinism: probabilistic
  persistence: ephemeral

# When should this run?
triggers:
  requires:
    - signal: http.request.received
      condition: exists

# What does it produce?
emits:
  on_complete:
    - key: bot.detected
      confidence_range: [0.0, 1.0]

  conditional:
    - key: bot.escalation.needed
      when: confidence < 0.7

# Resource limits
lane:
  name: fast              # fast|normal|slow|llm
  max_concurrency: 8

budget:
  max_duration: 100ms

# Configuration values
defaults:
  confidence:
    bot_detected: 0.6
  timing:
    timeout_ms: 100

الفوائد:

  1. إعادة إعداد وقت التشغيل - تغيير الأولوية دون إعادة التجميع
  2. البيئة تتجاوز - تخلي عن طريق الإعدادات
  3. وضوح العقد - شاهد أي إشارات تثير أي
  4. ذاتية-وثيقة - الميثاق هو الخاصية

مبني تدفق العمل البصري

بينما يمكنك كتابة الميثاقات YAML باليد

مبني تدفق عمل StyloFlow

يقدم الواجهة

  • Drag-and-drop components من الت taxonomy (sensors, analyzersM SK2 proposers , etc
  • نزع السلاسل - أربط المخرجات بالمدخلات بصريا
  • مشاهدة الميثاق الحي - شاهدوا YAML المنتجة أثناء بناءكم
  • تحفيز التصور - شاهد أي إشارات تثير أي مكونات
  • توصيل الممر - أسحب المكونات إلى مسارات سريعة / طبيعية / بطيئة
  • التحقق من الوقت الحقيقي - التقاط إشارات غير صحيحة فوراً

هذا يجعل من السهل تجريب أشكال تدفق العمل المختلفة دون كتابة YAML باليد


الفكرة الأساسية: الموجات

wave is a composable analysis stage. هذا الواجهة موجودة لجعل "هل يجب أن نشغل ?" قرار أول, ليس جزءاً من التنفيذ محصوراً في المنطق condicional.

public interface IContentAnalysisWave
{
    string Name { get; }
    int Priority { get; }               // Higher runs first
    bool Enabled { get; set; }

    // Quick filter - avoid expensive work
    bool ShouldRun(string contentPath, AnalysisContext context);

    // Do the analysis
    Task<IEnumerable<Signal>> AnalyzeAsync(
        string contentPath,
        AnalysisContext context,
        CancellationToken ct);
}

مثال موجة بسيطة:

public class FileTypeWave : IContentAnalysisWave
{
    public string Name => "FileType";
    public int Priority => 100;
    public bool Enabled { get; set; } = true;

    public bool ShouldRun(string path, AnalysisContext ctx)
    {
        // Skip if we already know the type
        return ctx.GetSignal("file.type") == null;
    }

    public async Task<IEnumerable<Signal>> AnalyzeAsync(
        string path,
        AnalysisContext ctx,
        CancellationToken ct)
    {
        var extension = Path.GetExtension(path);
        var mimeType = GetMimeType(extension);

        return new[]
        {
            new Signal
            {
                Key = "file.type",
                Value = mimeType,
                Confidence = 1.0,
                Source = Name
            }
        };
    }
}

تنسيق الموجات:

الـ WaveCoordinator يحرك الأمواج في ترتيب أولي:

var coordinator = new WaveCoordinator(waves, profile);
var context = new AnalysisContext();

var results = await coordinator.ExecuteAsync(filePath, context, ct);

// All signals from all waves
foreach (var signal in context.GetAllSignals())
{
    Console.WriteLine($"{signal.Key}: {signal.Value}");
}

مسارات المنافسة:

الأمواج تجري في مسارات مع حدود متطابقة مختلفة:

الطريق الهدف التنافس
fast التحققات السريعة
normal المعالجة القياسية ( التحليل, التجزئةM SK3 \8
io I/O مقيد ( يقرأ ملفاًM SK3 مكالمات APIMSC4 32
llm إتصالات LLM مكلفة 2 SMK3

هذا يمنع عمليات مكلفة من منع عمليات رخيصة.


العمارة: كيف تتناسب مع بعضها البعض

هنا ' الصورة الكاملة :

graph TB
    subgraph Input["Input Layer"]
        REQ[HTTP Request]
        FILE[File Upload]
        JOB[Background Job]
    end

    subgraph Ephemeral["Ephemeral Layer"]
        COORD[Work Coordinator]
        OPS[Operations<br/>own signals]
        SINK[SignalSink<br/>read-only view]
    end

    subgraph StyloFlow["StyloFlow Layer"]
        MAN[Manifests]
        WAVE[Wave Coordinator]
        ATOMS[Atoms<br/>own signals]
    end

    subgraph Execution["Execution"]
        FAST[Fast Lane]
        NORM[Normal Lane]
        LLM[LLM Lane]
    end

    subgraph Output["Output"]
        RES[Results]
        ESCAL[Escalation]
        STORE[Persistence]
    end

    REQ --> COORD
    FILE --> COORD
    JOB --> COORD

    COORD --> OPS
    SINK -.queries.-> OPS

    WAVE -.reads.-> SINK
    MAN -.configures.-> WAVE
    WAVE --> ATOMS

    ATOMS --> FAST
    ATOMS --> NORM
    ATOMS --> LLM

    SINK -.queries.-> FAST
    SINK -.queries.-> NORM
    SINK -.queries.-> LLM

    SINK -.read for.-> RES
    SINK -.read for.-> ESCAL
    SINK -.read for.-> STORE

    style COORD stroke:#339af0
    style SINK stroke:#339af0
    style WAVE stroke:#51cf66
    style ATOMS stroke:#51cf66

التدفق:

  1. تأتي الدخل (طلب HTTP, ملفM SK2 وظيفة
  2. يخلق المنسق الأفتراضي عملية ( التي تملك قائمة إشارات فارغة)
  3. عملية تضيف إشارات إلى قائمة مملوكة لها
  4. مخطط الموجات يقرأ الإشارات من خلال نظرة SignalSink للتحقق من ظروف التنبيه
  5. الأمواج التي تتطابق تشغيل في ترتيب أولي داخل مسارات التصادم
  6. كل موجة تضيف إشارات لتشغيلها
  7. يستمر координатор الموجات في قراءة الإشارات لإيجاد محفزات جديدة مُرضية
  8. أسئلة الاستقبال النهائية SignalSink لقراءة الإشارات وتحديد الحركات

نموذج الملكية: كل عملية../..تم يمتلك إشاراته.. ...signalSink يقدم رؤية قراءة.-..only view across all operations.M SK3..Signals can be escalated. (.

نموذج تنفيذي الحالي: واحد - العمليات , التطابقة المحدودة | , | عمليات قابلة للملاحظة مع التخلص من الـ LRU |.

نموذج تنفيذ المستقبلي: مسارات متوزعة عبر الآلات, أسئلة سيگنالSink عمليات عن بعد, أذرع تنفذ على مضيفين مختلفينM SK2 الإشارات تبقى الحدود المستقرة - إنهم'متوفرون بالفعل على التسلسل السلسليM SK2 مسجلون في وقتٍ محدد , ومكونون بأنفسهم - متضمنين M SK5 نموذج الملكية لا يتغير MSC6 لا يتغيّر

إن -التطبيق في العملية يتحقق من الدلالة. التوزيع هو حول توسيع substrate التنفيذM SK2 بدون تغيير نموذج الأوركستراشن .


استخدام حالة: معالجة مستندات lucidRAG

دعونا نرى كيف lucidRAG يستخدم StyloFlow:

المرحلة 1: الكشف الأولي

public class FileTypeDetectorWave : IContentAnalysisWave
{
    public int Priority => 100;  // Run first

    public async Task<IEnumerable<Signal>> AnalyzeAsync(...)
    {
        var extension = Path.GetExtension(path);

        return new[]
        {
            new Signal
            {
                Key = "file.extension",
                Value = extension,
                Source = "FileTypeDetector"
            }
        };
    }
}

المرحلة 2: تدوير ( تم استشعاره بواسطة الملف.متtensionM SK3

// In manifest:
// triggers:
//   requires:
//     - signal: file.extension
//       condition: in
//       value: [".pdf", ".docx", ".md"]

public class ChunkingWave : ConfiguredComponentBase, IContentAnalysisWave
{
    public int Priority => 80;

    public async Task<IEnumerable<Signal>> AnalyzeAsync(...)
    {
        var chunks = await ChunkDocumentAsync(path);

        ctx.SetCached("chunks", chunks);  // Share with other waves

        return new[]
        {
            new Signal
            {
                Key = "document.chunked",
                Value = chunks.Count,
                Source = Name
            }
        };
    }
}

المرحلة 3: الدمج ( تم توجيهه بواسطة الملفM SK2 تم وضعه على سطح البحر)

public class EmbeddingWave : ConfiguredComponentBase, IContentAnalysisWave
{
    public int Priority => 60;

    public bool ShouldRun(string path, AnalysisContext ctx)
    {
        // Only run if chunking succeeded
        return ctx.GetSignal("document.chunked") != null;
    }

    public async Task<IEnumerable<Signal>> AnalyzeAsync(...)
    {
        var chunks = ctx.GetCached<List<Chunk>>("chunks");
        var embeddings = await GenerateEmbeddingsAsync(chunks);

        ctx.SetCached("embeddings", embeddings);

        return new[]
        {
            new Signal
            {
                Key = "embeddings.generated",
                Value = embeddings.Count,
                Source = Name
            }
        };
    }
}

المرحلة 4: إستخراج الكائنات ( متوازن مع الدمج)

public class EntityExtractionWave : ConfiguredComponentBase, IContentAnalysisWave
{
    public int Priority => 60;  // Same as embedding - runs in parallel

    public async Task<IEnumerable<Signal>> AnalyzeAsync(...)
    {
        var chunks = ctx.GetCached<List<Chunk>>("chunks");

        // Use deterministic IDF scoring, not LLM per chunk
        // (See Reduced RAG pattern)
        var entities = await ExtractEntitiesAsync(chunks);

        return new[]
        {
            new Signal
            {
                Key = "entities.extracted",
                Value = entities.Count,
                Confidence = CalculateConfidence(entities),
                Source = Name
            }
        };
    }
}

المرحلة 5: التحقق من الجودة

public class QualityCheckWave : ConfiguredComponentBase, IContentAnalysisWave
{
    public int Priority => 40;  // After embedding + entities

    public async Task<IEnumerable<Signal>> AnalyzeAsync(...)
    {
        var embeddingSignal = ctx.GetSignal("embeddings.generated");
        var entitySignal = ctx.GetSignal("entities.extracted");

        var embeddingCount = (int)embeddingSignal.Value;
        var entityConfidence = entitySignal.Confidence;

        var quality = CalculateQuality(embeddingCount, entityConfidence);

        var signals = new List<Signal>
        {
            new Signal
            {
                Key = "quality.score",
                Value = quality,
                Source = Name
            }
        };

        // Trigger escalation if quality is poor
        if (quality < GetParam<double>("quality_threshold", 0.7))
        {
            signals.Add(new Signal
            {
                Key = "escalation.needed",
                Value = "low_quality_document",
                Source = Name
            });
        }

        return signals;
    }
}

فوائد هذه المقاربة:

  1. تنفيذ موازي - الدمج و استخراج الكائنات تعمل في نفس الوقت
  2. التفريغ الثابت - التحقق من الجودة يقرر إذا كان هناك حاجة إلى التدرج
  3. السياق المشترك - موجات تتمكن من الوصول إلى قطع بدون أن تنقلها بشكل واضح
  4. سهلة الإمتداد - أضيف موجة جديدة دون تغيير الموجات الموجودة
  5. قابلة للملاحظة - كل مرحلة تبعث إشارات يمكنك مراقبةها

هذا هو تقلل من RAG النمط في العمل: الاستخراج المعرفي في المقدمة, اللوحات فقط للsynthesisM SK2


إستخدام موضوعي: إستكشاف ستيلوبوب bot

ستيلوبوت هو نظام إكتشاف الروبوتات المتقدم الذي يستخدم "ستيلوفلو" لتحليل التهديدات المتعددة.


إشارات -نماذج الأوركستراشن المحفزة

النمط 1: ميناء-خارج

إشارة واحدة تثير موجات متعددة:

graph LR
    S1[document.uploaded] --> W1[ChunkingWave]
    S1 --> W2[MetadataWave]
    S1 --> W3[LanguageDetectionWave]

    W1 -.signal.-> S2[document.chunked]
    W2 -.signal.-> S3[metadata.extracted]
    W3 -.signal.-> S4[language.detected]

    style S1 stroke:#339af0
    style S2 stroke:#339af0
    style S3 stroke:#339af0
    style S4 stroke:#339af0
    style W1 stroke:#51cf66
    style W2 stroke:#51cf66
    style W3 stroke:#51cf66

النمط 2: إعتماد متسلسل

الأمواج تنتظر الإشارات السابقة:

graph LR
    W1[ExtractWave] -.signal.-> S1[text.extracted]
    S1 --> W2[ChunkWave]
    W2 -.signal.-> S2[text.chunked]
    S2 --> W3[EmbedWave]
    W3 -.signal.-> S3[embeddings.generated]

    style S1 stroke:#339af0
    style S2 stroke:#339af0
    style S3 stroke:#339af0
    style W1 stroke:#51cf66
    style W2 stroke:#51cf66
    style W3 stroke:#51cf66

النمط 3: قسم محدد

موجات مختلفة تعمل على أساس الإشارات:

graph TD
    W1[DetectorWave] -.signal.-> S1{confidence}

    S1 -->|< 0.4| W2[RejectWave]
    S1 -->|0.4-0.7| W3[EscalateWave]
    S1 -->|> 0.7| W4[AcceptWave]

    W2 -.signal.-> S2[rejected]
    W3 -.signal.-> S3[escalated]
    W4 -.signal.-> S4[accepted]

    style S1 stroke:#ffd43b
    style S2 stroke:#ff6b6b
    style S3 stroke:#ff922b
    style S4 stroke:#51cf66
    style W1 stroke:#339af0
    style W2 stroke:#ff6b6b
    style W3 stroke:#ff922b
    style W4 stroke:#51cf66

نمط 4: التجميع

إشارات متعددة تثير موجة واحدة:

graph LR
    W1[Wave A] -.signal.-> S1[a.complete]
    W2[Wave B] -.signal.-> S2[b.complete]
    W3[Wave C] -.signal.-> S3[c.complete]

    S1 --> T{All Ready?}
    S2 --> T
    S3 --> T

    T -->|Yes| W4[AggregatorWave]
    W4 -.signal.-> S4[aggregation.complete]

    style S1 stroke:#339af0
    style S2 stroke:#339af0
    style S3 stroke:#339af0
    style S4 stroke:#51cf66
    style T stroke:#ffd43b
    style W4 stroke:#51cf66

نمط الهبوط

StyloFlow يدعم التدرج على مستوىين:

  1. في داخل koordinator -: موجات تتأكد من الثقة في الإشارة وتجري مرحلات مكلفة بشكل مشروط
  2. الم koordinator Inter-: EscalatorAtom routes signals from fast coordinator → expensive coordinator

مثال من lucidRAG: يتم استخراج الكائنات السريعة أولاً. إذا كانت الجودة M SK2 0.7, ينقل المسار الذاتي للوثيقة إلى مخطط تكرير LLM مكلفMSC4 هذا يوفر 20x في التكلفة من خلال تجنب مكالمات LLM باهظة الثمن من أجل extractions ذات جودة عاليةMST6Mst7


الشكل المحدود

هذا ليس دليلاً سريعاً

الinstallation:

dotnet add package StyloFlow.Complete

نقطة دخول مفهومة:

// 1. Define a wave
public class MyAnalysisWave : IContentAnalysisWave
{
    public string Name => "MyAnalysis";
    public int Priority => 50;
    public bool Enabled { get; set; } = true;

    public bool ShouldRun(string path, AnalysisContext ctx) => true;

    public async Task<IEnumerable<Signal>> AnalyzeAsync(
        string path,
        AnalysisContext ctx,
        CancellationToken ct)
    {
        // Your analysis logic here
        var result = await AnalyzeAsync(path);

        return new[]
        {
            new Signal
            {
                Key = "my.signal",
                Value = result,
                Confidence = 1.0,
                Source = Name
            }
        };
    }
}

// 2. Register waves
var waves = new List<IContentAnalysisWave>
{
    new MyAnalysisWave(),
    new AnotherWave(),
};

// 3. Create coordinator
var coordinator = new WaveCoordinator(
    waves,
    CoordinatorProfile.Default);

// 4. Execute
var context = new AnalysisContext();
var results = await coordinator.ExecuteAsync(filePath, context);

// 5. Read signals
foreach (var signal in context.GetAllSignals())
{
    Console.WriteLine($"{signal.Key}: {signal.Value} ({signal.Confidence})");
}

مع الميثاقات:

// Load manifests from directory
var loader = new FileSystemManifestLoader("./manifests");
var manifests = await loader.LoadAllAsync();

// Build waves from manifests
var waves = manifests
    .Where(m => m.Enabled)
    .OrderBy(m => m.Priority)
    .Select(m => WaveFactory.Create(m))
    .ToList();

var coordinator = new WaveCoordinator(waves, profile);

لنرى الأمثلة الكاملة, في مخزن StyloFlow GitHub.


إكتشاف تدفق العمل: بيانات YAML

واحدة من خصائص StyloFlow' الأساسية هي قابلية لاكتشاف تدفق العمل - يمكنك أن تفهم خط الأنابيب بأكمله فقط من خلال قراءة الميثاقات. لا يتوجب عليك الغوص في الرمز

أنابيب مستندة ل lucidRAG كاملة

هنا ' هي الهيكل الفعلي للمجلد الموضح لـ lucidRAG :

manifests/
├── 01-file-type-detector.yaml
├── 02-chunking.yaml
├── 03-embedding.yaml
├── 04-entity-extraction.yaml
├── 05-quality-check.yaml
└── 06-escalation.yaml

01-file-type -detectorM SK3yamlMSC4

name: FileTypeDetector
priority: 100
enabled: true
description: Detects file type from extension

taxonomy:
  kind: sensor
  determinism: deterministic
  persistence: ephemeral

triggers:
  requires:
    - signal: document.uploaded
      condition: exists

emits:
  on_start:
    - file.detection.started
  on_complete:
    - key: file.extension
      type: string
      confidence_range: [1.0, 1.0]
    - key: file.mime_type
      type: string
      confidence_range: [1.0, 1.0]

lane:
  name: fast
  max_concurrency: 16

budget:
  max_duration: 10ms

02-chunkingM SK1yaml:

name: ChunkingWave
priority: 80
enabled: true
description: Splits documents into semantic chunks

taxonomy:
  kind: extractor
  determinism: deterministic
  persistence: ephemeral

input:
  accepts:
    - document.pdf
    - document.docx
    - document.markdown
  required_signals:
    - file.extension

triggers:
  requires:
    - signal: file.extension
      condition: in
      value: [".pdf", ".docx", ".md", ".txt"]

emits:
  on_complete:
    - key: document.chunked
      type: integer
      confidence_range: [1.0, 1.0]
    - key: chunks.cached
      type: boolean

lane:
  name: normal
  max_concurrency: 8

budget:
  max_duration: 30s

defaults:
  chunking:
    max_chunk_size: 512
    overlap: 50
    respect_boundaries: true

03-embeddingM SK1yaml:

name: EmbeddingWave
priority: 60
ires:
    - signal: file.extension
      condition: in
      value: [".pdf", ".docx", ".md", ".txt"]

emits:
  on_complete:
    - key: document.chunked
      type: integer
      confidence_range: [1.0, 1.0]
    - key: chunks.cached
      type: boolean

lane:
  name: normal
  max_concurrency: 8

budget:
  max_duration: 30s

defaults:
  chunking:
    max_chunk_size: 512
    overlap: 50
    respect_boundaries: true

03-embeddingM SK1yaml:

name: EmbeddingWave
priority: 60
enabled: true
description: Generates ONNX embeddings for chunks

taxonomy:
  kind: embedder
  determinism: deterministic
  persistence: cached

input:
  required_signals:
    - document.chunked
    - chunks.cached

triggers:
  requires:
    - signal: document.chunked
      condition: ">"
      value: 0

emits:
  on_complete:
    - key: embeddings.generated
      type: integer
      confidence_range: [1.0, 1.0]

lane:
  name: normal
  max_concurrency: 4

budget:
  max_duration: 2m
  max_cost: 0.0  # Local ONNX model

defaults:
  embedding:
    model: all-MiniLM-L6-v2
    batch_size: 32

04-entity-extraction .yamlM SK3

name: EntityExtractionWave
priority: 60  # Same as embedding - runs in parallel
enabled: true
description: Extracts entities using IDF scoring

taxonomy:
  kind: extractor
  determinism: deterministic
  persistence: persisted

input:
  required_signals:
    - document.chunked

triggers:
  requires:
    - signal: document.chunked
      condition: ">"
      value: 0

emits:
  on_complete:
    - key: entities.extracted
      type: integer
      confidence_range: [0.0, 1.0]  # Confidence varies

lane:
  name: normal
  max_concurrency: 8

budget:
  max_duration: 1m

defaults:
  entity:
    min_idf_score: 2.5
    min_frequency: 2
    max_entities: 100

05-QualityM SK1check.yamlMSC3

name: QualityCheckWave
priority: 40
enabled: true
description: Validates extraction quality

taxonomy:
  kind: gatekeeper
  determinism: deterministic
  persistence: ephemeral

input:
  required_signals:
    - embeddings.generated
    - entities.extracted

triggers:
  requires:
    - signal: embeddings.generated
      condition: ">"
      value: 0
    - signal: entities.extracted
      condition: exists

emits:
  on_complete:
    - key: quality.score
      type: double
      confidence_range: [0.0, 1.0]

  conditional:
    - key: escalation.needed
      when: quality.score < 0.7

lane:
  name: fast
  max_concurrency: 16

defaults:
  quality:
    min_embeddings: 5
    min_entity_confidence: 0.5
    threshold: 0.7

06-استنخفاضM SK1yaml:

name: EscalationWave
priority: 20
enabled: true
description: Improves low-quality extractions using LLM

taxonomy:
  kind: proposer
  determinism: probabilistic
  persistence: persisted

input:
  required_signals:
    - escalation.needed

triggers:
  requires:
    - signal: escalation.needed
      condition: exists
  skip_when:
    - signal: budget.exhausted

emits:
  on_complete:
    - key: escalation.complete
      type: boolean
    - key: entities.improved
      type: integer
      confidence_range: [0.7, 1.0]

lane:
  name: llm
  max_concurrency: 2  # Expensive

budget:
  max_duration: 30s
  max_tokens: 4000
  max_cost: 0.05

defaults:
  llm:
    model: gpt-4o-mini
    temperature: 0.1
    prompt_template: entity_extraction

الفوائد من الميثاقات الإعلانية

بالنظر إلى هذه الملفات, تعرفون فوراً:

  1. توصيل تنفيذ MSC0 أرقام أولية MSC1 msc2 scs3 svc4 Svc5 vc6 vs svc7 vs svc8 ws9
  2. الإعتمادات - ما هي الإشارات التي يحتاجها كل موجة للتشغيل
  3. التوازن - الدمج (60) و إخراج Entity МSK2 تعمل معا
  4. حدود الموارد - مسارات مختلفة وتزامن لكل موجة
  5. المنطق الثابت - الإنخفاض يشتغل فقط إذا كانت الجودة
  6. حدود التكلفة - التسارع لديه علامة وحدود التكلفة

لا نحتاج لقراءة الرمز. تدفق العمل هو ذاتي-documenting.

الرمز-أذرات مبنية على الميثاقات التي تشير إليها

في حين أن الأمثلة السابقة تظهر موجات YAML , معلنة بالكامل يمكن أن تكون كود-أذرات مبنية على تشير في الميثاقات:

name: CustomAnalyzer
priority: 50
enabled: true
description: Custom analysis logic

# Reference a code-based atom implementation
implementation:
  assembly: MyProject.Analyzers
  type: MyProject.Analyzers.CustomAnalyzerWave
  method: AnalyzeAsync

# The manifest still declares the contract
taxonomy:
  kind: analyzer
  determinism: probabilistic

triggers:
  requires:
    - signal: data.ready

emits:
  on_complete:
    - key: analysis.complete
      confidence_range: [0.0, 1.0]

lane:
  name: normal
  max_concurrency: 4

# Configuration values passed to the atom
defaults:
  threshold: 0.75
  max_iterations: 10

تطبيق C#

public class CustomAnalyzerWave : ConfiguredComponentBase, IContentAnalysisWave
{
    public async Task<IEnumerable<Signal>> AnalyzeAsync(
        string path,
        AnalysisContext ctx,
        CancellationToken ct)
    {
        // Access manifest config
        var threshold = GetParam<double>("threshold", 0.75);
        var maxIterations = GetParam<int>("max_iterations", 10);

        // Custom logic here
        var result = await PerformComplexAnalysis(path, threshold, maxIterations);

        return new[]
        {
            new Signal
            {
                Key = "analysis.complete",
                Value = result.Score,
                Confidence = result.Confidence,
                Source = Name
            }
        };
    }
}

الفوائد:

  • بيان يعلن عن العقد - تثير, إشارات, ميزانية, مسارات
  • البرمجة توفر تنفيذ - منطق معقد, إعتمادات خارجية
  • تتدفق الإعدادات من خلال - تلقائيات المظاهر تتجاوز تلقائية البرمجة
  • اختبار الإستقلال - البرمجة التجريبية بدون الميثاقات, تتحقق من الميثقات بدون تشغيل الرمز

هذا المقاربة الهجينة تعطيك إكتشاف تدفق العمل الإفتراضي بينما تحافظ على المنطق المعقد في C#. قابل للحفاظ

رؤية أنابيب من الميثاقات

الهيكل الموضح يجعل من البسيط صنع التصورات

graph TD
    DOC[document.uploaded] --> FT[FileTypeDetector<br/>Priority: 100<br/>Lane: fast]
    FT --> EXT[file.extension]

    EXT --> CH[ChunkingWave<br/>Priority: 80<br/>Lane: normal]
    CH --> CHUNKED[document.chunked]

    CHUNKED --> EMB[EmbeddingWave<br/>Priority: 60<br/>Lane: normal]
    CHUNKED --> ENT[EntityExtractionWave<br/>Priority: 60<br/>Lane: normal]

    EMB --> EMBGEN[embeddings.generated]
    ENT --> ENTEX[entities.extracted]

    EMBGEN --> QC[QualityCheckWave<br/>Priority: 40<br/>Lane: fast]
    ENTEX --> QC

    QC --> QSCORE[quality.score]
    QC -.conditional.-> ESC_NEED[escalation.needed]

    ESC_NEED -.-> ESC[EscalationWave<br/>Priority: 20<br/>Lane: llm]
    ESC --> ESC_DONE[escalation.complete]

    style DOC stroke:#339af0
    style FT stroke:#51cf66
    style CH stroke:#51cf66
    style EMB stroke:#51cf66
    style ENT stroke:#51cf66
    style QC stroke:#ffd43b
    style ESC stroke:#ff922b

هذا الرسم البياني تم إنشاؤه بطريقة برمجية من بيانات YAML - لا رسمة يدوية.


جانبا: باستخدام البرمجة لـ LLMs — طريق StyloFlow

أحد خصائص StyloFlow الغير متوقعة هو أنه يخلق نظام يمكن لـ LLM أن تفكر بشكل آمن.

أغلب المحاولات لإستخدام LLMs للحل الخطأ أو التوصيل فشلت لأن النظام الذي سقطوا فيه هو غير مرئي

  • الدولة تلقائية
  • تدفق التحكم مدفون في الشفرة
  • القرارات مشفرة كآثار جانبية
  • الملاحظات مؤثرة , ليست سببية

StyloFlow يفعل العكس. إنه يكشف الحقيقة الغير قابلة للتغيير عن ما حدث , عندما , ومع أي ثقة .

هذا يجعل برمجيات الـ LLM مفيدة حقاً — ليس كفاعلين, لكن كـ الخبراء.

سبب LLM حول النظام, ليس في الداخل ذلك

في StyloFlow, لا يوجد LLM

  • يقفز تنفيذ
  • يصدر إشارات
  • حالة الميتات
  • قرارات ملكية

بدلاً من , يُعطى نظرة SignalSink و طرحت أسئلة مثل:

  • "لماذا تتصاعد هذه الموجة
  • " أي إشارة جعلت هذا الطريق يعمل?"
  • "أين أقل ثقة?"
  • " أي إشارة في المسار العلوي تعارض هذه النتيجة?"
  • "ماذا سيحدث إذا رفعت هذا الحد

مدخل مثال لرمز LLM:

{
  "operation": "doc-123",
  "signals": [
    { "key": "document.chunked", "value": 12, "confidence": 1.0, "source": "ChunkingWave" },
    { "key": "entities.extracted", "value": 4, "confidence": 0.42, "source": "EntityWave" },
    { "key": "quality.score", "value": 0.39, "source": "QualityCheckWave" },
    { "key": "escalation.needed", "source": "QualityCheckWave" }
  ]
}

ذلك' ليس تدفقاً لسجلات أساس المنطق.

يمكن لـ LLM الآن :

  • أشرح السببية ("استثارة مسببة لأن الجودة < حد الخطر")
  • أتعرف على الروابط الضعيفة (" الثقة في استخراج الكائنات تسيطر على الفشل ")
  • اقترح التخفيضات ("تشغيل مستخرج مختلف قبل أن يتصاعد
  • اقترح تغييرات إعدادية ("صفر أقل من الكيان -IDF للPDFs")

كل شيء دون أن يثق به أفعل أي شيء.

فك الأخطاء يصبح معاینه, ليس إعادة تنفيذ

تقليديا "LLM تفكيك " يحاول إعادة تشغيل العالم:

" ها هو ' هناك الشفرة وبعض الملاحظات

فك الأخطاء في StyloFlow أكثر بساطة:

"هذه هي الحالة المحددة للنظام الذي تم ملاحظته

لأن الإشارات غير قابلة للتغيير و مملوكة

أسباب LLM حول الحقائق التي تثق بها بالفعل.

لماذا هذا لا يتحول إلى مسرح عمل

هذا يعمل فقط بسبب الحدود الصارمة:

  • يمكن لـ LLM تحليل الإشارات
  • البرمجة الإفتراضية التصرفات على الإشارات
  • يظهر فقط ويغير سلوك البرمجة

لا يوجد حلقة ردود الفعل حيث أن الـ LLM " يحدد ـ " الخطوة التالية . على الأغلب ــ , يقترح تفسيرات أو إقتراحات تركيبية يمكن أن تطبق ـ human (or deterministic policy) later

أن عدم التناظر هو مقصود

الجانب - مؤثر : نفس المستقبل - ضبط بدون استقلالية

بمجرد إشارة , وثقة , ونتائجها واضحة "M SK2" فأنت يمكن بعد ذلك:

  • آثار إشارات الألغام التاريخية
  • تقييم أي التدرجات التي ساعدت
  • تضبط عتبة الإنقطاع عن الإنترنت
  • تحفيز أو تخفيض الأمواج بين الطرقات

لا يتطلب أي من ذلك أن يسمح لـ LLM بتشغيل النظام.

أصبح الـ LLM عدسة التشخيص, ليس سطحاً للتحكم

لماذا هذا مهم

StyloFlow لا يجعل فقط الأنظمة الإفتراضية آمنة

إنها تجعلهم قابلة للقراءة — للبشر , لاختبارات ,, و للمرضى المصابين بمرض نقص المناعة المكتسبة .

أن' هو الفرق بين :

  • "LLMs تشغل نظامك"
  • و "LLMs فهم نظامك"

واحد فقط من تلك المقياس


الخصائص الناشئة

1. تركيب بياني

المكونات تعلن عن عقودهم (لتحريكات,إشاراتM SK2ميزانية ), ليست إعتماداتهمMSC4 يحدد النظام ترتيب تنفيذهاMST5 هذا ليس MST6 ليس خاصية MSC7 إنه MSC8 ما يحدث عندما تقوم بصنع الإشارات أولاً MSc9طبقة MScsk10

2. قابلة للملاحظة بالលំនាំដើម

كل فعل هو إشارة . لا تضيفون ' لا يضيفون قابلية للملاحظة - إنها ' هي ذاتية . ردة الفعل الكاملة | , | متابعة الثقة | , | مسارات التسارع |, | و انخفض استهلاك الميزانية طبيعيا |.

3. تنفيذ ملائم

تقييمات الثقة تقود التفريغ دون منطق توجيه واضح. تجاوز مراحل مكلفة عندما تكون غير ضرورية, يتصاعد عند عدم التأكدM SK2 يتوقف مبكراً عند ارتفاعٍٍ عاليًا - فشلات الثقةMSC4تدفق التحكم يظهر من أنماط الإشارات

4. قابلية للاختبار دون تقليد الهياكل

إشارات مزحة, لا أجزاء:

var context = new AnalysisContext();
context.AddSignal(new Signal
{
    Key = "document.chunked",
    Value = 10,
    Confidence = 1.0,
    Source = "Test"
});

var wave = new EmbeddingWave();
var results = await wave.AnalyzeAsync(path, context, ct);

Assert.Single(results);
Assert.Equal("embeddings.generated", results.First().Key);

5. التعقيد المتزايد

أبدأ ببساطة:

var coordinator = new EphemeralWorkCoordinator<Job>(ProcessAsync);

أضف إشارات عند الحاجة:

new EphemeralOptions { Signals = signalSink }

أضف موجات لعدة -رحلة:

var waveCoordinator = new WaveCoordinator(waves, profile);

أضف الميثاقات للconfig التصريحي:

name: MyWave
triggers: [...]
emits: [...]

أنابيب كاملة: lucidRAG Document Ingestion

هنا ' هو النموذج الكامل lucidRAG خط أنابيب في لمحة (انظر إلى أمثلة البرمجة الدقيقة في "Use Case: lucidRAG Document Processing

  1. أرفعdocument.uploaded إشارة
  2. FileTypeWave يكشف PDF/DOCXM SK1Markdown → file.extension إشارة
  3. موجة الإستخراج يسحب النص والبنية → text.extracted إشارة
  4. موجة تشينج يقسم بشكل سيمي → document.chunked إشارة
  5. موجة الدمج ينتج محركات (parallel) → embeddings.generated إشارة
  6. موجة كيان يستخرج كيانات (parallel) → entities.extracted إشارة
  7. موجة الجودة يتأكد من الكمال → quality.score إشارة
  8. موجة التسارع (تحضيريا إذا كانت الجودة < | | 0.7) | escalation.complete إشارة
  9. موجة تخزين يستمر إلى Qdrant + PostgreSQL → storage.complete إشارة

يsubscribe UI to the SignalSink for real-time progress updates M SK1push pattern):

// Subscribe to sink for push notifications
signalSink.Subscribe(signal => {
    if (signal.Key.StartsWith("document."))
    {
        await _hub.Clients.User(userId)
            .SendAsync("DocumentProgress", new
            {
                stage = signal.Key,
                progress = CalculateProgress(signal),
                operationId = signal.OperationId
            });
    }
});

أو استخدم نمط السحب إذا كنت تفضل التصويت:

// Query SignalSink for document progress (pull pattern)
var documentSignals = signalSink.GetSignals()
    .Where(s => s.Key.StartsWith("document.") &&
                s.Timestamp > lastCheck);

foreach (var signal in documentSignals)
{
    UpdateProgressUI(signal);
}

النقطة الرئيسية: تsubscribe to the SINK (which views all atoms), not individual operations . Atoms own signals; the sink provides push

هكذا lucidRAG يعالج الوثائق , البيانات , وصور من خلال إشارة موحدة DocSummarizer, المزيج للبيانات, و ImageSummarizer تحت طبقة عزف واحدة.


أنابيب كاملة : إكتشاف شاحنة Stylobot

هنا ' هو النموذج الكامل ستيلوبوت خط أنابيب في لمحة (انظروا إلى الرمز التفصيلي في "استقلال: من السرعة إلى البساطةM SK3

  1. موجة الإعجاب يفحص IP ضد قوائم الروبوت المعروفة (< 10ms) | bot.detected إشارة بثقة
  2. موجة تحليل السلوك (تحتمي إذا 0.4 < الثقة < |0.7) تقوم بتحليل عامل المستخدم ونماذج الضغط | → | مكررة bot.detected إشارة
  3. موجة التحليل لـ LlmBot (conditional إذا مازالت غامضة) يستخدم LLM لتحليل المحادثة → final bot.detected إشارة

الفوائد الرئيسية MSC0 التضخم المبني على الثقة MSC1

// ❌ Traditional: Every request gets expensive analysis
var reputation = await CheckIpAsync(ip);
var behavior = await AnalyzeBehaviorAsync(session);  // Even if IP is known bad
var llmScore = await LlmAnalysisAsync(conversation);  // Always expensive

// ✅ StyloFlow: Waves run based on confidence signals
// BehaviorAnalysis only runs if confidence is ambiguous (0.4-0.7)
// LLM analysis only runs if still unsure after behavior check

breakdown Cost: تكاليف الفحص IP $0 وتجري 100% من الوقت . تجري تحليل السلوك 30% S( حالات غامضة ). تجرى تحليل الـ LLM 5% ( لا تزال غامضة ). كلفة لكل طلب مسك9 $0.0001 ضد ساذج "LLM كل شيء" في $0.002 (20x المدخراتM SK1


مقارنة مع محركات تدفق العمل الأخرى

الميزة StyloFlow Temporal Airflow МSK4 Step Functions
لتنسيق إشارة - مدفوعة RPC - بناء على 4 5 مبنى على ـ 6 الآلة الحكومية 7
التصريح ✅ بيانات YAML ❌ الرمز S-أول M \✅ DAGs МSK7 JSON / YAML
شرطية ✅ كاشفات الإشارات ✅ الظروف ♫ ✅ التفريغ ♫ ✅ ♫ حالات الاختيار ♫
التسارع ✅ بنيت- في دليل
قابلة للملاحظة ✅ ردة فعل إشارات تاريخ التدفق العملي سجلات المهام ماسك6 مسك7 History of the execution
مراقبة الميزانية ✅ टोकن/محدودة التكلفة \❌ دليل S ❌ دليل
تنفيذ محلي ✅ في -العملية МSK3 \❌ تحتاج إلى مجموعة تحتاج إلى المجموعة МSK7 AWS فقط
مسارات التنافس ✅ أسرع/معتادM SK3LLM ♫❌ دليل ✅ حوض

أين يلائم هذا النموذج طبيعيا:

  • خط أنابيب مع التدرج ( رخيص → مكلف
  • معالجة الوثائق بدرجات مسبقة
  • إكتشاف البوت مع تحليل مرحلي متعدد
  • أنظمة RAG بجيل البحث الهجين +
  • أي عملية عمل حيث تتجاوب المكونات مع نقاط الثقة

أين لا ينجح

  • الوظائف المتسلسلة البسيطة (
  • تدفقات عمل متوزعة بالغة عبر مراكز البيانات (حل هذا من خلال الطقس)
  • أطول -تدفقات عمل مع الموافقة البشرية (TemporalM SK2Airflow)
  • إصدارات عمليّة مع نقل الschema (Temporal)

أين يقود هذا النموذج

هذه تطوّر طبيعية للنموذج , وليست إلتزامات بتنفيذ معين .

مع التوازن في الدلالية من خلال تطور lucidRAG و Stylobot, تصبح هذه الأنماط قابلة للتطبيق:

1. التعلم من الإشارات

تتبع أي مسارات التدرج تعمل بشكل أفضل:

// Did the LLM escalation improve accuracy?
// Learn to skip it if behavioral analysis is sufficient

2. تحسين التكلفة

تعيين مسارات تلقائياً على أساس الأداء التاريخي:

// If a "slow" wave completes quickly, promote to "normal"

3. إعادة تشغيل الإشارة

فك الخطأ بإعادة تشغيل تسلسلات الإشارات:

var replay = SignalReplay.FromFile("trace.jsonl");
await coordinator.ReplayAsync(replay);

4. متعددة- توازن الآلة

توزيع الممرات عبر الآلات بينما تبقي الإشارات مركزية.


لماذا الإشارات مهمة

المنظور الأساسي هو هذا في أنظمة الذكاء الصناعي،,، كل جزء لديه ثقة.

تدفقات العمل التقليدية تفترض النجاح

  • نقاط الثقة - كم نحن متأكدين
  • تنفيذ محدد - تخطي المراحل الثمنية إذا كنت متأكدة
  • التسارع - أحاول أكثر عندما تكون غير متأكدة
  • التجميع - تدمج إشارات متعددة

الإشارات توفر هذا طبيعيا:

// Multiple detectors vote
var signals = context.GetSignals("bot.detected");

// Aggregate by confidence
var verdict = signals
    .OrderByDescending(s => s.Confidence)
    .First();

// Or majority vote
var isBot = signals
    .Count(s => (bool)s.Value) > signals.Count() / 2;

// Or weighted average
var score = signals
    .Sum(s => (bool)s.Value ? s.Confidence : -s.Confidence)
    / signals.Count();

هذا هو السبب في أن StyloFlow يعمل بشكل جيد تقلل من RAG - كل مرحلة استخراج تنتج درجة الثقة , وتحصل على التركيب فقط عندما يكون الثقة مرتفعة بما فيه الكفاية


الخلاصة

نموذج التنفيذ:

  • الإشارات كحقائق أولية -طبقة (لا الأحداث أو الرسائل)
  • نقاط الثقة تقود تدفق التحكم
  • تتوافق الموجات عن طريق المحفزات, وليست المكالمات المباشرة
  • الطرق تفرض حدود الموارد
  • بنيت على أكثر وضوحا.طفيف

لماذا الإشارات مهمة:

  1. حدود التوزيع المستقر - قابلة للسلسلة, مبرمجة بجدول , متضمنة بذاتها
  2. التركيب التصريحي - الميثاقات تحدد العقد, وقت التشغيل يحدد تنفيذها
  3. التنقل المتكيف - Confidence تمكن التسارع من دون تجزئة مشفرة
  4. قابلية الملاحظة المتوارثة - كل عمل هو بالفعل إشارة
  5. تخلص من الملكية - إشارات الذرات الخاصة, عدم التناغم الخارجي يمنع التحركM SK2at

تطبيقات العمل:

  • lucidRAG - CrossM SK1document modal Q&A with conditional entity extraction
  • ستيلوبوت - إكتشاف الجرذان بثقة- التسارع المدفوع ( IP | → | سلوك |→ | LLM
  • تقلل من RAG - الاستخراج المعرفي + تركيب LLM مقيد

المقالات الأخرى:

شفرة المصدر: GitHub - StyloFlow


الإدراك الأساسي

محركات تدفق العمل التقليدية تطلب منك الإعلان ماذا سيحدث بعد ذلك. هذا النموذج يطلب من المكونات أن declare ما ينتجونه و ما يحتاجونه, عندها يسمح لمؤشرات أن تنسق تنفيذها.

التحول الرئيسي: إختلاف المؤشرات , مرشدات الثقة , تحمي مسارات.

لا يتعلق الأمر بـ' بإختيار "StyloFlow" بدلاً من "Airflow" أو "Temporal- تلك تحل مشاكل مختلفة |( |التنفيذ المستدام | , |تعديل التدفق العملي |, | التوصيل الموزع بين مراكز البيانات | ). | يتعلق الأمر بت articulating a different orchestration model |مسك6 | one where control flow emerges from signal patterns rather than being explicitly programmed |

إذا كنت تُبنى أنابيب "AI"

  • Confidence matters. (not just success.
  • التسارع هيكلي (لا حالة خاصة)
  • المكونات لا يجب أن تعرف عن بعضها البعض
  • يجب أن تكون قابلة للملاحظة ذاتية (لا يتم ربطها على )

... عندها قد يتناسب مع طريقة تفكيرك في هذه الترجمة

الـ مكتبة مؤقتة هو أساس مستقر . StyloFlow يضيف الإشارة - طبقة الأوركستراشن المدفوعة في الأعلى | . كلاهما يتطور من خلال الاستخدام الحقيقي في lucidRAG و Stylobot |

من أجل الأسئلة أو ردود الفعل, consulte the مخزن GitHub.

logo

© 2026 Scott Galloway — Unlicense — All content and source code on this site is free to use, copy, modify, and sell.