Ian Chou's Blog

用一句話區分:Keyword 與 Entity 到底差在哪?

用一句話區分:Keyword 與 Entity 到底差在哪?

在建立知識圖譜(Knowledge Graph)或是實作 GraphRAG 時,最常遇到的一個痛點就是:「Keyword(關鍵字)」「Entity(實體)」 到底有什麼不同?

如果用一句話來區分:

Keyword(關鍵字):出現在文章裡的「字串」——用來做匹配、搜尋、過濾。
Entity(實體):你定義的「概念/東西」——有唯一身分、型別、可連線,用來做導航與圖結構。

這篇文章將透過完整的對照與具體範例,帶你理解兩者的差異,並介紹在實際專案中(如 Skill Graph)我們該如何有結構地提煉與定義 Entity。


比較對照表

我們可以從以下幾個維度來對比 Keyword 與 Entity:

維度 Keyword(關鍵字) Entity(實體)
本質 字串、詞彙 有身分的的具體概念(節點)
同一概念的多種寫法 每個寫法都是不同的 Keyword(例如 K8sKubernetes 多個寫法可以對應同一個 Entity(比如 K8sKubernetes 都指向 entity:kubernetes
有沒有型別(Type) 通常沒有 有(例如 skill, tool, framework 等)
關係(Relationship) 不建模關係 可以連 Chunk(內容區塊)、連其他 Entity(作為圖的邊)
主要用途 全文搜尋、篩選、統計出現頻率 知識導航、關係擴展、GraphRAG、建立技能樹
怎麼得到它 切詞、TF-IDF、Regex 匹配、只要文中有出現就算 抽取(Extraction) → 標準化 → 去重(Deduplication)

具體範例:K8s 與 Docker

讓我們先看一句話:「用 K8s 部署時我們會搭配 Docker。」

1. 當作 Keyword 看

系統會切出三個獨立的詞彙:「K8s」、「對部署」、「Docker」。
在這個層面上,系統沒有「K8s = Kubernetes」的資訊,也沒有「Docker 和 K8s 經常一起出現(有關係)」的結構

2. 當作 Entity 看

系統經過認知後,會提煉出兩個重點實體:

這兩者都可以做為知識圖譜上的「節點」。之後我們可以透過 Embedding 或是手動建立關係,將這兩個節點連成「KubernetesDocker」的圖結構。

結論:
Keyword 代表的是「長相(字面出現的詞)」;而 Entity 代表的是「是誰(概念本體)」。
一個 Entity 可以對應很多個 Keyword(如別名、簡稱、錯字);反過來,一個 Keyword 如果沒有經過標準化,系統並不知道它到底指的是哪一個 Entity。


在 Skill Graph 專案裡的應用對應

如果你正在實作一個自己的知識庫或技術圖譜,你可以這樣理解文件中的標籤與節點:

  1. Tags(標籤):比較像是「分類用的 Keyword」——顆粒度較粗、可能會重複,主要用來做簡單的篩選(例如 Backend, DevOps)。
  2. Entities(實體):這是經過標準化後的概念清單。每一個實體都有自己的 idnametype。文檔的內容區塊(Chunk)會透過 entities: [entity:...] 連結到這些實體上,為 GraphRAG 提供「地圖上的節點」。

記住:在構建知識圖譜時,我們要提煉的是 Entity,而不是單純的 Keyword 列表。 Entity 是你承認的、可重複使用的、且可連線的知識節點。


如何在 YAML 裡標準化定義 Entity?

根據 技能圖譜 (Skill Graph) 的定義標準,我們可以將 Entity 的格式整理成以下規範,並統一放在 Markdown 的 YAML frontmatter 裡。

1. Entity 該放在哪裡?

Entity 屬於文件級別的設定,應該寫在頂層的 entities: 陣列中,與 chunks: 並列:

---
title: "Backend Skills"
entities:     # 整份文件共用的 entity 清單
  - id: entity:python
    name: Python
    type: skill
    aliases: [python3]
chunks:
  - id: skill:python-api
    entities: [entity:python, entity:fastapi]   # chunk 用 id 來引用 entity
---

Tip: 在同一份文件中,每個 Entity 只要定義一次;而不同的 Chunk 只需要透過 entities: 陣列使用 id 去引用就好。

2. 單一 Entity 的核心欄位

每個 Entity 都是一個 YAML 物件,必須包含以下關鍵資訊:

欄位 必填 型別 說明
id ✅ 是 string 唯一識別碼,寫給機讀用(格式嚴格,見下文)
name ✅ 是 string 對外顯示的標準名稱(可含大小寫、空格)
type ✅ 是 string 概念類型(須從固定清單中選擇)
aliases array 別名/簡稱/變體寫法,用來對應文中的不同詞彙

3. id 的命名格式

範例對照:

概念 正確 id 錯誤示範(千萬別這麼寫)
Python entity:python entity:Python (不要大寫)
FastAPI entity:fastapi entity:FastAPI (不要大寫)
PostgreSQL entity:postgresql entity:PostgreSQL (不要大寫)
Event-Driven Architecture entity:event-driven-architecture entity:Event Driven Architecture (未轉 kebab)
CI/CD entity:ci-cd entity:CI/CD (請將斜線改為 -)

id 是給機器(開發程式、Graph DB)看的穩定唯一代號;而 name 才是給人類讀者看的正式顯示名稱。

4. name 的命名格式

5. type 的分類清單

type 用來區分「這是哪一類別的概念」,請盡量從以下固定清單中挑選,不要自創一堆新分類

type 類型 用途 範例實體
skill 技能、程式語言、核心能力 Python, SQL, System Design
tool 工具、CLI、周邊開發工具 Docker, Git, Redis
library 語言生態系的程式庫、套件 Pandas, Lodash, axios
framework 網頁端或後端的應用框架 FastAPI, React, Spring
platform 雲端平台、SaaS 服務、排程平台 AWS, Vercel, Kubernetes
database 各式關聯與非關聯資料庫 PostgreSQL, MongoDB
architecture 架構設計模式 Event-Driven, Microservices
protocol 網路協定、標準規範 HTTP, JWT, gRPC
domain 特定業務/技術領域 DevOps, Frontend
product 產品、系統名稱 Stripe, Notion
concept 無法歸類的其他抽象概念 Caching, Indexing

若都不太符合,一律退回使用 concept 即可。

6. aliases(別名)的使用技巧

範例:

- id: entity:kubernetes
  name: Kubernetes
  type: platform
  aliases: [K8s, k8s]

- id: entity:javascript
  name: JavaScript
  type: skill
  aliases: [JS, js]

未來系統做語意檢索或內容正規化處理時,可以透過綜合比對 id + name + aliases 來判斷「這段落到底在探討哪個技術點」。


完整的 YAML 結構範例

把上述所有規則組合起來,我們來看看一份完整的文件開頭會長什麼樣子:

---
title: "Backend Skills"
entities:
  - id: entity:python
    name: Python
    type: skill
    aliases: [python3, py]
  - id: entity:fastapi
    name: FastAPI
    type: framework
    aliases: []
  - id: entity:postgresql
    name: PostgreSQL
    type: database
    aliases: [postgres, psql]
  - id: entity:event-driven-architecture
    name: Event-Driven Architecture
    type: architecture
    aliases: [EDA, event-driven]
chunks:
  - id: skill:python-api
    tags: [Python, Backend]
    entities: [entity:python, entity:fastapi]
    context: "Python REST API development with FastAPI"
---

Chunk(內容區塊)該如何引用 Entity?

chunks 陣列中的每個區塊,若要標示這段內容提到了哪些實體,只需利用 entities 欄位:

chunks:
  - id: skill:python-api
    entities: [entity:python, entity:fastapi]   # 只能填寫上面已經定義過的 id

撰寫小提醒:


總結對照

最後,用一個簡單的總結表格複習一下如何在 Markdown 文件中管理 Entity 實體:

設定項目 規範與說明
位置 放在首部 Frontmatter 的頂層 entities: 陣列中
必填欄位 包含 id, name, type 三項
選填欄位 aliases
id 命名規則 entity: 開頭 + 全部字母小寫 kebab-case(必須保證文件內唯一)
type 選擇規則 請從 skill / tool / library / framework / platform / database / architecture / protocol / concept / domain / product 固定清單中選其一
Chunk 的引用 chunks[].entities: [entity:id, ...],且引用的 ID 必須預先存在這份文件的 entities 目錄裡

釐清 Keyword(字面外觀)與 Entity(知識本體)的差別,並老老實實地遵循規範把圖譜的節點建好,才是邁向進階 GraphRAG 系統、打造專屬技能術的最穩固地基!