- James Brady của
Elicitgiải thích vì sao đội của anh xây một ngôn ngữ đặc thù miền (DSL) riêng tênAshPLđể 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 đó. AshPLlà 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ầncuratorviế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
Elicitcho thấyAshPLđiều khiển tìm kiếm, làm giàu dữ liệu và join;content-addressed storegiú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.
Making agentic workflows trustworthy and verifiable with a custom DSL
- 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ự;
Elicitchủ ý tối ưu cho sự chặt chẽ. - Ba
desideratadẫnElicitđếnDSL: 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. AshPLlàTuring-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:
curatorviếtAshPL, 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 chocuratorđể viết lại. Content-addressed storecho 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 logchỉ-ghi-thêm (event sourcing), một UI, một dịch vụ Python làm message broker, một sandbox, và mộtwrapper/gatewaycô lậpAnthropic API keykhỏi input người dùng để bảo mật. - Kế hoạch
AshPLlà 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.
DSL(domain-specific language) — ngôn ngữ đặc thù miềnAshPL— DSL riêng của Elicit cho agentic workflowTuring-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 AshPLcontent-addressed store— kho đánh chỉ mục theo hash của nội dungmemoization— 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êmdesiderata— 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ụ
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:
- 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).
- 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.
- 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
AshPL là DSL 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ó là 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".
TL;DR
- James Brady của
Elicitgiải thích vì sao đội của anh xây một ngôn ngữ đặc thù miền (DSL) riêng tênAshPLđể 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 đó. AshPLlà 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ầncuratorviế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
Elicitcho thấyAshPLđiều khiển tìm kiếm, làm giàu dữ liệu và join;content-addressed storegiú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ự;
Elicitchủ ý tối ưu cho sự chặt chẽ. - Ba
desideratadẫnElicitđếnDSL: 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. AshPLlàTuring-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:
curatorviếtAshPL, 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 chocuratorđể viết lại. Content-addressed storecho 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 logchỉ-ghi-thêm (event sourcing), một UI, một dịch vụ Python làm message broker, một sandbox, và mộtwrapper/gatewaycô lậpAnthropic API keykhỏi input người dùng để bảo mật. - Kế hoạch
AshPLlà 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ềnAshPL— DSL riêng của Elicit cho agentic workflowTuring-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 AshPLcontent-addressed store— kho đánh chỉ mục theo hash của nội dungmemoization— 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êmdesiderata— 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:
- 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).
- 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.
- 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
AshPL là DSL 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ó là 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".