From 8ac14dbdc90c4f3816f15097b6b7dd8577ed3940 Mon Sep 17 00:00:00 2001 From: HuangHai <10402852@qq.com> Date: Sun, 7 Sep 2025 13:13:21 +0800 Subject: [PATCH] 'commit' --- dsLightRag/Volcengine/T1_DropIndex.py | 5 + dsLightRag/Volcengine/T2_CreateIndex.py | 130 ++++++--- .../Volcengine/VikingDBMemoryService.py | 262 +++++++----------- .../VikingDBMemoryService.cpython-310.pyc | Bin 14960 -> 14042 bytes .../__pycache__/chat.cpython-310.pyc | Bin 12779 -> 0 bytes .../Volcengine/{chat.py => chat.py.backup} | 12 +- 6 files changed, 208 insertions(+), 201 deletions(-) delete mode 100644 dsLightRag/Volcengine/__pycache__/chat.cpython-310.pyc rename dsLightRag/Volcengine/{chat.py => chat.py.backup} (97%) diff --git a/dsLightRag/Volcengine/T1_DropIndex.py b/dsLightRag/Volcengine/T1_DropIndex.py index 9fd4af5d..1c5e1fec 100644 --- a/dsLightRag/Volcengine/T1_DropIndex.py +++ b/dsLightRag/Volcengine/T1_DropIndex.py @@ -1,5 +1,10 @@ import json import logging +import sys +import os + +# 添加当前目录到系统路径 +sys.path.append(os.path.dirname(os.path.abspath(__file__))) from VikingDBMemoryService import VikingDBMemoryService, MEMORY_COLLECTION_NAME from Config.Config import VOLC_ACCESSKEY, VOLC_SECRETKEY diff --git a/dsLightRag/Volcengine/T2_CreateIndex.py b/dsLightRag/Volcengine/T2_CreateIndex.py index d5186e04..f0c570fa 100644 --- a/dsLightRag/Volcengine/T2_CreateIndex.py +++ b/dsLightRag/Volcengine/T2_CreateIndex.py @@ -1,7 +1,12 @@ import logging +import sys +import os +import time +import json -from Volcengine.VikingDBMemoryService import MEMORY_COLLECTION_NAME, initialize_services, ensure_collection_exists -from Volcengine.chat import handle_conversation_turn, archive_conversation +from volcenginesdkarkruntime import Ark +from Config.Config import VOLC_ACCESSKEY, VOLC_SECRETKEY, VOLC_API_KEY +from VikingDBMemoryService import VikingDBMemoryService, MEMORY_COLLECTION_NAME # 控制日志输出 logger = logging.getLogger('CollectionMemory') @@ -14,48 +19,97 @@ if not logger.handlers: logger.addHandler(handler) - def main(): - logger.info("开始端到端记忆测试...") - + logger.info("开始创建索引...") + + # 初始化记忆库服务 + memory_service = VikingDBMemoryService( + ak=VOLC_ACCESSKEY, + sk=VOLC_SECRETKEY, + host="api-knowledgebase.mlp.cn-beijing.volces.com", + region="cn-beijing" + ) + + # 初始化LLM客户端 + llm_client = Ark( + base_url="https://ark.cn-beijing.volces.com/api/v3", + api_key=VOLC_API_KEY + ) + try: - memory_service, llm_client = initialize_services() collection_name = MEMORY_COLLECTION_NAME user_id = "system" assistant_id = "assistant" - ensure_collection_exists(memory_service, collection_name) + + # 确保集合存在 + logger.info("检查/创建集合...") + memory_service.ensure_collection_exists(collection_name) + + # 添加测试数据以触发索引构建 + logger.info("添加测试数据...") + test_messages = [ + {"role": "user", "content": "你好,我是测试用户"}, + {"role": "assistant", "content": "你好,我是测试助手"} + ] + + test_metadata = { + "default_user_id": user_id, + "default_assistant_id": assistant_id, + "time": int(time.time() * 1000) + } + + session_id = f"test_session_{int(time.time())}" + memory_service.add_session( + collection_name=collection_name, + session_id=session_id, + messages=test_messages, + metadata=test_metadata + ) + + logger.info("测试数据添加成功,等待索引构建...") + + # 使用与chat.py.backup相同的等待索引就绪的逻辑 + max_retries = 30 + retry_interval = 60 # 秒,与chat.py.backup一致 + + for retry in range(max_retries): + try: + # 尝试搜索以验证索引是否就绪 + filter_params = { + "user_id": user_id, + "memory_type": ["sys_event_v1", "sys_profile_v1"] + } + + response = memory_service.search_memory( + collection_name=collection_name, + query="测试查询", + filter=filter_params, + limit=1 + ) + + # 如果搜索成功,说明索引已就绪 + logger.info(f"索引已就绪,找到 {response.get('data', {}).get('count', 0)} 条记录") + break + + except Exception as e: + error_message = str(e) + if "1000023" in error_message: # 与chat.py.backup中的错误码一致 + retry_attempt = retry + 1 + logger.info(f"记忆索引正在构建中。将在{retry_interval}秒后重试... (尝试次数 {retry_attempt})") + time.sleep(retry_interval) + else: + logger.error(f"搜索时发生错误: {error_message}") + raise + else: + # 如果循环正常结束(未break),说明超时 + logger.error(f"索引构建超时,已尝试 {max_retries} 次") + sys.exit(1) + + logger.info("索引创建和测试完成!") + except Exception as e: - logger.info(f"初始化失败: {e}") - return - - logger.info("\n--- 阶段 1: 初始对话 ---") - initial_conversation_history = [] - handle_conversation_turn( - memory_service, llm_client, collection_name, user_id, - "你好,我是小明,今年18岁,但压力好大。", - initial_conversation_history - ) - handle_conversation_turn( - memory_service, llm_client, collection_name, user_id, - "马上就要高考了,家里人的期待好高。", - initial_conversation_history - ) - - logger.info("\n--- 阶段 2: 归档记忆 ---") - archive_conversation( - memory_service, collection_name, user_id, assistant_id, - initial_conversation_history, "study_stress_discussion" - ) - - logger.info("\n--- 阶段 3: 验证记忆 ---") - verification_conversation_history = [] - handle_conversation_turn( - memory_service, llm_client, collection_name, user_id, - "我最近很焦虑,不知道该怎么办。", - verification_conversation_history - ) - - logger.info("\n端到端记忆测试完成!") + logger.error(f"操作失败: {e}") + sys.exit(1) if __name__ == "__main__": diff --git a/dsLightRag/Volcengine/VikingDBMemoryService.py b/dsLightRag/Volcengine/VikingDBMemoryService.py index b9b5f990..2643a0a9 100644 --- a/dsLightRag/Volcengine/VikingDBMemoryService.py +++ b/dsLightRag/Volcengine/VikingDBMemoryService.py @@ -4,9 +4,10 @@ pip install --upgrade "volcengine-python-sdk[ark]" """ import json import logging -import os import threading import time +import sys +import os from dotenv import load_dotenv from volcengine.ApiInfo import ApiInfo @@ -21,107 +22,16 @@ from Config.Config import VOLC_SECRETKEY, VOLC_ACCESSKEY, VOLC_API_KEY # 配置日志 logger = logging.getLogger('CollectionMemory') logger.setLevel(logging.INFO) -handler = logging.StreamHandler() -handler.setFormatter(logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')) -logger.addHandler(handler) + +# 只添加一次处理器,避免重复日志 +if not logger.handlers: + handler = logging.StreamHandler() + handler.setFormatter(logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')) + logger.addHandler(handler) # 记忆体集合名称 MEMORY_COLLECTION_NAME="dsideal_collection" -def initialize_services(ak=None, sk=None, ark_api_key=None): - """初始化记忆数据库服务和LLM客户端""" - load_dotenv() - # 如果参数未提供,尝试从环境变量获取 - if not ak: - ak = VOLC_ACCESSKEY - if not sk: - sk = VOLC_SECRETKEY - if not ark_api_key: - ark_api_key = VOLC_API_KEY - - if not all([ak, sk, ark_api_key]): - raise ValueError("必须提供 VOLC_ACCESSKEY, VOLC_SECRETKEY, 和 VOLC_API_KEY。") - - memory_service = VikingDBMemoryService(ak=ak, sk=sk) - llm_client = Ark( - base_url="https://ark.cn-beijing.volces.com/api/v3", - api_key=ark_api_key, - ) - return memory_service, llm_client - -def ensure_collection_exists(memory_service, collection_name, description="", - builtin_event_types=["sys_event_v1", "sys_profile_collect_v1"], - builtin_entity_types=["sys_profile_v1"]): - """检查记忆集合是否存在,如果不存在则创建。""" - try: - memory_service.get_collection(collection_name) - print(f"记忆集合 '{collection_name}' 已存在。") - except Exception as e: - error_message = str(e) - if "collection not exist" in error_message: - print(f"记忆集合 '{collection_name}' 未找到,正在创建...") - try: - memory_service.create_collection( - collection_name=collection_name, - description=description, - builtin_event_types=builtin_event_types, - builtin_entity_types=builtin_entity_types - ) - print(f"记忆集合 '{collection_name}' 创建成功。") - print("等待集合准备就绪...") - except Exception as create_e: - print(f"创建集合失败: {create_e}") - raise - else: - print(f"检查集合时出错: {e}") - raise - -def search_relevant_memories(memory_service, collection_name, user_id, query, limit=3): - """搜索与用户查询相关的记忆,并在索引构建中时重试。""" - print(f"正在搜索与 '{query}' 相关的记忆...") - retry_attempt = 0 - while True: - try: - filter_params = { - "user_id": user_id, # 修正为字符串类型 - "memory_type": ["sys_event_v1", "sys_profile_v1"] - } - response = memory_service.search_memory( - collection_name=collection_name, - query=query, - filter=filter_params, - limit=limit - ) - - memories = [] - if response.get('data', {}).get('count', 0) > 0: - for result in response['data']['result_list']: - if 'memory_info' in result and result['memory_info']: - memories.append({ - 'memory_info': result['memory_info'], - 'score': result['score'] - }) - - if memories: - if retry_attempt > 0: - print("重试后搜索成功。") - print(f"找到 {len(memories)} 条相关记忆:") - for i, memory in enumerate(memories, 1): - print( - f" {i}. (相关度: {memory['score']:.3f}): {json.dumps(memory['memory_info'], ensure_ascii=False, indent=2)}") - else: - print("未找到相关记忆。") - return memories - - except Exception as e: - error_message = str(e) - if "1000023" in error_message: - retry_attempt += 1 - print(f"记忆索引正在构建中。将在60秒后重试... (尝试次数 {retry_attempt})") - time.sleep(60) - else: - print(f"搜索记忆时出错 (不可重试): {e}") - return [] class VikingDBMemoryException(Exception): def __init__(self, code, request_id, message=None): @@ -309,7 +219,8 @@ class VikingDBMemoryService(Service): logger.info("\n" + "=" * 60) logger.info(f"用户: {user_message}") - relevant_memories = self.search_relevant_memories(user_id, user_message) + # 修复:调用正确的search_relevant_memories方法 + relevant_memories = self.search_relevant_memories(MEMORY_COLLECTION_NAME, user_id, user_message) system_prompt = "你是一个富有同情心、善于倾听的AI伙伴,拥有长期记忆能力。你的目标是为用户提供情感支持和温暖的陪伴。" if relevant_memories: @@ -395,10 +306,105 @@ class VikingDBMemoryService(Service): logger.error(f"集合 '{MEMORY_COLLECTION_NAME}' 在{timeout}秒内未就绪") return False + def initialize_services(self, ak=None, sk=None, ark_api_key=None): + """初始化记忆数据库服务和LLM客户端""" + load_dotenv() + # 如果参数未提供,尝试从环境变量获取 + if not ak: + ak = VOLC_ACCESSKEY + if not sk: + sk = VOLC_SECRETKEY + if not ark_api_key: + ark_api_key = VOLC_API_KEY + + if not all([ak, sk, ark_api_key]): + raise ValueError("必须提供 VOLC_ACCESSKEY, VOLC_SECRETKEY, 和 VOLC_API_KEY。") + + memory_service = VikingDBMemoryService(ak=ak, sk=sk) + llm_client = Ark( + base_url="https://ark.cn-beijing.volces.com/api/v3", + api_key=ark_api_key, + ) + return memory_service, llm_client + + def ensure_collection_exists(self, collection_name, description="", + builtin_event_types=["sys_event_v1", "sys_profile_collect_v1"], + builtin_entity_types=["sys_profile_v1"]): + """检查记忆集合是否存在,如果不存在则创建。""" + try: + self.get_collection(collection_name) + logger.info(f"记忆集合 '{collection_name}' 已存在。") + except Exception as e: + error_message = str(e) + if "collection not exist" in error_message: + logger.info(f"记忆集合 '{collection_name}' 未找到,正在创建...") + try: + self.create_collection( + collection_name=collection_name, + description=description, + builtin_event_types=builtin_event_types, + builtin_entity_types=builtin_entity_types + ) + logger.info(f"记忆集合 '{collection_name}' 创建成功。") + logger.info("等待集合准备就绪...") + except Exception as create_e: + logger.info(f"创建集合失败: {create_e}") + raise + else: + logger.info(f"检查集合时出错: {e}") + raise + + def search_relevant_memories(self, collection_name, user_id, query, limit=3): + """搜索与用户查询相关的记忆,并在索引构建中时重试。""" + logger.info(f"正在搜索与 '{query}' 相关的记忆...") + retry_attempt = 0 + while True: + try: + filter_params = { + "user_id": user_id, # 修正为字符串类型 + "memory_type": ["sys_event_v1", "sys_profile_v1"] + } + response = self.search_memory( + collection_name=collection_name, + query=query, + filter=filter_params, + limit=limit + ) + + memories = [] + if response.get('data', {}).get('count', 0) > 0: + for result in response['data']['result_list']: + if 'memory_info' in result and result['memory_info']: + memories.append({ + 'memory_info': result['memory_info'], + 'score': result['score'] + }) + + if memories: + if retry_attempt > 0: + logger.info("重试后搜索成功。") + logger.info(f"找到 {len(memories)} 条相关记忆:") + for i, memory in enumerate(memories, 1): + logger.info( + f" {i}. (相关度: {memory['score']:.3f}): {json.dumps(memory['memory_info'], ensure_ascii=False, indent=2)}") + else: + logger.info("未找到相关记忆。") + return memories + + except Exception as e: + error_message = str(e) + if "1000023" in error_message: + retry_attempt += 1 + logger.info(f"记忆索引正在构建中。将在60秒后重试... (尝试次数 {retry_attempt})") + time.sleep(60) + else: + logger.info(f"搜索记忆时出错 (不可重试): {e}") + return [] + def setup_memory_collection(self): """独立封装记忆体创建逻辑,返回memory_service供测试使用""" try: - ensure_collection_exists(self, MEMORY_COLLECTION_NAME) + self.ensure_collection_exists(MEMORY_COLLECTION_NAME) logger.info(f"记忆体 '{MEMORY_COLLECTION_NAME}' 创建/验证成功") # 添加集合就绪等待 @@ -411,58 +417,4 @@ class VikingDBMemoryService(Service): return None except Exception as e: logger.info(f"记忆体创建失败: {e}") - return None - - def run_end_to_end_test(self): - """端到端记忆测试的主函数""" - logger.info("开始端到端记忆测试...") - - try: - # 调用封装的记忆体创建函数 - memory_service = self.setup_memory_collection() - if not memory_service: - return - llm_client = Ark( - base_url="https://ark.cn-beijing.volces.com/api/v3", - api_key=VOLC_API_KEY - ) - user_id = "xiaoming" # 用户ID:小明 - assistant_id = "assistant1" # 助手ID:助手1 - except Exception as e: - logger.info(f"初始化失败: {e}") - return - - logger.info("\n--- 阶段 1: 初始对话 ---") - initial_conversation_history = [] - self.handle_conversation_turn( - llm_client, user_id, - "你好,我是小明,今年18岁,但压力好大。", - initial_conversation_history - ) - self.handle_conversation_turn( - llm_client, user_id, - "马上就要高考了,家里人的期待好高。", - initial_conversation_history - ) - - logger.info("\n--- 阶段 2: 归档记忆 ---") - self.archive_conversation( - user_id, assistant_id, - initial_conversation_history, "study_stress_discussion" - ) - - logger.info("\n--- 阶段 3: 验证记忆 ---") - verification_conversation_history = [] - self.handle_conversation_turn( - llm_client, user_id, - "我最近很焦虑,不知道该怎么办。", - verification_conversation_history - ) - - logger.info("\n端到端记忆测试完成!") - -if __name__ == "__main__": - # 初始化服务 - memory_service, _ = initialize_services() - # 运行端到端测试 - memory_service.run_end_to_end_test() \ No newline at end of file + return None \ No newline at end of file diff --git a/dsLightRag/Volcengine/__pycache__/VikingDBMemoryService.cpython-310.pyc b/dsLightRag/Volcengine/__pycache__/VikingDBMemoryService.cpython-310.pyc index bfa155546c44355d85d951febfd231474c085017..9e9d1f4f16083449fc84d56a27de736efd7fc602 100644 GIT binary patch delta 4829 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 E1=zWS$^ZZW delta 5880 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 Ai2wiq diff --git a/dsLightRag/Volcengine/__pycache__/chat.cpython-310.pyc b/dsLightRag/Volcengine/__pycache__/chat.cpython-310.pyc deleted file mode 100644 index a75ffb6d08555b6bc13f43dfba11a093fdf13588..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 12779 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