Imp: Bản chuyển đổi đầy đủ của DSPy sang nền tảng BEAM cho Elixir

Công nghệ27 tháng 9, 2026·5 phút đọc

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: 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ăngImp 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.

Chia sẻ:FacebookX
Nội dung tổng hợp bằng AI, mang tính tham khảo. Xem bài gốc ↗