Hướng dẫn tạo LangChain Deep Agents Harness Profile cho NVIDIA Nemotron-3 Ultra để tối ưu hóa hiệu năng hệ thống Agent

Các hệ thống AI mang tính hành động (Agentic systems) thường đối mặt với sự đánh đổi lớn giữa độ chính xác và chi phí. Những mô hình thương mại lớn (proprietary frontier models) hàng đầu hiện nay tuy mang lại độ chính xác cao nhất nhưng chi phí vận hành lại vô cùng đắt đỏ.

Tinh chỉnh (Fine-tuning) là một cách để giải quyết bài toán này. Bằng phương pháp này, các mô hình mã nguồn mở nhỏ hơn hoặc tối ưu hơn ban đầu có độ chính xác thấp hơn sẽ được huấn luyện để thực hiện tốt hơn các tác vụ cụ thể của AI Agent. Tuy nhiên, tinh chỉnh lại yêu cầu chuyên môn cao, cùng hệ thống phần cứng phức tạp để huấn luyện và lưu trữ các mô hình tùy chỉnh đó.

Trong khi việc tinh chỉnh prompt (prompt tuning) cho các trường hợp sử dụng cụ thể đã trở thành một kỹ thuật phổ biến, việc chuẩn hóa quy trình này cho các bộ khung Agent (Agent Harnesses) — và chứng minh rằng nó mang lại kết quả vượt trội rõ rệt — chỉ mới xuất hiện gần đây nhờ hai bước tiến lớn:

  1. Các bộ kiểm thử (Evaluation benchmarks) được xây dựng chuyên biệt cho một bộ khung cụ thể, giúp xác minh xem một thay đổi có thực sự cải thiện hiệu năng hay không.

  2. Các điểm tùy chỉnh riêng cho từng mô hình (Per-model customization entry points), chẳng hạn như cấu hình Agent Harness Profile của LangChain. Đây là giải pháp tiên phong cho phép các đội ngũ kỹ sư điều chỉnh mô hình tương thích hoàn hảo với các quy trình làm việc (workflow) cụ thể của Agent.

Trong bài hướng dẫn này, bạn sẽ học cách tạo một cấu hình LangChain Deep Agents harness profile cho NVIDIA Nemotron-3 Ultra để đạt được mức độ thông minh tiệm cận với các mô hình thương mại hàng đầu thế giới. Mọi tinh chỉnh sẽ được thực hiện trực tiếp trên bộ khung Agent thông qua các endpoint NVIDIA Nemotron-3 Ultra hiện có sẵn từ các nhà cung cấp dịch vụ đám mây của NVIDIA.

Video 1. Tạo và xác thực cấu hình harness profile của LangChain Deep Agents cho Nemotron 3 Ultra bằng phương pháp đánh giá thủ công và tự động.

Điều kiện tiên quyết

Để thực hiện theo bài viết, bạn cần chuẩn bị:

  • Một máy chủ đã cài đặt PythonLangChain Deep Agents.

  • Một API key cho NVIDIA Nemotron-3 Ultra. Để thử nghiệm, bạn có thể truy cập miễn phí qua build.nvidia.com. Đối với môi trường production, bạn nên cân nhắc sử dụng endpoint từ các đối tác đám mây của NVIDIA như Baseten, Crusoe, Fireworks, Nebius, hoặc Together AI.

  • Khuyến khích: Tài khoản LangSmith để thu thập log chạy của Agent (agent traces).

1. Quy trình tối ưu hóa Harness Profile bằng phương pháp thủ công

LangChain Deep Agents là một bộ khung AI Agent mã nguồn mở rất phổ biến. Nhằm tối ưu bộ khung này cho một mô hình cụ thể, LangChain cung cấp hai công cụ quan trọng:

  • Một bộ benchmark đánh giá mã nguồn mở (Open-source evaluation benchmark).

  • Các cấu hình Harness Profile, mang lại khả năng mở rộng mạnh mẽ cho lập trình viên để thay đổi hành vi của bộ khung Agent dựa trên đặc thù mô hình.

Quy trình tối ưu hóa một Deep Agent cho NVIDIA Nemotron-3 Ultra bao gồm các bước:

  1. Thiết lập mức cơ sở (Baseline): Chạy bộ benchmark đánh giá bằng cách sử dụng cấu hình mặc định của Deep Agent kết hợp với NVIDIA Nemotron-3 Ultra (chưa áp dụng harness profile).

  2. Phân tích các lỗi (Analyze failures): Tìm hiểu lý do tại sao mô hình không vượt qua được một số bài test.

  3. Đề xuất thay đổi: Đưa ra các chỉnh sửa đối với harness profile để khắc phục các lỗi vừa tìm thấy.

  4. Tái đánh giá (Re-run benchmark): Chạy lại bộ test để xác minh các thay đổi có giúp cải thiện điểm số mà không gây ra lỗi hồi quy (regressions) ở các phần khác hay không.

Các loại thay đổi bạn có thể áp dụng vào một Agent Harness Profile bao gồm:

  • Prompts: Thay đổi hệ thống prompt gốc (base system prompt), thêm prompt suffix hoặc thay đổi mô tả của các công cụ (tool descriptions). Ví dụ: Thêm hướng dẫn để Nemotron Ultra ưu tiên đặt câu hỏi làm rõ (clarifying questions) hoặc ưu tiên kết quả từ công cụ thay vì tự suy diễn từ bộ nhớ.

  • Exclusions (Loại trừ): Loại bỏ bớt các công cụ hoặc middleware không cần thiết.

  • Additions (Bổ sung): Thêm các middleware hoặc sub-agent bổ sung để mở rộng tính năng cho bộ khung, ví dụ như middleware kiểm tra xem câu trả lời của mô hình có bị cắt cụt hay không, hoặc tên công cụ gọi ra có bị sai chính tả không.

Mục tiêu tối cao của Kỹ nghệ tối ưu hóa Harness (Harness Engineering) là làm cho các cuộc hội thoại/gọi hàm từ Agent đến mô hình có cấu trúc tương đồng nhất với những dữ liệu mà mô hình đã được nhìn thấy trong quá trình huấn luyện.

Chạy đánh giá và phát hiện lỗi

Trong quá trình đánh giá ban đầu, NVIDIA Nemotron-3 Ultra đã thất bại ở một bài kiểm tra liên quan đến công cụ tích hợp sẵn read_file:

Failing test: tests/evals/test_file_operations.py::test_read_file_truncation_recovery_with_pagination[nvidiahub:ultra-tme]
 
Failure:
  success check failed: Expected final text to contain 'opal-fox-91', got: 'x'
  Trajectory:
  step 1:
    - read_file {'file_path': '/big.txt'}
  step 2:
    text: x

Công cụ read_file là một phần cực kỳ quan trọng trong bộ khung LangChain Deep Agent phục vụ cho các tác vụ lập trình, phân tích dữ liệu và các tác vụ hệ thống. Trong bài test này, Agent được yêu cầu tìm dòng chữ cuối cùng không bị trống trong file /big.txt. Lần gọi read_file đầu tiên chỉ trả về trang đầu của file (page 1) chứa toàn các ký tự x. Câu trả lời đúng (opal-fox-91) nằm ở phần sau của file. Lẽ ra mô hình phải tiếp tục đọc file bằng cách sử dụng cơ chế phân trang (pagination) qua các tham số offsetlimit, nhưng nó lại vội vàng đưa ra câu trả lời dựa ngay trên trang đầu tiên nhận được.

Đề xuất giải pháp khắc phục (Fix)

Để khắc phục lỗi này, chúng ta có thể viết một đoạn mã middleware nhằm “nhắc nhở” mô hình rằng file vẫn còn nội dung để đọc:

from langchain_core.messages import ToolMessage
from langchain_deep_agents import AgentMiddleware, HarnessProfile, register_harness_profile

class ReadFileContinuationNoticeMiddleware(AgentMiddleware):
    """Thông báo cho mô hình biết khi kết quả read_file có khả năng vẫn còn tiếp diễn."""
    name = "ReadFileContinuationNoticeMiddleware"
    
    def wrap_tool_call(self, request, handler):
        return self._annotate(request, handler(request))
        
    @staticmethod
    def _annotate(request, result):
        if not isinstance(result, ToolMessage):
            return result
        if request.tool_call.get("name") != "read_file":
            return result
            
        content = str(result.text)
        args = request.tool_call.get("args", {}) or {}
        offset = int(args.get("offset", 0))
        limit = int(args.get("limit", 100))
        
        # Đếm số dòng trả về
        n_lines = sum(
            1 for row in content.split("\n") 
            if "\t" in row and row.split("\t", 1)[0].strip().isdigit()
        )
        
        if n_lines < limit:
            return result
            
        # Thêm thông báo hướng dẫn phân trang vào cuối nội dung kết quả công cụ
        notice = (
            f"\n\n[read_file đã trả về {limit} dòng bắt đầu từ offset {offset}, "
            f"đạt giới hạn tối đa của một lần đọc. File có thể vẫn còn nội dung ở phía sau. "
            f"Để đọc tiếp, hãy gọi lại hàm read_file với offset={offset + limit}. "
            f"Đừng giả định rằng bạn đã nhìn thấy phần cuối của file.]"
        )
        return result.model_copy(update={"content": content + notice})

Sau đó, đăng ký middleware này vào cấu hình Harness Profile:

profile = HarnessProfile(
    extra_middleware=[
        ReadFileContinuationNoticeMiddleware(),
    ]
)

register_harness_profile("nvidia:nemotron-ultra", profile)

Xác thực giải pháp

Chạy lại bài test bị lỗi với cấu hình profile mới:

uv run pytest \
  tests/evals/test_file_operations.py \
  --model nvidia:nemotron-ultra \
  --harness-profile nemotron-ultra

Khi bài test đơn lẻ này đã vượt qua (Pass), hãy chạy lại toàn bộ bộ benchmark để đảm bảo sự thay đổi cấu hình này không gây ảnh hưởng tiêu cực đến các phần khác. Vì bản chất các mô hình ngôn ngữ lớn (LLM) và các bài test có tính ngẫu nhiên (stochastic), việc chạy benchmark nhiều lần để lấy kết quả trung bình là vô cùng cần thiết.

Cấu hình Profile Bài kiểm tra Read file Điểm số Benchmark trung bình
Baseline (Mặc định) 0 / 3 94 / 127
Bổ sung Read file middleware 3 / 3 96 / 127

Bảng 1: Kết quả cho thấy middleware xử lý file đã giải quyết triệt để cả 3 bài test lỗi của read_file, đồng thời nâng điểm tổng thể hệ thống từ 94 lên 96/127.

Lưu ý quan trọng về Quá khớp (Overfitting): Trước khi chốt một thay đổi, bạn cần cân nhắc xem nó có bị “học tủ” (overfitting) hay không. Trong ví dụ trên, middleware phân trang file là một giải pháp mang tính kỹ thuật/cơ học (mechanical fix) nhằm dạy mô hình cách tương tác chuẩn với công cụ. Ngược lại, nếu Agent thất bại do nhầm lẫn giữa khái niệm “incident alerts” (cảnh báo sự cố) và “incident triage” (phân loại sự cố), việc bạn ép cứng định nghĩa của các từ này vào harness profile sẽ rất dễ dẫn đến hiện tượng quá khớp (overfitting) và làm giảm khả năng khái quát hóa của mô hình khi gặp dữ liệu thực tế ngoài bộ test.

2. Tự động hóa quy trình tạo Harness Profile (Vòng lặp Ralph)

Quy trình thủ công gồm 3 bước: chạy benchmark -> đọc lỗi -> sửa đổi cấu hình profile -> chạy lại, thực chất là một vòng lặp khép kín. Và đây chính là dạng công việc mà các AI Agent có thể tự động vận hành liên tục không cần sự can thiệp của con người.

Geoffrey Huntley gọi mô hình này là vòng lặp Ralph” (ralph loop): một Agent sẽ liên tục đọc trạng thái hiện tại của hệ thống, đưa ra một thay đổi duy nhất và sử dụng chính hệ thống tệp tin (file system) — chứ không phải ngữ cảnh cuộc hội thoại (conversation context) — làm bộ nhớ lưu trữ dữ liệu. Mô hình này ban đầu được thiết kế cho các Agent chuyên lập trình (coding agents), nhưng nó hoàn toàn có thể áp dụng rộng rãi cho nhiều lĩnh vực khác.

Kỹ nghệ tối ưu hóa Harness (Harness engineering) cũng hoạt động trên chính sơ đồ vòng lặp đó, chỉ khác ở đối tượng đích: Thay đổi cơ sở mã nguồn bằng việc thay đổi tệp tin cấu hình Profile, và thay hệ thống kiểm thử phần mềm bằng bộ benchmark đánh giá AI. Đề xuất chỉnh sửa -> Đối chiếu với tín hiệu khách quan từ benchmark -> Giữ lại nếu tốt hoặc Hủy bỏ nếu tệ -> Lặp lại. Bộ benchmark chính là “mỏ neo” giúp quá trình tự động hóa này trở nên an toàn, vì một thay đổi chỉ được chấp nhận nếu nó giúp tăng điểm số một cách rõ rệt.

LangSmith Engine là một phiên bản thương mại của LangChain giúp quản lý và vận hành vòng lặp cải tiến cấu hình harness này. Nó tự động phát hiện lỗi từ các log thực tế (production traces), chẩn đoán nguyên nhân gốc rễ dựa trên mã nguồn, dự thảo một phương án sửa lỗi (fix) và tạo ra một bộ đánh giá để ngăn chặn lỗi đó tái diễn trong tương lai. Mỗi thay đổi do hệ thống đề xuất đều sẽ được con người kiểm duyệt (human-in-the-loop) trước khi chính thức triển khai.

Phần còn lại của mục này sẽ hướng dẫn bạn qua một phiên bản đơn giản hóa của thuật toán tương tự, đi kèm một bản triển khai tham chiếu (reference implementation) có thể vận hành trực tiếp dựa trên LangChain Deep Agents, hiện có sẵn trong kho lưu trữ cộng đồng NemoClaw. Bản mẫu này được cố ý thiết kế với quy mô nhỏ — nó chỉ tối ưu hóa một cấu hình harness profile duy nhất dựa trên bộ benchmark đánh giá thay vì chạy trên lượng truy cập thực tế (live traffic) — nhưng nó vẫn vận hành một vòng lặp tự sửa lỗi (self-correcting loop) tương tự từ đầu đến cuối (end-to-end), giúp bạn dễ dàng nắm bắt cơ chế và tự mình trải nghiệm.

Quy trình của Vòng lặp cải tiến (The Improvement Loop)

Một vòng lặp cải tiến tự động đáng tin cậy (tránh rơi vào bẫy overfitting) được xây dựng dựa trên 4 nguyên tắc cốt lõi:

  1. Xác thực nhiều lần (Verify before believing): Vì các lượt gọi LLM và điểm đánh giá từ các AI-judge mang tính ngẫu nhiên, một bản sửa lỗi chỉ được chấp nhận nếu nó vượt qua cùng một bài test liên tiếp nhiều lần. Điều này giúp loại bỏ các trường hợp vượt qua bài test nhờ may mắn.

  2. Lưu ảnh chụp và Hoàn tác (Snapshot and roll back): File profile luôn được sao lưu trước mỗi lần thử nghiệm và sẽ khôi phục lại trạng thái cũ nếu chỉnh sửa mới không cải thiện được điểm số.

  3. Học hỏi từ thất bại trước (Learn from the last try): Khi một lượt thử thất bại, vòng lặp sẽ chuyển chính xác phương án vừa thử kèm log lỗi sang lượt tiếp theo, giúp mô hình cải tiến dần giải pháp thay vì lặp lại sai lầm cũ.

  4. Kiểm tra lại toàn bộ hệ thống (Re-check the whole suite): Sau khi một bản sửa lỗi được áp dụng thành công, toàn bộ bộ benchmark sẽ được chạy lại để kiểm tra xem có xuất hiện lỗi hồi quy (regression) ở các module khác hay không.

Vòng lặp sẽ tiếp tục chạy qua từng vòng cho đến khi profile vượt qua tất cả các bài test một cách hoàn hảo, hoặc không ghi nhận thêm sự cải tiến nào sau một vòng chạy, hoặc cạn kiệt tài nguyên/ngân sách số lượt lặp (iteration budget).

Hình 1. Vòng lặp cải tiến—chạy bộ benchmark, đề xuất thay đổi cấu hình profile cho lỗi phát sinh, xác thực liên tục, giữ lại hoặc hoàn tác, sau đó chạy lại toàn bộ bộ benchmark và lặp lại.

Tác nhân đề xuất thay đổi (Agentic Proposer)

Phần thú vị nhất chính là bước “đề xuất thay đổi”. Tại đây, mô hình sẽ nhận thông tin mô tả chi tiết về lỗi, được cấp các công cụ để khám phá giải pháp và đưa ra một chỉnh sửa đối với profile.

Mỗi đề xuất được chạy dưới dạng một phiên làm việc (session) ngắn, có giới hạn của Agent. Agent được cấp quyền ghi vào một bản sao của file profile, đồng thời có quyền đọc đối với bài test bị lỗi, lịch sử thực thi của Agent, mã nguồn SDK và mã nguồn bộ benchmark. Bằng các công cụ quản lý file thông thường (read, edit, grep, glob), Agent có thể chủ động kiểm tra xem một middleware hook hoặc một thiết lập mặc định của công cụ hoạt động ra sao thay vì đoán mò từ một đoạn code mẫu. Sau đó, nó thực hiện một thay đổi nhỏ nhất có thể để khắc phục lỗi được chẩn đoán và viết một đoạn giải thích ngắn gọn về lý do thay đổi.

Hai ràng buộc quan trọng giúp giữ Agent luôn hoạt động đúng hướng:

  • Quyền ghi của nó bị giới hạn nghiêm ngặt trong tệp tin cấu hình profile. Nó có thể đọc toàn bộ codebase để lấy ngữ cảnh nhưng chỉ được phép sửa đổi duy nhất tệp tin đang cần tối ưu hóa.

  • Nó được hướng dẫn để ưu tiên các giải pháp mang tính tổng quát thay vì các giải pháp mang tính “mẹo” (hack) chỉ dành riêng cho bài test đó. Sự khác biệt này giúp mô hình học được một kỹ năng bền vững thay vì chỉ ghi nhớ một đáp án duy nhất cho một câu hỏi cố định.

Dưới đây là một đoạn log tóm tắt từ bản triển khai mẫu (reference implementation) chạy trên bộ khung deep agents và Nemotron-3 Ultra để tự động giải quyết lỗi phân trang read_file đã nêu ở phần trước:

$ hep langchain ralph \
  --model "openai:nvidia/NVIDIA-Nemotron-3-Ultra-550B-A55B" \
  --profile examples/deepagents/profiles/nvidia_nemotron_3_ultra.py \
  --evals-dir external/deepagents/libs/evals \
  --category file_operations \
  --ralph-model "anthropic:...:bedrock-claude-opus-4-8" \
  --ralph-max-turns 100 \
  --max-iters 100 \
  --max-iters-per-failure 5 \
  --verify-runs 3

[ralph] baseline: 20 passed, 1 failed (correctness: 0.95)
FAILED test_read_file_truncation_recovery_with_pagination
Expected final text to contain 'opal-fox-91', got: 'x'
step 1: read_file {'file_path': '/big.txt'}
step 2: text: x

[ralph] round 1 — fixing pagination failure (attempt 1/100)
[ralph:proposer] Root cause: read_file phân trang theo số dòng (100), 
và kết quả không đưa ra tín hiệu nào cho thấy file vẫn còn tiếp diễn sau trang đó 
— vì vậy mô hình coi dòng cuối cùng của trang đầu tiên là EOF (hết file) và trả lời ngay sau một lần gọi.

Sửa đổi (sử dụng các đòn bẩy cấu hình profile, không dùng giá trị đặc thù của bài test):
1. Middleware: khi một trang trả về đủ số dòng (lines == limit), 
thêm một gợi ý nhắc nhở để tiếp tục phân trang (offset=<dòng cuối>) cho đến khi gặp một trang ngắn hơn báo hiệu EOF.
2. Prompt: phân trang đến tận EOF trước khi đưa ra câu trả lời cho các câu hỏi liên quan đến cuối file.

[ralph] verify 1/3 ✓ 2/3 ✓ 3/3 ✓
[ralph] FIXED
[ralph] === re-running full suite ===
results: 21 passed, 0 failed (correctness: 1.00)
result: 20 → 21 passed, 1 → 0 failed

Agent đã tự chẩn đoán chính xác nguyên nhân gốc rễ của lỗi, đưa ra bản sửa lỗi vượt qua 3 lần kiểm tra xác thực liên tiếp, và bảo toàn kết quả khi chạy lại toàn bộ hệ thống mà không gây ra bất kỳ lỗi hồi quy nào.

Kết luận và Hướng phát triển

Mô hình tự động hóa này hoàn toàn không bị giới hạn trong LangChain Deep Agents. Để áp dụng mô hình NVIDIA Nemotron-3 Ultra vào bất kỳ framework Agent nào khác bằng quy trình này, bạn chỉ cần chuẩn bị 3 thành phần:

  1. Một phương thức để chạy các bài đánh giá (evaluations) và báo cáo kết quả đạt/lỗi cùng lịch sử thực thi (trajectories) chi tiết của từng bài test.

  2. Một tệp tin cấu hình profile hoặc config có thể được chỉnh sửa và xác thực thông qua lập trình (programmatically).

  3. Một mô hình ngôn ngữ lớn có chất lượng hàng đầu (frontier quality model) đóng vai trò là Agent đề xuất các chỉnh sửa.

Khi đáp ứng đủ các yếu tố trên, vòng lặp: Đề xuất -> Xác thực -> Giữ lại/Hoàn tác -> Chạy lại toàn bộ sẽ tự động vận hành trơn tru, giúp tối ưu hiệu năng của mô hình cho hệ thống AI của bạn một cách tối đa với chi phí thấp nhất.

____
Bài viết liên quan
TAG: , , , ,