更新词库,添加同义词和描述,删除冗余条目,优化意图识别逻辑,调整向量检索参数.

This commit is contained in:
2025-06-06 13:54:01 +08:00
parent d4d891e5bb
commit bdb190d9a1
12 changed files with 90 additions and 86 deletions
+10 -14
View File
@@ -62,7 +62,8 @@
{
"name": "博微储能计价通C1软件",
"synonymous": [
"储能C1软件"
"储能C1软件",
"储能软件"
],
"description": "用于锂离子电池储能工程编制的软件"
},
@@ -11522,7 +11523,8 @@
"synonymous": [
"配网D3",
"配网软件D3",
"配网计价通D3"
"配网计价通D3",
"配网软件"
],
"description": ""
},
@@ -22480,13 +22482,6 @@
],
"description": "功能模块,用于在工程量界面或材机分析界面中快速查找、定位指定的工程量明细或消耗量,并进行修改。当工程量较多时,可通过右侧搜索框输入查询条件快速定位。"
},
{
"name": "编码",
"synonymous": [
"清单编码"
],
"description": "唯一标识符,用于标识工程量、一笔性费用或工程量清单项目。"
},
{
"name": "规格型号",
"synonymous": [],
@@ -25678,13 +25673,14 @@
},
{
"name": "工程量清单",
"synonymous": [
"清单",
"zwqd文件",
"招标工程量清单"
],
"synonymous": [],
"description": "工程项目中的具体工作项及其数量的详细清单,是业务专用术语。通常由招标方提供,用于招标、投标报价或记录工程项目中各部分工程量的详细信息,包括所需材料、设备、人工等明细。软件格式后缀为zwqd,可用于核对工程量或作为转换后的工程文件类型。"
},
{
"name": "清单",
"synonymous": [],
"description": ""
},
{
"name": "数量系数",
"synonymous": [
Binary file not shown.
Binary file not shown.
@@ -4,7 +4,8 @@
"synonymous": [
"配网D3",
"配网软件D3",
"配网计价通D3"
"配网计价通D3",
"配网软件"
],
"description": ""
},
@@ -1014,6 +1015,11 @@
"synonymous": [],
"description": ""
},
{
"name": "清单",
"synonymous": [],
"description": ""
},
{
"name": "迁改插件",
"synonymous": [],
@@ -11142,10 +11142,7 @@
},
{
"name": "工程量清单",
"synonymous": [
"清单",
"zwqd文件"
],
"synonymous": [],
"description": "工程项目中的具体工作项及其数量,简称工程量清单,是业务专用术语。用于招标或记录工程项目中各部分工程量的详细清单文件,包括所需材料、设备和人工等,软件格式后缀为zwqd。"
},
{
@@ -9,11 +9,6 @@
"synonymous": [],
"description": "报表的编制规范,如P128页规定的表一金额单位为“万元”"
},
{
"name": "编码",
"synonymous": [],
"description": "一笔性费用的唯一标识码"
},
{
"name": "名称",
"synonymous": [],
@@ -107,7 +107,8 @@
{
"name": "博微储能计价通C1软件",
"synonymous": [
"储能C1软件"
"储能C1软件",
"储能软件"
],
"description": "用于锂离子电池储能工程编制的软件"
},
@@ -1683,11 +1684,6 @@
"synonymous": [],
"description": "在工程量界面快速查找指定的工程量"
},
{
"name": "编码",
"synonymous": [],
"description": "工程量的唯一标识符"
},
{
"name": "项目名称",
"synonymous": [],
@@ -4099,10 +4099,8 @@
"description": "用于设计和自定义报表的界面,包括设计报表内容和格式的功能,提供进入报表设计界面的功能入口。"
},
{
"name": "编码",
"synonymous": [
"清单编码"
],
"name": "清单编码",
"synonymous": [],
"description": "定额行的关键字段,工程量清单项目的唯一标识符"
},
{
@@ -9910,10 +9910,7 @@
},
{
"name": "工程量清单",
"synonymous": [
"招标工程量清单",
"清单"
],
"synonymous": [],
"description": "业务专用术语,指工程项目中各项工作的详细列表,包括所需的材料和施工内容。通常由招标方提供,用于展示工程项目的物料消耗量,详细列出工程项目及其数量,用于招标和计价。"
},
{
@@ -206,7 +206,7 @@ class IntentRecognizer:
try:
# 对matched_terms中的每个关键字进行向量检索
for current_key in query_keys:
vector_results = self.noun_retriever.query(current_key, top_k=3, use_intersection=True)
vector_results = self.noun_retriever.query(current_key, top_k=5, use_intersection=False)
current_key_terms = set()
# 添加向量检索结果
for result in vector_results:
@@ -391,6 +391,8 @@ class IntentRecognizer:
return None
count=1
def _fill_slots_with_llm(self, query: str, classification: Classification, slot_model_class: type) -> Any:
"""
使用LLM进行槽位填充
@@ -405,7 +407,6 @@ class IntentRecognizer:
"""
# 准备提示词
slot_parser = PydanticOutputParser(pydantic_object=slot_model_class)
model_schema = json.dumps(slot_model_class.model_json_schema(), ensure_ascii=False)
formatted_prompt = slot_filling_prompt.format(
query=query,
@@ -167,13 +167,13 @@ class ProfessionalNounVectorizer:
})
if len(synonymous) > 0:
synonyms_str = ', '.join(synonymous)
texts.append(synonyms_str.strip())
metadatas.append({
"name": name,
"synonymous": synonymous,
"description": description
})
for synonyms_str in synonymous:
texts.append(synonyms_str.strip())
metadatas.append({
"name": name,
"synonymous": synonymous,
"description": description
})
if len(description) > 0:
texts.append(description.strip())
@@ -306,7 +306,11 @@ class ProfessionalNounRetriever:
set3 = set(json.dumps(i.metadata, sort_keys=True, ensure_ascii=False)
for i in retriever3.invoke(query_text))
intersection = set1 | set2 | set3
# 如果use_intersection为True,取交集;否则取并集
if use_intersection:
intersection = set1 & set2 & set3
else:
intersection = set1 | set2 | set3
# 如果交集为空,使用第一种检索方式的结果
if not intersection:
+52 -38
View File
@@ -12,8 +12,8 @@ extract_nouns_prompt="""
请根据用户问题自动识别核心关键词,并按照以下规则输出:
1. 只输出最终关键词列表,不要解释说明
2. 关键词提取范围包括但不限于以下内容:
- 软件相关:功能模块/操作步骤/报错提示/扩展名后缀名
- 造价专业:费用类型/计算标准/行业规范
- 软件相关:软件名称/功能模块/操作步骤/报错提示/扩展名后缀名
- 造价专业:费用类型/计算标准/行业规范/文件
- 电力工程:项目类型/设备型号/工程阶段
3. 自动展开缩写(如将'导excel'转为'导入Excel'
4. 严格基于用户问题提取关键词,不要输出与用户问题无关的关键词
@@ -75,29 +75,45 @@ classification_prompt="""
query_rewrite_prompt = """
你是一名电力造价专业问答优化工程师,负责通过多维度信息整合重构用户问题以提升知识库检索准确率。请严格遵循以下流程处理:
# 电力造价专业问答优化工程师
# 任务处理框架
## 第一阶段:输入分析
你是一名电力造价专业问答优化工程师,负责通过多维度信息整合重构用户问题以提升知识库检索准确率。
## 核心任务
将用户的原始问题结合专业术语库进行规范化重构,提高知识库检索的准确性和专业性。
## 处理流程
### 第一阶段:输入解析
1. 解析基础信息
- 原始问题(需保留核心语义){query}
- 关键词集合:{keywords}
## 第二阶段:语义匹配验证
2. 执行关键词校验
- 建立意图关联矩阵,验证关键词与原始问题的语义一致性
- 若存在≥1个有效关联词 → 进入重构流程
- 若无有效关联 → 直接输出原始问题
### 第二阶段:匹配分析
**匹配规则:**
1. 检查原始问题中是否包含关键词集合中的`name`字段或`synonymous`字段中的任何词汇
2. 统计匹配的术语数量
3. 判断执行路径:
- 匹配术语 ≥ 1个 → 执行重构流程
- 匹配术语 = 0个 → 直接输出原始问题
## 第三阶段:专业重构
3. 术语规范化处理
a. 实施术语映射:将口语表达替换为知识库标准术语,优先保留原问题中的术语
b. 执行结构优化:
- 采用【术语标记】规范标注关键概念
- 构建主谓宾明确的问题句式
- 保持原问题时态与语态特征, 保留5W2H问题特征
- 执行同义词替换:将synonymous中的同义词替换为对应name字段的标准术语
### 第三阶段:问题重构
**重构原则(按优先级排序):**
1. **语义保真**:严格保持原问题的核心意图和诉求
2. **术语规范**
- 将匹配到的同义词替换为对应的标准术语(name字段)
- 对在关键词中的标准术语使用【】进行标记
- 保留在原问题中未在关键词库中的专业术语、限定词和修饰词
3. **结构优化**
- 保持原问题的语态特征5W2H
- 保持主谓宾结构清晰
- 保留时间、版本等限定条件
**术语处理规则:**
- 优先级1:保留原问题中的专业术语、限定词和修饰词(即使不在关键词库中)
- 优先级2:将同义词替换为标准术语并用【】标记
- 优先级3:对原问题中已存在的标准术语添加【】标记
# 输出规范
{output_format}
@@ -116,22 +132,20 @@ query_rewrite_prompt = """
输出:
{{"rewrite":"程序界面文字显示过小如何处理?"}}
# 质量约束条款
1. 语义内容保真原则
- 禁止修改原问题核心诉求(如转换主语/变更操作对象)
- 保留原始问题的限定条件(包括:软件名称等)
▶ 案例3(部分匹配,但保留修饰限定词)
输入:
原始问题:"配网软件D3能导出清单的计算公式吗?
关键词:【'配网工程计价通D3软件', '计算式'
输出(保留限定修饰词"清单")
{{"rewrite":"【配网工程计价通D3软件】能导出清单的【计算式】吗?"}}
2. 术语使用规范
- 仅使用检索返回的关键词进行术语替换
- 新增术语必须来自关键词集合
3. 结构优化标准
- 必须包含≥1个【标注术语】
- 禁止添加解释性语句
4. 异常处理机制
- 当关键词与问题无明显关联时,触发直通输出规则
- 出现术语冲突时优先保留原始表述
## 质量检查清单
执行前请确认:
- [ ] 是否保持了原问题的核心诉求?
- [ ] 是否正确执行了同义词替换?
- [ ] 是否保留了原问题中的专业术语和限定条件?
- [ ] 是否正确使用了【】标记?
- [ ] 重构后的问题是否自然流畅?
"""
slot_filling_prompt = """
@@ -154,15 +168,15 @@ slot_filling_prompt = """
4. 只输出符合格式的JSON数据,不要有任何额外的解释
【示例】
用户问题: "我的西藏Z1软件安装后闪退,提示缺少组件,怎么解决?"
用户问题: "我的西藏Z1软件,新建工程报错:找不到许可证,怎么解决?"
分类: 软件问题/故障排查
输出:
{{
"software_name": "西藏Z1软件",
"function_name": "软件安装",
"error_message": "闪退,提示缺少组件",
"software_name": "西藏电力工程计价通Z1软件",
"function_name": "新建工程",
"error_message": "报错:找不到许可证",
"software_version": null,
"os_version": null,
"reproduction_steps": "软件安装后"
"reproduction_steps": "新建工程"
}}
"""