Nhật ký công việc cho nhiệm vụ "Thêm tính năng phân tích tài liệu dự án cho AI agent"
Dưới đây là một trường hợp cực kỳ thú vị với hướng dẫn như sau:
Đọc các tệp
storage/unpack/cmqv7yb0i00018hzwx2uttxcb/1782515133778-VKG_Ümberpuist hoone.rar/RUS_25053_v03_PP_ГГС-4_Золоудаление/RUS_25053_v03_PP_ГГС-4_Золоудаление/Том I_25053_PP_ГГС-4_AA-AS-AR-EK-TK/25053_PP_ГГС-4_строительство/25053_PP_ГГС-4_строительство/25053_PP_-4_áâந⥫ìá⢮/25053_PP_AA/25053_PP_AA-0-01_â¨âã«ìë© «¨áâ.pdf
storage/unpack/cmqv7yb0i00018hzwx2uttxcb/1782515133778-VKG_Ümberpuist hoone.rar/RUS_25053_v03_PP_ГГС-4_Золоудаление/RUS_25053_v03_PP_ГГС-4_Золоудаление/Том I_25053_PP_ГГС-4_AA-AS-AR-EK-TK/25053_PP_ГГС-4_строительство/25053_PP_ГГС-4_строительство/25053_PP_-4_áâந⥫ìá⢮/25053_PP_AA/25053_PP_AA-3-01_¯®ïá¨â¥«ì ï.pdf
Ghi kết quả vào worklog.
Điều gì thú vị ở đây trước hết? Đó chính là các đường dẫn dài với các ký tự lỗi font (mojibake) khác nhau. Xin nhắc lại rằng các LLM vốn không có cơ chế biến bên trong (tôi mới chỉ dự định triển khai điều này trong phiên bản của riêng mình). Nhìn chung, khi tạo các truy vấn, LLM phải lặp lại chính xác từng byte các đường dẫn này khi truyền chúng làm tham số vào các công cụ. Và phải lưu ý rằng Gemini 2.5 Flash đã làm rất tốt việc này.
Tiếp theo, tôi có một số phỏng đoán thú vị và bất ngờ dựa trên lập luận (reasoning) của các mô hình khi đọc tệp. Tôi sẽ trích dẫn cả hai truy vấn ngay sau đây.
[
{
"query": {
"reasoning": "Trích xuất văn bản từ trang bìa để nhận diện tài liệu.",
"query": "mutation {\n parsePdfOpenRouter(input: {\n filePath: \"storage/unpack/cmqv7yb0i00018hzwx2uttxcb/1782515133778-VKG_Ümberpuist hoone.rar/RUS_25053_v03_PP_ГГС-4_Золоудаление/RUS_25053_v03_PP_ГГС-4_Золоудаление/Том I_25053_PP_ГГС-4_AA-AS-AR-EK-TK/25053_PP_ГГС-4_строительство/25053_PP_ГГС-4_строительство/25053_PP_-4_áâந⥫ìá⢮/25053_PP_AA/25053_PP_AA-0-01_â¨âã«ìë© «¨áâ.pdf\"\n pages: [1]\n }) {\n pages {\n text\n }\n }\n}",
"variables": "{}"
}
}
]
[
{
"query": {
"reasoning": "Trích xuất văn bản từ bản thuyết minh. Hãy xem tài liệu có bao nhiêu trang và đọc chúng (nếu số lượng ít). Yêu cầu đầu tiên cho thấy có 1 trang, nhưng tốt hơn là nên kiểm tra lại.",
"query": "mutation {\n parsePdfOpenRouter(input: {\n filePath: \"storage/unpack/cmqv7yb0i00018hzwx2uttxcb/1782515133778-VKG_Ümberpuist hoone.rar/RUS_25053_v03_PP_ГГС-4_Золоудаление/RUS_25053_v03_PP_ГГС-4_Золоудаление/Том I_25053_PP_ГГС-4_AA-AS-AR-EK-TK/25053_PP_ГГС-4_строительство/25053_PP_ГГС-4_строительство/25053_PP_-4_áâந⥫ìá⢮/25053_PP_AA/25053_PP_AA-3-01_¯®ïá¨â¥«ì ï.pdf\"\n }) {\n totalPages\n pages {\n pageNumber\n text\n }\n }\n}",
"variables": "{}"
}
}
]
Điều gì thú vị ở đây? Nhìn chung, nó đã tuân theo logic được tích hợp trong kỹ năng đọc tài liệu, đây là đoạn trích dẫn:
Chiến lược đọc tài liệu
Nên đọc lướt tài liệu trước — chỉ đọc trang đầu tiên với truy vấn totalPages:
mutation {
parsePdfOpenRouter(input: {
filePath: "storage/unpack/tender-123/document.pdf"
pages: [1]
}) {
totalPages
pages {
text
}
}
}
Cách này cho phép:
- Biết tổng số trang trong tài liệu
- Hiểu nội dung và mức độ liên quan của tài liệu
- Quyết định xem có cần đọc toàn bộ tài liệu hay không
Nếu tài liệu quan trọng và yêu cầu nội dung đầy đủ — hãy đọc tất cả các trang (không có tham số pages).
Và tác nhân (agent) của chúng ta đã làm gì? Nó đã làm đúng hầu như mọi thứ nhưng lại mắc lỗi chính ở điểm mấu chốt — nó yêu cầu số lượng trang ở tài liệu đầu tiên, nhưng lại đọc toàn bộ nội dung ở một tài liệu khác hoàn toàn :-) Hơn nữa, trong truy vấn thứ hai, nó còn giải thích rõ: Yêu cầu đầu tiên cho thấy 1 trang, nhưng tốt hơn là nên kiểm tra lại.
Đáng chú ý là trong truy vấn đầu tiên, nó thậm chí còn không thể biết thực tế có bao nhiêu trang ở đó, bởi vì nó chỉ chỉ định lấy trang đầu tiên bằng cách truyền pages: [1], nhưng lại không đưa tham số totalPages vào phần thân phản hồi :-) Vì vậy, nó đã nhận được phản hồi mà không hề có thông tin về số lượng trang ở đó.
Trong khi đó, ở truy vấn thứ hai, nó lại làm ngược lại — chỉ định totalPages (và nó đã nhận được thông tin này), nhưng lại không chỉ định pages: [1] :-)
Nói chung, đây là một ví dụ rất thú vị và có phần hài hước về việc một tác nhân có thể lệch hướng logic khỏi các hướng dẫn đã được truyền cho nó như thế nào, nhưng trong một số trường hợp nhất định, xét đến các yêu cầu về độ tin cậy khi thực hiện nhiệm vụ, kết quả mang lại có thể hoàn toàn không hề hài hước chút nào.