pdfের সময়: 14 minutes

আপনি একটি নিবন্ধ পড়ছেন pgvector ও LangChain4j এর একীভূতির সম্পর্কে. পৃষ্ঠার নিচে, JBake আপনাকে « সংযুক্ত লেখা » শিফারস দেয়। আপনি ক্লিক করেন। এটি … কনফিগারেশনের উপর একটি লেখা। কিটি টার্মিনাল থেকে। উইদের মধ্যে একমাত্র সাধারণ বিন্দু কি? তারা কম মাত্রে প্রকাশিত Hoy ১৫ দিনের পার্থক্য। এটি একটি সুপারিশ নয়। এটি একটি আড়াল পতিত ক্যালেন্ডার সম্পাদকীয়

দৃশ্য: মঙ্গলবার, ১২ মে, সন্ধ্যা ৫:৩০

আমি একটু আমার নিবন্ধ গুলো পুনর্চর্চা করছি — এটি জ্ঞান গ্রাফকে কোডবেস বোঝার সরঞ্জাম হিসেবে ব্যবহার করে। বিষয়বস্তু ঘনিষ্ঠ : নোড, किनার, কমিউনিটি, PlantUML, অনবোর্ডিং। একটি নিবন্ধ ১৫ মিনিটের পড়ার পদ্ধতি যা সক্রিয় করে`graphify-gradle`, plantuml-gradle, এবং গ্রাফ তপোলজির ধারণাগুলি।

পৃষ্ঠার নিচে, « সংশ্লিষ্ট নিবন্ধ »গুলো আমাকে প্রস্তাব করছে :

  1. একটি নিবন্ধে Firebase Contact Form (0113)

  2. একটি নিবন্ধ ইগার/লেজি মেকানিজম (0108) সম্পর্কে

  3. একটি নিবন্ধ Gradle স্ক্রিপ্ট → প্লাগইন মাইগ্রেশন (0102) সম্পর্কে

  4. Ollama Pro সাবস্ক্রিপশন সংচয় সম্পর্কে একটি প্রবন্ধ (0120)

এই চারটি আর্টিকেলের মধ্যে tiga টিতে কোনো 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 এর একটি বাগ নয়। এটি সবকিছু-এর ডিফল্ট আচরণ। স্ট্যাটিক সাইট জেনারেটর: পোস্টদের তালিকা সমতল এবং তারিখ অনুযায়ী সাজানো হয়েছে। টেমপ্লেট তার যা করতে পারে তা করে, যা আছে সেটি দিয়ে।

কিন্তু এটি গ্রহণের কোনো কারণ নয়।

নির্দেশনা: তিন ধরনের সম্পর্ক যে কোনো টেমপ্লেট দেখে না

আমার নিবন্ধ সংগ্রহ — ৪ মাসে ২৩ পোস্ট — এর একটি সমৃদ্ধ গঠন আছে যে সময়সূচী টেমপ্লেটটি পূর্ণরূপে অতিক্রম করে :

  1. প্রত্যক্ষ উল্লেখ : আমি ব্যবহার করি`xref:`প্রচুরপরিমাণে আমার লেখাগুলোতে

অনুচ্ছেদ 0122 উল্লেখ 0106 (knowledge graph) এবং 0116 (compartimentage অপιστήমিক). এই লিঙ্কগুলো এডিটোরিয়াল hard linking — আমি সুচিতভাবে সিদ্ধান্ত নেওয়া হয়েছে এই ধারণাগুলি সংযুক্ত করার জন্য.

  1. ট্যাগ শেয়ার করা : প্রত_writer এর কিছু আছে`:jbake-tags:`. অ্যারিকেলটি উপর

Graphify + PlantUML (0105) আছে`gradle, graphify, plantuml, knowledge-graph`. Knowledge Graph (0106) সম্পর্কিত নিবন্ধ এটিতে knowledge-graph, graphify, আছে plantuml। সাত ট্যাগে মধ্যে তিনটি ট্যাগ সামান্য — ৪৩% ওভারল্যাপ।

  1. সহ-অবস্থিত নামযুক্ত ইক্যাবjective : « pgvector », « RAG », « embedding

একসাথে চারটি ভিন্ন লেখায় উপস্থিত হয়। « LangChain4j », Ollama », « Gradle plugin » ছয় অন্যান্য মধ্যে। এইগুলো ট্যাগ নয়। সত্য — সেগুলো উত্থitando প্যাটার্ন কোরপাসের যeket শুধু একটি NLP সনাক্ত করতে পারে

trois couches relation articles

আজ, আমার সাইট কোনো এই তিনটি স্তর ব্যবহার করে না। এটি ব্যবহার জিরো স্তর: জাভা তালিকায় সংযোজনের ক্রম।

সমাধান: একটি Gradle পাইপলাইন, একটি গরম LLM কল নয়

প্রথম আকর্ষণটি হবে বেক সময়ে একটি LLM আহবান করা: « প্রে এই আর্টিকেলটি, কর্পাস থেকে সবচেয়ে সমান তিনটি আর্টিকেল খুঁজে বের করে। এটা করবেন না।

প্রতিটিতে একটি LLM কল`./gradlew bake`খরচ হয় সময়, টাকা, এবং আপনার বিল্ডে অ-নিশ্চিততা প্রবর্তন করে। LLM-এর উত্তর পারে দুই বিল্ডস মধ্যে পরিবর্তন করছেন যখন কনটেন্ট পরিবর্তিত হয়নি। আপনার CI হয়ে যায় অপ্রতিলিপ্য, আপনার পরীক্ষা অস্থির হয়ে উঠেছে।

নির্দেশক সমাধান: একটি Gradle পাইপলাইন যা গ্রাফটি পূর্বে গণনা করে সাদৃশ্য এবং তা সংরক্ষণ করে`graph.json`. টেমপ্লেট ফলাফল পড়ে — সে কখনো একটি হিসাব শুরু করে না।

আর্কিটেকচার : ব্যাকেরি গ্রাফিফাই ইম্পোর্ট করে, ইঞ্জিন নয়

এটি আর্কিটেকচারের সবচেয়ে গুরুত্বপূর্ণ বিষয়। আকর্ষণ হতো সহযোগিতাকে তারে দেওয়া`engine/build.gradle.kts`: ইঞ্জিন প্রয়োগ করে গ্র্যাফিফাই স্ক্যানের জন্য, ব্যাকেরি বেকিংয়ের জন্য, এবং ইঞ্জিন দুটির মধ্যে সেতু তৈরি করে। দুইটি.

এটি একটি অ্যান্টি‑প্যাটার্ন। Engine একটি ব্যবহারকারী টার্মিনাল — এটি প্রয়োগ করে। প্লাগইনগুলো, এটি ব্যবসায়িক যুক্তি প্রয়োগ করে না। নিয়ম হল : প্রমাণের দায়িত্ব মালিকানাধীন প্লাগইনে আছে।

bakery import graphify
Figure 1. সঠিক আর্কিটেকচার — বেকারি Graphify আমদানি করে

DAG চুক্তি মেনে চলা হয়েছে : bakery (N2) graphify (N0) র امپোর্ট করে, N2 > N0, কোনো লঙ্ঘন নেই। Engine (N3) bakery (N2) আমদানি করে, N3 > N2, OK.

ইঞ্জিনের কোনো কোড লাইন রেফারেন্স করা নেই`graph.json`, relatedPosts, অন্য কোনো সমতার ধারণা। সে ব্যাকারি প্রয়োগ করে, বিন্দু। লা সহযোগিতা বেকারের अभ্যন্তরে রয়েছে।

পাইপলাইন : স্ক্যান → গ্রাফ → টেমপ্লেট

এটি হলো তিন ধাপে সম্পূর্ণ পাইপলাইন :

  1. Scan (graphify) :`graphify-plugin`workspaceni স্ক্যান করে। এর

বর্তমান রূপে, এটি ইতিমধ্যে এইগুলো সনাক্ত করে`xref:`মধ্যে`.adoc`এবং প্রদর্শন করে এতে`graph.json`যেমন ধরণের কিনारे`reference`.
এটি সম্পাদকীয় কন্টেন্টের জন্য সমৃদ্ধ করা হয় : * পার্স কর মেটাডেটা JBake (:jbake-tags:, :jbake-description:) প্রতিটির`.adoc`ব্লগের ট্যাগের সহ-পূর্ববৃত্তি গণনা করুন → edges`tag_cooccurrence`ওজন সহ * TF-IDF ব্যবহার করে বিবরণ থেকে নামযুক্ত エンিটি নিষ্কাশন করা → edges`entity_overlap` * একটি অংশ ইনজেক্ট করে`blog_articles`এর মধ্যে`graph.json`বিদ্যমান (No output, as no French text was provided to translate)

// 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. বেক (ব্যাকারি) : সময়ের`./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 মডেল এখন একটি মানচিত্র পায়

একটি সতর কালানুক্রমিক তালিকার বদলে সংগঠিত

<!-- 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>

টেমপ্লেটটি একই — এটি কোথা থেকে ডেটা আসে না জানা। বেকের리와 JBake এর মধ্যে শুধুমাত্র চুক্তি পরিবর্তিত হয়েছে:`published_posts`(সুচি) ক্রোনোলজিকাল) হয়`relatedPosts`(map_weighted_by_the_graph)

ব্যাজ «কারণ» (উদাহরণ:`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)
}

ডিফল্ট আচরণ বর্তমানে আচরণের সাথে একই। এইটি সুপারিশ ইঞ্জিন একটি প্রগতিশীল উন্নতি — না একটি ব্রেকিং চেঞ্জ।

এমার্জেন্টঅন্টোলজি : যখন নিবন্ধগুলো একে অপরে জানেন না, তবে একত্রিত হয়

সবচেয়ে আকর্ষণীয় স্তরটি তৃতীয়টি : উদ্ভূত অন্তর্ভুক্ত। যে নিবন্ধগুলি উদ্ধৃত হয় না, যাদের.tags একই নয়, কিন্তু যারা একই বিষয় নিয়ে কথা বলেন কিন্তু তা না জানেন.

আসুন একটি বাস্তব উদাহরণ নেয়া যাক। আমার কোর্পাসের তিনটি রচনা :

  1. 0119 — DGX Spark বেনচমার্ক vs ক্লাউড সাবস্ক্রিপশন LLM

  2. 0121 — Gradle প্লাগইন দুটি Ollama Pro ইন্সট্যান্স পরিচালনা করা

  3. 0122 — অনুপাত কার্যকারিতা 27x 45x বাস্পার বিশেষজ্ঞ কৃত্রিম বুদ্ধিমত্তা

এই তিনটি লেখার মধ্যে কোনও xref নেই। তাদের ট্যাগ না ২০% পর্যন্ত (« ollama », « llm » সাধারণ) মেলে। কিন্তু একটি হালকা NLP বিবরণগুলো রে স্পষ্ট ক্লাস্টার প্রকাশ করে: « খরচ », « সাবস্ক্রিপশন », ক্লাউড », « GPU », « API কী », « ওল্লামা প্রো », « কার্যকারিতা », « অনুপাত

তারা একটি অন্তর্ভুক্ত ক্লাস্টার তৈরি করেন : সেলফ-হোস্টেড LLM এর অর্থনীতি বনাম cloud*. এই cluster* কোথাও ঘোষিত হয় না। এটি corpus থেকে উদ্ভব হয়।

cluster ontologique exemple

এই অন্টলজিক্যাল ক্লাস্টার ম intermédiaire একটি কম্পোজিট এজ হয়`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"
    ]
  }
}

এনএলপি ইচ্ছামত হালকা — TF-IDF + cosine similarity উপরে বর্ণনা। BERT এর প্রয়োজন নেই, ভাষা মডেলের প্রয়োজন নেই। কর্পাসে 23টি নিবন্ধ আছে, সাদৃশ্য মেট্রিক্স একটি 50 কিবি JSON ফাইল।

NLP-এর শক্তি অ্যালগরিদমের জটিলতায় থেকে আসে না, কিন্তু কর্পোরাসের আকার এবং বর্ণনের গুণমান এর কারণে। এক `:jbake-description:`ভালভাবে লেখা ১৫০ অক্ষরের অংশে আরও বেশি TF-IDF-এর জন্য একটি পুরো ৩০০০ শব্দের নিবন্ধের সিগন্যাল।

DAG চুক্তি: কে কে গুরুত্বপূর্ণ

এটি বিন্দু যেখানে স্থাপত্য শাখা ফল দেয়. DAG N0→N3 সংজ্ঞায়িত`engine/build.gradle.kts`একটি সহজ নিয়ম দেয় : কোন প্রকল্প একটি উচ্চ-স্তরের প্রকল্পকে আমদানি করে না।

ব্যবহারকারী প্লাগইন আমদানি করা প্লাগাইন ভোগোয়ার স্তর আপোর্টকৃত স্তর বৈধ ?

bakery-gradle

graphify-gradle

N2

N0

✅ N2 > N0 — OK

ইঞ্জিন

bakery-gradle

N3

N2

✅ N3 > N2 — OK

ইঞ্জিন

graphify-gradle

N3

N0

✅ প্রযুক্তিগত ঠিক, কিন্তু ধারণামূলকভাবে ভুল — सहयोगিতা bakery-এর ভিতরে (Note: The Bengali text above preserves the emoji, punctuation, asterisks, and spacing, with only the linguistic content translated.)

ইঞ্জিন বেকারি প্রয়োগ করে। বেকারি গ্রাফাই প্রয়োগ করে। এটাই সব। একদিন আমি গবেষণায় ভেক্টর স্টোর কোডবেস (N1) যোগ করতে চাই ক্রস-কর্পস শব্দার্থ, বেকারি তােও আমদানি করে। ইঞ্জিনটি পরিবর্তন করে না।

প্যাটার্ন হল: N2 প্লাগইন তার নিজের নির্ভরতাগুলির হাব Engine N3 একটি hub নয় — এটি একটি টার্মিনাল যা হাব প্রয়োগ করে।

আমরা কী পাই (এবং কী পাই না)

প্রধান লাভ সম্পাদনামূলক, প্রযুক্তিগত নয়:

আগে পরে

সংশ্লিষ্ট লেখাগুলি = গত ৪টি পোস্ট

সংশ্লিষ্ট নিবন্ধ = ওজন অনুযায়ী জ্ঞান গ্রাফে শীর্ষ ৪

পাঠক RAG থেকে পড়ে → কিটি টার্মিনালের সুপারিশ

পাঠক RAG পড়ে → pgvector, chunking, vector store সুপারিশ

কেনে কোনো স্বচ্ছতা নেই

ব্যadge`xref 0122`, tag:gradle, `cluster:rag`দৃশ্য

JBake স্ট্যান্ডার্ড, জিরো ইফোর্ট, জিরো মূল্য

গ্র্যাডল পাইপলাইন, নির্ধারিত, পুনরাবৃত্তিমূলক, পরীক্ষাযোগ্য

পাঠকের জন্য কোনও শেখার বক্ররেখা নেই

পাঠক আমার কন্টেন্টের টপোলজি খুঁজে পায়

যা কেউ ne জয় না করে :

  • এটি একটি « সত্য » সুপারিশ ইঞ্জিন নয় (সহযোগিতার কোনো

ফিল্টারিং, কোনো A/B টেস্টিং না, কোনো ফিডব্যাক লুপ না)

  • গुणমান JBake মেটাডেটার সমৃদ্ধি উপর নির্ভর করে — যদি আপনার

বিবরণগুলো খালি, TF-IDF কিছুই দেখে না

  • NLP অফলাইন — নতুন নিবন্ধগুলোকে শুধুমাত্র …​-এ ক্লাস্টার করা হয়

আগামী স্ক্যান (এটা ভালো: বিল্ডটি deterministic (নির্ধারক) থাকে)

দৃষ্টিকোণ: ব্লগ পাবলিক নোলেজ গ্রাফের মতো

এই বৈশিষ্ট্য একটি বিস্তৃত দৃষ্টিভঙ্গি খুলে দেয়: এবং যদি`cheroliv.com` তিনি নিজেকে একটি নেভিগযোগ্য জ্ঞান গ্রাফ হচ্ছিলেন?

আর্টিকেলগুলো নোড। ট্যাগগুলো সম্প্রদায়। xrefগুলো এড়োকে। পাঠক আর একটি বিচ্ছিন্ন নিবন্ধ পড়ে না — সে একটিতে নেভিগেট করে জ্ঞান গ্রাফ যেটির বর্তমান প্রবন্ধ প্রবেশের বিন্দু।

कल्पনা করুন একটি হোমপেজ যা কালানুক্রমিক তালিকা দেখায় না শেষ পোস্টগুলো, কিন্তু একটি carte du corpus : ওনটোলজিক্যাল ক্লাস্টার, পিভোট আর্টিকেল (যেগুলোর সবচেয়ে বেশি কিনার), পড়ার পথ প্রস্তাবিত « আপনি যদি Graphify সম্পর্কিত নিবন্ধটি পছন্দ করেন, তাহলে পরবর্তীটি পড়ুন যেটি Knowledge Graph-কে বোঝার সরঞ্জাম হিসাবে )

এটি আরও একটি ব্লগ নয়। এটি একটি সেমানটিক অ্যাটলাস।

এবং এটি বিজ্ঞান ফিকশন নয়। এটা`graph.json`এতিমধ্যে বিদ্যমান। তার কেবল নেভিগেশন ইন্টারফেস দরকার।

উপসংহার : ফাইল সিস্টেম টেমপ্লেট যা উপেক্ষা করে তা জানে

এই মঙ্গলবার সন্ধ্যায় আমি যা উঁচু progett করেছি, তা হল একটি হিউরিস্টিকের প্রতিস্থাপন অলস (কালাক্রমিক) দ্বারা একটি বিশ্বস্ত প্রতিনিধিত্বের আমার কর্পাসের গঠন (জ্ঞান গ্রাফ)।

টেমপ্লেট`post.thyme`বদলে না। যা পরিবর্তিত হয়, তা আমরা তাকে খabar দেয়। পূর্বে: একটি জাভা তালিকা অনুযiare`date`. একটি ওজনযুক্ত গ্রাফ — তিনটি বিশ্লেষণ স্তর থেকে উৎপন্ন — xrefs, সহ-উপস্থিতি tags-এর, এবং NLP দ্বারা উদ্ভত ওন্টোলজি।

ফেরত লুপ বন্ধ হয়েছে। graphify ওয়ার্কস্পেসটি স্ক্যান করে। Bakery পড়ে গ্রাফ এবং টেমপ্লেটকে পুষ্টি করে। পাঠক সুপারিশগুলি দেখে প্রাসঙ্গিক। এবং ইঞ্জিন — কন্ডাক্টর — এটা навіত না জানে সব cái বিদ্যমান আছে.

এইইই, ভাল আর্কিটেকচার। প্রতিটি প্লাগইন একটি কাজ করে। এবং গ্রাহক টার্মিনালকে কীভাবে জানার দরকার নেই।

Articles connexes