Imp: Bản chuyển đổi đầy đủ của DSPy sang nền tảng BEAM cho Elixir
Imp là bản port hoàn chỉnh của DSPy sang BEAM, mang đến cách tiếp cận khai báo và tự tối ưu cho các chương trình mô hình ngôn ngữ trên Elixir. Thư viện cho phép lập trình viên mô tả đầu vào/đầu ra của từng bước gọi mô hình, chọn cách suy luận và để optimizer cải thiện dựa trên ví dụ mẫu, tất cả vận hành với độ tin cậy và khả năng đồng thời của OTP.

Imp: Bản chuyển đổi đầy đủ của DSPy sang nền tảng BEAM cho Elixir
Imp vừa ra mắt trên Hex với tư cách là bản port đầy đủ của DSPy sang BEAM — nền tảng chạy Elixir và Erlang. Thư viện này mang đến cách tiếp cận khai báo, tự cải thiện cho các chương trình mô hình ngôn ngữ, kết hợp sức mạnh của DSPy với độ tin cậy và khả năng đồng thời của OTP.
Imp với các thẻ tính năng
Ý tưởng cốt lõi: khai báo thay vì viết prompt thủ công
Điểm khác biệt lớn nhất của Imp so với cách viết prompt truyền thống là bạn không bao giờ phải tự viết prompt hay parser. Thay vào đó, bạn khai báo signature — mô tả đầu vào và đầu ra của từng bước — rồi để Imp lo phần còn lại.
Ví dụ với bài toán phân loại issue trên GitHub:
lm = Imp.req_llm("openai:gpt-5.4-mini", api_key: System.fetch_env!("OPENAI_API_KEY"))
triage =
"issue -> kind: enum[bug,feature,question], summary"
|> Imp.signature("Triage a GitHub issue.")
|> Imp.predict(lm: lm)
Imp sẽ tự động xây dựng prompt từ signature, kiểm tra phản hồi của mô hình dựa trên đó và trả về các trường có kiểu dữ liệu xác định. Trường kind luôn nằm trong một trong ba giá trị hợp lệ, hoặc lệnh gọi sẽ trả về lỗi — không còn tình trạng mô hình "sáng tác" ra giá trị lạ.
Khi muốn mô hình suy luận trước khi trả lời, bạn chỉ cần dùng Imp.chain_of_thought/2. Muốn cấp công cụ cho nó, dùng Imp.react/3 — signature vẫn giữ nguyên.
Đo lường và tối ưu hóa tự động
Đây chính là phần thú vị nhất của DSPy mà Imp kế thừa trọn vẹn. Bạn cung cấp ba tập dữ liệu gán nhãn: trainset (optimizer học từ đây), valset (dùng để chọn giữa các chương trình thử nghiệm) và testset (đánh giá trước và sau khi tối ưu).
Các optimizer có sẵn trong Imp bao gồm:
- GEPA: chạy chương trình, đọc các lỗi và viết lại hướng dẫn cho mô hình
- LabeledFewShot và BootstrapFewShot: chọn các ví dụ mẫu hiệu quả
- MIPROv2: tìm kiếm tổ hợp hướng dẫn và ví dụ tối ưu
- SIMBA: học quy tắc và ví dụ từ chính các lần thử tốt và chưa tốt của chương trình
- Fine-tuning/GRPO: huấn luyện trọng số mô hình
Kết quả là một chương trình mới với hướng dẫn và ví dụ có thể đọc được, lưu dưới dạng JSON và xem xét như một bản diff.
Agent trên BEAM: mỗi agent là một process
Điểm đặc biệt khi Imp chạy trên BEAM là cách nó tận dụng mô hình process của OTP. Một agent không chỉ là một hàm — nó là một process giữ trạng thái riêng, nhận message và chạy dưới sự giám sát của supervisor cùng với phần còn lại của ứng dụng.
Công cụ (tool) trong Imp đơn giản chỉ là một hàm Elixir. Bạn có thể dùng Imp.start_run/3 để chạy chương trình như một process được giám sát, cho phép theo dõi, dừng và kiểm soát những lệnh gọi công cụ nào được phép thực thi:
{:ok, run} =
Imp.start_run(researcher, %{question: question},
authorize: fn call ->
url = call.arguments["url"] || ""
if String.starts_with?(url, "https://raw.githubusercontent.com/"),
do: :allow,
else: {:deny, :untrusted_host}
end
)
Cơ chế authorize này đặc biệt hữu ích khi bạn muốn giới hạn agent chỉ truy cập những nguồn được tin cậy. Một điểm đáng chú ý về mặt an toàn: nếu một lệnh gọi công cụ có thể đã có tác dụng phụ nhưng không rõ kết quả, Imp báo cáo trạng thái là unknown chứ không âm thầm thử lại — tránh những hành động trùng lặp ngoài ý muốn.
Hệ sinh thái mở rộng: MCP, ACP và nhiều hình dạng khác
Imp còn tích hợp nhiều tính năng đáng chú ý:
- MCP: nhập công cụ từ bất kỳ MCP server nào bạn phê duyệt, chúng hoạt động như công cụ của chính bạn
- ACP: phục vụ bất kỳ chương trình Imp nào như một agent cho Zed và các client ACP khác
- RLM: xử lý đầu vào lớn hơn nhiều so với cửa sổ ngữ cảnh
- CodeAct và program of thought: tính toán bằng các biểu thức nhỏ trong sandbox
Các optimizer cũng hoạt động trên agent — GEPA có thể phản tư trên toàn bộ quá trình chạy của agent và viết lại hướng dẫn điều khiển nó. Tính năng Optimize Anything thậm chí có thể viết lại bất kỳ văn bản hay JSON nào có thể chấm điểm, ví dụ như mô tả công cụ của agent.
Cài đặt và lưu ý
{:imp, "~> 0.5"}
Imp yêu cầu Elixir 1.19 trở lên và trình biên dịch C/C++ (do hai dependency jaxon và erlexec chứa mã native). Lần biên dịch đầu tiên cần kết nối mạng vì build của erlexec tải plugin rebar3. Thư viện kết nối tới các mô hình thông qua ReqLLM, nên bất kỳ nhà cung cấp nào mà ReqLLM hỗ trợ đều dùng được.
Cần lưu ý rằng Imp 0.5 vẫn đang ở giai đoạn thử nghiệm và đây là bản phát hành đầu tiên trên Hex. API có thể còn thay đổi, và các optimizer cần được đánh giá chuẩn ở quy mô lớn hơn. Nhóm phát triển hoan nghênh các báo cáo lỗi và pull request từ cộng đồng.
Góc nhìn cho lập trình viên Việt Nam
Với cộng đồng Elixir tại Việt Nam — vốn không đông nhưng đang phát triển — Imp là một bổ sung đáng chú ý. Nếu bạn đang xây dựng các ứng dụng cần độ tin cậy cao và xử lý đồng thời tốt (như hệ thống chatbot, tự động hóa quy trình, hay các agent chạy nền), việc có một thư viện kết hợp DSPy với OTP mở ra nhiều hướng tiếp cận mới. Bạn có thể bắt đầu với tutorial dạng Livebook notebook, chạy offline hoặc với API key, để làm quen dần với cách tư duy "khai báo thay vì viết prompt" này.
Bài viết liên quan

Công nghệ
Nộp đơn xin việc lẽ ra nên khó hơn. Thật đấy
25 tháng 8, 2026

Công nghệ
Mô hình AI hàng đầu giỏi Vật lý đến đâu? Nghiên cứu mới chỉ ra các bài kiểm tra hiện hành đang đánh giá sai
16 tháng 9, 2026

Công nghệ
Muse của Meta: Bước tiến AI đầy tham vọng nhưng vấp phải bài toán niềm tin
27 tháng 9, 2026