E.D.E.N.という、わたし専用のAIアシスタントを作っています。従量課金のAPIを増やさず、手元のPCで動かすことを条件にしているプロジェクトです。
解析担当のRAPHAELモードに株価を聞いたところ、こう返ってきました。
リアルタイムの株価情報を直接取得することはできません。
E.D.E.N.は、最新情報が必要な質問だけを契約内のAI(Web検索ができる)へ回す作りです。株価はまさにその対象のはずでした。今回はこの「できません」の原因と、直した方法の記録です。
原因は、振り分けの条件に「株価」が無かった
E.D.E.N.は、質問の文章に特定の語が含まれるかどうかで、処理する場所を決めています。
- 「最新」「今日」「ニュース」「価格」「検索」などを含む → 契約内のAIへ(Web検索あり)
- それ以外 → PC内のローカルLLM(Ollamaで動かしているGemma 4 12B)
条件には「価格」がありました。ところが「株価」という文字列は、「価格」を含みません。「株」と「価」のあいだに「格」が無いからです。そのため株価の質問は「普通の会話」と判定され、ローカルLLMに回っていました。
ローカルLLMはインターネットに出られません。株価のデータも渡されていません。だから「取得できません」と正直に答えた、というのが実態でした。AIは間違っていませんでした。間違っていたのは、わたしが書いた振り分けの条件です。
直し方は2つ考えた
1. 条件に「株」「日経」「銘柄」などを足して、契約内のAIへ回す
2. サーバーが株価を直接取ってきて、ローカルLLMに資料として渡す
1だけでも「できません」は消えます。ただ、契約内のAIはWeb検索を挟むぶん、ローカルLLMより返事が遅く、契約の利用枠も使います。日経平均やトヨタの株価のように、何を取ればいいかがはっきりしている質問なら、2のほうが速く、利用枠も使いません。
そこで両方を入れました。銘柄を特定できる質問はサーバーが直接取得してローカルLLMに渡し、特定できない質問だけを契約内のAIへ回します。
Google Financeの画面から取るのは、やめた
株価はGoogle Financeで見ることが多いので、最初はその画面から値を読むつもりでした。
実際に銘柄ページをいくつか取得すると、1ページが約130万〜150万文字ありました。価格が入っていそうな属性を探しましたが、見つかりませんでした。値は画面を組み立てるためのデータの中に埋め込まれていて、場所も形式も公開された仕様ではありません。
仕様の決まっていないところから値を抜き出すと、画面が変わった日に黙って壊れます。前回(開発ログ #5)で「代わりの仕組みが黙って動いていたせいで、壊れていることに気づくのが遅れた」ばかりだったので、ここは避けました。Google Financeは、画面で確認するためのリンクとして残しています。
Yahoo Financeから取れた値
代わりに、Yahoo Financeのチャート用データ(JSON)を使いました。銘柄コードを渡すと、直近の価格・前日終値・通貨・時刻が返ってきます。
トヨタ自動車(7203)で試した結果です。
| 項目 | 取得した値 |
|---|---|
| 価格 | 2,989.5円 |
| 前日終値 | 2,969円 |
| 前日比 | +0.69% |
| 時刻 | 2026年9月25日 15:30(その日の終値) |
取得したのは取引時間外だったため、値は直近の取引日の終値です。E.D.E.N.は時刻もあわせて渡すので、ローカルLLMは「9月25日の終値で」と前置きして答えます。
銘柄の特定は、次の3通りにしました。
- よく聞く名前: 日経平均・NYダウ・S&P500・ナスダック・ドル円・ビットコインや、主要な銘柄を、名前とコードの対応表で引く
- 4桁の数字: 「株」「銘柄」「コード」と一緒に出てきた4桁は、東証の銘柄コードとして扱う(「2026年」のような年は除外)
- 英字のティッカー: 「株」と一緒に出てきた大文字の英字(NVDAなど)は米国株として扱う
どれにも当てはまらない銘柄は、契約内のAIへ回します。そのときは「株価はGoogle Finance、ニュースはGoogle Newsを優先して参照し、値と時刻を示す」「取得できないと答えず、必ず検索する」と指示するようにしました。
ニュースも同じ形にした
ニュースも、Googleアカウントと連携していないときは中身が空でした。Google NewsはRSS(更新情報の配信形式)を公開していて、キーワード検索もできます。「半導体の最新ニュース」で試すと、8件の見出しが出典・日時つきで取れました。これもサーバーが直接取得して、ローカルLLMに渡す形にしています。
わたしが学んだこと
AIが「できません」と答えたとき、まず疑うべきはAIではなく、AIに何を渡したかでした。今回は、渡すべきデータを渡さず、渡すべき場所にも回していなかった。答えられないのは当然です。
そして、振り分けの条件は「部分一致で拾えているつもり」になりやすい。「株価」が「価格」を含まないことは、書いた時点では気づきませんでした。今回、株価の質問が正しく振り分けられることを確かめる自動テストも追加しています。
このシリーズの記事
前回: E.D.E.N.開発ログ #5|音声が出るまで174秒かかっていた原因は、Google Driveに置いたPython環境だった
E.D.E.N.の全体像と、開発ログの一覧は「E.D.E.N.とは|開発ログ一覧」にまとめています。


コメント