11日目:機能の改善

はい、Qiita向けに初学者でも分かりやすい記事を作成いたします。

# ChromaDBとAzure OpenAIを使った文書管理システムの作り方

## はじめに
この記事では、ChromaDBとAzure OpenAIを使って、文書を管理・検索できるシステムを作る方法を解説します。FastAPIでバックエンド、Streamlitでフロントエンドを実装し、文書の類似度検索を可能にします。

## 環境
- Python 3.9
- ChromaDB 0.6.0
- FastAPI
- Streamlit
- Azure OpenAI

## プロジェクト構造
```
chroma-test-project/
├── data/
│   └── chroma_db/  # ChromaDBのデータ保存先
├── src/
│   ├── api/
│   │   └── app.py  # FastAPI アプリケーション
│   └── ui/
│       └── streamlit_app.py  # Streamlit UI
├── tests/
│   └── test_embeddings.py  # テストコード
├── requirements.txt
└── .env  # 環境変数設定
```

## セットアップ手順

1. **仮想環境の作成**
```bash
python -m venv venv
source venv/bin/activate  # Windowsの場合: venv\Scripts\activate
```

2. **必要なパッケージのインストール**
```bash
pip install -r requirements.txt
```

3. **環境変数の設定**
`.env`ファイルを作成し、以下の内容を設定：
```
AZURE_OPENAI_KEY=your_key_here
AZURE_OPENAI_ENDPOINT=your_endpoint_here
AZURE_OPENAI_DEPLOYMENT=your_deployment_here
```

## 主要コンポーネントの解説

### 1. FastAPI バックエンド (app.py)

```python
from fastapi import FastAPI, HTTPException
from typing import Optional, List, Dict
import chromadb
from openai import AzureOpenAI

app = FastAPI(title="ChromaDB API")

# ChromaDBクライアントの初期化
client = chromadb.PersistentClient(path="./data/chroma_db")

# Azure OpenAIを使用した埋め込みベクトル生成
async def generate_embeddings(texts: List[str]) -> List[List[float]]:
    try:
        response = azure_client.embeddings.create(
            model=os.getenv("AZURE_OPENAI_DEPLOYMENT"),
            input=texts
        )
        return [item.embedding for item in response.data]
    except Exception as e:
        raise HTTPException(status_code=500, detail=str(e))

# エンドポイント例：ドキュメント追加
@app.post("/collections/{collection_name}/add")
async def add_documents(collection_name: str, documents: List[str]):
    embeddings = await generate_embeddings(documents)
    collection = client.get_or_create_collection(name=collection_name)
    collection.add(
        documents=documents,
        embeddings=embeddings,
        ids=[f"doc_{i}" for i in range(len(documents))]
    )
    return {"status": "success"}
```

### 2. Streamlit フロントエンド (streamlit_app.py)

```python
import streamlit as st
import requests
import pandas as pd

st.title("文書管理システム")

# コレクション一覧の表示
def show_collections():
    response = requests.get("http://localhost:8000/collections")
    collections = response.json()
    for collection in collections["collections"]:
        st.write(f"📚 {collection['name']}")

# ドキュメントのアップロード
def upload_documents():
    files = st.file_uploader("ファイルをアップロード", type=["txt", "md"], accept_multiple_files=True)
    if files:
        for file in files:
            content = file.read().decode()
            response = requests.post(
                f"http://localhost:8000/collections/default/add",
                json={"documents": [content]}
            )
            st.success("アップロード完了！")
```

## 主な機能

1. **ドキュメント管理**
   - 文書のアップロード（単一/複数）
   - コレクション（フォルダ）の作成・削除
   - 文書の一覧表示

2. **検索機能**
   - テキストベースの検索
   - 類似度に基づく検索（Azure OpenAIのembedding機能を使用）

3. **エラーハンドリング**
   - ユーザーフレンドリーなエラーメッセージ
   - 適切なステータスコードの返却

## テスト

```python
import pytest
from fastapi.testclient import TestClient
from src.api.app import app

client = TestClient(app)

def test_add_documents():
    response = client.post(
        "/collections/test/add",
        json={"documents": ["テスト文書です"]}
    )
    assert response.status_code == 200
    assert response.json()["status"] == "success"
```

## アプリケーションの起動

1. **FastAPIサーバーの起動**
```bash
uvicorn src.api.app:app --reload
```

2. **Streamlitアプリの起動**
```bash
streamlit run src.ui.streamlit_app:py
```

## 発展的な使い方

1. **カスタムメタデータの追加**
```python
metadata = {
    "author": "山田太郎",
    "category": "技術文書",
    "date": "2024-01-20"
}
collection.add(documents=[text], metadata=[metadata])
```

2. **高度な検索クエリ**
```python
results = collection.query(
    query_texts=["検索したいテキスト"],
    n_results=5
)
```

## まとめ
このプロジェクトでは、ChromaDBとAzure OpenAIを組み合わせることで、高度な文書管理システムを構築しました。初学者の方でも理解しやすいように、基本的な機能から順を追って実装方法を解説しました。

## 参考資料
- [ChromaDB公式ドキュメント](https://docs.trychroma.com/)
- [FastAPI公式ドキュメント](https://fastapi.tiangolo.com/)
- [Streamlit公式ドキュメント](https://docs.streamlit.io/)
- [Azure OpenAI Service](https://learn.microsoft.com/ja-jp/azure/cognitive-services/openai/)

## 注意点
- Azure OpenAI Serviceの利用には、Azureアカウントと適切な設定が必要です
- 環境変数は適切に管理し、公開リポジトリにアップロードしないよう注意してください
- 本番環境での使用時は、適切なセキュリティ対策を実装してください