虽然直接API访问因其稳定性和结构化特性而成为LLM代理与外部系统对接的首选方式,但许多有价值的信息来源和功能只能通过图形用户界面(GUI)获取。构建能够让大型语言模型(LLM)代理与这些用户界面交互的工具,能够极大增强其操作功能。还将讨论促进人工输入的工具,这可被视为一种特殊的用户界面交互形式。与用户界面交互允许代理执行诸如从缺乏API的网站提取数据、控制桌面应用程序或自动化遗留系统中的流程等任务。此外,工具可以设计为明确请求人工输入或确认,为需要人工判断或授权的任务建立联系。自动化图形用户界面交互自动化GUI是一项复杂的任务,因为用户界面是为人类感知和交互而设计的。它们可以是动态的,元素会根据状态或用户操作而变化。用于GUI自动化的工具通常充当桥梁,将LLM的指令转换为用户界面上的操作,然后将用户界面的响应解析回LLM能理解的格式。网页界面对于基于网页的用户界面,浏览器自动化库是标准方法。诸如Selenium、Playwright或Puppeteer之类的库允许编程控制网页浏览器。LLM代理可以使用基于这些库之一构建的工具来:导航: 打开URL,点击链接,前进/后退。检查: 根据各种选择器(ID、类名、XPath、CSS选择器)查找HTML元素。交互: 填写表单,点击按钮,从下拉菜单中选择,执行JavaScript。提取: 从网页中抓取文本、图像或其他数据。LLM会发出高级命令,例如“在example.com上查找名为‘无线鼠标’的产品并提取其价格。”然后,该工具会将其转换为一系列浏览器操作:导航到 example.com。找到搜索栏(例如,通过其ID search-query)。在搜索栏中输入“无线鼠标”。点击“搜索”按钮。在结果页上,找到与“无线鼠标”关联的价格元素(可能通过查找特定的CSS类或文本模式)。提取该价格元素的文本内容。将提取的价格返回给LLM。网页UI自动化面临的一个主要难题是其脆弱性。网页经常变化,昨天有效的选择器今天可能失效。设计依赖更稳定的标识符(例如data-testid属性或ARIA标签)而不是高度不稳定的标识符(例如基于DOM结构的复杂XPath表达式)的工具很重要。桌面应用程序由于UI框架的多样性(Windows Forms、WPF、Qt、Cocoa等),与桌面应用程序用户界面交互通常比网页用户界面更具挑战性。常见方法包括:辅助功能API: 操作系统提供辅助功能API(例如,Windows上的UI Automation,macOS上的Accessibility API (AXAPI)),这些API公开了UI元素的信息。工具可以利用这些API来识别和操作元素。图像识别和OCR: 对于不公开良好辅助功能信息的应用程序,工具可能诉诸于屏幕截图、图像识别(查找按钮或图标)和光学字符识别(OCR)(读取文本)。这些方法通常可靠性较低且速度较慢。机器人流程自动化(RPA)平台: 一些RPA平台提供SDK或API,可以封装到LLM代理的工具中,使其能够协调现有RPA机器人。桌面UI自动化工具需要精心设计以指定操作和目标元素,通常依赖于元素的属性,如名称、类型或窗口层级。请求人工输入的工具一种更简单但非常有效的用户界面交互形式涉及明确请求人工输入或确认的工具。LLM无需尝试操控复杂的GUI,工具会向用户呈现问题或一组选项,并等待其响应。这对以下情况很重要:解决歧义: 当LLM不确定如何继续时。授权: 对于敏感操作,如金融交易或数据删除。收集信息: 当所需信息无法通过其他工具获得,但人类可以提供时。例如,LLM代理规划市场活动时可能使用这样的工具: LLM: "该活动的预算估计为5,000美元。您是否批准此预算并继续启动该活动?选项:[批准], [拒绝], [请求更多信息]" 该工具会向用户显示此消息和选项(例如,在聊天界面、弹出对话框或电子邮件中)。用户的选择随后返回给LLM。digraph UI_Interaction_Flow { rankdir=TB; node [shape=box, style="rounded,filled", fillcolor="#e9ecef", fontname="Arial"]; edge [fontname="Arial"]; LLM [label="LLM 代理\n(例如,决定行动)", fillcolor="#a5d8ff"]; Tool [label="用户界面交互工具\n(例如,Selenium/输入封装器)", fillcolor="#96f2d7"]; UI [label="应用程序用户界面\n(网页 / 桌面应用 / 输入提示)", fillcolor="#ffd8a8"]; User [label="人类用户\n(用于直接UI使用或请求输入)", shape=oval, fillcolor="#fcc2d7"]; LLM -> Tool [label="高级指令\n(例如,“获取订单状态”或“请求用户确认”)"]; Tool -> UI [label="低级命令或\n向用户显示提示"]; UI -> Tool [label="UI状态 / 提取数据或\n用户响应"]; Tool -> LLM [label="处理结果 / 用户输入"]; UI -> User [label="呈现信息/选项", style=dashed, color="#495057"]; User -> UI [label="交互 / 提供输入", style=dashed, color="#495057"]; }交互流程图,说明LLM代理如何使用用户界面交互工具来自动化应用程序用户界面或请求人类用户输入。设计有效的用户界面交互工具构建用户界面交互工具时,请考虑以下几点:抽象层: LLM不需要了解在(x,y)坐标处点击或发送原始键盘事件的具体细节。设计代表有意义动作的工具函数,例如login_to_website(url, username_field_id, username, password_field_id, password, submit_button_id)或get_text_from_element(selector)。元素识别: LLM需要一种方式来指定要交互的哪个UI元素。支持各种选择器:对于网页:ID、名称、CSS选择器、ARIA标签、data-*属性。对于桌面:辅助功能ID、名称、控件类型。避免仅仅依赖“从左边数第三个按钮”这样的视觉提示,除非绝对必要并结合其他上下文,因为用户界面可以是响应式的并改变布局。动作指定: 定义工具可以执行的一组清晰的动作,例如click(点击)、type_text(输入文本)、select_option(选择选项)、read_text(读取文本)、take_screenshot(截图)。输出与反馈: 工具应向LLM返回有用的信息:操作成功或失败的确认。提取的数据(文本、属性值)。如果未找到元素或交互失败,则返回错误消息。对于人工输入工具,返回用户提供的确切响应。状态管理: GUI本身是有状态的。如果LLM正在执行多步任务,工具可能需要处理Web会话的Cookie,或在多次交互中管理桌面应用程序的状态。错误处理和重试: 用户界面交互可能不稳定。实现错误处理。例如,如果某个元素未立即可用,工具可能会在短时间内重试,因为这可能是由于动态内容加载引起的。清晰地告知LLM持续的失败情况。LLM在用户界面交互中的作用LLM的主要职责是理解整体目标,并将其分解为用户界面交互工具可执行的一系列步骤。这包括:规划: 确定需要哪些UI操作以及它们的顺序。指令生成: 为工具制定清晰的指令,包括识别目标元素和指定操作。例如,LLM可能会决定:“要查找用户的电子邮件地址,我需要导航到个人资料页面,然后找到标有‘Email’的元素,并提取其文本。”输出解读: 理解来自工具的反馈。如果提取了数据,LLM会处理它。如果发生错误,LLM可能会尝试替代方法或报告失败。上下文感知: 在多次用户界面交互中保持上下文,以达成更大的目标。对于请求人工输入的工具,LLM负责为人类用户清晰简洁地 формулировать 问题或选项。安全与可靠性考量与用户界面交互的工具可以非常强大,因为它们潜在地执行人类用户可以执行的任何操作。这引出了一些考量:权限: 仔细考虑授予代理及其用户界面工具的权限。将访问权限限制在必要的应用程序和功能上。意外操作: LLM可能误解情况并指示UI工具执行意外或有害操作的风险。对于重要操作,建议进行人工监督或确认步骤。沙盒: 在可能的情况下,在沙盒环境中运行浏览器自动化,以限制来自恶意网站或受损浏览器会话的潜在危害。对于桌面UI自动化,这更困难但也同样重要。UI变化: GUI会演变。依赖特定UI结构的工具在UI更新时容易失效。缓解策略包括:使用更抽象和稳定的元素选择器(例如,ARIA角色、data-testid)。实现某种程度的“模糊”匹配或自适应逻辑(尽管这会增加复杂性)。定期测试和维护UI自动化工具。通过慎重设计可以与用户界面交互或请求人工输入的工具,您可以大幅扩展LLM代理在多样化环境中运行和处理否则无法完成的任务的能力。这些工具虽然构建和维护复杂,但弥合了LLM推理能力与许多系统的交互性之间的差距。