Files
hack/tools/scripts/llm-key-hunter/results/_cache/content/chaoql_chip2024-xiansheng.json
T

1 line
14 KiB
JSON
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
{"repo": "chaoql/chip2024-xiansheng", "files": {"main.py": {"49d567964305c30780fea6fcd222792596548d4d": {"t": 1785674173.7028763, "n": 13367, "h": "2f263f97cdaa9b6f", "c": "import time\nfrom dotenv import load_dotenv, find_dotenv\nfrom dotenv import dotenv_values\nfrom llama_index.embeddings.huggingface import HuggingFaceEmbedding\nfrom llama_index.core.response_synthesizers.type import ResponseMode\nfrom llama_index.core import Settings\nfrom custom.glmfz import ChatGLM\nfrom custom.prompt import qa_clinical_info_prompt_tmpl_str, qa_core_mechanism_prompt_tmpl_str, \\\n qa_syndrome_infer_prompt_tmpl_str, qa_clinical_exp_prompt_tmpl_str, new_qa_core_mechanism_prompt_tmpl_str, \\\n all_clinical_info_prompt_tmpl_str\nfrom llama_index.core import PromptTemplate\nfrom pipeline import rag\nimport pipeline.readData as readData\nimport tools\nimport ensemble\nfrom tqdm import *\nimport os\nimport warnings\nfrom llama_index.llms.dashscope import DashScope, DashScopeGenerationModels\n\nwarnings.filterwarnings('ignore')\nif __name__ == '__main__':\n _ = load_dotenv(find_dotenv()) # 导入环境\n config = dotenv_values(\".env\")\n # 加载嵌入模型\n Settings.embed_model = HuggingFaceEmbedding(\n model_name=\"BAAI/bge-large-zh-v1.5\",\n cache_folder=\"./BAAI/\",\n embed_batch_size=128,\n local_files_only=True, # 仅加载本地模型,不尝试下载\n device=\"cuda\",\n )\n # Settings.embed_model = HuggingFaceEmbedding(\n # model_name=\"lier007/xiaobu-embedding-v2\",\n # cache_folder=\"BAAI/\",\n # embed_batch_size=128,\n # local_files_only=True, # 仅加载本地模型,不尝试下载\n # device=\"cuda\",\n # )\n\n # 加载大模型\n # Settings.llm = DashScope(\n # model_name=DashScopeGenerationModels.QWEN_TURBO, api_key=config[\"DASHSCOPE_API_KEY\"], max_tokens=1024\n # )\n Settings.llm = ChatGLM(\n api_key=config[\"GLM_KEY\"],\n model=\"glm-4-plus\",\n api_base=\"https://open.bigmodel.cn/api/paas/v4/\",\n is_chat_model=True,\n )\n\n # 设置参数\n with_hyde = False # 是否采用假设文档\n persist_dir = \"storeQ\" # 向量存储地址\n hybrid_search = False # 是否采用混合检索\n with_LLMrerank = True\n top_k = 5\n rerank_top_k = 2\n r_nums = 10 # 循环次数\n response_mode = ResponseMode.TREE_SUMMARIZE\n submitPath = \"final_submit/sub_5.txt\"\n now_best_submitPath = \"final_submit/sub_8.txt\"\n A_file = \"rdata/B榜.json\"\n train_file = \"rdata/train.json\"\n infoList = readData.read_AJson(A_file)\n if hybrid_search:\n index1, nodes1 = rag.load_hybrid_data([\"rdata/trainTask1.json\"], \"final_store/hybrid_store01\")\n # index2, nodes2 = rag.load_data([\"data/bjtrain02ExtraData.json\"], \"store/eval02_2_extra\")\n index2, nodes2 = rag.load_hybrid_data([\"rdata/trainTask2WOoptions2.json\"], \"final_store/hybrid_store02_1\")\n index2R, nodes2R = rag.load_hybrid_data([\"rdata/trainTask2WOoptions3.json\"], \"final_store/hybrid_store02_2\")\n index3, nodes3 = rag.load_hybrid_data(\n [\"rdata/zntrain3.json\", \"rdata/trainTask3WOoptions.json\", \"rdata/trainExtraDataTask2.json\",\n \"data/bjtrain02ExtraData.json\"], \"final_store/hybrid_store03_2\")\n index4, nodes4 = rag.load_json_text_hybrid_data(\n [\"rdata/trainTask4.json\"], [\"rdata/中医诊断学2.txt\", \"rdata/中医内科学.txt\", \"rdata/中医基础理论.txt\"],\n \"final_store/hybrid_store04\")\n else:\n index1, nodes1 = rag.load_data([\"rdata/trainTask1.json\"], \"final_store/store01\")\n index2, nodes2 = rag.load_data([\"rdata/trainTask2WOoptions2.json\"], \"final_store/store02_1\")\n index2R, nodes2R = rag.load_data([\"rdata/trainTask2WOoptions3.json\"], \"final_store/store02_2\")\n index3, nodes3 = rag.load_data(\n [\"rdata/zntrain3.json\", \"rdata/trainTask3WOoptions.json\", \"rdata/trainExtraDataTask2.json\",\n \"rdata/bjtrain02ExtraData.json\"], \"final_store/store03_2\")\n index4, nodes4 = rag.load_json_text_data(\n [\"rdata/trainTask4.json\"], [\"rdata/中医诊断学2.txt\", \"rdata/中医内科学.txt\", \"rdata/中医基础理论.txt\"],\n \"final_store/store04\")\n\n subResult = []\n start_time = time.time()\n print(start_time)\n resnum = 0\n if os.path.exists(submitPath):\n with open(submitPath, 'r', encoding=\"utf-8\", errors=\"ignore\") as file:\n lines = file.readlines()\n resnum = len(lines)\n\n # 读取历史最佳答案,某个病例生成错误后直接替换为历史最佳答案,防止报错打断程序运行\n # 主要是因为LLM_reranker报错率太高了\n task1_ans = []\n task2_ans = []\n task3_ans = []\n task4_ans = []\n with open(now_best_submitPath, 'r', encoding=\"utf-8\", errors=\"ignore\") as file:\n temp = file.readlines()\n for i in temp:\n task1_ans.append(i.split(\"@\")[1].rstrip())\n task2_ans.append(i.split(\"@\")[2].rstrip())\n task3_ans.append(i.split(\"@\")[3].rstrip())\n task4_ans.append(i.split(\"@\")[4].rstrip())\n\n for i, info in tqdm(enumerate(infoList), total=len(infoList)):\n if i < resnum: # 接续生成\n continue\n\n global syndrome_answer_str, mechanism_str, syndrome_answer, mechanism_answer\n case_id = info[\"案例编号\"]\n clinical_info = info[\"临床资料\"]\n mechanism_options = info[\"病机选项\"]\n syndrome_options = info[\"证候选项\"]\n\n # 直接读取各题当前最佳答案,调试用\n # core_clinical_info_str = task1_ans[i]\n # tools.printf(f\"core_clinical_info_str:{core_clinical_info_str}\")\n #\n # mechanism_answer = task2_ans[i].split(\";\")\n # mechanism_str = tools.extract_core_mechanism(mechanism_options, mechanism_answer)\n # tools.printf(mechanism_str)\n #\n # syndrome_answer = task3_ans[i].split(\";\")\n # syndrome_answer_str = tools.extract_core_mechanism(syndrome_options, syndrome_answer)\n # tools.printf(syndrome_answer_str)\n #\n # task4 = task4_ans[i]\n # clinical_experience_str = task4.split(\"辨证\")[0].replace(\"临证体会:\", \"\")\n # diagnosis_str = task4.split(\"辨证\")[1].replace(\"辨证:\", \"\").replace(\":\", \"\")\n\n # task1\n qa_clinical_info_prompt_tmpl_str_temp = qa_clinical_info_prompt_tmpl_str.format(context_str=\"{context_str}\",\n clinical_info=clinical_info)\n prompt1 = PromptTemplate(qa_clinical_info_prompt_tmpl_str_temp)\n rag_query_engine = rag.Build_query_engine(with_LLMrerank, rerank_top_k, index1, top_k, response_mode,\n hybrid_search, nodes1, with_hyde, qa_prompt_tmpl=prompt1)\n response = rag_query_engine.query(clinical_info)\n\n core_clinical_info = str(response)\n tools.printf(f\"core_clinical_info:{core_clinical_info}\")\n\n all_clinical_info_prompt_tmpl_str_temp = all_clinical_info_prompt_tmpl_str.format(clinical_info=clinical_info)\n prompt1_1 = PromptTemplate(all_clinical_info_prompt_tmpl_str_temp)\n rag_query_engine = rag.Build_query_engine(with_LLMrerank, rerank_top_k, index1, top_k, response_mode,\n hybrid_search, nodes1, with_hyde, qa_prompt_tmpl=prompt1_1)\n response1_1 = rag_query_engine.query(clinical_info)\n core_clinical_info1_1 = str(response1_1)\n core_clinical_info_list = core_clinical_info.split(\";\")\n print(len(core_clinical_info_list))\n\n core_clinical_info1_1_list = core_clinical_info1_1.split(\";\")\n core_clinical_info_result = []\n core_clinical_info_str = \"\"\n for info in core_clinical_info_list:\n if info:\n core_clinical_info1_1_list.append(info)\n for info in core_clinical_info1_1_list:\n if info and info not in core_clinical_info_result:\n core_clinical_info_result.append(info)\n core_clinical_info_str += info + \";\"\n print(len(core_clinical_info_result))\n\n for j in range(r_nums):\n # task2\n try:\n if j == 0:\n qa_core_mechanism_prompt_tmpl_str_temp = qa_core_mechanism_prompt_tmpl_str.format(\n context_str=\"{context_str}\",\n core_clinical_info=core_clinical_info,\n mechanism_options=mechanism_options,\n )\n prompt2 = PromptTemplate(qa_core_mechanism_prompt_tmpl_str_temp)\n rag_query_engine = rag.Build_query_engine(with_LLMrerank, rerank_top_k, index2, top_k,\n response_mode, hybrid_search, nodes2, with_hyde,\n qa_prompt_tmpl=prompt2)\n response = rag_query_engine.query(core_clinical_info) #\n else:\n syndrome_answer_str = tools.extract_core_mechanism(syndrome_options, syndrome_answer)\n qa_core_mechanism_prompt_tmpl_str_temp = new_qa_core_mechanism_prompt_tmpl_str.format(\n context_str=\"{context_str}\",\n core_clinical_info=core_clinical_info,\n mechanism_options=mechanism_options,\n syndrome_answer_str=syndrome_answer_str\n )\n prompt2 = PromptTemplate(qa_core_mechanism_prompt_tmpl_str_temp)\n rag_query_engine = rag.Build_query_engine(with_LLMrerank, rerank_top_k, index2R, top_k,\n response_mode,\n hybrid_search, nodes2R, with_hyde, qa_prompt_tmpl=prompt2)\n response = rag_query_engine.query(syndrome_answer_str)\n\n mechanism_answer = str(response)\n tools.printf(f\"mechanism_answer:{mechanism_answer}\")\n mechanism_answer = tools.select_answers_parse(mechanism_answer, \"病机答案\")\n tools.printf(mechanism_answer)\n mechanism_str = tools.extract_core_mechanism(mechanism_options, mechanism_answer)\n tools.printf(mechanism_str)\n except Exception as e:\n mechanism_answer = task2_ans[i].split(\";\")\n mechanism_str = tools.extract_core_mechanism(mechanism_options, mechanism_answer)\n tools.printf(mechanism_str)\n\n # task3\n qa_syndrome_infer_prompt_tmpl_str_temp = qa_syndrome_infer_prompt_tmpl_str.format(\n context_str=\"{context_str}\",\n core_clinical_info=core_clinical_info,\n syndrome_options=syndrome_options,\n mechanism_str=mechanism_str)\n prompt3 = PromptTemplate(qa_syndrome_infer_prompt_tmpl_str_temp)\n rag_query_engine = rag.Build_query_engine(with_LLMrerank, rerank_top_k, index3, top_k, response_mode,\n hybrid_search, nodes3, with_hyde, qa_prompt_tmpl=prompt3)\n try:\n response = rag_query_engine.query(mechanism_str + core_clinical_info)\n for node in response.source_nodes:\n tools.printf(node.text)\n syndrome_answer = str(response)\n tools.printf(f\"syndrome_answer:{syndrome_answer}\")\n syndrome_answer = tools.select_answers_parse(syndrome_answer, \"证候答案\")\n tools.printf(syndrome_answer)\n syndrome_answer_str = tools.extract_core_mechanism(syndrome_options, syndrome_answer)\n tools.printf(syndrome_answer_str)\n except Exception as e:\n syndrome_answer = task3_ans[i].split(\";\")\n syndrome_answer_str = tools.extract_core_mechanism(syndrome_options, syndrome_answer)\n tools.printf(syndrome_answer_str)\n\n # task4\n qa_clinical_exp_prompt_tmpl_str_temp = qa_clinical_exp_prompt_tmpl_str.format(context_str=\"{context_str}\",\n clinical_info=clinical_info,\n mechanism_str=mechanism_str)\n prompt4 = PromptTemplate(qa_clinical_exp_prompt_tmpl_str_temp)\n rag_query_engine = rag.Build_query_engine(with_LLMrerank, rerank_top_k, index4, top_k, response_mode,\n hybrid_search, nodes4, with_hyde, qa_prompt_tmpl=prompt4)\n try:\n response = rag_query_engine.query(mechanism_str)\n clinical_experience_str = str(response).replace(\"\\n\", \"\")\n tools.printf(f\"clinical_experience_str:{clinical_experience_str}\")\n diagnosis = syndrome_answer_str.split(\";\")\n diagnosis_str = \"\"\n for d in diagnosis:\n if d:\n diagnosis_str += d + ','\n diagnosis_str = diagnosis_str[:-1]\n tools.printf(diagnosis_str)\n except Exception as e:\n task4 = task4_ans[i]\n clinical_experience_str = task4.split(\"辨证\")[0].replace(\"临证体会:\", \"\")\n diagnosis_str = task4.split(\"辨证\")[1].replace(\"辨证:\", \"\").replace(\":\", \"\")\n\n resultAll = tools.printInfo(case_id, core_clinical_info_str, mechanism_answer, syndrome_answer,\n clinical_experience_str, diagnosis_str)\n tools.save_now(resultAll, submitPath)\n subResult.append(resultAll)\n end_time = time.time()\n print(f\"start_time-end_time:{(end_time - start_time) / 60.0}min\")\n tools.saveTxt(\"submit/subTemp.txt\", subResult)\n\n ensemble.enseTask1(submitPath=submitPath, llmsubmit_path=submitPath, A_path=A_file) # 第一问补缺\n"}}}}