ベクトルDBとMLOpsを活用したAIエージェント

# はじめに（Why）
投資判断に必要なデータは、日々の株価、企業ニュース、経済指標など多岐にわたります。
このような複雑な判断プロセスを「AIエージェント」に委ねる構成が注目されています。

本記事では、複数の専門エージェントを連携させた「投資判断AIエージェントシステム」の実装パターンについて紹介します。
yfinance、ChromaDB、LangGraph、MLflow、FastAPI などを用いて、LLMと構造化データを組み合わせた構成を実現しました。

# AIエージェントとは？
エージェント構成の考え方
投資において「ニュースも見るし、チャートも見るし、決算も見る」──人間の投資判断もマルチソースです。
これを以下のようにモジュール化したのが本プロジェクトのAIエージェント構成です。

```text

├── 短期テクニカル分析Agent（yfinanceで価格取得 + テクニカル指標計算）
├── ニュース・センチメント分析Agent（GoogleNews + Gemini要約）
├── ボラティリティ分析Agent（ATR指標を算出）
├── 中期ファンダメンタル分析Agent（PER, PBR, EPS, 売上成長率など）
├── マクロ経済要因分析Agent（FRED, IMF, FRB, 日銀など）
└── 投資評価統合Agent（LangGraphでワークフロー定義）
```

# 使用技術と構成（How）
使用ライブラリ一覧

| 技術/ライブラリ |用途 |
|:-----------|:------------|
| yfinance       | 株価の取得とテクニカル指標（移動平均、MACD、RSI）に使用        |
| ChromaDB     | ニュースや決算情報をベクトル検索して文脈情報をLLMに供給      |
| LangGraph       | 各エージェントの呼び出し制御（評価フローの設計）に使用        |
| MLflow         | モデルの保存・呼び出し・ステージ管理          ||
| FastAPI       | API化して各エージェントを独立動作させる       |
| Docker Compose   | 環境を統一・再利用できる構成に     | 


# 実装内容とコード解説
## 1. yfinance による株価データ取得とテクニカル指標の計算
```python
import yfinance as yf
import pandas as pd

def get_technical_indicators(symbol: str):
    df = yf.download(symbol, period="3mo", interval="1d")
    df['MA5'] = df['Close'].rolling(window=5).mean()
    df['MA20'] = df['Close'].rolling(window=20).mean()
    df['RSI'] = compute_rsi(df['Close'])
    df['MACD'] = df['Close'].ewm(span=12).mean() - df['Close'].ewm(span=26).mean()
    return df.tail(1)  # 最新データのみ返す
```
## 2. ChromaDB によるニュース文書のベクトル検索
```python
from chromadb import Client
from chromadb.config import Settings
from sentence_transformers import SentenceTransformer

chroma_client = Client(Settings(chroma_db_impl="duckdb+parquet"))
collection = chroma_client.get_or_create_collection("news")

# ニュースの格納
def store_news(documents):
    embeddings = SentenceTransformer("all-MiniLM-L6-v2").encode(documents)
    collection.add(documents=documents, embeddings=embeddings)

# 検索
def search_related_news(query: str):
    query_embedding = SentenceTransformer("all-MiniLM-L6-v2").encode([query])
    return collection.query(query_embeddings=query_embedding, n_results=3)
```
- ここで取得した「類似ニュース文」をLLM（Gemini）に要約させ、Agentに渡します。

## 3. LangGraph によるエージェント評価フローの定義
```python
from langgraph.graph import StateGraph

builder = StateGraph()

builder.add_node("tech", tech_agent)
builder.add_node("news", news_agent)
builder.add_node("volatility", atr_agent)
builder.add_node("fundamentals", fundamental_agent)
builder.add_node("macro", macro_agent)
builder.add_node("score", evaluate_agent)

builder.set_entry_point("tech")
builder.add_edge("tech", "news")
builder.add_edge("news", "volatility")
builder.add_edge("volatility", "fundamentals")
builder.add_edge("fundamentals", "macro")
builder.add_edge("macro", "score")
```

- 順に処理を流す評価フローを明示的に構成。
- 将来的にはAgentの応答によって次ノードを変える「if分岐」なども可能です。

## 4. MLflow × FastAPIでモデルの呼び出し
```python
import mlflow.sklearn

model = mlflow.sklearn.load_model("models:/atr_predictor/Production")

@app.post("/predict/atr")
def predict_volatility(data: PriceData):
    df = pd.DataFrame([data.dict()])
    return {"atr": model.predict(df)[0]}
```

- これにより、ボラティリティ分析Agentはステージングされたモデルを使用して予測。
- MLflow UIを使えば、モデル更新・履歴管理が視覚的に操作可能です。

# 工夫した観点（What was clever?）

- モジュール化とAPI分割
    - 各AgentはFastAPIで独立起動できるAPIとして構成 → 開発・検証がしやすい
    - Docker Composeにより再現性のあるエージェント環境を構築可能

- Gemini活用とRAG（検索強化生成）
    - Gemini APIを使って「要約・評価」を行い、RAGにより文脈誤爆を低減
    - 投資対象企業のIRやニュースをChromaで埋め込み→検索→要約という流れを自動化

- LangGraphによるワークフローの明示化
- 各Agentの順序・関係性がコードで明確に管理され、将来的な** 拡張（並列処理、分岐）** も容易


# So what：この構成が実務でどう役立つのか？
- 複数視点の分析を統合する実践的構成を試せる
- LLM + データ分析の融合構成（＝投資AI以外にも応用可能）
- 小規模チームや個人でも、PoC・プロトタイプが短時間で構築可能

# 今後の展望
- Slack連携やチャットボット化による対話型インターフェース
- モデル監視（Prometheus + Grafana）とパフォーマンス可視化
- Agentの意思決定プロセス可視化（LIME, SHAP）

# GitHub & 参考リンク
[GitHub](https://github.com/ebasuke226/investAgent/)
[MLflow](https://mlflow.org)
[LangGraph](https://github.com/langchain-ai/langgraph)
[ChromaDB](ttps://www.trychroma.com/)
[yfinance](https://pypi.org/project/yfinance/)
[GitHub](https://github.com/ebasuke226/investAgent/)

この構成が「AIエージェントの構築を通じて、どうLLMやMLOpsを実務に活かすか？」のヒントになれば幸いです。