وقت پڑھنے : 14 minutes

آپ لنگچین 4J کے ساتھ pgvector کی انٹیگریشن پر ایک مضامین پڑھ رہے ہیں۔ صفحے کے نیچے، JBake آپ کی تجویز «مربوط مضامین»۔ آپ کلک کرتے ہیں۔ یہ ایک مضامین ہے …​configuration کے بارے میں کٹی ٹرمنل سے. دوں کے درمیان ایک ہی مشترکہ نقطہ؟ ان کو کم سے کم پندرہ دنوں کا فاصلہ. یہ مشورہ نہیں. یہ ایک تقویم جسے ڈکھایا گیا ہے محرر کا مضمون.

سين: منگل 12 مئی، 17:30

میں اپنی ایک مضامین کی دوبارہ پڑھ رہا ہوں — واس پر Knowledge Graph، codebase سمجھنے کا اوزار محتوا گہرا ہے: نودز, ایجس, کمیونٹی, PlantUML, آن بورڈ۔ ایک مضبوط 15 منٹ کی پڑھنے کی ٹیکنیک جو متحرک کرتی ہے`graphify-gradle`, plantuml-gradle, اور گراف ٹاپولوجی کے مفاهیم.

صفحے کے نیچے، « مضمرات متعلقہ » مجھے تجویز دیتے ہیں :

  1. فائر بیس کنٹیکٹ فارم (0113) پر ایک مضمون

  2. ایجر/لےزی میكانزم پر ایک مضبوط (0108)

  3. Gradle سکرپٹ سے پلاگائن تک کی migration پر ایک مضمون (0102)

  4. Ollama Pro (0120) کے اشتراکوں کے مجموع پر ایک مضامین

ان چار مضامین میں سے تین کا کوئی تعلق Knowledge Graph سے نہیں ہے. وہ یہاں موجود ہیں کیونکہ وہ سب سے آخر میں شائع ہیں — زمانہ کا پڑوسی، نہیں معنیاتی ہمسایگی.

میں ٹیمپلیٹ دیکھ رہا ہوں`post.thyme`:

<!-- Articles connexes (liens internes SEO) -->
<th:block th:each="post,postStat : ${published_posts}">
    <th:block th:if="${!post.uri.equals(content.uri) and postStat.index lt 4}">
        ...
    </th:block>
</th:block>

`published_posts`یہ ایک تاریخی فہرست ہے۔`postStat.index lt 4`لتا ہے موجودہ پوسٹ سے مختلف پہلاچار (پہلے چار). یہ سب ہے۔ کوئی منطق نہیں۔ مشابہت کا۔ مضمون کا کوئی تصور نہیں۔ صرف ایک لوپ`for`نقاب زد توصیہ.

JBake کا بگ نہیں ہے۔ یہ سب کا ڈیفالٹ سلوک ہے۔ اسٹاٹک سائٹ جينریٹر: پوسٹوں کی فہرست سادہ اور تاریخ کے مطابق ترتیب دی گئی ہے۔ ٹیمپلیٹ وہ کر سکتا ہے جو اس کے پاس ہے۔

lekin yeh qabool karne ki wajah nahi hai.

تشخیص: تین قسم کے تعلقات جو کسی ٹیمپلیٹ سے نہیں دیکھتے

python ميرا مجموعہ d’articles — 23 posts میں 4 ماہ — ہے ایک ساخت امیرکانی کہ زمانے کا ٹیمپلیت مکمل طور پر گھسل دیتا ہے :

  1. واضح حوالات : میں استعمال کرتا ہوں`xref:`مجھ کے مضامین میں زیادہ مقدار میں

مادہ 0122 ارجاع 0106 (knowledge graph) اور 0116 (مقسامت بندی معرفتاً). یہ روابط *hard linking*editorial — میں ان خیالات کو معنویت سے جوڑنے کا فیصلہ لیا گیا۔

  1. اشتراک کردہ ٹیگز : ہر مقالے میں`:jbake-tags:`. مضمون پر

Graphify + PlantUML (0105) ہے`gradle, graphify, plantuml, knowledge-graph`. Knowledge Graph (0106) پر مضمون knowledge-graph, graphify, plantuml. سات میں سے تین ٹیگز مشترکہ ہیں — 43% پوشش

  1. ہم واقع ہونے والے نام شدہ entities : « pgvector », « RAG », « embedding

وہ چار مختلف مضامین میں ساتھ دکھائی دیتے ہیں۔ « LangChain4j », Ollama », « plugin Gradle » چھ دیگر میں۔ یہ ٹیگ نہیں ہیں اعلام شدہ — یہ corpus کے patterns emergent ہیں جو صرف ایک NLP سمجھ سکتا ہے کشف کر سکتا ہے.

@startuml
skinparam backgroundColor #FEFEFE
skinparam defaultTextAlignment center

title مضامین کے درمیان تعلق کی تین تہہیں
package "تہہ 1 — واضح حوالہ جات" #CCFFCC {
    [Article A] as A1
    [Article B] as B1
    A1 -down-> B1 : xref:
    note right of A1
ہارڈ لنکس
ڈیٹرمینسٹک
پہلے سے `graph.json` میں موجود ہے
    end note
}

package "تہہ 2 — مشترکہ ٹیگز" #FFFFCC {
    [Article A] as A2
    [Article C] as C2
    A2 ..> C2 : tag_cooccurrence
    note right of A2
وزن = مشترکہ tags / کل tags
ڈیٹرمینسٹک (Déterministes)
`graphify` کے ذریعے نکالیں
    end note
}

package "تہہ 3 — ابھرتی ہوئی وجودیات (Ontology)" #FFCCCC {
    [Corpus A] as A3
    [Corpus B] as B3
    A3 ..> B3 : entity_overlap
    note right of A3
NLP کلسٹرز
نامزد اداروں کے ہم occurrence
TF-IDF / cosine similarity
    end note
}

@enduml

آج، میرا سائٹ ان تین سطوح میں سے koi استعمال نہیں کرتا ہے. یہ utilization karta hai صفر طبقة: جاووا فہرست میں درج کرنے کا ترتیب۔

حل: ایک Gradle پائپ لائن، گرم LLM کال نہیں

پہلی وسوسہ یہ ہوگا کہ بیک کے وقت ایک LLM کو بلایا جائے: « لیے یہ مضامین corpus میں سب سے زیادہ مماثل تین مضامین ڈھونڈتا ہے۔ یہ مت کریں

ہر ایک کے لیے LLM کا ایک کال`./gradlew bake`وقت، پیسے اور آپ کی بنڈ میں غیر‑تعیناتی انداز شامل ہوتی ہے۔ LLM کا جواب دو بینڈز کے درمیان بدلنا، جو کہ مضمون تبدیل نہ ہوا ہو۔ آپ کی سسٹمر نمائندگی بن جاتی ہے غ़یر قابلِ تجدید، آپ کے ٹیسٹس فلیکی بن جاتے ہیں۔

حل مخصوص ہے: گرینڈل ایک پائلائن ہے جو گراف پیش سے حساب لگاتا ہے مشابہت کا اور اسے سٹور کرتا ہے میں`graph.json`. ٹیمپلیٹ نتیجہ پڑھتا ہے — وہ کبھی بھی حساب چلاتا نہیں.

معمار: باکری Graphify importe karti hai، Engine nahi

یہ معماریہ کا سب سے اہم نقطہ ہے۔ وسوسہ یہ ہوگا کہ تعاون میں تار لگانا`engine/build.gradle.kts`: انجن لاگو کرتا ہے graphify اسکن کے لیے, bakery بیک کے لیے, اور engine درمیان پل بناتا ہے دونوں.

یہ ایک انٹی-پryn ہے. Engine ایک صارف ٹرمینل ہے — یہ لاگو کرتا ہے پلاگ انز، بزنس لاجیک کو لاگو نہیں کرتا۔ قانون ہے: ثبوت کا بوجھ مالک پلاگ پر ہے۔

معماری صحیح — Bakery Graphify وارداتی
@startuml
skinparam backgroundColor #FEFEFE
skinparam packageBackgroundColor #FFF3CD

title Bakery Graphify کو امپورٹ کرتا ہے — Engine کو کچھ نہیں معلوم
package "N3 — ENGINE" #FFCCCC {
    [engine/build.gradle.kts] as ENG
    note right of ENG
plugins { bakery }
graphify کا کوئی علم نہیں
4 ٹاسک، ~150 لائنیں
    end note
}

package "N2 — BAKERY" #CCFFCC {
    [bakery-plugin] as BAK
    note right of BAK
plugins { graphify } ← اندرونی امپورٹ
Lit graph.json
متعلقہ مضامین حل کرتا ہے
ماڈل کو JBake کے لیے ظاہر کرتا ہے
    end note
}

package "N0 — GRAPHIFY" #CCE5FF {
    [graphify-plugin] as GRF
    note right of GRF
ورک اسپیس اسکین کریں → `graph.json`
مندرجہ ذیل سے بھرپور:
- `xref`: edges
- ٹیگز کے co-occurrences
- نامزد اکائیاں (NLP)
    end note
}

ENG -down-> BAK : "plugins { bakery }"
BAK -down-> GRF : "plugins { graphify } ← N2→N0 OK"
@enduml

DAG عقد محترم ہے: bakery (N2) graphify (N0) کو امپورٹ کرتی ہے، N2 > N0، کوئی تخلف نہیں۔ Engin (N3) بیکری (N2) imports کرتا ہے، N3 > N2، OK۔

انجن کے پاس aucune لائن کوڈ نہیں ہے جِس کا ارجع`graph.json`, relatedPosts, یا کوئی اور مشابہت کا خیال۔ وہ bakery لاگو کرتا ہے۔ La bakery mein collaboration andari hai.

پائپ لائن: اسکن → گراف → ٹیمپلیٹ

یہ مکمل پائلائن تین مراحل میں ہے :

  1. سکن (گرافائی) :`graphify-plugin`یہ workspace کو اسکین کرتا ہے۔ اس کے

موجودہ شکل، وہ پہلے سے ہی ان`xref:`بیچ`.adoc`اور وہ داخل ظاہر کرتا ہے`graph.json`جéisے edges ki kisam`reference`.
اسے اداری مواد کے لیے محسّن کیا جاتا ہے : * JBake کے میتا ڈیٹا پارس کریں (:jbake-tags:, :jbake-description:) ہر کا`.adoc`بلوگ کا * ٹیگز کے مشترک واقعات کی حساب لگائیں → edges`tag_cooccurrence`وزن کے ساتھ * ٹی ایف آئی ڈی ایف کے ذریعے وضاحات سے نام رکھنے والی موجودات نکالیں → edges`entity_overlap` ایک حصہ انجیکشن کریں`blog_articles`کے اندر`graph.json`موجود

// Extrait de l'enrichissement graphify pour le blog
fun enrichBlogSection(graphJson: File, blogDir: File): GraphJson {
    val articles = blogDir.listFiles { f -> f.extension == "adoc" }
        .map { parseJbakeMetadata(it) }

    val nodes = articles.map { ArticleNode(it.slug, it.title, it.tags) }
    val edges = mutableListOf<GraphEdge>()

    // Couche 1 : xref (déjà fait par scanWorkspace)

    // Couche 2 : co-occurrences de tags
    for (a in articles) {
        for (b in articles) {
            if (a.slug == b.slug) continue
            val common = a.tags.intersect(b.tags)
            if (common.isNotEmpty()) {
                edges.add(GraphEdge(
                    source = a.slug,
                    target = b.slug,
                    type = "tag_cooccurrence",
                    weight = common.size.toDouble() / (a.tags.size + b.tags.size)
                ))
            }
        }
    }

    return graphJson.copy(
        blogArticles = BlogSection(nodes, edges)
    )
}
  1. Bake (بیکری) : وقت`./gradlew bake`, `BakeryPlugin`بستر

`graph.json`اور ہر پست کے لئے منسلک مضامین حل کرتا ہے۔

// BakeryPlugin — résolution des articles connexes
fun resolveRelatedPosts(
    currentSlug: String,
    graph: GraphJson,
    maxResults: Int = 4
): List<RelatedPost> {
    val edges = graph.blogArticles.edges
        .filter { it.source == currentSlug || it.target == currentSlug }

    return edges
        .sortedByDescending { it.weight }
        .take(maxResults)
        .map { edge ->
            val relatedSlug = if (edge.source == currentSlug) edge.target else edge.source
            graph.blogArticles.nodes.first { it.slug == relatedSlug }
        }
}
  1. Template (post.thyme) : JBake modèle ابھی ایک map کو قبول کرتا ہے

منظم، ایک سادہ زمانی فہرست کی جگہ. (empty)

<!-- Articles connexes basés sur le Knowledge Graph -->
<th:block th:if="${relatedPosts != null and !relatedPosts.empty}">
    <section class="mt-5 pt-4 border-top">
        <h2 class="h4 mb-3">Articles connexes</h2>
        <th:block th:each="related : ${relatedPosts}">
            <div class="mb-2">
                <a th:href="${content.rootpath} + ${related.uri}"
                   th:text="${related.title}" class="fw-semibold"></a>
                <br/>
                <small class="text-muted">
                    <th:block th:each="reason,iterStat : ${related.reasons}">
                        <span class="badge bg-light text-dark"
                              th:text="${reason}"></span>
                    </th:block>
                </small>
            </div>
        </th:block>
    </section>
</th:block>

وہ نہیں جانتا d’où سے ڈیٹا آتا ہے۔ سिर्फ باکری اور JBake کے درمیان کا معاہدہ بدل گیا ہے :`published_posts`(فہرست ترتیب سے) بن جاتا ہے`relatedPosts`(گراف سے وزن دی گئی map).

ال بیج «سبب» (مثال:`xref 0122`, tag:gradle, cluster:pgvector-rag) پڑھنے والے کو بتائیں کیوں یہ مضبوط تعلق رکھتا ہے۔ یہ نہیں بس شفافیت — یہ ٹاپولوジー پر تعلیم ہے اپنا خود کا مواد۔ ====

بازگشت تاریخی

Si `graph.json`غائب (مقامی بناؤڈ بغير پہلے کے اسکن، پہلا منفذ، CI جس نے ابھی تک گرافی سکن شامل نہیں کیا)، ٹیمپلیٹ اسے نرمی سے خراب کرنا چاہئے :

fun resolveRelatedPosts(currentSlug: String, graph: GraphJson?): List<RelatedPost> {
    if (graph != null && graph.blogArticles != null) {
        return resolveFromGraph(currentSlug, graph)
    }
    // Fallback chronologique — même comportement qu'aujourd'hui
    logger.warn("[bakery] graph.json absent — fallback chronologique")
    return resolveFromChronology(currentSlug)
}

ڈفلٹ سلوک موجودہ سلوک کے برابر ہے۔ال توصیہ کرنے والا انجن ایک تدریجی بہتری ہے — نہیں ایک ٹوٹنے والی تبدیلی.

ایمرجنگ اونٹالوجی : جب مضامین خود groupings karte hain، ایک دوسرے کو جانے بغیر

سب سے دلچسپ طبقہ تیسرا ہے: متجدد وجودیات ایسی مضامین جو سیت نہیں کی جاتی ہیں،جن کے ٹägس ایک جیسے نہیں،مگر جو ایک ہی चीज کے بارے میں بولتے ہیں بезд جانے

ایک واضح مثال لیتے ہیں۔ میرے کارپوس کے تین مضامین :

  1. 0119 — بنچمارک DGX Spark vs کلاؤڈ اشتراك LLM

  2. 0121 — گرڈل پلاگین دو Ollama Pro انستانسز کو کنٹرول کرنے کے لیے

  3. 0122 — نسبت کارآمدی 27x 45x اسطول ماہرین مصنوعی ذہانت

ان تین مضامین کے درمیان aucun xref نہیں ہے۔ ان کے ٹگز نہیں ان کی مطابقت صرف 20% ہے (« ollama », « llm »عام). لیکن ایک ہلکا NLP توضیحات پر واضح گله ظاہر ہوتی ہے : «خراج»، «اشتراك»، بادل », « جی پی یو », « ایپی آئی کلید », « اولاما پرو », «اثرگاری»، «نسبت

ایک اونٹولوجیکل کلستر بناتے ہیں: خود-ہوسٹید LLM کی معاشیاتی vs cloud. یہکلاسٹر کجہ بھی اعلان نہیں کیا گیا۔ یہ corpus سے ظاہر ہوتا ہے۔

@startuml
skinparam backgroundColor #FEFEFE
skinparam packageBackgroundColor #E8F8F5

title Cluster Ontologique Émergent — "Économie LLM Self-Hosted"

package "Cluster détecté : économie-llm" #D5F5E3 {
    [0119 — Benchmark DGX Spark\nvs Cloud Abonnement] as A
    [0121 — Plugin Gradle Piloter\nDeux Instances Ollama Pro] as B
    [0122 — Ratio Efficacité\n27x 45x Flotte Experts] as C
}

A .. B : entity_overlap (0.73)
B .. C : entity_overlap (0.81)
A .. C : entity_overlap (0.68)

note bottom of A
    Aucun xref entre ces articles.
    Tags communs : "ollama", "llm".
    Cluster découvert par NLP :
    co-occurrences "coût", "GPU",
    "abonnement", "Ollama Pro".
end note
@enduml

یہ اونٹولوجیکل کلاسٹر ایک composite edge بن جاتا ہے میں`graph.json` :

{
  "source": "0119-benchmark-dgx-spark",
  "target": "cluster:economie-llm",
  "type": "entity_cluster",
  "weight": 0.73,
  "metadata": {
    "clusterLabel": "Économie LLM Self-Hosted vs Cloud",
    "commonEntities": ["coût", "GPU", "abonnement", "Ollama Pro", "ratio"],
    "articlesInCluster": [
      "0119-benchmark-dgx-spark",
      "0121-ollama-pro-deux-instances",
      "0122-ratio-efficacite-flotte-experts"
    ]
  }
}

NLP عمدہ طور پر ہلکا ہے — TF-IDF + cosine similarity کے لیے تفصیلات۔ BERT کی ضرورت نہیں، زبان کے مودل کی ضرورت نہیں۔ کورپس 23 مضامین سے مشتمل ہے، مشابہت کی میٹرکس ایک میں فٹ ہے 50 کیلوبائٹ کا JSON فائل۔

NLP کی طاقت نہیں آتی الگورتم کی تکملہ سے lekin corpus ka hajm aur descriptions ki khusūsat. ایک `:jbake-description:`بہت خوب لکھی گئی 150 حروف کی زیادہ TF-IDF کے لیے ایک سگنال جو یہ بتاتا ہے کہ ایک مکمل مضبوطی 3000 الفاظ کی ہے۔

DAG کا معاہدہ : کون اہم ہے کون

یہ وہ نقطہ ہے جس میں معماریت کی ڈسپلائنادا منافع دیتی ہے۔ ڈی اے جی N0→N3 تعریف شدہ میں`engine/build.gradle.kts`ایک سادہ قاعدة دیتا ہے: کوئی بھی پراجیکٹ اہم نہیں ہوتا، ایک اعلی سطح کا پراجیکٹ۔

مصارف کننده پلاگین پلاگ ایمپورت شدہ مستوى المستهلك آئمپورٹ کردہ سطح معتبر؟

بیکری-گرڈل

گرافائی-گریڈیل

N2

N0

✅ N2 > N0 — OK

انجن

bakery-gradle

N3

N2

✅ N3 > N2 — OK

انجن

graphify-gradle

N3

N0

✅ Technique OK, lekin conceptually ghalat — hamkari bakery ke andar hai

Engine بیکری لاگو کرتا ہے۔ Bakery گرافی لاگو کرتا ہے۔ یہ سب ہے۔ اگر ایک دن میں تحقیق کے لیے ویکٹر اسٹور کوڈ بیس (N1) شامل کرنا چاہتا ہوں cross‑corpus سمانٹیک، بیکری بھی یہ املاورت کرتی ہے۔ اینگن بدل نہیں ہے۔

پیٹرن یہ ہے : پلاگ‑این N2 خود کی انحصارات کا ہب ہے Engine N3 ایک ہب نہیں — ایک ٹرمینل جو ہب لاگو کرتا ہے۔

جو ہم کسب کرتے ہیں (اور جو ہم کسب نہیں کرتے)

اہم فائدہ تحريری ہے، ٹیکنالوجی نہیں :

پہلے بعد

منتبطہ مضمون = 4 آخری پوسٹ

مرتبط مضامین = اعلی ۴ وزن کے لحاظ سے Knowledge Graph میں

قارئ RAG سے پڑھتا ہے → Kitty Terminal کی تجویز

قارئ RAG پڑھ رہا ہے → pgvector، chunking، vector store کیسفارش

کیوں پر صفر شفافیت

بیج`xref 0122`, tag:gradle, `cluster:rag`مرئی

JBake معيار، صفر کوشش، صفر قیمت

پائپ لائن گریڈل معین، قابل بازپیدا سازی، قابل ٹیسٹ

قارئ کے لیے سیکھنے کی کوئی کرنو نہیں

قارئ میری مواد کی ٹاپولوژی کا پتا لگتا ہے

جس کو ہم نہیں جیتتے:

  • یہ ایک «سچائی» تجویز موتور نہیں ہے (ہمکاری نہیں

فلٹرنگ، A/B ٹیسٹنگ نہیں، فیڈبیک لُوب نہیں)

  • معیار JBake متا ڈیٹا کی کثرت پر منحصر ہے — اگر آپ

توضیحات خالی ہیں، TF-IDF کچھ نہیں دیکھتا

  • NLP آفلائن ہے — نئے مضامین صرف اسtak کلاسٹرڈ ہیں

اگلے اسکن (یہ اچھا ہے : بنائی معین رہتی ہے)

منظورات : بلاگ عوامی نالِج گراف کے طور پر

یہ فیچر ایک وسیع منظر کھولتی ہے: اور اگر`cheroliv.com` وہ خود بن رہا تھا ایک knowledge graph navigable ?

مضامین نœڈز ہیں۔ ٹیگز کمیونٹیز ہیں۔ xref كيناروں۔ قارئ ابھی نہیں پڑھتا ایک منعزل مضمون — وہ ایک میں گراف علم جس کا موجودہ مضمون داخل کرنے کا نقطہ ہے۔

تخیل کریں ایک ہوم پیج جوchronological list کو نہیں دکھاتی پچلے پوسٹس کے، مگر یک کورپس کا نقشہ : کلاسٹرز انٹالوجیکل، محوری مضامین (جِس میں سب سے زیادہ کنارے ہیں), پڑھنے کے راستے توصیہ کردہ « اگر آپ نے یہ مضابط Graphify پر پسند کی، پھر پڑھیں یہ Knowledge Graph کے بارے میں سمجھنے کا اِستعمال )

اب یہ ایک بلاگ نہیں ہے۔ یہ ایک سمانٹیک ایٹلس ہے۔

اور یہ سائنس فکشن نہیں ہے۔ وہ`graph.json`پہلے سے موجود ہے۔ اسے صرف نیوویجیشن انٹرفیس کی ضرورت ہے۔

نتیجہ : فائل سسٹم جانتا ہے کہ ٹیمپلیٹ اسے نظرانداز کرتا ہے

میں نے منگل کے شام کو جو بنایا، وہ ایک ہورسٹک کا بدلا ہے۔ بے کار (زمان کے کرم) کے ذریعے ایک صحیح نمائندگی کا میرے corpus کی ساخت (Knowledge Graph).

ٹیملیٹ`post.thyme`یہ نہیں بدلتی. جو بدل رہا ہے وہ ہے جو ہم او اسے کھانا دیتا ہے۔ پہلے: ایک سٹائرڈ جاوا فہرست جو کے`date`. بعد : ایک وزنی گراف تین تجزیاتی طبقات سے مشتق — xrefs, co-occurrences ٹیکز کے، اور NLP کے ذریعے بننے والی اونٹولوジー

لوپ بند ہو گیا۔ graphify ورک سبيس کو سکن کرتا ہے۔ Bakery وِس پڑھتا ہے گراف اور ٹیمپلیٹ کو غذا دیتا ہے۔ قارئ سفارشات دیکھتا ہے۔ مربوط. اور انجن — قائد اورکسترا — بھی نہیں جانتا کہ تمام وہ موجود ہے.

یہ ہی مناسب معماریت ہے۔ ہر پلاگین ایک کام کرتا ہے۔ اور استعمال کرنے والا ٹرمینل کو معلوم کرنے کی ضرورت نہیں ہے۔

حوالہ جات

متعلقہ مضامین