Back to "لماذا يتعطل البحث الموجه عند مستوى الشركة"

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

ASP.NET Machine Learning ONNX Qdrant RAG Semantic Search Vector Search

لماذا يتعطل البحث الموجه عند مستوى الشركة

Friday, 26 December 2025

نظام RAG الخاص بك هو عظيم في "Needle" الأسئلة: استعادة عدد قليل من القطع ذات الصلة وتوليف الجواب. إنه يصارع مع نوعين مشتركين من الإستفسارات:

  • ****"ما هي المواضيع الرئيسية في هذا الملف؟"
  • المحتويات"كيف يرتبط X بـ Y عبر وثائق مختلفة؟"

هؤلاء لا يُجب عليهم من قبل أي قطعة واحدة. (التلازم + الربط + الربط.

لماذا مُتَوَجِّه البحث يُفْشِل هنا:

  • هو يُوَلّفَ أجز & ذاتي تشابهها مع الاعلام
  • الشبه الشبهات ****
  • المُحَمَل يَأْسرُ "ما الذي يَبْدو مشابهاً"، لَيسَ "ما الذي يَرتبطُ إلى ماذا"

يمكنك أن تُجبر هذا بالتحفيز و ما بعد المعالجة، لكن ينتهي بك الأمر بإعادة بناء حل الرسم البياني.

البصيرة الرئيسية: Grarag يغيّر وحدة الاسترجاع. لـ لـ الواجهة لـ أسئلة لا تريد "kup- K تشابه قطع"; تريد ألف - المجتمعات المحلية التي تعيش فيها (وملخصاتهم)، حتى يرى النموذج الهيكل، وليس الشظايا.

من شركة Micros ورقة (أ) متاح بوصفه اجتماع (المصدر المفتوح من مصادروهو يواصل البحث عن أسئلة محددة، ولكنه يضيف رسماً بيانياً معرفياً وموجزاً مجتمعياً لأغراض الاستدلال على مستوى المواد.

الوقت الذي لا تستخدم فيه الرسوم البيانية

قبل الغوص في، دعونا نكون واضحين حول متى هذا هو الإفراط في القتل:

  • مربعات وثائق صغيرة (من خلال < (من خلال) وثائق: فقط استخدام مستخدم متجهي
  • "كيف يمكنني" أسئلةلن يساعد الرسم البياني
  • المحتويات الموحدة (لا يوجد تنوع للكيان): لا هيكل رسم بياني لاستغلال
  • تكاليف التدريبالفهرسة تتطلب العديد من المكالمات LLM

إذا كان المستخدمون الخاصون فقط يسألون أسئلة محددة، يُضُوِّر المنتفعون عندما يحتاجون إلى صورة كبيرةوهذا جمهور أصغر مما يقترحه الباعة

أولاً

السلسلة: هذا هو الجزء السادس من سلسلة RAG:

خلال هذه السلسلة، بنينا أنظمة RAG متطورة بشكل متزايد. بدأنا بالبحث الأساسي عن المتجهات، أضفنا كلمة مفتاح مهجنة + الاسترجاع السماني، و الفهرسة الذاتية المتكاملة. لكن كل هذه النُهُج تتشارك في حدود أساسي: أنها تجد قطعات متشابهةلا، لا المُسْفْرَفَرْ مُنْفِجمن أجل الدورة الرابعة تحتاج إلى هيكل.

المسار الموصى به: إذا كان لديك بالفعل عمل بحث محلي مبني على Qdrant (مثلنا)، نموذج أولي مع السيارة الجانبية Python للتحقق من القيمة، حافظ على المتجهات للبحث المحلي، واضف رسما بيانيا خفيف الوزن للاستفسارات العالمية / DRIFT. فقط اذهب "الرسم البياني الكامل" بمجرد أن تثبت أن المستخدمين يطرحون هذه الأسئلة.

المشكلة مع الناقل النقي

دعوني أريكم ما أعنيه بمثال ملموس.

ايّا كان ما يفعله المُظَاهِر RAG بشكل جيد

سؤال: "كيف يمكنني استخدام HTMX مع Alpin.js؟"

عملية الطارج:

  1. طرح السؤال التالي: [0.234, -0.891, 0.567, ...]
  2. اوجد قطع متشابهة في Qdant
  3. يعود أعلى K متطابقات حول HTMX و Alp.js
  4. LLL LLL مُجزز الإجابة من هذه القطع

هذا يعمل لأن السؤال والمحتوى ذو الصلة متماثل Symantتجسّد المجسّدات تلك المتشابهة.

// This is what our current SemanticSearchService does
var embedding = await _embeddingService.GetEmbeddingAsync(query);
var results = await _qdrantService.SearchAsync(
    collectionName: "blog_posts",
    queryVector: embedding,
    limit: 10
);
// Returns chunks about HTMX, Alpine.js, frontend patterns

حيث يكون المنازعونات

سؤال: "ما هي التكنولوجيات الرئيسية التي أكتب عنها وكيف تربط بعضها ببعض؟"

مُتَوَجِّه RAG

Result 1: "HTMX makes it easy to add AJAX to your pages..."
Result 2: "Docker Compose orchestrates multiple containers..."
Result 3: "PostgreSQL's full-text search is surprisingly capable..."
Result 4: "Alpine.js provides reactive state management..."

تذكر Doker، PostgresQL، HTMX، OnNX... ولكن لا تجمعهم أو تشرح كيفية اتصالهم. تحصل على شظايا، لا بصيرة.

المشكلة: يتطلب هذا السؤال ما يلي: التجميع وتفاهم العلاقة بين يجب أن تقوم بما يلي:

  • (أ) جميع التكنولوجيات المذكورة
  • فهم الذين يُستخدمون معاً
  • مجموعة منها في إطار مواضيع مترابطة

التماثل المتجهي وحده لا يعطيك هذا. اذا حاولت ان تصل هذه مع الحفز، فينتهي بك الامر باعادة اختراع الرسم البياني

إدخال ممارسج

هو حل مايكروسوفت للأبحاث لهذه المشكلة. ورقة شكليـة (أ) تحديد نوعي الاستعلام اللذين يسيء خط الأساس في التعامل معهما (أ)**** وقد عقد مؤتمراً بشأن ****) وبنى نظاماً خاصاً لمعالجتها.

بدلاً من مجرد دمج القطع، يقوم الرسم البياني RAG )م( التي تلتقط الكيانات وعلاقاتها، ثم تجمّعها في مجتمعات محلية مع ملخصات.

كيف يعمل الرسم البياني

التبيب عند a لمحة:

  • المؤشر: □ الكيانات/العلاقات □ ملخصات الرسم البياني □ المجتمعات المحلية □ ملخصات
  • السؤال: (ج) موجزات المجتمعات المحلية (DRIFT) (المسارات + الموجزات)

ويضيف الرسم البياني عدة مكونات إلى خط أنابيب RAG، مجمعة في ثلاث فئات:

  1. **** (الموجودات + العلاقات)
  2. **** (المعرفة بتخزين الرسم البياني)
  3. الملم (كشف المجتمع المحلي + التسلسل الهرمي)
flowchart TB
    subgraph "Traditional RAG (What We Have)"
        A[Documents] --> B[Chunks]
        B --> C[Embeddings]
        C --> D[Vector Store]
    end

    subgraph "GraphRAG Additions"
        B --> E[Entity Extraction]
        E --> F[Relationship Extraction]
        F --> G[Knowledge Graph]
        G --> H[Community Detection]
        H --> I[Community Summaries]
    end

    subgraph "Query Time"
        J[User Query] --> K{Query Type?}
        K -->|Specific| L[Local Search]
        K -->|Global| M[Global Search]
        K -->|Hybrid| N[DRIFT Search]

        D --> L
        G --> L
        I --> M
        G --> N
        I --> N
    end

    style E stroke:#f9f,stroke-width:2px
    style H stroke:#bbf,stroke-width:2px
    style I stroke:#9f9,stroke-width:2px

الخطوة 1:

LLLL قراء كل قطعة و مستخلصات الكيانات (الأمور التي تجري مناقشتها):

Chunk: "Docker Compose makes it easy to define multi-container applications.
        I use it with PostgreSQL for my blog's database layer."

Extracted Entities:
- Docker Compose (technology)
- PostgreSQL (database)
- blog (project)
- database layer (concept)

الخطوة 2: العلاقة

وتحدد نفس إدارة المسؤولية القانونية الكيفية التي ترتبط بها الكيانات بعضها ببعض:

Relationships:
- Docker Compose --[used_with]--> PostgreSQL
- blog --[has_component]--> database layer
- PostgreSQL --[implements]--> database layer

الخطوة 3: تشييد معارف

جميع الكيانات والعلاقات تشكل رسما بيانيا:

graph LR
    subgraph "Frontend Cluster"
        HTMX[HTMX]
        Alpine[Alpine.js]
        Tailwind[Tailwind CSS]
    end

    subgraph "Infrastructure Cluster"
        Docker[Docker]
        Compose[Docker Compose]
        Postgres[PostgreSQL]
        Qdrant[Qdrant]
    end

    subgraph "AI/ML Cluster"
        ONNX[ONNX Runtime]
        Embeddings[Embeddings]
        RAG[RAG]
    end

    HTMX -->|used_with| Alpine
    HTMX -->|styled_by| Tailwind
    Alpine -->|styled_by| Tailwind

    Docker -->|orchestrated_by| Compose
    Compose -->|runs| Postgres
    Compose -->|runs| Qdrant

    ONNX -->|generates| Embeddings
    Embeddings -->|stored_in| Qdrant
    RAG -->|uses| Embeddings
    RAG -->|uses| Qdrant

    style HTMX stroke:#f9f
    style Docker stroke:#bbf
    style RAG stroke:#9f9

الخطوة 4: كشف المجتمع المحلي (Leiden algorthm)

الـ خ هذا مهم لأنه يعطيك ال لتلخيص واسترجاع، تصبح المجتمعات المحلية وحدات الاسترجاع الخاصة بك للاستفسارات العالمية.

  • الجماعة المحلية(HTMX, Albin.js, Tailwind)
  • الجماعة الأوروبية)٢("الهيكل الأساسي للحاوية" (دوكر، كومبلز، بوستغريس ق.ل، Qdrant)
  • الجماعة الأوروبية 3 3RAG Pipeline" (ONNX, Imbdings, Qdrant, RAG)

لاحظوا كيف يظهر Qdrant في مجتمعين: فهو يربط بين البنية التحتية وAI/ML.

الخطوة 5: موجزات الجماعة

وتنتج الإدارة المستدامة للأراضي ملخصات لكل مجتمع في كل مستوى من مستويات التسلسل الهرمي:

Community 1 Summary (Frontend Stack):
"The frontend approach combines HTMX for server-driven interactivity
with Alpine.js for client-side state management, styled using Tailwind CSS.
This stack prioritizes HTML-first development with minimal JavaScript,
focusing on progressive enhancement over SPA complexity."

Community 2 Summary (Container Infrastructure):
"The blog runs on Docker Compose, orchestrating PostgreSQL for persistent
storage, Qdrant for vector search, and the ASP.NET Core application.
This containerized architecture enables consistent local development
and production deployment."

& هذا

ويوفر الرسم البياني (Graphrag) ثلاث طرائق للاستفسار، يُحسَّن كل منها إلى المستوى الأمثل لأنواع الأسئلة المختلفة:

البحث العالمي

أفضل من أجل: "ما هي المواضيع الرئيسية؟" "تلخص المواضيع الرئيسية."

تستخدم موجزات مجتمعية (وليس قطع فردية) للإجابة على أسئلة الاستحواذ:

Query: "What technologies does this blog cover most?"

Process:
1. Retrieve all community summaries
2. Map: Ask LLM to extract technology themes from each summary
3. Reduce: Combine partial answers into final response

Response:
"The writing centres on three technology clusters:
1. **Frontend Development** - HTMX, Alpine.js, Tailwind CSS for minimal-JS web UIs
2. **AI/ML Infrastructure** - RAG pipelines, ONNX embeddings, vector search with Qdrant
3. **DevOps/Containerization** - Docker, PostgreSQL, ASP.NET Core deployment"

& لا محل

أفضل من أجل: "كيف أشكل X؟" "ما هو Y؟"

يمزج الرسم البياني المركّز على الكيان مع البحث التقليدي عن ناقلات الأمراض:

Query: "How do I use Qdrant with ONNX embeddings?"

Process:
1. Identify entities in query: Qdrant, ONNX, embeddings
2. Retrieve graph neighborhood around those entities
3. Also retrieve vector-similar chunks
4. Combine into rich context for LLM

Response includes:
- Direct relationships (ONNX generates embeddings stored in Qdrant)
- Related entities (all-MiniLM-L6-v2 model, cosine similarity)
- Specific code examples from vector-retrieved chunks

البحث عن وثيقة

أفضل من أجل: "كيف يرتبط X بـ Y؟" "المقارنة A و B"

البحث عن المتفجرات (العوارض الديناميكية والاختزال مع المرن) كما هو موصوف في وثائق الرسم البياني، يجمع البحث المحلي مع سياق المجتمع. لا يزال يستخدم LLLM التعليل على السياق المهيكل المسترد (وليس الاستنتاج التمثيلي السحري)، ولكن الهيكل يساعد LLM على رؤية الروابط التي قد تفوتها مع القطع المسطحة.

Query: "How do the frontend and backend technologies connect?"

Process:
1. Start with entities: HTMX, ASP.NET Core
2. Traverse graph to find connection paths
3. Include community summaries for context
4. Generate answer showing the full picture

Response:
"HTMX makes requests to ASP.NET Core endpoints, which query PostgreSQL
and Qdrant. The connection flows through the API layer, where endpoints
return HTML fragments that HTMX swaps into the DOM. Alpine.js handles
client-side state for interactive components like search typeahead."

مقارنة نظامنا الحالي بنظامنا الحالي

دعونا نرسم Graxrag إلى ما لدينا بالفعل في Mostlylucid.SemanticSearch:

• العنصر ° النظام الحالي |-----------|---------------|---------------------| | مُحَث o ONNX (AL-MINM-L6-v2) / نفس (أو OpenAI) / | مقدمات TM Qdrant / ENSDB | أولاً من لا يوجد | **** □ لا توجد قاعدة بيانات الرسم البياني / داخل الذاكرة | المجموعة لا يوجد خوارزمية Leiden | السؤال: محدد | SemanticSearchService.SearchAsync() □ البحث المحلي | السؤال: عالمي □ غير مدعول / بحث عالمي

مُعالجات تنفيذنا الحالي & لا محل حسناً، سيضيف الرسم البياني ما يلي: البحث العالمي وقد عقد مؤتمراً بشأن البحث عن وثيقة (أ) القدرات.

// What we have today (Local Search equivalent)
public async Task<List<SearchResult>> SearchAsync(string query, int limit = 10)
{
    var embedding = await _embeddingService.GetEmbeddingAsync(query);
    return await _qdrantService.SearchAsync("blog_posts", embedding, limit);
}

// What GraphRAG would add
public async Task<string> GlobalSearchAsync(string query)
{
    // 1. Retrieve community summaries (not chunks)
    var summaries = await _graphService.GetCommunitySummariesAsync();

    // 2. Map: Extract relevant themes from each summary
    var partialAnswers = await Task.WhenAll(
        summaries.Select(s => _llm.ExtractThemesAsync(query, s))
    );

    // 3. Reduce: Combine into final answer
    return await _llm.SynthesizeAsync(query, partialAnswers);
}

نُسَم التنفيذ

وهناك ثلاث طرق لإضافة الرسم البياني GraphRAG إلى نظام قائم.

الخيار 1: Python Sidecar (موصى به للاستكشاف)

تشغيل مايكروسوفت الرسوم البيانية RAG كخدمة منفصلة:

# docker-compose.graphrag.yml
services:
  graphrag:
    build:
      context: ./graphrag
    volumes:
      - ./data/input:/app/input
      - ./data/output:/app/output
    environment:
      - OPENAI_API_KEY=${OPENAI_API_KEY}

  graphrag-api:
    build:
      context: ./graphrag-api
    ports:
      - "8001:8000"
    depends_on:
      - graphrag
// GraphRagClient.cs - Call from ASP.NET Core
public class GraphRagClient
{
    private readonly HttpClient _http;

    public GraphRagClient(HttpClient http)
    {
        _http = http;
        _http.BaseAddress = new Uri("http://graphrag-api:8000");
    }

    public async Task<string> GlobalSearchAsync(string query)
    {
        var response = await _http.PostAsJsonAsync("/query/global", new { query });
        var result = await response.Content.ReadFromJsonAsync<GraphRagResponse>();
        return result.Answer;
    }

    public async Task<string> LocalSearchAsync(string query)
    {
        var response = await _http.PostAsJsonAsync("/query/local", new { query });
        var result = await response.Content.ReadFromJsonAsync<GraphRagResponse>();
        return result.Answer;
    }
}

Pros: استخدم تطبيق Microsoft في اختبار المعركة، بسرعة إلى النموذج كون: الاعتماد على السايثون، تكاليف LLLM فيما يتعلق بالفهرسة، والاتصالات عبر المعالجات

الخيار 2: شبكة السكان الأصليين (مسار الإنتاج)

بناء المكونات الرئيسية في C##. DocSumMesreز عمل مشابه هنا.

أولاً من

اسأل LLL إلى تحديد -لا، لا، لا، لا، لا، لا، لا، لا، لا، لا، لا، لا، لا، لا، لا، لا، لا، لا، لا، لا، لا، لا، لا، لا، لا، لا، لا، لا، لا، لا، لا، لا، لا، لا، لا، لا، لا، لا، لا، لا، لا، لا، لا، لا، لا، لا، لا، لا، لا، لا، لا، لا، لا، لا، لا، لا، لا، لا. (الكيانات) في كل كيان من الكيانات ذات الهيكل التجميعي بدلاً من المواضيع ذات الشكل الحر:

public async Task<List<Entity>> ExtractEntitiesAsync(string chunk)
{
    var prompt = $"""
        Extract entities from this text. Return JSON array.
        Types: technology, concept, project, person, organization
        Text: {chunk}
        Format: [{{"name": "Docker", "type": "technology"}}]
        """;

    var response = await _ollama.GenerateAsync(prompt);
    return JsonSerializer.Deserialize<List<Entity>>(response);
}

الاحتياجات من الإنتاج: LLL JJson مخرج سوف هذا ليس اختيارياً، تحتاج إلى واحد من:

  • الجيل الذي تجري فيه إعادة تصنيف المهام (الأولاما) format: json، وظيفة OpenAI دَعوات)
  • إعادة إعادة تجربة مع إعادة إصلاح دورات (الكشف مشوه JSON، أطلب LLLM لإصلاحه)
  • الاستد الرجوع عن الش الشال (أنماط السجل لأنواع الكيانات المشتركة)

LLLs احتمالية ؛ يجب أن لا يكون خط انتزاعك.

عندما يكون لديك كيانات، اسأل LLLM عن كيفية اتصالها:

public async Task<List<Relationship>> ExtractRelationshipsAsync(
    string chunk, List<Entity> entities)
{
    var names = string.Join(", ", entities.Select(e => e.Name));
    var prompt = $"""
        Given entities: {names}
        Extract relationships. Return JSON array.
        Text: {chunk}
        Format: [{{"source": "Docker", "target": "PostgreSQL", "rel": "runs"}}]
        """;

    return JsonSerializer.Deserialize<List<Relationship>>(
        await _ollama.GenerateAsync(prompt));
}

ثالثاً - تخزين الرسم البياني مع إضفاء الطابع

أكبر ألم عملي هو لجنة"ASP.net cor" و"ASP.NET" و"Saspnet cort" ينبغي أن تكون نفس العقدة.

public class KnowledgeGraph
{
    private readonly Dictionary<string, Entity> _entities = new();
    private readonly List<Relationship> _relationships = new();

    public void AddEntity(Entity entity)
    {
        var key = Normalise(entity.Name);  // "ASP.NET Core" → "aspnetcore"
        _entities[key] = entity;
    }

    private string Normalise(string name) =>
        name.ToLowerInvariant().Replace(".", "").Replace("-", "").Trim();
}

بالنسبة للاستخدام الجاد، النظر في كيان التضمين القائم على التثبيت: إذا كان اسمان كيانان لديهما تضمينات متشابهة، فمن المحتمل أن يكونا نفس الشيء.

نقاط الالم (قيمة الرسم البياني لRAG تتوقف على جودة الرسم البياني):

  • المراسلة/الجداول:: الحفاظ على الأسماء الكنسية والأسماء المستعارة المعروفة
  • التحكم في العلاقةما يلي: القيود المسموح بها لمنع أنواع العلاقة المهلوسة
  • (أ) درجة الثقة + درجة الثقة:: ليس جميع العلاقات المستخرجة موثوقاً بها على قدم المساواة
  • إعادة الفعندما يتم تحديث الوثائق، تحتاج إلى رقعة الرسم البياني، لا إعادة بنائه

الكيانات ذات الصلة بالاستنتاجات هي عملية بحث في البداية:

public List<Entity> GetNeighbors(string entityName, int depth = 1)
{
    var result = new HashSet<Entity>();
    var queue = new Queue<(string Name, int Depth)>();
    queue.Enqueue((Normalise(entityName), 0));

    while (queue.Count > 0)
    {
        var (name, d) = queue.Dequeue();
        if (d >= depth) continue;

        // Find all entities connected to this one
        var neighbours = _relationships
            .Where(r => Normalise(r.Source) == name || Normalise(r.Target) == name)
            .SelectMany(r => new[] { r.Source, r.Target });

        foreach (var neighbour in neighbours)
            if (_entities.TryGetValue(Normalise(neighbour), out var entity))
                if (result.Add(entity))
                    queue.Enqueue((Normalise(neighbour), d + 1));
    }
    return result.ToList();
}

المجموعة

هذا هو a مُتَصَل مكوّن خط أساس، غير Leiden (الوصلات الداخلية المكثّفة، الوصلات الخارجية الشحيحة). من أجل التنفيذ السليم، استخدم مكتبة رسوم بيانية أو خوارزمية.

public List<Community> DetectCommunities(KnowledgeGraph graph)
{
    // Connected components: group everything reachable together
    var visited = new HashSet<string>();
    var communities = new List<Community>();

    foreach (var entity in graph.GetAllEntities())
    {
        if (visited.Contains(entity.Name)) continue;
        
        // BFS to find all connected entities
        var community = new Community();
        var queue = new Queue<string>();
        queue.Enqueue(entity.Name);

        while (queue.Count > 0)
        {
            var name = queue.Dequeue();
            if (!visited.Add(name)) continue;
            community.Entities.Add(graph.GetEntity(name));
            foreach (var neighbor in graph.GetNeighbors(name, depth: 1))
                queue.Enqueue(neighbor.Name);
        }
        communities.Add(community);
    }
    return communities;
}

الملخص المجتمعي

كل مجتمع يحصل على ملخص يصف موضوعه. هذه هي القوى العالمية للبحث:

public async Task<string> SummarizeCommunityAsync(Community community)
{
    var entities = string.Join("\n", 
        community.Entities.Select(e => $"- {e.Name}: {e.Description}"));
    
    var prompt = $"""
        Summarize what unites these concepts (2-3 sentences):
        {entities}
        """;

    return await _ollama.GenerateAsync(prompt);
}

الخيار 3: الهرسـك (القـرار الوسطـف فـي الأعـداد)

هذا هو النهج الموصَى به إذا كان لديك بالفعل بحث عامل عن متجه. حافظ على Qdrant للبحث المحلي، إضافة طبقة رسوم بيانية خفيفة الوزن للاستفسارات العالمية/DRIFT.

طلب السؤال التصنيف

أولاً، كشف أي نوع من الأسئلة هذا هو:

// WARNING: Toy heuristic for illustration only.
// In production, use a classifier prompt or few-shot rules and log misroutes.
private QueryMode ClassifyQuery(string query)
{
    var q = query.ToLowerInvariant();
    
    if (q.Contains("main theme") || q.Contains("summarize") || q.Contains("what topics"))
        return QueryMode.Global;
    
    if (q.Contains("relate") || q.Contains("connect") || q.Contains("compare"))
        return QueryMode.Drift;
    
    return QueryMode.Local;
}

محل البحث المحلي (محسنة)

(ب) استخدام بحث متجه قائم، مُثرى اختيارياً مع سياق الرسم البياني:

private async Task<string> LocalSearchAsync(string query)
{
    // Existing semantic search (what we have today)
    var chunks = await _semanticSearch.SearchAsync(query, limit: 10);

    // NEW: Enrich with related entities from graph
    var entities = await _graphService.ExtractEntitiesFromQueryAsync(query);
    var related = await _graphService.GetEntityContextAsync(entities);

    return await _llm.GenerateAsync(query, FormatContext(chunks, related));
}

البحث العالمي (الوظيفة الجديدة)

رسم الخرائط - موجز فوق ملخصات المجتمعات المحلية (لا حاجة إلى البحث عن ناقلات الأمراض):

private async Task<string> GlobalSearchAsync(string query)
{
    var summaries = await _graphService.GetAllCommunitySummariesAsync();

    // Map: Extract relevant info from each community
    var partials = await Task.WhenAll(
        summaries.Select(s => _llm.ExtractRelevantInfoAsync(query, s)));

    // Reduce: Combine into final answer
    return await _llm.SynthesizeAsync(query, partials.Where(p => !string.IsNullOrEmpty(p)));
}

البحث عن الأموال (الاستفسارات)

اجمع النتائج المحلية مع سياق المجتمع المحلي لـ: "كيف يرتبط X بـ Y" أسئلة:

private async Task<string> DriftSearchAsync(string query)
{
    var localResults = await LocalSearchAsync(query);
    
    var entities = await _graphService.ExtractEntitiesFromQueryAsync(query);
    var communities = await _graphService.GetCommunitiesForEntitiesAsync(entities);
    var themes = string.Join("\n", communities.Select(c => c.Summary));

    return await _llm.GenerateAsync(
        $"Question: {query}\n\nDetails:\n{localResults}\n\nBroader themes:\n{themes}",
        systemPrompt: "Synthesize the details with the thematic context.");
}

مـتـع الدراسـة والدراسـة

وللجرافراج مفاضلات كبيرة بالمقارنة مع الناقل النقي RAG.

وتتفاوت تكاليف استخراج الكيان/الكيانين/الترابط تفاوتاً كبيراً بحسب النموذج، والتصميم السريع، وحجم القطع. واحد أو اثنان من المكالمات LLLM لكل قطعة بالإضافة إلى عدد أقل من الدعوات للموجزات المجتمعية.

□ العملية □ □ □ □ □ □ □ □ □ □ □ □ □ □ □ □ □ □ □ □ □ □ □ □ □ □ □ □ □ □ □ |-----------|------------|----------| | مُحْثثث □ 1 نداء / chunk / نفس | الكيان/الكيان/المؤسسة □ لا يوجد □ 1 - 1-2 LL LL المكالمات/chunk □ | الملخص المجتمعي □ لا يوجد □ 1 LLL نداء/مجتمع

بالنسبة لمجموعة مؤلفة من 000 1 مدونة تحتوي على 5 أجزاء لكل منها (مجموعها 000 5 قطعة)، فإن فهرسة المتجهات فقط هي أساساً مجرد تكاليف دمج. ويضيف الرسم البياني Graphrag آلاف من طلبات LLLLM للاستخراج والتلخيص. وتتوقف التكلفة الدقيقة اعتماداً كبيراً على اختيار النموذج الخاص بك والكفاءة الفورية؛ واستخدام النماذج المحلية (Olama مع اللاما 3.2 أو ما شابه ذلك) يزيل تكاليف API بالكامل، وهو النهج الموصى به للتجريب.

تكاليف الاستسسس

□ نوع السؤال □ |------------|------------|----------------|-----------------| | الفئة الفئة الفئة □ ١ نداء نداء 1 نداء نداء 0 نداءات □ | الرسم البياني ١ - ٢ استفسارات | مكالمات LLLM ن ن (الخرائط) + 1 (الخفض) / 1 / 1 / 1-2 / ن (الخرائط) + 1 (الخفض) /

البحث العالمي أكثر تكلفة للاستفسار، لكنه يجيب على الأسئلة التي لا يستطيع البحث المحلي ببساطة. يمكنك أيضاً أن تختزن الإجابات العالمية وتنعشها فقط عندما تتغير المجموعة.

إعدادات الفشل

الجرافراج ليس سحراً احترس من:

  • ****: LLLMs: ملكة جمال الكيانات أو علاقات الهلوسة
  • المصدر"ASP.net corre" vs "ASP.net" vs "aspnetcore" تصبح العقد المنفصلة
  • **)ج(**عند تحديث الدساتير، يمكن أن يصبح الرسم البياني منقولاً:
  • ملخصات عن المجتمع المحلي في حالة وجودالمخطوطات لا تُجري تحديثاً تلقائياً عند تغيير الكيانات

التطبيع هو أكبر ألم عملي ستحتاج:

  • الأسماء الكنونية + الأسماء المستعارة
  • معالجة الحالات وتطبيع الظروف
  • الكيان القائم على الدمج الاختياري

ادمج مع البحث المدوّل

هنا كيف يمكن لـ(جرافراج) أن يعزز البحث الدلالي الموجود في المدونة:

التدفقات الجارية

User types in search → SemanticSearchService → Qdrant → Results

(الواردات المتكيدة)

طرق المصنفات تشير إلى استراتيجيات بحث مختلفة، إليك كيف **** - لاحظوا أنه لا يمس أبدا مخزن ناقلات الأمراض:

sequenceDiagram
    participant U as User
    participant API as Search API
    participant C as Query Classifier
    participant G as Global Search
    participant KG as Knowledge Graph

    U->>API: "What topics does this blog cover?"
    API->>C: Classify query
    C-->>API: QueryMode.Global

    API->>G: GlobalSearch(query)
    G->>KG: GetCommunitySummaries()
    KG-->>G: [Frontend, Infrastructure, AI/ML]
    G->>G: MapReduce over summaries
    G-->>API: Synthesized answer

    API-->>U: "The blog covers three main areas..."

هذا إلى a ****والذي يجمع بين البحث عن الناقل مع سياق الرسم البياني للأجوبة الأغنى:

sequenceDiagram
    participant U as User
    participant API as Search API
    participant C as Query Classifier
    participant L as Local Search
    participant Q as Qdrant
    participant KG as Knowledge Graph

    U->>API: "How do I use HTMX?"
    API->>C: Classify query
    C-->>API: QueryMode.Local

    API->>L: LocalSearch(query)
    L->>Q: Vector search
    Q-->>L: Relevant chunks
    L->>KG: GetEntityContext("HTMX")
    KG-->>L: Related: Alpine.js, Tailwind, ASP.NET
    L-->>API: Answer with rich context

    API-->>U: "HTMX is used with Alpine.js for..."

والفرق الرئيسي هو: التحريات العالمية تجمّع الملخصات المجتمعية (المواضيع على مستوى المؤسسة)، في حين تسترجع الاستفسارات المحلية قطع محددة مثرى بعلاقات الكيانات.

البديل المبسط: لا يزال GraphRAG أداة بحثية إلى حد كبير - استخراج الكيان، بناء الرسوم البيانية، والكشف المجتمعي يضيف تعقيداً كبيراً وتكاليف LLM. b BM25 كلمة مفتاح مُطابق هذا ما يلي: المصدر (كراد) (ج) استخدامات رموز المعلومات الاستخبارية، وما DocSumMesreز استخدامات لموجزات الوثائق. النمط: مُهَجِّن إسترِكْر المُمَاَزِنَات ذات الصلة؛ مُمَاَلَك LLM. *(بالأ)*لا، لا تقرير ما بعدتحصل على 80% من الفائدة مع 20% من التعقيد

أمر تنفيذ تنفيذ تنفيذ تنفيذ تنفيذ تنفيذ تنفيذ

الـ API هو مباشر: تصنيف إستفسار إلى مُعالج:

[HttpGet("api/search")]
public async Task<IActionResult> Search([FromQuery] string q, [FromQuery] string mode = "auto")
{
    if (mode == "auto")
        mode = ClassifyQuery(q);

    // global/local return synthesised answers; default returns raw search results
    return mode switch
    {
        "global" => Ok(await _graphRag.GlobalSearchAsync(q)),  // synthesised answer
        "local" => Ok(await SearchWithGraphContext(q)),        // answer with citations
        _ => Ok(await _semanticSearch.SearchAsync(q))          // raw ranked results
    };
}

بحث المتجهات و بحث الرسم البياني يكمّل أحدهما الآخر. استخدم متجهات لـ "كيف أفعل I" أسئلة، رسوم بيانية لـ "ما هي المواضيع" أسئلة.

ثالثاً - استنتاج

Graphrag تمد RAG من "تجد قطع متشابهة" إلى "تفهم بنية المعرفة". إنه ليس بديلاً للبحث المتجه؛ إنه تعزيز يمكّن أنواع الإستفسارات الجديدة.

ما يضيفه الرسم البياني:

  • الاستخراج من الكيان أو العلاقة
  • التشييد بالرسم البياني للمعار من المعرفة
  • الكشف المجتمعي والموجزات الهرمية
  • البحث العالمي عن مسائل
  • البحث عن استجـاد استجـاد استجـاد استجـاد

متى تستخدمه:

  • لديك مجموعة كبيرة من الوثائق
  • المستخدم يسأل "ما هي المواضيع" أسئلة نمط الأسئلة
  • مضمونك يحتوي على كيانات وعلاقات واضحة
  • تريد إلى السطح

مسار التنفيذ:

  1. أولاً، اسأل: هل تحتاج فعلاً إلى هذا؟ BURT + BM25 الاسترجاع المهجين المعالجات الأكثر استخداماً الحالات
  2. إذا كان الجواب بنعم، فإن النموذج الأولي بعرب جانبي مع Pyython إلى قيمة المصادقة
  3. المصدر الأصلي إذا كان الأمر يتعلق بالتكاليف/اللازمة
  4. استخدام LLLs المحلي (أولاما) لمراقبة تكاليف الفهرسة

الموارد الخارجة عن

الرسم البياني الرسمي:

سلسلة السلاسل:

البديل المبسط (BERT + BM25):

logo

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