← 地図へ / 使い方 / 地図に場所を足そう / プライバシーポリシー

スターアニスの技術

制定 2026年10月14日

スターアニスは、地図の下のホイールを回して近くのお店を1軒ずつ送る、店探しのサイトです。 この頁では、その裏でどの技術を、何のために、どう使っているかを、できるだけ具体的に書きます。 あわせて、どこまで保証できて、どこからは保証できないかも書きます。

全体の流れ

お店の情報は、ホットペッパーグルメ Web サービスから毎晩すべて取り直します。そこに、地図のデータ(OpenStreetMap)や AI が作った紹介文・拡大した写真・場面の判定を重ね、見に来た方には地図とお店のページとして出します。 見に来た方の操作で AI が動くことはありません。AI が働くのは夜の作り置きの時だけです。

外のデータ ホットペッパーグルメ OpenStreetMap 国土地理院・気象のデータ 駅の読み(Wikidata) 毎晩の作り置き 取り込み・掲載終了の裏取り 紹介文(gemma) 写真(Real-ESRGAN) 事実の読み取り(Jev) おすすめ度・こんな時に 表と索引 お店の本体(読むだけ) H3 の六角形の索引 全文検索(DuckDB) 場面の表・まわりの場所 サイト 地図(MapLibre)・ホイール お店のページ(サーバで組み立て) MCP(AI から使う道具) 見に来た時は読むだけ
AI が働くのは夜の作り置きの時だけ。見に来た方の操作は、作ってある表を読むだけです。

並び順 ── H3 のうずまき

近くのお店を「近い順に100軒」並べると、東京駅のような店の多い所では 270m 先までしか届かず、ホイールを回しても景色が変わりません。 そこで、地球を六角形で敷き詰める H3(Uber が公開している仕組み)を使います。 地図の中心の六角形をリング0、それに接する6枚をリング1、その外の12枚をリング2…と数え、100軒の枠をリングごとに配ります。 リングの中は中心から見た方位の順、同じ六角形の中は近い順です。

0 リング0 → 1 → 2 … 同じ100軒でも、東京駅で 997m 先(リング4)まで届く 近い順だけだと 270m で止まる 半径は 1km から。30軒に満たない時だけ広げる 解像度は半径に合わせて 7〜9 を選ぶ
ホイールを回すと、うずまきを描きながら外へ出ていきます。

★この並べ方はブラウザ(JavaScript)とサーバ(Python)の両方に同じ算法で書いてあり、同じ入力で同じ並びになることをテストで確かめています。 片方だけ直して並びがずれる、ということを防ぐためです。

地図と場所 ── OpenStreetMap ほか

お店の情報 ── 毎晩の取り込み

AI の使い分け

AI は「用途ごとに向いているものを選び、任せる範囲を決めて」使っています。

紹介文gemma(運営者の機器の中で動く言語モデル)。ホットペッパーの項目から料理と雰囲気の文を書きます。 金額・時刻・人数・駅のような変わりやすい事実は書かせず、表と「この店のポイント」が毎日のデータから出します。 元の項目が変わった紹介文は、書き直すまで出しません
写真Real-ESRGAN。掲載の写真(238px)を GPU で4倍に拡大します(1枚約2秒)。内容・構図・文字は変えません。 掲載が終わった時や写真が差し替わった時は、拡大した写しも消します
掲載文の読み取りJev(TypeSafe)。キャッチやお店からのひとことのような自由記述から、「一人でも入りやすい」「ベビーカーで入れる」 「お通しなし」など10種類の事実を読みます。文は作らせず、選択肢で答えさせ、元の文を引用で添えます。確からしさの低い答えは使いません。 送るのはお店の掲載文だけで、見に来た方の入力は送りません
使わないところ検索の欄に打った言葉、おすすめ度、そろい具合、場面の判定の決まりには AI を使いません(辞書・ルール・計算)。 試した別の AI(場面の分類)は、正しく分けられた割合が低かったので採用しませんでした

おすすめ度

おすすめ度(★)は口コミの点数ではありません。立地 25%・価格 25%・営業努力 30%・2軒目 20% の4つの軸で、 近くの同じジャンルのお店の中での順位から決める目安です。比べる相手は半径2.5km ほど(20軒に足りなければ広げ、5軒に満たなければ★を出しません)。 上位3% が★5.0、いちばん下は★2.5 です。毎日、朝に計算し直します。出し方は 使い方 にすべて書いています。

「こんな時に」

お店のページの「こんな時に」は、お店の事実を先に読み、その組み合わせに場面の見出しを付ける作りです。

  1. 事実を札にする: 曜日ごとの営業の区切りと料理のラストオーダー(「残業後にも」=22時以降も料理を頼める)、平均予算、子ども連れの欄、 駅からの距離、席・個室・コース、Jev が読んだ事実、まわりの場所(公園のそば…)など
  2. 札の組み合わせで場面を決める: 例えば「幼稚園帰り、親子でほっと一息」は「カフェ」+「子ども連れOK」+「午後に開いている」。 札は7つの型(夕飯・昼ごはん・予定の前後に・子どもと・大人数・ひと休み・お酒とお祝い)に分かれていて、型をまたいで組み合わせられます
  3. 理由を事実で書く: カードの「このお店なら」には、条件になった事実をそのまま書きます(「L.O. 22:30まで・上野駅から約300m」)

場面は、基本の30と、暮らしの場面89(友人・デート・子ども・習い事・一人の時間・家族…)があります。地図の検索欄で場面の言葉を打つと、そのカードが出るお店に絞れます。

そろい具合と Lean による証明

カードの名前の横の「そろい具合 85%」は、この場面の条件とあるとよい事実が、そのお店の掲載情報でどれだけそろっているかです。 当たる確率ではありません。決まりは次のとおりです。

条件の組ごとにそろう/条件付き/無い 無い組が1つでもある→ カードを出さない(0%) 条件付きの組がある→ 条件付き 70〜85% ぜんぶそろっている→ そろい具合 70〜100% あるとよい事実の割合で点数が上がる(出すかは変えない)
条件が1つでも欠ければ、点数がどんなに高くてもカードは出しません。

この決まりは、形式検証の道具 Lean 4 で書き、 どんな入力でも次の性質が破られないことを証明しています(証明に途中の省略や、勝手な前提はありません)。

  1. 無い条件の組があれば、あるとよい事実に関係なく、カードは出さない
  2. 条件の組が1つも無い決まりでは、カードを出さない(空っぽの条件で「そろっている」にしない)
  3. カードを出すかどうかは、あるとよい事実に左右されない
  4. 出すカードの点数は、必ず 70〜100%
  5. 条件付きのカードは、85% を超えない
  6. 「そろっている」なら、どの条件の組にもそろった事実がある
  7. あるとよい事実が増えても、点数は下がらない
theorem missing_group_hides (groups : List (List TagState)) (plus : List Bool)
    (h : groups.any (fun g => groupRank g == 0) = true) :
    status groups = .none ∧ fit groups plus = 0

サイトで実際に点数を計算しているのは Python です。そこで、Python の本番の計算と、Lean で証明した定義に同じ入力を3,000通り余り入れ、 すべて同じ答えになることを、公開のたびに確かめています(片方だけを変えると、この確かめで公開が止まります)。

保証の範囲: Lean が保証するのは「決まりの論理」です。掲載文の読み取りが正しいか、お店が本当にその場面に合うか、見に来た方が満足するかは、 証明では保証できません。それは の評価や、人の確認で見ていきます。

言葉で探す

地図の検索欄に「上野で残業後に一人で夕飯」のように打つと、場所・場面・人数・予算に分けて探します。分けるのは辞書と正規表現で、 AI は使いません。打った言葉を外の AI に渡さないためです。場所は駅・エリア・目印の索引で引き、「えびす」「ebisu」のような読みでも引けます (駅の読みは Wikidata、料理・地名の読みは Sudachi の辞書)。辞書を直すたびに、200問を超える例題で読み取りが崩れていないかを確かめています。

AI から使う道具(MCP)

Claude・ChatGPT・Gemini などの AI サービスから、このサイトの検索を道具として使えます(MCP: Model Context Protocol)。 場所・ジャンル・設備・いま営業中で探す、1軒の詳しい情報(おすすめ度・こんな時に・2軒目)、代わりのお店、店名で引く、 載っていないお店の目安、場面の評価、の7つの道具があります。写真・電話番号・紹介文の全文は返さず、どの答えにもクレジットと注意書きを付けます。 つなぎ方は 使い方 にあります。

品質の守り方

プライバシーと安全

この頁の内容は、仕組みが変わったら書き直します。お問い合わせは [email protected] まで。運営: 合同会社スターアニス