From 066d2fe44d5b41cd2e33bd36d3471eba9153642a Mon Sep 17 00:00:00 2001 From: hubian <908234780@qq.com> Date: Sun, 12 Apr 2026 18:51:30 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E4=BC=98=E5=8C=96=E6=80=9D=E8=80=83?= =?UTF-8?q?=E5=86=85=E5=AE=B9=E6=8F=90=E5=8F=96=EF=BC=8C=E6=94=AF=E6=8C=81?= =?UTF-8?q?=E5=A4=9A=E7=A7=8D=E6=80=9D=E8=80=83=E6=A0=87=E8=AE=B0=E6=A0=BC?= =?UTF-8?q?=E5=BC=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- services/llm_service.py | 53 +++++++++++++++++++++++++---------------- 1 file changed, 33 insertions(+), 20 deletions(-) diff --git a/services/llm_service.py b/services/llm_service.py index 1d782b8..633a6b5 100644 --- a/services/llm_service.py +++ b/services/llm_service.py @@ -128,6 +128,8 @@ class LLMService: # 处理思考功能 if enable_thinking and agent_config.get('enable_thinking', True): thinking_prompt = agent_config.get('thinking_prompt') + thinking_prefix = agent_config.get('thinking_prefix', '') + thinking_suffix = agent_config.get('thinking_suffix', '') if supports_thinking and thinking_model: # 使用专门的思考模型 @@ -139,22 +141,15 @@ class LLMService: thinking_result = await self._call_api( api_base, api_key, thinking_model, thinking_messages, max_tokens=min(max_tokens, 1000), - temperature=0.3 # 思考时降低温度 + temperature=0.3 ) thinking_content = thinking_result except Exception as e: logger.warning(f"思考模型调用失败: {e}") - elif supports_thinking: - # Provider支持思考但无单独模型,尝试在回复中获取思考部分 - pass # 在回复解析时处理 - elif thinking_prompt: - # Provider不支持思考,但Agent配置了思考提示词 - # 将思考提示词添加到系统提示 - enhanced_system = f"{system_prompt}\n\n在回答之前,请先思考问题。思考过程请用{agent_config.get('thinking_prefix', '')}和{agent_config.get('thinking_suffix', '')}包裹,然后再给出正式回答。" - if thinking_prompt: - enhanced_system += f"\n思考指导:{thinking_prompt}" + # Agent配置了思考提示词,添加到系统提示中 + enhanced_system = f"{system_prompt}\n\n{thinking_prompt}" final_messages[0] = {"role": "system", "content": enhanced_system} # 调用主模型 @@ -165,19 +160,37 @@ class LLMService: temperature=temperature ) - # 尝试从回复中提取思考内容 - if enable_thinking and not supports_thinking: + # 尝试从回复中提取思考内容(支持DeepSeek R1、GLM等模型的思考模式) + if enable_thinking and agent_config.get('enable_thinking', True): thinking_prefix = agent_config.get('thinking_prefix', '') thinking_suffix = agent_config.get('thinking_suffix', '') - if thinking_prefix and thinking_suffix: - # 提取思考部分 - pattern = f"{re.escape(thinking_prefix)}(.*?)?{re.escape(thinking_suffix)}" - match = re.search(pattern, response, re.DOTALL) - if match: - thinking_content = match.group(1).strip() - # 移除思考部分,只保留回复 - response = re.sub(pattern, '', response, flags=re.DOTALL).strip() + # 如果没有配置前缀后缀,使用常见的思考标记 + if not thinking_prefix: + # 尝试常见的思考标记 + common_thinking_markers = [ + ('', ''), + ('【思考】', '【回答】'), + ('Thought:', 'Answer:'), + ('思考:', '回答:'), + ] + for prefix, suffix in common_thinking_markers: + if prefix in response and suffix in response: + thinking_prefix = prefix + thinking_suffix = suffix + break + + # 提取思考部分 + if thinking_prefix and thinking_suffix and thinking_prefix in response: + try: + start_idx = response.find(thinking_prefix) + end_idx = response.find(thinking_suffix, start_idx) + if end_idx > start_idx: + thinking_content = response[start_idx + len(thinking_prefix):end_idx].strip() + # 移除思考部分,只保留回复 + response = response[end_idx + len(thinking_suffix):].strip() + except Exception as e: + logger.warning(f"提取思考内容失败: {e}") return response, thinking_content