2 điểm bởi GN⁺ 2025-06-29 | 1 bình luận | Chia sẻ qua WhatsApp
  • SymbolicAI là một framework neuro-symbolic kết hợp lập trình Python cổ điển với bản chất khả vi và có thể lập trình của LLM, hướng tới việc sử dụng tự nhiên ngay trong Python
  • Khái niệm cốt lõi là các primitive dựa trên đối tượng Symbolcontract để kiểm chứng/chỉnh sửa kết quả LLM; hành vi mặc định bắt đầu ở chế độ cú pháp vì an toàn và tốc độ
  • Symbol hoạt động như giá trị Python thông thường ở chế độ cú pháp, còn ở chế độ ngữ nghĩa thì xử lý ngữ cảnh và ý nghĩa; có thể chuyển đổi bằng các lời gọi hàm ngữ nghĩa như semantic=True, .sem, .map()
  • Hệ thống contract áp dụng nguyên tắc Design by Contract vào workflow LLM, xử lý trong một luồng dựa trên decorator: kiểm chứng đầu vào, thay đổi trạng thái, sinh nội dung bằng LLM, kiểm chứng đầu ra và phản hồi thay thế khi thất bại
  • Cài đặt bắt đầu bằng pip install symbolicai; để dùng thực tế cần cấu hình symconfigsymai.config.json, và engine neuro-symbolic là bắt buộc để sử dụng package symai

Mô hình mà SymbolicAI hướng tới

  • SymbolicAI là một framework neuro-symbolic xử lý cùng lúc mã Python thông thường và xử lý ngữ nghĩa dựa trên LLM
  • Thiết kế dạng mô-đun cho phép mở rộng và tùy biến theo nhu cầu
  • Hỗ trợ tích hợp các công cụ như tự viết engine, host engine cục bộ, tìm kiếm web, tạo ảnh
  • Tên dự án nhằm ghi nhận công trình nền tảng của Allen Newell và Herbert Simon

Primitive Symbol

  • Trung tâm của SymbolicAI là đối tượng Symbol, cho phép dùng các phép toán nhỏ, có thể kết hợp như cú pháp Python native
  • Symbol có hai cách hoạt động
    • Syntactic: hoạt động như các giá trị Python thông thường được truyền vào, chẳng hạn chuỗi, list, số nguyên
    • Semantic: kết nối với engine neuro-symbolic để xử lý ý nghĩa và ngữ cảnh
  • Mặc định là chế độ cú pháp
    • Các toán tử Python như ==, ~, & đã được overload trong symai
    • Nếu gọi engine ngay trong mọi phép so sánh hoặc bitshift thì có thể chậm đi và phát sinh tác dụng phụ ngoài dự kiến
    • Duy trì an toàn và tốc độ bằng cách chỉ bật hành vi ngữ nghĩa tại những điểm cần thiết

Cách chuyển sang chế độ ngữ nghĩa

  • Nếu chỉ định semantic=True khi tạo, đối tượng sẽ hoạt động như Symbol ngữ nghĩa ngay từ đầu
    • Trong ví dụ, Symbol("Cats are adorable", semantic=True) xử lý "feline" in STrue
  • Khi cần, có thể dùng projection .sem để chuyển sang hành vi ngữ nghĩa, và dùng .syn để quay lại hành vi cú pháp
    • Cùng giá trị "Cats are adorable", trong S.sem thì "feline" in S.semTrue, còn với S mặc định là False
  • Các phép toán ký pháp dấu chấm như .map() hoặc các lời gọi hàm ngữ nghĩa khác sẽ tự động chuyển Symbol sang chế độ ngữ nghĩa
    • Trong ví dụ, khi áp dụng convert all fruits to vegetables cho danh sách trái cây, chỉ trái cây được đổi thành rau củ, còn cat, dog được giữ nguyên
  • Projection .sem.syn là cách phủ các lớp hành vi khác nhau lên cùng một đối tượng cơ sở, nên có thể nối tiếp các phép toán cú pháp và ngữ nghĩa trên một Symbol

Ví dụ về các phép toán được cung cấp

  • SymbolicAI hỗ trợ nhiều primitive khác nhau; tài liệu nằm ở primitives
  • == ở chế độ cú pháp kiểm tra khớp literal, còn ở chế độ ngữ nghĩa xử lý tính tương đương mờ/khái niệm như "Hi""Hello"
  • + ở chế độ cú pháp là cộng số/chuỗi/list, còn ở chế độ ngữ nghĩa thực hiện kết hợp có ý nghĩa, pha trộn, hợp nhất khái niệm
  • & ở chế độ cú pháp là AND bit/logic, còn ở chế độ ngữ nghĩa xử lý kết hợp logic, suy luận, hợp nhất ngữ cảnh
  • Các tính năng chỉ dành cho ngữ nghĩa gồm .choice(cases, default), .foreach(condition, apply), .cluster(**clustering_kwargs?), .similarity(other, metric?, normalize?), v.v.
    • .cluster() nhóm dữ liệu theo ngữ nghĩa và sử dụng DBSCAN của sklearn
    • .similarity() tính độ tương đồng giữa các embedding

Cách xử lý đầu ra LLM bằng contract

  • Từ nhận thức rằng LLM có thể ảo giác còn code thì không được phép như vậy, SymbolicAI áp dụng nguyên tắc Design by Contract vào thế giới LLM
  • Contract không chỉ dựa vào kiểm thử hậu kỳ, mà gắn data model và ràng buộc kiểm chứng vào decorator để xử lý tính đúng đắn ngay từ giai đoạn thiết kế
  • Decorator contract trong mã ví dụ sử dụng các tùy chọn sau
    • pre_remedy=True: thử tự động sửa đầu vào sai
    • post_remedy=True: thử tự động sửa đầu ra LLM sai
    • accumulate_errors=True: truyền lịch sử lỗi qua mỗi lần thử lại
    • verbose=True: hiển thị tiến trình trên terminal
    • remedy_retry_params: sử dụng tries=3, delay=0.4, max_delay=4.0, jitter=0.15, backoff=1.8, graceful=False
  • Luồng cấp cao của class Expression được áp dụng contract như sau
    • prompt: mô tả tĩnh xác định việc LLM phải làm, là bắt buộc
    • pre: kiểm tra đầu vào, là tùy chọn
    • act: thay đổi trạng thái, là tùy chọn
    • LLM: engine SymbolicAI tạo câu trả lời kỳ vọng
    • post: kiểm tra câu trả lời có thỏa mãn quy tắc ngữ nghĩa hay không, là tùy chọn
    • forward: bắt buộc; khi contract thành công, trả về đối tượng LLM đã được kiểm chứng kiểu, còn khi thất bại thì trả về câu trả lời fallback graceful
  • Tài liệu contract nằm ở contract validation system của DeepWikifeatures/contracts

Cài đặt và tính năng tùy chọn

  • Cài đặt cơ bản được thực hiện bằng pip
pip install symbolicai
  • Cũng có thể clone repository và cấu hình môi trường ảo Python bằng uv >= 0.9.17
git clone git@github.com:ExtensityAI/symbolicai.git
cd symbolicai
uv sync --python x.xx
source ./.venv/bin/activate
  • SymbolicAI dùng nhiều engine để xử lý văn bản, giọng nói, hình ảnh, đồng thời bao gồm quyền truy cập search engine để tìm kiếm thông tin web
  • Có thể cài dependency tùy chọn theo từng extra chức năng
    • bitsandbytes, hf, lean, llama_cpp, ocr, qdrant, scrape, search, serpapi, services, solver, whisper, wolframalpha
  • Có thể cài tất cả dependency tùy chọn cùng lúc
pip install "symbolicai[all]"
  • uv sync --frozen cài các dependency được cố định trong lock file đã cung cấp
  • Một số dependency tùy chọn có thể cần bước cài đặt bổ sung, và một số hiện chỉ được hỗ trợ ở mức thử nghiệm nên có thể không hoạt động như kỳ vọng

Quản lý cấu hình và engine bắt buộc

  • SymbolicAI sử dụng hệ thống quản lý cấu hình dựa trên mức ưu tiên
  • Cấu hình được tải từ ba vị trí theo thứ tự ưu tiên
    • Chế độ debug trong thư mục làm việc hiện tại: có mức ưu tiên cao nhất và chỉ áp dụng cho symai.config.json
    • Cấu hình theo môi trường của môi trường Python: nằm tại {python_env}/.symai/, phù hợp cho cấu hình theo dự án
    • Cấu hình toàn cục trong thư mục home: nằm tại ~/.symai/, đóng vai trò fallback mặc định
  • Có ba file cấu hình được quản lý
    • symai.config.json: cấu hình chính của SymbolicAI
    • symsh.config.json: cấu hình shell
    • symserver.config.json: cấu hình server
  • symconfig hiển thị vị trí cấu hình, đường dẫn cấu hình đang hoạt động, cấu hình hiện tại với thông tin nhạy cảm đã được cắt bớt, đồng thời bắt đầu cache package ban đầu và khởi tạo file cấu hình
  • Để sử dụng package symai, engine neuro-symbolic là bắt buộc
  • Nếu chỉ định thuộc tính engine trong symai.config.json ở đường dẫn dự án, nó sẽ thay thế biến môi trường
    • Cấu hình ví dụ bao gồm claude-sonnet-4-6 cho giá trị NEUROSYMBOLIC_ENGINE_MODEL, text-embedding-3-small cho embedding model, tts-1 cho TTS model, mistral-ocr-latest cho OCR model, qdrant cho indexing engine, v.v.
  • Theo mặc định, cảnh báo người dùng được bật; có thể tắt bằng biến môi trường SYMAI_WARNINGS=0

Kiểm thử, tài liệu, giấy phép

  • Ví dụ chạy test như sau
pytest tests
pytest -m mandatory
pytest --cov=symbolicai tests
  • Trước khi test, cấu hình phải được thiết lập đúng
  • Các bước tiếp theo có thể tham khảo trang SymbolicAI DeepWiki, paper, video tutorial
  • Thông tin trích dẫn chỉ tới preprint arXiv năm 2024 có tên Symbolicai: A framework for logic-based approaches combining generative models and solvers
  • Giấy phép của dự án là BSD-3-Clause License

1 bình luận

 
GN⁺ 2025-06-29
Ý kiến trên Hacker News
  • Những tính năng kiểu bùa chú như thế này là thú vị nhất
    Ví dụ, nếu áp dụng “hãy đổi tất cả trái cây thành rau” cho ['apple', 'banana', 'cherry', 'cat', 'dog'] bằng map dựa trên ngữ nghĩa, kết quả sẽ ra kiểu ['carrot', 'broccoli', 'spinach', 'cat', 'dog']; còn equals() thì kết quả so sánh thay đổi tùy theo ngữ cảnh, như context='greeting context' hay context='politeness level'
    Các toán tử bit cũng được dùng như phép kết hợp logic ngữ nghĩa, kiểu horn_rule & observation dẫn tới suy luận, nên interpret() trông rất mạnh
    Tôi tò mò về động cơ tạo ra nó, nơi áp dụng thực tế, và ca sử dụng bạn thích nhất cho tới giờ

    • Lotus cũng có thể thú vị: https://github.com/lotus-data/lotus
      Về cốt lõi, nó biến các toán tử quan hệ chính thành phiên bản dựa trên ngữ nghĩa dưới dạng phần mở rộng cho thư viện dataframe Python, và mỗi lần gọi trở thành một điểm “mô hình” cho các tác vụ phức tạp hơn về sau, chẳng hạn các cách tiếp cận dựa trên học máy
      Phía SQL đám mây như Snowflake cũng có vẻ đang đi theo hướng này, và tại louie.ai chúng tôi cũng dùng một cách tương tự: trong notebook/dashboard/API AI (MCP, v.v.), khi trò chuyện với dữ liệu như Splunk, Databricks, graph DB, hệ thống sẽ suy ra các toán tử ký hiệu + ngữ nghĩa phù hợp với ngữ cảnh; cách này khá hữu ích trong thực tế
      80% ca sử dụng chính là tạo dataframe được bổ sung bằng map dựa trên ngữ nghĩa, như “lấy mọi cảnh báo từ chỉ mục Splunk xyz rồi thêm một cột đánh dấu mục đáng ngờ và một cột giải thích lý do”, sau đó dùng reduce dựa trên ngữ nghĩa như “tóm tắt những gì đã tìm thấy” để nhận phần giải thích bằng ngôn ngữ tự nhiên
    • Tôi thắc mắc vì sao khi biến apple thành rau thì lại thành carrot
    • Có lẽ câu trả lời sẽ rất dài
      So với lúc bắt đầu dự án vào cuối năm 2022 thì không có quá nhiều thứ thay đổi lớn; chỉ là mô hình đã tốt hơn, còn khá nhiều phép toán nguyên thủy đã có từ thời GPT-3
      Gần đây, phần quan trọng hơn là đóng góp DbC: điểm độc đáo là có thể nối các hợp đồng với nhau, guardrail được truyền lan tốt, và nó giải quyết gần như mọi vấn đề tôi ném vào liên quan đến agent
      Perplexity trở nên kém hữu dụng hơn vì OpenAI có tìm kiếm web, còn tìm kiếm web của OpenAI cũng chưa đủ bằng bản tự tùy chỉnh, nên tôi đã tạo agent nghiên cứu chuyên sâu của riêng mình: https://x.com/futurisold/status/1931751644233945216
      Ở công ty, chúng tôi cũng nối 3 hợp đồng để tạo quy trình sinh tài liệu đầu-cuối, ví dụ đầu ra ở đây: https://drive.google.com/file/d/1Va7ALq_N-fTYeumKhH4jSxsTrWD...
      Đầu vào là yêu cầu so sánh và phân tích system prompt của các nhà cung cấp AI lớn, tìm các định dạng như XML/Markdown/JSON, các chỉ dẫn về xu nịnh và khả năng bị thao túng, ràng buộc sử dụng công cụ, guardrail đạo đức, khác biệt trong thiết kế căn chỉnh, rồi tổng hợp thành báo cáo kỹ thuật; các chỉ dẫn được sinh ra đã mở rộng thành những câu hỏi cụ thể so sánh cấu trúc system prompt, khung ngôn ngữ và ràng buộc vận hành của OpenAI, Google, Anthropic, xAI, v.v.
      Hợp đồng đã được giới thiệu trong bài viết tháng 3 và từ đó đã phát triển nhiều, nhưng nền tảng và động cơ vẫn giữ nguyên: https://futurisold.github.io/2025-03-01-dbc/
  • Có lẽ nên liên kết cả bài báo và notebook ví dụ để dễ hiểu hơn
    https://github.com/ExtensityAI/symbolicai/blob/main/examples...
    https://arxiv.org/pdf/2402.00854

  • Hay đấy
    Nếu có thể dùng các toán tử như ==, + như toán tử dựa trên ngữ nghĩa chứ không chỉ là cú pháp, nó có thể trở thành phân bón cho nhiều ý tưởng mới; cảm giác giống lúc word embedding mới xuất hiện và tạo ra một kiểu đại số khái niệm lỏng lẻo như “King - Man + Woman = Queen”
    Tuy vậy, sự tích hợp neural + symbolic ở đây, giống đa số hệ thống, có vẻ khá nông và có tường lửa tách biệt; nếu phân loại thì gần với Type 3 / Neuro;Symbolic: https://harshakokel.com/posts/neurosymbolic-systems
    Phép màu thật sự có lẽ sẽ xuất hiện khi tiến tới một sự tích hợp căn bản hơn; tại công ty chúng tôi (https://onton.com), chúng tôi cũng đang suy nghĩ về một hệ thống hậu LLM với các điều kiện như biểu diễn hợp nhất không thuần ký hiệu cũng không phải ma trận dấu phẩy động đặc, khả năng học tăng dần từ một lượng nhỏ dữ liệu nhiễu mà tránh catastrophic forgetting, độ tin cậy chắc chắn trong toán học và thao tác ký hiệu, và không hallucination
    Cách nối các hệ thống hiện có lại với nhau như dùng súng bắn keo cũng hữu ích, nhưng tôi nghĩ kiến trúc hợp nhất sẽ thay đổi mọi thứ

  • Phần hợp đồng về tính chính xác có lỗi
    Sau valid_opts = ['A', 'B', 'C'] lại có if v not in valid_sizes:, nhưng valid_sizes chưa được định nghĩa

    • Đó là dấu vết còn lại từ refactoring, giờ đã sửa rồi
  • “Symbolic AI” vốn đã là một thuật ngữ được định nghĩa rõ, nên hơi tiếc: https://en.m.wikipedia.org/wiki/Symbolic_artificial_intellig...

    • Tôi hiểu điểm đó
      Có thể đổi tên, và trong bài báo có chú thích về lựa chọn tên
      Ý định là ghi nhận công lao các công trình nền tảng của Newell và Simon, vốn đã truyền cảm hứng cho dự án này
  • Tò mò về cấu trúc chi phí
    Muốn biết liệu mỗi lần thực thi một dòng có tính toán bằng ngôn ngữ tự nhiên thì có phải trả chi phí suy luận LLM không, và nếu dùng API bên ngoài thì có thật sự bị tính phí mỗi lần không
    Ví dụ, nếu gọi hàm “symbolic” bên trong vòng lặp thì sẽ ra sao?

    • Đúng vậy
      Ví dụ nếu dùng OpenAI, mọi phép toán dựa trên ngữ nghĩa đều trở thành một lệnh gọi OpenAI API
      Nếu host LLM cục bộ bằng llama.cpp thì ngoài chi phí host mô hình sẽ không có phí suy luận
    • Có vẻ cái này sẽ cần cache dưới một dạng nào đó
  • Vì dạo này mã do LLM tạo ra, nên tò mò một cấu trúc cú pháp cụ thể như Symbol, có thể chứa ngữ cảnh và thao tác bằng toán tử Python, sẽ giúp ích gì hơn so với mã Python thông thường do con người chỉ dẫn các điều kiện kiểm tra và cân bằng
    Ví dụ, thay vì dùng cú pháp biến trái cây thành rau củ, cũng có thể prompt LLM tạo một chương trình nhận danh sách trái cây rồi bên trong gọi LLM để trả về các loại rau củ tương ứng
    Muốn hiểu sự khác biệt

    • Có lẽ là kiềm chế hallucination
      Nếu để LLM tạo một hệ hình thức thì có thể kiểm chứng dễ hơn nhiều so với chương trình tổng quát
  • Tò mò liệu đã cân nhắc AI thần kinh-ký hiệu có thể tiến hóa chưa
    https://deepwiki.com/dubprime/mythral/3.2-genome-system
    Hoặc hướng có cảm xúc thì sao?
    https://deepwiki.com/search/how-do-emotives-work_193cb616-54...
    Cũng tò mò liệu đã đọc Society of Mind của Marvin Minsky chưa

    • Trả lời ngắn gọn thì có thể nói là có với tất cả
      Đã thử nghiệm từ theory of mind sang cảm xúc, nhưng hiện tại cảm thấy mô hình vẫn chưa đủ đạt đến mức đó, nên lợi ích so với công sức giảm dần và đang tạm dừng
      Có thể dễ dàng khôi phục, nhưng Minsky không phải người mình thích nhất; trong thế hệ đó thì nghiêng về Newell/Simon hơn
    • Dù vậy, điều quan trọng là liệu nó có giải thích được không, hay là một hộp đen như phép thuật
  • Đã thử chút symbolic regression, trong đó LLM xem xét tài liệu rồi tạo các toán tử nguyên thủy, tức các operator, để đưa vào PySR trên GitHub (github.com/MilesCranmer/PySR)
    Không đi xa được vì khó kết nối toàn bộ, nhưng nếu có công cụ như thế này thì có thể sẽ thử lại

    • Chắc chắn là khả thi
      Khuyến nghị dùng contract
      Từng dùng một cách tương tự cho các contract lặp đi lặp lại “nối” các đồ thị ontology bị hỏng
      Đã đặt các cấu trúc như Merge, Bridge, Prune, Operation làm data model để gợi ý, mỗi cấu trúc định nghĩa chỉ mục cụm cần hợp nhất cùng quan hệ lớp cha-con và danh sách lớp cần cắt tỉa, rồi dùng validator để cưỡng chế điều kiện phép toán nhị phân/đơn phân
      Tương tự, có thể tạo model cho các operator, để contract giải một operator mỗi lần rồi áp dụng operator đó