关于 semantic-search-cwicr
DDC CWICR 语义搜索工具使用多语言向量检索,从建筑成本数据库中查找相关施工项目,适用于估算人员和构建成本估算流程的开发者。
主要功能
- 01跨 26 种语言进行语义搜索
- 02覆盖 8 个国家基准库及全球库
- 03支持类别筛选和相似度评分
- 04提供供成本估算使用的项目数据
适用场景
- 01用自然语言查找施工项目
- 02为 BIM 构件匹配成本项目
- 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_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(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")
最佳实践
- 使用具体查询 - “reinforced concrete slab 200mm”比“concrete”更有效
- 按类别筛选 - 将结果限定为相关工作类型
- 检查相似度分数 - 分数较低时需要人工核验
- 与 QTO 结合使用 - 使用 BIM 工程量进行自动估算
- 注意系数基准 - 越南和印度尼西亚没有价格(费率为 0);请通过市场资源表为其定价
- 以来源列为准 -
rate_original_name保存源文本;翻译位于rate_final_name
资源
- GitHub:OpenConstructionEstimate-DDC-CWICR
- 发布版本:v0.4.0
- 平台:OpenConstructionERP
- Qdrant 文档:https://qdrant.tech/documentation/