From 660b5f65614e0e5ff51af3e1c1667f049f2aff41 Mon Sep 17 00:00:00 2001 From: ouyangyouzhang Date: Thu, 28 Aug 2025 09:04:29 +0800 Subject: [PATCH] =?UTF-8?q?Qwen3-32B=20JSON=E6=A0=BC=E5=BC=8F=E5=8C=96?= =?UTF-8?q?=E8=BE=93=E5=87=BA=E4=B8=8D=E7=A8=B3=E5=AE=9A=EF=BC=8C=E5=BE=AE?= =?UTF-8?q?=E8=B0=83=E8=BE=93=E5=87=BA=E6=A0=BC=E5=BC=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- api_key.txt | 86 +++++++++---------- rag2_0/intent_recognition/DataModels.py | 41 +++++++++ .../intent_recognition/IntentRecognition.py | 34 +++++--- rag2_0/intent_recognition/PromptTemplates.py | 4 +- 4 files changed, 110 insertions(+), 55 deletions(-) diff --git a/api_key.txt b/api_key.txt index b559e1d..638d51a 100644 --- a/api_key.txt +++ b/api_key.txt @@ -1,46 +1,3 @@ -sk-cxlvgeuxavxfcajprxietuqyqjngtbrwrmrmrioxmgtbkpci -sk-vjjsuzntqbhcmelfsuquqyoxjivxcfwyxnrhpwzobgxlpmrv -sk-hbgctnpvntsnelveaudpekyncfgstdfazezboxmcgjvudzyg -sk-cgdcrzedpetwuysiebjmioqkuqjsoouglspwtjvadgzosmwt -sk-ymqpbisxufhthdjxerztucgecakvcsgajsdiicauvnaandir -sk-xhmfarttmloxepegtvodtdwvpjveanvjigmkrjumxojkuydb -sk-kdfrkixwoeiuzdsdtystcxbhvwzeschacrnvhfiupnilnpoo -sk-kelmbfsruwmjgrzzbjkqpqasabrnuskongtqxwzrfrpefdgz -sk-mtnlhcosddoztgmdgjmtlniqsrkfiskafmthtmnyzqmdfcib -sk-cnrleygygpuqogpqyvuqnhubkwschrtcpjlldsdhxrkhgttf -sk-xgkzyzptybrnxanvugkynczygyfavddwwzhbgoyxkhgaykci -sk-nfpftnxyiovqlzkqsleadsfnbpfxdxbdpghdwfyucrnzaimh -sk-uiuhaihdvthpmwqeehmwufagpxcjunoqnfgpnaitaaqgrjoi -sk-mjnkfdboddkikmawuawsaxdsvwyuqxlaoroxcefdtrnycfud -sk-xmjbjxxzhfzwpjihhyuhlxidzwmbsrtjdrpgxjgdnywhnovu -sk-comhspmqhvnsaqasydwsrttntklshmbvisdlbpenyhmffngx -sk-vflgmlkwgaxnddlhvcsuaphsfmkvilhpdgencksucoqwkezu -sk-iyjhckfaoavtkwerohssthuygrqnntdaxrkgwgopgpdfdyhw -sk-drjnrjwgxxkvpizznkxvjmgphttgfvrssglnljlxtsnpkqnn -sk-kzvqvcfzmfjrtpzufbatbgpmyrziqoxzjehwyvtcnxpfxmul -sk-movoypamgtzabventkegpyqnzvxunjkvnyvowbxoofxlkyxi -sk-fnjeeylfnusqcyyoknqtqotgnkbyidzehufvtnpyctmhoevq -sk-vdmkbtdqzhuaslwuzumkyyxxhytvvszqpkfrrwsllpbhcffh -sk-tufbncngubzdhcdoydqoflmgigkmbogrxwqjvgmexcbmmhvb -sk-svivotzqknqcgwpfcafebytzvwdxywwaioveyjqaxnrhmlps -sk-zixqbkoxuvxkituttwtvdatcwpjvpsfyklenfqyoyivcsvcm -sk-jebuvmnzsjcorvvcrkgnwvusefssnhcynymwxygsdzmcekpm -sk-rfhnquzrxvcatgletqxjuxwwtjvowkfowmmbuwceysbpowep -sk-txvxjzjhgijqggeexeszmbvflhjyikmcmmfnwzpyypziolla -sk-lcmoiwzzzgmrmtlrdiqrnokroemjshdbfngputxdwbmsiikz -sk-zaeziqwmxhsppqspwpwbmhparnlkjmrlhgazeuitfkljzmvy -sk-drxthkrbfwirgjujaeaaykzxrpzxxthcpbfxmvqrwjyngbta -sk-afffehmmkjbgseltoskctaqfzjtfnpcqmhnclecqjonzvjbc -sk-hzmqvpyolijixllzrswwxzcgkezvhlmojssttzzjphadidie -sk-utyouvzddsvugfgptkhckrtlzfpeqhxbmwvrnfwlulywsnnp -sk-lavdxcqbvvsgpumjlflqnuzwkdsleohkouylerwovzikelux -sk-uwdquxtaliiwrdkakpgoismnfcwftfzohcekmdwifokmyktv -sk-exbjsnmerjsksepbgqtlvpsmbaptvrbasfbpcrdsblljjpmp -sk-ksenojclzsyrhfkjqtmjxfiawopiivujzurnzpsmdasczvzv -sk-fqogdmxyfiwjcjfnptthcylfqwyygbtkmhpchqoisxkcmqez -sk-vtogkcmdkbdhujtsnhcjdoytafzzurpsjjxmzlbvrjfxtzox -sk-twuvbdvmfswczhmuuktztxvfuxvxvdkcmejghjebxtowdbsc -sk-iobumflqericicuvflscrsrbmlozlbbueldxlmltgaqvuyhg sk-ufnnhxfxfvmweezskajizwdcqynqmytbbkyctvkjypdyhjny sk-dcrokkzfvdkctooxqcbapzlkrtzchygzwwqvbzqcgghsesjq sk-pzzpojbvjouqdbrvmyyevmxlutcorwcgholvszwjxnkfurss @@ -101,6 +58,49 @@ sk-ufmqbuplpjvzzlzohvsxertwgnguhipsbajxnxecvvccozly sk-rypfoscrczeelowmrsixiuyunyqmqvknaprsnzmdguwzrkzx sk-lucemnosmcxuwedvzilpefuxjnyvaxldpbgaqwnwalxmntul sk-niymkyuzpyovndvvqvpaniiqfgoofnxczhdmjjessiocbeul +sk-cxlvgeuxavxfcajprxietuqyqjngtbrwrmrmrioxmgtbkpci +sk-vjjsuzntqbhcmelfsuquqyoxjivxcfwyxnrhpwzobgxlpmrv +sk-hbgctnpvntsnelveaudpekyncfgstdfazezboxmcgjvudzyg +sk-cgdcrzedpetwuysiebjmioqkuqjsoouglspwtjvadgzosmwt +sk-ymqpbisxufhthdjxerztucgecakvcsgajsdiicauvnaandir +sk-xhmfarttmloxepegtvodtdwvpjveanvjigmkrjumxojkuydb +sk-kdfrkixwoeiuzdsdtystcxbhvwzeschacrnvhfiupnilnpoo +sk-kelmbfsruwmjgrzzbjkqpqasabrnuskongtqxwzrfrpefdgz +sk-mtnlhcosddoztgmdgjmtlniqsrkfiskafmthtmnyzqmdfcib +sk-cnrleygygpuqogpqyvuqnhubkwschrtcpjlldsdhxrkhgttf +sk-xgkzyzptybrnxanvugkynczygyfavddwwzhbgoyxkhgaykci +sk-nfpftnxyiovqlzkqsleadsfnbpfxdxbdpghdwfyucrnzaimh +sk-uiuhaihdvthpmwqeehmwufagpxcjunoqnfgpnaitaaqgrjoi +sk-mjnkfdboddkikmawuawsaxdsvwyuqxlaoroxcefdtrnycfud +sk-xmjbjxxzhfzwpjihhyuhlxidzwmbsrtjdrpgxjgdnywhnovu +sk-comhspmqhvnsaqasydwsrttntklshmbvisdlbpenyhmffngx +sk-vflgmlkwgaxnddlhvcsuaphsfmkvilhpdgencksucoqwkezu +sk-iyjhckfaoavtkwerohssthuygrqnntdaxrkgwgopgpdfdyhw +sk-drjnrjwgxxkvpizznkxvjmgphttgfvrssglnljlxtsnpkqnn +sk-kzvqvcfzmfjrtpzufbatbgpmyrziqoxzjehwyvtcnxpfxmul +sk-movoypamgtzabventkegpyqnzvxunjkvnyvowbxoofxlkyxi +sk-fnjeeylfnusqcyyoknqtqotgnkbyidzehufvtnpyctmhoevq +sk-vdmkbtdqzhuaslwuzumkyyxxhytvvszqpkfrrwsllpbhcffh +sk-tufbncngubzdhcdoydqoflmgigkmbogrxwqjvgmexcbmmhvb +sk-svivotzqknqcgwpfcafebytzvwdxywwaioveyjqaxnrhmlps +sk-zixqbkoxuvxkituttwtvdatcwpjvpsfyklenfqyoyivcsvcm +sk-jebuvmnzsjcorvvcrkgnwvusefssnhcynymwxygsdzmcekpm +sk-rfhnquzrxvcatgletqxjuxwwtjvowkfowmmbuwceysbpowep +sk-txvxjzjhgijqggeexeszmbvflhjyikmcmmfnwzpyypziolla +sk-lcmoiwzzzgmrmtlrdiqrnokroemjshdbfngputxdwbmsiikz +sk-zaeziqwmxhsppqspwpwbmhparnlkjmrlhgazeuitfkljzmvy +sk-drxthkrbfwirgjujaeaaykzxrpzxxthcpbfxmvqrwjyngbta +sk-afffehmmkjbgseltoskctaqfzjtfnpcqmhnclecqjonzvjbc +sk-hzmqvpyolijixllzrswwxzcgkezvhlmojssttzzjphadidie +sk-utyouvzddsvugfgptkhckrtlzfpeqhxbmwvrnfwlulywsnnp +sk-lavdxcqbvvsgpumjlflqnuzwkdsleohkouylerwovzikelux +sk-uwdquxtaliiwrdkakpgoismnfcwftfzohcekmdwifokmyktv +sk-exbjsnmerjsksepbgqtlvpsmbaptvrbasfbpcrdsblljjpmp +sk-ksenojclzsyrhfkjqtmjxfiawopiivujzurnzpsmdasczvzv +sk-fqogdmxyfiwjcjfnptthcylfqwyygbtkmhpchqoisxkcmqez +sk-vtogkcmdkbdhujtsnhcjdoytafzzurpsjjxmzlbvrjfxtzox +sk-twuvbdvmfswczhmuuktztxvfuxvxvdkcmejghjebxtowdbsc +sk-iobumflqericicuvflscrsrbmlozlbbueldxlmltgaqvuyhg sk-gkdrgcbrlddkgflolrqkpqyygmuszueozeoiwdqpeqghlths sk-gjqsqttmnydxavthjsjnirqxprogmvidmocfeoixuwutiqmd sk-pihgxlhhdsyeowjsbhbioxwqjbonwunteaubfisduzyibkzw diff --git a/rag2_0/intent_recognition/DataModels.py b/rag2_0/intent_recognition/DataModels.py index 546f8bf..60d6cec 100755 --- a/rag2_0/intent_recognition/DataModels.py +++ b/rag2_0/intent_recognition/DataModels.py @@ -107,9 +107,34 @@ class Classification(BaseModel): vertical_classification:str = Field(description="垂直领域一级分类") sub_classification:str = Field(description="一级分类下的二级分类") + @classmethod + def get_format_instructions(cls): + return """ + 格式如下,必须严格以纯JSON格式输出 + { + "vertical_classification": "垂直领域一级分类", + "sub_classification": "一级分类下的二级分类" + } + 字段说明: + vertical_classification 类型:str 描述:垂直领域一级分类 + sub_classification 类型:str 描述:一级分类下的二级分类 + + """ + class QueryRewrite(BaseModel): rewrite:str = Field(description="问题改写") + @classmethod + def get_format_instructions(cls): + return """ + 格式如下:必须严格以纯JSON格式输出 + { + "rewrite": "问题改写" + } + 字段说明: + rewrite 类型:str 描述:问题改写之后的内容 + """ + ##########################槽位模型########################### class SlotBase(BaseModel): """槽位基础模型""" @@ -312,6 +337,22 @@ class StepBackPrompt(BaseModel): can_use_back_prompt: bool = Field(description="原始查询是否可以进行后退提示(true/false),如果原始查询没有限定词或其他限定词语,则不能进行后退提示") step_back_query: List[str] = Field(description="后退提示生成的抽象查询(多个)") + @classmethod + def get_format_instructions(cls): + return """ + 格式如下,必须严格以纯JSON格式输出 + { + "original_query": "原始查询", + "can_use_back_prompt": "原始查询是否可以进行后退提示(true/false),如果原始查询没有限定词或其他限定词语,则不能进行后退提示", + "step_back_query": "后退提示生成的抽象查询(多个)" + } + 字段说明: + original_query 类型:str 描述:用户输入的原始查询 + can_use_back_prompt 类型:bool 描述:原始查询是否可以进行后退提示(true/false),如果原始查询没有限定词或其他限定词语,则不能进行后退提示 + step_back_query 类型:List[str] 描述:后退提示生成的抽象查询(多个) + """ + + class FollowUpQuestions(BaseModel): """后续问题数据模型""" original_query: str = Field(description="原始查询") diff --git a/rag2_0/intent_recognition/IntentRecognition.py b/rag2_0/intent_recognition/IntentRecognition.py index 1fca056..06d6977 100755 --- a/rag2_0/intent_recognition/IntentRecognition.py +++ b/rag2_0/intent_recognition/IntentRecognition.py @@ -188,17 +188,19 @@ class AsyncIntentRecognizer: classification_parser = PydanticOutputParser(pydantic_object=Classification) formatted_prompt = classification_prompt.format(user_input=query, classification_info=classification_info, - output_format=classification_parser.get_format_instructions(), + output_format=Classification.get_format_instructions(), # conversation_context=conversation_context, chat_history=json.dumps(chat_history, ensure_ascii=False)) # 解析输出 try: # 异步调用LLM - response = await self._llm.ainvoke(formatted_prompt, extra_body={"enable_thinking": False}) + response = await self._llm.ainvoke(formatted_prompt, response_format={"type": "json_object"}, extra_body={"enable_thinking": False}) + # response = await self._llm.ainvoke(formatted_prompt, extra_body={"enable_thinking": False}) # 尝试直接解析JSON响应 response.content = response.content.strip() clean_output = re.sub(r'.*?', '', response.content, flags=re.DOTALL) + clean_output = re.sub(r'\s+', '', clean_output) parsed_output = classification_parser.parse(clean_output) # 计算并打印耗时 @@ -262,11 +264,13 @@ class AsyncIntentRecognizer: formatted_prompt = formatted_prompt.replace("{output_format}", terms_list_parser.get_format_instructions()) # 异步调用LLM - response = await self._llm.ainvoke(formatted_prompt, extra_body={"enable_thinking": False}) + response = await self._llm.ainvoke(formatted_prompt, response_format={"type": "json_object"}, extra_body={"enable_thinking": False}) + # response = await self._llm.ainvoke(formatted_prompt, extra_body={"enable_thinking": False}) # 尝试使用Pydantic解析器解析TermList response.content = response.content.strip() clean_output = re.sub(r'.*?', '', response.content, flags=re.DOTALL) + clean_output = re.sub(r'\s+', '', clean_output) parsed_output = terms_list_parser.parse(clean_output) return parsed_output.terms @@ -335,18 +339,22 @@ class AsyncIntentRecognizer: 1、请从当前提问内容中提取电力造价行中定额编码、定额名称、清单编码、清单名称 - 2、请勿随机编造,如果没有提取到,返回空内容 - 3、返回结果为json格式 + 2、请勿随机编造,如果没有提取到内容返回空的JSON + 3、返回结果为json格式,必须严格以纯JSON格式输出 + ```json {{ "dinge_info_list":{{"dinge_code_list":["xxxx","xxxx"], "dinge_name_list":["xxxx","xxxx"]}}, "qingdan_info":{{"qingdan_code_list":["xxxx","xxxx"], "qingdan_name_list":["xxxx","xxxx"]}} }} + ```json """ try: response = await self._llm.ainvoke(prompt, response_format={"type": "json_object"}, extra_body={"enable_thinking": False}) + # response = await self._llm.ainvoke(prompt, extra_body={"enable_thinking": False}) response.content = response.content.strip() clean_output = re.sub(r'.*?', '', response.content, flags=re.DOTALL) + clean_output = re.sub(r'\s+', '', clean_output) parsed_output = JsonOutputParser().parse(clean_output) # 计算并打印耗时 @@ -378,16 +386,18 @@ class AsyncIntentRecognizer: keywords_str = json.dumps(terms_dict, ensure_ascii=False) query_rewrite_parser = PydanticOutputParser(pydantic_object=QueryRewrite) formatted_prompt = query_rewrite_prompt_pro.format(query=query, - output_format=query_rewrite_parser.get_format_instructions(), + output_format=QueryRewrite.get_format_instructions(), keywords=keywords_str, chat_history=chat_history, context=context) # 解析输出 try: # 异步调用LLM - response = await self._llm.ainvoke(formatted_prompt, extra_body={"enable_thinking": False}) + response = await self._llm.ainvoke(formatted_prompt,response_format={"type": "json_object"}, extra_body={"enable_thinking": False}) + # response = await self._llm.ainvoke(formatted_prompt, extra_body={"enable_thinking": False}) response.content = response.content.strip() clean_output = re.sub(r'.*?', '', response.content, flags=re.DOTALL) + clean_output = re.sub(r'\s+', '', clean_output) parsed_output = query_rewrite_parser.parse(clean_output) end_time = time.time() process_time=end_time-start_time @@ -630,9 +640,11 @@ class AsyncIntentRecognizer: ) try: # 异步调用LLM - response = await self._llm.ainvoke(formatted_prompt, extra_body={"enable_thinking": False}) + response = await self._llm.ainvoke(formatted_prompt,response_format={"type": "json_object"}, extra_body={"enable_thinking": False}) + # response = await self._llm.ainvoke(formatted_prompt, extra_body={"enable_thinking": False}) response.content = response.content.strip() clean_output = re.sub(r'.*?', '', response.content, flags=re.DOTALL) + clean_output = re.sub(r'\s+', '', clean_output) # 尝试解析LLM响应 parsed_output = slot_parser.parse(clean_output) return parsed_output @@ -660,16 +672,18 @@ class AsyncIntentRecognizer: query=query, chat_history=json.dumps(chat_history, ensure_ascii=False) if chat_history else "[]", # conversation_context=conversation_context, - output_format=step_back_parser.get_format_instructions() + output_format=StepBackPrompt.get_format_instructions() ) try: # 异步调用LLM - response = await self._llm.ainvoke(formatted_prompt, extra_body={"enable_thinking": False}) + response = await self._llm.ainvoke(formatted_prompt, response_format={"type": "json_object"}, extra_body={"enable_thinking": False}) + # response = await self._llm.ainvoke(formatted_prompt, extra_body={"enable_thinking": False}) # 解析输出 response.content = response.content.strip() clean_output = re.sub(r'.*?', '', response.content, flags=re.DOTALL) + clean_output = re.sub(r'\s+', '', clean_output) parsed_output = step_back_parser.parse(clean_output) step_back_end_time = time.time() step_back_time = step_back_end_time - step_back_start_time diff --git a/rag2_0/intent_recognition/PromptTemplates.py b/rag2_0/intent_recognition/PromptTemplates.py index 03ed6cc..b596c8d 100755 --- a/rag2_0/intent_recognition/PromptTemplates.py +++ b/rag2_0/intent_recognition/PromptTemplates.py @@ -298,7 +298,7 @@ step_back_prompt = """ 后退问题: {{ "original_query": "2023版本如何在Windows 11系统上导入单位工程量清单?", - "can_use_back_prompt": True, + "can_use_back_prompt": true, "step_back_query": ["如何在Windows 11系统上导入单位工程量清单?", "如何导入单位工程量清单?"] }} @@ -306,7 +306,7 @@ step_back_prompt = """ 后退问题: {{ "original_query": "某个设备更换后,如何在系统中更新对应的定额?", - "can_use_back_prompt": True, + "can_use_back_prompt": true, "step_back_query": ["如何更新设备对应的定额?", "如何更新定额?"] }}