2 ポイント 投稿者 GN⁺ 2025-06-29 | 1件のコメント | WhatsAppで共有
  • SymbolicAIは、古典的なPythonプログラミングとLLMの微分可能かつプログラム可能な性質を組み合わせるニューラルシンボリック・フレームワークで、Pythonの中で自然に使えることを目指している
  • 中核となる概念は、Symbolオブジェクトベースのプリミティブと、LLMの結果を検証・修正する**契約(contracts)**であり、デフォルトの動作は安全性と速度のために構文モードから始まる
  • Symbolは、構文モードでは通常のPython値のように動作し、意味モードでは文脈と意味を扱い、semantic=True.sem.map()のような意味関数呼び出しで切り替えられる
  • 契約システムは、Design by Contractの原則をLLMワークフローに適用し、入力検証、状態変更、LLM生成、出力検証、失敗時の代替応答までを1つのデコレータベースの流れとして扱う
  • インストールはpip install symbolicaiで始まり、実際の利用にはsymconfigsymai.config.jsonの設定が必要で、ニューラルシンボリック・エンジンはsymaiパッケージの利用に必須である

SymbolicAIが目指すモデル

  • SymbolicAIは**ニューラルシンボリック(neuro-symbolic)**フレームワークで、通常のPythonコードとLLMベースの意味処理をあわせて扱う
  • モジュール型設計により、必要に応じて拡張・カスタマイズできる
  • 独自エンジンの作成、ローカルエンジンのホスティング、Web検索、画像生成などのツール連携をサポートする
  • プロジェクト名は、Allen NewellとHerbert Simonの基礎的な研究へのクレジットを意図している

Symbolプリミティブ

  • SymbolicAIの中心にはSymbolオブジェクトがあり、小さく組み合わせ可能な演算をPythonネイティブの構文のように使える
  • Symbolには2つの動作モードがある
    • Syntactic: 渡された文字列、リスト、整数のような通常のPython値として動作する
    • Semantic: ニューラルシンボリック・エンジンに接続され、意味と文脈を扱う
  • デフォルトは構文モードである
    • ==~&のようなPython演算子はsymaiでオーバーロードされている
    • すべての比較やビットシフトで即座にエンジンを呼び出すと遅くなり、予期しない副作用が生じる可能性がある
    • 必要な箇所でのみ意味的な動作を有効にすることで、安全性と速度を維持する

意味モードへ切り替える方法

  • 生成時にsemantic=Trueを指定すると、最初から意味的なSymbolとして動作する
    • 例ではSymbol("Cats are adorable", semantic=True)"feline" in STrueとして扱う
  • 必要なときに.semプロジェクションを使って意味的な動作へ切り替えられ、.synで再び構文的な動作へ戻せる
    • 同じ"Cats are adorable"という値でも、S.semでは"feline" in S.semTrueで、デフォルトのSではFalseになる
  • .map()のようなドット記法の演算やその他の意味関数呼び出しは、自動的にSymbolを意味モードへ切り替える
    • 例では果物のリストにconvert all fruits to vegetablesを適用すると、果物だけが野菜に変わり、catdogは維持される
  • .sem.synプロジェクションは、同じ基底オブジェクトに異なる動作レイヤーを重ねる方式なので、1つのSymbol上で構文的・意味的な演算を連結できる

提供される演算の例

  • SymbolicAIは多様なプリミティブをサポートしており、ドキュメントはprimitivesにある
  • ==は、構文モードではリテラル一致を検査し、意味モードでは"Hi""Hello"のようなファジーな・概念的な同等性を扱う
  • +は、構文モードでは数値・文字列・リストの加算であり、意味モードでは意味のある結合、混合、概念の統合を行う
  • &は、構文モードではビット/論理ANDであり、意味モードでは論理結合、推論、文脈の統合を扱う
  • 意味専用の機能には.choice(cases, default).foreach(condition, apply).cluster(**clustering_kwargs?).similarity(other, metric?, normalize?)などがある
    • .cluster()はデータを意味的にグループ化し、sklearnのDBSCANを使用する
    • .similarity()は埋め込み同士の類似度を計算する

契約でLLM出力を扱う方法

  • SymbolicAIは、LLMは幻覚を起こしうるがコードはそうではない、という問題意識からDesign by Contractの原則をLLMの世界に適用している
  • 契約は事後テストだけに依存せず、データモデルと検証制約をデコレータに束ね、設計段階で正しさを扱う
  • 例示コードの契約デコレータは次のオプションを使用する
    • pre_remedy=True: 不正な入力の自動修正を試みる
    • post_remedy=True: 不正なLLM出力の自動修正を試みる
    • accumulate_errors=True: リトライごとにエラー履歴を渡す
    • verbose=True: ターミナルに進行状況を表示する
    • remedy_retry_params: tries=3delay=0.4max_delay=4.0jitter=0.15backoff=1.8graceful=Falseを使用する
  • 契約が適用されたExpressionクラスの高レベルな流れは次のとおり
    • prompt: LLMが行うべきことを定義する静的な説明で、必須
    • pre: 入力を検査し、任意
    • act: 状態を変更し、任意
    • LLM: SymbolicAIエンジンが期待される回答を生成する
    • post: 回答が意味規則を満たすか確認し、任意
    • forward: 必須であり、契約成功時には型検証済みのLLMオブジェクトを返し、失敗時にはgraceful fallback応答を返す
  • 契約のドキュメントはDeepWikiのcontract validation systemおよびfeatures/contractsにある

インストールとオプション機能

  • 基本インストールはpipで行う
pip install symbolicai
  • リポジトリをクローンし、uv >= 0.9.17でPython仮想環境を構成することもできる
git clone git@github.com:ExtensityAI/symbolicai.git
cd symbolicai
uv sync --python x.xx
source ./.venv/bin/activate
  • SymbolicAIはテキスト、音声、画像を処理するために複数のエンジンを使用し、Web情報検索のための検索エンジンアクセスも含む
  • オプション依存関係は機能別のextraとしてインストールできる
    • bitsandbytes, hf, lean, llama_cpp, ocr, qdrant, scrape, search, serpapi, services, solver, whisper, wolframalpha
  • すべてのオプション依存関係は一度にインストール可能
pip install "symbolicai[all]"
  • uv sync --frozenは、提供されたlockファイルに固定された依存関係をインストールする
  • 一部のオプション依存関係には追加のインストール手順が必要な場合があり、また一部は現在実験的サポートのみで、期待どおりに動作しない可能性がある

設定管理と必須エンジン

  • SymbolicAIは優先順位ベースの設定管理システムを使用する
  • 設定は3つの場所から優先順位順に読み込まれる
    • 現在の作業ディレクトリのデバッグモード: 最も優先度が高く、symai.config.jsonにのみ適用される
    • Python環境の環境別設定: {python_env}/.symai/にあり、プロジェクト別設定に適している
    • ホームディレクトリのグローバル設定: ~/.symai/にあり、デフォルトのフォールバックとして機能する
  • 管理対象の設定ファイルは3種類ある
    • symai.config.json: SymbolicAIメイン設定
    • symsh.config.json: シェル設定
    • symserver.config.json: サーバー設定
  • symconfigは設定の場所、有効な設定パス、機密情報を伏せた現在の設定を表示し、初期パッケージキャッシュと設定ファイルの初期化を開始する
  • symaiパッケージを使うにはニューラルシンボリック・エンジンが必須である
  • プロジェクトパスのsymai.config.jsonにエンジン属性を指定すれば、環境変数を置き換えられる
    • 例の設定には、NEUROSYMBOLIC_ENGINE_MODELの値としてclaude-sonnet-4-6、埋め込みモデルとしてtext-embedding-3-small、TTSモデルとしてtts-1、OCRモデルとしてmistral-ocr-latest、インデクシングエンジンとしてqdrantなどが含まれる
  • デフォルトではユーザー警告が有効で、環境変数SYMAI_WARNINGS=0で無効化できる

テスト、ドキュメント、ライセンス

  • テスト実行の例は次のとおり
pytest tests
pytest -m mandatory
pytest --cov=symbolicai tests
  • テスト前に設定が正しく構成されている必要がある
  • 次のステップとして、SymbolicAI DeepWikiページ論文動画チュートリアルを参照できる
  • 引用情報は、Symbolicai: A framework for logic-based approaches combining generative models and solversという2024年のarXivプレプリントを指している
  • プロジェクトのライセンスはBSD-3-Clause Licenseである

1件のコメント

 
GN⁺ 2025-06-29
Hacker Newsのコメント
  • こういうブードゥーめいた機能がいちばん面白い
    たとえば意味ベースの map['apple', 'banana', 'cherry', 'cat', 'dog'] に「果物をすべて野菜に変えて」を適用すると、['carrot', 'broccoli', 'spinach', 'cat', 'dog'] のようになり、equals()context='greeting context'context='politeness level' のように文脈によって比較結果が変わる
    ビット演算子も意味的な論理結合のように使われ、horn_rule & observation が推論につながる、といった具合なので interpret() は強力に見える
    作ったきっかけ、実際の適用先、これまででいちばん気に入っているユースケースが気になる

    • Lotusも面白いかもしれない: https://github.com/lotus-data/lotus
      中核的なリレーショナル演算子を、Pythonのデータフレームライブラリ拡張として意味ベース版にしたもので、各呼び出しが後で学習ベースのアプローチのような、より複雑な作業のための「モデル」ポイントになる
      SnowflakeのようなクラウドSQL側もこの方向に進んでいるように見えるし、louie.aiでもAIノートブック/ダッシュボード/API(MCPなど)としてSplunk、Databricks、グラフDBのようなデータに話しかけると、文脈に合った記号的+意味的演算子を見つけ出す似た方法を使っていて、実戦ではかなり有用だった
      主な80%のユースケースは、「Splunkインデックスxyzからすべてのアラートを取得し、怪しい項目を示す列と理由を説明する列を追加して」のような意味ベースのmapで補強されたデータフレームを作り、続いて「見つかったものを要約して」のような意味ベースのreduceで自然言語の説明を得る流れ
    • appleを野菜化すると、なぜcarrotになるのか気になる
    • かなり長い答えになりそう
      2022年末にプロジェクトを始めたころから大きく変わったことは多くなく、モデルが良くなっただけで、GPT-3の時代から原始演算のかなりの部分はすでにあった
      最近より重要なのはDbCの貢献で、契約をつなげられ、ガードレールがうまく伝播するため、エージェント関連で投げたほぼすべての問題を解決してくれた点が独特
      PerplexityはOpenAIのWeb検索のせいで有用性が下がり、OpenAIのWeb検索も自分でカスタマイズしたものほど十分ではなかったので、独自のディープリサーチエージェントを作った: https://x.com/futurisold/status/1931751644233945216
      会社でも契約を3つつなげてエンドツーエンドの文書生成を作った。出力例はここにある: https://drive.google.com/file/d/1Va7ALq_N-fTYeumKhH4jSxsTrWD...
      入力は、主要AIプロバイダーのシステムプロンプトを比較分析し、XML/Markdown/JSONのような形式、迎合性・操作性の指示、ツール利用の制約、倫理的ガードレール、アラインメント設計の違いを見つけて技術レポートとして総合せよ、という依頼で、生成された指示はOpenAI、Google、Anthropic、xAIなどのシステムプロンプト構造と言語的フレームワーク、運用上の制約を比較する具体的な質問群へと拡張された
      契約は3月の記事で紹介され、その後かなり発展したが、基盤と動機はそのまま: https://futurisold.github.io/2025-03-01-dbc/
  • 論文とサンプルノートブックを一緒にリンクすると理解の助けになりそう
    https://github.com/ExtensityAI/symbolicai/blob/main/examples...
    https://arxiv.org/pdf/2402.00854

  • すばらしい
    ==+ のような演算子を構文ではなく意味ベース演算子として使えるなら、新しいアイデアの肥料になりそうで、単語埋め込みが最初に出てきたときに「King - Man + Woman = Queen」のようなゆるい概念代数が生まれた感覚に近い
    ただし、ここでのニューラルネットワーク+記号の統合は、多くのシステムと同様にかなり浅く、ファイアウォールのある構造に見え、分類上はType 3 / Neuro;Symbolicに近い: https://harshakokel.com/posts/neurosymbolic-systems
    本当の魔法は、もっと根本的な統合へ進むときに出てくると思うし、私たちの会社(https://onton.com)でも、純粋な記号でも密な浮動小数点行列でもない統合表現、少量のノイズの多いデータから漸進的に学習しながらcatastrophic forgettingを避ける能力、数学・記号演算の確実な信頼性、幻覚なし、という条件を備えたLLM以後のシステムを考えている
    既存システムをグルーガンのようにつなぎ合わせる方法も有用だが、統合アーキテクチャがすべてを変えると思う

  • 正確性契約の部分にバグがある
    valid_opts = ['A', 'B', 'C'] の次に if v not in valid_sizes: が出てくるが、valid_sizes が定義されていない

    • リファクタリングの名残で、今は直した
  • 「Symbolic AI」はすでによく定義された用語なので、少し残念: https://en.m.wikipedia.org/wiki/Symbolic_artificial_intellig...

    • その点は理解している
      名前を変えることもできるし、論文には命名についての脚注がある
      このプロジェクトに着想を与えたNewellとSimonの基礎的な仕事へのクレジットを込める意図だった
  • コスト構造が気になる
    自然言語計算が入った行を実行するたびに LLM の推論コストを払うのか、外部 API を使うと本当に毎回課金されるのか知りたい
    たとえばループ内で「symbolic」関数を呼び出すとどうなるのか気になる

    • その通り
      たとえば OpenAI を使うと、すべての意味ベースの演算が OpenAI API 呼び出しになる
      llama.cpp でローカル LLM をホストするなら、モデルのホスティング費用以外の推論課金はない
    • これは何らかの形でキャッシュが必要になりそう
  • 最近のコードは LLM が生成するので、コンテキストを含み Python 演算子で操作できる Symbol のような特定の構文構造が、人間がチェックとバランスの条件を指示して作った通常の Python コードよりどう役立つのか気になる
    たとえば果物を野菜に変える文法を書く代わりに、果物のリストを受け取り、内部で LLM を呼び出して対応する野菜を返すプログラムを作るよう LLM にプロンプトすることもできる
    違いを理解したい

    • ハルシネーション抑制ではないかと思う
      LLM に形式体系を作らせると、汎用プログラムよりはるかに検証しやすい
  • 進化可能なニューラル・シンボリック AIも検討したのか気になる
    https://deepwiki.com/dubprime/mythral/3.2-genome-system
    あるいは感情を感じる方向はどうか?
    https://deepwiki.com/search/how-do-emotives-work_193cb616-54...
    Marvin Minsky の Society of Mind を読んだことがあるのかも気になる

    • 短く答えるなら、どれもそうだと言える
      心の理論から感情へとつながる実験もしてみたが、今はモデルがまだ十分にそのレベルに達していないと感じていて、労力に対するリターンが小さくなったため止まっている
      簡単に復活させることはできるが、Minsky がいちばんのお気に入りというわけではなく、その世代ではNewell/Simon のほうにより惹かれる
    • それでも説明可能なのか、それとも魔法のようなブラックボックスなのかが重要
  • LLM に文書をレビューさせ、GitHub の PySR(github.com/MilesCranmer/PySR) に入れるプリミティブ演算子、つまり演算子を作らせるシンボリック回帰を少し触ってみた
    全体をつなげるのが難しくてあまり先には進めなかったが、こういうツールがあればまた試してみるかもしれない

    • 確かに可能
      契約を使うのがおすすめ
      壊れたオントロジーグラフを反復的に「つなぎ合わせる」契約で似た方法を使ったことがある
      インスピレーションになりそうなデータモデルとして MergeBridgePruneOperation のような構造を用意し、それぞれマージするクラスタインデックスと上位・下位クラス関係、刈り込むクラス一覧を定義したうえで、バリデータで二項/単項演算の条件を強制した
      同じように演算子用のモデルを作り、契約が一度に 1 つの演算子を解かせてから、その演算子を適用する形にできる