ブログに戻る
tutoriallangchainai-agents

LangChainエージェントに日本の財務データを5分で接続する

Onkar Dahale

LangChainのエージェントはWikipediaを検索し、Webを閲覧し、Pythonを実行できる。でもトヨタの売上推移を聞くと、ハルシネーションするか「金融データベースにアクセスできません」と返す。

日本の財務データに対応したLangChainツールキットがないからだ。

langchain-axioraを作った。18ツール、Retriever、4,125社、10年分のEDINET有報データ。エージェントに売上高、純利益、ROE、健全性スコア、競合比較、有報の英訳セクションへのアクセスを与える。

インストールから最初のエージェント起動まで5分。

LangChain + Axiora:18ツール、4,125社

インストール

uv add langchain-axiora langchain-anthropic langgraph

APIキーを設定:

export AXIORA_API_KEY="ax_live_..."
export ANTHROPIC_API_KEY="sk-ant-..."

最初のエージェント:6行

from langchain_axiora import AxioraToolkit
from langchain_anthropic import ChatAnthropic
from langgraph.prebuilt import create_react_agent

toolkit = AxioraToolkit()
agent = create_react_agent(ChatAnthropic(model="claude-sonnet-4-20250514"), toolkit.get_tools())

result = agent.invoke({"messages": [{"role": "user", "content": "トヨタとホンダの過去3年の財務データを比較して"}]})

これだけ。エージェントが企業を検索し、財務データを取得し、比較する — ツール呼び出しを自動で連鎖。

エージェントの動作

「トヨタとホンダの過去3年の財務データを比較して」と聞いたときの内部動作。エージェントは3回のツール呼び出しを行う:

1. axiora_get_financials → トヨタ (7203)

{
  "fiscal_year": 2025,
  "revenue": 48036704000000,
  "net_income": 4789755000000,
  "operating_margin": 9.98,
  "roe": 12.99,
  "num_employees": 383853
}

2. axiora_get_financials → ホンダ (7267)

{
  "fiscal_year": 2025,
  "revenue": 21688767000000,
  "net_income": 903034000000,
  "operating_margin": 5.59,
  "roe": 7.15,
  "num_employees": 194173
}

3. エージェントが分析

トヨタの売上高(¥48.0兆)はホンダ(¥21.7兆)の2.2倍。FY2023〜FY2025でトヨタは29%増収、ホンダは28%増収。だが利益率の差は歴然:トヨタの営業利益率は9.98%、ホンダは5.59%。ROEもトヨタの12.99%がホンダの7.15%をほぼ倍。

監査済みEDINET有報の実数値。ハルシネーションではない。

18ツール

エージェントが呼び出せる全ツール:

ツール機能
axiora_search_companies企業名(日/英)、証券コードで検索
axiora_get_company企業詳細 — セクター、上場区分、決算期
axiora_get_financials売上高、利益、資産、自己資本、各種比率
axiora_get_growth前年比成長率、3/5年CAGR
axiora_get_ranking任意の指標でランキング
axiora_get_sector_overviewセクター別の統計と企業数
axiora_compare_companies2〜5社の財務データを並列比較
axiora_screen_companiesセクター、売上高、ROE、PERでフィルタ
axiora_get_health_score財務健全性スコア(0〜100)、内訳付き
axiora_get_health_ranking健全性スコアでランキング
axiora_get_peersセクター・売上規模が近い類似企業を検索
axiora_get_timeseriesチャート用の時系列データ
axiora_list_filings企業・種別で提出書類を一覧
axiora_get_translations有報セクションの英訳を取得
axiora_search_translations英訳の全文検索
axiora_get_filing_calendar月別の提出件数
axiora_search_companies_batch一括検索(最大10社)
axiora_get_coverageデータカバレッジ統計

18ツール — 日本の財務分析は3月決算、3つの会計基準(J-GAAP、IFRS、US-GAAP)、XBRLの複雑なタクソノミへの対応が必要だから。

必要なツールだけ使う

シンプルなエージェントに18ツールは多すぎる。selected_toolsで絞り込み:

toolkit = AxioraToolkit(
    selected_tools=[
        "axiora_search_companies",
        "axiora_get_financials",
        "axiora_compare_companies",
    ],
)

3ツール。「トヨタとホンダを比較して」には対応できる。スクリーニングやランキングはできない。存在しないツール名を渡すとValueErrorで有効なリストが返る — サイレントに無視されることはない。

実用例:高ROE企業を探す

複数ツールを連鎖させるプロンプト:

result = agent.invoke({"messages": [{"role": "user", "content": """
ROE15%以上の日本企業を探して。
上位3社の健全性スコアを取得し、財務データを比較して。
"""}]})

エージェントの動作:

  1. axiora_screen_companiesをmin_roe=15で呼び出し — 東京海上(ROE 20.65%)、ファーストリテイリング(19.73%)、リクルート(25.08%)を発見
  2. 各社のaxiora_get_health_scoreを取得
  3. axiora_compare_companiesで並列比較
  4. 収益性と財務健全性の最適な組み合わせを分析

4回のツール呼び出しが自動連鎖。スクリーニングロジックを1行も書いていない。

Retriever:有報の英訳でRAG

すべてのユースケースにエージェントが必要なわけではない。有報の英訳でRAGを構築するなら、AxioraRetrieverが翻訳セクションを検索してLangChainのDocumentオブジェクトを返す:

from langchain_axiora import AxioraRetriever

retriever = AxioraRetriever(section="risk_factors", k=5)
docs = retriever.invoke("semiconductor supply chain risk")

各ドキュメントにpage_content(翻訳テキスト)とmetadata(企業名、ドキュメントID、セクション)が含まれる。任意のチェーンに接続できる:

from langchain_anthropic import ChatAnthropic
from langchain_core.prompts import ChatPromptTemplate
from langchain_core.runnables import RunnablePassthrough

llm = ChatAnthropic(model="claude-sonnet-4-20250514")
prompt = ChatPromptTemplate.from_template(
    "以下の有報抜粋に基づいて回答してください:\n{context}\n\n質問: {question}"
)
chain = {"context": retriever, "question": RunnablePassthrough()} | prompt | llm

result = chain.invoke("日本のメーカーが報告している半導体リスクは?")

5社のリスクファクターを取得・統合。海外チームとの共有や、英語ベースの分析パイプラインに使える。

ツールキットなしで個別ツールを使う

エージェントもRetrieverも不要なら、ツールを直接使用:

from langchain_axiora import GetFinancialsTool

tool = GetFinancialsTool()  # 環境変数AXIORA_API_KEYから読み取り
result = tool.invoke({"code": "7203", "years": 3})

すべてのツールがapi_key=を直接受け取るか、環境変数AXIORA_API_KEYから読み取る。ラッパーオブジェクト不要。

エラーハンドリング

全ツールがhandle_tool_error=Trueを設定。APIがエラーを返すと、エージェントはクラッシュせずヒントメッセージを受け取る:

Axiora API error 404. Company not found. Use axiora_search_companies to find the correct code.

エージェントはこのメッセージを読み、axiora_search_companiesを呼び出し、正しいコードを取得してリトライする。クラッシュではなく自己修正。

データの出所

すべての数値は監査済みEDINET有報(有価証券報告書)から取得。3つの会計基準を横断してXBRLをパースし、型付きJSONで配信。

4,125社。最大10年分の履歴。提出から30分以内に更新。

はじめる

uv add langchain-axiora