## TOKIUM AI照合システム
発注書と請求書の照合作業を自動化するWebアプリケーション。
### チーム構成
- PdM 1名: 要件定義・優先順位決定
- リーダー 1名: コードレビュー・アーキテクチャ判断
- 私: インフラ・認証基盤以外の全機能の設計・実装
### 技術スタック
- フロントエンド: Next.js 14 (App Router) / TypeScript / TanStack Query / Zustand / Tailwind CSS
- バックエンド: Ruby on Rails 8 / RSpec / PostgreSQL
### 担当範囲
- フロントエンドからバックエンドまで全レイヤーを一貫して担当
- インターン生のコードレビュー
---
### 主な実装内容
#### 1. 照合エンジン
**【課題】**
発注書と請求書の照合処理において、LLMを活用するか従来のルールベースで実装するかの技術選定が必要だった。
**【工夫】**
以下の理由からルールベースのロジックを選択:
- 精度: 金額・日付など数値比較が中心であり、決定論的なロジックの方が100%の再現性を担保できる
- 速度: LLM API呼び出しのレイテンシ(数百ms〜数秒)に対し、コードベースなら数ms以内で処理完了
- コスト: 大量データの照合でAPI課金が膨らむリスクを回避
具体的な設計:
- 複合キー機能: 単一フィールドだけでなく、複数フィールドの組み合わせ(例: 取引先名+発注番号)でマッチング可能に。compound_groupとpriorityで柔軟にグルーピング
- 演算子の多様化: =, >, <, >=, <=, contains, starts_with, ends_withなど8種類の比較演算子を実装
- 文字列正規化: トリム、置換、大文字小文字変換などの前処理をStringOperatableモジュールとして共通化
- 集計処理: 複数明細の合計・最大値・最小値での比較に対応
**【成果】**
- LLM利用時と比較してAPI費用ゼロ、レスポンス時間を大幅短縮
- ルールの組み合わせで多様な照合パターンに対応可能な拡張性を実現
---
#### 2. カラム自動マッピング機能
**【課題】**
顧客ごとにCSVのカラム名が異なる(「伝票番号」「doc_no」「発注書番号」など表記揺れが多数)。毎回手動でマッピングするのは非効率で、特に初回インポート時のUXが悪い。LLMで自然言語処理するか、ルールベースで実装するかの技術選定が必要だった。
**【工夫】**
LLMではなくルールベース+類似度アルゴリズムを採用。理由は照合エンジンと同様(精度・速度・コスト)。
具体的な実装:
- Jaro-Winkler距離: 文字列の類似度を0〜1で算出。共通接頭辞にボーナスを与えることで「伝票番号」と「伝票No」のような表記揺れに対応
- 3段階マッチング: 完全一致(正規化後)→ 部分一致(キーワード包含)→ あいまい一致(閾値0.85以上)の優先度で判定
- グローバル最適化: 全フィールド×全CSVヘッダーの組み合わせでスコア計算し、スコア順にソート。重複を回避しながら最適な割り当てを決定
- 文字列正規化: BOM削除、全角→半角変換、大文字→小文字変換、スペース除去などで表記揺れを吸収
- キーワード辞書: 35フィールドに対して200以上のキーワードを定義。顧客ごとの固有フォーマット(例: ラクスル)にも対応
**【成果】**
- 初回インポート時のマッピング作業を大幅に削減
- 信頼度スコア表示により、ユーザーが確認すべき箇所を明示
- 新規顧客のCSVフォーマットにもキーワード追加のみで対応可能な拡張性を実現
---
#### 3. テンプレート管理機能
**【課題】**
照合設定(キー・ルール)を都度手動で設定するのは非効率。一方で、組織ごとに異なる照合ルールを柔軟に保存・共有・適用できる仕組みが必要だった。また「手動設定」と「テンプレートからの適用」を両立させるDB設計が難航。
**【工夫】**
- テンプレートと現在設定の分離: template_idがNULLのレコードを「現在の手動設定」、テンプレートに紐づくレコードを「保存済み設定」として区別。これによりテンプレート適用・解除を柔軟に切り替え可能に
- マルチテナント対応: root_group_idで組織単位のデータ分離を実現。スコープ(for_root_group)で常にテナント境界を意識したクエリを強制
- ソフトデリート: is_deletedフラグによる論理削除で、誤削除時の復元や監査証跡の保持に対応
- 設定のコピー・複製: create_from_current_settingsやapply_to_current_settingsで現在設定⇔テンプレート間の双方向変換を実装
**【成果】**
- 一度作成した照合ルールをワンクリックで再利用可能に
- 組織内でのテンプレート共有により、新規ユーザーのオンボーディング工数を削減
---
### 出したバリュー
- 入社半年で170件のPRをマージ、主要機能の大部分を単独で設計・実装
- 機能単位でフロント〜バックエンドを一貫して担当し、仕様理解から実装まで一気通貫で完結
- API呼び出し最適化(TanStack Queryのキャッシュ活用)、ハイドレーションエラー修正などパフォーマンス改善にも注力