Merge pull request #28 from Gardelll/dev
修复一些LLM响应解析问题和添加memory.use_judge配置项
This commit is contained in:
@@ -4,6 +4,7 @@ import binascii
|
||||
import hashlib
|
||||
import io
|
||||
import json
|
||||
import json_repair
|
||||
import os
|
||||
import random
|
||||
import re
|
||||
@@ -1022,6 +1023,15 @@ class EmojiManager:
|
||||
- 必须是表情包,非普通截图。
|
||||
- 图中文字不超过5个。
|
||||
请确保你的最终输出是严格的JSON对象,不要添加任何额外解释或文本。
|
||||
输出格式:
|
||||
```json
|
||||
{{
|
||||
"detailed_description": "",
|
||||
"keywords": [],
|
||||
"refined_sentence": "",
|
||||
"is_compliant": true
|
||||
}}
|
||||
```
|
||||
"""
|
||||
|
||||
image_data_for_vlm, image_format_for_vlm = image_base64, image_format
|
||||
@@ -1041,9 +1051,7 @@ class EmojiManager:
|
||||
if not vlm_response_str:
|
||||
continue
|
||||
|
||||
match = re.search(r"\{.*\}", vlm_response_str, re.DOTALL)
|
||||
if match:
|
||||
vlm_response_json = json.loads(match.group(0))
|
||||
vlm_response_json = self._parse_json_response(vlm_response_str)
|
||||
description = vlm_response_json.get("detailed_description", "")
|
||||
emotions = vlm_response_json.get("keywords", [])
|
||||
refined_description = vlm_response_json.get("refined_sentence", "")
|
||||
@@ -1195,6 +1203,29 @@ class EmojiManager:
|
||||
logger.error(f"[错误] 删除异常处理文件时出错: {remove_error}")
|
||||
return False
|
||||
|
||||
@classmethod
|
||||
def _parse_json_response(cls, response: str) -> dict[str, Any] | None:
|
||||
"""解析 LLM 的 JSON 响应"""
|
||||
try:
|
||||
# 尝试提取 JSON 代码块
|
||||
json_match = re.search(r"```json\s*(.*?)\s*```", response, re.DOTALL)
|
||||
if json_match:
|
||||
json_str = json_match.group(1)
|
||||
else:
|
||||
# 尝试直接解析
|
||||
json_str = response.strip()
|
||||
|
||||
# 移除可能的注释
|
||||
json_str = re.sub(r"//.*", "", json_str)
|
||||
json_str = re.sub(r"/\*.*?\*/", "", json_str, flags=re.DOTALL)
|
||||
|
||||
data = json_repair.loads(json_str)
|
||||
return data
|
||||
|
||||
except json.JSONDecodeError as e:
|
||||
logger.warning(f"JSON 解析失败: {e}, 响应: {response[:200]}")
|
||||
return None
|
||||
|
||||
|
||||
emoji_manager = None
|
||||
|
||||
|
||||
@@ -614,7 +614,7 @@ class DefaultReplyer:
|
||||
# 使用统一管理器的智能检索(Judge模型决策)
|
||||
search_result = await unified_manager.search_memories(
|
||||
query_text=query_text,
|
||||
use_judge=True,
|
||||
use_judge=global_config.memory.use_judge,
|
||||
recent_chat_history=chat_history, # 传递最近聊天历史
|
||||
)
|
||||
|
||||
@@ -1799,6 +1799,7 @@ class DefaultReplyer:
|
||||
)
|
||||
|
||||
if content:
|
||||
if not global_config.response_splitter.enable or global_config.response_splitter.split_mode != 'llm':
|
||||
# 移除 [SPLIT] 标记,防止消息被分割
|
||||
content = content.replace("[SPLIT]", "")
|
||||
|
||||
|
||||
@@ -514,6 +514,7 @@ class MemoryConfig(ValidatedConfigBase):
|
||||
short_term_decay_factor: float = Field(default=0.98, description="衰减因子")
|
||||
|
||||
# 长期记忆层配置
|
||||
use_judge: bool = Field(default=True, description="使用评判模型决定是否检索长期记忆")
|
||||
long_term_batch_size: int = Field(default=10, description="批量转移大小")
|
||||
long_term_decay_factor: float = Field(default=0.95, description="衰减因子")
|
||||
long_term_auto_transfer_interval: int = Field(default=60, description="自动转移间隔(秒)")
|
||||
|
||||
@@ -235,7 +235,7 @@ class KFCContextBuilder:
|
||||
|
||||
search_result = await unified_manager.search_memories(
|
||||
query_text=query_text,
|
||||
use_judge=True,
|
||||
use_judge=config.memory.use_judge,
|
||||
recent_chat_history=chat_history,
|
||||
)
|
||||
|
||||
|
||||
@@ -313,6 +313,7 @@ short_term_search_top_k = 5 # 搜索时返回的最大数量
|
||||
short_term_decay_factor = 0.98 # 衰减因子
|
||||
|
||||
# 长期记忆层配置
|
||||
use_judge = true # 使用评判模型决定是否检索长期记忆
|
||||
long_term_batch_size = 10 # 批量转移大小
|
||||
long_term_decay_factor = 0.95 # 衰减因子
|
||||
long_term_auto_transfer_interval = 180 # 自动转移间隔(秒)
|
||||
|
||||
Reference in New Issue
Block a user