Bỏ qua đến nội dung chính

Making agentic workflows trustworthy and verifiable with a custom DSL

TL;DR

  • James Brady của Elicit giải thích vì sao đội của anh xây một ngôn ngữ đặc thù miền (DSL) riêng tên AshPL để làm cho workflow của research agent trở nên dễ đọc, trung thành và kiểm chứng được — lập luận rằng cơ chế tạo ra câu trả lời quan trọng ngang với chính câu trả lời đó.
  • AshPL là một tập con của Python: Turing-incomplete, thuần hàm, reactive, có kiểu, với các primitive đặc thù miền (lấy bài báo học thuật, thử nghiệm lâm sàng); một thành phần curator viết nó, một dịch vụ Python diễn giải, và chương trình được viết lại rồi diễn giải lại trong một vòng lặp.
  • Demo tính năng research landscape của Elicit cho thấy AshPL điều khiển tìm kiếm, làm giàu dữ liệu và join; content-addressed store giúp việc diễn giải lại toàn bộ chương trình vẫn nhanh, và kế hoạch dễ đọc này có thể được người và các agent khác kiểm tra chéo.

Điểm chính

  • Cơ chế tạo ra câu trả lời quan trọng ngang với output: một thông điệp "an toàn để ship" giống hệt nhau từ mô hình cũ so với mô hình tối tân đã làm tool use và critique là hai đối tượng hoàn toàn khác nhau.
  • Không có cơ chế đúng duy nhất — đó là một lựa chọn thiết kế phụ thuộc miền, người dùng và tác vụ, với đánh đổi tốc độ–chặt chẽ thực sự; Elicit chủ ý tối ưu cho sự chặt chẽ.
  • Ba desiderata dẫn Elicit đến DSL: quy trình phải dễ đọc (với người và agent khác), việc lặp phải giữ độ trung thực (tránh trôi dạt khi thêm lớp), và quy trình phải được tuân theo trung thành.
  • AshPLTuring-incomplete (không vòng lặp, đệ quy hay mutation), thuần hàm, reactive, có kiểu, và là tập con có quan điểm của Python với các primitive riêng cho nghiên cứu khoa học.
  • Engine cốt lõi là vòng lặp viết/diễn giải/viết lại: curator viết AshPL, một dịch vụ Python phân tích cú pháp, kiểm kiểu và diễn giải; lỗi kiểu rẻ tiền được trả lại cho curator để viết lại.
  • Content-addressed store cho phép cache/memoization để toàn bộ chương trình có thể được diễn giải lại từ đầu mỗi vòng mà vẫn tái sử dụng các biểu thức đã tính — thiết kế thuần hàm khiến điều này an toàn.
  • Kiến trúc hệ thống dùng event log chỉ-ghi-thêm (event sourcing), một UI, một dịch vụ Python làm message broker, một sandbox, và một wrapper/gateway cô lập Anthropic API key khỏi input người dùng để bảo mật.
  • Kế hoạch AshPL là thực thi được (không chỉ là biểu diễn), tạo ra một biểu đồ dẫn xuất trực tiếp từ chương trình, và đủ dễ đọc để các critique agent chỉ ra những tìm kiếm bị bỏ sót.

Từ vựng

  • DSL (domain-specific language) — ngôn ngữ đặc thù miền
  • AshPL — DSL riêng của Elicit cho agentic workflow
  • Turing-incomplete — ngôn ngữ bị giới hạn có chủ ý (không vòng lặp/đệ quy/mutation)
  • curator — thành phần viết các chương trình AshPL
  • content-addressed store — kho đánh chỉ mục theo hash của nội dung
  • memoization — lưu kết quả biểu thức để tái dùng tức thì
  • event sourcing — mẫu suy ra trạng thái từ log chỉ-ghi-thêm
  • desiderata — các thuộc tính mong muốn dẫn dắt quyết định thiết kế
  • harness — bộ giàn giáo quanh mô hình giúp nó thực hiện tác vụ

Nội dung chi tiết

Cơ chế quan trọng ngang với output

Câu hỏi mở đầu: nếu hai hệ thống cho ra output giống hệt nhau, bạn có tin cả hai như nhau không? Câu trả lời là "còn tùy" — tùy vào những gì diễn ra bên trong để tạo ra output đó. Một thông điệp "code không có lỗ hổng, an toàn để ship" từ một mô hình cũ (3.5 Sonnet) khác hẳn với cùng thông điệp đó từ một mô hình tối tân đã làm tool use, critique và viết lại nhiều lần. Cơ chế — cái "làm thế nào" — quan trọng theo một cách khác so với chính output cuối cùng.

Không có cơ chế đúng duy nhất; đó là lựa chọn thiết kế phụ thuộc miền, người dùng và tác vụ, với đánh đổi tốc độ–chặt chẽ thực sự. Elicit tự hào về độ tin cậy cao, chất lượng cao và xuất xứ dữ liệu (data provenance), nên chủ ý tối ưu cho sự chặt chẽ.

Ba desiderata dẫn đến DSL

Khi xây research agent, đội Elicit đặt ra ba yêu cầu:

  1. Dễ đọc (legible): quy trình phải kiểm tra chéo được bởi người và bởi các agent khác (như critique agent).
  2. Lặp giữ độ trung thực (fidelity): khi thêm lớp/đổi hướng, không được trôi dạt khỏi ý định ban đầu của người dùng, tránh làm mô hình bối rối và phải bắt đầu lại.
  3. Tuân theo trung thành: hệ thống phải thực sự làm đúng tập bước đã định.

Ba điều này dẫn tự nhiên đến lựa chọn dùng DSL cho Elicit (không phải ai cũng nên dùng DSL).

AshPL — ngôn ngữ và đặc tính

AshPLDSL cho agentic workflow trong sản phẩm Elicit. Nó là Turing-incomplete (không vòng lặp, đệ quy hay mutation), thuần hàm, reactive, có kiểu, và là một tập con có quan điểm của Python — loại bỏ các tính năng Python không hữu ích và thêm các primitive riêng cho miền nghiên cứu khoa học (lấy bài báo học thuật, thử nghiệm lâm sàng). Vì là tập con của Python, code trông rất giống Python; việc có kiểu cho phép viết lại nhanh khi gặp lỗi kiểu.

Engine cốt lõi là vòng lặp: một thành phần viết AshPL, một dịch vụ Python diễn giải nó (bằng code Python thuần), rồi viết lại AshPL dựa trên kết quả vừa có. Lỗi kiểu được trả về cho thành phần viết để sửa, sau đó diễn giải lại — cứ thế lặp viết/diễn giải/viết lại để tiến triển.

Kiến trúc hệ thống

Hệ thống gồm: UI trên trình duyệt; một event log chỉ-ghi-thêm quản lý cấu trúc dữ liệu phân tán (event sourcing); một dịch vụ Python làm message broker; một sandbox; và curator (màu cam Anthropic) là phần viết AshPL. Sự đi lại giữa hộp xám (dịch vụ Python diễn giải) và hộp cam (curator viết) chính là vòng lặp viết/diễn giải.

Hai mảnh quan trọng khác: wrapper là lớp trừu tượng trước curator, cho phép hoán đổi các harness (có bản dùng agent SDK, cũng đã thử Pi với Claude và Pi với Codex; hiện dùng Pi với mô hình Anthropic). gateway là nơi mọi tương tác với LLM đi qua, vì nó giữ Anthropic API key — mục đích chính là bảo mật, không để input người dùng chảy thẳng tới curator và rò rỉ biến môi trường.

Content-addressed store cho phép cache/memoization: vì là ngôn ngữ thuần hàm, ta có thể hash một biểu thức, nếu đã tính trước thì lấy ngay từ map. Nhờ vậy, dù mỗi vòng đều diễn giải lại toàn bộ chương trình từ đầu, phần lớn vẫn được memoize nên rất nhanh. Diễn giải toàn bộ mỗi lần giúp dễ đảm bảo tính nhất quán và đúng đắn — diễn giải từng mẩu nhỏ là nơi trôi dạt có thể len vào.

Demo: research landscape

Truy vấn ban đầu: lập bản đồ các công ty và tổ chức đầu tư vào foundation model cho sinh học. Elicit trước hết hỏi lại để thu hẹp phạm vi (landscape rộng / một foundation model cụ thể / viện học thuật / công ty), rồi mọi bước sau do AshPL điều khiển: tìm bài báo học thuật, tìm web, lấy full text, sàng lọc. AshPL không chỉ biểu diễn kế hoạch — nó kế hoạch thực thi được.

Kết quả là một artifact dạng bảng, mỗi dòng là một tổ chức (Google DeepMind, Meta, Microsoft Research...) kèm thuộc tính (foundation model đã tạo, modality, hợp tác đáng chú ý). Với mỗi artifact có thể xem code AshPL đã tạo ra nó, và một biểu đồ dẫn xuất trực tiếp từ chương trình. Khi thêm các lớp (so sánh chiến lược mã nguồn mở/đóng, chiến lược thương mại hóa, các cơ quan giám sát) rồi join, chương trình dài lên tới ~1.000 dòng nhưng phần đầu giống hệt bảng trước nên được memoize và lấy lại tức thì.

Lời khuyên xây DSL

Chỉ nên dùng DSL nếu desiderata sản phẩm hướng bạn tới đó. Một số lưu ý: nên xây DSL dựa trên một ngôn ngữ đã có nhiều ví dụ trong dữ liệu huấn luyện (để curator không phải học cú pháp); phần lớn công sức là kỹ thuật phần mềm thông thường (wrapper, interrupt handling, rehydrate session, credential isolation, event sourcing), không phải bản thân DSL; và đầu tư mạnh vào evals — vốn rất khó khi hệ thống tự viết và thực thi chương trình.

Kết lại: không phải lời kêu gọi dùng DSL, mà là lời kêu gọi quan tâm sâu sắc đến cơ chế — vì cơ chế quan trọng. Một bảng trong Elicit, sinh ra qua một quy trình tỉ mỉ và phơi bày minh bạch, là một thứ về bản chất khác hẳn một bảng chỉ được mô hình "phun ra".

Góp ý / Báo lỗiPhát hiện sai sót hoặc có ý tưởng cải thiện?