From 51b6d085fd4d7d35fc067a2c46ccc9dd92e8e52c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9C=B1=E6=BD=AE?= Date: Wed, 26 Nov 2025 09:51:59 +0800 Subject: [PATCH] guildlines filter --- prompt/guideline_prompt.md | 4 ++-- routes/chat.py | 18 ++++++++++++------ utils/fastapi_utils.py | 26 ++++++++++++++++++-------- 3 files changed, 32 insertions(+), 16 deletions(-) diff --git a/prompt/guideline_prompt.md b/prompt/guideline_prompt.md index 58dc878..ac34c2d 100644 --- a/prompt/guideline_prompt.md +++ b/prompt/guideline_prompt.md @@ -152,8 +152,8 @@ Please specify the applicability of each guideline: "checks": [ { "guideline_id": "1", - "condition": "具体的条件描述", - "rationale": "<解释为什么条件满足或不满足>", + "condition": "Specific condition description", + "rationale": "", "applies": true/false } ] diff --git a/routes/chat.py b/routes/chat.py index 7cee7c8..a671f2f 100644 --- a/routes/chat.py +++ b/routes/chat.py @@ -186,17 +186,23 @@ async def create_agent_and_generate_response( agent = all_results[-1] # agent创建的结果 batch_results = all_results[:-1] # guideline批次的结果 - # 合并guideline分析结果 - valid_results = [] + # 合并guideline分析结果,使用JSON格式的checks数组 + all_checks = [] for i, result in enumerate(batch_results): if isinstance(result, Exception): print(f"Guideline batch {i} failed: {result}") continue - if result and result.strip(): - valid_results.append(result.strip()) + if result and isinstance(result, dict) and 'checks' in result: + # 如果是JSON对象且包含checks数组,只保留applies为true的checks + applicable_checks = [check for check in result['checks'] if check.get('applies') is True] + all_checks.extend(applicable_checks) + elif result and isinstance(result, str) and result.strip(): + # 如果是普通文本,保留原有逻辑 + print(f"Non-JSON result from batch {i}: {result}") - if valid_results: - guideline_analysis = "\n\n".join(valid_results) + if all_checks: + # 将checks数组格式化为JSON字符串 + guideline_analysis = json.dumps({"checks": all_checks}, ensure_ascii=False) print(f"Merged guideline analysis result: {guideline_analysis}") # 将分析结果添加到最后一个消息的内容中 diff --git a/utils/fastapi_utils.py b/utils/fastapi_utils.py index 3f2094c..69064f7 100644 --- a/utils/fastapi_utils.py +++ b/utils/fastapi_utils.py @@ -1,6 +1,7 @@ import os import re import hashlib +import json import asyncio from typing import List, Dict, Optional, Union, Any import aiohttp @@ -285,13 +286,9 @@ def extract_guidelines_from_system_prompt(system_prompt: Optional[str]) -> tuple guidelines_text = "\n".join(matches).strip() - # # 从原始system_prompt中删除 ```guideline``` 内容块 - # cleaned_prompt = re.sub(pattern, '', system_prompt, flags=re.DOTALL) - - # # 清理多余的空行 - # cleaned_prompt = re.sub(r'\n\s*\n\s*\n', '\n\n', cleaned_prompt).strip() - - return system_prompt, guidelines_text + # 从原始system_prompt中删除 ```guideline``` 内容块 + cleaned_prompt = re.sub(pattern, '', system_prompt, flags=re.DOTALL) + return cleaned_prompt, guidelines_text def format_messages_to_chat_history(messages: List[Dict[str, str]]) -> str: @@ -482,7 +479,20 @@ async def process_guideline_batch( batch_guidelines_text = "\n".join(guidelines_batch) batch_analysis = await call_guideline_llm(chat_history, batch_guidelines_text, model_name, api_key, model_server) - return batch_analysis + # 从响应中提取 ```json 和 ``` 包裹的内容 + json_pattern = r'```json\s*\n(.*?)\n```' + json_matches = re.findall(json_pattern, batch_analysis, re.DOTALL) + + if json_matches: + try: + # 解析第一个找到的JSON对象 + json_data = json.loads(json_matches[0]) + return json_data # 返回解析后的JSON对象 + except json.JSONDecodeError as e: + print(f"Error parsing JSON from guideline analysis: {e}") + return batch_analysis # 如果JSON解析失败,返回原始文本 + else: + return batch_analysis # 如果没有找到JSON格式,返回原始文本 except Exception as e: print(f"Error processing guideline batch: {e}") return ""