From bb945536380536d4a22c5af8b1d265f55f1522a2 Mon Sep 17 00:00:00 2001 From: HuangHai <10402852@qq.com> Date: Sun, 7 Sep 2025 08:13:00 +0800 Subject: [PATCH] 'commit' --- dsLightRag/Volcengine/T2_CreateIndex.py | 4 +- .../Volcengine/VikingDBMemoryService.py | 168 +++++++++++++++- .../VikingDBMemoryService.cpython-310.pyc | Bin 9794 -> 14840 bytes .../__pycache__/chat.cpython-310.pyc | Bin 5197 -> 0 bytes dsLightRag/Volcengine/chat.py | 186 ------------------ 5 files changed, 169 insertions(+), 189 deletions(-) delete mode 100644 dsLightRag/Volcengine/__pycache__/chat.cpython-310.pyc delete mode 100644 dsLightRag/Volcengine/chat.py diff --git a/dsLightRag/Volcengine/T2_CreateIndex.py b/dsLightRag/Volcengine/T2_CreateIndex.py index 9dae830f..4148e9c4 100644 --- a/dsLightRag/Volcengine/T2_CreateIndex.py +++ b/dsLightRag/Volcengine/T2_CreateIndex.py @@ -3,7 +3,6 @@ import logging from Config.Config import VOLC_ACCESSKEY, VOLC_SECRETKEY from VikingDBMemoryService import VikingDBMemoryService, MEMORY_COLLECTION_NAME -from Volcengine.chat import wait_for_collection_ready # 控制日志输出 logger = logging.getLogger('CollectionMemory') logger.setLevel(logging.INFO) @@ -47,7 +46,8 @@ def create_memory_collection(collection_name, description="情感陪伴记忆库 # 等待集合就绪 logger.info("等待集合初始化完成...") - if wait_for_collection_ready(memory_service, collection_name): + # 将独立函数调用改为实例方法调用 + if memory_service.wait_for_collection_ready(): logger.info(f"集合 '{collection_name}' 已就绪,可以开始使用") return True else: diff --git a/dsLightRag/Volcengine/VikingDBMemoryService.py b/dsLightRag/Volcengine/VikingDBMemoryService.py index 3e38b461..9dd09ca1 100644 --- a/dsLightRag/Volcengine/VikingDBMemoryService.py +++ b/dsLightRag/Volcengine/VikingDBMemoryService.py @@ -3,6 +3,7 @@ pip install volcengine pip install --upgrade "volcengine-python-sdk[ark]" """ import json +import logging import os import threading import time @@ -17,6 +18,13 @@ from volcenginesdkarkruntime import Ark 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) + # 记忆体集合名称 MEMORY_COLLECTION_NAME="dsideal_collection" @@ -294,4 +302,162 @@ class VikingDBMemoryService(Service): if entities is not None: params["entities"] = entities res = self.json("AddSession", {}, json.dumps(params)) - return json.loads(res) \ No newline at end of file + return json.loads(res) + + def handle_conversation_turn(self, llm_client, user_id, user_message, conversation_history): + """处理一轮对话,包括记忆搜索和LLM响应。""" + logger.info("\n" + "=" * 60) + logger.info(f"用户: {user_message}") + + relevant_memories = self.search_relevant_memories(user_id, user_message) + + system_prompt = "你是一个富有同情心、善于倾听的AI伙伴,拥有长期记忆能力。你的目标是为用户提供情感支持和温暖的陪伴。" + if relevant_memories: + memory_context = "\n".join( + [f"- {json.dumps(mem['memory_info'], ensure_ascii=False)}" for mem in relevant_memories]) + system_prompt += f"\n\n这是我们过去的一些对话记忆,请参考:\n{memory_context}\n\n请利用这些信息来更好地理解和回应用户。" + + logger.info("AI正在思考...") + + try: + messages = [{"role": "system", "content": system_prompt}] + conversation_history + [ + {"role": "user", "content": user_message}] + completion = llm_client.chat.completions.create( + model="doubao-seed-1-6-flash-250715", + messages=messages + ) + assistant_reply = completion.choices[0].message.content + except Exception as e: + logger.info(f"LLM调用失败: {e}") + assistant_reply = "抱歉,我现在有点混乱,无法回应。我们可以稍后再聊吗?" + + logger.info(f"伙伴: {assistant_reply}") + + conversation_history.extend([ + {"role": "user", "content": user_message}, + {"role": "assistant", "content": assistant_reply} + ]) + return assistant_reply + + def archive_conversation(self, user_id, assistant_id, conversation_history, topic_name): + """将对话历史归档到记忆数据库。""" + if not conversation_history: + logger.info("没有对话可以归档。") + return False + + logger.info(f"\n正在归档关于 '{topic_name}' 的对话...") + session_id = f"{topic_name}_{int(time.time())}" + metadata = { + "default_user_id": user_id, + "default_assistant_id": assistant_id, + "time": int(time.time() * 1000) + } + + try: + self.add_session( + collection_name=MEMORY_COLLECTION_NAME, + session_id=session_id, + messages=conversation_history, + metadata=metadata + ) + logger.info(f"对话已成功归档,会话ID: {session_id}") + logger.info("正在等待记忆索引更新...") + return True + except Exception as e: + logger.info(f"归档对话失败: {e}") + return False + + def wait_for_collection_ready(self, timeout=300, interval=10): + """ + 等待集合准备就绪 + :param timeout: 超时时间(秒) + :param interval: 检查间隔(秒) + :return: True if ready, False if timeout + """ + start_time = time.time() + while time.time() - start_time < timeout: + try: + # 使用类中定义的集合名称常量 + collection_info = self.get_collection(MEMORY_COLLECTION_NAME) + status = collection_info.get("Status", "UNKNOWN") + logger.info(f"集合 '{MEMORY_COLLECTION_NAME}' 当前状态: {status}") + if status == "READY": + return True + time.sleep(interval) + except Exception as e: + logger.info(f"检查集合状态失败: {e}") + time.sleep(interval) + logger.info(f"集合 '{MEMORY_COLLECTION_NAME}' 在{timeout}秒内未就绪") + return False + + def setup_memory_collection(self): + """独立封装记忆体创建逻辑,返回memory_service供测试使用""" + try: + ensure_collection_exists(self, MEMORY_COLLECTION_NAME) + logger.info(f"记忆体 '{MEMORY_COLLECTION_NAME}' 创建/验证成功") + + # 添加集合就绪等待 + logger.info("等待集合准备就绪...") + if self.wait_for_collection_ready(): + logger.info(f"集合 '{MEMORY_COLLECTION_NAME}' 已就绪") + return self + else: + logger.info(f"集合 '{MEMORY_COLLECTION_NAME}' 未能就绪") + 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 diff --git a/dsLightRag/Volcengine/__pycache__/VikingDBMemoryService.cpython-310.pyc b/dsLightRag/Volcengine/__pycache__/VikingDBMemoryService.cpython-310.pyc index 2ed7c6feac153f4cad4affd8acce0bb0bc9b0d18..1fb44e15827b19b57cd1ffb8a2fc11ad19ae4620 100644 GIT binary patch delta 7615 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 GbN>T&0ScY~ diff --git a/dsLightRag/Volcengine/chat.py b/dsLightRag/Volcengine/chat.py deleted file mode 100644 index a750856f..00000000 --- a/dsLightRag/Volcengine/chat.py +++ /dev/null @@ -1,186 +0,0 @@ -import logging -import os -import time - -from volcenginesdkarkruntime import Ark - -from Config.Config import VOLC_API_KEY - -""" -在记忆库准备好后,我们先模拟一段包含两轮的完整对话。 -对话结束后,把这段对话历史消息写入记忆库。然后再开启一个新话题,提出和刚才相关的问题, -AI 就能用刚写入的记忆来回答。 -注意:首次写入需要 3–5 分钟建立索引,这段时间内检索会报错。 -""" -import json -import time -from VikingDBMemoryService import initialize_services, ensure_collection_exists, search_relevant_memories -# 控制日志输出 -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) -def handle_conversation_turn(memory_service, llm_client, collection_name, user_id, user_message, conversation_history): - """处理一轮对话,包括记忆搜索和LLM响应。""" - logger.info("\n" + "=" * 60) - logger.info(f"用户: {user_message}") - - relevant_memories = search_relevant_memories(memory_service, collection_name, user_id, user_message) - - system_prompt = "你是一个富有同情心、善于倾听的AI伙伴,拥有长期记忆能力。你的目标是为用户提供情感支持和温暖的陪伴。" - if relevant_memories: - memory_context = "\n".join( - [f"- {json.dumps(mem['memory_info'], ensure_ascii=False)}" for mem in relevant_memories]) - system_prompt += f"\n\n这是我们过去的一些对话记忆,请参考:\n{memory_context}\n\n请利用这些信息来更好地理解和回应用户。" - - logger.info("AI正在思考...") - - try: - messages = [{"role": "system", "content": system_prompt}] + conversation_history + [ - {"role": "user", "content": user_message}] - completion = llm_client.chat.completions.create( - model="doubao-seed-1-6-flash-250715", - messages=messages - ) - assistant_reply = completion.choices[0].message.content - except Exception as e: - logger.info(f"LLM调用失败: {e}") - assistant_reply = "抱歉,我现在有点混乱,无法回应。我们可以稍后再聊吗?" - - logger.info(f"伙伴: {assistant_reply}") - - conversation_history.extend([ - {"role": "user", "content": user_message}, - {"role": "assistant", "content": assistant_reply} - ]) - return assistant_reply - -def archive_conversation(memory_service, collection_name, user_id, assistant_id, conversation_history, topic_name): - """将对话历史归档到记忆数据库。""" - if not conversation_history: - logger.info("没有对话可以归档。") - return False - - logger.info(f"\n正在归档关于 '{topic_name}' 的对话...") - session_id = f"{topic_name}_{int(time.time())}" - metadata = { - "default_user_id": user_id, - "default_assistant_id": assistant_id, - "time": int(time.time() * 1000) - } - - try: - memory_service.add_session( - collection_name=collection_name, - session_id=session_id, - messages=conversation_history, - metadata=metadata - ) - logger.info(f"对话已成功归档,会话ID: {session_id}") - logger.info("正在等待记忆索引更新...") - return True - except Exception as e: - logger.info(f"归档对话失败: {e}") - return False - -def setup_memory_collection(collection_name="emotional_support"): - """独立封装记忆体创建逻辑,返回memory_service供测试使用""" - try: - memory_service, _ = initialize_services() - ensure_collection_exists(memory_service, collection_name) - logger.info(f"记忆体 '{collection_name}' 创建/验证成功") - - # 添加集合就绪等待 - logger.info("等待集合准备就绪...") - if wait_for_collection_ready(memory_service, collection_name): - logger.info(f"集合 '{collection_name}' 已就绪") - return memory_service - else: - logger.info(f"集合 '{collection_name}' 未能就绪") - return None - except Exception as e: - logger.info(f"记忆体创建失败: {e}") - return None - -def wait_for_collection_ready(memory_service, collection_name, timeout=300, interval=10): - """ - 等待集合准备就绪 - :param memory_service: 记忆库服务实例 - :param collection_name: 集合名称 - :param timeout: 超时时间(秒) - :param interval: 检查间隔(秒) - :return: True if ready, False if timeout - """ - start_time = time.time() - while time.time() - start_time < timeout: - try: - collection_info = memory_service.get_collection(collection_name) - # 根据Volcengine API文档,状态可能在Status字段中,值可能为"READY"、"CREATING"等 - status = collection_info.get("Status", "UNKNOWN") - logger.info(f"集合 '{collection_name}' 当前状态: {status}") - if status == "READY": - return True - time.sleep(interval) - except Exception as e: - logger.info(f"检查集合状态失败: {e}") - time.sleep(interval) - logger.info(f"集合 '{collection_name}' 在{timeout}秒内未就绪") - return False - -def main(): - logger.info("开始端到端记忆测试...") - collection_name="emotional_support" - - try: - # 调用封装的记忆体创建函数 - memory_service = 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 = [] - 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端到端记忆测试完成!") - -if __name__ == "__main__": - setup_memory_collection() -# main() -""" -memory_service = setup_memory_collection() -if memory_service: - is_ready = wait_for_collection_ready(memory_service, "emotional_support") -""" \ No newline at end of file