ReMe/examples/api/example_usages.ipynb
2024-08-02 18:32:58 +08:00

738 lines
42 KiB
Text
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

{
"cells": [
{
"cell_type": "markdown",
"source": [
"# Example usages of **chat** and **service** interfaces\n",
"This notebook shows simple usages of MemoryScope's **chat** and **service** interfaces, along with its main features.\n",
"\n",
"To run this notebook, follow the **Installation** guidelines in Readme, and start the Docker image.\n"
],
"metadata": {
"collapsed": false
}
},
{
"cell_type": "markdown",
"source": [
"## Initiate a MemoryScope instance\n",
"First, we need to specify a configuration and initiate a MemoryScope instance."
],
"metadata": {
"collapsed": false
}
},
{
"cell_type": "code",
"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",
"from memoryscope import MemoryScope, Arguments\n",
"arguments = Arguments(\n",
" language=\"cn\",\n",
" human_name=\"用户\",\n",
" assistant_name=\"AI\",\n",
" logger_to_screen=True,\n",
" memory_chat_class=\"api_memory_chat\",\n",
" generation_backend=\"dashscope_generation\",\n",
" generation_model=\"qwen2-72b-instruct\",\n",
" embedding_backend=\"dashscope_embedding\",\n",
" embedding_model=\"text-embedding-v2\",\n",
" rank_backend=\"dashscope_rank\",\n",
" rank_model=\"gte-rerank\",\n",
" enable_ranker=False,\n",
" worker_params={\"get_reflection_subject\": {\"reflect_num_questions\": 3}}\n",
")\n",
"\n",
"ms = MemoryScope(arguments=arguments)\n"
],
"metadata": {
"collapsed": false,
"ExecuteTime": {
"end_time": "2024-08-02T10:28:26.547739Z",
"start_time": "2024-08-02T10:28:24.509118Z"
}
}
},
{
"cell_type": "markdown",
"source": [
"## Chat without memory\n",
"ms comes with a default **chat** interface, so it's very easy to start chatting, just as what you'll do with any LLM chatbot."
],
"metadata": {
"collapsed": false
}
},
{
"cell_type": "code",
"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",
"text": [
"回答1\n",
"那真是一个优雅的爱好!弹琴不仅能够陶冶情操,还能提升音乐素养和手指灵活性。你最喜欢弹奏哪种类型的曲子呢?\n"
]
}
],
"source": [
"memory_chat = ms.default_memory_chat\n",
"memory_chat.run_service_operation(\"delete_all\")\n",
"response = memory_chat.chat_with_memory(query=\"我的爱好是弹琴。\")\n",
"print(\"回答1\\n\" + response.message.content)"
],
"metadata": {
"collapsed": false,
"ExecuteTime": {
"end_time": "2024-08-02T10:28:29.660299Z",
"start_time": "2024-08-02T10:28:26.549127Z"
}
}
},
{
"cell_type": "markdown",
"source": [
"You can choose to chat with or without multi-round conversation contexts. However, since *Memory Consolidation* has not been called, there's no memory pieces in the system yet."
],
"metadata": {
"collapsed": false
}
},
{
"cell_type": "code",
"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"
]
},
{
"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",
"作为MemoryScope我无法直接获取或记忆您的个人信息包括您的乐器爱好除非您之前已告知我。如果您愿意分享我可以帮助您记录或提供与乐器爱好相关的信息。\n"
]
}
],
"source": [
"response = memory_chat.chat_with_memory(query=\"你知道我有什么乐器爱好吗?\")\n",
"print(\"回答2\\n\" + response.message.content)\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-02T10:28:35.807252Z",
"start_time": "2024-08-02T10:28:29.659682Z"
}
}
},
{
"cell_type": "markdown",
"source": [
"## Memory Consolidation\n",
"Now, we do a bit more chatting and try out **Memory Consolidation**."
],
"metadata": {
"collapsed": false
}
},
{
"cell_type": "code",
"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"
]
},
{
"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"
]
}
],
"source": [
"response = memory_chat.chat_with_memory(query=\"我在阿里巴巴干活\")\n",
"print(\"回答4\\n\" + response.message.content)\n",
"response = memory_chat.chat_with_memory(query=\"今天下午吃什么水果好?\")\n",
"print(\"回答5\\n\" + response.message.content)\n",
"response = memory_chat.chat_with_memory(query=\"我喜欢吃西瓜。\")\n",
"print(\"回答6\\n\" + response.message.content)\n",
"response = memory_chat.chat_with_memory(query=\"帮我写一句给朋友的生日祝福语,简短一点。\")\n",
"print(\"回答7\\n\" + response.message.content)"
],
"metadata": {
"collapsed": false,
"is_executing": true,
"ExecuteTime": {
"start_time": "2024-08-02T10:28:35.808409Z"
}
}
},
{
"cell_type": "code",
"execution_count": null,
"outputs": [],
"source": [
"memory_service = ms.default_memory_service\n",
"memory_service.init_service()\n",
"result = memory_service.consolidate_memory()\n",
"print(f\"consolidate_memory result={result}\")"
],
"metadata": {
"collapsed": false,
"is_executing": true
}
},
{
"cell_type": "markdown",
"source": [
"**Memory Consolidation** extracted 3 *observations* out of the 7 chat messages from the user, with the uninformative ones being filtered out.\n",
"\n",
"We try more cases to test its time awareness and the ability to filter out fictitious contents from the user."
],
"metadata": {
"collapsed": false
}
},
{
"cell_type": "code",
"execution_count": null,
"outputs": [],
"source": [
"response = memory_chat.chat_with_memory(query=\"假如我去京东工作,前景怎么样?\")\n",
"print(\"回答8\\n\" + response.message.content)\n",
"response = memory_chat.chat_with_memory(query=\"记一下,下周我准备去北京出差\")\n",
"print(\"回答9\\n\" + response.message.content)\n",
"response = memory_chat.chat_with_memory(query=\"我同学李亚平现在在亚马逊工作,他下个月回上海,我要和他吃个饭\")\n",
"print(\"回答10\\n\" + response.message.content)\n",
"response = memory_chat.chat_with_memory(query=\"小亮是我最好的朋友他决定去山西上大学。以这个为开头写一个80字的微剧本。\")\n",
"print(\"回答11\\n\" + response.message.content)\n",
"response = memory_chat.chat_with_memory(query=\"SMCI是什么公司做什么的\")\n",
"print(\"回答12\\n\" + response.message.content)"
],
"metadata": {
"collapsed": false,
"is_executing": true
}
},
{
"cell_type": "code",
"execution_count": null,
"outputs": [],
"source": [
"result = memory_service.consolidate_memory()\n",
"print(f\"consolidate_memory result={result}\")"
],
"metadata": {
"collapsed": false,
"is_executing": true
}
},
{
"cell_type": "markdown",
"source": [
"We can see **Memory Consolidation** successfully filtered out fictitious contents, and shows good time sensitivity.\n",
"\n",
"We try more cases to test its resolution of conflicting contents."
],
"metadata": {
"collapsed": false
}
},
{
"cell_type": "code",
"execution_count": null,
"outputs": [],
"source": [
"response = memory_chat.chat_with_memory(query=\"今天下午吃什么水果好?\")\n",
"print(\"回答13\\n\" + response.message.content)\n",
"response = memory_chat.chat_with_memory(query=\"西瓜确实不错,但是我也喜欢吃芒果。我今天想吃芒果。\")\n",
"print(\"回答14\\n\" + response.message.content)\n",
"response = memory_chat.chat_with_memory(query=\"我最近跳槽去了美团。\")\n",
"print(\"回答15\\n\" + response.message.content)\n",
"response = memory_chat.chat_with_memory(query=\"我还喜欢吃桃子和苹果。\")\n",
"print(\"回答16\\n\" + response.message.content)\n",
"response = memory_chat.chat_with_memory(query=\"我不喜欢吃椰子。\")\n",
"print(\"回答17\\n\" + response.message.content)\n",
"response = memory_chat.chat_with_memory(query=\"我准备下个月去海南冲浪。\")\n",
"print(\"回答18\\n\" + response.message.content)\n",
"response = memory_chat.chat_with_memory(query=\"明天是我生日。\")\n",
"print(\"回答19\\n\" + response.message.content)"
],
"metadata": {
"collapsed": false,
"is_executing": true
}
},
{
"cell_type": "code",
"execution_count": null,
"outputs": [],
"source": [
"result = memory_service.consolidate_memory()\n",
"print(f\"consolidate_memory result={result}\")"
],
"metadata": {
"collapsed": false,
"is_executing": true
}
},
{
"cell_type": "markdown",
"source": [
"## Reflection and Re-Consolidation\n",
"Now, we have accumulated enough new *observations* in the system, so we can call **Reflection and Re-Consolidation**, let's see what will it get."
],
"metadata": {
"collapsed": false
}
},
{
"cell_type": "code",
"execution_count": null,
"outputs": [],
"source": [
"result = memory_service.reflect_and_reconsolidate()\n",
"print(f\"consolidate_memory result={result}\")"
],
"metadata": {
"collapsed": false,
"is_executing": true
}
},
{
"cell_type": "markdown",
"source": [
"## Low response-time (RT) for the user\n",
"Here we test the RT of MemoryScope system for the user. Specifically, we test the difference of RT when responding with and without retrieving memory pieces from the system."
],
"metadata": {
"collapsed": false
}
},
{
"cell_type": "code",
"execution_count": null,
"outputs": [],
"source": [
"import time\n",
"\n",
"start_time = time.time()\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\")\n",
"\n",
"start_time = time.time()\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\")\n",
"\n",
"memory_chat.run_service_operation(\"delete_all\")\n",
"start_time = time.time()\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\")\n",
"\n",
"start_time = time.time()\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}秒\")"
],
"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": {
"kernelspec": {
"display_name": "Python 3",
"language": "python",
"name": "python3"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 2
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython2",
"version": "2.7.6"
}
},
"nbformat": 4,
"nbformat_minor": 0
}