fix: 优化思考内容提取,支持多种思考标记格式
This commit is contained in:
@@ -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:
|
||||
# 如果没有配置前缀后缀,使用常见的思考标记
|
||||
if not thinking_prefix:
|
||||
# 尝试常见的思考标记
|
||||
common_thinking_markers = [
|
||||
('<think>', '</think>'),
|
||||
('【思考】', '【回答】'),
|
||||
('Thought:', 'Answer:'),
|
||||
('思考:', '回答:'),
|
||||
]
|
||||
for prefix, suffix in common_thinking_markers:
|
||||
if prefix in response and suffix in response:
|
||||
thinking_prefix = prefix
|
||||
thinking_suffix = suffix
|
||||
break
|
||||
|
||||
# 提取思考部分
|
||||
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()
|
||||
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 = re.sub(pattern, '', response, flags=re.DOTALL).strip()
|
||||
response = response[end_idx + len(thinking_suffix):].strip()
|
||||
except Exception as e:
|
||||
logger.warning(f"提取思考内容失败: {e}")
|
||||
|
||||
return response, thinking_content
|
||||
|
||||
|
||||
Reference in New Issue
Block a user