support long artic learn

This commit is contained in:
Liu Zhicong
2023-11-15 20:18:41 -08:00
parent 87fdba9714
commit 2d85981dff
2 changed files with 27 additions and 19 deletions
+25 -17
View File
@@ -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:
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"<<Final Part:start at {pos}>>\n{_content}"
else:
part_content = f"<<Part:start at {pos}>>\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
+1 -1
View File
@@ -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)