From 3ec57f2afee583803210b9fa0c4fe059bf375cf7 Mon Sep 17 00:00:00 2001 From: "qintiancheng.qtc" Date: Fri, 2 Aug 2024 18:32:58 +0800 Subject: [PATCH] Tiancheng: bug fix example usages --- examples/api/example_usages.ipynb | 548 +++++++++++++----- memoryscope/core/config/demo_config.yaml | 4 +- .../worker/backend/contra_repeat_worker.yaml | 2 +- .../worker/backend/update_memory_worker.py | 2 +- 4 files changed, 406 insertions(+), 150 deletions(-) diff --git a/examples/api/example_usages.ipynb b/examples/api/example_usages.ipynb index b12c374a..0a8bfc99 100644 --- a/examples/api/example_usages.ipynb +++ b/examples/api/example_usages.ipynb @@ -24,8 +24,189 @@ }, { "cell_type": "code", - "execution_count": 35, - "outputs": [], + "execution_count": 1, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2024-08-02 18:28:24 INFO MainThread logger:64] logger=memoryscope_20240802_182824 is inited.\n", + "2024-08-02 18:28:24 INFO MainThread config_manager:39] init by arguments mode: {'language': 'cn', 'thread_pool_max_workers': 5, 'logger_name': 'memoryscope', 'logger_name_time_suffix': '%Y%m%d_%H%M%S', 'logger_to_screen': True, 'memory_chat_class': 'api_memory_chat', 'chat_stream': None, 'human_name': '用户', 'assistant_name': 'AI', 'consolidate_memory_interval_time': 1, 'reflect_and_reconsolidate_interval_time': 15, 'worker_params': {'get_reflection_subject': {'reflect_num_questions': 3}}, 'generation_backend': 'dashscope_generation', 'generation_model': 'qwen2-72b-instruct', 'generation_params': {}, 'embedding_backend': 'dashscope_embedding', 'embedding_model': 'text-embedding-v2', 'embedding_params': {}, 'rank_backend': 'dashscope_rank', 'rank_model': 'gte-rerank', 'rank_params': {}, 'es_index_name': 'memory_index', 'es_url': 'http://localhost:9200', 'retrieve_mode': 'dense', 'enable_ranker': False, 'enable_today_contra_repeat': True, 'enable_long_contra_repeat': False, 'output_memory_max_count': 20}\n", + "2024-08-02 18:28:24 INFO MainThread config_manager:50] \n", + "global:\n", + " enable_long_contra_repeat: false\n", + " enable_ranker: false\n", + " enable_today_contra_repeat: true\n", + " language: cn\n", + " logger_name: memoryscope\n", + " logger_name_time_suffix: '%Y%m%d_%H%M%S'\n", + " logger_to_screen: true\n", + " output_memory_max_count: 20\n", + " thread_pool_max_workers: 5\n", + "memory_chat:\n", + " cli_memory_chat:\n", + " class: core.chat.api_memory_chat\n", + " generation_model: generation_model\n", + " memory_service: memoryscope_service\n", + " stream: false\n", + "memory_service:\n", + " memoryscope_service:\n", + " assistant_name: AI\n", + " class: core.service.memory_scope_service\n", + " human_name: 用户\n", + " memory_operations:\n", + " add_memory:\n", + " class: core.operation.frontend_operation\n", + " description: add a single observation\n", + " workflow: add_memory\n", + " consolidate_memory:\n", + " class: core.operation.consolidate_memory_op\n", + " description: summary user's observation memory, run backend.\n", + " interval_time: 1\n", + " workflow: info_filter,[get_observation|get_observation_with_time|load_today_memory],contra_repeat,store_memory\n", + " delete_all:\n", + " class: core.operation.frontend_operation\n", + " description: delete all long-term memory\n", + " workflow: set_query,retrieve_all_memory,delete_all\n", + " delete_memory:\n", + " class: core.operation.frontend_operation\n", + " description: delete a single long-term memory\n", + " workflow: set_query,retrieve_all_memory,delete_memory\n", + " list_memory:\n", + " class: core.operation.frontend_operation\n", + " description: read all long-term memory of the user, use `refresh_time=5` to\n", + " refresh screen.\n", + " workflow: set_query,retrieve_top_memory,print_memory\n", + " read_message:\n", + " class: core.operation.frontend_operation\n", + " description: read short memory\n", + " workflow: read_message\n", + " reflect_and_reconsolidate:\n", + " class: core.operation.backend_operation\n", + " description: summary user's insight memory, run backend.\n", + " interval_time: 15\n", + " workflow: load_obs_and_insight,get_reflection_subject,update_insight,long_contra_repeat,store_memory\n", + " retrieve_memory:\n", + " class: core.operation.frontend_operation\n", + " description: retrieve long-term memory\n", + " workflow: set_query,[extract_time|retrieve_obs_ins,semantic_rank],fuse_rerank\n", + "memory_store:\n", + " class: core.storage.llama_index_es_memory_store\n", + " embedding_model: embedding_model\n", + " es_url: http://localhost:9200\n", + " index_name: memory_index\n", + " retrieve_mode: dense\n", + "model:\n", + " embedding_model:\n", + " class: core.models.llama_index_embedding_model\n", + " model_name: text-embedding-v2\n", + " module_name: dashscope_embedding\n", + " generation_model:\n", + " class: core.models.llama_index_generation_model\n", + " max_tokens: 2000\n", + " model_name: qwen2-72b-instruct\n", + " module_name: dashscope_generation\n", + " rank_model:\n", + " class: core.models.llama_index_rank_model\n", + " model_name: gte-rerank\n", + " module_name: dashscope_rank\n", + " top_n: 500\n", + "monitor:\n", + " class: core.storage.dummy_monitor\n", + "worker:\n", + " add_memory:\n", + " class: core.worker.backend.update_memory_worker\n", + " method: from_query\n", + " contra_repeat:\n", + " class: core.worker.backend.contra_repeat_worker\n", + " generation_model: generation_model\n", + " delete_all:\n", + " class: core.worker.backend.update_memory_worker\n", + " method: delete_all\n", + " delete_memory:\n", + " class: core.worker.backend.update_memory_worker\n", + " method: delete_memory\n", + " dummy:\n", + " class: core.worker.dummy_worker\n", + " embedding_model: embedding_model\n", + " generation_model: generation_model\n", + " rank_model: rank_model\n", + " extract_time:\n", + " class: core.worker.frontend.extract_time_worker\n", + " generation_model: generation_model\n", + " fuse_rerank:\n", + " class: core.worker.frontend.fuse_rerank_worker\n", + " fuse_ratio_dict:\n", + " conversation: 0.5\n", + " insight: 2.0\n", + " obs_customized: 1.2\n", + " observation: 1\n", + " fuse_score_threshold: 0.01\n", + " fuse_time_ratio: 2.0\n", + " get_observation:\n", + " class: core.worker.backend.get_observation_worker\n", + " generation_model: generation_model\n", + " get_observation_with_time:\n", + " class: core.worker.backend.get_observation_with_time_worker\n", + " generation_model: generation_model\n", + " get_reflection_subject:\n", + " class: core.worker.backend.get_reflection_subject_worker\n", + " generation_model: generation_model\n", + " reflect_num_questions: 3\n", + " reflect_obs_cnt_threshold: 5\n", + " info_filter:\n", + " class: core.worker.backend.info_filter_worker\n", + " generation_model: generation_model\n", + " load_obs_and_insight:\n", + " class: core.worker.backend.load_memory_worker\n", + " retrieve_insight_top_k: 100\n", + " retrieve_not_reflected_top_k: 100\n", + " retrieve_not_updated_top_k: 100\n", + " load_today_memory:\n", + " class: core.worker.backend.load_memory_worker\n", + " retrieve_today_top_k: 100\n", + " long_contra_repeat:\n", + " class: core.worker.backend.long_contra_repeat_worker\n", + " generation_model: generation_model\n", + " long_contra_repeat_threshold: 0.5\n", + " print_memory:\n", + " class: core.worker.frontend.print_memory_worker\n", + " read_message:\n", + " class: core.worker.frontend.read_message_worker\n", + " retrieve_all_memory:\n", + " class: core.worker.frontend.retrieve_memory_worker\n", + " retrieve_expired_top_k: 1000\n", + " retrieve_ins_top_k: 1000\n", + " retrieve_obs_top_k: 1000\n", + " retrieve_obs_ins:\n", + " class: core.worker.frontend.retrieve_memory_worker\n", + " retrieve_ins_top_k: 100\n", + " retrieve_obs_top_k: 100\n", + " retrieve_top_memory:\n", + " class: core.worker.frontend.retrieve_memory_worker\n", + " retrieve_expired_top_k: 100\n", + " retrieve_ins_top_k: 100\n", + " retrieve_obs_top_k: 100\n", + " semantic_rank:\n", + " class: core.worker.frontend.semantic_rank_worker\n", + " rank_model: rank_model\n", + " set_query:\n", + " class: core.worker.frontend.set_query_worker\n", + " store_memory:\n", + " class: core.worker.backend.update_memory_worker\n", + " memory_key: all\n", + " method: from_memory_key\n", + " update_insight:\n", + " class: core.worker.backend.update_insight_worker\n", + " embedding_model: embedding_model\n", + " generation_model: generation_model\n", + " rank_model: rank_model\n", + " update_insight_threshold: 0.01\n", + "\n", + "2024-08-02 18:28:24 WARNING MainThread memoryscope:32] If a semantic ranking model is not available, MemoryScope will use cosine similarity scoring as a substitute. However, the ranking effectiveness will be somewhat compromised.\n" + ] + } + ], "source": [ "import sys\n", "sys.path.append(\".\")\n", @@ -34,7 +215,7 @@ " language=\"cn\",\n", " human_name=\"用户\",\n", " assistant_name=\"AI\",\n", - " logger_to_screen=False,\n", + " logger_to_screen=True,\n", " memory_chat_class=\"api_memory_chat\",\n", " generation_backend=\"dashscope_generation\",\n", " generation_model=\"qwen2-72b-instruct\",\n", @@ -42,7 +223,7 @@ " embedding_model=\"text-embedding-v2\",\n", " rank_backend=\"dashscope_rank\",\n", " rank_model=\"gte-rerank\",\n", - " enable_ranker=True,\n", + " enable_ranker=False,\n", " worker_params={\"get_reflection_subject\": {\"reflect_num_questions\": 3}}\n", ")\n", "\n", @@ -51,8 +232,8 @@ "metadata": { "collapsed": false, "ExecuteTime": { - "end_time": "2024-08-02T09:27:16.438843Z", - "start_time": "2024-08-02T09:27:16.379615Z" + "end_time": "2024-08-02T10:28:26.547739Z", + "start_time": "2024-08-02T10:28:24.509118Z" } } }, @@ -68,8 +249,101 @@ }, { "cell_type": "code", - "execution_count": 36, + "execution_count": 2, "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2024-08-02 18:28:26 INFO MainThread base_workflow:95] ----- workflow.read_message.print.begin -----\n", + "2024-08-02 18:28:26 INFO MainThread base_workflow:101] stage0: read_message\n", + "2024-08-02 18:28:26 INFO MainThread base_workflow:112] ----- workflow.read_message.print.end -----\n", + "2024-08-02 18:28:26 INFO MainThread memory_scope_service:83] service=MemoryScopeService init operation=read_message\n", + "2024-08-02 18:28:26 INFO MainThread base_workflow:95] ----- workflow.retrieve_memory.print.begin -----\n", + "2024-08-02 18:28:26 INFO MainThread base_workflow:101] stage0: set_query\n", + "2024-08-02 18:28:26 INFO MainThread base_workflow:106] stage1: extract_time | retrieve_obs_ins\n", + "2024-08-02 18:28:26 INFO MainThread base_workflow:106] stage2: - | semantic_rank\n", + "2024-08-02 18:28:26 INFO MainThread base_workflow:101] stage3: fuse_rerank\n", + "2024-08-02 18:28:26 INFO MainThread base_workflow:112] ----- workflow.retrieve_memory.print.end -----\n", + "2024-08-02 18:28:26 INFO MainThread memory_scope_service:83] service=MemoryScopeService init operation=retrieve_memory\n", + "2024-08-02 18:28:26 INFO MainThread base_workflow:95] ----- workflow.list_memory.print.begin -----\n", + "2024-08-02 18:28:26 INFO MainThread base_workflow:101] stage0: set_query\n", + "2024-08-02 18:28:26 INFO MainThread base_workflow:101] stage1: retrieve_top_memory\n", + "2024-08-02 18:28:26 INFO MainThread base_workflow:101] stage2: print_memory\n", + "2024-08-02 18:28:26 INFO MainThread base_workflow:112] ----- workflow.list_memory.print.end -----\n", + "2024-08-02 18:28:26 INFO MainThread memory_scope_service:83] service=MemoryScopeService init operation=list_memory\n", + "2024-08-02 18:28:26 INFO MainThread base_workflow:95] ----- workflow.delete_memory.print.begin -----\n", + "2024-08-02 18:28:26 INFO MainThread base_workflow:101] stage0: set_query\n", + "2024-08-02 18:28:26 INFO MainThread base_workflow:101] stage1: retrieve_all_memory\n", + "2024-08-02 18:28:26 INFO MainThread base_workflow:101] stage2: delete_memory\n", + "2024-08-02 18:28:26 INFO MainThread base_workflow:112] ----- workflow.delete_memory.print.end -----\n", + "2024-08-02 18:28:26 INFO MainThread memory_scope_service:83] service=MemoryScopeService init operation=delete_memory\n", + "2024-08-02 18:28:26 INFO MainThread base_workflow:95] ----- workflow.delete_all.print.begin -----\n", + "2024-08-02 18:28:26 INFO MainThread base_workflow:101] stage0: set_query\n", + "2024-08-02 18:28:26 INFO MainThread base_workflow:101] stage1: retrieve_all_memory\n", + "2024-08-02 18:28:26 INFO MainThread base_workflow:101] stage2: delete_all\n", + "2024-08-02 18:28:26 INFO MainThread base_workflow:112] ----- workflow.delete_all.print.end -----\n", + "2024-08-02 18:28:26 INFO MainThread memory_scope_service:83] service=MemoryScopeService init operation=delete_all\n", + "2024-08-02 18:28:26 INFO MainThread base_workflow:95] ----- workflow.add_memory.print.begin -----\n", + "2024-08-02 18:28:26 INFO MainThread base_workflow:101] stage0: add_memory\n", + "2024-08-02 18:28:26 INFO MainThread base_workflow:112] ----- workflow.add_memory.print.end -----\n", + "2024-08-02 18:28:26 INFO MainThread memory_scope_service:83] service=MemoryScopeService init operation=add_memory\n", + "2024-08-02 18:28:26 INFO MainThread base_workflow:95] ----- workflow.consolidate_memory.print.begin -----\n", + "2024-08-02 18:28:26 INFO MainThread base_workflow:101] stage0: info_filter\n", + "2024-08-02 18:28:26 INFO MainThread base_workflow:106] stage1: get_observation | get_observation_with_time | load_today_memory\n", + "2024-08-02 18:28:26 INFO MainThread base_workflow:101] stage2: contra_repeat\n", + "2024-08-02 18:28:26 INFO MainThread base_workflow:101] stage3: store_memory\n", + "2024-08-02 18:28:26 INFO MainThread base_workflow:112] ----- workflow.consolidate_memory.print.end -----\n", + "2024-08-02 18:28:26 INFO MainThread memory_scope_service:83] service=MemoryScopeService init operation=consolidate_memory\n", + "2024-08-02 18:28:26 INFO MainThread base_workflow:95] ----- workflow.reflect_and_reconsolidate.print.begin -----\n", + "2024-08-02 18:28:26 INFO MainThread base_workflow:101] stage0: load_obs_and_insight\n", + "2024-08-02 18:28:26 INFO MainThread base_workflow:101] stage1: get_reflection_subject\n", + "2024-08-02 18:28:26 INFO MainThread base_workflow:101] stage2: update_insight\n", + "2024-08-02 18:28:26 INFO MainThread base_workflow:101] stage3: long_contra_repeat\n", + "2024-08-02 18:28:26 INFO MainThread base_workflow:101] stage4: store_memory\n", + "2024-08-02 18:28:26 INFO MainThread base_workflow:112] ----- workflow.reflect_and_reconsolidate.print.end -----\n", + "2024-08-02 18:28:26 INFO MainThread memory_scope_service:83] service=MemoryScopeService init operation=reflect_and_reconsolidate\n", + "2024-08-02 18:28:26 INFO MainThread timer:75] ----- workflow.delete_all.begin -----\n", + "2024-08-02 18:28:26 INFO MainThread timer:75] ----- worker.set_query.begin -----\n", + "2024-08-02 18:28:26 INFO MainThread base_worker:145] ----- worker.set_query.end ----- cost=0.3171ms\n", + "2024-08-02 18:28:26 INFO MainThread timer:75] ----- worker.retrieve_all_memory.begin -----\n", + "2024-08-02 18:28:26 INFO MainThread retrieve_memory_worker:123] retrieve memory with query=.\n", + "2024-08-02 18:28:26 INFO ThreadPoolExecutor-0_2 timer:127] retrieve_expired_memory cost=382.0448ms query=\n", + "2024-08-02 18:28:26 INFO ThreadPoolExecutor-0_0 timer:127] retrieve_from_observation cost=383.0619ms query=\n", + "2024-08-02 18:28:26 INFO ThreadPoolExecutor-0_1 timer:127] retrieve_from_insight cost=383.0431ms query=\n", + "2024-08-02 18:28:26 INFO MainThread retrieve_memory_worker:132] memory_node_list.size=0\n", + "2024-08-02 18:28:26 INFO MainThread base_worker:145] ----- worker.retrieve_all_memory.end ----- cost=386.7860ms\n", + "2024-08-02 18:28:26 INFO MainThread timer:75] ----- worker.delete_all.begin -----\n", + "2024-08-02 18:28:26 INFO MainThread update_memory_worker:62] delete_all.size=0\n", + "2024-08-02 18:28:26 INFO MainThread base_worker:145] ----- worker.delete_all.end ----- cost=1.1411ms\n", + "2024-08-02 18:28:26 INFO MainThread base_workflow:167] ----- workflow.delete_all.end ----- cost=389.7450ms\n", + "2024-08-02 18:28:26 INFO MainThread timer:75] ----- workflow.retrieve_memory.begin -----\n", + "2024-08-02 18:28:26 INFO MainThread timer:75] ----- worker.set_query.begin -----\n", + "2024-08-02 18:28:26 INFO MainThread base_worker:145] ----- worker.set_query.end ----- cost=0.4051ms\n", + "2024-08-02 18:28:26 INFO ThreadPoolExecutor-0_2 timer:75] ----- worker.extract_time.begin -----\n", + "2024-08-02 18:28:26 INFO ThreadPoolExecutor-0_0 timer:75] ----- worker.retrieve_obs_ins.begin -----\n", + "2024-08-02 18:28:26 INFO ThreadPoolExecutor-0_2 extract_time_worker:37] contain_datetime=False\n", + "2024-08-02 18:28:26 INFO ThreadPoolExecutor-0_0 retrieve_memory_worker:123] retrieve memory with query=我的爱好是弹琴。.\n", + "2024-08-02 18:28:26 INFO ThreadPoolExecutor-0_2 base_worker:145] ----- worker.extract_time.end ----- cost=1.2507ms\n", + "2024-08-02 18:28:26 INFO ThreadPoolExecutor-0_4 timer:127] retrieve_expired_memory cost=0.0010ms query=我的爱好是弹琴。\n", + "2024-08-02 18:28:27 INFO ThreadPoolExecutor-0_1 timer:127] retrieve_from_insight cost=263.5777ms query=我的爱好是弹琴。\n", + "2024-08-02 18:28:27 INFO ThreadPoolExecutor-0_3 timer:127] retrieve_from_observation cost=317.2297ms query=我的爱好是弹琴。\n", + "2024-08-02 18:28:27 INFO ThreadPoolExecutor-0_0 retrieve_memory_worker:132] memory_node_list.size=0\n", + "2024-08-02 18:28:27 INFO ThreadPoolExecutor-0_0 base_worker:145] ----- worker.retrieve_obs_ins.end ----- cost=320.3712ms\n", + "2024-08-02 18:28:27 INFO ThreadPoolExecutor-0_0 timer:75] ----- worker.semantic_rank.begin -----\n", + "2024-08-02 18:28:27 WARNING ThreadPoolExecutor-0_0 semantic_rank_worker:38] Retrieve memory nodes is empty!\n", + "2024-08-02 18:28:27 INFO ThreadPoolExecutor-0_0 base_worker:145] ----- worker.semantic_rank.end ----- cost=0.8211ms\n", + "2024-08-02 18:28:27 INFO MainThread timer:75] ----- worker.fuse_rerank.begin -----\n", + "2024-08-02 18:28:27 WARNING MainThread fuse_rerank_worker:69] Ranked memory nodes list is empty.\n", + "2024-08-02 18:28:27 INFO MainThread base_worker:145] ----- worker.fuse_rerank.end ----- cost=1.2810ms\n", + "2024-08-02 18:28:27 INFO MainThread base_workflow:167] ----- workflow.retrieve_memory.end ----- cost=325.6671ms\n", + "2024-08-02 18:28:27 INFO MainThread timer:75] ----- workflow.read_message.begin -----\n", + "2024-08-02 18:28:27 INFO MainThread timer:75] ----- worker.read_message.begin -----\n", + "2024-08-02 18:28:27 INFO MainThread base_worker:145] ----- worker.read_message.end ----- cost=0.2921ms\n", + "2024-08-02 18:28:27 INFO MainThread base_workflow:167] ----- workflow.read_message.end ----- cost=1.1899ms\n", + "2024-08-02 18:28:27 INFO MainThread api_memory_chat:186] chat_messages=[Message(role='system', role_name='', content='你是一个名为MemoryScope的智能助理,请用中文简洁地回答问题。当前时间是2024-08-02 18:28:27 周五。', time_created=1722594507, memorized=False, meta_data={}), Message(role='user', role_name='用户', content='我的爱好是弹琴。', time_created=1722594506, memorized=False, meta_data={})]\n" + ] + }, { "name": "stdout", "output_type": "stream", @@ -88,8 +362,8 @@ "metadata": { "collapsed": false, "ExecuteTime": { - "end_time": "2024-08-02T09:27:18.831915Z", - "start_time": "2024-08-02T09:27:16.410537Z" + "end_time": "2024-08-02T10:28:29.660299Z", + "start_time": "2024-08-02T10:28:26.549127Z" } } }, @@ -104,31 +378,69 @@ }, { "cell_type": "code", - "execution_count": 37, + "execution_count": 3, "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2024-08-02 18:28:29 INFO MainThread timer:75] ----- workflow.retrieve_memory.begin -----\n", + "2024-08-02 18:28:29 INFO MainThread timer:75] ----- worker.set_query.begin -----\n", + "2024-08-02 18:28:29 INFO MainThread base_worker:145] ----- worker.set_query.end ----- cost=0.6740ms\n", + "2024-08-02 18:28:30 INFO MainThread timer:75] ----- worker.fuse_rerank.begin -----\n", + "2024-08-02 18:28:30 WARNING MainThread fuse_rerank_worker:69] Ranked memory nodes list is empty.\n", + "2024-08-02 18:28:30 INFO MainThread base_worker:145] ----- worker.fuse_rerank.end ----- cost=0.8800ms\n", + "2024-08-02 18:28:30 INFO MainThread base_workflow:167] ----- workflow.retrieve_memory.end ----- cost=384.5589ms\n", + "2024-08-02 18:28:30 INFO MainThread timer:75] ----- workflow.read_message.begin -----\n", + "2024-08-02 18:28:30 INFO MainThread timer:75] ----- worker.read_message.begin -----\n", + "2024-08-02 18:28:30 INFO MainThread base_worker:145] ----- worker.read_message.end ----- cost=0.2897ms\n", + "2024-08-02 18:28:30 INFO MainThread base_workflow:167] ----- workflow.read_message.end ----- cost=1.0922ms\n", + "2024-08-02 18:28:30 INFO MainThread api_memory_chat:186] chat_messages=[Message(role='system', role_name='', content='你是一个名为MemoryScope的智能助理,请用中文简洁地回答问题。当前时间是2024-08-02 18:28:30 周五。', time_created=1722594510, memorized=False, meta_data={}), Message(role='user', role_name='用户', content='我的爱好是弹琴。', time_created=1722594506, memorized=False, meta_data={}), Message(role='assistant', role_name='AI', content='那真是一个优雅的爱好!弹琴不仅能够陶冶情操,还能提升音乐素养和手指灵活性。你最喜欢弹奏哪种类型的曲子呢?', time_created=1722594509, memorized=False, meta_data={}), Message(role='user', role_name='用户', content='你知道我有什么乐器爱好吗?', time_created=1722594509, memorized=False, meta_data={})]\n", + "2024-08-02 18:28:32 INFO MainThread timer:75] ----- workflow.retrieve_memory.begin -----\n", + "2024-08-02 18:28:32 INFO MainThread timer:75] ----- worker.set_query.begin -----\n", + "2024-08-02 18:28:32 INFO MainThread base_worker:145] ----- worker.set_query.end ----- cost=0.7801ms\n" + ] + }, { "name": "stdout", "output_type": "stream", "text": [ "回答2:\n", - "根据您之前的回答,您的乐器爱好是弹琴。\n", + "您提到过的爱好是弹琴,所以我了解到您对弹奏乐器,特别是钢琴有兴趣。是否还有其他乐器爱好呢?\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2024-08-02 18:28:32 INFO MainThread timer:75] ----- worker.fuse_rerank.begin -----\n", + "2024-08-02 18:28:32 WARNING MainThread fuse_rerank_worker:69] Ranked memory nodes list is empty.\n", + "2024-08-02 18:28:32 INFO MainThread base_worker:145] ----- worker.fuse_rerank.end ----- cost=0.8247ms\n", + "2024-08-02 18:28:32 INFO MainThread base_workflow:167] ----- workflow.retrieve_memory.end ----- cost=303.6480ms\n", + "2024-08-02 18:28:32 INFO MainThread api_memory_chat:186] chat_messages=[Message(role='system', role_name='', content='你是一个名为MemoryScope的智能助理,请用中文简洁地回答问题。当前时间是2024-08-02 18:28:32 周五。', time_created=1722594512, memorized=False, meta_data={}), Message(role='user', role_name='用户', content='你知道我有什么乐器爱好吗?', time_created=1722594512, memorized=False, meta_data={})]\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ "回答3:\n", - "对不起,我无法记住或了解特定用户的具体个人信息,如乐器爱好,除非您之前已通过相应渠道告诉我。如果您愿意分享,我很乐意了解您的乐器爱好。\n" + "作为MemoryScope,我无法直接获取或记忆您的个人信息,包括您的乐器爱好,除非您之前已告知我。如果您愿意分享,我可以帮助您记录或提供与乐器爱好相关的信息。\n" ] } ], "source": [ - "response = memory_chat.chat_with_memory(query=\"你知道我的乐器爱好是什么吗?\")\n", + "response = memory_chat.chat_with_memory(query=\"你知道我有什么乐器爱好吗?\")\n", "print(\"回答2:\\n\" + response.message.content)\n", - "response = memory_chat.chat_with_memory(query=\"你知道我的乐器爱好是什么吗?\",\n", + "response = memory_chat.chat_with_memory(query=\"你知道我有什么乐器爱好吗?\",\n", " history_message_strategy=None)\n", "print(\"回答3:\\n\" + response.message.content)" ], "metadata": { "collapsed": false, "ExecuteTime": { - "end_time": "2024-08-02T09:27:22.808506Z", - "start_time": "2024-08-02T09:27:18.832582Z" + "end_time": "2024-08-02T10:28:35.807252Z", + "start_time": "2024-08-02T10:28:29.659682Z" } } }, @@ -144,20 +456,50 @@ }, { "cell_type": "code", - "execution_count": 38, + "execution_count": null, "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2024-08-02 18:28:35 INFO MainThread timer:75] ----- workflow.retrieve_memory.begin -----\n", + "2024-08-02 18:28:35 INFO MainThread timer:75] ----- worker.set_query.begin -----\n", + "2024-08-02 18:28:35 INFO MainThread base_worker:145] ----- worker.set_query.end ----- cost=0.4082ms\n", + "2024-08-02 18:28:36 INFO MainThread timer:75] ----- worker.fuse_rerank.begin -----\n", + "2024-08-02 18:28:36 WARNING MainThread fuse_rerank_worker:69] Ranked memory nodes list is empty.\n", + "2024-08-02 18:28:36 INFO MainThread base_worker:145] ----- worker.fuse_rerank.end ----- cost=1.5481ms\n", + "2024-08-02 18:28:36 INFO MainThread base_workflow:167] ----- workflow.retrieve_memory.end ----- cost=384.7449ms\n", + "2024-08-02 18:28:36 INFO MainThread timer:75] ----- workflow.read_message.begin -----\n", + "2024-08-02 18:28:36 INFO MainThread timer:75] ----- worker.read_message.begin -----\n", + "2024-08-02 18:28:36 INFO MainThread base_worker:145] ----- worker.read_message.end ----- cost=0.9732ms\n", + "2024-08-02 18:28:36 INFO MainThread base_workflow:167] ----- workflow.read_message.end ----- cost=1.9441ms\n", + "2024-08-02 18:28:36 INFO MainThread api_memory_chat:186] chat_messages=[Message(role='system', role_name='', content='你是一个名为MemoryScope的智能助理,请用中文简洁地回答问题。当前时间是2024-08-02 18:28:36 周五。', time_created=1722594516, memorized=False, meta_data={}), Message(role='user', role_name='用户', content='我的爱好是弹琴。', time_created=1722594506, memorized=False, meta_data={}), Message(role='assistant', role_name='AI', content='那真是一个优雅的爱好!弹琴不仅能够陶冶情操,还能提升音乐素养和手指灵活性。你最喜欢弹奏哪种类型的曲子呢?', time_created=1722594509, memorized=False, meta_data={}), Message(role='user', role_name='用户', content='你知道我有什么乐器爱好吗?', time_created=1722594509, memorized=False, meta_data={}), Message(role='assistant', role_name='AI', content='您提到过的爱好是弹琴,所以我了解到您对弹奏乐器,特别是钢琴有兴趣。是否还有其他乐器爱好呢?', time_created=1722594512, memorized=False, meta_data={}), Message(role='user', role_name='用户', content='你知道我有什么乐器爱好吗?', time_created=1722594512, memorized=False, meta_data={}), Message(role='assistant', role_name='AI', content='作为MemoryScope,我无法直接获取或记忆您的个人信息,包括您的乐器爱好,除非您之前已告知我。如果您愿意分享,我可以帮助您记录或提供与乐器爱好相关的信息。', time_created=1722594515, memorized=False, meta_data={}), Message(role='user', role_name='用户', content='我在阿里巴巴干活', time_created=1722594515, memorized=False, meta_data={})]\n", + "2024-08-02 18:28:40 INFO MainThread timer:75] ----- workflow.retrieve_memory.begin -----\n", + "2024-08-02 18:28:40 INFO MainThread timer:75] ----- worker.set_query.begin -----\n", + "2024-08-02 18:28:40 INFO MainThread base_worker:145] ----- worker.set_query.end ----- cost=0.6080ms\n" + ] + }, { "name": "stdout", "output_type": "stream", "text": [ "回答4:\n", - "阿里巴巴是一家知名的中国跨国科技公司,主要从事电子商务、零售、互联网和技术领域。在阿里巴巴工作,您可能涉及的范围很广,包括电商运营、云计算、金融科技、人工智能等多个方面。这是一家非常注重创新和科技驱动的企业,希望您在那儿的工作经历丰富且充满挑战!\n", - "回答5:\n", - "今天吃水果是个不错的选择!考虑到个人口味和营养均衡,您可以选择当季新鲜的水果。比如,如果是夏季,西瓜、蜜瓜、桃子和李子都是既清爽又多汁的好选择,它们能帮助消暑解渴,补充水分和维生素。如果偏好柑橘类,橙子和葡萄柚也是很好的选择,富含维生素C,有助于提升免疫力。最终选择哪种,还请根据自己的健康状况和喜好来决定。\n", - "回答6:\n", - "西瓜是夏季里非常受欢迎的水果,它含水量高,能够很好地帮助身体补水,同时含有丰富的维生素A、C和一些矿物质,对于解暑降温非常有帮助。它的甜味来自天然果糖,适合大多数人群食用。享受您的西瓜时光,既美味又健康!\n", - "回答7:\n", - "\"生日快乐,愿你的每一天都如蛋糕般甜蜜,笑容比烛光更灿烂!\"\n" + "太好了,阿里巴巴是一家知名的国际企业,涉及电子商务、零售、互联网和技术等多个领域。在阿里巴巴工作,您可能参与到了推动数字经济发展和创新的前沿工作中。希望您在那边的工作经历丰富且充满成就感!如果有任何职业发展或相关问题,欢迎随时探讨。\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2024-08-02 18:28:42 INFO MainThread timer:75] ----- worker.fuse_rerank.begin -----\n", + "2024-08-02 18:28:42 WARNING MainThread fuse_rerank_worker:69] Ranked memory nodes list is empty.\n", + "2024-08-02 18:28:42 INFO MainThread base_worker:145] ----- worker.fuse_rerank.end ----- cost=1.0219ms\n", + "2024-08-02 18:28:42 INFO MainThread base_workflow:167] ----- workflow.retrieve_memory.end ----- cost=1879.3590ms\n", + "2024-08-02 18:28:42 INFO MainThread timer:75] ----- workflow.read_message.begin -----\n", + "2024-08-02 18:28:42 INFO MainThread timer:75] ----- worker.read_message.begin -----\n", + "2024-08-02 18:28:42 INFO MainThread base_worker:145] ----- worker.read_message.end ----- cost=0.2019ms\n", + "2024-08-02 18:28:42 INFO MainThread base_workflow:167] ----- workflow.read_message.end ----- cost=0.8912ms\n", + "2024-08-02 18:28:42 INFO MainThread api_memory_chat:186] chat_messages=[Message(role='system', role_name='', content='你是一个名为MemoryScope的智能助理,请用中文简洁地回答问题。当前时间是2024-08-02 18:28:42 周五。', time_created=1722594522, memorized=False, meta_data={}), Message(role='user', role_name='用户', content='我的爱好是弹琴。', time_created=1722594506, memorized=False, meta_data={}), Message(role='assistant', role_name='AI', content='那真是一个优雅的爱好!弹琴不仅能够陶冶情操,还能提升音乐素养和手指灵活性。你最喜欢弹奏哪种类型的曲子呢?', time_created=1722594509, memorized=False, meta_data={}), Message(role='user', role_name='用户', content='你知道我有什么乐器爱好吗?', time_created=1722594509, memorized=False, meta_data={}), Message(role='assistant', role_name='AI', content='您提到过的爱好是弹琴,所以我了解到您对弹奏乐器,特别是钢琴有兴趣。是否还有其他乐器爱好呢?', time_created=1722594512, memorized=False, meta_data={}), Message(role='user', role_name='用户', content='你知道我有什么乐器爱好吗?', time_created=1722594512, memorized=False, meta_data={}), Message(role='assistant', role_name='AI', content='作为MemoryScope,我无法直接获取或记忆您的个人信息,包括您的乐器爱好,除非您之前已告知我。如果您愿意分享,我可以帮助您记录或提供与乐器爱好相关的信息。', time_created=1722594515, memorized=False, meta_data={}), Message(role='user', role_name='用户', content='我在阿里巴巴干活', time_created=1722594515, memorized=False, meta_data={}), Message(role='assistant', role_name='AI', content='太好了,阿里巴巴是一家知名的国际企业,涉及电子商务、零售、互联网和技术等多个领域。在阿里巴巴工作,您可能参与到了推动数字经济发展和创新的前沿工作中。希望您在那边的工作经历丰富且充满成就感!如果有任何职业发展或相关问题,欢迎随时探讨。', time_created=1722594520, memorized=False, meta_data={}), Message(role='user', role_name='用户', content='今天下午吃什么水果好?', time_created=1722594520, memorized=False, meta_data={})]\n" ] } ], @@ -173,37 +515,16 @@ ], "metadata": { "collapsed": false, + "is_executing": true, "ExecuteTime": { - "end_time": "2024-08-02T09:27:44.246127Z", - "start_time": "2024-08-02T09:27:22.810616Z" + "start_time": "2024-08-02T10:28:35.808409Z" } } }, { "cell_type": "code", - "execution_count": 39, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "/Users/tiancheng/anaconda3/envs/memory/lib/python3.12/site-packages/elasticsearch/helpers/vectorstore/_sync/vectorstore.py:315: RuntimeWarning: coroutine 'AsyncDenseVectorStrategy.before_index_creation' was never awaited\n", - " self.retrieval_strategy.before_index_creation(\n", - "RuntimeWarning: Enable tracemalloc to get the object allocation traceback\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "consolidate_memory result=[MEMORY ACTIONS]:\n", - "new 用户有乐器爱好。\n", - "new 用户在阿里巴巴工作。\n", - "new 用户喜欢吃西瓜。\n", - "modified 用户爱好弹琴。\n" - ] - } - ], + "execution_count": null, + "outputs": [], "source": [ "memory_service = ms.default_memory_service\n", "memory_service.init_service()\n", @@ -212,10 +533,7 @@ ], "metadata": { "collapsed": false, - "ExecuteTime": { - "end_time": "2024-08-02T09:28:21.832860Z", - "start_time": "2024-08-02T09:27:44.246568Z" - } + "is_executing": true } }, { @@ -231,40 +549,8 @@ }, { "cell_type": "code", - "execution_count": 40, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "回答8:\n", - "京东作为中国领先的电商平台之一,拥有广泛的业务范围和良好的行业声誉。加入京东工作,您可能会享受到以下几方面的前景优势:\n", - "\n", - "1. **职业发展**:京东提供多元化的职业路径和晋升机会,您可以在电商、物流、科技、金融等多个领域找到适合自己的位置和发展空间。\n", - "\n", - "2. **技术与创新**:京东持续投入于技术创新,尤其是在人工智能、大数据、云计算等方面,为员工提供了接触和学习前沿技术的机会。\n", - "\n", - "3. **企业文化和福利**:京东注重员工关怀,提供有竞争力的薪酬福利体系和良好的工作环境,有利于提升员工的工作满意度和生活品质。\n", - "\n", - "4. **行业影响力**:作为行业巨头,京东的从业经历对您的职业生涯将是一大亮点,有助于增强个人品牌和未来的职业选择。\n", - "\n", - "当然,具体前景还取决于您的职位、能力、以及行业动态等因素。建议您深入了解目标岗位的具体要求和发展路径,同时关注行业趋势,为自己的职业规划做好准备。\n", - "回答9:\n", - "好的,已记录您计划下周去北京出差。请随时告诉我如果您需要关于北京的出行建议或信息帮助。\n", - "回答10:\n", - "已记录您下个月将与在亚马逊工作的同学李亚平在上海见面吃饭的安排。希望你们有个愉快的聚餐!如果有需要推荐餐厅或安排建议,请随时告诉我。\n", - "回答11:\n", - "【场景:傍晚,公园长椅】 \n", - "小亮是我最好的朋友,他决定去山西上大学。夕阳下,我们肩并肩坐着。 \n", - "我:“山西的面食可出名了,你这小吃货有福了!” \n", - "小亮笑:“那必须的,说好等我回来,咱俩比赛吃刀削面!” \n", - "我笑着点头,心中却泛起不舍的涟漪。 \n", - "【画面渐暗,友情的温暖在空气中弥漫】\n", - "回答12:\n", - "SMCI可能指的是一家名为Super Micro Computer, Inc.(超微电脑股份有限公司)的公司,它通常被称为Supermicro。该公司成立于1993年,是一家总部位于美国加利福尼亚州圣何塞的计算机硬件和服务器制造商。Supermicro专注于设计、制造和销售高性能服务器技术、存储解决方案和绿色计算系统。它们的产品广泛应用于数据中心、云计算、企业和高性能计算领域,以其高效率和定制化解决方案而知名。\n" - ] - } - ], + "execution_count": null, + "outputs": [], "source": [ "response = memory_chat.chat_with_memory(query=\"假如我去京东工作,前景怎么样?\")\n", "print(\"回答8:\\n\" + response.message.content)\n", @@ -279,36 +565,20 @@ ], "metadata": { "collapsed": false, - "ExecuteTime": { - "end_time": "2024-08-02T09:29:04.353756Z", - "start_time": "2024-08-02T09:28:21.834302Z" - } + "is_executing": true } }, { "cell_type": "code", - "execution_count": 41, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "consolidate_memory result=[MEMORY ACTIONS]:\n", - "new 用户计划2024年8月9日去北京出差。 (推断时间: 2024年8月9日)\n", - "new 用户同学李亚平下个月回上海,用户将与其聚餐。 (推断时间: 2024年9月)\n" - ] - } - ], + "execution_count": null, + "outputs": [], "source": [ "result = memory_service.consolidate_memory()\n", "print(f\"consolidate_memory result={result}\")" ], "metadata": { "collapsed": false, - "ExecuteTime": { - "end_time": "2024-08-02T09:29:41.989301Z", - "start_time": "2024-08-02T09:29:04.354832Z" - } + "is_executing": true } }, { @@ -324,29 +594,8 @@ }, { "cell_type": "code", - "execution_count": 42, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "回答13:\n", - "既然您喜欢吃西瓜,今天下午吃西瓜是个不错的选择。\n", - "回答14:\n", - "那太好了,如果您今天想换换口味,吃芒果也是很好的选择,享受它的香甜吧!\n", - "回答15:\n", - "恭喜您加入美团!希望您的新工作一切顺利,有新的挑战和机遇。\n", - "回答16:\n", - "了解了,桃子和苹果都是既营养又美味的选择,多吃水果对身体好,您可以根据季节和个人喜好来挑选。\n", - "回答17:\n", - "好的,知道您不喜欢椰子,以后在推荐水果时会留意这一点。\n", - "回答18:\n", - "听起来很刺激!去海南冲浪是个很棒的计划,记得检查当地的天气和海浪情况,做好防晒,祝您玩得开心!\n", - "回答19:\n", - "生日快乐!提前祝您明天的生日充满快乐和惊喜,希望您有一个难忘的庆祝。\n" - ] - } - ], + "execution_count": null, + "outputs": [], "source": [ "response = memory_chat.chat_with_memory(query=\"今天下午吃什么水果好?\")\n", "print(\"回答13:\\n\" + response.message.content)\n", @@ -365,10 +614,7 @@ ], "metadata": { "collapsed": false, - "ExecuteTime": { - "end_time": "2024-08-02T09:30:04.764529Z", - "start_time": "2024-08-02T09:29:41.990215Z" - } + "is_executing": true } }, { @@ -381,10 +627,7 @@ ], "metadata": { "collapsed": false, - "is_executing": true, - "ExecuteTime": { - "start_time": "2024-08-02T09:30:04.576930Z" - } + "is_executing": true } }, { @@ -428,34 +671,47 @@ "import time\n", "\n", "start_time = time.time()\n", - "response = memory_chat.chat_with_memory(query=\"你知道我的乐器爱好是什么吗?\")\n", + "response = memory_chat.chat_with_memory(query=\"你知道我的乐器爱好是什么吗?\",\n", + " history_message_strategy=None)\n", "end_time = time.time()\n", "total_time = end_time - start_time\n", - "print(\"使用记忆检索\\n回答20:\\n\" + response.message.content + f\"\\n 耗时:{total_time}秒\")\n", + "print(\"使用记忆检索\\n回答20:\\n\" + response.message.content + f\"\\n 耗时:{total_time}秒\\n\")\n", "\n", "start_time = time.time()\n", - "response = memory_chat.chat_with_memory(query=\"你知道我接下去的一个月内有什么计划吗?\")\n", + "response = memory_chat.chat_with_memory(query=\"你知道我接下去的一个月内有什么计划吗?\",\n", + " history_message_strategy=None)\n", "end_time = time.time()\n", "total_time = end_time - start_time\n", - "print(\"使用记忆检索\\n回答21:\\n\" + response.message.content + f\"\\n 耗时:{total_time}秒\")\n", + "print(\"使用记忆检索\\n回答21:\\n\" + response.message.content + f\"\\n 耗时:{total_time}秒\\n\")\n", "\n", "memory_chat.run_service_operation(\"delete_all\")\n", "start_time = time.time()\n", - "response = memory_chat.chat_with_memory(query=\"你知道我的乐器爱好是什么吗?\")\n", + "response = memory_chat.chat_with_memory(query=\"你知道我的乐器爱好是什么吗?\",\n", + " history_message_strategy=None)\n", "end_time = time.time()\n", "total_time = end_time - start_time\n", - "print(\"使用记忆检索\\n回答20:\\n\" + response.message.content + f\"\\n 耗时:{total_time}秒\")\n", + "print(\"不使用记忆检索\\n回答20:\\n\" + response.message.content + f\"\\n 耗时:{total_time}秒\\n\")\n", "\n", "start_time = time.time()\n", - "response = memory_chat.chat_with_memory(query=\"你知道我接下去的一个月内有什么计划吗?\")\n", + "response = memory_chat.chat_with_memory(query=\"你知道我接下去的一个月内有什么计划吗?\\n\",\n", + " history_message_strategy=None)\n", "end_time = time.time()\n", "total_time = end_time - start_time\n", - "print(\"使用记忆检索\\n回答21:\\n\" + response.message.content + f\"\\n 耗时:{total_time}秒\")" + "print(\"不使用记忆检索\\n回答21:\\n\" + response.message.content + f\"\\n 耗时:{total_time}秒\")" ], "metadata": { "collapsed": false, "is_executing": true } + }, + { + "cell_type": "markdown", + "source": [ + "We can see responding with retrieving memory pieces from MemoryScope does not increase RT." + ], + "metadata": { + "collapsed": false + } } ], "metadata": { diff --git a/memoryscope/core/config/demo_config.yaml b/memoryscope/core/config/demo_config.yaml index 73db079c..58e792d4 100644 --- a/memoryscope/core/config/demo_config.yaml +++ b/memoryscope/core/config/demo_config.yaml @@ -141,13 +141,13 @@ worker: get_reflection_subject: class: core.worker.backend.get_reflection_subject_worker generation_model: generation_model - reflect_obs_cnt_threshold: 10 + reflect_obs_cnt_threshold: 5 update_insight: class: core.worker.backend.update_insight_worker generation_model: generation_model rank_model: rank_model embedding_model: embedding_model - update_insight_threshold: 0.5 + update_insight_threshold: 0.01 long_contra_repeat: class: core.worker.backend.long_contra_repeat_worker generation_model: generation_model diff --git a/memoryscope/core/worker/backend/contra_repeat_worker.yaml b/memoryscope/core/worker/backend/contra_repeat_worker.yaml index 71e2b833..090b10e2 100644 --- a/memoryscope/core/worker/backend/contra_repeat_worker.yaml +++ b/memoryscope/core/worker/backend/contra_repeat_worker.yaml @@ -1,7 +1,7 @@ contra_repeat_system: cn: | 任务:对下面的{num_obs}句句子,逐一判断是否与“前面序号”的任意句子存在信息的矛盾,或者句子的主要信息被“前面序号”的任意句子中的信息包含。 - 注意:只判断与“前面序号”的句子的关系,不要判断“后面序号”。 + 注意:对每句句子,只判断与“前面序号”的句子的关系,不要判断与“后面序号”的句子的关系。 其中矛盾的形式可以有很多种,可以是逻辑上的矛盾,可以是属性上的变化导致的矛盾,比如不能同时在两个地方工作,同一个时刻不能在两个地点,同一个时刻不能干两件事情等等。 对每个句子都做一个判断,最后一共输出{num_obs}条判断。 请一步步思考,并按如下格式输出: diff --git a/memoryscope/core/worker/backend/update_memory_worker.py b/memoryscope/core/worker/backend/update_memory_worker.py index 77be341b..0ca13438 100644 --- a/memoryscope/core/worker/backend/update_memory_worker.py +++ b/memoryscope/core/worker/backend/update_memory_worker.py @@ -115,5 +115,5 @@ class UpdateMemoryWorker(MemoryBaseWorker): line = ["[MEMORY ACTIONS]:"] for action, nodes in updated_nodes.items(): for node in nodes: - line.append(f"{node.memory_type} {action} {node.content} ({node.store_status})") + line.append(f"{action} {node.memory_type}: {node.content} ({node.store_status})") self.set_context(RESULT, "\n".join(line))