From 9cf62f983e00f9f6a7c1fdc005de2250c9d6762c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=A2=A8=E6=A2=93=E6=9F=92?= <1787882683@qq.com> Date: Fri, 2 May 2025 03:18:24 +0800 Subject: [PATCH 1/6] =?UTF-8?q?feat=EF=BC=9A=E4=B8=BA=E5=A4=9A=E4=B8=AA?= =?UTF-8?q?=E6=A8=A1=E5=9D=97=E6=B7=BB=E5=8A=A0=E4=B8=B0=E5=AF=8C=E7=9A=84?= =?UTF-8?q?=E8=BF=BD=E8=B8=AA=E4=BF=A1=E6=81=AF=E4=BB=A5=E5=A2=9E=E5=BC=BA?= =?UTF-8?q?=E8=B0=83=E8=AF=95=E8=83=BD=E5=8A=9B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- bot.py | 2 ++ src/common/database.py | 2 ++ src/common/log_decorators.py | 2 ++ src/common/server.py | 2 ++ src/config/config.py | 2 ++ src/do_tool/tool_can_use/base_tool.py | 2 ++ src/individuality/individuality.py | 2 ++ src/individuality/offline_llm.py | 2 ++ src/main.py | 2 ++ src/plugins/PFC/chat_observer.py | 2 ++ src/plugins/PFC/conversation.py | 2 ++ src/plugins/PFC/message_sender.py | 2 ++ src/plugins/PFC/pfc.py | 2 ++ src/plugins/chat/chat_stream.py | 2 ++ src/plugins/chat/message.py | 2 ++ src/plugins/chat/message_sender.py | 2 ++ src/plugins/chat/utils_image.py | 2 ++ src/plugins/config_reload/api.py | 2 ++ src/plugins/emoji_system/emoji_manager.py | 2 ++ src/plugins/heartFC_chat/heartFC_chat.py | 2 ++ src/plugins/heartFC_chat/heartFC_sender.py | 2 ++ src/plugins/knowledge/src/embedding_store.py | 2 ++ src/plugins/memory_system/Hippocampus.py | 2 ++ src/plugins/memory_system/debug_memory.py | 2 ++ src/plugins/memory_system/manually_alter_memory.py | 2 ++ src/plugins/memory_system/offline_llm.py | 2 ++ src/plugins/memory_system/sample_distribution.py | 2 ++ src/plugins/models/utils_model.py | 2 ++ src/plugins/utils/prompt_builder.py | 2 ++ src/plugins/utils/timer_calculator.py | 2 ++ src/plugins/willing/willing_manager.py | 2 ++ src/plugins/zhishi/knowledge_library.py | 3 +++ 32 files changed, 65 insertions(+) diff --git a/bot.py b/bot.py index 9a4a50002..ecdbd2b97 100644 --- a/bot.py +++ b/bot.py @@ -13,6 +13,8 @@ from src.common.logger_manager import get_logger # from src.common.logger import LogConfig, CONFIRM_STYLE_CONFIG from src.common.crash_logger import install_crash_handler from src.main import MainSystem +from rich.traceback import install +install(show_locals=True, extra_lines=3) logger = get_logger("main") diff --git a/src/common/database.py b/src/common/database.py index ee0ead0bd..846c4ee71 100644 --- a/src/common/database.py +++ b/src/common/database.py @@ -1,6 +1,8 @@ import os from pymongo import MongoClient from pymongo.database import Database +from rich.traceback import install +install(show_locals=True, extra_lines=3) _client = None _db = None diff --git a/src/common/log_decorators.py b/src/common/log_decorators.py index 9838717f9..4e8819843 100644 --- a/src/common/log_decorators.py +++ b/src/common/log_decorators.py @@ -2,6 +2,8 @@ import functools import inspect from typing import Callable, Any from .logger import logger, add_custom_style_handler +from rich.traceback import install +install(show_locals=True, extra_lines=3) def use_log_style( diff --git a/src/common/server.py b/src/common/server.py index 517996293..0511f4437 100644 --- a/src/common/server.py +++ b/src/common/server.py @@ -2,6 +2,8 @@ from fastapi import FastAPI, APIRouter from typing import Optional from uvicorn import Config, Server as UvicornServer import os +from rich.traceback import install +install(show_locals=True, extra_lines=3) class Server: diff --git a/src/config/config.py b/src/config/config.py index f5be7ec68..29c28c833 100644 --- a/src/config/config.py +++ b/src/config/config.py @@ -14,6 +14,8 @@ from packaging.version import Version, InvalidVersion from packaging.specifiers import SpecifierSet, InvalidSpecifier from src.common.logger_manager import get_logger +from rich.traceback import install +install(show_locals=True, extra_lines=3) # 配置主程序日志格式 diff --git a/src/do_tool/tool_can_use/base_tool.py b/src/do_tool/tool_can_use/base_tool.py index 425708845..298bc15a1 100644 --- a/src/do_tool/tool_can_use/base_tool.py +++ b/src/do_tool/tool_can_use/base_tool.py @@ -4,6 +4,8 @@ import importlib import pkgutil import os from src.common.logger_manager import get_logger +from rich.traceback import install +install(show_locals=True, extra_lines=3) logger = get_logger("base_tool") diff --git a/src/individuality/individuality.py b/src/individuality/individuality.py index 9ffdfdaab..6befe3e59 100644 --- a/src/individuality/individuality.py +++ b/src/individuality/individuality.py @@ -2,6 +2,8 @@ from typing import Optional from .personality import Personality from .identity import Identity import random +from rich.traceback import install +install(show_locals=True, extra_lines=3) class Individuality: diff --git a/src/individuality/offline_llm.py b/src/individuality/offline_llm.py index 2b5b6dc25..2059d7fdb 100644 --- a/src/individuality/offline_llm.py +++ b/src/individuality/offline_llm.py @@ -6,6 +6,8 @@ from typing import Tuple, Union import aiohttp import requests from src.common.logger import get_module_logger +from rich.traceback import install +install(show_locals=True, extra_lines=3) logger = get_module_logger("offline_llm") diff --git a/src/main.py b/src/main.py index c0e743d66..1f6ed188f 100644 --- a/src/main.py +++ b/src/main.py @@ -17,6 +17,8 @@ from .common.logger_manager import get_logger from .plugins.remote import heartbeat_thread # noqa: F401 from .individuality.individuality import Individuality from .common.server import global_server +from rich.traceback import install +install(show_locals=True, extra_lines=3) logger = get_logger("main") diff --git a/src/plugins/PFC/chat_observer.py b/src/plugins/PFC/chat_observer.py index 1a17db907..675e99636 100644 --- a/src/plugins/PFC/chat_observer.py +++ b/src/plugins/PFC/chat_observer.py @@ -7,6 +7,8 @@ from maim_message import UserInfo from ...config.config import global_config from .chat_states import NotificationManager, create_new_message_notification, create_cold_chat_notification from .message_storage import MongoDBMessageStorage +from rich.traceback import install +install(show_locals=True, extra_lines=3) logger = get_module_logger("chat_observer") diff --git a/src/plugins/PFC/conversation.py b/src/plugins/PFC/conversation.py index 9f744c30c..f7702e1b6 100644 --- a/src/plugins/PFC/conversation.py +++ b/src/plugins/PFC/conversation.py @@ -23,6 +23,8 @@ from .pfc_KnowledgeFetcher import KnowledgeFetcher from .waiter import Waiter import traceback +from rich.traceback import install +install(show_locals=True, extra_lines=3) logger = get_logger("pfc") diff --git a/src/plugins/PFC/message_sender.py b/src/plugins/PFC/message_sender.py index 53c203748..709150c76 100644 --- a/src/plugins/PFC/message_sender.py +++ b/src/plugins/PFC/message_sender.py @@ -8,6 +8,8 @@ from src.plugins.chat.message import MessageSending, MessageSet from src.plugins.chat.message_sender import message_manager from ..storage.storage import MessageStorage from ...config.config import global_config +from rich.traceback import install +install(show_locals=True, extra_lines=3) logger = get_module_logger("message_sender") diff --git a/src/plugins/PFC/pfc.py b/src/plugins/PFC/pfc.py index 6cb1fe83e..4ce98a523 100644 --- a/src/plugins/PFC/pfc.py +++ b/src/plugins/PFC/pfc.py @@ -8,6 +8,8 @@ from src.individuality.individuality import Individuality from .conversation_info import ConversationInfo from .observation_info import ObservationInfo from src.plugins.utils.chat_message_builder import build_readable_messages +from rich.traceback import install +install(show_locals=True, extra_lines=3) if TYPE_CHECKING: pass diff --git a/src/plugins/chat/chat_stream.py b/src/plugins/chat/chat_stream.py index 14d02a81f..d3095f3b7 100644 --- a/src/plugins/chat/chat_stream.py +++ b/src/plugins/chat/chat_stream.py @@ -9,6 +9,8 @@ from ...common.database import db from maim_message import GroupInfo, UserInfo from src.common.logger_manager import get_logger +from rich.traceback import install +install(show_locals=True, extra_lines=3) logger = get_logger("chat_stream") diff --git a/src/plugins/chat/message.py b/src/plugins/chat/message.py index a0ff33ab4..4c11dd980 100644 --- a/src/plugins/chat/message.py +++ b/src/plugins/chat/message.py @@ -9,6 +9,8 @@ from src.common.logger_manager import get_logger from .chat_stream import ChatStream from .utils_image import image_manager from maim_message import Seg, UserInfo, BaseMessageInfo, MessageBase +from rich.traceback import install +install(show_locals=True, extra_lines=3) logger = get_logger("chat_message") diff --git a/src/plugins/chat/message_sender.py b/src/plugins/chat/message_sender.py index 61e2dd49c..aaa48ca8a 100644 --- a/src/plugins/chat/message_sender.py +++ b/src/plugins/chat/message_sender.py @@ -13,6 +13,8 @@ from ...config.config import global_config from .utils import truncate_message, calculate_typing_time, count_messages_between from src.common.logger_manager import get_logger +from rich.traceback import install +install(show_locals=True, extra_lines=3) logger = get_logger("sender") diff --git a/src/plugins/chat/utils_image.py b/src/plugins/chat/utils_image.py index f567c5277..285b63944 100644 --- a/src/plugins/chat/utils_image.py +++ b/src/plugins/chat/utils_image.py @@ -13,6 +13,8 @@ from ...config.config import global_config from ..models.utils_model import LLMRequest from src.common.logger_manager import get_logger +from rich.traceback import install +install(show_locals=True, extra_lines=3) logger = get_logger("chat_image") diff --git a/src/plugins/config_reload/api.py b/src/plugins/config_reload/api.py index 327451e29..93b5d1cbe 100644 --- a/src/plugins/config_reload/api.py +++ b/src/plugins/config_reload/api.py @@ -1,4 +1,6 @@ from fastapi import APIRouter, HTTPException +from rich.traceback import install +install(show_locals=True, extra_lines=3) # 创建APIRouter而不是FastAPI实例 router = APIRouter() diff --git a/src/plugins/emoji_system/emoji_manager.py b/src/plugins/emoji_system/emoji_manager.py index f789f906b..67075e297 100644 --- a/src/plugins/emoji_system/emoji_manager.py +++ b/src/plugins/emoji_system/emoji_manager.py @@ -15,6 +15,8 @@ from ...config.config import global_config from ..chat.utils_image import image_path_to_base64, image_manager from ..models.utils_model import LLMRequest from src.common.logger_manager import get_logger +from rich.traceback import install +install(show_locals=True, extra_lines=3) logger = get_logger("emoji") diff --git a/src/plugins/heartFC_chat/heartFC_chat.py b/src/plugins/heartFC_chat/heartFC_chat.py index f203926f4..077d623bd 100644 --- a/src/plugins/heartFC_chat/heartFC_chat.py +++ b/src/plugins/heartFC_chat/heartFC_chat.py @@ -27,6 +27,8 @@ from src.plugins.chat.utils import process_llm_response from src.plugins.respon_info_catcher.info_catcher import info_catcher_manager from src.plugins.moods.moods import MoodManager from src.heart_flow.utils_chat import get_chat_type_and_target_info +from rich.traceback import install +install(show_locals=True, extra_lines=3) WAITING_TIME_THRESHOLD = 300 # 等待新消息时间阈值,单位秒 diff --git a/src/plugins/heartFC_chat/heartFC_sender.py b/src/plugins/heartFC_chat/heartFC_sender.py index ee4e86ee9..001f578a8 100644 --- a/src/plugins/heartFC_chat/heartFC_sender.py +++ b/src/plugins/heartFC_chat/heartFC_sender.py @@ -9,6 +9,8 @@ from ..storage.storage import MessageStorage from ..chat.utils import truncate_message from src.common.logger_manager import get_logger from src.plugins.chat.utils import calculate_typing_time +from rich.traceback import install +install(show_locals=True, extra_lines=3) logger = get_logger("sender") diff --git a/src/plugins/knowledge/src/embedding_store.py b/src/plugins/knowledge/src/embedding_store.py index 9e60b8e1f..98ab757cc 100644 --- a/src/plugins/knowledge/src/embedding_store.py +++ b/src/plugins/knowledge/src/embedding_store.py @@ -12,6 +12,8 @@ from .llm_client import LLMClient from .lpmmconfig import ENT_NAMESPACE, PG_NAMESPACE, REL_NAMESPACE, global_config from .utils.hash import get_sha256 from .global_logger import logger +from rich.traceback import install +install(show_locals=True, extra_lines=3) @dataclass diff --git a/src/plugins/memory_system/Hippocampus.py b/src/plugins/memory_system/Hippocampus.py index ccc4d4fa4..789da590d 100644 --- a/src/plugins/memory_system/Hippocampus.py +++ b/src/plugins/memory_system/Hippocampus.py @@ -20,6 +20,8 @@ from ..utils.chat_message_builder import ( ) # 导入 build_readable_messages from ..chat.utils import translate_timestamp_to_human_readable from .memory_config import MemoryConfig +from rich.traceback import install +install(show_locals=True, extra_lines=3) def calculate_information_content(text): diff --git a/src/plugins/memory_system/debug_memory.py b/src/plugins/memory_system/debug_memory.py index 4e357557f..03c8fcac8 100644 --- a/src/plugins/memory_system/debug_memory.py +++ b/src/plugins/memory_system/debug_memory.py @@ -8,6 +8,8 @@ import os sys.path.append(os.path.dirname(os.path.dirname(os.path.dirname(os.path.dirname(__file__))))) from src.plugins.memory_system.Hippocampus import HippocampusManager from src.config.config import global_config +from rich.traceback import install +install(show_locals=True, extra_lines=3) async def test_memory_system(): diff --git a/src/plugins/memory_system/manually_alter_memory.py b/src/plugins/memory_system/manually_alter_memory.py index 1452d3d56..4054265b3 100644 --- a/src/plugins/memory_system/manually_alter_memory.py +++ b/src/plugins/memory_system/manually_alter_memory.py @@ -9,6 +9,8 @@ from Hippocampus import Hippocampus # 海马体和记忆图 from dotenv import load_dotenv +from rich.traceback import install +install(show_locals=True, extra_lines=3) """ diff --git a/src/plugins/memory_system/offline_llm.py b/src/plugins/memory_system/offline_llm.py index fc50b17bc..f86ec4111 100644 --- a/src/plugins/memory_system/offline_llm.py +++ b/src/plugins/memory_system/offline_llm.py @@ -6,6 +6,8 @@ from typing import Tuple, Union import aiohttp import requests from src.common.logger import get_module_logger +from rich.traceback import install +install(show_locals=True, extra_lines=3) logger = get_module_logger("offline_llm") diff --git a/src/plugins/memory_system/sample_distribution.py b/src/plugins/memory_system/sample_distribution.py index 5dae2f266..f4fec12b8 100644 --- a/src/plugins/memory_system/sample_distribution.py +++ b/src/plugins/memory_system/sample_distribution.py @@ -1,6 +1,8 @@ import numpy as np from scipy import stats from datetime import datetime, timedelta +from rich.traceback import install +install(show_locals=True, extra_lines=3) class DistributionVisualizer: diff --git a/src/plugins/models/utils_model.py b/src/plugins/models/utils_model.py index 6b9c04164..60b507b9d 100644 --- a/src/plugins/models/utils_model.py +++ b/src/plugins/models/utils_model.py @@ -14,6 +14,8 @@ import io import os from ...common.database import db from ...config.config import global_config +from rich.traceback import install +install(show_locals=True, extra_lines=3) logger = get_module_logger("model_utils") diff --git a/src/plugins/utils/prompt_builder.py b/src/plugins/utils/prompt_builder.py index 578d9677f..023470331 100644 --- a/src/plugins/utils/prompt_builder.py +++ b/src/plugins/utils/prompt_builder.py @@ -4,6 +4,8 @@ from contextlib import asynccontextmanager import asyncio from src.common.logger import get_module_logger # import traceback +from rich.traceback import install +install(show_locals=True, extra_lines=3) logger = get_module_logger("prompt_build") diff --git a/src/plugins/utils/timer_calculator.py b/src/plugins/utils/timer_calculator.py index 13bc26f13..076a4fe55 100644 --- a/src/plugins/utils/timer_calculator.py +++ b/src/plugins/utils/timer_calculator.py @@ -2,6 +2,8 @@ from time import perf_counter from functools import wraps from typing import Optional, Dict, Callable import asyncio +from rich.traceback import install +install(show_locals=True, extra_lines=3) """ # 更好的计时器 diff --git a/src/plugins/willing/willing_manager.py b/src/plugins/willing/willing_manager.py index c26325b1c..dc4abfae5 100644 --- a/src/plugins/willing/willing_manager.py +++ b/src/plugins/willing/willing_manager.py @@ -8,6 +8,8 @@ from abc import ABC, abstractmethod import importlib from typing import Dict, Optional import asyncio +from rich.traceback import install +install(show_locals=True, extra_lines=3) """ 基类方法概览: diff --git a/src/plugins/zhishi/knowledge_library.py b/src/plugins/zhishi/knowledge_library.py index f8914c2f6..1a8d35a32 100644 --- a/src/plugins/zhishi/knowledge_library.py +++ b/src/plugins/zhishi/knowledge_library.py @@ -7,6 +7,8 @@ from datetime import datetime from tqdm import tqdm from rich.console import Console from rich.table import Table +from rich.traceback import install +install(show_locals=True, extra_lines=3) # 添加项目根目录到 Python 路径 root_path = os.path.abspath(os.path.join(os.path.dirname(__file__), "../../..")) @@ -15,6 +17,7 @@ sys.path.append(root_path) # 现在可以导入src模块 from src.common.database import db # noqa E402 + # 加载根目录下的env.edv文件 env_path = os.path.join(root_path, ".env") if not os.path.exists(env_path): From c88a73597a6c07fab73cf5d49f4cc84b2b54e21e Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Thu, 1 May 2025 19:18:37 +0000 Subject: [PATCH 2/6] =?UTF-8?q?=F0=9F=A4=96=20=E8=87=AA=E5=8A=A8=E6=A0=BC?= =?UTF-8?q?=E5=BC=8F=E5=8C=96=E4=BB=A3=E7=A0=81=20[skip=20ci]?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- bot.py | 1 + src/common/database.py | 1 + src/common/log_decorators.py | 1 + src/common/server.py | 1 + src/config/config.py | 1 + src/do_tool/tool_can_use/base_tool.py | 1 + src/individuality/individuality.py | 1 + src/individuality/offline_llm.py | 1 + src/main.py | 1 + src/plugins/PFC/chat_observer.py | 1 + src/plugins/PFC/conversation.py | 1 + src/plugins/PFC/message_sender.py | 1 + src/plugins/PFC/pfc.py | 1 + src/plugins/chat/chat_stream.py | 1 + src/plugins/chat/message.py | 1 + src/plugins/chat/message_sender.py | 1 + src/plugins/chat/utils_image.py | 1 + src/plugins/config_reload/api.py | 1 + src/plugins/emoji_system/emoji_manager.py | 1 + src/plugins/heartFC_chat/heartFC_chat.py | 1 + src/plugins/heartFC_chat/heartFC_sender.py | 1 + src/plugins/knowledge/src/embedding_store.py | 1 + src/plugins/memory_system/Hippocampus.py | 1 + src/plugins/memory_system/debug_memory.py | 1 + src/plugins/memory_system/manually_alter_memory.py | 1 + src/plugins/memory_system/offline_llm.py | 1 + src/plugins/memory_system/sample_distribution.py | 1 + src/plugins/models/utils_model.py | 1 + src/plugins/utils/prompt_builder.py | 2 ++ src/plugins/utils/timer_calculator.py | 1 + src/plugins/willing/willing_manager.py | 1 + src/plugins/zhishi/knowledge_library.py | 1 + 32 files changed, 33 insertions(+) diff --git a/bot.py b/bot.py index ecdbd2b97..5d811d4ec 100644 --- a/bot.py +++ b/bot.py @@ -14,6 +14,7 @@ from src.common.logger_manager import get_logger from src.common.crash_logger import install_crash_handler from src.main import MainSystem from rich.traceback import install + install(show_locals=True, extra_lines=3) diff --git a/src/common/database.py b/src/common/database.py index 846c4ee71..66a2dc161 100644 --- a/src/common/database.py +++ b/src/common/database.py @@ -2,6 +2,7 @@ import os from pymongo import MongoClient from pymongo.database import Database from rich.traceback import install + install(show_locals=True, extra_lines=3) _client = None diff --git a/src/common/log_decorators.py b/src/common/log_decorators.py index 4e8819843..a57fae796 100644 --- a/src/common/log_decorators.py +++ b/src/common/log_decorators.py @@ -3,6 +3,7 @@ import inspect from typing import Callable, Any from .logger import logger, add_custom_style_handler from rich.traceback import install + install(show_locals=True, extra_lines=3) diff --git a/src/common/server.py b/src/common/server.py index 0511f4437..c080e28a3 100644 --- a/src/common/server.py +++ b/src/common/server.py @@ -3,6 +3,7 @@ from typing import Optional from uvicorn import Config, Server as UvicornServer import os from rich.traceback import install + install(show_locals=True, extra_lines=3) diff --git a/src/config/config.py b/src/config/config.py index 29c28c833..a067633be 100644 --- a/src/config/config.py +++ b/src/config/config.py @@ -15,6 +15,7 @@ from packaging.specifiers import SpecifierSet, InvalidSpecifier from src.common.logger_manager import get_logger from rich.traceback import install + install(show_locals=True, extra_lines=3) diff --git a/src/do_tool/tool_can_use/base_tool.py b/src/do_tool/tool_can_use/base_tool.py index 298bc15a1..88da036d5 100644 --- a/src/do_tool/tool_can_use/base_tool.py +++ b/src/do_tool/tool_can_use/base_tool.py @@ -5,6 +5,7 @@ import pkgutil import os from src.common.logger_manager import get_logger from rich.traceback import install + install(show_locals=True, extra_lines=3) logger = get_logger("base_tool") diff --git a/src/individuality/individuality.py b/src/individuality/individuality.py index 6befe3e59..963fae0e6 100644 --- a/src/individuality/individuality.py +++ b/src/individuality/individuality.py @@ -3,6 +3,7 @@ from .personality import Personality from .identity import Identity import random from rich.traceback import install + install(show_locals=True, extra_lines=3) diff --git a/src/individuality/offline_llm.py b/src/individuality/offline_llm.py index 2059d7fdb..0e1a446c8 100644 --- a/src/individuality/offline_llm.py +++ b/src/individuality/offline_llm.py @@ -7,6 +7,7 @@ import aiohttp import requests from src.common.logger import get_module_logger from rich.traceback import install + install(show_locals=True, extra_lines=3) logger = get_module_logger("offline_llm") diff --git a/src/main.py b/src/main.py index 1f6ed188f..3de3e8805 100644 --- a/src/main.py +++ b/src/main.py @@ -18,6 +18,7 @@ from .plugins.remote import heartbeat_thread # noqa: F401 from .individuality.individuality import Individuality from .common.server import global_server from rich.traceback import install + install(show_locals=True, extra_lines=3) logger = get_logger("main") diff --git a/src/plugins/PFC/chat_observer.py b/src/plugins/PFC/chat_observer.py index 675e99636..34b66316a 100644 --- a/src/plugins/PFC/chat_observer.py +++ b/src/plugins/PFC/chat_observer.py @@ -8,6 +8,7 @@ from ...config.config import global_config from .chat_states import NotificationManager, create_new_message_notification, create_cold_chat_notification from .message_storage import MongoDBMessageStorage from rich.traceback import install + install(show_locals=True, extra_lines=3) logger = get_module_logger("chat_observer") diff --git a/src/plugins/PFC/conversation.py b/src/plugins/PFC/conversation.py index f7702e1b6..925fd7b50 100644 --- a/src/plugins/PFC/conversation.py +++ b/src/plugins/PFC/conversation.py @@ -24,6 +24,7 @@ from .waiter import Waiter import traceback from rich.traceback import install + install(show_locals=True, extra_lines=3) logger = get_logger("pfc") diff --git a/src/plugins/PFC/message_sender.py b/src/plugins/PFC/message_sender.py index 709150c76..f10857682 100644 --- a/src/plugins/PFC/message_sender.py +++ b/src/plugins/PFC/message_sender.py @@ -9,6 +9,7 @@ from src.plugins.chat.message_sender import message_manager from ..storage.storage import MessageStorage from ...config.config import global_config from rich.traceback import install + install(show_locals=True, extra_lines=3) diff --git a/src/plugins/PFC/pfc.py b/src/plugins/PFC/pfc.py index 4ce98a523..50f7bf4c0 100644 --- a/src/plugins/PFC/pfc.py +++ b/src/plugins/PFC/pfc.py @@ -9,6 +9,7 @@ from .conversation_info import ConversationInfo from .observation_info import ObservationInfo from src.plugins.utils.chat_message_builder import build_readable_messages from rich.traceback import install + install(show_locals=True, extra_lines=3) if TYPE_CHECKING: diff --git a/src/plugins/chat/chat_stream.py b/src/plugins/chat/chat_stream.py index d3095f3b7..a949247c7 100644 --- a/src/plugins/chat/chat_stream.py +++ b/src/plugins/chat/chat_stream.py @@ -10,6 +10,7 @@ from maim_message import GroupInfo, UserInfo from src.common.logger_manager import get_logger from rich.traceback import install + install(show_locals=True, extra_lines=3) diff --git a/src/plugins/chat/message.py b/src/plugins/chat/message.py index 4c11dd980..354082e17 100644 --- a/src/plugins/chat/message.py +++ b/src/plugins/chat/message.py @@ -10,6 +10,7 @@ from .chat_stream import ChatStream from .utils_image import image_manager from maim_message import Seg, UserInfo, BaseMessageInfo, MessageBase from rich.traceback import install + install(show_locals=True, extra_lines=3) logger = get_logger("chat_message") diff --git a/src/plugins/chat/message_sender.py b/src/plugins/chat/message_sender.py index aaa48ca8a..8bfee44bd 100644 --- a/src/plugins/chat/message_sender.py +++ b/src/plugins/chat/message_sender.py @@ -14,6 +14,7 @@ from .utils import truncate_message, calculate_typing_time, count_messages_betwe from src.common.logger_manager import get_logger from rich.traceback import install + install(show_locals=True, extra_lines=3) diff --git a/src/plugins/chat/utils_image.py b/src/plugins/chat/utils_image.py index 285b63944..1f7345025 100644 --- a/src/plugins/chat/utils_image.py +++ b/src/plugins/chat/utils_image.py @@ -14,6 +14,7 @@ from ..models.utils_model import LLMRequest from src.common.logger_manager import get_logger from rich.traceback import install + install(show_locals=True, extra_lines=3) logger = get_logger("chat_image") diff --git a/src/plugins/config_reload/api.py b/src/plugins/config_reload/api.py index 93b5d1cbe..ee0a5454d 100644 --- a/src/plugins/config_reload/api.py +++ b/src/plugins/config_reload/api.py @@ -1,5 +1,6 @@ from fastapi import APIRouter, HTTPException from rich.traceback import install + install(show_locals=True, extra_lines=3) # 创建APIRouter而不是FastAPI实例 diff --git a/src/plugins/emoji_system/emoji_manager.py b/src/plugins/emoji_system/emoji_manager.py index 67075e297..24266c082 100644 --- a/src/plugins/emoji_system/emoji_manager.py +++ b/src/plugins/emoji_system/emoji_manager.py @@ -16,6 +16,7 @@ from ..chat.utils_image import image_path_to_base64, image_manager from ..models.utils_model import LLMRequest from src.common.logger_manager import get_logger from rich.traceback import install + install(show_locals=True, extra_lines=3) logger = get_logger("emoji") diff --git a/src/plugins/heartFC_chat/heartFC_chat.py b/src/plugins/heartFC_chat/heartFC_chat.py index 077d623bd..712b6af5e 100644 --- a/src/plugins/heartFC_chat/heartFC_chat.py +++ b/src/plugins/heartFC_chat/heartFC_chat.py @@ -28,6 +28,7 @@ from src.plugins.respon_info_catcher.info_catcher import info_catcher_manager from src.plugins.moods.moods import MoodManager from src.heart_flow.utils_chat import get_chat_type_and_target_info from rich.traceback import install + install(show_locals=True, extra_lines=3) diff --git a/src/plugins/heartFC_chat/heartFC_sender.py b/src/plugins/heartFC_chat/heartFC_sender.py index 001f578a8..6fab5d62b 100644 --- a/src/plugins/heartFC_chat/heartFC_sender.py +++ b/src/plugins/heartFC_chat/heartFC_sender.py @@ -10,6 +10,7 @@ from ..chat.utils import truncate_message from src.common.logger_manager import get_logger from src.plugins.chat.utils import calculate_typing_time from rich.traceback import install + install(show_locals=True, extra_lines=3) diff --git a/src/plugins/knowledge/src/embedding_store.py b/src/plugins/knowledge/src/embedding_store.py index 98ab757cc..72c6c7b58 100644 --- a/src/plugins/knowledge/src/embedding_store.py +++ b/src/plugins/knowledge/src/embedding_store.py @@ -13,6 +13,7 @@ from .lpmmconfig import ENT_NAMESPACE, PG_NAMESPACE, REL_NAMESPACE, global_confi from .utils.hash import get_sha256 from .global_logger import logger from rich.traceback import install + install(show_locals=True, extra_lines=3) diff --git a/src/plugins/memory_system/Hippocampus.py b/src/plugins/memory_system/Hippocampus.py index 789da590d..11ba8f406 100644 --- a/src/plugins/memory_system/Hippocampus.py +++ b/src/plugins/memory_system/Hippocampus.py @@ -21,6 +21,7 @@ from ..utils.chat_message_builder import ( from ..chat.utils import translate_timestamp_to_human_readable from .memory_config import MemoryConfig from rich.traceback import install + install(show_locals=True, extra_lines=3) diff --git a/src/plugins/memory_system/debug_memory.py b/src/plugins/memory_system/debug_memory.py index 03c8fcac8..ae767c853 100644 --- a/src/plugins/memory_system/debug_memory.py +++ b/src/plugins/memory_system/debug_memory.py @@ -9,6 +9,7 @@ sys.path.append(os.path.dirname(os.path.dirname(os.path.dirname(os.path.dirname( from src.plugins.memory_system.Hippocampus import HippocampusManager from src.config.config import global_config from rich.traceback import install + install(show_locals=True, extra_lines=3) diff --git a/src/plugins/memory_system/manually_alter_memory.py b/src/plugins/memory_system/manually_alter_memory.py index 4054265b3..10a75738c 100644 --- a/src/plugins/memory_system/manually_alter_memory.py +++ b/src/plugins/memory_system/manually_alter_memory.py @@ -10,6 +10,7 @@ from Hippocampus import Hippocampus # 海马体和记忆图 from dotenv import load_dotenv from rich.traceback import install + install(show_locals=True, extra_lines=3) diff --git a/src/plugins/memory_system/offline_llm.py b/src/plugins/memory_system/offline_llm.py index f86ec4111..335a76d34 100644 --- a/src/plugins/memory_system/offline_llm.py +++ b/src/plugins/memory_system/offline_llm.py @@ -7,6 +7,7 @@ import aiohttp import requests from src.common.logger import get_module_logger from rich.traceback import install + install(show_locals=True, extra_lines=3) logger = get_module_logger("offline_llm") diff --git a/src/plugins/memory_system/sample_distribution.py b/src/plugins/memory_system/sample_distribution.py index f4fec12b8..76796728f 100644 --- a/src/plugins/memory_system/sample_distribution.py +++ b/src/plugins/memory_system/sample_distribution.py @@ -2,6 +2,7 @@ import numpy as np from scipy import stats from datetime import datetime, timedelta from rich.traceback import install + install(show_locals=True, extra_lines=3) diff --git a/src/plugins/models/utils_model.py b/src/plugins/models/utils_model.py index 60b507b9d..7c7fe713e 100644 --- a/src/plugins/models/utils_model.py +++ b/src/plugins/models/utils_model.py @@ -15,6 +15,7 @@ import os from ...common.database import db from ...config.config import global_config from rich.traceback import install + install(show_locals=True, extra_lines=3) logger = get_module_logger("model_utils") diff --git a/src/plugins/utils/prompt_builder.py b/src/plugins/utils/prompt_builder.py index 023470331..c4555a552 100644 --- a/src/plugins/utils/prompt_builder.py +++ b/src/plugins/utils/prompt_builder.py @@ -3,8 +3,10 @@ import re from contextlib import asynccontextmanager import asyncio from src.common.logger import get_module_logger + # import traceback from rich.traceback import install + install(show_locals=True, extra_lines=3) logger = get_module_logger("prompt_build") diff --git a/src/plugins/utils/timer_calculator.py b/src/plugins/utils/timer_calculator.py index 076a4fe55..d66f21cc3 100644 --- a/src/plugins/utils/timer_calculator.py +++ b/src/plugins/utils/timer_calculator.py @@ -3,6 +3,7 @@ from functools import wraps from typing import Optional, Dict, Callable import asyncio from rich.traceback import install + install(show_locals=True, extra_lines=3) """ diff --git a/src/plugins/willing/willing_manager.py b/src/plugins/willing/willing_manager.py index dc4abfae5..a5884da2b 100644 --- a/src/plugins/willing/willing_manager.py +++ b/src/plugins/willing/willing_manager.py @@ -9,6 +9,7 @@ import importlib from typing import Dict, Optional import asyncio from rich.traceback import install + install(show_locals=True, extra_lines=3) """ diff --git a/src/plugins/zhishi/knowledge_library.py b/src/plugins/zhishi/knowledge_library.py index 1a8d35a32..26af3bdac 100644 --- a/src/plugins/zhishi/knowledge_library.py +++ b/src/plugins/zhishi/knowledge_library.py @@ -8,6 +8,7 @@ from tqdm import tqdm from rich.console import Console from rich.table import Table from rich.traceback import install + install(show_locals=True, extra_lines=3) # 添加项目根目录到 Python 路径 From edda83453886ab2389af3d66e1aee31c2a0b319f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=A2=A8=E6=A2=93=E6=9F=92?= <1787882683@qq.com> Date: Fri, 2 May 2025 12:01:05 +0800 Subject: [PATCH 3/6] =?UTF-8?q?fix:=20=E7=A7=BB=E9=99=A4Traceback=E5=87=BD?= =?UTF-8?q?=E6=95=B0=E4=B8=AD=E7=9A=84=20show=5Flocals=20=E5=8F=82?= =?UTF-8?q?=E6=95=B0=E4=BB=A5=E7=AE=80=E5=8C=96=E9=94=99=E8=AF=AF=E8=BF=BD?= =?UTF-8?q?=E8=B8=AA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- bot.py | 2 +- src/common/database.py | 2 +- src/common/log_decorators.py | 2 +- src/common/server.py | 2 +- src/config/config.py | 2 +- src/do_tool/tool_can_use/base_tool.py | 2 +- src/individuality/individuality.py | 2 +- src/individuality/offline_llm.py | 2 +- src/main.py | 2 +- src/plugins/PFC/chat_observer.py | 2 +- src/plugins/PFC/conversation.py | 2 +- src/plugins/PFC/message_sender.py | 2 +- src/plugins/PFC/pfc.py | 2 +- src/plugins/chat/chat_stream.py | 2 +- src/plugins/chat/message.py | 2 +- src/plugins/chat/message_sender.py | 2 +- src/plugins/chat/utils_image.py | 2 +- src/plugins/config_reload/api.py | 2 +- src/plugins/emoji_system/emoji_manager.py | 2 +- src/plugins/heartFC_chat/heartFC_chat.py | 2 +- src/plugins/heartFC_chat/heartFC_sender.py | 2 +- src/plugins/knowledge/src/embedding_store.py | 2 +- src/plugins/memory_system/Hippocampus.py | 2 +- src/plugins/memory_system/debug_memory.py | 2 +- src/plugins/memory_system/manually_alter_memory.py | 2 +- src/plugins/memory_system/offline_llm.py | 2 +- src/plugins/memory_system/sample_distribution.py | 2 +- src/plugins/models/utils_model.py | 2 +- src/plugins/utils/prompt_builder.py | 2 +- src/plugins/utils/timer_calculator.py | 2 +- src/plugins/willing/willing_manager.py | 2 +- src/plugins/zhishi/knowledge_library.py | 2 +- 32 files changed, 32 insertions(+), 32 deletions(-) diff --git a/bot.py b/bot.py index 5d811d4ec..41847a01f 100644 --- a/bot.py +++ b/bot.py @@ -15,7 +15,7 @@ from src.common.crash_logger import install_crash_handler from src.main import MainSystem from rich.traceback import install -install(show_locals=True, extra_lines=3) +install(extra_lines=3) logger = get_logger("main") diff --git a/src/common/database.py b/src/common/database.py index 66a2dc161..752f746db 100644 --- a/src/common/database.py +++ b/src/common/database.py @@ -3,7 +3,7 @@ from pymongo import MongoClient from pymongo.database import Database from rich.traceback import install -install(show_locals=True, extra_lines=3) +install(extra_lines=3) _client = None _db = None diff --git a/src/common/log_decorators.py b/src/common/log_decorators.py index a57fae796..414ba923b 100644 --- a/src/common/log_decorators.py +++ b/src/common/log_decorators.py @@ -4,7 +4,7 @@ from typing import Callable, Any from .logger import logger, add_custom_style_handler from rich.traceback import install -install(show_locals=True, extra_lines=3) +install(extra_lines=3) def use_log_style( diff --git a/src/common/server.py b/src/common/server.py index c080e28a3..ff6106a7c 100644 --- a/src/common/server.py +++ b/src/common/server.py @@ -4,7 +4,7 @@ from uvicorn import Config, Server as UvicornServer import os from rich.traceback import install -install(show_locals=True, extra_lines=3) +install(extra_lines=3) class Server: diff --git a/src/config/config.py b/src/config/config.py index a067633be..28d947ef1 100644 --- a/src/config/config.py +++ b/src/config/config.py @@ -16,7 +16,7 @@ from packaging.specifiers import SpecifierSet, InvalidSpecifier from src.common.logger_manager import get_logger from rich.traceback import install -install(show_locals=True, extra_lines=3) +install(extra_lines=3) # 配置主程序日志格式 diff --git a/src/do_tool/tool_can_use/base_tool.py b/src/do_tool/tool_can_use/base_tool.py index 88da036d5..b0f04ffe8 100644 --- a/src/do_tool/tool_can_use/base_tool.py +++ b/src/do_tool/tool_can_use/base_tool.py @@ -6,7 +6,7 @@ import os from src.common.logger_manager import get_logger from rich.traceback import install -install(show_locals=True, extra_lines=3) +install(extra_lines=3) logger = get_logger("base_tool") diff --git a/src/individuality/individuality.py b/src/individuality/individuality.py index 963fae0e6..38131ea15 100644 --- a/src/individuality/individuality.py +++ b/src/individuality/individuality.py @@ -4,7 +4,7 @@ from .identity import Identity import random from rich.traceback import install -install(show_locals=True, extra_lines=3) +install(extra_lines=3) class Individuality: diff --git a/src/individuality/offline_llm.py b/src/individuality/offline_llm.py index 0e1a446c8..cc9560011 100644 --- a/src/individuality/offline_llm.py +++ b/src/individuality/offline_llm.py @@ -8,7 +8,7 @@ import requests from src.common.logger import get_module_logger from rich.traceback import install -install(show_locals=True, extra_lines=3) +install(extra_lines=3) logger = get_module_logger("offline_llm") diff --git a/src/main.py b/src/main.py index 3de3e8805..26a56ca2c 100644 --- a/src/main.py +++ b/src/main.py @@ -19,7 +19,7 @@ from .individuality.individuality import Individuality from .common.server import global_server from rich.traceback import install -install(show_locals=True, extra_lines=3) +install(extra_lines=3) logger = get_logger("main") diff --git a/src/plugins/PFC/chat_observer.py b/src/plugins/PFC/chat_observer.py index 34b66316a..22cbf27d3 100644 --- a/src/plugins/PFC/chat_observer.py +++ b/src/plugins/PFC/chat_observer.py @@ -9,7 +9,7 @@ from .chat_states import NotificationManager, create_new_message_notification, c from .message_storage import MongoDBMessageStorage from rich.traceback import install -install(show_locals=True, extra_lines=3) +install(extra_lines=3) logger = get_module_logger("chat_observer") diff --git a/src/plugins/PFC/conversation.py b/src/plugins/PFC/conversation.py index 925fd7b50..0bc4cae8d 100644 --- a/src/plugins/PFC/conversation.py +++ b/src/plugins/PFC/conversation.py @@ -25,7 +25,7 @@ from .waiter import Waiter import traceback from rich.traceback import install -install(show_locals=True, extra_lines=3) +install(extra_lines=3) logger = get_logger("pfc") diff --git a/src/plugins/PFC/message_sender.py b/src/plugins/PFC/message_sender.py index f10857682..12c2143ea 100644 --- a/src/plugins/PFC/message_sender.py +++ b/src/plugins/PFC/message_sender.py @@ -10,7 +10,7 @@ from ..storage.storage import MessageStorage from ...config.config import global_config from rich.traceback import install -install(show_locals=True, extra_lines=3) +install(extra_lines=3) logger = get_module_logger("message_sender") diff --git a/src/plugins/PFC/pfc.py b/src/plugins/PFC/pfc.py index 50f7bf4c0..b17ee21d9 100644 --- a/src/plugins/PFC/pfc.py +++ b/src/plugins/PFC/pfc.py @@ -10,7 +10,7 @@ from .observation_info import ObservationInfo from src.plugins.utils.chat_message_builder import build_readable_messages from rich.traceback import install -install(show_locals=True, extra_lines=3) +install(extra_lines=3) if TYPE_CHECKING: pass diff --git a/src/plugins/chat/chat_stream.py b/src/plugins/chat/chat_stream.py index a949247c7..53ebd5026 100644 --- a/src/plugins/chat/chat_stream.py +++ b/src/plugins/chat/chat_stream.py @@ -11,7 +11,7 @@ from maim_message import GroupInfo, UserInfo from src.common.logger_manager import get_logger from rich.traceback import install -install(show_locals=True, extra_lines=3) +install(extra_lines=3) logger = get_logger("chat_stream") diff --git a/src/plugins/chat/message.py b/src/plugins/chat/message.py index 354082e17..b9c152889 100644 --- a/src/plugins/chat/message.py +++ b/src/plugins/chat/message.py @@ -11,7 +11,7 @@ from .utils_image import image_manager from maim_message import Seg, UserInfo, BaseMessageInfo, MessageBase from rich.traceback import install -install(show_locals=True, extra_lines=3) +install(extra_lines=3) logger = get_logger("chat_message") diff --git a/src/plugins/chat/message_sender.py b/src/plugins/chat/message_sender.py index 8bfee44bd..b65ae8955 100644 --- a/src/plugins/chat/message_sender.py +++ b/src/plugins/chat/message_sender.py @@ -15,7 +15,7 @@ from .utils import truncate_message, calculate_typing_time, count_messages_betwe from src.common.logger_manager import get_logger from rich.traceback import install -install(show_locals=True, extra_lines=3) +install(extra_lines=3) logger = get_logger("sender") diff --git a/src/plugins/chat/utils_image.py b/src/plugins/chat/utils_image.py index 1f7345025..5508ad233 100644 --- a/src/plugins/chat/utils_image.py +++ b/src/plugins/chat/utils_image.py @@ -15,7 +15,7 @@ from ..models.utils_model import LLMRequest from src.common.logger_manager import get_logger from rich.traceback import install -install(show_locals=True, extra_lines=3) +install(extra_lines=3) logger = get_logger("chat_image") diff --git a/src/plugins/config_reload/api.py b/src/plugins/config_reload/api.py index ee0a5454d..56240b88e 100644 --- a/src/plugins/config_reload/api.py +++ b/src/plugins/config_reload/api.py @@ -1,7 +1,7 @@ from fastapi import APIRouter, HTTPException from rich.traceback import install -install(show_locals=True, extra_lines=3) +install(extra_lines=3) # 创建APIRouter而不是FastAPI实例 router = APIRouter() diff --git a/src/plugins/emoji_system/emoji_manager.py b/src/plugins/emoji_system/emoji_manager.py index 24266c082..86dab9d93 100644 --- a/src/plugins/emoji_system/emoji_manager.py +++ b/src/plugins/emoji_system/emoji_manager.py @@ -17,7 +17,7 @@ from ..models.utils_model import LLMRequest from src.common.logger_manager import get_logger from rich.traceback import install -install(show_locals=True, extra_lines=3) +install(extra_lines=3) logger = get_logger("emoji") diff --git a/src/plugins/heartFC_chat/heartFC_chat.py b/src/plugins/heartFC_chat/heartFC_chat.py index 712b6af5e..28c17d9a4 100644 --- a/src/plugins/heartFC_chat/heartFC_chat.py +++ b/src/plugins/heartFC_chat/heartFC_chat.py @@ -29,7 +29,7 @@ from src.plugins.moods.moods import MoodManager from src.heart_flow.utils_chat import get_chat_type_and_target_info from rich.traceback import install -install(show_locals=True, extra_lines=3) +install(extra_lines=3) WAITING_TIME_THRESHOLD = 300 # 等待新消息时间阈值,单位秒 diff --git a/src/plugins/heartFC_chat/heartFC_sender.py b/src/plugins/heartFC_chat/heartFC_sender.py index 6fab5d62b..b193ae44a 100644 --- a/src/plugins/heartFC_chat/heartFC_sender.py +++ b/src/plugins/heartFC_chat/heartFC_sender.py @@ -11,7 +11,7 @@ from src.common.logger_manager import get_logger from src.plugins.chat.utils import calculate_typing_time from rich.traceback import install -install(show_locals=True, extra_lines=3) +install(extra_lines=3) logger = get_logger("sender") diff --git a/src/plugins/knowledge/src/embedding_store.py b/src/plugins/knowledge/src/embedding_store.py index 72c6c7b58..8e0d116b6 100644 --- a/src/plugins/knowledge/src/embedding_store.py +++ b/src/plugins/knowledge/src/embedding_store.py @@ -14,7 +14,7 @@ from .utils.hash import get_sha256 from .global_logger import logger from rich.traceback import install -install(show_locals=True, extra_lines=3) +install(extra_lines=3) @dataclass diff --git a/src/plugins/memory_system/Hippocampus.py b/src/plugins/memory_system/Hippocampus.py index 11ba8f406..24d320f78 100644 --- a/src/plugins/memory_system/Hippocampus.py +++ b/src/plugins/memory_system/Hippocampus.py @@ -22,7 +22,7 @@ from ..chat.utils import translate_timestamp_to_human_readable from .memory_config import MemoryConfig from rich.traceback import install -install(show_locals=True, extra_lines=3) +install(extra_lines=3) def calculate_information_content(text): diff --git a/src/plugins/memory_system/debug_memory.py b/src/plugins/memory_system/debug_memory.py index ae767c853..8f79c6a8e 100644 --- a/src/plugins/memory_system/debug_memory.py +++ b/src/plugins/memory_system/debug_memory.py @@ -10,7 +10,7 @@ from src.plugins.memory_system.Hippocampus import HippocampusManager from src.config.config import global_config from rich.traceback import install -install(show_locals=True, extra_lines=3) +install(extra_lines=3) async def test_memory_system(): diff --git a/src/plugins/memory_system/manually_alter_memory.py b/src/plugins/memory_system/manually_alter_memory.py index 10a75738c..ce5abbba7 100644 --- a/src/plugins/memory_system/manually_alter_memory.py +++ b/src/plugins/memory_system/manually_alter_memory.py @@ -11,7 +11,7 @@ from Hippocampus import Hippocampus # 海马体和记忆图 from dotenv import load_dotenv from rich.traceback import install -install(show_locals=True, extra_lines=3) +install(extra_lines=3) """ diff --git a/src/plugins/memory_system/offline_llm.py b/src/plugins/memory_system/offline_llm.py index 335a76d34..d4862ad36 100644 --- a/src/plugins/memory_system/offline_llm.py +++ b/src/plugins/memory_system/offline_llm.py @@ -8,7 +8,7 @@ import requests from src.common.logger import get_module_logger from rich.traceback import install -install(show_locals=True, extra_lines=3) +install(extra_lines=3) logger = get_module_logger("offline_llm") diff --git a/src/plugins/memory_system/sample_distribution.py b/src/plugins/memory_system/sample_distribution.py index 76796728f..b3b84eb4c 100644 --- a/src/plugins/memory_system/sample_distribution.py +++ b/src/plugins/memory_system/sample_distribution.py @@ -3,7 +3,7 @@ from scipy import stats from datetime import datetime, timedelta from rich.traceback import install -install(show_locals=True, extra_lines=3) +install(extra_lines=3) class DistributionVisualizer: diff --git a/src/plugins/models/utils_model.py b/src/plugins/models/utils_model.py index 7c7fe713e..8ee219562 100644 --- a/src/plugins/models/utils_model.py +++ b/src/plugins/models/utils_model.py @@ -16,7 +16,7 @@ from ...common.database import db from ...config.config import global_config from rich.traceback import install -install(show_locals=True, extra_lines=3) +install(extra_lines=3) logger = get_module_logger("model_utils") diff --git a/src/plugins/utils/prompt_builder.py b/src/plugins/utils/prompt_builder.py index c4555a552..4a226a022 100644 --- a/src/plugins/utils/prompt_builder.py +++ b/src/plugins/utils/prompt_builder.py @@ -7,7 +7,7 @@ from src.common.logger import get_module_logger # import traceback from rich.traceback import install -install(show_locals=True, extra_lines=3) +install(extra_lines=3) logger = get_module_logger("prompt_build") diff --git a/src/plugins/utils/timer_calculator.py b/src/plugins/utils/timer_calculator.py index d66f21cc3..af8058a59 100644 --- a/src/plugins/utils/timer_calculator.py +++ b/src/plugins/utils/timer_calculator.py @@ -4,7 +4,7 @@ from typing import Optional, Dict, Callable import asyncio from rich.traceback import install -install(show_locals=True, extra_lines=3) +install(extra_lines=3) """ # 更好的计时器 diff --git a/src/plugins/willing/willing_manager.py b/src/plugins/willing/willing_manager.py index a5884da2b..ba1e3e097 100644 --- a/src/plugins/willing/willing_manager.py +++ b/src/plugins/willing/willing_manager.py @@ -10,7 +10,7 @@ from typing import Dict, Optional import asyncio from rich.traceback import install -install(show_locals=True, extra_lines=3) +install(extra_lines=3) """ 基类方法概览: diff --git a/src/plugins/zhishi/knowledge_library.py b/src/plugins/zhishi/knowledge_library.py index 26af3bdac..6fa1d3e1a 100644 --- a/src/plugins/zhishi/knowledge_library.py +++ b/src/plugins/zhishi/knowledge_library.py @@ -9,7 +9,7 @@ from rich.console import Console from rich.table import Table from rich.traceback import install -install(show_locals=True, extra_lines=3) +install(extra_lines=3) # 添加项目根目录到 Python 路径 root_path = os.path.abspath(os.path.join(os.path.dirname(__file__), "../../..")) From 03961b71a259f52fb79e6b47565c6fed1db00fe4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=A2=A8=E6=A2=93=E6=9F=92?= <1787882683@qq.com> Date: Fri, 2 May 2025 13:42:28 +0800 Subject: [PATCH 4/6] =?UTF-8?q?feat:=20=E6=9B=B4=E6=96=B0=E6=95=B0?= =?UTF-8?q?=E6=8D=AE=E8=B7=AF=E5=BE=84=E9=85=8D=E7=BD=AE=EF=BC=8C=E5=A2=9E?= =?UTF-8?q?=E5=BC=BA=E6=95=B0=E6=8D=AE=E5=A4=84=E7=90=86=E5=8A=9F=E8=83=BD?= =?UTF-8?q?=E5=B9=B6=E4=BC=98=E5=8C=96=E9=94=99=E8=AF=AF=E6=8F=90=E7=A4=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- scripts/import_openie.py | 6 +- scripts/info_extraction.py | 103 +++++++++++++------ scripts/raw_data_preprocessor.py | 30 ++++-- src/plugins/knowledge/knowledge_lib.py | 2 + src/plugins/knowledge/src/embedding_store.py | 45 +++++--- src/plugins/knowledge/src/kg_manager.py | 79 ++++++++------ src/plugins/knowledge/src/open_ie.py | 48 +++++++-- src/plugins/knowledge/src/raw_processing.py | 18 ++-- template/lpmm_config_template.toml | 4 +- 9 files changed, 226 insertions(+), 109 deletions(-) diff --git a/scripts/import_openie.py b/scripts/import_openie.py index 595f22ec2..25a1a8779 100644 --- a/scripts/import_openie.py +++ b/scripts/import_openie.py @@ -19,7 +19,8 @@ from src.plugins.knowledge.src.utils.hash import get_sha256 # 添加项目根目录到 sys.path - +ROOT_PATH = os.path.abspath(os.path.join(os.path.dirname(__file__), "..")) +OPENIE_DIR = global_config["persistence"]["openie_data_path"] if global_config["persistence"]["openie_data_path"] else os.path.join(ROOT_PATH, "data/openie") logger = get_module_logger("LPMM知识库-OpenIE导入") @@ -131,6 +132,7 @@ def main(): embed_manager.load_from_file() except Exception as e: logger.error("从文件加载Embedding库时发生错误:{}".format(e)) + logger.error("如果你是第一次导入知识,请忽略此错误") logger.info("Embedding库加载完成") # 初始化KG kg_manager = KGManager() @@ -139,6 +141,7 @@ def main(): kg_manager.load_from_file() except Exception as e: logger.error("从文件加载KG时发生错误:{}".format(e)) + logger.error("如果你是第一次导入知识,请忽略此错误") logger.info("KG加载完成") logger.info(f"KG节点数量:{len(kg_manager.graph.get_node_list())}") @@ -163,4 +166,5 @@ def main(): if __name__ == "__main__": + # logger.info(f"111111111111111111111111{ROOT_PATH}") main() diff --git a/scripts/info_extraction.py b/scripts/info_extraction.py index 65c4082b6..00f7a2a21 100644 --- a/scripts/info_extraction.py +++ b/scripts/info_extraction.py @@ -4,11 +4,13 @@ import signal from concurrent.futures import ThreadPoolExecutor, as_completed from threading import Lock, Event import sys +import glob +import datetime sys.path.append(os.path.abspath(os.path.join(os.path.dirname(__file__), ".."))) # 添加项目根目录到 sys.path -import tqdm +from rich.progress import Progress # 替换为 rich 进度条 from src.common.logger import get_module_logger from src.plugins.knowledge.src.lpmmconfig import global_config @@ -16,10 +18,15 @@ from src.plugins.knowledge.src.ie_process import info_extract_from_str from src.plugins.knowledge.src.llm_client import LLMClient from src.plugins.knowledge.src.open_ie import OpenIE from src.plugins.knowledge.src.raw_processing import load_raw_data +from rich.progress import BarColumn, TimeElapsedColumn, TimeRemainingColumn, TaskProgressColumn, MofNCompleteColumn, SpinnerColumn, TextColumn logger = get_module_logger("LPMM知识库-信息提取") -TEMP_DIR = "./temp" + +ROOT_PATH = os.path.abspath(os.path.join(os.path.dirname(__file__), "..")) +TEMP_DIR = os.path.join(ROOT_PATH, "temp") +IMPORTED_DATA_PATH = global_config["persistence"]["raw_data_path"] if global_config["persistence"]["raw_data_path"] else os.path.join(ROOT_PATH, "data/imported_lpmm_data") +OPENIE_OUTPUT_DIR = global_config["persistence"]["openie_data_path"] if global_config["persistence"]["openie_data_path"] else os.path.join(ROOT_PATH, "data/openie") # 创建一个线程安全的锁,用于保护文件操作和共享数据 file_lock = Lock() @@ -70,8 +77,7 @@ def process_single_text(pg_hash, raw_data, llm_client_list): # 如果保存失败,确保不会留下损坏的文件 if os.path.exists(temp_file_path): os.remove(temp_file_path) - # 设置shutdown_event以终止程序 - shutdown_event.set() + sys.exit(0) return None, pg_hash return doc_item, None @@ -79,7 +85,7 @@ def process_single_text(pg_hash, raw_data, llm_client_list): def signal_handler(_signum, _frame): """处理Ctrl+C信号""" logger.info("\n接收到中断信号,正在优雅地关闭程序...") - shutdown_event.set() + sys.exit(0) def main(): @@ -110,33 +116,61 @@ def main(): global_config["llm_providers"][key]["api_key"], ) - logger.info("正在加载原始数据") - sha256_list, raw_datas = load_raw_data() - logger.info("原始数据加载完成\n") + # 检查 openie 输出目录 + if not os.path.exists(OPENIE_OUTPUT_DIR): + os.makedirs(OPENIE_OUTPUT_DIR) + logger.info(f"已创建输出目录: {OPENIE_OUTPUT_DIR}") - # 创建临时目录 - if not os.path.exists(f"{TEMP_DIR}"): - os.makedirs(f"{TEMP_DIR}") + # 确保 TEMP_DIR 目录存在 + if not os.path.exists(TEMP_DIR): + os.makedirs(TEMP_DIR) + logger.info(f"已创建缓存目录: {TEMP_DIR}") + + # 遍历IMPORTED_DATA_PATH下所有json文件 + imported_files = sorted(glob.glob(os.path.join(IMPORTED_DATA_PATH, "*.json"))) + if not imported_files: + logger.error(f"未在 {IMPORTED_DATA_PATH} 下找到任何json文件") + sys.exit(1) + + all_sha256_list = [] + all_raw_datas = [] + + for imported_file in imported_files: + logger.info(f"正在处理文件: {imported_file}") + try: + sha256_list, raw_datas = load_raw_data(imported_file) + except Exception as e: + logger.error(f"读取文件失败: {imported_file}, 错误: {e}") + continue + all_sha256_list.extend(sha256_list) + all_raw_datas.extend(raw_datas) failed_sha256 = [] open_ie_doc = [] - # 创建线程池,最大线程数为50 workers = global_config["info_extraction"]["workers"] with ThreadPoolExecutor(max_workers=workers) as executor: - # 提交所有任务到线程池 future_to_hash = { executor.submit(process_single_text, pg_hash, raw_data, llm_client_list): pg_hash - for pg_hash, raw_data in zip(sha256_list, raw_datas) + for pg_hash, raw_data in zip(all_sha256_list, all_raw_datas) } - # 使用tqdm显示进度 - with tqdm.tqdm(total=len(future_to_hash), postfix="正在进行提取:") as pbar: - # 处理完成的任务 + with Progress( + SpinnerColumn(), + TextColumn("[progress.description]{task.description}"), + BarColumn(), + TaskProgressColumn(), + MofNCompleteColumn(), + "•", + TimeElapsedColumn(), + "<", + TimeRemainingColumn(), + transient=False, + ) as progress: + task = progress.add_task("正在进行提取:", total=len(future_to_hash)) try: for future in as_completed(future_to_hash): if shutdown_event.is_set(): - # 取消所有未完成的任务 for f in future_to_hash: if not f.done(): f.cancel() @@ -149,26 +183,33 @@ def main(): elif doc_item: with open_ie_doc_lock: open_ie_doc.append(doc_item) - pbar.update(1) + progress.update(task, advance=1) except KeyboardInterrupt: - # 如果在这里捕获到KeyboardInterrupt,说明signal_handler可能没有正常工作 logger.info("\n接收到中断信号,正在优雅地关闭程序...") shutdown_event.set() - # 取消所有未完成的任务 for f in future_to_hash: if not f.done(): f.cancel() - # 保存信息提取结果 - sum_phrase_chars = sum([len(e) for chunk in open_ie_doc for e in chunk["extracted_entities"]]) - sum_phrase_words = sum([len(e.split()) for chunk in open_ie_doc for e in chunk["extracted_entities"]]) - num_phrases = sum([len(chunk["extracted_entities"]) for chunk in open_ie_doc]) - openie_obj = OpenIE( - open_ie_doc, - round(sum_phrase_chars / num_phrases, 4), - round(sum_phrase_words / num_phrases, 4), - ) - OpenIE.save(openie_obj) + # 合并所有文件的提取结果并保存 + if open_ie_doc: + sum_phrase_chars = sum([len(e) for chunk in open_ie_doc for e in chunk["extracted_entities"]]) + sum_phrase_words = sum([len(e.split()) for chunk in open_ie_doc for e in chunk["extracted_entities"]]) + num_phrases = sum([len(chunk["extracted_entities"]) for chunk in open_ie_doc]) + openie_obj = OpenIE( + open_ie_doc, + round(sum_phrase_chars / num_phrases, 4) if num_phrases else 0, + round(sum_phrase_words / num_phrases, 4) if num_phrases else 0, + ) + # 输出文件名格式:MM-DD-HH-ss-openie.json + now = datetime.datetime.now() + filename = now.strftime("%m-%d-%H-%S-openie.json") + output_path = os.path.join(OPENIE_OUTPUT_DIR, filename) + with open(output_path, "w", encoding="utf-8") as f: + json.dump(openie_obj.to_dict() if hasattr(openie_obj, "to_dict") else openie_obj.__dict__, f, ensure_ascii=False, indent=4) + logger.info(f"信息提取结果已保存到: {output_path}") + else: + logger.warning("没有可保存的信息提取结果") logger.info("--------信息提取完成--------") logger.info(f"提取失败的文段SHA256:{failed_sha256}") diff --git a/scripts/raw_data_preprocessor.py b/scripts/raw_data_preprocessor.py index 2fc30352e..d808fb0ee 100644 --- a/scripts/raw_data_preprocessor.py +++ b/scripts/raw_data_preprocessor.py @@ -2,18 +2,22 @@ import json import os from pathlib import Path import sys # 新增系统模块导入 +import datetime # 新增导入 sys.path.append(os.path.abspath(os.path.join(os.path.dirname(__file__), ".."))) from src.common.logger import get_module_logger logger = get_module_logger("LPMM数据库-原始数据处理") +ROOT_PATH = os.path.abspath(os.path.join(os.path.dirname(__file__), "..")) +RAW_DATA_PATH = os.path.join(ROOT_PATH, "data/lpmm_raw_data") +IMPORTED_DATA_PATH = os.path.join(ROOT_PATH, "data/imported_lpmm_data") # 添加项目根目录到 sys.path def check_and_create_dirs(): """检查并创建必要的目录""" - required_dirs = ["data/lpmm_raw_data", "data/imported_lpmm_data"] + required_dirs = [RAW_DATA_PATH, IMPORTED_DATA_PATH] for dir_path in required_dirs: if not os.path.exists(dir_path): @@ -58,17 +62,17 @@ def main(): # 检查并创建必要的目录 check_and_create_dirs() - # 检查输出文件是否存在 - if os.path.exists("data/import.json"): - logger.error("错误: data/import.json 已存在,请先处理或删除该文件") - sys.exit(1) + # # 检查输出文件是否存在 + # if os.path.exists(RAW_DATA_PATH): + # logger.error("错误: data/import.json 已存在,请先处理或删除该文件") + # sys.exit(1) - if os.path.exists("data/openie.json"): - logger.error("错误: data/openie.json 已存在,请先处理或删除该文件") - sys.exit(1) + # if os.path.exists(RAW_DATA_PATH): + # logger.error("错误: data/openie.json 已存在,请先处理或删除该文件") + # sys.exit(1) # 获取所有原始文本文件 - raw_files = list(Path("data/lpmm_raw_data").glob("*.txt")) + raw_files = list(Path(RAW_DATA_PATH).glob("*.txt")) if not raw_files: logger.warning("警告: data/lpmm_raw_data 中没有找到任何 .txt 文件") sys.exit(1) @@ -80,8 +84,10 @@ def main(): paragraphs = process_text_file(file) all_paragraphs.extend(paragraphs) - # 保存合并后的结果 - output_path = "data/import.json" + # 保存合并后的结果到 IMPORTED_DATA_PATH,文件名格式为 MM-DD-HH-ss-imported-data.json + now = datetime.datetime.now() + filename = now.strftime("%m-%d-%H-%S-imported-data.json") + output_path = os.path.join(IMPORTED_DATA_PATH, filename) with open(output_path, "w", encoding="utf-8") as f: json.dump(all_paragraphs, f, ensure_ascii=False, indent=4) @@ -89,4 +95,6 @@ def main(): if __name__ == "__main__": + print(f"Raw Data Path: {RAW_DATA_PATH}") + print(f"Imported Data Path: {IMPORTED_DATA_PATH}") main() diff --git a/src/plugins/knowledge/knowledge_lib.py b/src/plugins/knowledge/knowledge_lib.py index c0d2fe610..df82970a7 100644 --- a/src/plugins/knowledge/knowledge_lib.py +++ b/src/plugins/knowledge/knowledge_lib.py @@ -26,6 +26,7 @@ try: embed_manager.load_from_file() except Exception as e: logger.error("从文件加载Embedding库时发生错误:{}".format(e)) + logger.error("如果你是第一次导入知识,或者还未导入知识,请忽略此错误") logger.info("Embedding库加载完成") # 初始化KG kg_manager = KGManager() @@ -34,6 +35,7 @@ try: kg_manager.load_from_file() except Exception as e: logger.error("从文件加载KG时发生错误:{}".format(e)) + logger.error("如果你是第一次导入知识,或者还未导入知识,请忽略此错误") logger.info("KG加载完成") logger.info(f"KG节点数量:{len(kg_manager.graph.get_node_list())}") diff --git a/src/plugins/knowledge/src/embedding_store.py b/src/plugins/knowledge/src/embedding_store.py index 8e0d116b6..d2791ca48 100644 --- a/src/plugins/knowledge/src/embedding_store.py +++ b/src/plugins/knowledge/src/embedding_store.py @@ -13,9 +13,11 @@ from .lpmmconfig import ENT_NAMESPACE, PG_NAMESPACE, REL_NAMESPACE, global_confi from .utils.hash import get_sha256 from .global_logger import logger from rich.traceback import install +from rich.progress import Progress, BarColumn, TimeElapsedColumn, TimeRemainingColumn, TaskProgressColumn, MofNCompleteColumn, SpinnerColumn, TextColumn install(extra_lines=3) +TOTAL_EMBEDDING_TIMES = 3 # 统计嵌入次数 @dataclass class EmbeddingStoreItem: @@ -52,20 +54,35 @@ class EmbeddingStore: def _get_embedding(self, s: str) -> List[float]: return self.llm_client.send_embedding_request(global_config["embedding"]["model"], s) - def batch_insert_strs(self, strs: List[str]) -> None: + def batch_insert_strs(self, strs: List[str], times: int) -> None: """向库中存入字符串""" - # 逐项处理 - for s in tqdm.tqdm(strs, desc="存入嵌入库", unit="items"): - # 计算hash去重 - item_hash = self.namespace + "-" + get_sha256(s) - if item_hash in self.store: - continue + total = len(strs) + with Progress( + SpinnerColumn(), + TextColumn("[progress.description]{task.description}"), + BarColumn(), + TaskProgressColumn(), + MofNCompleteColumn(), + "•", + TimeElapsedColumn(), + "<", + TimeRemainingColumn(), + transient=False, + ) as progress: + task = progress.add_task(f"存入嵌入库:({times}/{TOTAL_EMBEDDING_TIMES})", total=total) + for s in strs: + # 计算hash去重 + item_hash = self.namespace + "-" + get_sha256(s) + if item_hash in self.store: + progress.update(task, advance=1) + continue - # 获取embedding - embedding = self._get_embedding(s) + # 获取embedding + embedding = self._get_embedding(s) - # 存入 - self.store[item_hash] = EmbeddingStoreItem(item_hash, embedding, s) + # 存入 + self.store[item_hash] = EmbeddingStoreItem(item_hash, embedding, s) + progress.update(task, advance=1) def save_to_file(self) -> None: """保存到文件""" @@ -191,7 +208,7 @@ class EmbeddingManager: def _store_pg_into_embedding(self, raw_paragraphs: Dict[str, str]): """将段落编码存入Embedding库""" - self.paragraphs_embedding_store.batch_insert_strs(list(raw_paragraphs.values())) + self.paragraphs_embedding_store.batch_insert_strs(list(raw_paragraphs.values()),times=1) def _store_ent_into_embedding(self, triple_list_data: Dict[str, List[List[str]]]): """将实体编码存入Embedding库""" @@ -200,7 +217,7 @@ class EmbeddingManager: for triple in triple_list: entities.add(triple[0]) entities.add(triple[2]) - self.entities_embedding_store.batch_insert_strs(list(entities)) + self.entities_embedding_store.batch_insert_strs(list(entities),times=2) def _store_rel_into_embedding(self, triple_list_data: Dict[str, List[List[str]]]): """将关系编码存入Embedding库""" @@ -208,7 +225,7 @@ class EmbeddingManager: for triples in triple_list_data.values(): graph_triples.extend([tuple(t) for t in triples]) graph_triples = list(set(graph_triples)) - self.relation_embedding_store.batch_insert_strs([str(triple) for triple in graph_triples]) + self.relation_embedding_store.batch_insert_strs([str(triple) for triple in graph_triples],times=3) def load_from_file(self): """从文件加载""" diff --git a/src/plugins/knowledge/src/kg_manager.py b/src/plugins/knowledge/src/kg_manager.py index 71ce65ef2..ccaf7aa83 100644 --- a/src/plugins/knowledge/src/kg_manager.py +++ b/src/plugins/knowledge/src/kg_manager.py @@ -5,7 +5,7 @@ from typing import Dict, List, Tuple import numpy as np import pandas as pd -import tqdm +from rich.progress import Progress, BarColumn, TimeElapsedColumn, TimeRemainingColumn, TaskProgressColumn, MofNCompleteColumn, SpinnerColumn, TextColumn from quick_algo import di_graph, pagerank @@ -132,41 +132,56 @@ class KGManager: ent_hash_list = list(ent_hash_list) synonym_hash_set = set() - synonym_result = dict() - # 对每个实体节点,查找其相似的实体节点,建立扩展连接 - for ent_hash in tqdm.tqdm(ent_hash_list): - if ent_hash in synonym_hash_set: - # 避免同一批次内重复添加 - continue - ent = embedding_manager.entities_embedding_store.store.get(ent_hash) - assert isinstance(ent, EmbeddingStoreItem) - if ent is None: - continue - # 查询相似实体 - similar_ents = embedding_manager.entities_embedding_store.search_top_k( - ent.embedding, global_config["rag"]["params"]["synonym_search_top_k"] - ) - res_ent = [] # Debug - for res_ent_hash, similarity in similar_ents: - if res_ent_hash == ent_hash: - # 避免自连接 + # rich 进度条 + total = len(ent_hash_list) + with Progress( + SpinnerColumn(), + TextColumn("[progress.description]{task.description}"), + BarColumn(), + TaskProgressColumn(), + MofNCompleteColumn(), + "•", + TimeElapsedColumn(), + "<", + TimeRemainingColumn(), + transient=False, + ) as progress: + task = progress.add_task("同义词连接", total=total) + for ent_hash in ent_hash_list: + if ent_hash in synonym_hash_set: + progress.update(task, advance=1) continue - if similarity < global_config["rag"]["params"]["synonym_threshold"]: - # 相似度阈值 + ent = embedding_manager.entities_embedding_store.store.get(ent_hash) + assert isinstance(ent, EmbeddingStoreItem) + if ent is None: + progress.update(task, advance=1) continue - node_to_node[(res_ent_hash, ent_hash)] = similarity - node_to_node[(ent_hash, res_ent_hash)] = similarity - synonym_hash_set.add(res_ent_hash) - new_edge_cnt += 1 - res_ent.append( - ( - embedding_manager.entities_embedding_store.store[res_ent_hash].str, - similarity, - ) - ) # Debug - synonym_result[ent.str] = res_ent + # 查询相似实体 + similar_ents = embedding_manager.entities_embedding_store.search_top_k( + ent.embedding, global_config["rag"]["params"]["synonym_search_top_k"] + ) + res_ent = [] # Debug + for res_ent_hash, similarity in similar_ents: + if res_ent_hash == ent_hash: + # 避免自连接 + continue + if similarity < global_config["rag"]["params"]["synonym_threshold"]: + # 相似度阈值 + continue + node_to_node[(res_ent_hash, ent_hash)] = similarity + node_to_node[(ent_hash, res_ent_hash)] = similarity + synonym_hash_set.add(res_ent_hash) + new_edge_cnt += 1 + res_ent.append( + ( + embedding_manager.entities_embedding_store.store[res_ent_hash].str, + similarity, + ) + ) # Debug + synonym_result[ent.str] = res_ent + progress.update(task, advance=1) for k, v in synonym_result.items(): print(f'"{k}"的相似实体为:{v}') diff --git a/src/plugins/knowledge/src/open_ie.py b/src/plugins/knowledge/src/open_ie.py index 5fe163bb2..ea84af4ac 100644 --- a/src/plugins/knowledge/src/open_ie.py +++ b/src/plugins/knowledge/src/open_ie.py @@ -1,9 +1,13 @@ import json +import os +import glob from typing import Any, Dict, List from .lpmmconfig import INVALID_ENTITY, global_config +ROOT_PATH = os.path.abspath(os.path.join(os.path.dirname(__file__), "..", "..", "..", "..")) + def _filter_invalid_entities(entities: List[str]) -> List[str]: """过滤无效的实体""" @@ -74,12 +78,22 @@ class OpenIE: doc["extracted_triples"] = _filter_invalid_triples(doc["extracted_triples"]) @staticmethod - def _from_dict(data): - """从字典中获取OpenIE对象""" + def _from_dict(data_list): + """从多个字典合并OpenIE对象""" + # data_list: List[dict] + all_docs = [] + for data in data_list: + all_docs.extend(data.get("docs", [])) + # 重新计算统计 + sum_phrase_chars = sum([len(e) for chunk in all_docs for e in chunk["extracted_entities"]]) + sum_phrase_words = sum([len(e.split()) for chunk in all_docs for e in chunk["extracted_entities"]]) + num_phrases = sum([len(chunk["extracted_entities"]) for chunk in all_docs]) + avg_ent_chars = round(sum_phrase_chars / num_phrases, 4) if num_phrases else 0 + avg_ent_words = round(sum_phrase_words / num_phrases, 4) if num_phrases else 0 return OpenIE( - docs=data["docs"], - avg_ent_chars=data["avg_ent_chars"], - avg_ent_words=data["avg_ent_words"], + docs=all_docs, + avg_ent_chars=avg_ent_chars, + avg_ent_words=avg_ent_words, ) def _to_dict(self): @@ -92,12 +106,20 @@ class OpenIE: @staticmethod def load() -> "OpenIE": - """从文件中加载OpenIE数据""" - with open(global_config["persistence"]["openie_data_path"], "r", encoding="utf-8") as f: - data = json.loads(f.read()) - - openie_data = OpenIE._from_dict(data) - + """从OPENIE_DIR下所有json文件合并加载OpenIE数据""" + openie_dir = os.path.join(ROOT_PATH, global_config["persistence"]["openie_data_path"]) + if not os.path.exists(openie_dir): + raise Exception(f"OpenIE数据目录不存在: {openie_dir}") + json_files = sorted(glob.glob(os.path.join(openie_dir, "*.json"))) + data_list = [] + for file in json_files: + with open(file, "r", encoding="utf-8") as f: + data = json.load(f) + data_list.append(data) + if not data_list: + # print(f"111111111111111111111Root Path : \n{ROOT_PATH}") + raise Exception(f"未在 {openie_dir} 找到任何OpenIE json文件") + openie_data = OpenIE._from_dict(data_list) return openie_data @staticmethod @@ -132,3 +154,7 @@ class OpenIE: """提取原始段落""" raw_paragraph_dict = dict({doc_item["idx"]: doc_item["passage"] for doc_item in self.docs}) return raw_paragraph_dict + +if __name__ == "__main__": + # 测试代码 + print(ROOT_PATH) diff --git a/src/plugins/knowledge/src/raw_processing.py b/src/plugins/knowledge/src/raw_processing.py index 91e681c7c..a333ef996 100644 --- a/src/plugins/knowledge/src/raw_processing.py +++ b/src/plugins/knowledge/src/raw_processing.py @@ -6,21 +6,25 @@ from .lpmmconfig import global_config from .utils.hash import get_sha256 -def load_raw_data() -> tuple[list[str], list[str]]: +def load_raw_data(path: str = None) -> tuple[list[str], list[str]]: """加载原始数据文件 读取原始数据文件,将原始数据加载到内存中 + Args: + path: 可选,指定要读取的json文件绝对路径 + Returns: - - raw_data: 原始数据字典 - - md5_set: 原始数据的SHA256集合 + - raw_data: 原始数据列表 + - sha256_list: 原始数据的SHA256集合 """ - # 读取import.json文件 - if os.path.exists(global_config["persistence"]["raw_data_path"]) is True: - with open(global_config["persistence"]["raw_data_path"], "r", encoding="utf-8") as f: + # 读取指定路径或默认路径的json文件 + json_path = path if path else global_config["persistence"]["raw_data_path"] + if os.path.exists(json_path): + with open(json_path, "r", encoding="utf-8") as f: import_json = json.loads(f.read()) else: - raise Exception("原始数据文件读取失败") + raise Exception(f"原始数据文件读取失败: {json_path}") # import_json内容示例: # import_json = [ # "The capital of China is Beijing. The capital of France is Paris.", diff --git a/template/lpmm_config_template.toml b/template/lpmm_config_template.toml index 43785e794..8563b7caf 100644 --- a/template/lpmm_config_template.toml +++ b/template/lpmm_config_template.toml @@ -51,7 +51,7 @@ res_top_k = 3 # 最终提供的文段TopK [persistence] # 持久化配置(存储中间数据,防止重复计算) data_root_path = "data" # 数据根目录 -raw_data_path = "data/import.json" # 原始数据路径 -openie_data_path = "data/openie.json" # OpenIE数据路径 +raw_data_path = "data/imported_lpmm_data" # 原始数据路径 +openie_data_path = "data/openie" # OpenIE数据路径 embedding_data_dir = "data/embedding" # 嵌入数据目录 rag_data_dir = "data/rag" # RAG数据目录 From b117e876870e0743b06efa4000b6aba01f0a0588 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Fri, 2 May 2025 05:42:41 +0000 Subject: [PATCH 5/6] =?UTF-8?q?=F0=9F=A4=96=20=E8=87=AA=E5=8A=A8=E6=A0=BC?= =?UTF-8?q?=E5=BC=8F=E5=8C=96=E4=BB=A3=E7=A0=81=20[skip=20ci]?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- scripts/import_openie.py | 6 +++- scripts/info_extraction.py | 29 +++++++++++++++++--- src/plugins/knowledge/src/embedding_store.py | 18 +++++++++--- src/plugins/knowledge/src/kg_manager.py | 11 +++++++- src/plugins/knowledge/src/open_ie.py | 3 +- 5 files changed, 56 insertions(+), 11 deletions(-) diff --git a/scripts/import_openie.py b/scripts/import_openie.py index 25a1a8779..dd4b50ece 100644 --- a/scripts/import_openie.py +++ b/scripts/import_openie.py @@ -20,7 +20,11 @@ from src.plugins.knowledge.src.utils.hash import get_sha256 # 添加项目根目录到 sys.path ROOT_PATH = os.path.abspath(os.path.join(os.path.dirname(__file__), "..")) -OPENIE_DIR = global_config["persistence"]["openie_data_path"] if global_config["persistence"]["openie_data_path"] else os.path.join(ROOT_PATH, "data/openie") +OPENIE_DIR = ( + global_config["persistence"]["openie_data_path"] + if global_config["persistence"]["openie_data_path"] + else os.path.join(ROOT_PATH, "data/openie") +) logger = get_module_logger("LPMM知识库-OpenIE导入") diff --git a/scripts/info_extraction.py b/scripts/info_extraction.py index 00f7a2a21..ee0d789aa 100644 --- a/scripts/info_extraction.py +++ b/scripts/info_extraction.py @@ -18,15 +18,31 @@ from src.plugins.knowledge.src.ie_process import info_extract_from_str from src.plugins.knowledge.src.llm_client import LLMClient from src.plugins.knowledge.src.open_ie import OpenIE from src.plugins.knowledge.src.raw_processing import load_raw_data -from rich.progress import BarColumn, TimeElapsedColumn, TimeRemainingColumn, TaskProgressColumn, MofNCompleteColumn, SpinnerColumn, TextColumn +from rich.progress import ( + BarColumn, + TimeElapsedColumn, + TimeRemainingColumn, + TaskProgressColumn, + MofNCompleteColumn, + SpinnerColumn, + TextColumn, +) logger = get_module_logger("LPMM知识库-信息提取") ROOT_PATH = os.path.abspath(os.path.join(os.path.dirname(__file__), "..")) TEMP_DIR = os.path.join(ROOT_PATH, "temp") -IMPORTED_DATA_PATH = global_config["persistence"]["raw_data_path"] if global_config["persistence"]["raw_data_path"] else os.path.join(ROOT_PATH, "data/imported_lpmm_data") -OPENIE_OUTPUT_DIR = global_config["persistence"]["openie_data_path"] if global_config["persistence"]["openie_data_path"] else os.path.join(ROOT_PATH, "data/openie") +IMPORTED_DATA_PATH = ( + global_config["persistence"]["raw_data_path"] + if global_config["persistence"]["raw_data_path"] + else os.path.join(ROOT_PATH, "data/imported_lpmm_data") +) +OPENIE_OUTPUT_DIR = ( + global_config["persistence"]["openie_data_path"] + if global_config["persistence"]["openie_data_path"] + else os.path.join(ROOT_PATH, "data/openie") +) # 创建一个线程安全的锁,用于保护文件操作和共享数据 file_lock = Lock() @@ -206,7 +222,12 @@ def main(): filename = now.strftime("%m-%d-%H-%S-openie.json") output_path = os.path.join(OPENIE_OUTPUT_DIR, filename) with open(output_path, "w", encoding="utf-8") as f: - json.dump(openie_obj.to_dict() if hasattr(openie_obj, "to_dict") else openie_obj.__dict__, f, ensure_ascii=False, indent=4) + json.dump( + openie_obj.to_dict() if hasattr(openie_obj, "to_dict") else openie_obj.__dict__, + f, + ensure_ascii=False, + indent=4, + ) logger.info(f"信息提取结果已保存到: {output_path}") else: logger.warning("没有可保存的信息提取结果") diff --git a/src/plugins/knowledge/src/embedding_store.py b/src/plugins/knowledge/src/embedding_store.py index d2791ca48..e734f4e9a 100644 --- a/src/plugins/knowledge/src/embedding_store.py +++ b/src/plugins/knowledge/src/embedding_store.py @@ -13,12 +13,22 @@ from .lpmmconfig import ENT_NAMESPACE, PG_NAMESPACE, REL_NAMESPACE, global_confi from .utils.hash import get_sha256 from .global_logger import logger from rich.traceback import install -from rich.progress import Progress, BarColumn, TimeElapsedColumn, TimeRemainingColumn, TaskProgressColumn, MofNCompleteColumn, SpinnerColumn, TextColumn +from rich.progress import ( + Progress, + BarColumn, + TimeElapsedColumn, + TimeRemainingColumn, + TaskProgressColumn, + MofNCompleteColumn, + SpinnerColumn, + TextColumn, +) install(extra_lines=3) TOTAL_EMBEDDING_TIMES = 3 # 统计嵌入次数 + @dataclass class EmbeddingStoreItem: """嵌入库中的项""" @@ -208,7 +218,7 @@ class EmbeddingManager: def _store_pg_into_embedding(self, raw_paragraphs: Dict[str, str]): """将段落编码存入Embedding库""" - self.paragraphs_embedding_store.batch_insert_strs(list(raw_paragraphs.values()),times=1) + self.paragraphs_embedding_store.batch_insert_strs(list(raw_paragraphs.values()), times=1) def _store_ent_into_embedding(self, triple_list_data: Dict[str, List[List[str]]]): """将实体编码存入Embedding库""" @@ -217,7 +227,7 @@ class EmbeddingManager: for triple in triple_list: entities.add(triple[0]) entities.add(triple[2]) - self.entities_embedding_store.batch_insert_strs(list(entities),times=2) + self.entities_embedding_store.batch_insert_strs(list(entities), times=2) def _store_rel_into_embedding(self, triple_list_data: Dict[str, List[List[str]]]): """将关系编码存入Embedding库""" @@ -225,7 +235,7 @@ class EmbeddingManager: for triples in triple_list_data.values(): graph_triples.extend([tuple(t) for t in triples]) graph_triples = list(set(graph_triples)) - self.relation_embedding_store.batch_insert_strs([str(triple) for triple in graph_triples],times=3) + self.relation_embedding_store.batch_insert_strs([str(triple) for triple in graph_triples], times=3) def load_from_file(self): """从文件加载""" diff --git a/src/plugins/knowledge/src/kg_manager.py b/src/plugins/knowledge/src/kg_manager.py index ccaf7aa83..fd922af48 100644 --- a/src/plugins/knowledge/src/kg_manager.py +++ b/src/plugins/knowledge/src/kg_manager.py @@ -5,7 +5,16 @@ from typing import Dict, List, Tuple import numpy as np import pandas as pd -from rich.progress import Progress, BarColumn, TimeElapsedColumn, TimeRemainingColumn, TaskProgressColumn, MofNCompleteColumn, SpinnerColumn, TextColumn +from rich.progress import ( + Progress, + BarColumn, + TimeElapsedColumn, + TimeRemainingColumn, + TaskProgressColumn, + MofNCompleteColumn, + SpinnerColumn, + TextColumn, +) from quick_algo import di_graph, pagerank diff --git a/src/plugins/knowledge/src/open_ie.py b/src/plugins/knowledge/src/open_ie.py index ea84af4ac..75fd18545 100644 --- a/src/plugins/knowledge/src/open_ie.py +++ b/src/plugins/knowledge/src/open_ie.py @@ -154,7 +154,8 @@ class OpenIE: """提取原始段落""" raw_paragraph_dict = dict({doc_item["idx"]: doc_item["passage"] for doc_item in self.docs}) return raw_paragraph_dict - + + if __name__ == "__main__": # 测试代码 print(ROOT_PATH) From 81e5c1bb8bdc14b3e42b5fb84b1a49bb245409d1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=A2=A8=E6=A2=93=E6=9F=92?= <1787882683@qq.com> Date: Fri, 2 May 2025 15:45:42 +0800 Subject: [PATCH 6/6] =?UTF-8?q?feat:=20=E5=A2=9E=E5=BC=BAOpenIE=E6=95=B0?= =?UTF-8?q?=E6=8D=AE=E5=AE=8C=E6=95=B4=E6=80=A7=E6=A3=80=E6=9F=A5=EF=BC=8C?= =?UTF-8?q?=E4=BC=98=E5=8C=96=E9=94=99=E8=AF=AF=E6=97=A5=E5=BF=97=E8=BE=93?= =?UTF-8?q?=E5=87=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- scripts/import_openie.py | 40 +++++++++++++++++++++++++++++++++++++++- 1 file changed, 39 insertions(+), 1 deletion(-) diff --git a/scripts/import_openie.py b/scripts/import_openie.py index dd4b50ece..2a6e09b73 100644 --- a/scripts/import_openie.py +++ b/scripts/import_openie.py @@ -6,6 +6,7 @@ import sys import os +from time import sleep sys.path.append(os.path.abspath(os.path.join(os.path.dirname(__file__), ".."))) @@ -26,7 +27,7 @@ OPENIE_DIR = ( else os.path.join(ROOT_PATH, "data/openie") ) -logger = get_module_logger("LPMM知识库-OpenIE导入") +logger = get_module_logger("OpenIE导入") def hash_deduplicate( @@ -71,8 +72,45 @@ def handle_import_openie(openie_data: OpenIE, embed_manager: EmbeddingManager, k entity_list_data = openie_data.extract_entity_dict() # 索引的三元组列表 triple_list_data = openie_data.extract_triple_dict() + # print(openie_data.docs) if len(raw_paragraphs) != len(entity_list_data) or len(raw_paragraphs) != len(triple_list_data): logger.error("OpenIE数据存在异常") + logger.error(f"原始段落数量:{len(raw_paragraphs)}") + logger.error(f"实体列表数量:{len(entity_list_data)}") + logger.error(f"三元组列表数量:{len(triple_list_data)}") + logger.error("OpenIE数据段落数量与实体列表数量或三元组列表数量不一致") + logger.error("请保证你的原始数据分段良好,不要有类似于 “.....” 单独成一段的情况") + logger.error("或者一段中只有符号的情况") + # 新增:检查docs中每条数据的完整性 + logger.error("系统将于2秒后开始检查数据完整性") + sleep(2) + found_missing = False + for doc in getattr(openie_data, "docs", []): + idx = doc.get("idx", "<无idx>") + passage = doc.get("passage", "<无passage>") + missing = [] + # 检查字段是否存在且非空 + if "passage" not in doc or not doc.get("passage"): + missing.append("passage") + if "extracted_entities" not in doc or not isinstance(doc.get("extracted_entities"), list): + missing.append("名词列表缺失") + elif len(doc.get("extracted_entities", [])) == 0: + missing.append("名词列表为空") + if "extracted_triples" not in doc or not isinstance(doc.get("extracted_triples"), list): + missing.append("主谓宾三元组缺失") + elif len(doc.get("extracted_triples", [])) == 0: + missing.append("主谓宾三元组为空") + # 输出所有doc的idx + # print(f"检查: idx={idx}") + if missing: + found_missing = True + logger.error("\n") + logger.error("数据缺失:") + logger.error(f"对应哈希值:{idx}") + logger.error(f"对应文段内容内容:{passage}") + logger.error(f"非法原因:{', '.join(missing)}") + if not found_missing: + print("所有数据均完整,没有发现缺失字段。") return False # 将索引换为对应段落的hash值 logger.info("正在进行段落去重与重索引")