semantic-search-cwicr について
DDC CWICR の建設コストデータベースから、複数言語に対応したセマンティック検索で関連する施工項目を探すツールです。見積担当者やコスト見積もりワークフローを構築する開発者向けです。
主な機能
- 0126 言語でのセマンティック検索
- 028 つの国別基準とグローバル基準の検索
- 03カテゴリ絞り込みと類似度スコアの確認
- 04コスト見積もり用の項目データ取得
活用シーン
- 01自然言語で施工項目を検索
- 02BIM 要素にコスト項目を照合
- 03複数言語版から価格項目を検索
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ datadrivenconstruction/ ddc_skills_for_ai_agents_in_construction --skill semantic-search-cwicrインストール後、Claude Code で/semantic-search-cwicrを入力して読み込まれたか確認します。
同梱ファイルclaw.jsoninstructions.md
詳細
DDC CWICR データベースのセマンティック検索
ビジネスケース
問題点
建設コストの見積もりでは、大規模なデータベースから関連する作業項目を探す必要があります。従来のキーワード検索では、次のような場合にうまく機能しません。
- ユーザーが自然言語で作業を説明する
- 地域や言語によって用語が異なる
- 類似する作業項目で名称の付け方が異なる
解決策
DDC CWICR には、事前計算済みの埋め込み(BAAI/bge-m3、1024 次元)が用意されており、**8 つの国内データベース(78,228 項目)**に加え、30 市場のグローバルデータベースを対象に、26 言語で多言語セマンティック検索を実行できます。また、各国内データベースには PPP で再価格設定された 48 の市場カタログが含まれます。
ビジネス上の価値
- 手動検索と比べて、作業項目の検索を90%高速化
- 多言語対応:アラビア語、ブルガリア語、中国語、クロアチア語、チェコ語、デンマーク語、オランダ語、英語、フィンランド語、フランス語、ドイツ語、ヒンディー語、インドネシア語、イタリア語、日本語、韓国語、モンゴル語、ノルウェー語、ポーランド語、ポルトガル語、ルーマニア語、ロシア語、スペイン語、スウェーデン語、タイ語、トルコ語、ベトナム語
- キーワードの一致だけでなく、意味的に類似する項目を見つけることで精度を向上
データの概要(2026)
| 国内データベース | 地域 ID | 項目数 |
|---|---|---|
| トルコ(Birim Fiyat) | TR_NATIONAL | 22,704 |
| 中国(Beijing Dinge + Bole) | ZH_CHINA | 11,312 |
| ブラジル(SINAPI) | BR_NATIONAL | 9,723 |
| スペイン(BCCA Andalucía) | ES_ANDALUCIA | 6,453 |
| イタリア(Prezzario Toscana) | IT_TOSCANA | 5,836 |
| ベトナム(Dinh Muc) | VN_NATIONAL | 4,299 |
| インドネシア(AHSP) | ID_NATIONAL | 2,784 |
| ギリシャ(GGDE) | GR_NATIONAL | 2,647 |
各データベースには、95 列の CWICR マスタースキーマ(rate_code、rate_original_name、rate_final_name、rate_unit、total_cost_per_position、分類階層 collection/department/section/subsection/category、is_material/is_machine/is_labor フラグを含む resource_* の構成明細)に加え、26 言語版と 48 個の markets/*.csv カタログが含まれます。
最新のデータリリース:v0.4.0(リリースを参照)。
技術的な実装
前提条件
pip install qdrant-client pandas sentence-transformers
コレクション(2026)
ベクトルストアでは BAAI/bge-m3 を使用します(1 回のフォワードパスで 1024 次元の密ベクトル、スパースベクトル、ColBERT を生成、MIT ライセンス、100 以上の言語に対応)。本番環境のコレクション名は cwicr_{LANG}_v3 です(例:cwicr_tr_v3、cwicr_zh_v3)。VPS 規模のホストでは、ONNX-int8 版(gpahal/bge-m3-onnx-int8、約 700 MB)を使用します。
Python の実装
import pandas as pd
from qdrant_client import QdrantClient
from sentence_transformers import SentenceTransformer
class CWICRSemanticSearch:
def __init__(self, host="localhost", port=6333, lang="en"):
self.client = QdrantClient(host=host, port=port)
self.collection = f"cwicr_{lang}_v3"
self.model = SentenceTransformer("BAAI/bge-m3")
def search_work_items(self, query, limit=10):
vec = self.model.encode(query).tolist()
hits = self.client.search(
collection_name=self.collection,
query_vector=vec,
limit=limit,
)
return pd.DataFrame([{**h.payload, "score": h.score} for h in hits])
def search_by_category(self, query, category, limit=10):
vec = self.model.encode(query).tolist()
hits = self.client.search(
collection_name=self.collection,
query_vector=vec,
query_filter={"must": [{"key": "category", "match": {"value": category}}]},
limit=limit,
)
return pd.DataFrame([{**h.payload, "score": h.score} for h in hits])
OpenConstructionERP 内部での利用
このプラットフォームの costs モジュールでは、すでにセマンティックマッチングが利用できます。
POST /api/v1/costs/suggest-for-element— BIM 要素の内容に対して、コスト項目を順位付けします。/qdrant-search— クエリに対して多言語で候補を検索します。- SQL フォールバック(
GET /api/v1/costs/?q=...)は、Qdrant がなくても動作します。
データベーススキーマ(95 列のマスター)
ペイロードに含まれる主なフィールド:
| フィールド | 型 | 説明 |
|---|---|---|
rate_code | string | 一意の作業項目コード(例:15.115.1008) |
rate_original_name | string | ソース言語の説明 |
rate_final_name | string | 表示用または翻訳済みの説明 |
rate_unit | string | m²、m³、m、kg、Ad、Sa… |
total_cost_per_position | float | 単位あたりの合計価格 |
total_resource_cost_per_position | float | リソースの合計(マークアップ前) |
collection_name / department_name / section_name / subsection_name | string | 分類階層 |
category_type | string | 正規化されたカテゴリ(例:CONSTRUCTION WORK) |
resource_name / resource_quantity / resource_price_per_unit_current / resource_cost | mixed | 構成明細 |
is_material / is_machine / is_labor | bool | 構成要素の種類を示すフラグ |
使用例
基本的な検索
search = CWICRSemanticSearch(lang="tr")
# Natural language query
results = search.search_work_items("tuğla duvar örülmesi")
print(results[["rate_code", "rate_original_name", "total_cost_per_position", "score"]])
コスト見積もり
# Find work items for foundation work
foundation = search.search_work_items("reinforced concrete foundation", limit=20)
# Estimate with quantities (BIM takeoff)
quantities = {"15.115.1008": 150.0} # m³
total = sum(quantities[c] * row["total_cost_per_position"]
for _, row in foundation.iterrows() if row["rate_code"] in quantities)
print(f"Estimated: {total:,.2f} TRY")
ベストプラクティス
- 具体的なクエリを使用する - 「鉄筋コンクリートスラブ 200mm」は「コンクリート」よりも適切です
- カテゴリで絞り込む - 関連する作業種別に結果を絞り込みます
- 類似度スコアを確認する - スコアが低い場合は手動で検証する必要があります
- QTO と組み合わせる - BIM の数量を使用して見積もりを自動化します
- 係数の基準に注意する - ベトナムとインドネシアには価格がありません(単価は 0)。市場価格のリソースシートを使って価格を設定します
- ソース列を確認する -
rate_original_nameにはソースの表記が記録され、翻訳はrate_final_nameに記録されています
リソース
- GitHub: OpenConstructionEstimate-DDC-CWICR
- リリース: v0.4.0
- プラットフォーム: OpenConstructionERP
- Qdrant ドキュメント: https://qdrant.tech/documentation/