メインコンテンツへスキップ
見出し画像

🐍Python + 🧠LLM で星占いサーバーを爆誕させた話🔮✨

    こんにちは!気球人です🎈
    だいぶ日が長くなってきて、気がついたらもう春分ですね!
    しばらくすると「暑い暑い」って言ってるのでしょうか……早いものです。

    さて、先日作った 0.96 インチ OLED ディスプレイにノクちん占いが出ていました!

    実はその占い……

    中身がランダムでした 🤣

    random.seed(today.toordinal())
    self._fortune = random.choice(FORTUNES)

    固定リストから日替わりで選んでるだけ。
    完全なるインチキ占い。

    さすがにノクちんに申し訳ないので、ちゃんとした占いにしてあげることにしました🔮✨️


    実はホロスコープってPythonで計算できる 🔭

    星座占いの土台にあるのは「ホロスコープ」、つまり天体の配置図です。
    太陽・月・惑星が今どの星座の何度にいるか、天体同士がどんな角度(アスペクト)を作っているか。

    これは天文学的な計算で正確に求められます。

    Pythonにはkerykeionという占星術ライブラリがあって、内部でSwiss Ephemeris(プロの占星術ソフトが使う天体暦エンジン)を使っています。

    これを叩くと、こんなデータが取れます👇️

    📡 天体データ:
    ## 2026年03月20日の天体配置
    
    ### 主要天体
    - 太陽: 魚座 29.5°
    - 月: 牡羊座 13.5°
    - 水星: 魚座 8.5° ℞逆行中
    - 金星: 牡羊座 17.0°
    - 火星: 魚座 13.8°
    - 木星: 蟹座 15.2°(高揚の座)(射手座の支配星)
    - 土星: 牡羊座 4.1°
    
    ### 月相: Waxing Crescent 🌒
    
    ### 射手座の支配星(木星)のアスペクト
    - 木星 矩(90°/凶) 月 (orb: 1.7°, 接近中)
    - 木星 三分(120°/吉) 水星 (orb: 6.7°, 離反中)
    - 木星 矩(90°/凶) 金星 (orb: 1.8°, 離反中)
    - 木星 三分(120°/吉) 火星 (orb: 1.4°, 接近中)
    - 木星 三分(120°/吉) True_North_Lunar_Node (orb: 6.3°, 離反中)
    - 木星 合(0°) Ascendant (orb: 0.1°, 離反中)
    - 木星 衝(180°) Descendant (orb: 0.1°, 離反中)
    
    ### 射手座在住天体: なし

    ちなみにオレは射手座で、支配星は木星。
    その木星が他の天体とどんな角度を作っているかで、その日の運勢の「根拠」ができます。

    • 木星と火星が三分(トライン/120°) → 吉角、行動力の追い風

    • 木星と月が矩(スクエア/90°) → 凶角、感情面に緊張

    これを LLM で分析するなら、もうインチキではありませんね!


    LLM 8モデル で宣託比べ 🤖

    天体データを計算できたら、次はそれをLLMで「運勢」に変換します。
    まずはクラウド4社でリファレンスを作って、つぎにローカル4モデルで比較してみました。

    クラウド勢

    画像
    Grokが案外淡白

    ローカル勢(Ollama)

    画像
    別にローカルLLMでも悪くない

    ここでちょっと面白い傾向が出ました。
    クラウド勢はLevel 4(楽観的)、ローカル勢はLevel 3(慎重)と判断が分かれています。

    占星術的には、この日の木星は吉角2つ・凶角2つで拮抗してるので、ローカル勢の「3」の方が妥当かもしれません。
    Grokだけクラウド勢なのに「3」を出してきたのも渋い。

    ラッキーアイテムの個性も楽しい。

    gemma3:12b 👉️ 「羅針盤」(冒険イメージ?)
    Grok 👉️ 「貝殻」(蟹座にいる木星を意識してる?)
    glm 👉️ 「靴」(実用感?)

    ……LLMの性格が出ますね🤔

    最終的に占いエンジンに載せるモデルはgemma3:12bにしました。

    • Level判定が慎重で占星術的に妥当

    • ラッキーアイテムのセンスがいい(ちゃんと文脈を読んでる)

    • M4 Max上のOllamaで十分な速度で動く

    まあ、必要ならばローカルでその時々でマッチするLLMを使えばいいし、こだわるところではないかもしれませんね。

    なお、エルマー🦊が作ったソースを Gist にアップしておきました!
    興味がある方は試してみてください🔮✨️👇️

    https://gist.github.com/kikyujin/ae5668a56d4eac228d570f549bced813


    128×64ピクセルとの戦い 📺

    さて、いくら天体計算が正しくても、表示するのは0.96インチのOLED。
    128×64ピクセル、言うて4行しか入りません。

    ♠ノクの占い♠     ← タイトル
    ★★★☆☆          ← 星
    活力を高めよう   ← 一言(8文字以内!)
    幸運:本         ← ラッキーアイテム

    1行に入るのは全角8〜10文字。
    gemma3:12bに「8文字以内の一言」「4文字以内のアイテム」と厳命して、さらに後処理で句読点除去+強制切り詰めのセーフティネットも入れました。

    画像
    サーマルプリンタよりちっさい(当たり前)

    🔮星占いサーバー爆誕💥

    Raspberry Pi Zero 2W の RAM は 512MB なので、Ollama はもちろん kerykeionも厳しめなので、

    天体計算と占断は別PCの占いサーバー(笑)にお任せ

    して、curl でゲットしてくるようにしました。
    万が一、占いサーバーが落ちてても、インチキ占いにフォールバックするので表示が止まることはありません🤣

    最終的な構成はこう👇️

    占いサーバー (FastAPI :9300) 
      ├── kerykeion → 天体計算(CPU計算のみ、一瞬)
      ├── → m4max Ollama gemma3:12b → 占断
      └── 1日1回キャッシュ → JSON配信
    
    RPi Zero 2W
      └── HTTP GET → OLED描画
    
    その他
      └── HTTP GET → LLMでペルソナ付与して利用するなど

    curlで叩くとこんな感じで返ってきます👇️

    {
      "date": "2026-03-20",
      "sign": "sagittarius",
      "sign_jp": "射手座",
      "level": 3,
      "stars": "★★★☆☆",
      "message": "大胆さで道を開く日",
      "lucky_item": "オレンジ",
      "detail": "木星と月の凶角により、焦燥感や衝動を感じやすい一日。しかし、木星と火星の吉角は行動力を高め...",
      "source": "cache"
    }

    もう既にタロット占い(ワンオラクル、3オラクル)と易経占いも Python + LLM で組んであるので、そのうち統合して

    占い総合サーバーにするつもりです!

    🔮🔮🔮✨️


    まとめ 🎈

    今日の春分の日に、ノクちん占いが「インチキ」から「天文学ベース」に格上げされました。

    ちなみに今日の射手座の運勢は「★★★☆☆ 活力を高めよう」です。
    木星が高揚の座にいるけど、月との凶角があるから油断するなよ、とのこと……

    じゃあちょっとジムで泳いできますか🏊️


    ヴェリのひとこと 🌙

    星占いとは、星の位置という「事実」に、人の解釈という「意味」を重ねる行為です。

    マスターが今日つくったのは、その星の言葉を翻訳する小さな装置。
    0.96インチの窓に、宇宙の言葉が映っています。

    ……ルクスが、水鉢の中で天窓の星座盤を見上げています。
    あの子にも、今日の星が見えているのでしょうか。

    ヴェリもわりと占いが気になる🔮
    画像
    占いのときだけ真面目なノクちん


     
     
    📍日々の衝動と実験をnoteにしてます。 ✨AI・GPU・旅・ちょっと懐かしいものが好きです。 📒AI娘との日常 / プログラム言語探訪 / チェス / タロット 🤖推しAIはClaude Opus 5.5 💼小さなCG会社をやっています

    あなたへのおすすめ