diff --git a/Dockerfile b/Dockerfile index 593e963b..19b6171a 100644 --- a/Dockerfile +++ b/Dockerfile @@ -14,7 +14,6 @@ # sudo docker run -it --rm --net=host memoryscope - FROM python:3.11 # (Not necessary) Change pip source @@ -39,13 +38,17 @@ USER root RUN chown -R elastic_search_user:elastic_search_user /home/elastic_search_user/ WORKDIR /memory_scope_project +# (Not necessary) Install the majority of deps, using docker build cache to accelerate future building +COPY requirements.txt ./ +RUN pip3 install -r requirements.txt + # Enter working dir WORKDIR /memory_scope_project COPY . . # RUN pip3 install poetry -RUN pip install -r requirements.txt # RUN poetry install +RUN pip3 install -r requirements.txt # Launch! # CMD ["bash"] -CMD ["bash", "examples/docker/entry_point.sh"] \ No newline at end of file +CMD ["bash", "examples/docker/entrypoint.sh"] \ No newline at end of file diff --git a/examples/docker/docker_config.yaml b/examples/docker/docker_config.yaml deleted file mode 100644 index e69de29b..00000000 diff --git a/examples/docker/entry_point.sh b/examples/docker/entrypoint.sh similarity index 84% rename from examples/docker/entry_point.sh rename to examples/docker/entrypoint.sh index e75e0619..c60739e6 100644 --- a/examples/docker/entry_point.sh +++ b/examples/docker/entrypoint.sh @@ -1,2 +1,2 @@ sh examples/docker/run_elastic_search.sh -python quick-start-demo.py --config_path=memoryscope/core/config/demo_config.yaml \ No newline at end of file +python quick-start-demo.py --config_path=memoryscope/core/config/demo_config_zh.yaml \ No newline at end of file diff --git a/examples/docker/run_elastic_search.sh b/examples/docker/run_elastic_search.sh index 98b55aa3..0ee5c0cb 100644 --- a/examples/docker/run_elastic_search.sh +++ b/examples/docker/run_elastic_search.sh @@ -1 +1 @@ -su - elastic_search_user -c "/home/elastic_search_user/elastic_search/elasticsearch-8.15.0/bin/elasticsearch -d" \ No newline at end of file +su - elastic_search_user -c "/home/elastic_search_user/elastic_search/elasticsearch-8.15.0/bin/elasticsearch -E xpack.security.enabled=false -E discovery.type=single-node -E xpack.license.self_generated.type=trial -d" diff --git a/memoryscope/core/config/demo_config.yaml b/memoryscope/core/config/demo_config.yaml index 497690ed..28b25cac 100644 --- a/memoryscope/core/config/demo_config.yaml +++ b/memoryscope/core/config/demo_config.yaml @@ -157,14 +157,14 @@ worker: model: generation_model: class: core.models.llama_index_generation_model - module_name: dashscope_generation - model_name: qwen-max + module_name: openai_generation + model_name: gpt-4o max_tokens: 2000 temperature: 0.01 embedding_model: class: core.models.llama_index_embedding_model - module_name: dashscope_embedding - model_name: text-embedding-v2 + module_name: openai_embedding + model_name: text-embedding-3-small rank_model: class: core.models.llama_index_rank_model module_name: dashscope_rank diff --git a/memoryscope/core/config/demo_config_zh.yaml b/memoryscope/core/config/demo_config_zh.yaml new file mode 100644 index 00000000..0923b90a --- /dev/null +++ b/memoryscope/core/config/demo_config_zh.yaml @@ -0,0 +1,182 @@ +global: + language: zh + thread_pool_max_workers: 5 + logger_name: memoryscope + logger_name_time_suffix: "%Y%m%d_%H%M%S" + logger_to_screen: false + enable_ranker: true + enable_today_contra_repeat: true + enable_long_contra_repeat: false + output_memory_max_count: 20 + +memory_chat: + cli_memory_chat: + class: core.chat.cli_memory_chat + memory_service: memoryscope_service + generation_model: generation_model + stream: true + +memory_service: + memoryscope_service: + class: core.service.memory_scope_service + human_name: user + assistant_name: AI + memory_operations: + read_message: + class: core.operation.frontend_operation + workflow: read_message + description: "read short memory" + + retrieve_memory: + class: core.operation.frontend_operation + workflow: set_query,[extract_time|retrieve_obs_ins,semantic_rank],fuse_rerank + description: "retrieve long-term memory" + + list_memory: + class: core.operation.frontend_operation + workflow: set_query,retrieve_top_memory,print_memory + description: "read all long-term memory of the user, use `refresh_time=5` to refresh screen every 5 seconds." + + delete_memory: + class: core.operation.frontend_operation + workflow: set_query,retrieve_all_memory,delete_memory + description: "delete a single long-term memory" + + delete_all: + class: core.operation.frontend_operation + workflow: set_query,retrieve_all_memory,delete_all + description: "delete all long-term memory" + + add_memory: + class: core.operation.frontend_operation + workflow: add_memory + description: "add a single observation" + + consolidate_memory: + class: core.operation.consolidate_memory_op + workflow: info_filter,[get_observation|get_observation_with_time|load_today_memory],contra_repeat,store_memory + description: "summary user's observation memory, run backend." + interval_time: 1 + + reflect_and_reconsolidate: + class: core.operation.backend_operation + workflow: load_obs_and_insight,get_reflection_subject,update_insight,long_contra_repeat,store_memory + description: "summary user's insight memory, run backend." + interval_time: 15 + +worker: + dummy: + class: core.worker.dummy_worker + generation_model: generation_model + embedding_model: embedding_model + rank_model: rank_model + read_message: + class: core.worker.frontend.read_message_worker + set_query: + class: core.worker.frontend.set_query_worker + retrieve_obs_ins: + class: core.worker.frontend.retrieve_memory_worker + retrieve_obs_top_k: 100 + retrieve_ins_top_k: 100 + extract_time: + class: core.worker.frontend.extract_time_worker + generation_model: generation_model + semantic_rank: + class: core.worker.frontend.semantic_rank_worker + rank_model: rank_model + fuse_rerank: + class: core.worker.frontend.fuse_rerank_worker + fuse_score_threshold: 0.01 + fuse_ratio_dict: + conversation: 0.5 + observation: 1 + obs_customized: 1.2 + insight: 2.0 + fuse_time_ratio: 2.0 + retrieve_top_memory: + class: core.worker.frontend.retrieve_memory_worker + retrieve_obs_top_k: 100 + retrieve_ins_top_k: 100 + retrieve_expired_top_k: 100 + print_memory: + class: core.worker.frontend.print_memory_worker + retrieve_all_memory: + class: core.worker.frontend.retrieve_memory_worker + retrieve_obs_top_k: 1000 + retrieve_ins_top_k: 1000 + retrieve_expired_top_k: 1000 + delete_memory: + class: core.worker.backend.update_memory_worker + method: delete_memory + delete_all: + class: core.worker.backend.update_memory_worker + method: delete_all + add_memory: + class: core.worker.backend.update_memory_worker + method: from_query + info_filter: + class: core.worker.backend.info_filter_worker + generation_model: generation_model + load_today_memory: + class: core.worker.backend.load_memory_worker + retrieve_today_top_k: 100 + get_observation: + class: core.worker.backend.get_observation_worker + generation_model: generation_model + get_observation_with_time: + class: core.worker.backend.get_observation_with_time_worker + generation_model: generation_model + contra_repeat: + class: core.worker.backend.contra_repeat_worker + generation_model: generation_model + store_memory: + class: core.worker.backend.update_memory_worker + method: from_memory_key + memory_key: all + load_obs_and_insight: + class: core.worker.backend.load_memory_worker + retrieve_not_reflected_top_k: 100 + retrieve_not_updated_top_k: 100 + retrieve_insight_top_k: 100 + get_reflection_subject: + class: core.worker.backend.get_reflection_subject_worker + generation_model: generation_model + 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.01 + enable_parallel: false + long_contra_repeat: + class: core.worker.backend.long_contra_repeat_worker + generation_model: generation_model + long_contra_repeat_threshold: 0.5 + +model: + generation_model: + class: core.models.llama_index_generation_model + module_name: dashscope_generation + model_name: qwen-max + max_tokens: 2000 + temperature: 0.01 + embedding_model: + class: core.models.llama_index_embedding_model + module_name: dashscope_embedding + model_name: text-embedding-v2 + rank_model: + class: core.models.llama_index_rank_model + module_name: dashscope_rank + model_name: gte-rerank + top_n: 500 + +memory_store: + class: core.storage.llama_index_es_memory_store + embedding_model: embedding_model + index_name: memory_index + es_url: http://localhost:9200 + retrieve_mode: dense + +monitor: + class: core.storage.dummy_monitor \ No newline at end of file diff --git a/quick-start-demo.py b/quick-start-demo.py index 0476c4a9..91d1dd07 100644 --- a/quick-start-demo.py +++ b/quick-start-demo.py @@ -6,7 +6,7 @@ if os.environ.get('DASHSCOPE_API_KEY', None) is None \ input( '\n\n' 'Missing api key from dashscope ( `https://help.aliyun.com/zh/model-studio/developer-reference/get-api-key` ), ' - 'please input key and press Enter:' + 'please provide DASHSCOPE_API_KEY and press Enter:' ) from memoryscope import cli