from chains_lab import Problem_rewrite from chains_lab import booway_cypher_chain from chains_lab import question_answer, question_answer_calculation from vector_lab import intersection_of_three_lists from utils import find_target_item, find_target_items, pre_mapping, pre_mapping2 from utils import extract_concrete_info, extract_query_prefix_list, split_chinese_bracketed_phrases import json from extraction_info import info_data_json # 样例 # input_str1 = "杆塔总基数是多少?" # input_str2 = "单回路长度是多少?" # input_str3 = "计算一下角钢塔的塔材装材费" # input_str4 = "计算一下土石方总量" # input_str5 = "板式塔基的各类基础数量占总塔基数比例是多少?" # input_str6 = "基础混凝土总量是多少" # input_str7 = "计算一下本体工程机械费" # input_str8 = "项目建设技术服务费合计" # 初始化chians problem_rewrite = Problem_rewrite() qa_chains = question_answer() calculation_chains = question_answer_calculation() # 加载数据 with open(info_data_json, 'r', encoding='utf-8') as file: data = json.load(file) print("📥 请输入查询内容,输入 'exit' 可退出程序。\n") while True: input_str = input("🔍 输入问题:") if input_str.lower() == 'exit': print("👋 已退出。") break try: results = intersection_of_three_lists(input_str) if not results: print("⚠️ 无法从向量中获取候选项。") continue retriever = results[0] print(f"➡️ 匹配向量检索结果:{retriever}") # 重写问题,提取关键词 keywords = problem_rewrite.invoke({ "query": input_str, "retriever": retriever }) print(f"🧠 提取关键词:{keywords}") # 预映射为图数据库结构 input_neo4j = pre_mapping(keywords, data) print(f"📊 图谱相关知识输出:\n{input_neo4j}\n") question = input_neo4j input_str = input_str if isinstance(question, str): response = booway_cypher_chain.invoke(question) generated_cypher = response.get("intermediate_steps")[0] # print(str(generated_cypher)) temp = response.get("result") # print(temp) finally_result = qa_chains.invoke({"query":input_str, "retriever_keywords":keywords, "retriever_info":temp}) print(f"📊 图谱最终检索输出:\n{finally_result}\n") elif isinstance(question, list): ques = extract_query_prefix_list(question) temp = extract_concrete_info(question) ques_info = split_chinese_bracketed_phrases(temp[0]) print(ques) retriever_info = [] for i in ques[:12]: try: response = booway_cypher_chain.invoke(i) temp = response.get("result") # todo: 重复筛选策略 retriever_info.append(temp) except Exception as e: print(f"处理问题时出错: {e}") retriever_info.append(None) retriever_keywords = ques_info[0] calculation = ques_info[-1] finally_result = calculation_chains.invoke({"query":question, "retriever_keywords":retriever_keywords, "calculation":calculation, "retriever_info":retriever_info}) print(f"📊 图谱最终检索输出:\n{finally_result}\n") except Exception as e: print(f"❌ 发生错误:{e}")