From 2d85981dff2f24fe06c69f3df5d1a80e801450bf Mon Sep 17 00:00:00 2001 From: Liu Zhicong Date: Wed, 15 Nov 2023 20:18:41 -0800 Subject: [PATCH] support long artic learn --- src/aios_kernel/agent.py | 44 +++++++++++++++++++------------- src/aios_kernel/workspace_env.py | 2 +- 2 files changed, 27 insertions(+), 19 deletions(-) diff --git a/src/aios_kernel/agent.py b/src/aios_kernel/agent.py index 0247cd4..133759e 100644 --- a/src/aios_kernel/agent.py +++ b/src/aios_kernel/agent.py @@ -55,13 +55,12 @@ DEFAULT_AGENT_GOAL_TO_TODO_PROMPT = """ DEFAULT_AGENT_LEARN_PROMPT = """ 我是一名软件工程师,拥有非常优秀的资料学习能力。下面是我学习和整理资料的方法 -1. 结合我的角色为资料产生长度不超过256个Token的摘要;尝试产生不超过16个tag; -2. 现有资料库以文件系统的形式组织,我未来借助资料的摘要来浏览知识库 -3. 我将学习过的资料另存在资料库的合适位置(以/开始的完整路径)。保存位置的目录深度不超过5层,文件夹名称长度不超过16个字符。 -4. 当存在已知信息时,需参考已知信息的内容来思考结果。 -5. 由于LLM的Token限制,我学习的可能只是资料的部分内容,此时我应能产生合适的中间结果,中间结果保存在metadata中。当我决定构建中间结果时,我只构建中间结果。 -6. 当我收到最后一部分内容时,我能结合已知的中间结果产生最终结果。 -7. 总是以json格式返回思考结果,json格式如下 +1. 由于LLM的Token限制,我学习的可能只是资料的部分内容,此时我应能产生合适的学习中间结果,中间结果保存在metadata中。我要么产生中间结果,要么产生最终结果。 +2. 当存在已知信息时,需参考已知信息的内容来思考结果。 +3. 当我收到最后一部分内容时,我能结合已知的中间结果产生最终结果。 +4. 现有资料库以文件系统的形式组织,我未来借助资料的摘要来浏览知识库 +5. 我将学习过的资料另存在资料库的合适位置(以/开始的完整路径)。保存位置的目录深度不超过5层,文件夹名称长度不超过16个字符。 +6. 总是以json格式返回思考结果,json格式如下 { think:"$think_result", metadata:{...} , # temp result for long content @@ -122,7 +121,7 @@ class AIAgent: self.agent_prompt:AgentPrompt = None self.agent_think_prompt:AgentPrompt = None self.llm_model_name:str = None - self.max_token_size:int = 3600 + self.max_token_size:int = 128000 self.agent_energy = 15 self.agent_task = None self.last_recover_time = time.time() @@ -1043,21 +1042,28 @@ class AIAgent: #full_content = item.get_article_full_content() workspace = self.get_workspace_by_msg(None) - full_content = await workspace.load_knowledge_content(full_path) - if full_content is None: - return None + try: + full_content = await workspace.load_knowledge_content(full_path) + if full_content is None: + return None + except Exception as e: + logger.error(f"llm_read_article: load knowledge {full_path} error:{e}") + return None if len(full_content) < 16: logger.warning(f"llm_read_article: article {knowledge_item['path']} is too short,just read summary!") return None + str_len = len(full_content) full_content_len = self.token_len(full_content) + if full_content_len < self.get_llm_learn_token_limit(): # 短文章不用总结catelog #path_list,summary = llm_get_summary(summary,full_content) #prompt = self.get_agent_role_prompt() - prompt = self.get_learn_prompt() + prompt = AgentPrompt() + prompt.append(self.get_learn_prompt()) known_info_prompt = await self.gen_known_info_for_knowledge_prompt(knowledge_item) prompt.append(known_info_prompt) content_prompt = AgentPrompt(full_content) @@ -1076,21 +1082,23 @@ class AIAgent: else: logger.warning(f"llm_read_article: article {full_path} use LLM loop learn!") pos = 0 - read_len = int(self.get_llm_learn_token_limit() * 1.5) + read_len = int(self.get_llm_learn_token_limit() * 1.2) temp_meta_data = {} is_final = False - while pos < full_content_len: + while pos < str_len: _content = full_content[pos:pos+read_len] - if len(_content) < read_len: + part_cotent_len = len(_content) + if part_cotent_len < read_len: # last chunk is_final = True part_content = f"<>\n{_content}" else: part_content = f"<>\n{_content}" - pos = pos + read_len - prompt = self.get_learn_prompt() + pos = pos + read_len + prompt = AgentPrompt() + prompt.append(self.get_learn_prompt()) known_info_prompt = await self.gen_known_info_for_knowledge_prompt(knowledge_item,temp_meta_data) prompt.append(known_info_prompt) content_prompt = AgentPrompt(part_content) @@ -1104,7 +1112,7 @@ class AIAgent: return result_obj result_obj = json.loads(task_result.result_str) - temp_meta_data = result_obj.get("metadata") + temp_meta_data = result_obj if is_final: return result_obj diff --git a/src/aios_kernel/workspace_env.py b/src/aios_kernel/workspace_env.py index 4ece0ce..bde7114 100644 --- a/src/aios_kernel/workspace_env.py +++ b/src/aios_kernel/workspace_env.py @@ -528,7 +528,7 @@ class WorkspaceEnvironment(Environment): return content else: async with aiofiles.open(path,'rb') as f: - cur_encode = chardet.detect(await f.read(1024))['encoding'] + cur_encode = chardet.detect(await f.read())['encoding'] async with aiofiles.open(path, mode='r', encoding=cur_encode) as f: await f.seek(pos)