diff --git a/data/nouns/merged_nouns.json b/data/nouns/merged_nouns.json index ee32889..7aaa2ab 100644 --- a/data/nouns/merged_nouns.json +++ b/data/nouns/merged_nouns.json @@ -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": [ diff --git a/data/nouns/professional_nouns_index/index.faiss b/data/nouns/professional_nouns_index/index.faiss index 43682f6..e428f81 100644 Binary files a/data/nouns/professional_nouns_index/index.faiss and b/data/nouns/professional_nouns_index/index.faiss differ diff --git a/data/nouns/professional_nouns_index/index.pkl b/data/nouns/professional_nouns_index/index.pkl index 0d53840..e55a0f3 100644 Binary files a/data/nouns/professional_nouns_index/index.pkl and b/data/nouns/professional_nouns_index/index.pkl differ diff --git a/data/wiki_extracted_nouns/professional_nouns.json b/data/wiki_extracted_nouns/professional_nouns.json index 2b3e9c9..8a88dff 100644 --- a/data/wiki_extracted_nouns/professional_nouns.json +++ b/data/wiki_extracted_nouns/professional_nouns.json @@ -4,7 +4,8 @@ "synonymous": [ "配网D3", "配网软件D3", - "配网计价通D3" + "配网计价通D3", + "配网软件" ], "description": "" }, @@ -1014,6 +1015,11 @@ "synonymous": [], "description": "" }, + { + "name": "清单", + "synonymous": [], + "description": "" + }, { "name": "迁改插件", "synonymous": [], diff --git a/data/wiki_extracted_nouns/主网电力建设计价通_nouns.json b/data/wiki_extracted_nouns/主网电力建设计价通_nouns.json index ce5f1ed..d74fef2 100644 --- a/data/wiki_extracted_nouns/主网电力建设计价通_nouns.json +++ b/data/wiki_extracted_nouns/主网电力建设计价通_nouns.json @@ -11142,10 +11142,7 @@ }, { "name": "工程量清单", - "synonymous": [ - "清单", - "zwqd文件" - ], + "synonymous": [], "description": "工程项目中的具体工作项及其数量,简称工程量清单,是业务专用术语。用于招标或记录工程项目中各部分工程量的详细清单文件,包括所需材料、设备和人工等,软件格式后缀为zwqd。" }, { diff --git a/data/wiki_extracted_nouns/技改检修计价通_nouns.json b/data/wiki_extracted_nouns/技改检修计价通_nouns.json index f05e841..1e464cc 100644 --- a/data/wiki_extracted_nouns/技改检修计价通_nouns.json +++ b/data/wiki_extracted_nouns/技改检修计价通_nouns.json @@ -9,11 +9,6 @@ "synonymous": [], "description": "报表的编制规范,如P128页规定的表一金额单位为“万元”" }, - { - "name": "编码", - "synonymous": [], - "description": "一笔性费用的唯一标识码" - }, { "name": "名称", "synonymous": [], diff --git a/data/wiki_extracted_nouns/新型储能电站建设计价通C1_nouns.json b/data/wiki_extracted_nouns/新型储能电站建设计价通C1_nouns.json index a1c2d2b..01ff829 100644 --- a/data/wiki_extracted_nouns/新型储能电站建设计价通C1_nouns.json +++ b/data/wiki_extracted_nouns/新型储能电站建设计价通C1_nouns.json @@ -107,7 +107,8 @@ { "name": "博微储能计价通C1软件", "synonymous": [ - "储能C1软件" + "储能C1软件", + "储能软件" ], "description": "用于锂离子电池储能工程编制的软件" }, @@ -1683,11 +1684,6 @@ "synonymous": [], "description": "在工程量界面快速查找指定的工程量" }, - { - "name": "编码", - "synonymous": [], - "description": "工程量的唯一标识符" - }, { "name": "项目名称", "synonymous": [], diff --git a/data/wiki_extracted_nouns/西藏造价软件_nouns.json b/data/wiki_extracted_nouns/西藏造价软件_nouns.json index 09c1752..98b74fc 100644 --- a/data/wiki_extracted_nouns/西藏造价软件_nouns.json +++ b/data/wiki_extracted_nouns/西藏造价软件_nouns.json @@ -4099,10 +4099,8 @@ "description": "用于设计和自定义报表的界面,包括设计报表内容和格式的功能,提供进入报表设计界面的功能入口。" }, { - "name": "编码", - "synonymous": [ - "清单编码" - ], + "name": "清单编码", + "synonymous": [], "description": "定额行的关键字段,工程量清单项目的唯一标识符" }, { diff --git a/data/wiki_extracted_nouns/配网造价软件_nouns.json b/data/wiki_extracted_nouns/配网造价软件_nouns.json index e3ee07f..ff2b0fe 100644 --- a/data/wiki_extracted_nouns/配网造价软件_nouns.json +++ b/data/wiki_extracted_nouns/配网造价软件_nouns.json @@ -9910,10 +9910,7 @@ }, { "name": "工程量清单", - "synonymous": [ - "招标工程量清单", - "清单" - ], + "synonymous": [], "description": "业务专用术语,指工程项目中各项工作的详细列表,包括所需的材料和施工内容。通常由招标方提供,用于展示工程项目的物料消耗量,详细列出工程项目及其数量,用于招标和计价。" }, { diff --git a/rag2_0/intent_recognition/IntentRecognition.py b/rag2_0/intent_recognition/IntentRecognition.py index f07d86c..d1df74c 100644 --- a/rag2_0/intent_recognition/IntentRecognition.py +++ b/rag2_0/intent_recognition/IntentRecognition.py @@ -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, diff --git a/rag2_0/intent_recognition/ProfessionalNounVector.py b/rag2_0/intent_recognition/ProfessionalNounVector.py index 2209506..ce139bf 100644 --- a/rag2_0/intent_recognition/ProfessionalNounVector.py +++ b/rag2_0/intent_recognition/ProfessionalNounVector.py @@ -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: diff --git a/rag2_0/intent_recognition/PromptTemplates.py b/rag2_0/intent_recognition/PromptTemplates.py index 5abe18f..43c3136 100644 --- a/rag2_0/intent_recognition/PromptTemplates.py +++ b/rag2_0/intent_recognition/PromptTemplates.py @@ -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": "新建工程" }} """ \ No newline at end of file