Graph Engineering trong kỹ nghệ phần mềm

Dạo này đi đâu cũng nghe nhắc tới “Graph Engineering”, như thể đây là một ngành kỹ thuật mới toanh. Nhưng nhìn kỹ lại, cụm từ này đang được dùng cho hai thứ khác nhau. Một là graph để biểu diễn ngữ cảnh, tri thức, tài liệu, giúp AI biết cái gì liên quan tới cái gì. Hai là graph để định nghĩa và điều phối luồng thực thi cho agent, kiểu LangGraph, áp dụng cho cả một quy trình kỹ thuật phần mềm thay vì một tác vụ đơn lẻ. Hiện tại với cách chúng tôi đang làm, với workflow.yaml và agent orchestrator, thật ra cũng đang làm việc thứ hai này, dù không gọi bằng tên đó. Bài viết này tách bạch hai nghĩa, đi sâu vào từng nghĩa, và nêu quan điểm cá nhân về cách gọi tên phù hợp hơn.

1. “Graph Engineering” là graph nào?

Câu hỏi đầu tiên đáng hỏi: “Graph Engineering” có phải một ngành riêng không? Câu trả lời ngắn gọn của tôi là: không hẳn, và còn tuỳ nghĩa nào. Nếu tách bạch ra thì ngành công nghệ AI hiện đang xoay quanh bốn “lớp” kỹ thuật, xây chồng lên nhau như bốn tầng của một cái tháp. Prompt engineering là tầng thấp nhất, lo chuyện viết một câu lệnh cho thật rõ ràng, đúng ý. Context engineering là tầng quyết định model được “nhìn thấy” cái gì, kiến thức nào, dữ liệu nào, cấu trúc ra sao trước khi nó trả lời. Harness engineering lo phần “sân chơi” cho AI hoạt động: công cụ, bộ nhớ, cơ chế phản hồi. Và loop engineering là tầng trên cùng, thiết kế cái vòng lặp quan sát, hành động, kiểm tra, sửa sai, để AI có thể tự chạy mà không cần người nhắc từng bước.

Vậy graph nằm ở đâu trong bốn tầng này? Câu trả lời phụ thuộc vào nghĩa nào của graph đang được nói tới. Nếu graph là cách biểu diễn ngữ cảnh, dữ liệu (nghĩa 1), nó chỉ là một kỹ thuật nằm trong context engineering, không xứng đứng ngang hàng với bốn tầng ở trên, giống như gọi “viết SQL” là một ngành riêng ngang với backend engineering vậy. Nhưng có một nghĩa khác của graph đang rộ lên gần đây, khoảng giữa tháng 7/2026: graph như cách điều phối nhiều agent hay nhiều loop cùng lúc, kiểu LangGraph, được không ít người coi là hẳn một tầng thứ năm, nằm ngay trên loop engineering. Đây là nghĩa 2, không liên quan gì tới context.

Bốn tầng kỹ thuật xây chồng lên nhau và khép thành một vòng lặp. Graph (nghĩa 1) chỉ là một kỹ thuật nằm trong context engineering, đứng cạnh agentic search và vector RAG. Workflow Engineering là cách điều phối nhiều loop hay nhiều agent, thường gắn với graph theo nghĩa 2, và được trình bày riêng ở mục 3.

Ba cách để đưa ngữ cảnh vào cho AI

Bên trong tầng context engineering, có ba cách chính để tìm và định hình thông tin. Không cách nào thay thế được cách nào, mỗi cách hợp với một loại nội dung khác nhau. Chọn sai chỗ là lỗi phổ biến nhất tôi thấy các team hay mắc.

CáchLà gìHợp với
Graph có cấu trúcNối các thứ lại với nhau bằng liên kết rõ ràng, có thể là cấu trúc dự án của tôi, hoặc entity rút ra từ tài liệu (GraphRAG).Trả lời “cái này liên quan gì tới cái kia”, “đổi cái này thì cái gì bị ảnh hưởng”.
Agentic searchGrep, duyệt cây thư mục, tra symbol, chạy trực tiếp trên mã nguồn thật.Mặc định cho code. Luôn chính xác, không bao giờ lỗi thời vì chẳng có gì được xây trước để mà lỗi thời.
Vector RAGEmbedding và so khớp theo nghĩa.Văn bản ít thay đổi: RFP, chính sách, tài liệu kiến thức, nơi ý nghĩa quan trọng hơn từ ngữ chính xác.

Hai nghĩa của “graph”, tóm tắt trong một bảng

Đây là chỗ dễ nhầm lẫn nhất. “Graph Engineering” đang bị dùng cho hai thứ không liên quan gì tới nhau ngoài việc cùng là một cấu trúc node và edge. Bảng dưới đây là phép thử nhanh: gặp ai nhắc “graph engineering”, hỏi luôn họ đang nói nghĩa nào.

 Nghĩa 1: Graph ngữ cảnh / tri thứcNghĩa 2: Graph điều phối (workflow, kiểu LangGraph)
Node là gìMột thực thể tĩnh: Story, Module, Test Case, Document, Person, Topic…Một agent chuyên trách hoặc một bước xử lý: researcher, writer, reviewer, hoặc một skill/tool call.
Edge là gìMột quan hệ tĩnh giữa hai thực thể: traces_to, depends_on, mentions…Một đường điều khiển luồng chạy: tuần tự, rẽ nhánh theo điều kiện, hoặc quay vòng lại khi chưa đạt.
Trả lời câu hỏi“Cái này liên quan gì tới cái kia?”, “đổi cái này thì gãy chỗ nào?”“Bước tiếp theo là gì?”, “ai làm việc này?”, “khi nào được đi tiếp, khi nào phải quay lại?”
Khi nào graph “chạy”Graph là dữ liệu tĩnh, được đọc để lấy ngữ cảnh trước khi model trả lời. Bản thân graph không tự thực thi.Graph được một runtime duyệt qua thật sự lúc chạy, quyết định node nào chạy kế tiếp, có thể lặp lại một node nhiều lần.
Nằm ở tầng nàoBên trong context engineering (tầng 2 trong bốn tầng ở trên), đứng cạnh agentic search và vector RAG.Một tầng riêng, nằm bên trên loop engineering: mỗi node bên trong vẫn chạy một loop, nhưng graph quyết định các loop đó nối với nhau ra sao.
Công cụ tiêu biểucontext-graph.yaml tự viết tay, GraphRAG, Graphify, Understand-Anything.LangGraph, Microsoft AutoGen GraphFlow, Google ADK, và (theo tôi) chính workflow.yaml cộng orchestrator của Amplify SDLC Kit.

Mục 2 ngay sau đây đi sâu vào nghĩa 1. Mục 3 nói riêng về nghĩa 2, đàng hoàng và đủ chi tiết, thay vì nhét chung vào rồi lại gây hiểu lầm thêm một lần nữa.

2. Graph ngữ cảnh và tri thức (nghĩa 1)

Đây là nghĩa quen thuộc hơn: dùng graph để biểu diễn ngữ cảnh và tri thức, giúp AI trả lời được những câu hỏi mà tìm kiếm thông thường không trả lời nổi.

Graph cấu trúc dự án và GraphRAG

Nói tới graph, thực ra người ta đang gộp chung hai thứ khác nhau. Một graph đơn giản là một tập các node có kiểu (như Story, Module, Test Case, ADR, Skill) nối với nhau bằng các edge có kiểu (như implements, depends_on, traces_to, constrains, owns). Ý tưởng không có gì phức tạp. Nhưng trong thực tế, nó xuất hiện dưới hai dạng, và tách bạch ra sẽ dễ nói chuyện với nhau hơn.

 Graph cấu trúc dự ánGraphRAG (graph tri thức từ tài liệu)
Map cái gìCodebase và các sản phẩm bàn giao của chính dự án: story, requirement, module, test, quyết định thiết kế.Entity và relationship rút ra từ một tập tài liệu hay kho tri thức.
Dùng để làm gìPhân tích tác động, truy vết, hỗ trợ người mới. Ví dụ: “sửa cái này thì gãy chỗ nào?”, “story này được test bởi gì?”, “module này bị ràng buộc bởi quyết định nào?”Trả lời câu hỏi trải rộng trên nhiều tài liệu, nơi câu trả lời phải ghép thông tin từ nhiều nơi. Ví dụ: “người này liên quan gì tới dự án kia?”
Quy mô thường thấyNhỏ: vài trăm node, cập nhật theo nhịp sprint.Có thể rất lớn, phục vụ truy xuất trên khối lượng văn bản lớn.
Xây bằng cách nàoChủ yếu phân tích tĩnh (static analysis) cộng thêm chút chỉnh tay.Trích xuất entity bằng LLM, gộp trùng lặp, nối relationship, rồi ép theo schema.
Graph cấu trúc dự án: mỗi edge trả lời một câu hỏi mà nếu không có graph, AI phải tự lần mò qua nhiều file mới ra được.
Graph GraphRAG: entity và liên kết rút ra từ văn bản, để một câu hỏi có thể nhảy qua nhiều tài liệu cùng lúc.

Xây graph nào thì cũng chỉ có ba việc phải làm

Dù là graph cấu trúc dự án hay GraphRAG, quy trình xây dựng đều quy về ba việc giống nhau.

ViệcNghĩa là gìVí dụ đơn giản
1. Thiết kế schemaChọn loại node và loại edge trước tiên, dựa trên câu hỏi thật sự cần trả lời. Đừng mô hình hoá thứ mà tôi sẽ chẳng bao giờ hỏi tới.Nếu không bao giờ hỏi “ai đang phụ trách cái này?”, thì chưa cần edge owns vội.
2. Đổ dữ liệu vàoLấy các relationship vào graph, thường phối hợp ba nguồn: phân tích tĩnh cho liên kết chính xác trong code, LLM trích xuất cho liên kết nằm trong văn bản, và con người chỉnh tay cho những chỗ cần phán đoán.Import trong code lấy từ phân tích tĩnh; “ADR này ảnh hưởng module kia” có khi cần người xác nhận.
3. Giữ cho graph luôn mớiĐịnh kỳ kiểm tra lại graph so với thực tế. Đây là việc các team hay bỏ qua nhất, mà lại là việc quan trọng nhất.Một graph không ai kiểm tra lại sẽ âm thầm trở thành một câu chuyện nghe có vẻ đúng nhưng sai bét.

Các loại node

NodeĐại diện choTrường dữ liệu chính
StoryMột hạng mục công việc.id, title, status, sprint
RequirementĐiều hệ thống phải làm được.id, text, priority
ModuleMột thành phần trong code.id, name, path
Test CaseMột phép kiểm tra hành vi.id, name, result
ADRMột quyết định kiến trúc.id, title, status
SkillMột automation tái sử dụng được.id, name, purpose

Các loại edge

Mỗi edge chỉ nên tồn tại nếu nó trả lời được một câu hỏi thật.

EdgeNối gì với gìTrả lời câu hỏi
traces_toStory → RequirementStory này đáp ứng requirement nào?
realizesModule → StoryCode nào hiện thực hoá story này?
verifiesTest Case → StoryTest nào đang phủ story này?
depends_onModule → ModuleĐổi module này thì gãy chỗ nào?
constrainsADR → ModuleQuyết định nào đang ràng buộc thành phần này?
ownsSkill → ArtifactAutomation nào đang bảo trì cái này?

Ra file thật thì trông như vầy

Với một graph dự án nhỏ, một file phẳng là đủ dùng. Không cần database gì cả.

# context-graph.yaml (trích đoạn)
nodes:
- id: STORY-14
type: Story
title: "Reset mật khẩu qua email"
status: in_progress
- id: REQ-3
type: Requirement
text: "Người dùng tự khôi phục truy cập, không cần support"
- id: MOD-auth
type: Module
path: src/auth/
edges:
- from: STORY-14
rel: traces_to
to: REQ-3
- from: MOD-auth
rel: realizes
to: STORY-14
meta:
last_checked: 2026-07-20 # dấu hiệu tin cậy

Giữ nó tinh gọn: bắt đầu với hai, ba loại edge tôi truy vấn nhiều nhất, thêm ngày last_checked, và chỉ mở rộng schema khi có câu hỏi mới thật sự cần tới.

Schema GraphRAG

Khi trích xuất entity và relationship từ một tập tài liệu (cách làm của GraphRAG) và quyết định lưu chúng vào một graph database, schema chính là thứ giữ cho kết quả có thể truy vấn được, thay vì trở thành một mớ bòng bong. Đây là hình mẫu khởi điểm cho entity và relationship rút ra từ một tài liệu hay kho tri thức.

Các loại entity (node)

EntityĐại diện choTrường dữ liệu chính
DocumentMột file nguồn hay bài viết.id, title, source, date
ChunkMột đoạn văn bản trong tài liệu, giữ lại để truy vết ngược về nguyên văn.id, text, embedding
PersonMột cá nhân có tên.id, name, role
OrganizationMột công ty hoặc team.id, name, type
TopicMột chủ đề hay khái niệm.id, label
EventMột sự kiện xảy ra tại một thời điểm.id, name, date

Các loại relationship (edge)

RelationshipNối gì với gìÝ nghĩa
part_ofChunk → DocumentĐoạn văn này thuộc tài liệu đó.
mentionsChunk → Person / Org / TopicĐoạn văn này nhắc tới entity đó.
authored_byDocument → PersonAi là người viết.
works_forPerson → OrganizationTrực thuộc tổ chức nào.
related_toTopic → TopicCác khái niệm liên quan tới nhau.
occurred_onEvent → DateXảy ra khi nào.
// entity
(d:Document {id:"DOC-42", title:"Đánh giá đối tác Q2", date:"2026-04-11"})
(p:Person {id:"PER-7", name:"A. Nguyễn", role:"Trưởng nhóm"})
(o:Org {id:"ORG-2", name:"Acme Health"})
(t:Topic {id:"TOP-9", label:"chuyển đổi dữ liệu"})
// relationship
(d)-[:AUTHORED_BY]->(p)
(p)-[:WORKS_FOR]->(o)
(d)-[:MENTIONS]->(t)
// một câu hỏi schema này giờ trả lời được trong một, hai hop:
// "tổ chức nào đang liên quan tới chuyển đổi dữ liệu?"

Graph được xây theo trình tự nào

Pipeline chạy theo thứ tự này, và bỏ qua một bước là lý do phổ biến nhất khiến một pilot ban đầu làm người ta thất vọng.

  1. Trích xuất entity từ văn bản thô bằng LLM.
  2. Gộp trùng lặp để cùng một entity được gọi tên khác nhau trở thành một node duy nhất. Bỏ qua bước này là nguyên nhân phổ biến nhất khiến kết quả ban đầu tệ.
  3. Liên kết các relationship giữa những entity đã được gộp.
  4. Ép theo schema để dữ liệu mới luôn đúng loại node, loại edge đã định, không phải nhiễu tự do.

Vậy có thật sự cần một graph database không?

Thường là không cần. Graph chỉ là node và edge, còn graph database chỉ là một cách để lưu chúng. Chỉ nên tính tới một graph database thật sự (hay cả pipeline GraphRAG) khi một trong các điều sau đúng:

  • Câu hỏi cần duyệt multi-hop thật sự, mà nếu làm bằng join lặp đi lặp lại thì rất cực.
  • Graph quá lớn, không thể nhét vừa vào context window hay một lần truy vấn.
  • Cần các thuật toán graph có sẵn như shortest path, community detection.
  • Nhiều agent hoặc hệ thống cùng đọc và ghi vào một graph đang thay đổi liên tục.

Còn nếu không cần database, thì lưu graph kiểu gì?

Node và edge mới là điều quan trọng, còn cách lưu chỉ là chi tiết kỹ thuật. Nếu không rơi vào bốn trường hợp ở trên, một trong các lựa chọn nhẹ nhàng sau thường là đủ, và tất cả vẫn giữ nguyên schema y như trên.

Lựa chọnTrông như thế nàoTruy vấn ra saoHợp khi nào
File phẳng (YAML / JSON)Một danh sách node và edge, commit thẳng vào git cạnh code.Load cả file, lọc bằng một script ngắn, hoặc đưa thẳng vào context của model.Vài trăm node, cập nhật theo nhịp sprint. Dễ đọc, dễ so sánh diff.
Bảng quan hệ (relational)Một bảng source, relationship, target trong database tôi đã có sẵn (ví dụ Postgres).SQL thuần. Mỗi hop là một self-join.Đã có sẵn database quan hệ và ít khi cần hơn một, hai hop.
Graph trong bộ nhớ (in-memory)Xây lại từ nguồn mỗi lần chạy, giữ trong một đối tượng graph, rồi bỏ đi.Duyệt bằng code (ví dụ thư viện nhỏ như networkx).Xây lại rẻ, không cần lưu lại giữa các lần chạy.
Vector store và metadataCác đoạn tài liệu vẫn nằm trong vector store bình thường; liên kết entity nằm trong metadata của đoạn đó hoặc một bảng phụ nhỏ.Vector search tìm ra đoạn văn, rồi tra metadata để lần theo liên kết. Đây là kiểu “GraphRAG-lite”.Muốn phần lớn lợi ích “nối các điểm lại với nhau” của GraphRAG mà không cần dựng graph database.

Có cần nhúng (embed) toàn bộ code vào vector store không?

Không cần, và với code thì cả ngành đang đi ngược lại với những gì mọi người hay mặc định. Claude Code và các công cụ tương tự không hề dựng sẵn một index nào cả. Chúng duyệt hệ thống file, đọc file, grep đúng thứ cần tìm, và lần theo tham chiếu, y như một kỹ sư thật sự làm, tất cả chạy tại chỗ, không cần index nào phải xây, bảo trì, hay upload lên đâu cả.

Vì sao embed toàn bộ codebase là rủi ro

Các công cụ dùng vector sẽ embed code và lấy các đoạn theo độ tương đồng lúc truy vấn. Với một team đang code liên tục, pipeline embed không theo kịp, nên một câu truy vấn có thể trả về một hàm đã bị đổi tên hai tuần trước, hoặc một module đã bị xoá từ sprint trước, mà chẳng có gì báo hiệu là nó đã lỗi thời. Chính đội ngũ Anthropic từng chia sẻ rằng bản đầu của Claude Code có thử dùng vector database, và nhận ra agentic search hoạt động tốt hơn hẳn khi thử nghiệm thật, một kết quả mà chính họ cũng thấy bất ngờ.

Vậy Claude dùng gì thay vào đó?

Cơ chếVai trò
CLAUDE.md / bản đồ repoChỉ cho agent đúng thư mục cần nhìn trước khi bắt đầu.
Grep trực tiếpKhớp chính xác trên cây thư mục hiện tại, không bao giờ lỗi thời.
Tra symbol (LSP)Lọc theo symbol thật, để một tên hàm phổ biến không trả về hàng trăm kết quả sai.
MCP serverKết nối tới công cụ nội bộ, ticket, tài liệu, hoặc để tự expose search như một tool gọi được.
SubagentGiữ cho một lần tìm kiếm lớn không làm rối context của agent đang thực sự làm việc.

Vậy vector retrieval có còn chỗ đứng không?

Không phải “RAG đã chết”. Khi tôi không biết chính xác tên của thứ cần tìm, hoặc từ ngữ trong spec không khớp với từ ngữ trong code, một index theo nghĩa sẽ tìm ra thứ mà grep không thể. Đó chính xác là thứ embedding sinh ra để làm, và văn bản tự nhiên thay đổi chậm, nên vấn đề lỗi thời gần như không đáng lo ở đây.

Loại nội dungCách tiếp cận mặc địnhVì sao
Code và repo có cấu trúcAgentic search trước (bản đồ repo, grep, symbol). Chỉ thêm index ngữ nghĩa khi có một điểm đau cụ thể.Khớp chính xác thắng khớp mờ, và lỗi thời là rủi ro thật trên một repo đang hoạt động.
Kho văn bản (RFP, BRD, slide, blog)Kết hợp tìm theo từ khoá và vector, có rerank.Ý nghĩa quan trọng hơn từ ngữ chính xác, và nội dung thay đổi chậm.
Relationship giữa các artifactNgữ cảnh dạng graph, không phải search hay embedding.Chỉ một graph rõ ràng mới trả lời được “cái này phụ thuộc vào cái gì”.

Khi nào nên thêm tra symbol hay công cụ search: khi grep thường bắt đầu trả về nhiều kết quả sai cho những tên phổ biến, hoặc khi onboard vào repo mất nhiều thời gian hơn mức chỉ đọc một bản đồ repo nên mất. Đó là dấu hiệu agentic search một mình đã chạm trần.

Còn mấy công cụ như Graphify hay Understand-Anything thì sao?

Cả hai đều là công cụ mã nguồn mở (giấy phép MIT), gắn thêm vào các trợ lý code AI như Claude Code, Cursor, Copilot. Chúng quét một dự án, dựng một knowledge graph bền vững gồm file, hàm, class, và dependency, rồi cho phép trợ lý truy vấn graph hoặc dò đường đi thay vì grep từng file thô. Graphify nói rõ họ “không phải vector index, không embedding, mà là một graph thật sự có thể duyệt được”, xây chủ yếu từ cây cú pháp (syntax tree) cộng thêm một ít trích xuất bằng LLM, commit kết quả vào git, và có thể đẩy tuỳ chọn sang Neo4j. Understand-Anything làm tương tự và có thêm một dashboard tương tác để khám phá graph.

Nói theo ngôn ngữ ở phần trên, hai công cụ này chính là graph cấu trúc dự án, chỉ khác là được đóng gói sẵn để cài vào, thay vì tôi tự xây tay. Nên câu trả lời thành thật là “còn tuỳ”, và cái được, cái mất đáng nói thẳng ra như sau:

Điểm đượcĐiểm cần cân nhắc
Cho câu trả lời multi-hop và phụ thuộc (“cái này nối gì với cái kia”) mà grep một mình không làm được, mà tôi không cần tự thiết kế schema từ đầu.Đây là thêm một artifact nữa phải xây, giữ mới, và tin tưởng. Một graph bị cũ còn tệ hơn không có graph, đó là lý do cả hai đều dựa vào git hook để tự xây lại.
Phần lõi dựa trên cây cú pháp (deterministic) giữ cho phần lớn graph là sự thật, không phải đoán mò.Lớp trích xuất bằng LLM vẫn tốn token và có thể tạo nhiễu, cả hai dự án còn khá non trẻ với đội duy trì nhỏ.
Giấy phép MIT, commit được vào git, để cả team cùng xuất phát từ một bản đồ chung.Thêm bất kỳ công cụ AI của bên thứ ba nào cũng là một quyết định về chuỗi cung ứng và quản trị. Nên rà soát kỹ (ví dụ bằng một lượt quét độ tin cậy repo) trước khi dùng.

Tóm lại: với phần lớn công việc tìm kiếm code hàng ngày, các cách làm ở mục Claude dùng gì thay vào đó (bản đồ repo, grep trực tiếp, tra symbol) đơn giản hơn, miễn phí, và không bao giờ lỗi thời, nên hãy bắt đầu từ đó. Xem một công cụ graph như một thử nghiệm có phạm vi rõ ràng, dành cho trường hợp cụ thể là câu hỏi phụ thuộc và tác động xuất hiện thường xuyên, và việc onboard đang thật sự đau đầu, chứ đừng coi nó là nâng cấp mặc định. Nếu có thử, hãy tính luôn chi phí bảo trì, và xác nhận lợi ích về độ chính xác là có thật trước khi phụ thuộc vào nó.

Vậy dự án ngắn hạn, nhỏ và dự án dài hạn, lớn thì có khác nhau không?

Có, cách làm nên thay đổi theo quy mô và thời gian sống của dự án.

 Dự án ngắn hạn, quy mô nhỏDự án dài hạn, quy mô lớn
Tìm kiếm codeChỉ cần agentic search: bản đồ repo, grep, tra symbol. Không cần index dựng sẵn, không cần công cụ graph.Vẫn agentic search làm nền, thêm tra symbol khi grep bắt đầu nhiễu, và dùng subagent để tìm kiếm lớn không làm rối context chính.
Graph cấu trúcBỏ qua, hoặc chỉ cần một file nhỏ tự viết tay nếu thật sự cần câu trả lời về phụ thuộc.Đáng để đầu tư một graph được commit, tự cập nhật (tự xây tay hoặc dùng công cụ như trên) để phân tích tác động và giúp người mới onboard nhanh hơn.
Tài liệuĐọc trực tiếp, hoặc search từ khoá đơn giản là đủ.Kết hợp tìm từ khoá và vector trên các kho tài liệu thay đổi chậm (RFP, chính sách, kho tri thức).
Nơi dồn công sứcGiữ mọi thứ tinh gọn, tránh dựng hạ tầng mà tôi sẽ không bảo trì nổi.Đầu tư vào vòng lặp bảo trì và kiểm tra định kỳ, vì đó mới là thứ giữ cho bất kỳ index hay graph nào còn đáng tin theo thời gian.

3. Graph điều phối workflow, kiểu LangGraph (nghĩa 2)

Nghĩa này không nói về việc model nhìn thấy dữ liệu gì. Nó nói về một chuyện khác: khi một công việc lớn cần nhiều agent chuyên trách nối tiếp nhau (một agent nghiên cứu, một agent viết, một agent phản biện, một bước quyết định đi tiếp hay quay lại sửa), thì lấy gì để định nghĩa thứ tự chạy, điều kiện rẽ nhánh, và dữ liệu dùng chung giữa các agent đó? Câu trả lời đang thịnh hành: vẽ nó ra thành một graph, node là từng agent hay từng bước, edge là luồng điều khiển, và một “state” chạy dọc theo các edge mang theo mọi thứ agent sau cần biết.

Chuyện này mới rộ lên từ đâu

Cụm từ “Graph Engineering” theo nghĩa này nổi lên trên X (Twitter) chỉ trong vài ngày, khoảng 18-19 tháng 7 năm 2026, sau một câu hỏi ngắn của Peter Steinberger, người tạo OpenClaw: “Are we still talking loops or did we shift to graphs yet?”. Sau đó nhiều người, đáng chú ý là các bài phân tích tổng hợp trên AI Builder Club và Eigent, đóng khung nó thành tầng thứ năm, ngay trên loop engineering: prompt (tầng 1, viết đúng câu lệnh), context (tầng 2, model thấy gì), harness (tầng 3, công cụ và bộ nhớ), loop (tầng 4, một agent tự lặp quan sát, hành động, kiểm tra), và giờ graph (tầng 5, điều phối nhiều agent hoặc nhiều loop cùng lúc). Ẩn dụ được nhắc nhiều nhất trên X: agent đang “tốt nghiệp” từ vòng lặp while-loop lên thành sơ đồ tổ chức (org chart), mỗi agent một vai trò chuyên biệt, việc được luân chuyển giữa các vai trò, kết quả được gộp ngược lại.

Một graph điều phối trông như thế nào

Ba thành phần, không hơn không kém.

Thành phầnLà gìVí dụ
NodeMột agent chuyên trách hoặc một bước xử lý xác định, mỗi node chỉ làm một việc.Agent nghiên cứu, agent viết, agent phản biện, hoặc đơn giản là một tool call.
EdgeĐường điều khiển luồng chạy: nối thẳng, rẽ nhánh theo điều kiện, tách ra chạy song song rồi gộp lại, hoặc quay vòng lại một node trước đó.“Nếu bài viết đạt yêu cầu thì xuất bản, nếu không thì quay lại cho agent viết sửa.”
State dùng chungMột đối tượng dữ liệu đi theo edge, mỗi node đọc vào và ghi thêm vào đó.Nhiệm vụ ban đầu, ghi chú nghiên cứu, bản nháp, kết quả chấm điểm, tất cả cộng dồn qua từng node.

Có một cách nhìn hay đáng nhớ: một loop chẳng qua là một graph chỉ có một node, với một edge quay ngược lại chính nó. Mọi thứ đã biết về thiết kế loop (chu trình quan sát, hành động, kiểm tra; điều kiện dừng; cơ chế xác minh) chính là phần bên trong của một node. Graph không thay thế loop, nó là thứ xuất hiện khi có nhiều loop cần bàn giao việc cho nhau.

Đối chiếu với cách chúng tôi đang làm

AI-DLC Kit, bộ tài liệu và skill dùng cho quy trình AI-DLC nội bộ, có cấu trúc khá gần với mô hình graph điều phối vừa nêu, dù không dùng từ “graph” để mô tả. Bộ file trong Harness cộng với skill orchestrator có thể đối chiếu với ba thành phần ở trên như sau.

Thành phần graph điều phốiTương ứng trong Amplify SDLC Kit
Định nghĩa graph (StateGraph)workflow.yaml: khai báo các phase (L0 đến L6), các gate (G1 đến G5), các chain nhiều bước có thứ tự, và các intent để khớp yêu cầu bằng lời thường vào đúng node.
NodeMỗi skill vai trò: ba-agent, sa-agent, dev, qc-agent, pm-agent. Mỗi node này bên trong vẫn tự chạy một loop riêng (đọc yêu cầu, soạn artifact, tự kiểm tra trước khi báo xong).
Edge tuần tự / rẽ nhánh có điều kiệnCác gate G1 đến G5: mỗi gate đọc bằng chứng (review log, traceability) và chỉ cho đi tiếp khi đạt tiêu chí blocking; không đạt thì dừng lại, trả về đúng skill có thể vá chỗ thiếu, y như “rẽ nhánh theo điều kiện, không đạt thì quay lại”.
State dùng chungCONTEXT-GRAPH.yaml: trạng thái phase, sprint, node nào đã xong, được mọi bước đọc vào và ghi thêm vào, giống hệt vai trò state trong LangGraph.
Runtime duyệt graphSkill orchestrator: đọc bốn file harness, khớp yêu cầu bằng lời với intent, quyết định chạy node hay chain nào, kiểm gate trước khi cho qua, rồi patch lại state. Đây chính là phần “thực thi” graph.
Mỗi vai trò (BA, SA, Dev, QC) là một node, mỗi gate (G1-G5) là một edge có điều kiện, orchestrator là runtime duyệt graph, và CONTEXT-GRAPH.yaml đóng vai trò state dùng chung: đúng ba thành phần node/edge/state của một graph điều phối kiểu LangGraph.
# workflow.yaml (phác thảo minh hoạ, không phải trích nguyên văn)
phases:
- id: L4
name: "Implementation"
steps:
- { id: L4.1, skill: dev/design-memo-generator }
- { id: L4.2, skill: dev/implement }
gate_out: G4
gates:
- id: G4
blocking: true
criteria:
- { check: "design memo exists for every sprint story", evidence: review_log }
- { check: "code review has no BLOCKER finding", evidence: review_log }
chains:
- id: qc-chain
order_enforced: true
steps: [test-scenario-designer, test-viewpoint-generator, test-case-designer, test-case-generator, testing-traceability-checker]
intents:
- match: ["what's next", "where are we"]
action: next_step

Vậy vì sao tôi vẫn không thích gọi nó là “Graph Engineering”

Đây là quan điểm cá nhân, không phải sự thật tuyệt đối, nên tôi nói rõ lý do để ai không đồng ý có thể phản biện lại.

Ủng hộ cách gọi “graph”: nó gọi đúng tên cấu trúc dữ liệu, cho phép mượn thẳng các khái niệm graph đã có sẵn (chu trình, rẽ nhánh, hội tụ nhiều nhánh, khả năng tới được của một node) thay vì phải diễn giải lại từ đầu. Nói “gate này là một conditional edge có thể quay vòng” chính xác hơn nói “gate này là một bước kiểm tra trong quy trình”.

Không ủng hộ cách gọi “graph”: phần việc khó và có giá trị nhất trong workflow.yaml không nằm ở chỗ nó là một graph. Nó nằm ở việc quyết định phase nào cần tồn tại, tiêu chí nào đủ để coi một gate là “qua”, bằng chứng nào được chấp nhận, và khi nào một chain phải chạy đúng thứ tự tuyệt đối. Toàn bộ những quyết định đó là thiết kế quy trình làm việc, không phải lý thuyết đồ thị. Gọi nó là “graph engineering” dễ khiến người nghe nghĩ việc khó là chọn cấu trúc dữ liệu, trong khi việc khó thật sự là chọn đúng gate, đúng tiêu chí, đúng trình tự. Đó là lý do cá nhân tôi thấy “Workflow Engineering” mô tả đúng bản chất công việc hơn, dù “graph” mô tả đúng hình dạng của nó hơn.

Quy ước dùng trong bài này: khi nói về cấu trúc bên dưới (node, edge, state, có chu trình hay không), dùng từ “graph”. Khi nói về công việc thiết kế thật sự (phase nào, gate nào, tiêu chí nào), dùng từ “workflow”. Cùng một hệ thống, nhưng gọi đúng lớp đang nói tới.

Tóm lại

Quay lại câu hỏi ban đầu: “Graph Engineering” có phải một ngành riêng không? Câu trả lời cần tách theo nghĩa. Nghĩa 1, graph như một cách biểu diễn ngữ cảnh và tri thức, đúng là chỉ một kỹ thuật nằm trong context engineering, không xứng đứng ngang hàng với prompt, harness, hay loop engineering, như đã lập luận từ đầu bài. Nghĩa 2, graph như một tầng điều phối nhiều agent hay nhiều loop, lại đang được nhiều người, không chỉ trên X mà cả trong các framework có sẵn như LangGraph, AutoGen, Google ADK, coi là một tầng thật, nằm ngay trên loop engineering, dù cơ chế bên dưới nó (đồ thị có hướng, máy trạng thái, điều phối đa-agent) đã tồn tại từ lâu trước khi có cái tên này.

Cách kiểm tra đơn giản tôi hay dùng cho mọi thuật ngữ mới nghe được vẫn không đổi: thử diễn giải ý tưởng đó bằng lời thường, không dùng chính thuật ngữ đó. Với nghĩa 1: “đang nối các thứ lại bằng liên kết rõ ràng để AI biết cái gì liên quan tới cái gì”, diễn giải được, đáng học. Với nghĩa 2: “đang định nghĩa nhiều agent chuyên trách, nối chúng theo một thứ tự có điều kiện, và cho chúng chia sẻ một trạng thái chung”, cũng diễn giải được, cũng đáng học, dù cá nhân tôi vẫn thấy gọi việc đó là thiết kế quy trình (Workflow Engineering) sát bản chất công việc hơn là gọi theo tên cấu trúc dữ liệu bên dưới (Graph Engineering). AI-DLC Kit, với workflow.yaml, các gate, và orchestrator, là một ví dụ có thể đối chiếu theo hướng này, dưới một tên gọi khác.

Leave a comment

This site uses Akismet to reduce spam. Learn how your comment data is processed.