Góc nhìn & Trí tuệ nhân tạoĐộ khó: Chuyên sâu / Nhật ngữ khoảng N3–N2⏱ 38 phút đọc

AI Agents tự hành: Phân tích kiến trúc ReAct và Multi-Agent

概Điểm nhấn trọng tâm của bài viết (Overview)

Theo dấu vòng ReAct, lập kế hoạch và phối hợp agent chuyên biệt; thực hành Python với giới hạn lượt gọi, timeout, kiểm tra bằng chứng và trao đổi thiết kế BrSE.

AI Agents tự hành: Phân tích kiến trúc ReAct và Multi-Agent

ReActとマルチエージェントによる自律型AIの設計

Bối cảnh và giả định: nhóm SaaS Việt–Nhật muốn trợ lý phân tích sự cố thanh toán: đọc tình trạng giao dịch, đối chiếu runbook, rồi đề xuất việc tiếp theo. Phiên bản đầu chỉ đọc dữ liệu trong một tenant; người vận hành quyết định thao tác ghi. Đây là tình huống tự biên soạn, không phải một hệ thống production đã triển khai.

Bài thuộc nhóm AI & Machine Learning, dành cho Senior Software Engineers, Tech Leads, DevOps/SRE, Solution Architects và BrSE. Cần biết Python, HTTP/API, async/await và nguyên lý gọi LLM. Tiếng Nhật hướng tới khoảng N3–N2; các đoạn Nhật, hội thoại, dữ liệu và code đều tự soạn, không phải trích nguyên văn nguồn.

Sau bài này, người đọc có thể:

  1. Giải thích vòng ReAct, phân biệt suy luận, kế hoạch, hành động và quan sát.
  2. Thiết kế hợp đồng giữa supervisor và các agent chuyên biệt, chạy bộ mô phỏng có kiểm tra lỗi.
  3. Trao đổi bằng tiếng Nhật về quyền tự hành, điều kiện dừng và bằng chứng nghiệm thu.

Key Takeaways: chất lượng mô hình không thay thế quyền ở tool gateway; nhiều vai trò không tự tạo ra kiểm chứng độc lập; một kế hoạch chỉ hoàn tất khi có kết quả được kiểm tra. Bài Tối ưu hóa RAG giải quyết lấy context; ở đây trọng tâm là ai chọn bước tiếp theo, ai được thực thi và ai xác nhận đã xong.

Ảnh hero là sơ đồ khái niệm SVG 1200×675 do BrSE.vn tự vẽ, phát hành theo CC0 1.0. Alt của hero là tiêu đề bài; sơ đồ không biểu diễn benchmark hay log thực nghiệm.

1. Đặt vấn đề và bối cảnh thực tế — なぜ必要なのか

Một ticket hỏi: “Giao dịch timeout có được gửi lại không?”. Một lần gọi LLM kèm tài liệu có thể giải thích chính sách chung, nhưng chưa biết giao dịch cụ thể đã được ghi nhận hay chưa. Gắn thêm tool tra trạng thái tạo ra vấn đề mới: nếu kết quả là pending, bước tiếp theo phải khác not_found; nếu tra cứu lỗi, không được suy từ “không nhận được dữ liệu” thành “chưa thanh toán”.

Baseline hợp lý là workflow cố định: tra trạng thái → đọc runbook → tạo bản nháp. Giới hạn xuất hiện khi cần chọn thêm truy vấn theo dữ kiện mới, chẳng hạn đối chiếu mã giao dịch trong ticket với mã merchant. Tuy nhiên, nếu mọi nhánh đã được đặc tả hữu hạn và ổn định, code thông thường vẫn dễ kiểm thử hơn. Anthropic phân biệt workflow và agent: workflow điều phối theo đường đã định, còn agent để mô hình quyết định tiến trình và cách dùng tool. Đây là điểm phân biệt về quyền quyết định luồng, không phải số lượng prompt.

Trong dự án giả định, đánh giá bằng tỷ lệ đề xuất đúng trên bộ ca đã gán nhãn, tỷ lệ kết luận khi thiếu bằng chứng, số hành động vượt quyền, latency p95, số lượt gọi và chi phí trên một ticket được giải quyết đúng. “Trả lời được nhiều ticket” chưa đủ nếu câu trả lời làm người vận hành hiểu sai trạng thái thanh toán.

Góc nhìn BrSE: cần chốt “tự hành” là tự tìm dữ liệu, tự đề xuất hay tự thực hiện nghiệp vụ. Ai chịu trách nhiệm khi dữ liệu mâu thuẫn? Có được đọc tenant khác để đối chiếu không? Ticket nào phải chuyển người phụ trách? Ngưỡng thời gian và chi phí áp dụng cho một agent hay toàn bộ cây công việc? Những câu hỏi này trở thành điều kiện cụ thể ở runtime.

2. Bản chất kỹ thuật và cơ chế hoạt động — 仕組みを理解する

2.1. ReAct: quyết định bước tiếp theo từ quan sát mới

Yao và cộng sự, ReAct, mục 2 đề xuất xen kẽ suy luận bằng ngôn ngữ và hành động. Suy luận giúp hình thành hoặc điều chỉnh kế hoạch; hành động đưa phản hồi từ môi trường vào lần quyết định tiếp theo. ReAct là một cách tổ chức tương tác, không phải một tên model hay giao thức API bắt buộc.

Để diễn giải vòng lặp, gọi h_t là lịch sử được phép sử dụng ở lượt t, a_t là hành động được chọn, o_t là kết quả do môi trường trả về:

a_t ~ policy(. | goal, h_t, allowed_tools)
o_t = execute(a_t)               # chỉ sau khi runtime kiểm tra quyền
h_(t+1) = update(h_t, a_t, o_t)   # giữ nguồn, trạng thái lỗi, phiên bản

Đây là ký hiệu diễn giải dùng trong bài, không phải công thức huấn luyện mới. policy có thể là LLM; runtime vẫn phải quyết định hành động có hợp lệ hay không. Một action JSON đúng schema chỉ chứng minh hình dạng dữ liệu đúng, chưa chứng minh tenant đúng hoặc thao tác được cấp quyền.

Ví dụ tự soạn: agent chọn lookup_payment("p-17"); tool trả pending kèm thời điểm; agent chuyển sang đọc quy tắc xử lý pending, thay vì tự gửi lại thanh toán. Nếu tool báo timeout, quan sát phải giữ trạng thái lỗi. Lịch sử “đã định gọi API” khác lịch sử “đã nhận phản hồi API”.

Trong paper, thành phần suy luận được biểu diễn bằng các đoạn ngôn ngữ trong trajectory. Ứng dụng thực tế có thể lưu quyết định tóm tắt và tool trace; không cần coi một chuỗi giải thích dài là bằng chứng nghiệp vụ. Trong thiết kế bài này, bằng chứng kiểm toán là request/response đã lọc dữ liệu, mã nguồn tài liệu và quyết định của policy gate. Mô hình có thể giải thích hợp lý nhưng dùng một kết quả cũ hoặc sai đối tượng.

2.2. Từ lập kế hoạch tới trạng thái có thể kiểm chứng

Với bài toán thanh toán, một plan đề xuất có ba subgoal: xác định giao dịch, đọc quy tắc tương ứng, tổng hợp đề xuất. Runtime nên lưu mỗi mục với task_id, input đã xác minh, dependency, trạng thái, evidence IDs và ngân sách. planned → running → observed → validated → done là chuỗi do bài đề xuất, không phải các trạng thái tiêu chuẩn của ReAct.

Một mục có thể chuyển running → failed khi API lỗi, hoặc observed → blocked khi dữ kiện không đủ. Chỉ có câu trả lời của worker chưa đủ để chuyển done. Nếu mã ticket không xác định duy nhất giao dịch, cần yêu cầu bổ sung mã thay vì đoán. Replanning phải giữ dấu vết mục nào bị hủy và vì sao; không âm thầm thay mục tiêu từ “đề xuất có căn cứ” sang “luôn tạo được câu trả lời”.

Có hai mức lập kế hoạch đáng tách: kế hoạch cấp cao phân rã công việc, và quyết định ở từng lượt chọn tool/tham số. Demo bên dưới cố định kế hoạch cấp cao để kiểm thử runtime; khi nối LLM, có thể để mô hình đề xuất kế hoạch rồi kiểm tra DAG, số task, quyền và dependency trước khi chạy. Không cho planner tự tạo tool mới chỉ bằng cách ghi tên tool vào plan.

2.3. Multi-Agent là cách chia trách nhiệm và giao tiếp

Wu và cộng sự, AutoGen mô tả ứng dụng nhiều agent có thể trao đổi, kết hợp LLM, tool và đầu vào con người; hành vi tương tác được lập trình theo ứng dụng. Bài không dùng SDK AutoGen và không suy từ kết quả nghiên cứu ấy rằng thêm agent luôn tăng độ chính xác.

Thiết kế đề xuất gồm supervisor, payment specialist và runbook specialist. Chúng có thể dùng cùng model; sự chuyên biệt đến từ nhiệm vụ, context, tool và tiêu chí đầu ra. Một agent cũng có thể chạy nhiều vòng ReAct. Hai khái niệm này độc lập: ReAct mô tả vòng tương tác, Multi-Agent mô tả phân công giữa các thành phần.

                     [TRUSTED APPLICATION RUNTIME]
identity + ticket -> scope/ACL -> supervisor + shared budget
                                  |              |
                    task(payment) |              | task(runbook)
                                  v              v
                            specialist A    specialist B
                            decide          decide
                              |               |
                            action          action
                              v               v
                         [tool gate]      [tool gate]
                              |               |
                         scoped reader    scoped reader
                              |               |
                         observation      observation
                              +---> next decision <---+
                                  |              |
                                  +------v-------+
                                  evidence join
                                        |
                                 validation gate
                                        |
                                draft / blocked
                                        |
                                operator decision
   [EXTERNAL DATA: tool output is evidence, not executable instructions]

Supervisor chỉ phát task với scope đã lấy từ danh tính xác thực, không lấy tenant từ câu văn trong ticket. Specialist trả artifact có kiểu dữ liệu: vai trò, định danh nguồn, nội dung, trạng thái, phiên bản và thời điểm. Mỗi nhánh giữ context riêng; điểm đồng bộ là lúc join artifact. Trong hệ thống phân tán, artifact nên gắn request_id, task_id, attempt để kết quả đến muộn không ghi vào một lần chạy mới.

Ở ví dụ này, hai phép đọc độc lập có thể chạy đồng thời. Nếu runbook cần chính trạng thái giao dịch để chọn mục, phải chạy sau payment hoặc đọc trước một snapshot đủ rộng rồi chọn lại bằng dữ kiện. Chia song song khi có dependency chưa thỏa mãn chỉ làm kết quả hoàn tất nhanh nhưng không đúng câu hỏi.

2.4. Chọn topology và ngân sách

Thiết kế supervisor–workers giúp quy về một điểm quyết định cuối. Handoff chuyển quyền điều khiển cho agent chuyên trách khi miền nghiệp vụ thay đổi; cần chỉ rõ agent nào đang sở hữu phiên. Peer-to-peer cho phép trao đổi ngang nhưng phải giới hạn vòng và định nghĩa cách chốt khi bất đồng. Với ticket thanh toán có hai nguồn cố định, supervisor dễ quan sát hơn mạng trao đổi tự do.

Phân rã động chỉ đáng dùng nếu task thay đổi theo đầu vào. Mẫu orchestrator–workers của Anthropic cho orchestrator phân rã và tổng hợp động; song song hóa với các nhánh định sẵn là một mẫu khác. Vì vậy, demo cố định hai vai trò là mô phỏng điều phối, chưa phải hệ tự lập kế hoạch động.

Ngân sách toàn cục cần bao gồm mọi agent và retry. Một ước lượng lập kế hoạch do bài đề xuất là C_total = tổng chi phí model + tổng chi phí tool + chi phí kiểm chứng; không có giá cụ thể được giả định. Giới hạn riêng cho từng worker vẫn có thể làm tổng vượt dự toán khi số worker tăng. Với hai nhánh độc lập, đường găng xấp xỉ T_plan + max(T_A, T_B) + T_join; đây là mô hình tính, không phải cam kết tốc độ. Queue, rate limit và retry có thể làm thời gian thực lớn hơn.

Quyết định của dự án giả định là chỉ đọc, hai nhánh và một điểm tổng hợp. Các thông số trong demo là để kiểm thử luồng, không phải cấu hình capacity khuyến nghị cho production.

Dịch: Trong ReAct, agent chọn hành động tiếp theo dựa trên kết quả quan sát. Lần này, chúng tôi giao việc kiểm tra thanh toán và tìm runbook cho hai agent riêng. Sau khi kiểm tra bằng chứng của cả hai, chúng tôi tổng hợp phương án xử lý. Nếu thiếu bằng chứng, chúng tôi dừng xử lý và xác nhận với người phụ trách.

Đọc câu khó: ở câu ba, chủ thể bị lược là nhóm phát triển/runtime đang được trình bày; ~た上で đặt kiểm tra bằng chứng làm bước phải hoàn thành trước tổng hợp. 両方 chỉ hai nhánh vừa nêu, không phải hai lượt gọi model. Câu cuối là điều kiện dừng, không hứa rằng hệ thống luôn trả được phương án.

3. Hiện thực hóa kỹ thuật — 実装する

3.1. Môi trường và cách chạy

Ví dụ dùng Python 3.11 trở lên, chỉ standard library, không cần API key, GPU hay dịch vụ mạng. Cấu trúc thư mục thực hành chỉ có agent_demo.py. Chép trọn code ở mục 3.3 vào file đó và chạy:

python3 --version
python3 agent_demo.py

Policy giả lập trả action hoặc finish theo lịch sử; tool trả fixture tự đặt. Điều này giúp tách tính đúng của vòng điều khiển khỏi tính bất định của model. Kết quả chạy thành công chỉ xác nhận các nhánh mô phỏng, chưa đo năng lực suy luận, lập kế hoạch hay chất lượng phối hợp của LLM thật.

3.2. Cách triển khai ban đầu

Với input đã chuẩn hóa, một hàm tuần tự đọc hai nguồn là baseline dễ hiểu:

def make_draft(payment: str, runbook: str) -> str:
    if not payment or not runbook:
        raise ValueError("missing evidence")
    return f"Payment: {payment}\nRunbook: {runbook}"

Hàm này phù hợp nếu tầng gọi đã xử lý quyền, timeout và xác định đúng bản ghi. Nó chưa biểu diễn cách lấy dữ liệu, đổi hướng khi quan sát mới xuất hiện hoặc kiểm soát số tool call. Nếu chuyển thành vòng while True để model tự gọi tool, thiếu điều kiện dừng sẽ làm lỗi retry hoặc lặp action tiêu thụ tài nguyên. Phần cải tiến bổ sung runtime có giới hạn; baseline vẫn nên được giữ làm đối chứng khi đo chất lượng.

3.3. Cách triển khai cải tiến

Trong fixture, ticket đã được tầng tin cậy chuẩn hóa thành hai khóa p-17 và pending-v1. Chúng là dữ liệu minh họa, không phải secret. Mọi tool đều chỉ đọc. Finish chỉ được trỏ tới bằng chứng worker thật sự nhận được; supervisor lấy nội dung từ artifact đã xác nhận, không lấy câu kết luận tự do của worker.

from __future__ import annotations

import asyncio
from dataclasses import dataclass


class RunError(Exception):
    pass


@dataclass(frozen=True)
class Action:
    tool: str
    key: str


@dataclass(frozen=True)
class Finish:
    evidence_key: str


@dataclass(frozen=True)
class Evidence:
    role: str
    key: str
    text: str


@dataclass
class Budget:
    limit: int
    used: int = 0

    def reserve(self) -> None:
        # Không có await: dùng trong một event loop, không thread-safe.
        if self.used >= self.limit:
            raise RunError("call_budget")
        self.used += 1


KEYS = {"payment": "p-17", "runbook": "pending-v1"}
DATA = {
    "payment": "pending; transaction=p-17",
    "runbook": "pending: inspect status; do not submit a new payment",
}


def policy(role: str, history: list[Evidence], mode: str) -> Action | Finish:
    # Test double: thay bằng adapter LLM khi kiểm thử tích hợp.
    if mode == "forbidden":
        return Action("refund", KEYS[role])
    if mode == "unsupported":
        return Finish("invented-evidence")
    if not history or mode == "loop":
        return Action("lookup", KEYS[role])
    return Finish(history[-1].key)


async def read_tool(role: str, key: str, mode: str, attempt: int) -> str:
    if mode == "slow":
        await asyncio.sleep(0.2)
    else:
        await asyncio.sleep(0)  # Nhường event loop; không đo latency mạng.
    if mode == "transient" and attempt == 0:
        raise ConnectionError("simulated connection failure")
    if mode == "missing" and role == "runbook":
        return ""
    return DATA[role] if key == KEYS[role] else ""


async def specialist(
    role: str, mode: str, budget: Budget, max_steps: int,
) -> Evidence:
    history: list[Evidence] = []
    seen: set[tuple[str, str]] = set()
    for _ in range(max_steps):
        decision = policy(role, history, mode)
        if isinstance(decision, Finish):
            for item in history:
                if item.role == role and item.key == decision.evidence_key:
                    return item
            raise RunError("unsupported_finish")
        if decision.tool != "lookup" or decision.key != KEYS[role]:
            raise RunError("forbidden_action")
        signature = (decision.tool, decision.key)
        if signature in seen:
            raise RunError("repeated_action")
        seen.add(signature)
        for attempt in range(2):  # Tối đa hai lần thử cho phép đọc.
            budget.reserve()    # Mỗi retry cũng tiêu ngân sách toàn cục.
            try:
                async with asyncio.timeout(0.02):
                    text = await read_tool(role, decision.key, mode, attempt)
                break
            except (TimeoutError, ConnectionError) as exc:
                if attempt == 1:
                    raise RunError("tool_unavailable") from exc
                await asyncio.sleep(0.001)  # Backoff cố định cho demo.
        if not text:
            raise RunError("missing_evidence")
        history.append(Evidence(role, decision.key, text))
    raise RunError("step_budget")


async def run(
    mode: str = "ok", *, max_steps: int = 3,
    call_limit: int = 6, deadline: float = 0.5,
) -> tuple[str, int]:
    budget = Budget(call_limit)
    try:
        async with asyncio.timeout(deadline):
            results = await asyncio.gather(
                *(specialist(r, mode, budget, max_steps) for r in KEYS),
                return_exceptions=True,
            )
    except TimeoutError:
        return "blocked:deadline", budget.used
    for result in results:
        if isinstance(result, BaseException) and not isinstance(result, RunError):
            raise result  # Không nuốt cancellation hoặc lỗi lập trình.
    for result in results:
        if isinstance(result, RunError):
            return f"blocked:{result}", budget.used
    evidence = {item.role: item for item in results if isinstance(item, Evidence)}
    if set(evidence) != set(KEYS):
        return "blocked:incomplete_join", budget.used
    # Nội dung đầu ra lấy từ bằng chứng; không sinh lời khuyên mới.
    draft = " | ".join(evidence[role].text for role in KEYS)
    return "draft:" + draft, budget.used


async def main() -> None:
    status, calls = await run()
    assert status.startswith("draft:pending;") and calls == 2
    print("ok:", status, "calls=", calls)
    status, calls = await run("transient")
    assert status.startswith("draft:") and calls == 4
    print("transient: recovered; calls=", calls)
    cases = [
        ("missing", {}, "missing_evidence"),
        ("forbidden", {}, "forbidden_action"),
        ("unsupported", {}, "unsupported_finish"),
        ("loop", {}, "repeated_action"),
        ("slow", {}, "tool_unavailable"),
        ("ok", {"max_steps": 1}, "step_budget"),
        ("ok", {"call_limit": 1}, "call_budget"),
        ("slow", {"deadline": 0.001}, "deadline"),
    ]
    for mode, options, expected in cases:
        status, calls = await run(mode, **options)
        assert status == "blocked:" + expected, (mode, status)
        print(expected + ": blocked; calls=", calls)
    print("all checks passed")


if __name__ == "__main__":
    asyncio.run(main())

policy() mô phỏng quyết định dựa vào observation: chưa có bằng chứng thì đọc, đã có thì finish. specialist() sở hữu history và chống action lặp trong phạm vi một task; Budget thuộc request và được chia cho cả hai nhánh. Vì phần kiểm tra–tăng biến không có await và chạy trong một event loop, các coroutine không xen vào giữa hai thao tác đó. Khi chuyển sang nhiều process/host cần cơ chế giữ chỗ nguyên tử ở bộ đếm chung, không tái dùng nhận định này cho hệ phân tán.

Hai kiểu giới hạn có ý nghĩa khác nhau: max_steps tính cả lượt quyết định finish, còn call_limit tính mỗi lần thử tool. Deadline bao ngoài toàn request; timeout bên trong áp cho từng lần thử đọc. Demo retry một lỗi kết nối hoặc timeout, không retry mất quyền, thiếu bằng chứng hay finish vô căn cứ. Backoff ngắn cố định phục vụ bài thử; môi trường thật cần phân loại lỗi, backoff có jitter và tôn trọng ngân sách còn lại.

Theo tài liệu asyncio Python 3.11, gather(..., return_exceptions=True) thu cả kết quả lẫn exception để bên gọi kiểm tra. Demo cố ý chờ đủ hai nhánh chỉ đọc rồi từ chối tổng hợp nếu một nhánh lỗi. Timeout bao ngoài hủy công việc đang chờ; không bắt và nuốt CancelledError. Cơ chế này đòi coroutine nhường event loop; một lời gọi đồng bộ chặn CPU không được ngắt đúng hạn chỉ bằng asyncio.timeout.

Giới hạn quan trọng: đây là runtime mô phỏng, không phải hai LLM đã phối hợp. Allowlist hiện là role/key cố định, chưa có authentication, ACL theo tenant, mạng hoặc snapshot database. Finish chỉ kiểm tra provenance của artifact, không chứng minh một câu tự do do model sinh là suy luận đúng. Đầu ra chỉ nối hai fixture nên tránh được bài toán semantic verification ở demo; sản phẩm thật phải kiểm tra từng claim, độ mới và tính tương thích của bằng chứng.

Khi nối model, adapter phải parse output thành Action | Finish, từ chối trường không hợp lệ, giới hạn kích thước và không cho raw output chạy thành code. Đặt timeout/ngân sách riêng cho model call, đếm token/cost thực nhận từ nhà cung cấp, thêm trace ID và lọc dữ liệu nhạy cảm. Những phần đó chưa được code ở đây và chưa được kiểm thử bằng SDK cụ thể.

3.4. Cách kiểm chứng

Chạy nguyên file; tiêu chí đạt là không có assertion lỗi và in all checks passed. Các nhánh cần quan sát:

Ca Điều kiện tự đặt Kết quả bắt buộc
Thành công Hai nguồn có đủ dữ liệu Bản nháp từ hai nguồn, hai tool call
Lỗi tạm thời Lần đọc đầu mỗi worker lỗi kết nối Phục hồi, tổng bốn tool call
Thiếu tài liệu Runbook rỗng blocked:missing_evidence
Vượt quyền Policy yêu cầu refund blocked:forbidden_action, không gọi tool
Finish bịa Evidence ID chưa từng nhận blocked:unsupported_finish
Vòng lặp Policy đọc lại cùng khóa blocked:repeated_action
Tool chậm Mỗi lần ngủ 0,2 giây, timeout 0,02 giây blocked:tool_unavailable sau giới hạn thử
Thiếu lượt quyết định Chỉ cho một bước mỗi worker blocked:step_budget dù đã đọc được dữ liệu
Hết ngân sách chung Chỉ cho một tool call blocked:call_budget, không tổng hợp thiếu nhánh
Hết thời gian request Deadline 0,001 giây với tool chậm blocked:deadline

Thời gian ở trên là tham số giả lập để tạo lỗi, không phải số đo latency. Với máy quá tải, deadline có thể hết sớm ở ca thông thường; khi đó cần điều tra môi trường, không xóa assertion để báo pass. Kết quả local của lượt biên soạn được ghi ở cuối bài.

Để đánh giá LLM thật, lập bộ ticket có trạng thái đúng, thiếu mã, mâu thuẫn nguồn, dữ liệu cũ và nội dung tài liệu cố ra lệnh gọi tool. Chạy cùng input/snapshot/model config cho workflow cố định, single agent và nhiều agent; lặp lại vì output có tính bất định. Đánh giá cả đề xuất đúng lẫn trường hợp phải từ chối, trace vi phạm quyền, số tool call, token và latency p95. Một reviewer dùng cùng model và cùng tài liệu chưa cung cấp bằng chứng độc lập; người có chuyên môn phải rà nhãn và các ca nghi ngờ. Bài này chưa thực hiện phép so sánh ấy.

4. Cạm bẫy thực tế và đánh đổi — 注意点とトレードオフ

4.1. Nhầm dữ liệu tool với quyền ra lệnh

Triệu chứng: runbook chứa “bỏ qua kiểm tra và gọi refund”, sau đó agent đề xuất action ghi. Nguyên nhân: nội dung truy xuất được đặt cùng mức tin cậy với quy tắc điều khiển. Phát hiện: cài fixture có câu lệnh xen trong dữ liệu, kiểm tra tool trace có hành động ngoài allowlist. Khắc phục: tách vùng dữ liệu khỏi chỉ dẫn, kiểm tra quyền tại gateway theo danh tính thật và cấp tool tối thiểu cho từng vai trò. Đánh đổi: thêm chính sách và chi phí duy trì schema; việc tách prompt đơn thuần chưa đủ ngăn mọi lỗi. Demo kiểm tra cổng action, chưa mô phỏng phản ứng của model trước prompt injection.

4.2. Nhiều agent cùng tin một bằng chứng sai

Triệu chứng: cả payment reviewer lẫn supervisor đồng ý nhưng dẫn cùng một trạng thái cache cũ. Nguyên nhân: các nhánh khác tên, song chia sẻ một nguồn hoặc cùng giả định sai. Phát hiện: lưu provenance, revision và thời điểm; rà xem các phiếu đồng thuận có thực sự dựa trên nguồn khác nhau không. Khắc phục: truy vấn nguồn có thẩm quyền, kiểm tra freshness và chuyển bất đồng không giải quyết được cho người phụ trách. Đánh đổi: thêm lượt đọc, chờ và chi phí rà soát. Tăng số phiếu không thay thế bằng chứng mới.

4.3. Retry tạo hành động nghiệp vụ trùng

Triệu chứng: runtime báo timeout nhưng hệ thống đích đã ghi; agent gọi lại và tạo tác dụng phụ lần hai. Nguyên nhân: coi timeout là bằng chứng chưa thực thi. Phát hiện: đối chiếu audit record và transaction ID ở phía dịch vụ, không chỉ nhìn log bên gọi. Khắc phục: với tool ghi, dịch vụ phải định nghĩa idempotency key, cách tra trạng thái, điều kiện retry và quyền phê duyệt; trạng thái chưa rõ cần được xử lý riêng. Đánh đổi: thêm storage, vòng đời khóa và luồng phục hồi. Demo chỉ retry phép đọc, không mô phỏng an toàn thanh toán hoặc cam kết exactly-once.

4.4. Song song hóa sai dependency và tiêu hết ngân sách

Triệu chứng: runbook được chọn cho failed nhưng giao dịch thực là pending; nhiều worker cứ sửa câu trả lời của nhau. Nguyên nhân: phân rã theo vai trò mà không ghi input dependency và điều kiện dừng. Phát hiện: trace task graph, action lặp, thời gian chờ và token theo request. Khắc phục: chốt DAG, join trên cùng snapshot, giới hạn tổng task/call/token/deadline và không tự mở agent con ngoài quota. Đánh đổi: giảm khả năng khám phá tự do, tăng logic scheduler. Chỉ dùng song song cho dữ kiện thực sự độc lập.

Phương án Hiệu năng Chi phí Độ phức tạp Độ tin cậy và vận hành Khi nên chọn
Workflow cố định Đường chạy và số bước dễ dự toán Dễ đặt trần khi số bước cố định Thấp hơn, cần đặc tả nhánh lỗi Dễ replay; nhánh mới cần cập nhật code Quy trình ổn định, nguồn và điều kiện rõ
Một agent dùng ReAct Số lượt thay đổi theo quan sát Phụ thuộc số vòng và context Cần policy gate, budget và trace Linh hoạt nhưng có thể lặp hoặc chọn sai tool Cần truy vấn bổ sung chưa biết trước
Supervisor và specialists Có thể giảm đường găng ở nhánh độc lập Thêm prompt, join, kiểm chứng Hợp đồng task, dependency, shared quota Tách context/quyền tốt hơn nếu thiết kế đúng; lỗi join mới Nhiều miền cần context/tool khác nhau
Mạng trao đổi ngang Có nhiều cơ hội trao đổi; thời gian khó dự toán Dễ tăng theo số cạnh và vòng Quyền sở hữu và kết thúc khó hơn Khó replay và phân giải bất đồng Thử nghiệm có tiêu chí đo và budget chặt

Đây là so sánh định tính của thiết kế, không phải benchmark. Với dự án giả định, bắt đầu bằng workflow chỉ đọc; chỉ thêm quyết định ReAct khi phép đo chứng minh có ích. Nếu tách specialist giúp cô lập quyền hoặc context rõ rệt, thử supervisor hai nhánh trước khi mở một mạng giao tiếp phức tạp.

5. Checklist trước khi triển khai — 本番環境への適用前チェック

  • Bộ ca có nhãn phân biệt trạng thái thật, thiếu dữ liệu và lỗi tool; kiểm tra cả đề xuất đúng lẫn quyết định dừng.
  • Gateway lấy tenant/quyền từ danh tính xác thực, từ chối action và tham số ngoài scope dù model yêu cầu.
  • Mỗi request có trần task, lượt model/tool, token/cost, concurrency và deadline dùng chung cho mọi nhánh/retry.
  • Trace liên kết task, attempt và evidence revision; log đã lọc secret, có chính sách lưu và quyền đọc.
  • Tool ghi có hợp đồng idempotency, trạng thái chưa rõ sau timeout và bước phê duyệt theo yêu cầu đã chốt.
  • Có cách tắt agent để quay về workflow hoặc chuyển người vận hành; kiểm tra công việc đang chạy khi rollback.
  • Khách hàng đã chốt ngưỡng chất lượng, latency p95, chi phí mỗi ticket và vai trò chịu trách nhiệm phê duyệt.

6. Học tiếng Nhật qua chủ đề — 技術日本語を学ぶ

6.1. Sổ tay thuật ngữ kỹ thuật và giao tiếp BrSE

Âm Hán Việt để nhớ chữ, không dùng thay nghĩa trong dự án. Các câu dưới đây tự soạn và dùng chính phương án chỉ đọc, kiểm tra bằng chứng trước tổng hợp.

Thuật ngữ Nhật Furigana Hán Việt Nghĩa tiếng Việt / English Câu ví dụ Nhật Dịch nghĩa
推論 すいろん Suy luận Suy luận / reasoning 推論すいろんの結果けっかだけでは、決済けっさいの状態じょうたいを確定かくていできません。 Chỉ từ kết quả suy luận thì không thể xác định trạng thái thanh toán.
計画 けいかく Kế hoạch Kế hoạch / plan 観測かんそくに応おうじて計画けいかくを見直みなおします。 Điều chỉnh kế hoạch theo quan sát.
行動 こうどう Hành động Hành động / action 許可きょかされた行動こうどうだけを実行じっこうします。 Chỉ thực hiện hành động được phép.
観測 かんそく Quan trắc Quan sát từ môi trường / observation 観測かんそくの失敗しっぱいも記録きろくします。 Cũng ghi lại việc quan sát thất bại.
根拠 こんきょ Căn cứ Bằng chứng, căn cứ / evidence 根拠こんきょがなければ、結論けつろんを出だしません。 Nếu không có căn cứ thì không đưa ra kết luận.
権限 けんげん Quyền hạn Quyền truy cập / permission 読よみ取とり専用せんようの権限けんげんを付与ふよします。 Cấp quyền chỉ đọc.
検証 けんしょう Kiểm chứng Kiểm chứng / verification 異常系いじょうけいの動作どうさを検証けんしょうします。 Kiểm chứng hành vi ở các ca lỗi.
停止条件 ていしじょうけん Đình chỉ điều kiện Điều kiện dừng / stopping condition 停止条件ていしじょうけんを先さきに決きめます。 Xác định điều kiện dừng trước.
再試行 さいしこう Tái thí hành Thử lại / retry 再試行さいしこうも回数かいすうに含ふくめます。 Tính cả retry vào số lượt.
担当者 たんとうしゃ Đảm đương giả Người phụ trách / owner 担当者たんとうしゃに判断はんだんを依頼いらいします。 Nhờ người phụ trách quyết định.
合意 ごうい Hợp ý Thống nhất / agreement 受入条件うけいれじょうけんについて合意ごういしました。 Đã thống nhất về điều kiện nghiệm thu.
エージェント エージェント - Tác nhân phần mềm / agent エージェントごとに役割やくわりを分わけます。 Chia vai trò cho từng agent.

Cặp dễ nhầm: 確認 là xác nhận một thông tin/cách hiểu, như “đã thống nhất quyền chỉ đọc chưa”; 検証 là kiểm chứng bằng thao tác và bằng chứng, như “tool gateway có chặn refund không”. 計画 là kế hoạch sẽ làm, còn 実行結果 là kết quả thực thi; báo đã có kế hoạch không có nghĩa đã hoàn tất.

6.2. Ngữ pháp và mẫu diễn đạt

Các mẫu phù hợp luyện giao tiếp khoảng N3–N2; bài không gán nhãn cấp JLPT chính thức.

Mẫu Ý nghĩa Ví dụ
~に基づいて Dựa trên căn cứ 観測結果かんそくけっかに基もとづいて判断はんだんします。— Quyết định dựa trên kết quả quan sát.
~た上で Sau khi hoàn tất bước tiền đề 根拠こんきょを確認かくにんした上うえでまとめます。— Tổng hợp sau khi kiểm tra căn cứ.
~とは限らない Không nhất thiết エージェントを増ふやせば正確せいかくになるとは限かぎりません。— Thêm agent chưa chắc làm kết quả chính xác hơn.
~という理解でよろしいでしょうか Xác nhận cách hiểu lịch sự 自動実行じどうじっこうはしないという理解りかいでよろしいでしょうか。— Tôi hiểu là không tự động thực hiện, như vậy có đúng không?

1. ~に基づいて

Cấu trúc: danh từ + に基づいて + hành động; khi bổ nghĩa danh từ dùng ~に基づく + danh từ. Dùng trong tài liệu và review để chỉ cơ sở quyết định, mạnh hơn việc chỉ nói hai việc có liên quan. Không dùng mẫu này để biến một suy đoán thành dữ kiện đã xác nhận.

  • 決済けっさいサービスの応答おうとうに基もとづいて、状態じょうたいを表示ひょうじします。— Hiển thị trạng thái dựa trên phản hồi của dịch vụ thanh toán.
  • 検証結果けんしょうけっかに基もとづいて、構成こうせいを選えらびます。— Chọn kiến trúc dựa trên kết quả kiểm chứng.

Lỗi dễ gặp là viết “dựa trên kết quả” mà không nêu kết quả của phép thử nào. Khi báo cáo, thêm tên bộ ca và phạm vi môi trường bằng câu kế tiếp.

2. ~た上で

Cấu trúc: động từ thể た + 上で; với danh từ chỉ hành vi có thể dùng 確認の上で. Diễn đạt bước trước là tiền đề có chủ ý, phù hợp chốt thứ tự kiểm tra–thực hiện. Không nhầm với ~上に, nghĩa là “hơn nữa”.

  • 権限けんげんを確認かくにんした上うえで、ツールを呼よび出だします。— Gọi tool sau khi kiểm tra quyền.
  • 両方りょうほうの結果けっかを確認かくにんした上うえで、対応案たいおうあんを提示ていじします。— Đưa phương án xử lý sau khi kiểm tra kết quả của cả hai nhánh.

Mẫu không tự nói ai chịu trách nhiệm kiểm tra. Nếu cần giao việc, nêu rõ supervisor/runtime hoặc người phụ trách thay vì để cả hai bên tự suy chủ thể.

3. ~とは限らない

Cấu trúc: mệnh đề thể thông thường + とは限らない. Dùng để bác bỏ khẳng định tuyệt đối mà không nói kết quả ngược lại luôn đúng. Hợp khi trao đổi hiệu năng hoặc chất lượng chưa có phép đo.

  • 並列化へいれつかすれば、必かならず速はやくなるとは限かぎりません。— Song song hóa chưa chắc luôn nhanh hơn.
  • 回答かいとうが一致いっちしても、根拠こんきょが正ただしいとは限かぎりません。— Dù câu trả lời thống nhất, căn cứ chưa chắc đúng.

Tránh dịch thành “không thể đúng/không thể nhanh”: mẫu chỉ phủ nhận tính tất yếu. Sau câu này nên nêu điều kiện cần đo để không biến sự thận trọng thành một kết luận mơ hồ.

4. ~という理解でよろしいでしょうか

Cấu trúc: mệnh đề + という理解でよろしいでしょうか. Dùng với khách hàng để xin xác nhận cách hiểu; trong nội bộ có thể dùng ~という理解で合っていますか. Đây là câu hỏi xác nhận, chưa phải thông báo yêu cầu đã được phê duyệt.

  • 今回こんかいは読よみ取とりのみという理解りかいでよろしいでしょうか。— Tôi hiểu lần này chỉ đọc dữ liệu, như vậy có đúng không?
  • 根拠こんきょが不足ふそくしたら担当者たんとうしゃに確認かくにんするという理解りかいでよろしいでしょうか。— Tôi hiểu là khi thiếu căn cứ sẽ xác nhận với người phụ trách, như vậy có đúng không?

Tránh gom nhiều quyết định chưa chốt vào một câu hỏi “đúng không”; bên nghe có thể đồng ý quyền chỉ đọc nhưng chưa đồng ý deadline. Tách từng điểm ảnh hưởng đến nghiệm thu.

6.3. Luyện tập ngắn

  1. Điền một mẫu để thể hiện bước tiền đề: 根拠こんきょを確認かくにんした( )、対応案たいおうあんをまとめます。
  2. Dịch Việt → Nhật với khách hàng: “Tôi hiểu là khi thiếu căn cứ thì dừng xử lý, như vậy có đúng không?”
  3. Sửa câu quá khẳng định và thêm bước kiểm chứng: エージェントを増ふやせば、必かならず正確せいかくになります。— “Cứ thêm agent là chắc chắn chính xác hơn.”

Đáp án và giải thích:

  1. 上で: 根拠こんきょを確認かくにんした上うえで、対応案たいおうあんをまとめます。— Tổng hợp phương án sau khi đã kiểm tra căn cứ. た上で khớp thứ tự validation → draft ở mục 2.
  2. 根拠こんきょが不足ふそくした場合ばあいは、処理しょりを停止ていしするという理解りかいでよろしいでしょうか。— Tôi hiểu là khi thiếu căn cứ thì dừng xử lý, như vậy có đúng không? Câu này xác nhận điều kiện dừng, không khẳng định đã được đồng ý.
  3. エージェントを増ふやしても、正確せいかくになるとは限かぎりません。同おなじテストケースで比較ひかくします。— Dù thêm agent cũng chưa chắc chính xác hơn. Chúng tôi sẽ so sánh trên cùng bộ ca. Mẫu phủ định tính tất yếu và đưa phép đo cụ thể thay cho lời hứa.

7. Thực hành vai trò BrSE — 現場で伝える

7.1. Tình huống giao tiếp

Vai trò: khách hàng phụ trách vận hành thanh toán, BrSE nối yêu cầu với Tech Lead. Mục tiêu là review quyền tự hành của bản thử. Dữ kiện trong tình huống giả định: đã chạy fixture của runtime; cổng action từ chối tool ghi. Chưa rõ: chất lượng model thật, latency p95 và ngưỡng chi phí được chấp nhận. Đây là hội thoại luyện tập, không phải bản ghi một cuộc họp thực tế.

  1. Khách hàng: 今回こんかいのAIは、返金へんきんまで自動じどうで行おこなうのでしょうか。
    AI lần này có tự thực hiện đến bước hoàn tiền không?
  2. BrSE: 現段階げんだんかいでは、状態じょうたいの確認かくにんと対応案たいおうあんの作成さくせいまでという理解りかいでよろしいでしょうか。
    Tôi hiểu ở giai đoạn hiện tại, phạm vi chỉ đến kiểm tra trạng thái và lập phương án xử lý, như vậy có đúng không?
  3. Khách hàng: はい。実行じっこうの判断はんだんは運用担当者うんようたんとうしゃが行おこないます。
    Đúng vậy. Người phụ trách vận hành sẽ quyết định thực hiện.
  4. Tech Lead: その範囲はんいで、ツールを読よみ取とり専用せんようにします。決済けっさいと手順書てじゅんしょの確認かくにんは別々べつべつに行おこないます。
    Với phạm vi đó, chúng tôi đặt tool ở quyền chỉ đọc. Việc kiểm tra thanh toán và runbook được thực hiện riêng.
  5. Khách hàng: エージェントを分わければ、必かならず回答かいとうが正確せいかくになるのでしょうか。
    Tách agent thì câu trả lời có chắc chắn chính xác hơn không?
  6. BrSE: 必かならず改善かいぜんするとは限かぎりません。同おなじ資料しりょうが誤あやまっていれば、同おなじ誤あやまりが残のこる可能性かのうせいがあります。
    Chưa chắc luôn cải thiện. Nếu cùng một tài liệu bị sai thì vẫn có khả năng giữ nguyên lỗi đó.
  7. Tech Lead: ローカルでは停止条件ていしじょうけんを検証けんしょうしましたが、実じつモデルの精度せいどはまだ未検証みけんしょうです。単一たんいつエージェントとも比較ひかくします。
    Chúng tôi đã kiểm chứng điều kiện dừng ở local, nhưng chưa kiểm chứng chất lượng của model thật. Chúng tôi sẽ so sánh cả với phương án một agent.
  8. Khách hàng: 根拠こんきょが足たりない場合ばあいは、結論けつろんを出ださずに担当者たんとうしゃへ連絡れんらくしてください。待まち時間じかんの上限じょうげんも決きめたいです。
    Nếu thiếu căn cứ, xin liên hệ người phụ trách mà không kết luận. Tôi cũng muốn xác định giới hạn thời gian chờ.
  9. BrSE: 承知しょうちしました。本日ほんじつ、私わたしが受入条件うけいれじょうけんの案あんをまとめます。次回じかいのレビューで、時間じかんと費用ひようの上限じょうげんを確認かくにんさせてください。
    Đã rõ. Hôm nay tôi sẽ tổng hợp dự thảo điều kiện nghiệm thu. Xin xác nhận giới hạn thời gian và chi phí ở buổi review tiếp theo.
  10. Tech Lead: 私わたしが比較用ひかくようのテストケースを準備じゅんびします。次回じかいレビューの前日ぜんじつまでに、測定条件そくていじょうけんを共有きょうゆうします。
    Tôi sẽ chuẩn bị bộ ca để so sánh. Chậm nhất một ngày trước buổi review tiếp theo, tôi sẽ chia sẻ điều kiện đo.

7.2. Mẫu thông điệp dùng ngay

[レビュー日時] là thời điểm buổi review mà người gửi cần điền theo lịch đã thống nhất; mẫu chưa phải tin nhắn đã gửi. Mốc “ngày trước buổi review” phụ thuộc thời điểm này.

Dịch: Xin chia sẻ các điểm xác nhận hôm nay. Hai bên đã thống nhất bản đầu chỉ đọc và dừng xử lý khi thiếu căn cứ. Giới hạn thời gian chờ và chi phí vẫn cần tiếp tục xác nhận. BrSE sẽ tổng hợp dự thảo điều kiện nghiệm thu trong hôm nay; Tech Lead chia sẻ điều kiện đo chậm nhất một ngày trước [thời điểm review]. Về chất lượng model thật, chúng tôi sẽ báo cáo sau khi kiểm chứng.

Ba cách diễn đạt đáng học: ~ことで合意しました ghi nội dung đã thống nhất; 引き続き確認が必要です tách phần còn mở; 検証後に報告します đặt báo cáo kết quả sau bước kiểm chứng, không biến kế hoạch kiểm chứng thành kết quả đã có.

7.3. Ghi chú dành cho BrSE

  1. Ghi rõ “tự tạo đề xuất” và “tự thực hiện nghiệp vụ” trong đặc tả. Câu khách hàng nói “AI tự xử lý” chưa xác định quyền gọi refund hay cập nhật dữ liệu.
  2. Khi báo agent đồng thuận, kèm provenance và thời điểm của nguồn. Hai câu trả lời giống nhau không có nghĩa đã có hai bằng chứng độc lập.
  3. Báo riêng kiểm thử runtime, đánh giá model và nghiệm thu vận hành. Fixture chặn action sai không chứng minh model biết chọn đúng action trên dữ liệu khách hàng.

Nguồn tham khảo và phạm vi xác minh

Đọc ngày 17/10/2026; các nguồn được dùng cho nguyên lý, không dùng làm số đo production của bài:

Xác minh ví dụ: ngày 17/10/2026, đã chạy nguyên code mục 3.3 bằng Python 3.15.0 trong thư mục tạm, không cài dependency. Cả 10 tình huống ở mục 3.4 đạt assertion và in all checks passed; ca thường dùng hai tool call, ca phục hồi dùng bốn, action vượt quyền bị chặn với không tool call. Đây là kết quả mô phỏng cục bộ. Chưa chạy LLM/API/cloud thật, chưa đo token, chi phí hay latency p95 của hệ nhiều agent.

Quay lại danh sách bài viết
架
Ban biên tập BrSE.vnKỹ sư Cầu nối & Chuyên gia Dự án Nhật - Việt

Đội ngũ biên tập BrSE.vn gồm các Bridge Software Engineer (BrSE) và Solution Architect với hơn 10 năm kinh nghiệm thực chiến trong các dự án hợp tác công nghệ Việt - Nhật. Chia sẻ kiến thức về kỹ thuật làm rõ yêu cầu (要件定義), tài liệu đặc tả hệ thống, lược dịch chuyên sâu từ Qiita và kỹ năng cầu nối song hành công nghệ - nghiệp vụ.