mcpField
S
semantic-search-cwicr

semantic-search-cwicr

github.com/datadrivenconstruction数据与数据库375107 次安装1 周前更新
代码仓库

关于 semantic-search-cwicr

DDC CWICR 语义搜索工具使用多语言向量检索,从建筑成本数据库中查找相关施工项目,适用于估算人员和构建成本估算流程的开发者。

主要功能

  1. 01跨 26 种语言进行语义搜索
  2. 02覆盖 8 个国家基准库及全球库
  3. 03支持类别筛选和相似度评分
  4. 04提供供成本估算使用的项目数据

适用场景

  1. 01用自然语言查找施工项目
  2. 02为 BIM 构件匹配成本项目
  3. 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 种语言 进行多语言语义搜索;每个国家级数据库还包含 48 个经过 PPP 重新定价的市场目录。

业务价值
  • 与人工搜索相比,查找工作项的速度提升 90%
  • 支持多种语言:阿拉伯语、保加利亚语、中文、克罗地亚语、捷克语、丹麦语、荷兰语、英语、芬兰语、法语、德语、印地语、印尼语、意大利语、日语、韩语、蒙古语、挪威语、波兰语、葡萄牙语、罗马尼亚语、俄语、西班牙语、瑞典语、泰语、土耳其语、越南语
  • 通过查找语义相似的条目而非仅匹配关键词,提高准确性

数据概况(2026)

国家级数据库区域 ID条目数
土耳其(Birim Fiyat)TR_NATIONAL22,704
中国(Beijing Dinge + Bole)ZH_CHINA11,312
巴西(SINAPI)BR_NATIONAL9,723
西班牙(BCCA Andalucía)ES_ANDALUCIA6,453
意大利(Prezzario Toscana)IT_TOSCANA5,836
越南(Dinh Muc)VN_NATIONAL4,299
印度尼西亚(AHSP)ID_NATIONAL2,784
希腊(GGDE)GR_NATIONAL2,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(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_codestring唯一工作项代码(例如 15.115.1008)
rate_original_namestring源语言描述
rate_final_namestring显示用/翻译后的描述
rate_unitstringm²、m³、m、kg、Ad、Sa…
total_cost_per_positionfloat单位总价
total_resource_cost_per_positionfloat资源总和(加成前)
collection_name / department_name / section_name / subsection_namestring分类层级
category_typestring标准化类别(例如 CONSTRUCTION WORK)
resource_name / resource_quantity / resource_price_per_unit_current / resource_costmixed组成项明细
is_material / is_machine / is_laborbool组成项性质标记

使用示例

基本搜索
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")

最佳实践

  1. 使用具体查询 - “reinforced concrete slab 200mm”比“concrete”更有效
  2. 按类别筛选 - 将结果限定为相关工作类型
  3. 检查相似度分数 - 分数较低时需要人工核验
  4. 与 QTO 结合使用 - 使用 BIM 工程量进行自动估算
  5. 注意系数基准 - 越南和印度尼西亚没有价格(费率为 0);请通过市场资源表为其定价
  6. 以来源列为准 - rate_original_name 保存源文本;翻译位于 rate_final_name

资源

评论

支持 Markdown