
我最初对工作流程进行的最有用的扩展之一是,自动将相关图像注入上下文窗口,从而提高对严重依赖屏幕截图的工单和消息的回复质量。这项改进快捷高效,显著增强了工作流程的功能。
最近,许多工作流程尝试处理大型复杂文件,例如 PDF 或 DOCX 文件,而简单地将它们塞进上下文窗口的做法效果并不理想。本文将解释我们如何运用渐进式披露原则,使我们的内部代理能够处理大型文件。
这是“打造内部代理”系列文章的一部分。
大型文件和渐进式披露
渐进式披露是指将添加到上下文窗口中的内容限制在必要的最小范围内,并根据需要随着时间的推移添加更多细节。
代理人技能的运用方式就是一个渐进式披露的典型例子:
- 最初,您只需将每项可用技能的描述添加到上下文窗口中即可。
- 然后按需加载
SKILL.md文件。 -
SKILL.md可以指定其他需要加载的辅助文件。
在我们的内部用例中,我们具备 JIRA 格式化、Slack 格式化和 Notion 格式化方面的技能。有些工作流程需要用到全部三种技能,但绝大多数工作流程最多只需要其中一种,而且代理可以轻松判断哪些技能与特定任务相关。
文件管理是一个特别有趣的渐进式披露问题,因为文件在很多场景下都非常有用,但同时文件体积又非常庞大。例如,在 Slack 中,求助信息通常是“我需要帮助解决这个登录问题”,如果不把图片添加到上下文窗口中,这个问题就无法解决。在其他工作流程中,你可能需要分析一份每日数据导出文件,该文件本身大小为 5-10MB,但从中提取出来的表格和文本却只有 10-20KB。如果目标是比较多个 PDF 文件(每个文件都相当大),情况会变得更加复杂。
我们的方法
我们解决大文件问题的总体方法如下:
-
始终在提示中包含有关可用文件的元数据,类似于可用技能列表。格式如下:
Files : - id : f_a1 name : my_image.png size : 500 , 000 preloaded : false - id : f_b3 name : ...关键在于每个Files : - id : f_a1 name : my_image.png size : 500 , 000 preloaded : false - id : f_b3 name : ...id是代理程序可以传递给工具的引用。这使得代理程序无需将文件上下文加载到上下文窗口即可操作文件。 -
自动将前 N KB 的文件预加载到上下文窗口中,前提是这些文件是合适的 MIME 类型(例如 png、pdf 等)。此设置可针对每个工作流进行配置,如果某个工作流不需要预加载任何文件,则可以将此值设置为
0。我仍然对预加载是否值得犹豫不决,因为它会剥夺代理的一些控制权。
-
提供三种文件操作工具:
-
load_file(id)将整个文件加载到上下文窗口中 peek_file(id, start, stop)将文件的一部分加载到上下文窗口中extract_file(id)将 PDF、PPT、DOCX 等文件转换为简化的文本版本
-
-
提供一个
large_files技能,解释如何以及何时使用上述工具处理大文件。通常,建议对任何需要处理的 PDF、DOCX 或 PPT 文件使用extract_file,否则根据上下文窗口的可用空间选择加载或预览方式。
这种方法实施起来非常快捷,并且赋予代理更大的控制权,使其能够应对涉及大型文件的各种场景。它也很好地说明了LLM和工具之间的“粘合层”实际上是一个复杂而精密的应用程序层,而不仅仅是简单的粘合层。
这个功能是如何运作的?
这种方法效果显著。特别是我们内部一个用于反馈工单附件文档(与其他类似现有文档进行比较)的工作流程。在此之前,该工作流程根本无法正常运行,而现在无需专门针对处理此类大文件的工作流支持,也能高效运行,因为large_files技能能够以可重用的方式处理这些文件,且工作流编写者对此毫不知情。
接下来呢?
总的来说,这感觉像是一套独立的功能,不需要未来投入大量资金,但有三个方面我们需要继续完善:
- 在添加子代理支持之前,我们的功能会受到限制。在许多情况下,处理大型文件的理想方案是在具有较大上下文窗口的子代理中打开该文件,让该子代理提取文件内容摘要,然后将摘要信息导入主代理的上下文窗口。
-
extract_file似乎应该进行修改,使其返回一个可引用的虚拟file_id,用于peek_file和load_file,而不是直接返回文件内容。这样即使从非常大的文件中提取数据,也能使该工具更加健壮。实际上,提取的内容一直都相当紧凑。 - 最后,在 AWS Lambda 中运行程序需要纯 Python 包,而纯 Python 在解析复杂的 XML 衍生文档格式(例如 DOCX)时速度并不快。最终,我们可以通过在 Lambda 函数中添加一个包含
lxml依赖项的层来解决这个问题,而且我们或许会在某个时候这样做。
总而言之,这对我们的内部工作流程来说是一个非常有帮助的扩展。