1. Hallucination trong ngữ cảnh agent kiểm thử là gì
Trong ngữ cảnh một AI testing agent tự sinh và tự chạy test, hallucination (ảo giác) không phải là chuyện văn chương bay bổng, mà là những khẳng định cụ thể mà agent tự tin đưa ra nhưng không hề tồn tại trong hệ thống thật. Ví dụ agent viết một locator kiểu getByTestId('submit-appointment') trong khi trang thật không có test-id đó; hoặc gọi POST /api/v2/prescribe khi API thực chỉ là /api/prescriptions. Nó cũng có thể chèn một assertion nghe rất hợp lý — expect(banner).toHaveText('Đặt lịch thành công') — nhưng banner ấy chưa từng xuất hiện. Những sai lệch này nguy hiểm vì test vẫn trông đẹp và người review dễ tin.
Khác với chatbot trả lời sai một câu hỏi kiến thức, agent kiểm thử tạo ra hiện vật hành động: mã sẽ chạy, sẽ gọi mạng, và trong domain y tế có thể chạm tới dữ liệu bệnh nhân. Một test hallucinated có ba số phận: (a) fail ngay vì locator không tồn tại — đỡ nhất; (b) pass giả vì assertion quá yếu hoặc trúng phần tử khác — nguy hiểm; (c) chạm nhầm endpoint thật và gây tác dụng phụ. Vì vậy chúng ta cần xem hallucination như một lỗi bảo mật và an toàn, không chỉ lỗi chất lượng.
2. Ba dạng hallucination hay gặp: selector, API, assertion bịa
Dạng thứ nhất là selector bịa. Agent suy diễn cấu trúc UI từ tên trường trong prompt và tạo locator theo quy ước mà nó thấy quen — data-testid, id, hoặc text — nhưng không xác nhận trên trang thật. Dạng thứ hai là API tưởng tượng: agent giả định RESTful đẹp đẽ (versioning /v2, số nhiều, mã 201) trong khi API thật lệch chuẩn. Dạng thứ ba, tinh vi nhất, là assertion không có oracle: agent khẳng định một hành vi mong đợi mà không có nguồn nào định nghĩa hành vi đó — đặc biệt nguy hiểm trong y tế khi 'liều dùng đúng' phải đến từ phác đồ, không phải trí nhớ mô hình.
// ❌ Test do agent SINH RA — chứa cả 3 dạng hallucination
import { test, expect } from '@playwright/test';
test('đặt lịch khám', async ({ page, request }) => {
await page.goto('/booking');
// (1) selector BỊA: trang thật không có test-id này
await page.getByTestId('submit-appointment').click();
// (2) API TƯỞNG TƯỢNG: version /v2 + tên endpoint không tồn tại
const res = await request.post('/api/v2/prescribe', {
data: { drug: 'Amoxicillin', dose: '500mg', freq: 'tid' }, // liều tự nghĩ
});
// (3) assertion KHÔNG có oracle: banner text này chưa từng tồn tại
await expect(page.getByRole('alert')).toHaveText('Đặt lịch thành công');
});- Selector bịa → verify trên DOM/ARIA snapshot thật
- API tưởng tượng → verify với OpenAPI spec
- Assertion không oracle → chặn ở review, đòi nguồn
3. Grounding: neo agent vào artifact thật của ứng dụng
Grounding (nối đất) là nguyên tắc: agent chỉ được nói về những gì nó đã nhìn thấy trong hệ thống thật, thông qua các artifact được retrieve trước khi hành động. Ba nguồn grounding cốt lõi cho một web app y tế là: (1) ARIA/DOM snapshot của trang hiện tại để biết vai trò, tên, và bounding box của phần tử; (2) OpenAPI spec để biết chính xác route, method, schema request/response; (3) database schema (hoặc data dictionary) để biết ràng buộc và bảng nào là nguồn sự thật. Khi agent muốn dùng một selector hay endpoint, nó phải rút ra từ chính các artifact này, không phải từ trí nhớ.
// Retrieve artifact THẬT trước khi để agent viết bất kỳ selector nào
import { chromium } from '@playwright/test';
import fs from 'node:fs';
async function retrieveGrounding(url: string) {
const browser = await chromium.launch();
const page = await browser.newPage();
await page.goto(url);
// 1) ARIA snapshot: nguồn sự thật cho role + accessible name
const aria = await page.locator('body').ariaSnapshot();
// 2) OpenAPI: nguồn sự thật cho route/method/schema
const openapi = JSON.parse(fs.readFileSync('openapi.json', 'utf8'));
const routes = Object.keys(openapi.paths); // vd: ['/api/appointments','/api/prescriptions']
await browser.close();
return { aria, routes, schemas: openapi.components?.schemas ?? {} };
}
// Agent CHỈ được chọn selector/route xuất hiện trong { aria, routes }
💬 Bình luận (0)
Chưa có bình luận nào. Hãy là người đầu tiên!