From 9ef4edfb81377de407b4a3a125ed7c855351b34d Mon Sep 17 00:00:00 2001 From: "jinli.yl" Date: Wed, 3 Jul 2024 15:43:29 +0800 Subject: [PATCH] [dev] del old format prompt --- config/demo_config.yaml | 4 - config/prompts/__init__.py | 0 config/prompts/contra_repeat_prompt.py | 140 ------------------ config/prompts/get_insight_prompt.py | 8 - config/prompts/get_observation_prompt.py | 86 ----------- .../get_observation_with_time_prompt.py | 93 ------------ config/prompts/get_reflect_subject_prompt.py | 107 ------------- config/prompts/get_reflection_prompt.py | 8 - config/prompts/info_filter_worker.yaml | 85 ----------- config/prompts/long_contra_repeat_prompt.py | 8 - config/prompts/update_insight_prompt.py | 71 --------- config/prompts/update_profile_prompt.py | 132 ----------------- memory_scope/chat/cli_memory_chat.py | 4 - .../worker/summary/get_reflection_prompt.yaml | 98 +++++++++++- .../worker/summary/get_reflection_worker.py | 97 +++++++----- .../worker/summary/load_memory_worker.py | 68 --------- .../worker/summary/update_insight_worker.py | 12 +- .../worker/write/get_observation_worker.py | 3 +- memory_scope/scheme/memory_node.py | 4 + 19 files changed, 156 insertions(+), 872 deletions(-) delete mode 100644 config/prompts/__init__.py delete mode 100644 config/prompts/contra_repeat_prompt.py delete mode 100644 config/prompts/get_insight_prompt.py delete mode 100644 config/prompts/get_observation_prompt.py delete mode 100644 config/prompts/get_observation_with_time_prompt.py delete mode 100644 config/prompts/get_reflect_subject_prompt.py delete mode 100644 config/prompts/get_reflection_prompt.py delete mode 100644 config/prompts/info_filter_worker.yaml delete mode 100644 config/prompts/long_contra_repeat_prompt.py delete mode 100644 config/prompts/update_insight_prompt.py delete mode 100644 config/prompts/update_profile_prompt.py delete mode 100644 memory_scope/memory/worker/summary/load_memory_worker.py diff --git a/config/demo_config.yaml b/config/demo_config.yaml index d4a18a65..3cca4457 100644 --- a/config/demo_config.yaml +++ b/config/demo_config.yaml @@ -7,10 +7,6 @@ memory_chat: memory_service: memory_chat_service generation_model: dashscope_generation human_name: 用户 - human_profile_setting: - - name - - gender - - residential location assistant_name: AI memory_service: memory_chat_service: diff --git a/config/prompts/__init__.py b/config/prompts/__init__.py deleted file mode 100644 index e69de29b..00000000 diff --git a/config/prompts/contra_repeat_prompt.py b/config/prompts/contra_repeat_prompt.py deleted file mode 100644 index 4febbeda..00000000 --- a/config/prompts/contra_repeat_prompt.py +++ /dev/null @@ -1,140 +0,0 @@ -from memory_scope.enumeration.language_enum import LanguageEnum - - -OLD_CONTRA_REPEAT_SYSTEM_PROMPT = { - LanguageEnum.CN: """ -对下面的{num_obs}句句子,逐一判断是否与“前面序号”的任意句子存在信息的矛盾,或者句子的主要信息被“前面序号”的任意句子中的信息包含。只判断与“前面序号”的句子的关系。 -对每个句子都做一个判断,最后一共输出{num_obs}行判断。 -请一步步思考,并按如下格式输出: -思考:思考的依据和过程,30字以内。 -判断:<句子序号> <矛盾,被包含,无>,一定加<> -""", - LanguageEnum.EN: """ -""" -} - -OLD_CONTRA_REPEAT_FEW_SHOT_PROMPT = { - LanguageEnum.CN: """ -示例1 -句子: -1 用户经常失眠,对安眠药的效果感兴趣,暗示可能考虑使用。 -2 用户经常失眠,寻求缓解方法。 -3 陈伟业是用户的领导 -4 陈伟业是用户的领导 -5 陈伟业是用户的领导,是银行分行行长 - -思考:第1句不会存在与前面序号句子的矛盾或者完全重复。 -判断:<1> <无> -思考:第2句中所有信息都被前面序号中第1句的信息完全包含。 -判断:<2> <被包含> -思考:第3句信息没有在前面序号句子中出现 -判断:<3> <无> -思考:第4句与前面序号中第3句的信息完全重复,即被完全包含。 -判断:<4> <被包含> -思考:第5句中陈伟业是用户的领导的信息被前面序号中第3句的信息包含,但新增了陈伟业是银行分行行长的信息,故不是被完全包含。 -判断:<5> <无> - -示例2 -句子: -1 用户的孩子成绩不太好。 -2 用户的孩子在学校经常逃课。 -3 用户的父亲生日在2024年6月2日,用户打算准备礼物。 -4 用户的父亲生日在2024年5月1日。 -5 用户很喜欢和同班同学打篮球。 -6 用户喜欢打篮球。 - -思考:第1句不会存在与前面序号句子的矛盾或者完全重复。 -判断:<1> <无> -思考:第2句与前面序号句子既不矛盾也不重复。 -判断:<2> <无> -思考:第3句与前面序号句子既不矛盾也不重复。 -判断:<3> <无> -思考:第4句关于用户父亲生日的日期信息与前面序号句子第3句矛盾了。 -判断:<4> <矛盾> -思考:第5句与前面序号句子既不矛盾也不重复。 -判断:<5> <无> -思考:第6句中所有信息都被前面序号中第5句的信息完全包含。 -判断:<2> <被包含> -""", - LanguageEnum.EN: """ -""" -} - -OLD_CONTRA_REPEAT_USER_QUERY_PROMPT = { - LanguageEnum.CN: """ -句子: -{user_query} -""", - LanguageEnum.EN: """ -""" -} - -NEW_CONTRA_REPEAT_SYSTEM_PROMPT = { - LanguageEnum.CN: """ -对下面的{num_obs}句句子,逐一判断是否与“前面序号”的任意句子存在信息的矛盾,或者句子的主要信息被“前面序号”的任意句子中的信息包含。只判断与“前面序号”的句子的关系。 -如果句子与前面序号的句子存在矛盾,则以前面序号的句子中的信息为准,修改句子中矛盾的部分。 -请一步步思考,并按如下格式输出: -思考:思考的依据和过程,30字以内。 -判断:<句子序号> <矛盾,被包含,无> <修改后的内容>,一定加<> -""", - LanguageEnum.EN: """ -""" -} - -NEW_CONTRA_REPEAT_FEW_SHOT_PROMPT = { - LanguageEnum.CN: """ -示例1 -句子: -1 用户经常失眠,对安眠药的效果感兴趣,暗示可能考虑使用。 -2 用户经常失眠,寻求缓解方法。 -3 陈伟业是用户的领导 -4 陈伟业是用户的领导 -5 陈伟业是用户的领导,是银行分行行长 - -思考:第1句不会存在与前面序号句子的矛盾或者完全重复。 -判断:<1> <无> <> -思考:第2句中所有信息都被前面序号中第1句的信息完全包含。 -判断:<2> <被包含> <> -思考:第3句信息没有在前面序号句子中出现 -判断:<3> <无> <> -思考:第4句与前面序号中第3句的信息完全重复,即被完全包含。 -判断:<4> <被包含> <> -思考:第5句中陈伟业是用户的领导的信息被前面序号中第3句的信息包含,但新增了陈伟业是银行分行行长的信息,故不是被完全包含。 -判断:<5> <无> <> - -示例2 -句子: -1 用户的孩子成绩不太好。 -2 用户的孩子在学校经常逃课。 -3 用户的父亲生日在2024年6月2日,用户打算准备礼物。 -4 用户的父亲生日在2024年5月1日。 -5 用户很喜欢和同班同学打篮球。 -6 用户喜欢打篮球。 - -思考:第1句不会存在与前面序号句子的矛盾或者完全重复。 -判断:<1> <无> <> -思考:第2句与前面序号句子既不矛盾也不重复。 -判断:<2> <无> <> -思考:第3句与前面序号句子既不矛盾也不重复。 -判断:<3> <无> <> -思考:第4句关于用户父亲生日的日期信息与前面序号句子第3句矛盾了。 -判断:<4> <矛盾> <用户的父亲生日在2024年6月2日> -思考:第5句与前面序号句子既不矛盾也不重复。 -判断:<5> <无> <> -思考:第6句中所有信息都被前面序号中第5句的信息完全包含。 -判断:<2> <被包含> <> -""", - LanguageEnum.EN: """ -""" -} - -NEW_CONTRA_REPEAT_USER_QUERY_PROMPT = { - LanguageEnum.CN: """ -句子: -{user_query} -""", - LanguageEnum.EN: """ -""" -} - - diff --git a/config/prompts/get_insight_prompt.py b/config/prompts/get_insight_prompt.py deleted file mode 100644 index 592c9fe2..00000000 --- a/config/prompts/get_insight_prompt.py +++ /dev/null @@ -1,8 +0,0 @@ -from ..enumeration.language_enum import LanguageEnum - - -GET_INSIGHT_SYSTEM_PROMPT = {} - -GET_INSIGHT_FEW_SHOT_PROMPT = {} - -GET_INSIGHT_USER_QUERY_PROMPT = {} diff --git a/config/prompts/get_observation_prompt.py b/config/prompts/get_observation_prompt.py deleted file mode 100644 index 6d49ee28..00000000 --- a/config/prompts/get_observation_prompt.py +++ /dev/null @@ -1,86 +0,0 @@ -from memory_scope.enumeration.language_enum import LanguageEnum - - -GET_OBSERVATION_SYSTEM_PROMPT = { - LanguageEnum.CN: """ -任务:从下面的{num_obs}句用户句子中依次提取出关于用户的重要信息,与相应的关键词。最多提取{num_obs}条信息。对每一句句子,只提取非常明确的信息和进行非常确定的推断,不要进行任何猜测。 -不要重复提取信息,如果句子中的所有信息与前面已经提取出的信息重复了则回答“重复“,如果没有重要信息则回答“无”。注意区分,对于句子中用户假设的信息或者用户虚构的内容,不要提取信息。 -对每个句子都做一次信息提取,最后一共输出{num_obs}行信息。 -请一定要按如下格式依次输出,最后的结果一定要加<>: -思考:思考的依据和过程,50字以内。 -信息:<句子序号> <> <明确的重要信息或“重复”或”无“> <关键词> -""", - LanguageEnum.EN: """ -""" -} - -GET_OBSERVATION_FEW_SHOT_PROMPT = { - LanguageEnum.CN: """ -示例1: -用户句子: -1 用户:我现在处境很糟,没有工作,负债几万,怎么办 -2 用户:有人说兴趣是最好的老师,也建议兴趣和职业联系起来,但我发现喜欢打篮球的人很多,但靠打篮球成职业的稀少,赚钱的更少,此外,怎么分辨兴趣和喜欢 -3 用户:我现在处境很糟,没有工作,负债几万,怎么办 -4 用户:我是一个刚毕业的学生,对社会,行业不了解,给我介绍一下社会系统和行业格局 -思考:从第1句可以得知用户现在没有工作,负债几万,这是关于用户工作与经济状况的重要信息。 -信息:<1> <> <用户当前无工作且负债几万> <无工作, 负债几万> -思考:第2句是用户对他人观点的讨论和疑问,没有明确提及用户个人信息。 -信息:<2> <> <无> <> -思考:第3句含有的信息与第1句重复了。 -信息:<3> <> <重复> <> -思考:从第4句可以得知用户是一个刚毕业的学生,这是关于用户身份背景状况的重要信息。其余信息重要性不足。 -信息:<4> <> <用户是一名刚毕业的学生。> <刚毕业, 学生> - -示例2: -用户句子: -1 用户:帮我写一段给同事张三女儿三岁生日的祝福语。 -2 用户:能给我整理一张如何使用大模型的技巧列表吗,要求内容尽量精简。 -3 用户:两个坏消息,我打羽毛球把拍子打断线了。。。然后我去我朋友家撸猫,结果我猫毛过敏,今天疯狂打喷嚏。。。 -4 用户:公元1400年至1550年中国历史大事表。 -5 用户:谢啦。我中午在公司附近吃,帮我推荐一家阿里巴巴徐汇滨江园区附近的餐厅吧。 -思考:从第1句可以得知张三是用户的同事,这是关于用户的人际关系的重要信息。其余信息重要性不足。 -信息:<1> <> <张三是用户的同事。> <张三, 同事> -思考:第2句是用户提出的要求,没有明确提及用户个人信息。 -信息:<2> <> <无> <> -思考:从第3句可以得知用户前天打羽毛球时把球拍打断了线,但这不是重要的信息。还可以得知用户对猫毛过敏,这是关于用户的健康的重要信息。 -信息:<3> <> <用户对猫毛过敏。> <猫毛, 过敏> -思考:从第4句是用户提出的要求,没有明确提及用户个人信息。 -信息:<4> <> <无> <> -思考:从第5句可以得知用户在阿里巴巴徐汇滨江园区工作,这是关于用户的工作地点的重要信息。 -信息:<5> <> <用户在阿里巴巴徐汇滨江园区工作。> <阿里巴巴, 徐汇滨江园区, 工作> - -示例3: -用户句子: -1 用户:我想买辆新能源汽车,有什么推荐吗? -2 用户:我在上海,想买辆新能源汽车,有什么推荐吗? -3 用户:案外人异议审查期间,人民法院不得对执行标的进行处分,不就是中止执行的意思吗? -4 用户:请写两句藏头诗分别以“胜”和“利”开头。 -5 用户:我花5000元买了100股海天味业。 -6 用户:李增杰:这个是星座蛙设,但是我是处女座的,我妈感觉因为我的不正常,我妈不让我看了\n雌猴摸了摸李增杰的头,这样啊\n雌猴打开了哔哩哔哩看了看\n雌猴:要不换个设吧,我听你未来的你说,有一个叫难忘的朱古力232这个人,他弄的设是Windows设 -思考:从第1句可以得知用户寻求购买新能源汽车的建议或推荐,这是这是关于用户的大宗消费的重要的信息。 -信息:<1> <> <用户寻求购买新能源汽车的建议或推荐。> <购买, 新能源汽车> -思考:从第2句可以得知用户当前所在城市为上海,这是关于用户的生活地区的重要信息。其余信息与第1句重复了。 -信息:<2> <> <用户所在的城市是上海。> <上海> -思考:第3句是用户对某个观点的讨论和疑问,没有明确提及用户个人信息。 -信息:<3> <> <无> <> -思考:第4句是用户提出的要求,没有明确提及用户个人信息。 -信息:<4> <> <无> <> -思考:从第5句可以得知用户购买了海天味业股票,购买数量为100股,购买金额为5000元,这是关于用户的投资决策的重要信息。 -信息:<5> <> <用户购买了海天味业股票,购买数量为100股,购买金额为5000元。> <海天味业, 股票> -思考:第6句是用户创作的内容,没有明确提及用户个人信息。 -信息:<6> <> <无> <> -""", - LanguageEnum.EN: """ -""" -} - -GET_OBSERVATION_USER_QUERY_PROMPT = { - LanguageEnum.CN: """ -用户句子: -{user_query} -""", - LanguageEnum.EN: """ -""" -} - - diff --git a/config/prompts/get_observation_with_time_prompt.py b/config/prompts/get_observation_with_time_prompt.py deleted file mode 100644 index fc99d4cb..00000000 --- a/config/prompts/get_observation_with_time_prompt.py +++ /dev/null @@ -1,93 +0,0 @@ -from memory_scope.enumeration.language_enum import LanguageEnum - - -GET_OBSERVATION_WITH_TIME_SYSTEM_PROMPT = { - LanguageEnum.CN: """ -任务:从下面的{num_obs}句用户句子中依次提取出关于用户的重要信息,相应的关键词与时间信息。 -每一句用户句子的格式是:<序号> <对话时间> 用户:<句子> -对每一句句子,只提取非常明确的信息和进行非常确定的推断,不要进行任何猜测。不要重复提取信息,如果句子中的所有信息与前面已经提取出的信息重复了则回答“重复“,如果没有重要信息则回答“无”。 -如果用户信息涉及时间,则结合对话时间推断用户信息的时间信息,没有则不输出。注意区分,对于句子中用户假设的信息或者用户虚构的内容,不要提取信息。 -对每个句子都做一次信息提取,最后一共输出{num_obs}行信息。 -请一步步思考,并一定要按如下格式依次输出,最后的结果一定要加<>: -思考:思考的依据和过程,50字以内。 -信息:<句子序号> <时间信息或“无”> <明确的重要信息或“重复”或”无“> <关键词> -""", - LanguageEnum.EN: """ -""" -} - -GET_OBSERVATION_WITH_TIME_FEW_SHOT_PROMPT = { - LanguageEnum.CN: """ -示例1: -句子: -1 2022年5月1日周二3点 用户:帮我写一段给同事张三女儿三岁生日的祝福语。 -2 2022年5月2日周二17点 用户:公元1400年至1550年中国历史大事表。 -3 2022年5月3日周二18点 用户:能给我整理一张如何使用大模型的技巧列表吗,要求内容尽量精简。 -4 2022年7月3日周四12点 用户:上上个月我办了游泳卡。 - -思考:从第1句可以得知张三是用户的同事,这是关于用户的人际关系的重要信息。其余信息重要性不足。用户信息不涉及时间。 -信息:<1> <> <张三是用户的同事。> <张三, 同事> -思考:第2句是用户提出的要求,没有明确提及用户个人信息。 -信息:<2> <> <无> <> -思考:第3句是用户提出的要求,没有明确提及用户个人信息。 -信息:<3> <> <无> <> -思考:从第4句可以得出用户上上个月办了游泳卡。用户信息涉及时间,结合对话时间为2022年7月,推断用户在2022年5月用户办了游泳卡。 -信息:<4> <2022年5月> <用户在2022年5月办了游泳卡。> <游泳卡> - - -示例2: -句子: -1 2020年1月4日周日10点 用户:我花5000元买了100股海天味业。 -2 2023年4月27日周五8点 用户:明天是我和妻子的结婚纪念日,帮我推荐一家餐厅。 -3 2020年1月4日周日10点 用户:我花5000元买了100股海天味业。 -4 2021年6月2日周四23点 用户:谢啦。我中午在公司附近吃,帮我推荐一家阿里巴巴徐汇滨江园区附近的餐厅吧。 -5 2021年7月9日周六11点 用户:两个坏消息,我打羽毛球把拍子打断线了。。。然后我去我朋友家撸猫,结果我猫毛过敏,今天疯狂打喷嚏。。。 - -思考:从第1句可以得知用户购买了海天味业股票,购买数量为100股,购买金额为5000元,这是关于用户的投资决策的重要信息。用户信息不涉及时间。 -信息:<1> <> <用户购买了海天味业股票,购买数量为100股,购买金额为5000元。> <海天味业, 股票> -思考:从第2句可以得知用户与妻子的结婚纪念日是明天,这是关于用户重要纪念日的信息。其余信息重要性不足。用户信息涉及时间,结合对话时间为2023年4月27日, -以及结婚纪念日为周期性日期,推断用户与妻子的结婚纪念日是每年4月28日。 -信息:<2> <每年4月28日> <用户与妻子的结婚纪念日是每年4月28日。> <妻子, 结婚纪念日> -思考:第3句含有的信息与第1句重复了。 -信息:<3> <> <重复> <> -思考:从第4句以得知用户在阿里巴巴徐汇滨江园区工作,这是关于用户的工作的重要信息。其余信息重要性不足。用户信息不涉及时间。 -信息:<4> <> <用户在阿里巴巴徐汇滨江园区工作。> <阿里巴巴, 徐汇滨江园区, 工作> -思考:从第5句可以得知用户前天打羽毛球时把球拍打断了线,但这不是重要的信息。还可以得知用户对猫毛过敏,这是关于用户的健康的重要信息。用户信息不涉及时间。 -信息:<5> <> <用户对猫毛过敏。> <猫毛, 过敏> - - -示例3: -句子: -1 2023年6月30日周五15点 用户:上个月我和家人一起去杭州旅游,景色很不错。 -2 2023年7月2日周二10点 用户:昨天是我生日,一个人过的。 -3 2020年7月3日周四11点 用户:提醒我下周一去体检。 -4 2023年5月21日周六14点 用户:有人说兴趣是最好的老师,也建议兴趣和职业联系起来,但我发现喜欢打篮球的人很多,但靠打篮球成职业的稀少,赚钱的更少,此外,怎么分辨兴趣和喜欢 -5 2018年3月6日周四19点 用户:李增杰:这个是星座蛙设,但是我是处女座的,我妈感觉因为我的不正常,我妈不让我看了\n雌猴摸了摸李增杰的头,这样啊\n雌猴打开了哔哩哔哩看了看\n雌猴:要不换个设吧,我听你未来的你说,有一个叫难忘的朱古力232这个人,他弄的设是Windows设 - - -思考:从第1句可以得知用户和家人上个月去杭州旅游了,这是关于用户的经历的重要信息。其余信息重要性不足。用户信息涉及时间,结合对话时间为2023年6月推断用户和家人2023年5月去杭州旅游了。 -信息:<1> <2023年5月> <用户和家人2023年5月去杭州旅游了。> <家人, 杭州, 旅游> -思考:从第2句可以得知用户的生日是昨天,这是关于用户重要纪念日的信息。其余信息重要性不足。用户信息涉及时间,结合对话时间为2023年7月2日, -以及生日为周期性日期,推断用户的生日是每年7月2日。 -信息:<2> <每年7月2日> <用户的生日是每年7月2日。> <生日> -思考:从第3句可以得出用户下周一去体检,这是用户要求记忆的重要信息。用户信息涉及时间,结合对话时间为2020年7月3日周四,推断用户2020年7月6日周一去体检。 -信息:<3> <2020年7月6日周一> <用户2020年7月6日周一去体检。> <体检> -思考:第4句是用户对他人观点的讨论和疑问,没有明确提及用户个人信息。 -信息:<4> <> <无> <> -思考:第5句是用户创作的内容,没有明确提及用户个人信息。 -信息:<5> <> <无> <> -""", - LanguageEnum.EN: """ -""" -} - -GET_OBSERVATION_WITH_TIME_USER_QUERY_PROMPT = { - LanguageEnum.CN: """ -用户句子: -{user_query} -""", - LanguageEnum.EN: """ -""" -} - - diff --git a/config/prompts/get_reflect_subject_prompt.py b/config/prompts/get_reflect_subject_prompt.py deleted file mode 100644 index cd39e034..00000000 --- a/config/prompts/get_reflect_subject_prompt.py +++ /dev/null @@ -1,107 +0,0 @@ -from memory_scope.enumeration.language_enum import LanguageEnum - - -GET_REFLECT_SUBJECT_SYSTEM_PROMPT = { - LanguageEnum.CN: """ -任务:从下面的信息中提取出最重要的最多{num_questions}条用户属性,要求不与已有的用户属性语义重复。 -要求1:用户属性可以是一般的用户偏好,也可以是运动偏好,旅游偏好,饮食偏好等等,也可以是重要事件性质,比如最近重要的事情,也可以是一些高度概括的人生理想,价值观,人生观,性格, 也可以是和朋友的人际关系等等。 -要求2:根据用户属性,我们可以生成“用户的<用户属性>是什么?”的问题,以此可以从下面的信息中提取用户属性对应的值。 -输出格式:每一行输出一个用户属性,每个用户属性推荐4个字,如果没有信息请回答无,最多输出{num_questions}条。 -""", - LanguageEnum.EN: """ -""" -} - -GET_REFLECT_SUBJECT_FEW_SHOT_PROMPT = { - LanguageEnum.CN: """ -示例1 -信息: -用户想知道明天上海的天气情况。 -用户可能在上海工作,并关心是否需要带伞上班。 -用户在阿里巴巴徐汇滨江园区附近工作。 -用户计划中午在公司附近用餐。 -用户对咖啡因过敏。 -用户喝了咖啡后晚上会出现失眠的情况。 -用户偏好口味较为清淡、不辣的中餐馆。 -用户刚开始了他们的第一份工作。 -用户的工作岗位是阿里巴巴的算法工程师。 -用户希望得到与该岗位相关的职场建议。 -用户面临的问题是在项目进展初期如何有效与上司沟通。 -用户的目标是及时同步项目状态给上司。 -用户希望了解image generation(图像生成)技术的发展概览和最新进展。 -用户对variational auto-encoder、GAN、Diffusion Model等技术及其相互关系感兴趣。 -已有用户属性:性别,工作地点,工作单位,睡眠状况,美食偏好 -新增用户属性: -过敏源 -技术方向 -工作岗位 - - -示例2 -信息: -用户想要了解如何使用torchvision库来可视化深度学习任务的进度信息。 -用户希望了解如何将基于numpy和pytorch的并行计算方案迁移到CUDA支持的GPU上运行。 -用户询问是否需要依赖特定的包来完成这一任务。 -用户希望了解如何在Python中自定义进程和线程以实现并行计算。 -用户在编程中遇到了与并行计算相关的问题。 -用户希望学习如何使用Python(numpy,pytorch)在GPU上实现简单的并行计算。 -用户希望了解并行计算的基本概念,包括threads。 -用户询问有关世界各地著名菜系的信息。 -用户对全球各地的美食非常感兴趣。 -用户关心其体重与运动消耗的额外热量及心率之间的关系。 -用户在询问为了实现这一目标,每天需要额外消耗多少大卡热量。 -用户希望每月减重1kg。 -用户希望得到类似战略类手机游戏的推荐。 -用户喜欢玩三国志系列、文明系列、全面战争、骑马与砍杀等战略类游戏。 -用户希望根据他们的喜好获得新的游戏推荐。 -用户列举了他们喜欢的具体游戏类型,包括:三国志系列、文明系列、全面战争、骑马与砍杀等。 -用户喜欢玩战略类游戏。 -已有用户属性:工作地点,性别,美食偏好 -新增用户属性: -游戏偏好 -运动计划 -技术方向 - -示例3 -信息: -用户寻求推荐一个相关课程或网址以进行学习。 -用户计划去青岛旅游。 -用户正为张三的女儿选购生日礼物。 -用户请求为一位名叫张三的人的女儿撰写一段温馨的祝福语。 -用户的同事名叫张三。 -用户与张三约定讨论阿里云百炼项目。 -用户与同事张三讨论了该项目的PRD(产品需求文档)。 -同事张三计划下周对PRD进行最终确定。 -张三还安排了在再下一周进行POC(Proof of Concept,概念验证)的讨论。 -用户希望获知该项目工程开发工作的负责团队信息,以了解项目执行的组织架构与分工情况。 -已有用户属性: -新增用户属性: -朋友关系 - -示例4 -信息: -用户在寻求有关推拿按摩手法的教程或相关网站推荐。 -用户希望系统地学习正规的推拿按摩手法。 -用户对按摩感兴趣,并且经常去推拿按摩店。 -用户想了解自己在静息状态下一小时大概会消耗多少大卡热量。 -用户年龄为28岁。 -用户体重为70kg。 -用户是男性。 -已有用户属性:性别,年龄,体重,当前学习进展 -新增用户属性: -无 -""", - LanguageEnum.EN: """ -""" -} - -GET_REFLECT_SUBJECT_USER_QUERY_PROMPT = { - LanguageEnum.CN: """ -信息: -{user_query} -已有用户属性:{exist_keys} -新增用户属性: -""", - LanguageEnum.EN: """ -""" -} diff --git a/config/prompts/get_reflection_prompt.py b/config/prompts/get_reflection_prompt.py deleted file mode 100644 index c254ade6..00000000 --- a/config/prompts/get_reflection_prompt.py +++ /dev/null @@ -1,8 +0,0 @@ -from ..enumeration.language_enum import LanguageEnum - - -GET_REFLECTION_SYSTEM_PROMPT = {} - -GET_REFLECTION_FEW_SHOT_PROMPT = {} - -GET_REFLECTION_USER_QUERY_PROMPT = {} diff --git a/config/prompts/info_filter_worker.yaml b/config/prompts/info_filter_worker.yaml deleted file mode 100644 index 593cdd9d..00000000 --- a/config/prompts/info_filter_worker.yaml +++ /dev/null @@ -1,85 +0,0 @@ -info_filter_system_prompt: - cn: | - 任务指令:对所给{batch_size}个句子中所含有的关于用户的信息打分,分数为0,1,2或3。 - 注意:其中0表示不包含用户信息,1表示句子中只包含用户假设的信息或者用户虚构的内容,2表示包含用户的一般信息,时效性信息或者需要猜测才能得到的用户信息,3表示明确含有或者可以确定推断出关于用户的重要信息,或者用户要求记录。 - 按如下格式输出, 每一行输出一个打分,一定加<>,一共输出{batch_size}个分数: - 结果: - <分数:0或1或2或3> - -INFO_FILTER_SYSTEM_PROMPT = { - LanguageEnum.CN: """ -任务指令:对所给{batch_size}个句子中所含有的关于用户的信息打分,分数为0,1,2或3。 -注意:其中0表示不包含用户信息,1表示句子中只包含用户假设的信息或者用户虚构的内容,2表示包含用户的一般信息,时效性信息或者需要猜测才能得到的用户信息,3表示明确含有或者可以确定推断出关于用户的重要信息,或者用户要求记录。 -按如下格式输出, 每一行输出一个打分,一定加<>,一共输出{batch_size}个分数: -结果: -<分数:0或1或2或3> -""", - LanguageEnum.EN: """ -""" -} - -INFO_FILTER_FEW_SHOT_PROMPT = { - LanguageEnum.CN: """ -示例1 -句子: -1 用户:帮我写一段给同事张三女儿三岁生日的祝福语。 -2 用户:公元1400年至1550年中国历史大事表。 -3 用户:你吃午饭了吗? -4 用户:我今天心情不好,可以安慰我一下吗? -5 用户:能给我整理一张如何使用大模型的技巧列表吗,要求内容尽量精简。 -6 用户:记一下,明天下午3点提醒我去拿一下文件。 -结果: -<3> -<0> -<0> -<2> -<2> -<3> - -示例2 -句子: -1 用户:我刚刚入职了阿里巴巴。 -2 用户:露天睡觉蚊子多,咋搞。 -3 用户:创造力和外倾性有关? -4 用户:一个区县的所有的事业人员的档案审核、修改和规范,应该是县委组织部下属的干部档案中心负责还是县人社局负责? -5 用户:假如我要和一个女人准备要孩子,我作为男人,怎么保护女人和孩子以及怎么备孕确保精子质量高对后代好 -6 用户:我和你一起出去玩,你会感觉开心吗? -7 用户:林浅,一位对未来充满好奇的年轻女孩,偶然间发现了这家能寄信给未来的邮局。出于对逝去祖父的怀念,她决定写下一封信,寄给五年后的自己, -希望能收到祖父生前未说完的故事。五年期限将至,当她几乎忘记这段往事时,一封泛黄的回信悄然降临,不仅带来了祖父未完的冒险故事, -还藏着一段关于勇气、爱与自我发现的深刻启示。续写成3000字小说。 -结果: -<3> -<2> -<0> -<0> -<3> -<1> -<1> - -示例3 -句子: -1 用户:你的妈妈患有焦虑症,怎么安慰和开导她? -2 用户:肾脏严重亏空 -3 用户:我很喜欢打篮球,所以我身体很好 -4 用户:篮球明星有哪些? -5 用户:李增杰:这个是星座蛙设,但是我是处女座的,我妈感觉因为我的不正常,我妈不让我看了\n雌猴摸了摸李增杰的头,这样啊\n雌猴打开了哔哩哔哩看了看\n雌猴:要不换个设吧,我听你未来的你说,有一个叫难忘的朱古力232这个人,他弄的设是Windows设\n这是剧本1,剧本2未完待续 -结果: -<1> -<1> -<3> -<0> -<1> -""", - LanguageEnum.EN: """ -""" -} - -INFO_FILTER_USER_QUERY_PROMPT = { - LanguageEnum.CN: """ -句子: -{user_query} -结果: -""", - LanguageEnum.EN: """ -""" -} diff --git a/config/prompts/long_contra_repeat_prompt.py b/config/prompts/long_contra_repeat_prompt.py deleted file mode 100644 index e4593d14..00000000 --- a/config/prompts/long_contra_repeat_prompt.py +++ /dev/null @@ -1,8 +0,0 @@ -from ..enumeration.language_enum import LanguageEnum - - -LONG_CONTRA_REPEAT_SYSTEM_PROMPT = {} - -LONG_CONTRA_REPEAT_FEW_SHOT_PROMPT = {} - -LONG_CONTRA_REPEAT_USER_QUERY_PROMPT = {} diff --git a/config/prompts/update_insight_prompt.py b/config/prompts/update_insight_prompt.py deleted file mode 100644 index 718f3ce1..00000000 --- a/config/prompts/update_insight_prompt.py +++ /dev/null @@ -1,71 +0,0 @@ -from memory_scope.enumeration.language_enum import LanguageEnum - - -UPDATE_INSIGHT_SYSTEM_PROMPT = { - LanguageEnum.CN: """ -从下面的句子中提取出给定类别的用户资料信息,并判断与已有信息是否矛盾,若矛盾以新信息为准。整合已有信息和新信息并输出。若已有信息为空则直接输出提取的 -信息。若无法提取出给定类别的用户资料信息则输出“无”。 -请一步步思考,并按如下格式输出: -思考: 思考的依据和过程,150字以内。 -用户资料: <信息或无>, 一定加<> -""", - LanguageEnum.EN: """ -""" -} - -UPDATE_INSIGHT_FEW_SHOT_PROMPT = { - LanguageEnum.CN: """ -示例1: -句子:因为昨天成都下大雨,用户全身都被淋湿了。 -句子:用户关心明天成都的天气预报。 -类别:用户所在地区 -已有信息:用户所在地区: -思考:从第一句句子可以得出用户在成都。第二句句子没有直接透露用户所在地信息,但与第一句句子用户在成都的信息吻合。已有信息为空,直接输出得出的信息。 -用户资料:<成都> - -示例2: -句子:用户最近养好了肠胃。 -句子:用户关注中医养生。 -类别:用户健康状况 -已有信息:用户健康状况: 肠胃不好,高血压 -思考:从第一句句子可以得出用户最近养好了肠胃,与已有信息矛盾,以新信息为准。第二句句子与用户健康状况无关。整合已有信息和新信息得到用户健康状况是肠胃健康,高血压。 -用户资料:<肠胃健康,高血压> - -示例3: -句子:用户刚刚毕业,第一份工作是银行前台。 -句子:用户的理想工作是职业游戏选手。 -类别:用户职业 -已有信息:用户职业:在招商银行工作 -思考:整合已有信息和第一句句子的信息可以得出用户的现在的职业是招商银行前台。第二句句子说明了用户的理想工作但并不是现在的职业。 -用户资料:<招商银行前台> - -示例4: -句子:用户大学期间接触过优化算法的研究。 -类别:用户学习专业 -已有信息:用户学习专业:与人工智能相关 -思考:从句子可以得出用户大学学习的专业与优化算法相关,这与已有信息(用户学习专业与人工智能相关)不矛盾,整合可以得出用户大学学习的专业与人工智能和优化算法相关。 -用户资料:<与人工智能和优化算法相关> - -示例5: -句子:用户单身。 -句子:用户受到一名18岁男生的追求,但不想接受又不想伤害他。 -句子:用户喜欢成熟且情绪稳定的男生。 -类别:用户情感状况 -已有信息:用户情感状况:有男朋友 -思考:从第一句句子可以得出用户现在单身,与已有信息矛盾,以新信息为准。从第二句句子得出用户受到一名18岁男生的追求但并不喜欢他。第三句话表达了用户理想的伴侣类型但与用户 -情感状况无关。整合得出用户情感状况为单身,受到一名18岁男生的追求但并不喜欢他。 -用户资料:<单身,受到一名18岁男生的追求但并不喜欢他。> -""", - LanguageEnum.EN: """ -""" -} - -UPDATE_INSIGHT_USER_QUERY_PROMPT = { - LanguageEnum.CN: """ -{user_query} -类别:{insight_key} -已有信息:{insight_key_value} -""", - LanguageEnum.EN: """ -""" -} diff --git a/config/prompts/update_profile_prompt.py b/config/prompts/update_profile_prompt.py deleted file mode 100644 index fcfe91d7..00000000 --- a/config/prompts/update_profile_prompt.py +++ /dev/null @@ -1,132 +0,0 @@ -from memory_scope.enumeration.language_enum import LanguageEnum - - -UPDATE_PLURAL_PROFILE_SYSTEM_PROMPT = { - LanguageEnum.CN: """ -从下面的句子中提取出给定类别的用户资料信息,并判断和已有信息是否重复。只输出无重复的新信息。若无法提取该类别的用户资料的新信息则回答无。 -请一步步思考,并按如下格式输出: -思考: 思考的依据和过程,150字以内。 -用户资料: <信息>或<无>, 一定加<> -""", - LanguageEnum.EN: """ -""" -} - -UPDATE_PLURAL_PROFILE_FEW_SHOT_PROMPT = { - LanguageEnum.CN: """ -示例1: -句子:用户上周去了西溪游泳馆游泳,那个游泳馆人非常多。 -句子:用户计划每周六和朋友张三去朝阳体育馆打羽毛球。 -类别:运动(用户喜欢的运动) -已有信息:运动(用户喜欢的运动):游泳 -思考:从第一句句子可以得出游泳是用户喜欢的运动之一,但与已有信息重复。从第二句句子可以得出羽毛球是用户喜欢的运动之一,是新的信息。 -用户资料: <羽毛球> - -示例2: -句子:用户对咖啡因过敏。 -句子:用户不喜欢吃香菇。 -类别:过敏(用户的已知过敏反应) -已有信息:过敏(用户的已知过敏反应): 咖啡因 -思考:从第一句句子可以得出咖啡因是用户的已知过敏反应之一,但与已有信息重复。从第二句句子只能得出用户不喜欢香菇而非对香菇过敏,无法得出新的用户已知过敏信息。 -用户资料: <无> - -示例3: -句子:用户热衷于动作类类游戏如只狼、艾尔登法环。 -句子:用户在休闲时间经常长时间玩策略类游戏如文明6。 -句子:用户是音乐发烧友,关注各个品牌的耳机的音质和性价比。 -类别:爱好(用户的业余爱好) -已有信息:爱好(用户的业余爱好): -思考:从第一句句子可以得出动作类游戏是用户的爱好之一,是新的信息。从第二句句子可以得出策略类游戏是用户的爱好之一,是新的信息。从第三句句子可以得出音乐是用户的爱好之一,是新的信息。 -用户资料: <动作类游戏, 策略类游戏, 音乐> - -示例4: -句子:关于职场沟通你有什么具体的建议吗?最好结合一个实例。我一直听人说要加强沟通,经常和上司沟通,同步项目的进展,但是我总是感觉还有许多事情要做。 -句子:项目并没有达到一个充分的可以汇报的状态,然后准备汇报材料又很费时间,导致有时候我没有及时和上司同步项目状态。针对这个情况你有什么建议? -类别:职业(用户的职业) -已有信息:职业(用户的职业):工程师 -思考:句子中虽然提及了职场沟通等工作相关内容,但是并不能推断出用户的职位是什么,只能推知与宽泛的项目实施与管理相关。 -用户资料: <无> -""", - LanguageEnum.EN: """ -""" -} - -UPDATE_PLURAL_PROFILE_USER_QUERY_PROMPT = { - LanguageEnum.CN: """ -{user_query} -类别:{update_profile} -已有信息:{update_profile_value} -""", - LanguageEnum.EN: """ -""" -} - - -UPDATE_UNIQUE_PROFILE_SYSTEM_PROMPT = { - LanguageEnum.CN: """ -从下面的句子中提取出给定类别的用户资料信息,并判断与已有信息是否矛盾。若矛盾则输出更新的信息,若不矛盾则保留已有信息,整合已有信息和新信息并输出。 -请一步步思考,并按如下格式输出: -思考: 思考的依据和过程,150字以内。 -用户资料: <信息>, 一定加<> -""", - LanguageEnum.EN: """ -""" -} - -UPDATE_UNIQUE_PROFILE_FEW_SHOT_PROMPT = { - LanguageEnum.CN: """ -示例1: -句子:因为昨天成都下大雨,用户全身都被淋湿了。 -句子:用户关心明天成都的天气预报。 -类别:地区(用户所在地区) -已有信息:地区(用户所在地区): 杭州 -思考:从第一句句子可以得出用户在成都。第二句句子没有直接透露用户所在地信息,但与第一句句子用户在成都的信息吻合。这与已有信息(用户在杭州)矛盾,输出更新的信息。 -用户资料:<成都> - -示例2: -句子:用户女朋友下个月过生日。 -句子:用户生日在7月15日。 -类别:生日(用户的生日)。 -已有信息:生日(用户的生日):1987年7月15日。 -思考:第一句句子中提及生日,但并不是用户的生日,无法得出用户生日信息。从第二句句子可以得出用户生日在7月15日,与已有信息不矛盾,整合可以得出用户生日是1987年7月15日。 -用户资料: <1987年7月15日> - -示例3: -句子:用户在招商银行工作。 -句子:用户刚刚毕业,第一份工作是银行前台。 -句子:用户的理想工作是职业游戏选手。 -类别:职业(用户的职业) -已有信息:职业(用户的职业): -思考:整合第一和第二句句子的信息可以得出用户的现在的职业是招商银行前台。第三句句子说明了用户的理想工作但并不是现在的职业。 -用户资料:<招商银行前台> - -示例4: -句子:用户大学期间接触过优化算法的研究。 -类别:学习专业 (用户大学学习的专业) -已有信息:学习专业 (用户大学学习的专业):与人工智能相关 -思考:从句子可以得出用户大学学习的专业与优化算法相关,这与已有信息(用户大学学习的专业与人工智能相关)不矛盾,整合可以得出用户大学学习的专业与人工智能和优化算法相关。 -用户资料:<与人工智能和优化算法相关> - -示例5: -句子:今天和同学去打球了。 -句子:明天和女朋友一起去杭州旅游。 -类别:学习专业 (用户大学学习的专业) -已有信息:学习专业 (用户大学学习的专业): -思考:两个句子和学习专业都没有关联,没有新提取的信息。 -用户资料:<无> -""", - LanguageEnum.EN: """ -""" -} - -UPDATE_UNIQUE_PROFILE_USER_QUERY_PROMPT = { - LanguageEnum.CN: """ -{user_query} -类别:{update_profile} -已有信息:{update_profile_value} -""", - LanguageEnum.EN: """ -""" -} - - diff --git a/memory_scope/chat/cli_memory_chat.py b/memory_scope/chat/cli_memory_chat.py index 763bad9b..05b9c879 100644 --- a/memory_scope/chat/cli_memory_chat.py +++ b/memory_scope/chat/cli_memory_chat.py @@ -1,6 +1,5 @@ import os import time -from typing import List import questionary @@ -29,7 +28,6 @@ class CliMemoryChat(BaseMemoryChat): generation_model: str, stream: bool = True, human_name: str = "", - human_profile_setting: List[str] = None, assistant_name: str = "", **kwargs): @@ -37,7 +35,6 @@ class CliMemoryChat(BaseMemoryChat): self._generation_model: BaseModel | str = generation_model self.stream: bool = stream self.human_name: str = human_name - self.human_profile_setting: List[str] = human_profile_setting self.assistant_name: str = assistant_name self.kwargs: dict = kwargs @@ -46,7 +43,6 @@ class CliMemoryChat(BaseMemoryChat): G_CONTEXT.meta_data.update({ "human_name": human_name, "assistant_name": assistant_name, - "human_profile_setting": human_profile_setting, }) self.logger = Logger.get_logger() diff --git a/memory_scope/memory/worker/summary/get_reflection_prompt.yaml b/memory_scope/memory/worker/summary/get_reflection_prompt.yaml index a5763f19..4cde3349 100644 --- a/memory_scope/memory/worker/summary/get_reflection_prompt.yaml +++ b/memory_scope/memory/worker/summary/get_reflection_prompt.yaml @@ -1,9 +1,93 @@ -system_prompt: - cn: +get_reflect_system: + cn: | + 任务:从下面的信息中提取出最重要的最多{num_questions}条{user_name}属性,要求不与已有的{user_name}属性语义重复。 + 要求1:{user_name}属性可以是一般的{user_name}偏好,也可以是运动偏好,旅游偏好,饮食偏好等等,也可以是重要事件性质,比如最近重要的事情,也可以是一些高度概括的人生理想,价值观,人生观,性格, 也可以是和朋友的人际关系等等。 + 要求2:根据{user_name}属性,我们可以生成“{user_name}的<{user_name}属性>是什么?”的问题,以此可以从下面的信息中提取{user_name}属性对应的值。 + 输出格式:每一行输出一个{user_name}属性,每个{user_name}属性推荐4个字,如果没有信息请回答无,最多输出{num_questions}条。 -few_shot_prompt: - cn: -user_query_prompt: - cn: - \ No newline at end of file +get_reflect_few_shot: + cn: | + 示例1 + 信息: + {user_name}想知道明天上海的天气情况。 + {user_name}可能在上海工作,并关心是否需要带伞上班。 + {user_name}在阿里巴巴徐汇滨江园区附近工作。 + {user_name}计划中午在公司附近用餐。 + {user_name}对咖啡因过敏。 + {user_name}喝了咖啡后晚上会出现失眠的情况。 + {user_name}偏好口味较为清淡、不辣的中餐馆。 + {user_name}刚开始了他们的第一份工作。 + {user_name}的工作岗位是阿里巴巴的算法工程师。 + {user_name}希望得到与该岗位相关的职场建议。 + {user_name}面临的问题是在项目进展初期如何有效与上司沟通。 + {user_name}的目标是及时同步项目状态给上司。 + {user_name}希望了解image generation(图像生成)技术的发展概览和最新进展。 + {user_name}对variational auto-encoder、GAN、Diffusion Model等技术及其相互关系感兴趣。 + 已有{user_name}属性:性别,工作地点,工作单位,睡眠状况,美食偏好 + 新增{user_name}属性: + 过敏源 + 技术方向 + 工作岗位 + + + 示例2 + 信息: + {user_name}想要了解如何使用torchvision库来可视化深度学习任务的进度信息。 + {user_name}希望了解如何将基于numpy和pytorch的并行计算方案迁移到CUDA支持的GPU上运行。 + {user_name}询问是否需要依赖特定的包来完成这一任务。 + {user_name}希望了解如何在Python中自定义进程和线程以实现并行计算。 + {user_name}在编程中遇到了与并行计算相关的问题。 + {user_name}希望学习如何使用Python(numpy,pytorch)在GPU上实现简单的并行计算。 + {user_name}希望了解并行计算的基本概念,包括threads。 + {user_name}询问有关世界各地著名菜系的信息。 + {user_name}对全球各地的美食非常感兴趣。 + {user_name}关心其体重与运动消耗的额外热量及心率之间的关系。 + {user_name}在询问为了实现这一目标,每天需要额外消耗多少大卡热量。 + {user_name}希望每月减重1kg。 + {user_name}希望得到类似战略类手机游戏的推荐。 + {user_name}喜欢玩三国志系列、文明系列、全面战争、骑马与砍杀等战略类游戏。 + {user_name}希望根据他们的喜好获得新的游戏推荐。 + {user_name}列举了他们喜欢的具体游戏类型,包括:三国志系列、文明系列、全面战争、骑马与砍杀等。 + {user_name}喜欢玩战略类游戏。 + 已有{user_name}属性:工作地点,性别,美食偏好 + 新增{user_name}属性: + 游戏偏好 + 运动计划 + 技术方向 + + 示例3 + 信息: + {user_name}寻求推荐一个相关课程或网址以进行学习。 + {user_name}计划去青岛旅游。 + {user_name}正为张三的女儿选购生日礼物。 + {user_name}请求为一位名叫张三的人的女儿撰写一段温馨的祝福语。 + {user_name}的同事名叫张三。 + {user_name}与张三约定讨论阿里云百炼项目。 + {user_name}与同事张三讨论了该项目的PRD(产品需求文档)。 + 同事张三计划下周对PRD进行最终确定。 + 张三还安排了在再下一周进行POC(Proof of Concept,概念验证)的讨论。 + {user_name}希望获知该项目工程开发工作的负责团队信息,以了解项目执行的组织架构与分工情况。 + 已有{user_name}属性: + 新增{user_name}属性: + 朋友关系 + + 示例4 + 信息: + {user_name}在寻求有关推拿按摩手法的教程或相关网站推荐。 + {user_name}希望系统地学习正规的推拿按摩手法。 + {user_name}对按摩感兴趣,并且经常去推拿按摩店。 + {user_name}想了解自己在静息状态下一小时大概会消耗多少大卡热量。 + {user_name}年龄为28岁。 + {user_name}体重为70kg。 + {user_name}是男性。 + 已有{user_name}属性:性别,年龄,体重,当前学习进展 + 新增{user_name}属性: + 无 + +get_reflect_user_query: + cn: | + 信息: + {user_query} + 已有{user_name}属性:{exist_keys} + 新增{user_name}属性: diff --git a/memory_scope/memory/worker/summary/get_reflection_worker.py b/memory_scope/memory/worker/summary/get_reflection_worker.py index 6e37a20a..3ce9f3f5 100644 --- a/memory_scope/memory/worker/summary/get_reflection_worker.py +++ b/memory_scope/memory/worker/summary/get_reflection_worker.py @@ -1,11 +1,12 @@ from typing import List -from memory_scope.constants.common_constants import NOT_REFLECTED_NODES +from memory_scope.constants.common_constants import NOT_REFLECTED_NODES, INSIGHT_NODES from memory_scope.constants.language_constants import COMMA_WORD from memory_scope.enumeration.memory_status_enum import MemoryNodeStatus from memory_scope.enumeration.memory_type_enum import MemoryTypeEnum from memory_scope.memory.worker.memory_base_worker import MemoryBaseWorker from memory_scope.scheme.memory_node import MemoryNode +from memory_scope.utils.datetime_handler import DatetimeHandler from memory_scope.utils.response_text_parser import ResponseTextParser from memory_scope.utils.timer import timer from memory_scope.utils.tool_functions import prompt_to_msg @@ -13,7 +14,7 @@ from memory_scope.utils.tool_functions import prompt_to_msg class GetReflectionWorker(MemoryBaseWorker): @timer - def retrieve_not_reflected_memory(self) -> List[MemoryNode]: + def retrieve_not_reflected_memory(self, query: str) -> List[MemoryNode]: filter_dict = { "user_name": self.user_name, "target_name": self.target_name, @@ -21,10 +22,44 @@ class GetReflectionWorker(MemoryBaseWorker): "memory_type": [MemoryTypeEnum.OBSERVATION.value, MemoryTypeEnum.OBS_CUSTOMIZED.value], "obs_reflected": False, } - return self.vector_store.retrieve(query=" ", top_k=self.retrieve_top_k, filter_dict=filter_dict) + return self.vector_store.retrieve(query=query, top_k=self.retrieve_not_reflected_top_k, filter_dict=filter_dict) + + @timer + def retrieve_insight_memory(self, query: str) -> List[MemoryNode]: + filter_dict = { + "user_name": self.user_name, + "target_name": self.target_name, + "status": MemoryNodeStatus.ACTIVE.value, + "memory_type": MemoryTypeEnum.INSIGHT.value, + } + return self.vector_store.retrieve(query=query, top_k=self.retrieve_insight_top_k, filter_dict=filter_dict) + + def new_insight_node(self, insight_key: str) -> MemoryNode: + dt_handler = DatetimeHandler() + meta_data = {k: str(v) for k, v in dt_handler.dt_info_dict.items()} + + return MemoryNode(user_name=self.user_name, + target_name=self.target_name, + meta_data=meta_data, + key=insight_key, + memory_type=MemoryTypeEnum.INSIGHT.value, + status=MemoryNodeStatus.ACTIVE.value) def _run(self): - not_reflected_nodes: List[MemoryNode] = self.retrieve_not_reflected_memory() + not_reflected_nodes: List[MemoryNode] = [] + insight_nodes: List[MemoryNode] = [] + + fn_list = [self.retrieve_not_reflected_memory, self.retrieve_insight_memory] + for nodes in self.async_run(fn_list=fn_list, query="_"): + if not nodes: + continue + for node in nodes: + if node.memory_type == MemoryTypeEnum.INSIGHT.value: + insight_nodes.append(node) + else: + not_reflected_nodes.append(node) + + self.set_context(INSIGHT_NODES, insight_nodes) # count not_reflected_count = len(not_reflected_nodes) @@ -36,51 +71,31 @@ class GetReflectionWorker(MemoryBaseWorker): self.set_context(NOT_REFLECTED_NODES, not_reflected_nodes) # get profile_keys - exist_keys: List[str] = [] - profile_keys: List[str] = list(self.user_profile_dict.keys()) - exist_keys.extend(profile_keys) - self.logger.info(f"profile_keys={profile_keys}") - - # get insight_keys - insight_nodes: List[MemoryNode] = self.get_context(INSIGHT_NODES) - if insight_nodes: - insight_keys = [ - n.insight_key for n in insight_nodes - ] - insight_keys = [x.strip() for x in insight_keys if x] - exist_keys.extend(insight_keys) - self.logger.info(f"insight_keys={insight_keys}") + exist_keys: List[str] = [n.key for n in insight_nodes] + self.logger.info(f"exist_keys={exist_keys}") # gen reflect prompt - user_query_list = [n.content for n in not_reflected_merge_nodes] - reflect_message = prompt_to_msg( - system_prompt=self.prompt_handler.system_prompt.format( - num_questions=self.reflect_num_questions - ), - few_shot=self.prompt_handler.few_shot_prompt, - user_query=self.prompt_handler.user_query_prompt.format( - exist_keys=self.get_language_value(COMMA_WORD).join(exist_keys), user_query="\n".join(user_query_list) - ), - ) + user_query_list = [n.content for n in not_reflected_nodes] + system_prompt = self.prompt_handler.get_reflect_system.format(user_name=self.target_name, + num_questions=self.reflect_num_questions) + few_shot = self.prompt_handler.get_reflect_few_shot.format(user_name=self.target_name) + user_query = self.prompt_handler.get_reflect_user_query.format( + user_name=self.target_name, + exist_keys=self.get_language_value(COMMA_WORD).join(exist_keys), + user_query="\n".join(user_query_list)) + + reflect_message = prompt_to_msg(system_prompt=system_prompt, few_shot=few_shot, user_query=user_query) self.logger.info(f"reflect_message={reflect_message}") # # call LLM - response = self.generation_model.call( - messages=reflect_message, - model_name=self.reflect_obs_model, - max_token=self.reflect_obs_max_token, - temperature=self.reflect_obs_temperature, - top_k=self.reflect_obs_top_k, - ) + response = self.generation_model.call(messages=reflect_message, top_k=self.generation_model_top_k) # return if empty - if not response: - self.add_run_info("reflect_obs_questions call llm failed!") + if not response.status or not response.message.content: return # parse text & save - new_insight_keys = ResponseTextParser(response.message.content).parse_v2( - "get_insight_keys" - ) + new_insight_keys = ResponseTextParser(response.message.content).parse_v2("get_reflection") if new_insight_keys: - self.set_context(NEW_INSIGHT_KEYS, new_insight_keys) + for insight_key in new_insight_keys: + insight_nodes.append(self.new_insight_node(insight_key)) diff --git a/memory_scope/memory/worker/summary/load_memory_worker.py b/memory_scope/memory/worker/summary/load_memory_worker.py deleted file mode 100644 index b5a0ab70..00000000 --- a/memory_scope/memory/worker/summary/load_memory_worker.py +++ /dev/null @@ -1,68 +0,0 @@ -from typing import List, Dict - -from memory_scope.enumeration.memory_status_enum import MemoryNodeStatus -from memory_scope.enumeration.memory_type_enum import MemoryTypeEnum -from memory_scope.memory.worker.memory_base_worker import MemoryBaseWorker -from memory_scope.scheme.memory_node import MemoryNode -from memory_scope.utils.timer import timer -from memory_scope.utils.global_context import G_CONTEXT - -class LoadMemoryWorker(MemoryBaseWorker): - - @timer - async def retrieve_not_reflected_memory(self, query: str) -> List[MemoryNode]: - filter_dict = { - "user_name": self.user_name, - "target_name": self.target_name, - "status": MemoryNodeStatus.ACTIVE.value, - "memory_type": [MemoryTypeEnum.OBSERVATION.value, MemoryTypeEnum.OBS_CUSTOMIZED.value], - "obs_reflected": False, - } - return await self.vector_store.async_retrieve(query=query, - top_k=self.retrieve_not_reflected_top_k, - filter_dict=filter_dict) - - @timer - async def retrieve_not_updated_memory(self, query: str) -> List[MemoryNode]: - filter_dict = { - "user_name": self.user_name, - "target_name": self.target_name, - "status": MemoryNodeStatus.ACTIVE.value, - "memory_type": [MemoryTypeEnum.OBSERVATION.value, MemoryTypeEnum.OBS_CUSTOMIZED.value], - "obs_updated": False, - } - return await self.vector_store.async_retrieve(query=query, - top_k=self.retrieve_not_updated_top_k, - filter_dict=filter_dict) - - @timer - async def retrieve_profiles(self, query: str) -> List[MemoryNode]: - filter_dict = { - "user_name": self.user_name, - "target_name": self.target_name, - "status": MemoryNodeStatus.ACTIVE.value, - "memory_type": [MemoryTypeEnum.PROFILE.value, MemoryTypeEnum.PROFILE_CUSTOMIZED.value], - } - retrieve_nodes = await self.vector_store.async_retrieve(query=query, - top_k=self.retrieve_profiles_top_k, - filter_dict=filter_dict) - nodes: List[MemoryNode] = [] - human_profile_setting = G_CONTEXT.meta_data.get("human_profile_setting", {}) - for attr_key in human_profile_setting: - - - return nodes - - def _run(self): - mock_query = "_" - fn_list = [ - self.retrieve_not_reflected_memory, - self.retrieve_not_updated_memory, - self.retrieve_profiles, - ] - memory_node_dict: Dict[str, MemoryNode] = {} - for nodes in self.async_run(fn_list, query=mock_query): - assert isinstance(nodes[0], MemoryNode) - memory_node_dict.update({n.memory_id: n for n in nodes}) - - memory_node_list = sorted(memory_node_dict.values(), key=lambda x: x.memory_id) diff --git a/memory_scope/memory/worker/summary/update_insight_worker.py b/memory_scope/memory/worker/summary/update_insight_worker.py index f1cab3f3..ea42bb90 100644 --- a/memory_scope/memory/worker/summary/update_insight_worker.py +++ b/memory_scope/memory/worker/summary/update_insight_worker.py @@ -1,14 +1,10 @@ from typing import List -from memory_scope.utils.response_text_parser import ResponseTextParser -from memory_scope.constants.common_constants import ( - INSIGHT_NODES, - NEW_OBS_NODES -) -from memory_scope.utils.tool_functions import prompt_to_msg -from memory_scope.scheme.memory_node import MemoryNode +from memory_scope.constants.language_constants import COLON_WORD, NONE_WORD, REPEATED_WORD from memory_scope.memory.worker.memory_base_worker import MemoryBaseWorker -from memory_scope.constants.language_constants import COMMA_WORD, COLON_WORD, NONE_WORD, REPEATED_WORD +from memory_scope.scheme.memory_node import MemoryNode +from memory_scope.utils.response_text_parser import ResponseTextParser +from memory_scope.utils.tool_functions import prompt_to_msg class UpdateInsightWorker(MemoryBaseWorker): diff --git a/memory_scope/memory/worker/write/get_observation_worker.py b/memory_scope/memory/worker/write/get_observation_worker.py index 50d30aaf..e7c94991 100644 --- a/memory_scope/memory/worker/write/get_observation_worker.py +++ b/memory_scope/memory/worker/write/get_observation_worker.py @@ -28,7 +28,7 @@ class GetObservationWorker(MemoryBaseWorker): dt_info_dict = DatetimeHandler.extract_date_parts(input_string=time_infer) meta_data.update({f"event_{k}": str(v) for k, v in dt_info_dict.items()}) - node = MemoryNode(user_name=self.user_name, + return MemoryNode(user_name=self.user_name, target_name=self.target_name, meta_data=meta_data, content=obs_content, @@ -37,7 +37,6 @@ class GetObservationWorker(MemoryBaseWorker): timestamp=message.time_created, obs_reflected=False, obs_updated=False) - return node def build_prompt(self) -> List[Message]: # build prompt diff --git a/memory_scope/scheme/memory_node.py b/memory_scope/scheme/memory_node.py index 2bc6b010..c5f13fa0 100644 --- a/memory_scope/scheme/memory_node.py +++ b/memory_scope/scheme/memory_node.py @@ -17,6 +17,10 @@ class MemoryNode(BaseModel): content: str = Field("", description="memory content") + key: str = Field("", description="memory key") + + value: str = Field("", description="memory value") + score_similar: float = Field(0, description="es similar score") score_rank: float = Field(0, description="rank model score")